From 0ec7e72b01dca8070c1a8ae9a0b0347d2281eadb Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 21 Oct 2016 22:31:27 +0200 Subject: [PATCH 001/307] improved USB serial Rx and implemented buffered Tx --- .../maple/libmaple/usb/stm32f1/usb_cdcacm.c | 227 +++++++++++------- STM32F1/cores/maple/usb_serial.cpp | 45 +--- STM32F1/cores/maple/usb_serial.h | 2 +- .../system/libmaple/usb/stm32f1/usb_reg_map.h | 4 +- 4 files changed, 153 insertions(+), 125 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c index 448c05dfc..7a5a772af 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c @@ -261,18 +261,28 @@ static ONE_DESCRIPTOR String_Descriptor[N_STRING_DESCRIPTORS] = { /* I/O state */ -#define CDC_SERIAL_BUFFER_SIZE 512 +#define CDC_SERIAL_RX_BUFFER_SIZE 256 // must be power of 2 +#define CDC_SERIAL_RX_BUFFER_SIZE_MASK (CDC_SERIAL_RX_BUFFER_SIZE-1) /* Received data */ -static volatile uint8 vcomBufferRx[CDC_SERIAL_BUFFER_SIZE]; -/* Read index into vcomBufferRx */ -static volatile uint32 rx_offset = 0; -/* Number of bytes left to transmit */ -static volatile uint32 n_unsent_bytes = 0; -/* Are we currently sending an IN packet? */ -static volatile uint8 transmitting = 0; -/* Number of unread bytes */ -static volatile uint32 n_unread_bytes = 0; +static volatile uint8 vcomBufferRx[CDC_SERIAL_RX_BUFFER_SIZE]; +/* Write index to vcomBufferRx */ +static volatile uint32 rx_head; +/* Read index from vcomBufferRx */ +static volatile uint32 rx_tail; + +#define CDC_SERIAL_TX_BUFFER_SIZE 256 // must be power of 2 +#define CDC_SERIAL_TX_BUFFER_SIZE_MASK (CDC_SERIAL_TX_BUFFER_SIZE-1) +// Tx data +static volatile uint8 vcomBufferTx[CDC_SERIAL_TX_BUFFER_SIZE]; +// Write index to vcomBufferTx +static volatile uint32 tx_head; +// Read index from vcomBufferTx +static volatile uint32 tx_tail; +// Are we currently sending an IN packet? +static volatile int8 transmitting; + + /* Other state (line coding, DTR/RTS) */ @@ -393,30 +403,34 @@ void usb_cdcacm_putc(char ch) { ; } -/* This function is blocking. +/* This function is non-blocking. * - * It copies data from a usercode buffer into the USB peripheral TX + * It copies data from a user buffer into the USB peripheral TX * buffer, and returns the number of bytes copied. */ -uint32 usb_cdcacm_tx(const uint8* buf, uint32 len) { - /* Last transmission hasn't finished, so abort. */ - while ( usb_cdcacm_is_transmitting()>0 ) ; // wait for end of transmission +uint32 usb_cdcacm_tx(const uint8* buf, uint32 len) +{ + if (len==0) return 0; // no data to send - /* We can only put USB_CDCACM_TX_EPSIZE bytes in the buffer. */ - if (len > USB_CDCACM_TX_EPSIZE) { - len = USB_CDCACM_TX_EPSIZE; - } + uint32 head = tx_head; // load volatile variable + uint32 tx_unsent = (head - tx_tail) & CDC_SERIAL_TX_BUFFER_SIZE_MASK; - /* Queue bytes for sending. */ - if (len) { - usb_copy_to_pma(buf, len, USB_CDCACM_TX_ADDR); + // We can only put bytes in the buffer if there is place + if (len > (CDC_SERIAL_TX_BUFFER_SIZE-tx_unsent-1) ) { + len = (CDC_SERIAL_TX_BUFFER_SIZE-tx_unsent-1); } - // We still need to wait for the interrupt, even if we're sending - // zero bytes. (Sending zero-size packets is useful for flushing - // host-side buffers.) - usb_set_ep_tx_count(USB_CDCACM_TX_ENDP, len); - n_unsent_bytes = len; - transmitting = 1; - usb_set_ep_tx_stat(USB_CDCACM_TX_ENDP, USB_EP_STAT_TX_VALID); + if (len==0) return 0; // buffer full + + uint16 i; + // copy data from user buffer to USB Tx buffer + for (i=0; i0 ? transmitting : 0); } uint16 usb_cdcacm_get_pending(void) { - return n_unsent_bytes; + return (tx_head - tx_tail) & CDC_SERIAL_TX_BUFFER_SIZE_MASK; } -/* Nonblocking byte receive. +/* Non-blocking byte receive. * * Copies up to len bytes from our private data buffer (*NOT* the PMA) * into buf and deq's the FIFO. */ -uint32 usb_cdcacm_rx(uint8* buf, uint32 len) { +uint32 usb_cdcacm_rx(uint8* buf, uint32 len) +{ /* Copy bytes to buffer. */ uint32 n_copied = usb_cdcacm_peek(buf, len); /* Mark bytes as read. */ - n_unread_bytes -= n_copied; - rx_offset = (rx_offset + n_copied) % CDC_SERIAL_BUFFER_SIZE; + uint16 tail = rx_tail; // load volatile variable + tail = (tail + n_copied) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; + rx_tail = tail; // store volatile variable - /* If all bytes have been read, re-enable the RX endpoint, which - * was set to NAK when the current batch of bytes was received. */ - if (n_unread_bytes == 0) { - usb_set_ep_rx_count(USB_CDCACM_RX_ENDP, USB_CDCACM_RX_EPSIZE); + uint32 rx_unread = (rx_head - tail) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; + // If buffer was emptied to a pre-set value, re-enable the RX endpoint + if ( rx_unread <= 64 ) { // experimental value, gives the best performance usb_set_ep_rx_stat(USB_CDCACM_RX_ENDP, USB_EP_STAT_RX_VALID); - } - + } return n_copied; } -/* Nonblocking byte lookahead. +/* Non-blocking byte lookahead. * * Looks at unread bytes without marking them as read. */ -uint32 usb_cdcacm_peek(uint8* buf, uint32 len) { +uint32 usb_cdcacm_peek(uint8* buf, uint32 len) +{ int i; - uint32 head = rx_offset; + uint32 tail = rx_tail; + uint32 rx_unread = (rx_head-tail) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; - if (len > n_unread_bytes) { - len = n_unread_bytes; + if (len > rx_unread) { + len = rx_unread; } for (i = 0; i < len; i++) { - buf[i] = vcomBufferRx[head]; - head = (head + 1) % CDC_SERIAL_BUFFER_SIZE; + buf[i] = vcomBufferRx[tail]; + tail = (tail + 1) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; } return len; } -uint32 usb_cdcacm_peek_ex(uint8* buf, uint32 offset, uint32 len) { +uint32 usb_cdcacm_peek_ex(uint8* buf, uint32 offset, uint32 len) +{ int i; - uint32 head = (rx_offset + offset) % CDC_SERIAL_BUFFER_SIZE; + uint32 tail = (rx_tail + offset) & CDC_SERIAL_RX_BUFFER_SIZE_MASK ; + uint32 rx_unread = (rx_head-tail) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; - if (len + offset > n_unread_bytes) { - len = n_unread_bytes - offset; + if (len + offset > rx_unread) { + len = rx_unread - offset; } for (i = 0; i < len; i++) { - buf[i] = vcomBufferRx[head]; - head = (head + 1) % CDC_SERIAL_BUFFER_SIZE; + buf[i] = vcomBufferRx[tail]; + tail = (tail + 1) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; } return len; @@ -495,12 +513,12 @@ uint32 usb_cdcacm_peek_ex(uint8* buf, uint32 offset, uint32 len) { /* Roger Clark. Added. for Arduino 1.0 API support of Serial.peek() */ int usb_cdcacm_peek_char() { - if (n_unread_bytes == 0) + if (usb_cdcacm_data_available() == 0) { return -1; } - return vcomBufferRx[rx_offset]; + return vcomBufferRx[rx_tail]; } uint8 usb_cdcacm_get_dtr() { @@ -534,41 +552,75 @@ int usb_cdcacm_get_n_data_bits(void) { return line_coding.bDataBits; } - /* * Callbacks */ - -static void vcomDataTxCb(void) { - n_unsent_bytes = 0; - transmitting = 0; +static void vcomDataTxCb(void) +{ + uint32 tail = tx_tail; // load volatile variable + uint32 tx_unsent = (tx_head - tail) & CDC_SERIAL_TX_BUFFER_SIZE_MASK; + if (tx_unsent==0) { + if ( (--transmitting)==0) goto flush; // no more data to send + return; // it was already flushed, keep Tx endpoint disabled + } + transmitting = 1; + // We can only send up to USB_CDCACM_TX_EPSIZE bytes in the endpoint. + if (tx_unsent > USB_CDCACM_TX_EPSIZE) { + tx_unsent = USB_CDCACM_TX_EPSIZE; + } + // copy the bytes from USB Tx buffer to PMA buffer + uint32 *dst = usb_pma_ptr(USB_CDCACM_TX_ADDR); + uint16 tmp = 0; + uint16 val; + int i; + for (i = 0; i < tx_unsent; i++) { + val = vcomBufferTx[tail]; + tail = (tail + 1) & CDC_SERIAL_TX_BUFFER_SIZE_MASK; + if (i&1) { + *dst++ = tmp | (val<<8); + } else { + tmp = val; + } + } + if ( tx_unsent&1 ) { + *dst = tmp; + } + tx_tail = tail; // store volatile variable +flush: + // enable Tx endpoint + usb_set_ep_tx_count(USB_CDCACM_TX_ENDP, tx_unsent); + usb_set_ep_tx_stat(USB_CDCACM_TX_ENDP, USB_EP_STAT_TX_VALID); } -static void vcomDataRxCb(void) { - uint32 ep_rx_size; - uint32 tail = (rx_offset + n_unread_bytes) % CDC_SERIAL_BUFFER_SIZE; - uint8 ep_rx_data[USB_CDCACM_RX_EPSIZE]; - uint32 i; - - usb_set_ep_rx_stat(USB_CDCACM_RX_ENDP, USB_EP_STAT_RX_NAK); - ep_rx_size = usb_get_ep_rx_count(USB_CDCACM_RX_ENDP); - /* This copy won't overwrite unread bytes, since we've set the RX - * endpoint to NAK, and will only set it to VALID when all bytes - * have been read. */ - usb_copy_from_pma((uint8*)ep_rx_data, ep_rx_size, - USB_CDCACM_RX_ADDR); +static void vcomDataRxCb(void) +{ + uint32 head = rx_head; // load volatile variable + + uint32 ep_rx_size = usb_get_ep_rx_count(USB_CDCACM_RX_ENDP); + // This copy won't overwrite unread bytes as long as there is + // enough room in the USB Rx buffer for next packet + uint32 *src = usb_pma_ptr(USB_CDCACM_RX_ADDR); + uint16 tmp = 0; + uint8 val; + uint32 i; for (i = 0; i < ep_rx_size; i++) { - vcomBufferRx[tail] = ep_rx_data[i]; - tail = (tail + 1) % CDC_SERIAL_BUFFER_SIZE; + if (i&1) { + val = tmp>>8; + } else { + tmp = *src++; + val = tmp&0xFF; + } + vcomBufferRx[head] = val; + head = (head + 1) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; } + rx_head = head; // store volatile variable - n_unread_bytes += ep_rx_size; - - if ( n_unread_bytes == 0 ) { - usb_set_ep_rx_count(USB_CDCACM_RX_ENDP, USB_CDCACM_RX_EPSIZE); - usb_set_ep_rx_stat(USB_CDCACM_RX_ENDP, USB_EP_STAT_RX_VALID); - } + uint32 rx_unread = (head - rx_tail) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; + // only enable further Rx if there is enough room to receive one more packet + if ( rx_unread < (CDC_SERIAL_RX_BUFFER_SIZE-USB_CDCACM_RX_EPSIZE) ) { + usb_set_ep_rx_stat(USB_CDCACM_RX_ENDP, USB_EP_STAT_RX_VALID); + } if (rx_hook) { rx_hook(USB_CDCACM_HOOK_RX, 0); @@ -646,10 +698,11 @@ static void usbReset(void) { SetDeviceAddress(0); /* Reset the RX/TX state */ - n_unread_bytes = 0; - n_unsent_bytes = 0; - rx_offset = 0; - transmitting = 0; + rx_head = 0; + rx_tail = 0; + tx_head = 0; + tx_tail = 0; + transmitting = -1; } static RESULT usbDataSetup(uint8 request) { diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index ab8816bce..24b0014d1 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -100,44 +100,23 @@ size_t n = 0; size_t USBSerial::write(const char *str) { size_t n = 0; - this->write(str, strlen(str)); + this->write((const uint8*)str, strlen(str)); return n; } -size_t USBSerial::write(const void *buf, uint32 len) { +size_t USBSerial::write(const uint8 *buf, uint32 len) +{ size_t n = 0; if (!this->isConnected() || !buf) { return 0; } uint32 txed = 0; - uint32 old_txed = 0; - uint32 start = millis(); - - uint32 sent = 0; - - while (txed < len && (millis() - start < USB_TIMEOUT)) { - sent = usb_cdcacm_tx((const uint8*)buf + txed, len - txed); - txed += sent; - if (old_txed != txed) { - start = millis(); - } - old_txed = txed; + while (txed < len) { + txed += usb_cdcacm_tx((const uint8*)buf + txed, len - txed); } - -#if 0 -// this code leads to a serious performance drop and appears to be -// unnecessary - everything seems to work fine without, -jcw, 2015-11-05 -// see http://stm32duino.com/posting.php?mode=quote&f=3&p=7746 - if (sent == USB_CDCACM_TX_EPSIZE) { - while (usb_cdcacm_is_transmitting() != 0) { - } - /* flush out to avoid having the pc wait for more data */ - usb_cdcacm_tx(NULL, 0); - } -#endif - return n; + return n; } int USBSerial::available(void) { @@ -168,14 +147,10 @@ void USBSerial::flush(void) return; } -uint32 USBSerial::read(void *buf, uint32 len) { - if (!buf) { - return 0; - } - +uint32 USBSerial::read(uint8 * buf, uint32 len) { uint32 rxed = 0; while (rxed < len) { - rxed += usb_cdcacm_rx((uint8*)buf + rxed, len - rxed); + rxed += usb_cdcacm_rx(buf + rxed, len - rxed); } return rxed; @@ -183,13 +158,13 @@ uint32 USBSerial::read(void *buf, uint32 len) { /* Blocks forever until 1 byte is received */ int USBSerial::read(void) { - uint8 b; + int8 b; /* this->read(&b, 1); return b; */ - if (usb_cdcacm_rx(&b, 1)==0) + if (usb_cdcacm_rx((uint8*)&b, 1)==0) { return -1; } diff --git a/STM32F1/cores/maple/usb_serial.h b/STM32F1/cores/maple/usb_serial.h index 740ab0fd9..e50a16c27 100644 --- a/STM32F1/cores/maple/usb_serial.h +++ b/STM32F1/cores/maple/usb_serial.h @@ -53,7 +53,7 @@ class USBSerial : public Stream { virtual int available(void);// Changed to virtual - uint32 read(void *buf, uint32 len); + uint32 read(uint8 * buf, uint32 len); // uint8 read(void); // Roger Clark. added functions to support Arduino 1.0 API diff --git a/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h b/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h index 6683264f8..9e9214cf1 100644 --- a/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h +++ b/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h @@ -349,8 +349,8 @@ static inline void usb_clear_status_out(uint8 ep) { void usb_copy_to_pma(const uint8 *buf, uint16 len, uint16 pma_offset); void usb_copy_from_pma(uint8 *buf, uint16 len, uint16 pma_offset); -static inline void* usb_pma_ptr(uint32 offset) { - return (void*)(USB_PMA_BASE + 2 * offset); +static inline uint32 * usb_pma_ptr(uint32 offset) { + return (uint32*)(USB_PMA_BASE + 2 * offset); } /* From 42cb8b5bc809df2aa4b9d82f535d7a71caae9282 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 21 Oct 2016 23:01:45 +0200 Subject: [PATCH 002/307] small change - revert local variable to uint8 in Serial.read --- STM32F1/cores/maple/usb_serial.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index 24b0014d1..5eaf70efb 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -158,13 +158,13 @@ uint32 USBSerial::read(uint8 * buf, uint32 len) { /* Blocks forever until 1 byte is received */ int USBSerial::read(void) { - int8 b; + uint8 b; /* this->read(&b, 1); return b; */ - if (usb_cdcacm_rx((uint8*)&b, 1)==0) + if (usb_cdcacm_rx(&b, 1)==0) { return -1; } From 34b6bd927d9ce7f66f43fcfd99f9204fb7de6289 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sat, 29 Oct 2016 22:09:44 +1100 Subject: [PATCH 003/307] Fixed issue with ILI9341_due library (and Touch libary), incorrectly including pins_arduino.h --- STM32F1/libraries/ILI9341_due_STM/ILI9341_due.h | 2 +- STM32F1/libraries/Touch-Screen-Library_STM/TouchScreen_STM.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/ILI9341_due_STM/ILI9341_due.h b/STM32F1/libraries/ILI9341_due_STM/ILI9341_due.h index 7b7268466..f06dd7153 100644 --- a/STM32F1/libraries/ILI9341_due_STM/ILI9341_due.h +++ b/STM32F1/libraries/ILI9341_due_STM/ILI9341_due.h @@ -53,7 +53,7 @@ MIT license, all text above must be included in any redistribution #include #include #include - #include "pins_arduino.h" +// #include "pins_arduino.h" #include "wiring_private.h" #include #endif diff --git a/STM32F1/libraries/Touch-Screen-Library_STM/TouchScreen_STM.cpp b/STM32F1/libraries/Touch-Screen-Library_STM/TouchScreen_STM.cpp index 0cddc44c2..4eadfc18c 100644 --- a/STM32F1/libraries/Touch-Screen-Library_STM/TouchScreen_STM.cpp +++ b/STM32F1/libraries/Touch-Screen-Library_STM/TouchScreen_STM.cpp @@ -5,7 +5,7 @@ // Ported to STM32 by Jaret Burkett https://github.com/jaretburkett -#include "pins_arduino.h" +//#include "pins_arduino.h" #include "wiring_private.h" #ifdef __AVR #include From e2c957489af9aa0307f43ef19e33cd8d7bc18156 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 30 Oct 2016 21:38:30 +1100 Subject: [PATCH 004/307] Added support for Hy-Tiny STM32F103T --- STM32F1/boards.txt | 62 +++++ STM32F1/variants/hytiny_stm32f103t/board.cpp | 122 ++++++++++ .../variants/hytiny_stm32f103t/board/board.h | 75 ++++++ .../hytiny_stm32f103t/ld/bootloader_20.ld | 30 +++ .../variants/hytiny_stm32f103t/ld/common.inc | 220 +++++++++++++++++ .../hytiny_stm32f103t/ld/extra_libs.inc | 7 + .../variants/hytiny_stm32f103t/ld/flash.ld | 26 ++ .../variants/hytiny_stm32f103t/ld/flash_c8.ld | 33 +++ STM32F1/variants/hytiny_stm32f103t/ld/jtag.ld | 31 +++ .../variants/hytiny_stm32f103t/ld/jtag_c8.ld | 36 +++ .../hytiny_stm32f103t/ld/mem-flash.inc | 5 + .../hytiny_stm32f103t/ld/mem-jtag.inc | 5 + .../variants/hytiny_stm32f103t/ld/mem-ram.inc | 5 + STM32F1/variants/hytiny_stm32f103t/ld/ram.ld | 25 ++ .../variants/hytiny_stm32f103t/ld/ram_c8.ld | 31 +++ .../hytiny_stm32f103t/ld/vector_symbols.inc | 78 ++++++ .../variants/hytiny_stm32f103t/pins_arduino.h | 6 + STM32F1/variants/hytiny_stm32f103t/variant.h | 19 ++ .../hytiny_stm32f103t/wirish/boards.cpp | 229 ++++++++++++++++++ .../hytiny_stm32f103t/wirish/boards_setup.cpp | 96 ++++++++ .../variants/hytiny_stm32f103t/wirish/start.S | 57 +++++ .../hytiny_stm32f103t/wirish/start_c.c | 95 ++++++++ .../hytiny_stm32f103t/wirish/syscalls.c | 176 ++++++++++++++ 23 files changed, 1469 insertions(+) create mode 100644 STM32F1/variants/hytiny_stm32f103t/board.cpp create mode 100644 STM32F1/variants/hytiny_stm32f103t/board/board.h create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/bootloader_20.ld create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/common.inc create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/extra_libs.inc create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/flash.ld create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/flash_c8.ld create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/jtag.ld create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/jtag_c8.ld create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/mem-flash.inc create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/mem-jtag.inc create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/mem-ram.inc create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/ram.ld create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/ram_c8.ld create mode 100644 STM32F1/variants/hytiny_stm32f103t/ld/vector_symbols.inc create mode 100644 STM32F1/variants/hytiny_stm32f103t/pins_arduino.h create mode 100644 STM32F1/variants/hytiny_stm32f103t/variant.h create mode 100644 STM32F1/variants/hytiny_stm32f103t/wirish/boards.cpp create mode 100644 STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp create mode 100644 STM32F1/variants/hytiny_stm32f103t/wirish/start.S create mode 100644 STM32F1/variants/hytiny_stm32f103t/wirish/start_c.c create mode 100644 STM32F1/variants/hytiny_stm32f103t/wirish/syscalls.c diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index cb660a9e3..b56272f7d 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -462,6 +462,68 @@ genericSTM32F103Z.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp genericSTM32F103Z.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103Z.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG +###################### HYTiny STM32F103T ######################################## + +hytiny-stm32f103t.name=HYTiny STM32F103T series +hytiny-stm32f103t.vid.0=0x1EAF +hytiny-stm32f103t.pid.0=0x0004 +hytiny-stm32f103t.build.variant=hytiny_stm32f103t +hytiny-stm32f103t.build.vect=VECT_TAB_ADDR=0x8000000 +hytiny-stm32f103t.build.core=maple +hytiny-stm32f103t.build.board=HYTINY_STM32F103T +hytiny-stm32f103t.upload.use_1200bps_touch=false +hytiny-stm32f103t.upload.file_type=bin +hytiny-stm32f103t.upload.auto_reset=true + +## STM32F103C8 ------------------------- +hytiny-stm32f103t.menu.device_variant.STM32F103C8=STM32F103C8 (20k RAM. 64k Flash) +hytiny-stm32f103t.menu.device_variant.STM32F103C8.build.cpu_flags=-DMCU_STM32F103C8 +hytiny-stm32f103t.menu.device_variant.STM32F103C8.build.ldscript=ld/jtag_c8.ld +hytiny-stm32f103t.menu.device_variant.STM32F103C8.upload.maximum_size=65536 +hytiny-stm32f103t.menu.device_variant.STM32F103C8.upload.ram.maximum_size=20480 +hytiny-stm32f103t.menu.device_variant.STM32F103C8.upload.flash.maximum_size=65536 + +## STM32F103CB ------------------------- +hytiny-stm32f103t.menu.device_variant.STM32F103CB=STM32F103CB (20k RAM. 128k Flash) +hytiny-stm32f103t.menu.device_variant.STM32F103CB.build.cpu_flags=-DMCU_STM32F103CB +hytiny-stm32f103t.menu.device_variant.STM32F103CB.build.ldscript=ld/jtag.ld +hytiny-stm32f103t.menu.device_variant.STM32F103CB.upload.maximum_size=131072 +hytiny-stm32f103t.menu.device_variant.STM32F103CB.upload.ram.maximum_size=20480 +hytiny-stm32f103t.menu.device_variant.STM32F103CB.upload.flash.maximum_size=131072 + +#---------------------------- UPLOAD METHODS --------------------------- + +hytiny-stm32f103t.menu.upload_method.DFUUploadMethod=STM32duino bootloader +hytiny-stm32f103t.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu +hytiny-stm32f103t.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload +hytiny-stm32f103t.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB +hytiny-stm32f103t.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 +hytiny-stm32f103t.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader_20.ld +hytiny-stm32f103t.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 +hytiny-stm32f103t.menu.upload_method.DFUUploadMethod.upload.altID=2 + +hytiny-stm32f103t.menu.upload_method.serialMethod=Serial +hytiny-stm32f103t.menu.upload_method.serialMethod.upload.protocol=maple_serial +hytiny-stm32f103t.menu.upload_method.serialMethod.upload.tool=serial_upload + + +hytiny-stm32f103t.menu.upload_method.STLinkMethod=STLink +hytiny-stm32f103t.menu.upload_method.STLinkMethod.upload.protocol=STLink +hytiny-stm32f103t.menu.upload_method.STLinkMethod.upload.tool=stlink_upload +hytiny-stm32f103t.menu.upload_method.STLinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER + +hytiny-stm32f103t.menu.upload_method.BMPMethod=BMP (Black Magic Probe) +hytiny-stm32f103t.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp +hytiny-stm32f103t.menu.upload_method.BMPMethod.upload.tool=bmp_upload +hytiny-stm32f103t.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG + + +hytiny-stm32f103t.menu.upload_method.jlinkMethod=JLink +hytiny-stm32f103t.menu.upload_method.jlinkMethod.upload.protocol=jlink +hytiny-stm32f103t.menu.upload_method.jlinkMethod.upload.tool=jlink_upload +hytiny-stm32f103t.menu.upload_method.jlinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER + + ###################### Generic GD32F103C ######################################## genericGD32F103C.name=Generic GD32F103C series diff --git a/STM32F1/variants/hytiny_stm32f103t/board.cpp b/STM32F1/variants/hytiny_stm32f103t/board.cpp new file mode 100644 index 000000000..f1fb44f07 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/board.cpp @@ -0,0 +1,122 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * &file wirish/boards/maple_mini/board.cpp + * &author Marti Bolivar + * &brief Maple Mini board file. + */ + +#include + +#include +#include + +/* Roger Clark. Added next to includes for changes to Serial */ +#include +#include + +#include +#include + +/* Since we want the Serial Wire/JTAG pins as GPIOs, disable both SW + * and JTAG debug support, unless configured otherwise. */ +void boardInit(void) { +#ifndef CONFIG_MAPLE_MINI_NO_DISABLE_DEBUG + disableDebugPorts(); +#endif +} + +// Note. See the enum of pin names in board.h + +extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { + + + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + +}; + +extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { + PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8 +}; + +extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = { + PB0, PA7, PA6 , PA5 , PA4 , PA3 , PA2 , PA1 , PA0 +}; + +// Note. These defines are not really used by generic boards. They are for Maple Serial USB +#define USB_DP PA12 +#define USB_DM PA11 + +// NOte. These definitions are not really used for generic boards, they only relate to boards modified to behave like Maple boards +extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { + USB_DP, USB_DM +}; + + +/* + * Roger Clark + * + * 2015/05/28 + * + * Moved definitions for Hardware Serial devices from HardwareSerial.cpp so that each board can define which Arduino "Serial" instance + * Maps to which hardware serial port on the microprocessor + */ + +#ifdef SERIAL_USB + DEFINE_HWSERIAL(Serial1, 1); + + DEFINE_HWSERIAL(Serial2, 2); + +#else + DEFINE_HWSERIAL(Serial, 1); + + DEFINE_HWSERIAL(Serial1, 2); +#endif diff --git a/STM32F1/variants/hytiny_stm32f103t/board/board.h b/STM32F1/variants/hytiny_stm32f103t/board/board.h new file mode 100644 index 000000000..194b2e581 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/board/board.h @@ -0,0 +1,75 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/boards/maple_mini/include/board/board.h + * @author Marti Bolivar + * @brief Maple Mini board header. + * + * See wirish/boards/maple/include/board/board.h for more information + * on these definitions. + */ + +#ifndef _BOARD_GENERIC_STM32F103C_H_ +#define _BOARD_GENERIC_STM32F103C_H_ + +#define CYCLES_PER_MICROSECOND 72 +#define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ + +#define BOARD_NR_USARTS 2 +#define BOARD_USART1_TX_PIN PA9 +#define BOARD_USART1_RX_PIN PA10 +#define BOARD_USART2_TX_PIN PA2 +#define BOARD_USART2_RX_PIN PA3 + + +#define BOARD_NR_SPI 1 +#define BOARD_SPI1_NSS_PIN PA4 +#define BOARD_SPI1_MOSI_PIN PA7 +#define BOARD_SPI1_MISO_PIN PA6 +#define BOARD_SPI1_SCK_PIN PA5 + +#define BOARD_NR_GPIO_PINS 35 +#define BOARD_NR_PWM_PINS 12 +#define BOARD_NR_ADC_PINS 9 +#define BOARD_NR_USED_PINS 4 + +#define BOARD_JTMS_SWDIO_PIN 22 +#define BOARD_JTCK_SWCLK_PIN 21 +#define BOARD_JTDI_PIN 20 +#define BOARD_JTDO_PIN 19 +#define BOARD_NJTRST_PIN 18 + +#define BOARD_USB_DISC_DEV GPIOA +#define BOARD_USB_DISC_BIT 0 + +// Note this needs to match with the PIN_MAP array in board.cpp +enum { + PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9, PA10, PA11, PA12, PA13,PA14,PA15, + PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7 +}; + +#endif diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/bootloader_20.ld b/STM32F1/variants/hytiny_stm32f103t/ld/bootloader_20.ld new file mode 100644 index 000000000..4de3a0839 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/bootloader_20.ld @@ -0,0 +1,30 @@ +/* + * libmaple linker script for "Flash" builds. + * + * A Flash build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but offsets the sections by + * enough space to store the Maple bootloader, which lives in low + * Flash and uses low memory. + */ + +/* + * This pulls in the appropriate MEMORY declaration from the right + * subdirectory of stm32/mem/ (the environment must call ld with the + * right include directory flags to make this happen). Boards can also + * use this file to use any of libmaple's memory-related hooks (like + * where the heap should live). + */ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K + rom (rx) : ORIGIN = 0x08002000, LENGTH = 120K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/common.inc b/STM32F1/variants/hytiny_stm32f103t/ld/common.inc new file mode 100644 index 000000000..e086a58bc --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/common.inc @@ -0,0 +1,220 @@ +/* + * Linker script for libmaple. + * + * Original author "lanchon" from ST forums, with modifications by LeafLabs. + */ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") + +/* + * Configure other libraries we want in the link. + * + * libgcc, libc, and libm are common across supported toolchains. + * However, some toolchains require additional archives which aren't + * present everywhere (e.g. ARM's gcc-arm-embedded releases). + * + * To hack around this, we let the build system specify additional + * archives by putting the right extra_libs.inc (in a directory under + * toolchains/) in our search path. + */ +GROUP(libgcc.a libc.a libm.a) +INCLUDE extra_libs.inc + +/* + * These force the linker to search for vector table symbols. + * + * These symbols vary by STM32 family (and also within families). + * It's up to the build system to configure the link's search path + * properly for the target MCU. + */ +INCLUDE vector_symbols.inc + +/* STM32 vector table. */ +EXTERN(__stm32_vector_table) + +/* C runtime initialization function. */ +EXTERN(start_c) + +/* main entry point */ +EXTERN(main) + +/* Initial stack pointer value. */ +EXTERN(__msp_init) +PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram)); + +/* Reset vector and chip reset entry point */ +EXTERN(__start__) +ENTRY(__start__) +PROVIDE(__exc_reset = __start__); + +/* Heap boundaries, for libmaple */ +EXTERN(_lm_heap_start); +EXTERN(_lm_heap_end); + +SECTIONS +{ + .text : + { + __text_start__ = .; + /* + * STM32 vector table. Leave this here. Yes, really. + */ + *(.stm32.interrupt_vector) + + /* + * Program code and vague linking + */ + *(.text .text.* .gnu.linkonce.t.*) + *(.plt) + *(.gnu.warning) + *(.glue_7t) *(.glue_7) *(.vfp11_veneer) + + *(.ARM.extab* .gnu.linkonce.armextab.*) + *(.gcc_except_table) + *(.eh_frame_hdr) + *(.eh_frame) + + . = ALIGN(4); + KEEP(*(.init)) + + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + } > REGION_TEXT + + /* + * End of text + */ + .text.align : + { + . = ALIGN(8); + __text_end__ = .; + } > REGION_TEXT + + /* + * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI + */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > REGION_RODATA + __exidx_end = .; + + /* + * .data + */ + .data : + { + __data_start__ = .; + LONG(0) + . = ALIGN(8); + + *(.got.plt) *(.got) + *(.data .data.* .gnu.linkonce.d.*) + + . = ALIGN(8); + __data_end__ = .; + } > REGION_DATA AT> REGION_RODATA + + /* + * Read-only data + */ + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + /* .USER_FLASH: We allow users to allocate into Flash here */ + *(.USER_FLASH) + /* ROM image configuration; for C startup */ + . = ALIGN(4); + _lm_rom_img_cfgp = .; + LONG(LOADADDR(.data)); + /* + * Heap: Linker scripts may choose a custom heap by overriding + * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in + * internal SRAM, beginning after .bss, and growing towards + * the stack. + * + * I'm shoving these here naively; there's probably a cleaner way + * to go about this. [mbolivar] + */ + _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; + _lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init; + } > REGION_RODATA + + /* + * .bss + */ + .bss : + { + . = ALIGN(8); + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + . = ALIGN (8); + __bss_end__ = .; + _end = __bss_end__; + } > REGION_BSS + + /* + * Debugging sections + */ + .stab 0 (NOLOAD) : { *(.stab) } + .stabstr 0 (NOLOAD) : { *(.stabstr) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/extra_libs.inc b/STM32F1/variants/hytiny_stm32f103t/ld/extra_libs.inc new file mode 100644 index 000000000..dd2c84fa4 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/extra_libs.inc @@ -0,0 +1,7 @@ +/* + * Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi- + * releases (https://launchpad.net/gcc-arm-embedded/). + */ + +/* This is for the provided newlib. */ +GROUP(libnosys.a) diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/flash.ld b/STM32F1/variants/hytiny_stm32f103t/ld/flash.ld new file mode 100644 index 000000000..9e250cd74 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/flash.ld @@ -0,0 +1,26 @@ +/* + * libmaple linker script for "Flash" builds. + * + * A Flash build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but offsets the sections by + * enough space to store the Maple bootloader, which lives in low + * Flash and uses low memory. + */ + +/* + * This pulls in the appropriate MEMORY declaration from the right + * subdirectory of stm32/mem/ (the environment must call ld with the + * right include directory flags to make this happen). Boards can also + * use this file to use any of libmaple's memory-related hooks (like + * where the heap should live). + */ +INCLUDE mem-flash.inc + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/flash_c8.ld b/STM32F1/variants/hytiny_stm32f103t/ld/flash_c8.ld new file mode 100644 index 000000000..46039238e --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/flash_c8.ld @@ -0,0 +1,33 @@ +/* + * libmaple linker script for "Flash" builds. + * + * A Flash build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but offsets the sections by + * enough space to store the Maple bootloader, which lives in low + * Flash and uses low memory. + */ + +/* + * This pulls in the appropriate MEMORY declaration from the right + * subdirectory of stm32/mem/ (the environment must call ld with the + * right include directory flags to make this happen). Boards can also + * use this file to use any of libmaple's memory-related hooks (like + * where the heap should live). + */ +/*INCLUDE mem-flash.inc*/ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 17K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 44K +} + + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/jtag.ld b/STM32F1/variants/hytiny_stm32f103t/ld/jtag.ld new file mode 100644 index 000000000..0612f9586 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/jtag.ld @@ -0,0 +1,31 @@ +/* + * libmaple linker script for "JTAG" builds. + * + * A "JTAG" build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but links starting at the + * Flash and SRAM starting addresses (0x08000000 and 0x20000000 + * respectively). This will wipe out a Maple bootloader if there's one + * on the board, so only use this if you know what you're doing. + * + * Of course, a "JTAG" build is perfectly usable for upload over SWD, + * the system memory bootloader, etc. The name is just a historical + * artifact. + */ + +/* + * This pulls in the appropriate MEMORY declaration from the right + * subdirectory of stm32/mem/ (the environment must call ld with the + * right include directory flags to make this happen). Boards can also + * use this file to use any of libmaple's memory-related hooks (like + * where the heap should live). + */ +INCLUDE mem-jtag.inc + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/jtag_c8.ld b/STM32F1/variants/hytiny_stm32f103t/ld/jtag_c8.ld new file mode 100644 index 000000000..d9d4a0f0f --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/jtag_c8.ld @@ -0,0 +1,36 @@ +/* + * libmaple linker script for "JTAG" builds. + * + * A "JTAG" build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but links starting at the + * Flash and SRAM starting addresses (0x08000000 and 0x20000000 + * respectively). This will wipe out a Maple bootloader if there's one + * on the board, so only use this if you know what you're doing. + * + * Of course, a "JTAG" build is perfectly usable for upload over SWD, + * the system memory bootloader, etc. The name is just a historical + * artifact. + */ + +/* + * This pulls in the appropriate MEMORY declaration from the right + * subdirectory of stm32/mem/ (the environment must call ld with the + * right include directory flags to make this happen). Boards can also + * use this file to use any of libmaple's memory-related hooks (like + * where the heap should live). + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 64K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/mem-flash.inc b/STM32F1/variants/hytiny_stm32f103t/ld/mem-flash.inc new file mode 100644 index 000000000..a9091ca85 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/mem-flash.inc @@ -0,0 +1,5 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 17K + rom (rx) : ORIGIN = 0x08005000, LENGTH = 108K +} diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/mem-jtag.inc b/STM32F1/variants/hytiny_stm32f103t/ld/mem-jtag.inc new file mode 100644 index 000000000..20fbec056 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/mem-jtag.inc @@ -0,0 +1,5 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K +} diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/mem-ram.inc b/STM32F1/variants/hytiny_stm32f103t/ld/mem-ram.inc new file mode 100644 index 000000000..f02453b9a --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/mem-ram.inc @@ -0,0 +1,5 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 17K + rom (rx) : ORIGIN = 0x08005000, LENGTH = 0K +} diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/ram.ld b/STM32F1/variants/hytiny_stm32f103t/ld/ram.ld new file mode 100644 index 000000000..34b468e0a --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/ram.ld @@ -0,0 +1,25 @@ +/* + * libmaple linker script for RAM builds. + * + * A Flash build puts .text, .rodata, and .data/.bss/heap (of course) + * in SRAM, but offsets the sections by enough space to store the + * Maple bootloader, which uses low memory. + */ + +/* + * This pulls in the appropriate MEMORY declaration from the right + * subdirectory of stm32/mem/ (the environment must call ld with the + * right include directory flags to make this happen). Boards can also + * use this file to use any of libmaple's memory-related hooks (like + * where the heap should live). + */ +INCLUDE mem-ram.inc + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", ram); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", ram); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/ram_c8.ld b/STM32F1/variants/hytiny_stm32f103t/ld/ram_c8.ld new file mode 100644 index 000000000..71e081e36 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/ram_c8.ld @@ -0,0 +1,31 @@ +/* + * libmaple linker script for RAM builds. + * + * A Flash build puts .text, .rodata, and .data/.bss/heap (of course) + * in SRAM, but offsets the sections by enough space to store the + * Maple bootloader, which uses low memory. + */ + +/* + * This pulls in the appropriate MEMORY declaration from the right + * subdirectory of stm32/mem/ (the environment must call ld with the + * right include directory flags to make this happen). Boards can also + * use this file to use any of libmaple's memory-related hooks (like + * where the heap should live). + */ +/*INCLUDE mem-ram.inc*/ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 17K + rom (rx) : ORIGIN = 0x08005000, LENGTH = 0 +} + + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", ram); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", ram); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/STM32F1/variants/hytiny_stm32f103t/ld/vector_symbols.inc b/STM32F1/variants/hytiny_stm32f103t/ld/vector_symbols.inc new file mode 100644 index 000000000..f8519bba4 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/ld/vector_symbols.inc @@ -0,0 +1,78 @@ +EXTERN(__msp_init) +EXTERN(__exc_reset) +EXTERN(__exc_nmi) +EXTERN(__exc_hardfault) +EXTERN(__exc_memmanage) +EXTERN(__exc_busfault) +EXTERN(__exc_usagefault) +EXTERN(__stm32reservedexception7) +EXTERN(__stm32reservedexception8) +EXTERN(__stm32reservedexception9) +EXTERN(__stm32reservedexception10) +EXTERN(__exc_svc) +EXTERN(__exc_debug_monitor) +EXTERN(__stm32reservedexception13) +EXTERN(__exc_pendsv) +EXTERN(__exc_systick) + +EXTERN(__irq_wwdg) +EXTERN(__irq_pvd) +EXTERN(__irq_tamper) +EXTERN(__irq_rtc) +EXTERN(__irq_flash) +EXTERN(__irq_rcc) +EXTERN(__irq_exti0) +EXTERN(__irq_exti1) +EXTERN(__irq_exti2) +EXTERN(__irq_exti3) +EXTERN(__irq_exti4) +EXTERN(__irq_dma1_channel1) +EXTERN(__irq_dma1_channel2) +EXTERN(__irq_dma1_channel3) +EXTERN(__irq_dma1_channel4) +EXTERN(__irq_dma1_channel5) +EXTERN(__irq_dma1_channel6) +EXTERN(__irq_dma1_channel7) +EXTERN(__irq_adc) +EXTERN(__irq_usb_hp_can_tx) +EXTERN(__irq_usb_lp_can_rx0) +EXTERN(__irq_can_rx1) +EXTERN(__irq_can_sce) +EXTERN(__irq_exti9_5) +EXTERN(__irq_tim1_brk) +EXTERN(__irq_tim1_up) +EXTERN(__irq_tim1_trg_com) +EXTERN(__irq_tim1_cc) +EXTERN(__irq_tim2) +EXTERN(__irq_tim3) +EXTERN(__irq_tim4) +EXTERN(__irq_i2c1_ev) +EXTERN(__irq_i2c1_er) +EXTERN(__irq_i2c2_ev) +EXTERN(__irq_i2c2_er) +EXTERN(__irq_spi1) +EXTERN(__irq_spi2) +EXTERN(__irq_usart1) +EXTERN(__irq_usart2) +EXTERN(__irq_usart3) +EXTERN(__irq_exti15_10) +EXTERN(__irq_rtcalarm) +EXTERN(__irq_usbwakeup) + +EXTERN(__irq_tim8_brk) +EXTERN(__irq_tim8_up) +EXTERN(__irq_tim8_trg_com) +EXTERN(__irq_tim8_cc) +EXTERN(__irq_adc3) +EXTERN(__irq_fsmc) +EXTERN(__irq_sdio) +EXTERN(__irq_tim5) +EXTERN(__irq_spi3) +EXTERN(__irq_uart4) +EXTERN(__irq_uart5) +EXTERN(__irq_tim6) +EXTERN(__irq_tim7) +EXTERN(__irq_dma2_channel1) +EXTERN(__irq_dma2_channel2) +EXTERN(__irq_dma2_channel3) +EXTERN(__irq_dma2_channel4_5) diff --git a/STM32F1/variants/hytiny_stm32f103t/pins_arduino.h b/STM32F1/variants/hytiny_stm32f103t/pins_arduino.h new file mode 100644 index 000000000..3052f2eb2 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/pins_arduino.h @@ -0,0 +1,6 @@ + + + + +// API compatibility +#include "variant.h" \ No newline at end of file diff --git a/STM32F1/variants/hytiny_stm32f103t/variant.h b/STM32F1/variants/hytiny_stm32f103t/variant.h new file mode 100644 index 000000000..fc5da7ecd --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/variant.h @@ -0,0 +1,19 @@ +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) +#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) +#define portOutputRegister(port) ( &(port->regs->ODR) ) +#define portInputRegister(port) ( &(port->regs->IDR) ) + +#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) ) +#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) ) + +#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) ) + +static const uint8_t SS = BOARD_SPI1_NSS_PIN; +static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; +static const uint8_t MISO = BOARD_SPI1_MISO_PIN; +static const uint8_t SCK = BOARD_SPI1_SCK_PIN; + +#endif /* _VARIANT_ARDUINO_STM32_ */ \ No newline at end of file diff --git a/STM32F1/variants/hytiny_stm32f103t/wirish/boards.cpp b/STM32F1/variants/hytiny_stm32f103t/wirish/boards.cpp new file mode 100644 index 000000000..0a358ee19 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/wirish/boards.cpp @@ -0,0 +1,229 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011, 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/boards.cpp + * @brief init() and board routines. + * + * This file is mostly interesting for the init() function, which + * configures Flash, the core clocks, and a variety of other available + * peripherals on the board so the rest of Wirish doesn't have to turn + * things on before using them. + * + * Prior to returning, init() calls boardInit(), which allows boards + * to perform any initialization they need to. This file includes a + * weak no-op definition of boardInit(), so boards that don't need any + * special initialization don't have to define their own. + * + * How init() works is chip-specific. See the boards_setup.cpp files + * under e.g. wirish/stm32f1/, wirish/stmf32f2 for the details, but be + * advised: their contents are unstable, and can/will change without + * notice. + */ + +#include +#include +#include +#include +#include +#include "boards_private.h" + +static void setup_flash(void); +static void setup_clocks(void); +static void setup_nvic(void); +static void setup_adcs(void); +static void setup_timers(void); + +/* + * Exported functions + */ + +void init(void) { + setup_flash(); + setup_clocks(); + setup_nvic(); + systick_init(SYSTICK_RELOAD_VAL); + wirish::priv::board_setup_gpio(); + setup_adcs(); + setup_timers(); + wirish::priv::board_setup_usb(); + wirish::priv::series_init(); + boardInit(); +} + +/* Provide a default no-op boardInit(). */ +__weak void boardInit(void) { +} + +/* You could farm this out to the files in boards/ if e.g. it takes + * too long to test on boards with lots of pins. */ +bool boardUsesPin(uint8 pin) { + for (int i = 0; i < BOARD_NR_USED_PINS; i++) { + if (pin == boardUsedPins[i]) { + return true; + } + } + return false; +} + +/* + * Auxiliary routines + */ + +static void setup_flash(void) { + // Turn on as many Flash "go faster" features as + // possible. flash_enable_features() just ignores any flags it + // can't support. + flash_enable_features(FLASH_PREFETCH | FLASH_ICACHE | FLASH_DCACHE); + // Configure the wait states, assuming we're operating at "close + // enough" to 3.3V. + flash_set_latency(FLASH_SAFE_WAIT_STATES); +} + +static void setup_clocks(void) { + // Turn on HSI. We'll switch to and run off of this while we're + // setting up the main PLL. + rcc_turn_on_clk(RCC_CLK_HSI); + + // Turn off and reset the clock subsystems we'll be using, as well + // as the clock security subsystem (CSS). Note that resetting CFGR + // to its default value of 0 implies a switch to HSI for SYSCLK. + RCC_BASE->CFGR = 0x00000000; + rcc_disable_css(); + rcc_turn_off_clk(RCC_CLK_PLL); + rcc_turn_off_clk(RCC_CLK_HSE); + wirish::priv::board_reset_pll(); + // Clear clock readiness interrupt flags and turn off clock + // readiness interrupts. + RCC_BASE->CIR = 0x00000000; + + // Enable HSE, and wait until it's ready. + rcc_turn_on_clk(RCC_CLK_HSE); + while (!rcc_is_clk_ready(RCC_CLK_HSE)) + ; + + // Configure AHBx, APBx, etc. prescalers and the main PLL. + wirish::priv::board_setup_clock_prescalers(); + rcc_configure_pll(&wirish::priv::w_board_pll_cfg); + + // Enable the PLL, and wait until it's ready. + rcc_turn_on_clk(RCC_CLK_PLL); + while(!rcc_is_clk_ready(RCC_CLK_PLL)) + ; + + // Finally, switch to the now-ready PLL as the main clock source. + rcc_switch_sysclk(RCC_CLKSRC_PLL); +} + +/* + * These addresses are where usercode starts when a bootloader is + * present. If no bootloader is present, the user NVIC usually starts + * at the Flash base address, 0x08000000. + */ +#if defined(BOOTLOADER_maple) + #define USER_ADDR_ROM 0x08005000 +#else + #if defined(BOOTLOADER_robotis) + #define USER_ADDR_ROM 0x08003000 + #else + #define USER_ADDR_ROM 0x08000000 + #endif +#endif +#define USER_ADDR_RAM 0x20000C00 +extern char __text_start__; + +static void setup_nvic(void) { + +nvic_init((uint32)VECT_TAB_ADDR, 0); + +/* Roger Clark. We now control nvic vector table in boards.txt using the build.vect paramater +#ifdef VECT_TAB_FLASH + nvic_init(USER_ADDR_ROM, 0); +#elif defined VECT_TAB_RAM + nvic_init(USER_ADDR_RAM, 0); +#elif defined VECT_TAB_BASE + nvic_init((uint32)0x08000000, 0); +#elif defined VECT_TAB_ADDR + // A numerically supplied value + nvic_init((uint32)VECT_TAB_ADDR, 0); +#else + // Use the __text_start__ value from the linker script; this + // should be the start of the vector table. + nvic_init((uint32)&__text_start__, 0); +#endif + +*/ +} + +static void adc_default_config( adc_dev *dev) { + adc_enable_single_swstart(dev); + adc_set_sample_rate(dev, wirish::priv::w_adc_smp); +} + +static void setup_adcs(void) { + adc_set_prescaler(wirish::priv::w_adc_pre); + adc_foreach(adc_default_config); +} + +static void timer_default_config(timer_dev *dev) { + timer_adv_reg_map *regs = (dev->regs).adv; + const uint16 full_overflow = 0xFFFF; + const uint16 half_duty = 0x8FFF; + + timer_init(dev); + timer_pause(dev); + + regs->CR1 = TIMER_CR1_ARPE; + regs->PSC = 1; + regs->SR = 0; + regs->DIER = 0; + regs->EGR = TIMER_EGR_UG; + switch (dev->type) { + case TIMER_ADVANCED: + regs->BDTR = TIMER_BDTR_MOE | TIMER_BDTR_LOCK_OFF; + // fall-through + case TIMER_GENERAL: + timer_set_reload(dev, full_overflow); + for (uint8 channel = 1; channel <= 4; channel++) { + if (timer_has_cc_channel(dev, channel)) { + timer_set_compare(dev, channel, half_duty); + timer_oc_set_mode(dev, channel, TIMER_OC_MODE_PWM_1, + TIMER_OC_PE); + } + } + // fall-through + case TIMER_BASIC: + break; + } + + timer_generate_update(dev); + timer_resume(dev); +} + +static void setup_timers(void) { + timer_foreach(timer_default_config); +} diff --git a/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp b/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp new file mode 100644 index 000000000..5d762c7cc --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp @@ -0,0 +1,96 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*****************************************************************************/ + +/** + * @file wirish/stm32f1/boards_setup.cpp + * @author Marti Bolivar + * @brief STM32F1 chip setup. + * + * This file controls how init() behaves on the STM32F1. Be very + * careful when changing anything here. Many of these values depend + * upon each other. + */ + +#include "boards_private.h" + +#include +#include + +#include +#include + +// Allow boards to provide a PLL multiplier. This is useful for +// e.g. STM32F100 value line MCUs, which use slower multipliers. +// (We're leaving the default to RCC_PLLMUL_9 for now, since that +// works for F103 performance line MCUs, which is all that LeafLabs +// currently officially supports). +#ifndef BOARD_RCC_PLLMUL +#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 +#endif + +namespace wirish { + namespace priv { + + static stm32f1_rcc_pll_data pll_data = {BOARD_RCC_PLLMUL}; + __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSE, &pll_data}; + __weak adc_prescaler w_adc_pre = ADC_PRE_PCLK2_DIV_6; + __weak adc_smp_rate w_adc_smp = ADC_SMPR_55_5; + + __weak void board_reset_pll(void) { + // TODO + } + + __weak void board_setup_clock_prescalers(void) { + rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1); + rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2); + rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1); + rcc_clk_disable(RCC_USB); + #if F_CPU == 72000000 + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + #elif F_CPU == 48000000 + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + #endif + } + + __weak void board_setup_gpio(void) { + gpio_init_all(); + } + + __weak void board_setup_usb(void) { +#ifdef SERIAL_USB +// SerialUSB.begin(); + Serial.begin();// Roger Clark. Changed SerialUSB to Serial for Arduino sketch compatibility +#endif + } + + __weak void series_init(void) { + // Initialize AFIO here, too, so peripheral remaps and external + // interrupts work out of the box. + afio_init(); + } + + } +} diff --git a/STM32F1/variants/hytiny_stm32f103t/wirish/start.S b/STM32F1/variants/hytiny_stm32f103t/wirish/start.S new file mode 100644 index 000000000..8b181aa99 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/wirish/start.S @@ -0,0 +1,57 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + + .text + .code 16 + .thumb_func + + .globl __start__ + .type __start__, %function +__start__: + .fnstart + ldr r1,=__msp_init + mov sp,r1 + ldr r1,=start_c + bx r1 + .pool + .cantunwind + .fnend diff --git a/STM32F1/variants/hytiny_stm32f103t/wirish/start_c.c b/STM32F1/variants/hytiny_stm32f103t/wirish/start_c.c new file mode 100644 index 000000000..655fefb88 --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/wirish/start_c.c @@ -0,0 +1,95 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * Copyright (c) 2006, 2007 CodeSourcery Inc + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +extern void __libc_init_array(void); + +extern int main(int, char**, char**); + +extern void exit(int) __attribute__((noreturn, weak)); + +/* The linker must ensure that these are at least 4-byte aligned. */ +extern char __data_start__, __data_end__; +extern char __bss_start__, __bss_end__; + +struct rom_img_cfg { + int *img_start; +}; + +extern char _lm_rom_img_cfgp; + +void __attribute__((noreturn)) start_c(void) { + struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; + int *src = img_cfg->img_start; + int *dst = (int*)&__data_start__; + int exit_code; + + /* Initialize .data, if necessary. */ + if (src != dst) { + int *end = (int*)&__data_end__; + while (dst < end) { + *dst++ = *src++; + } + } + + /* Zero .bss. */ + dst = (int*)&__bss_start__; + while (dst < (int*)&__bss_end__) { + *dst++ = 0; + } + + /* Run initializers. */ + __libc_init_array(); + + /* Jump to main. */ + exit_code = main(0, 0, 0); + if (exit) { + exit(exit_code); + } + + /* If exit is NULL, make sure we don't return. */ + for (;;) + continue; +} diff --git a/STM32F1/variants/hytiny_stm32f103t/wirish/syscalls.c b/STM32F1/variants/hytiny_stm32f103t/wirish/syscalls.c new file mode 100644 index 000000000..d5f2d9fac --- /dev/null +++ b/STM32F1/variants/hytiny_stm32f103t/wirish/syscalls.c @@ -0,0 +1,176 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011, 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/syscalls.c + * @brief newlib stubs + * + * Low level system routines used by newlib for basic I/O and memory + * allocation. You can override most of these. + */ + +#include + +#include +#include +#include + +/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then + * assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by + * the linker */ +#ifndef CONFIG_HEAP_START +extern char _lm_heap_start; +#define CONFIG_HEAP_START ((void *)&_lm_heap_start) +#endif +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((void *)&_lm_heap_end) +#endif + +/* + * _sbrk -- Increment the program break. + * + * Get incr bytes more RAM (for use by the heap). malloc() and + * friends call this function behind the scenes. + */ +void *_sbrk(int incr) { + static void * pbreak = NULL; /* current program break */ + void * ret; + + if (pbreak == NULL) { + pbreak = CONFIG_HEAP_START; + } + + if ((CONFIG_HEAP_END - pbreak < incr) || + (pbreak - CONFIG_HEAP_START < -incr)) { + errno = ENOMEM; + return (void *)-1; + } + + ret = pbreak; + pbreak += incr; + return ret; +} + +__weak int _open(const char *path, int flags, ...) { + return 1; +} + +__weak int _close(int fd) { + return 0; +} + +__weak int _fstat(int fd, struct stat *st) { + st->st_mode = S_IFCHR; + return 0; +} + +__weak int _isatty(int fd) { + return 1; +} + +__weak int isatty(int fd) { + return 1; +} + +__weak int _lseek(int fd, off_t pos, int whence) { + return -1; +} + +__weak unsigned char getch(void) { + return 0; +} + + +__weak int _read(int fd, char *buf, size_t cnt) { + *buf = getch(); + + return 1; +} + +__weak void putch(unsigned char c) { +} + +__weak void cgets(char *s, int bufsize) { + char *p; + int c; + int i; + + for (i = 0; i < bufsize; i++) { + *(s+i) = 0; + } +// memset(s, 0, bufsize); + + p = s; + + for (p = s; p < s + bufsize-1;) { + c = getch(); + switch (c) { + case '\r' : + case '\n' : + putch('\r'); + putch('\n'); + *p = '\n'; + return; + + case '\b' : + if (p > s) { + *p-- = 0; + putch('\b'); + putch(' '); + putch('\b'); + } + break; + + default : + putch(c); + *p++ = c; + break; + } + } + return; +} + +__weak int _write(int fd, const char *buf, size_t cnt) { + int i; + + for (i = 0; i < cnt; i++) + putch(buf[i]); + + return cnt; +} + +/* Override fgets() in newlib with a version that does line editing */ +__weak char *fgets(char *s, int bufsize, void *f) { + cgets(s, bufsize); + return s; +} + +__weak void _exit(int exitcode) { + while (1) + ; +} From 16ab26608f44abe413ddbd0667b860fcf106decd Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 30 Oct 2016 21:55:26 +1100 Subject: [PATCH 005/307] Fix minor issues with Hy-Tiny STM32F103T --- STM32F1/boards.txt | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index b56272f7d..8cbd57b63 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -464,7 +464,7 @@ genericSTM32F103Z.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE ###################### HYTiny STM32F103T ######################################## -hytiny-stm32f103t.name=HYTiny STM32F103T series +hytiny-stm32f103t.name=HYTiny STM32F103TB hytiny-stm32f103t.vid.0=0x1EAF hytiny-stm32f103t.pid.0=0x0004 hytiny-stm32f103t.build.variant=hytiny_stm32f103t @@ -475,21 +475,13 @@ hytiny-stm32f103t.upload.use_1200bps_touch=false hytiny-stm32f103t.upload.file_type=bin hytiny-stm32f103t.upload.auto_reset=true -## STM32F103C8 ------------------------- -hytiny-stm32f103t.menu.device_variant.STM32F103C8=STM32F103C8 (20k RAM. 64k Flash) -hytiny-stm32f103t.menu.device_variant.STM32F103C8.build.cpu_flags=-DMCU_STM32F103C8 -hytiny-stm32f103t.menu.device_variant.STM32F103C8.build.ldscript=ld/jtag_c8.ld -hytiny-stm32f103t.menu.device_variant.STM32F103C8.upload.maximum_size=65536 -hytiny-stm32f103t.menu.device_variant.STM32F103C8.upload.ram.maximum_size=20480 -hytiny-stm32f103t.menu.device_variant.STM32F103C8.upload.flash.maximum_size=65536 -## STM32F103CB ------------------------- -hytiny-stm32f103t.menu.device_variant.STM32F103CB=STM32F103CB (20k RAM. 128k Flash) -hytiny-stm32f103t.menu.device_variant.STM32F103CB.build.cpu_flags=-DMCU_STM32F103CB -hytiny-stm32f103t.menu.device_variant.STM32F103CB.build.ldscript=ld/jtag.ld -hytiny-stm32f103t.menu.device_variant.STM32F103CB.upload.maximum_size=131072 -hytiny-stm32f103t.menu.device_variant.STM32F103CB.upload.ram.maximum_size=20480 -hytiny-stm32f103t.menu.device_variant.STM32F103CB.upload.flash.maximum_size=131072 +hytiny-stm32f103t.build.cpu_flags=-DMCU_STM32F103CB +hytiny-stm32f103t.build.ldscript=ld/jtag.ld +hytiny-stm32f103t.upload.maximum_size=131072 +hytiny-stm32f103t.upload.ram.maximum_size=20480 +hytiny-stm32f103t.upload.flash.maximum_size=131072 + #---------------------------- UPLOAD METHODS --------------------------- From 4bc4b1d6bd42816c935053f043b8697f5e393434 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 31 Oct 2016 22:12:04 +0100 Subject: [PATCH 006/307] remove unused functions + adapt passed parameter - remove unused functions form usb_reg_map - change passed buffer type to uint8 * --- STM32F1/cores/maple/libmaple/usb/stm32f1/usb_reg_map.c | 8 ++++---- STM32F1/cores/maple/usb_serial.h | 2 +- STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_reg_map.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_reg_map.c index ea60cb3c2..3f5446aa6 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_reg_map.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_reg_map.c @@ -29,7 +29,7 @@ /* TODO these could use some improvement; they're fairly * straightforward ports of the analogous ST code. The PMA blit * routines in particular are obvious targets for performance - * measurement and tuning. */ + * measurement and tuning. void usb_copy_to_pma(const uint8 *buf, uint16 len, uint16 pma_offset) { uint16 *dst = (uint16*)usb_pma_ptr(pma_offset); @@ -57,7 +57,7 @@ void usb_copy_from_pma(uint8 *buf, uint16 len, uint16 pma_offset) { *dst = *src & 0xFF; } } - + */ static void usb_set_ep_rx_count_common(uint32 *rxc, uint16 count) { uint16 nblocks; if (count > 62) { @@ -76,12 +76,12 @@ static void usb_set_ep_rx_count_common(uint32 *rxc, uint16 count) { *rxc = nblocks << 10; } } - +/* void usb_set_ep_rx_buf0_count(uint8 ep, uint16 count) { uint32 *rxc = usb_ep_rx_buf0_count_ptr(ep); usb_set_ep_rx_count_common(rxc, count); } - +*/ void usb_set_ep_rx_count(uint8 ep, uint16 count) { uint32 *rxc = usb_ep_rx_count_ptr(ep); usb_set_ep_rx_count_common(rxc, count); diff --git a/STM32F1/cores/maple/usb_serial.h b/STM32F1/cores/maple/usb_serial.h index e50a16c27..96bbefc25 100644 --- a/STM32F1/cores/maple/usb_serial.h +++ b/STM32F1/cores/maple/usb_serial.h @@ -65,7 +65,7 @@ class USBSerial : public Stream { size_t write(uint8); size_t write(const char *str); - size_t write(const void*, uint32); + size_t write(const uint8*, uint32); uint8 getRTS(); uint8 getDTR(); diff --git a/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h b/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h index 9e9214cf1..d0423fc11 100644 --- a/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h +++ b/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h @@ -345,10 +345,10 @@ static inline void usb_clear_status_out(uint8 ep) { /* * PMA conveniences */ - +/* void usb_copy_to_pma(const uint8 *buf, uint16 len, uint16 pma_offset); void usb_copy_from_pma(uint8 *buf, uint16 len, uint16 pma_offset); - +*/ static inline uint32 * usb_pma_ptr(uint32 offset) { return (uint32*)(USB_PMA_BASE + 2 * offset); } @@ -567,7 +567,7 @@ static inline uint16 usb_get_ep_rx_buf0_count(uint8 ep) { return usb_get_ep_tx_count(ep); } -void usb_set_ep_rx_buf0_count(uint8 ep, uint16 count); +//void usb_set_ep_rx_buf0_count(uint8 ep, uint16 count); static inline uint32* usb_ep_rx_buf1_count_ptr(uint8 ep) { return usb_ep_rx_count_ptr(ep); From 5db25232840ec8f0922a79e3a1a19a86f5397207 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 31 Oct 2016 22:29:40 +0100 Subject: [PATCH 007/307] improve SPI low level functions - optimize code and run-time --- STM32F1/cores/maple/libmaple/spi.c | 6 +- STM32F1/libraries/SPI/src/SPI.cpp | 178 ++++++++++------------------- STM32F1/libraries/SPI/src/SPI.h | 25 ++-- 3 files changed, 74 insertions(+), 135 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/spi.c b/STM32F1/cores/maple/libmaple/spi.c index 1020c5baf..64f06d301 100644 --- a/STM32F1/cores/maple/libmaple/spi.c +++ b/STM32F1/cores/maple/libmaple/spi.c @@ -84,7 +84,7 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags) { } /** - * @brief Nonblocking SPI transmit. + * @brief Blocking SPI transmit. * @param dev SPI port to use for transmission * @param buf Buffer to transmit. The sizeof buf's elements are * inferred from dev's data frame format (i.e., are @@ -95,7 +95,8 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags) { uint32 spi_tx(spi_dev *dev, const void *buf, uint32 len) { uint32 txed = 0; uint8 byte_frame = spi_dff(dev) == SPI_DFF_8_BIT; - while (spi_is_tx_empty(dev) && (txed < len)) { + while ( txed < len ) { + while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty if (byte_frame) { dev->regs->DR = ((const uint8*)buf)[txed++]; } else { @@ -162,5 +163,6 @@ static void spi_reconfigure(spi_dev *dev, uint32 cr1_config) { spi_irq_disable(dev, SPI_INTERRUPTS_ALL); if ( (dev->regs->CR1&MASK)!=(cr1_config&MASK) ) spi_peripheral_disable(dev); dev->regs->CR1 = cr1_config; + //spi_rx_dma_enable(dev); spi_peripheral_enable(dev); } diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 4eeec3811..08327912f 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -41,6 +41,8 @@ #include "boards.h" //#include "HardwareSerial.h" +/** Time in ms for DMA receive timeout */ +#define DMA_TIMEOUT 100 #if CYCLES_PER_MICROSECOND != 72 /* TODO [0.2.0?] something smarter than this */ @@ -304,138 +306,110 @@ void SPIClass::endTransaction(void) * I/O */ -uint8 SPIClass::read(void) { - uint8 buf[1]; - this->read(buf, 1); - return buf[0]; +uint8 SPIClass::read(void) +{ + while ( spi_is_rx_nonempty(_currentSetting->spi_d)==0 ) ; + return (uint8)spi_rx_reg(_currentSetting->spi_d); } -void SPIClass::read(uint8 *buf, uint32 len) { +void SPIClass::read(uint8 *buf, uint32 len) +{ + spi_reg_map * regs = _currentSetting->spi_d->regs; + uint8 b = (regs->DR); // clear the RX buffer in case a byte is waiting on it. uint32 rxed = 0; - while (rxed < len) { - while (!spi_is_rx_nonempty(_currentSetting->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(_currentSetting->spi_d); + // start sequence + while ( rxed < len) { + regs->DR = 0x00FF; // " write the data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while ( (regs->SR & SPI_SR_RXNE)==0 ) ; // wait till data is available in the Rx register + buf[rxed++] = (uint8)(regs->DR); // read and store the received byte } } -void SPIClass::write(uint16 data) { - // this->write(&data, 1); - +void SPIClass::write(uint16 data) +{ /* Added for 16bit data Victor Perez. Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) - * The original method, of calling write(*data, length) . + * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, + * by taking the Tx code from transfer(byte) * This almost doubles the speed of this function. */ - spi_tx_reg(_currentSetting->spi_d, data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } -//void SPIClass::write(uint8 byte) { - // this->write(&byte, 1); - - /* Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) - * The original method, of calling write(*data, length) . - * This almost doubles the speed of this function. - */ - -// spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." -// while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." -// while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." -//} - -void SPIClass::write(const uint8 *data, uint32 length) { - uint32 txed = 0; - while (txed < length) { - txed += spi_tx(_currentSetting->spi_d, data + txed, length - txed); - } - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "4. After writing the last data item into the SPI_DR register, wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... then wait until BSY=0, this indicates that the transmission of the last data is complete." +void SPIClass::write(const void *data, uint32 length) +{ + spi_tx(_currentSetting->spi_d, data, length); // data can be array of bytes or words + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." // taken from SdSpiSTM32F1.cpp - Victor's lib, and adapted to support device selection - if (spi_is_rx_nonempty(_currentSetting->spi_d)) { - uint8_t b = spi_rx_reg(_currentSetting->spi_d); - } + uint16 b = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! } uint16_t SPIClass::transfer16(uint16_t wr_data) const { spi_tx_reg(_currentSetting->spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..." - uint16_t rd_data = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." -// while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." -// while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return rd_data; + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint16)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." } uint8 SPIClass::transfer(uint8 byte) const { spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..." - uint8 b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return b; + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint8)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." } + /* Roger Clark and Victor Perez, 2015 * Performs a DMA SPI transfer with at least a receive buffer. -* If a TX buffer is not provided, FF is sent over and over for the lenght of the transfer. -* On exit TX buffer is not modified, and RX buffer cotains the received data. +* If a TX buffer is not provided, FF is sent over and over for the length of the transfer. +* On exit TX buffer is not modified, and RX buffer contains the received data. * Still in progress. */ -uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length) { +uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length) +{ if (length == 0) return 0; uint8 b = 0; - if (spi_is_rx_nonempty(_currentSetting->spi_d) == 1) b = spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. + spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. // dma1_ch3_Active=true; dma_init(_currentSetting->spiDmaDev); // dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - + // RX spi_rx_dma_enable(_currentSetting->spi_d); - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, - receiveBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_8BIT) ? DMA_SIZE_8BITS : DMA_SIZE_16BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); - + // TX + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); spi_tx_dma_enable(_currentSetting->spi_d); - if (!transmitBuf) { - static uint8_t ff = 0XFF; - transmitBuf = &ff; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, (DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit FF repeatedly - } - else { - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit buffer DMA + if ( transmitBuf==0 ) { + static uint8_t ff = 0XFF; + transmitBuf = &ff; + flags ^= DMA_MINC_MODE; // remove increment mode } + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit -// while (dma1_ch3_Active); -// if (receiveBuf) { uint32_t m = millis(); while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0) {//Avoid interrupts and just loop waiting for the flag to be set. - if ((millis() - m) > 100) { -// dma1_ch3_Active = 0; - b = 2; - break; - } + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); -// } while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); spi_rx_dma_disable(_currentSetting->spi_d); // And disable generation of DMA request from the SPI port so other peripherals can use the channels spi_tx_dma_disable(_currentSetting->spi_d); - if (spi_is_rx_nonempty(_currentSetting->spi_d) != 0){; // "4. Wait until RXNE=1 ..." - uint8 x = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." - } + uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! return b; } @@ -443,10 +417,12 @@ uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length * Performs a DMA SPI send using a TX buffer. * On exit TX buffer is not modified. * Still in progress. +* 2016 - stevstrong - reworked to automatically detect bit size from SPI setting */ -uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { +uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length) +{ if (length == 0) return 0; - uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); uint8 b = 0; // dma1_ch3_Active=true; dma_init(_currentSetting->spiDmaDev); @@ -454,55 +430,27 @@ uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { // TX spi_tx_dma_enable(_currentSetting->spi_d); - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, flags);// Transmit buffer DMA + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_8BIT) ? DMA_SIZE_8BITS : DMA_SIZE_16BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - -// while (dma1_ch3_Active); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0); //Avoid interrupts and just loop waiting for the flag to be set. - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - spi_tx_dma_disable(_currentSetting->spi_d); - if (spi_is_rx_nonempty(_currentSetting->spi_d) != 0){; // "4. Wait until RXNE=1 ..." - uint8 x = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." - } - return b; -} - -uint8 SPIClass::dmaSend(uint16 *transmitBuf, uint16 length, bool minc) { - if (length == 0) return 0; - uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - uint8 b; - dma1_ch3_Active=true; - dma_init(_currentSetting->spiDmaDev); -// dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - - // TX - spi_tx_dma_enable(_currentSetting->spi_d); - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_16BITS, - transmitBuf, DMA_SIZE_16BITS, flags);// Transmit buffer DMA - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - // while (dma1_ch3_Active); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0); //Avoid interrupts and just loop waiting for the flag to be set. + uint32_t m = millis(); + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); spi_tx_dma_disable(_currentSetting->spi_d); - if (spi_is_rx_nonempty(_currentSetting->spi_d) != 0){; // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." - } + uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! return b; } - void SPIClass::attachInterrupt(void) { // Should be enableInterrupt() } diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index e949051e5..0f8497ae1 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -249,7 +249,7 @@ class SPIClass { * @param buffer Bytes to transmit. * @param length Number of bytes in buffer to transmit. */ - void write(const uint8 *buffer, uint32 length); + void write(const void * buffer, uint32 length); /** * @brief Transmit a byte, then return the next unread byte. @@ -264,6 +264,7 @@ class SPIClass { /** * @brief Sets up a DMA Transfer for "length" bytes. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * * This function transmits and receives to buffers. * @@ -271,30 +272,18 @@ class SPIClass { * @param receiveBuf buffer Bytes to save received data. * @param length Number of bytes in buffer to transmit. */ - uint8 dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length); + uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); /** - * @brief Sets up a DMA Transmit for bytes. + * @brief Sets up a DMA Transmit for SPI 8 or 16 bit transfer mode. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * - * This function transmits and does not care about the RX fifo. - * - * @param transmitBuf buffer Bytes to transmit, - * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode, clear to use Circular mode. - */ - uint8 dmaSend(uint8 *transmitBuf, uint16 length, bool minc = 1); - - /** - * @brief Sets up a DMA Transmit for half words. - * SPI PERFIPHERAL MUST BE SET TO 16 BIT MODE BEFORE - * - * This function transmits and does not care about the RX fifo. + * This function only transmits and does not care about the RX fifo. * * @param data buffer half words to transmit, * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode (default if blank), clear to use Circular mode. */ - uint8 dmaSend(uint16 *transmitBuf, uint16 length, bool minc = 1); + uint8 dmaSend(void * transmitBuf, uint16 length); /* * Pin accessors From 2cdbbc83390b27570c9040fc92bda6e63947f160 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 10 Nov 2016 11:33:37 +1100 Subject: [PATCH 008/307] Fix issue caused by ADC PR changes that, prevented the GD32F103 variant from building --- STM32F1/variants/generic_gd32f103c/wirish/boards.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/variants/generic_gd32f103c/wirish/boards.cpp b/STM32F1/variants/generic_gd32f103c/wirish/boards.cpp index 57d8ca006..fcb85b2ab 100644 --- a/STM32F1/variants/generic_gd32f103c/wirish/boards.cpp +++ b/STM32F1/variants/generic_gd32f103c/wirish/boards.cpp @@ -179,7 +179,7 @@ nvic_init((uint32)VECT_TAB_ADDR, 0); */ } -static void adc_default_config(const adc_dev *dev) { +static void adc_default_config(adc_dev *dev) { adc_enable_single_swstart(dev); adc_set_sample_rate(dev, wirish::priv::w_adc_smp); } From 8345e6f075b00defb134203cddb5612905fd7ecf Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 10 Nov 2016 20:06:23 +1100 Subject: [PATCH 009/307] Copied individual files from @stevestong master --- .../maple/libmaple/usb/stm32f1/usb_cdcacm.c | 227 +++++++++++------- .../maple/libmaple/usb/stm32f1/usb_reg_map.c | 8 +- STM32F1/cores/maple/usb_serial.cpp | 41 +--- STM32F1/cores/maple/usb_serial.h | 4 +- .../system/libmaple/usb/stm32f1/usb_reg_map.h | 10 +- 5 files changed, 159 insertions(+), 131 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c index 448c05dfc..7a5a772af 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c @@ -261,18 +261,28 @@ static ONE_DESCRIPTOR String_Descriptor[N_STRING_DESCRIPTORS] = { /* I/O state */ -#define CDC_SERIAL_BUFFER_SIZE 512 +#define CDC_SERIAL_RX_BUFFER_SIZE 256 // must be power of 2 +#define CDC_SERIAL_RX_BUFFER_SIZE_MASK (CDC_SERIAL_RX_BUFFER_SIZE-1) /* Received data */ -static volatile uint8 vcomBufferRx[CDC_SERIAL_BUFFER_SIZE]; -/* Read index into vcomBufferRx */ -static volatile uint32 rx_offset = 0; -/* Number of bytes left to transmit */ -static volatile uint32 n_unsent_bytes = 0; -/* Are we currently sending an IN packet? */ -static volatile uint8 transmitting = 0; -/* Number of unread bytes */ -static volatile uint32 n_unread_bytes = 0; +static volatile uint8 vcomBufferRx[CDC_SERIAL_RX_BUFFER_SIZE]; +/* Write index to vcomBufferRx */ +static volatile uint32 rx_head; +/* Read index from vcomBufferRx */ +static volatile uint32 rx_tail; + +#define CDC_SERIAL_TX_BUFFER_SIZE 256 // must be power of 2 +#define CDC_SERIAL_TX_BUFFER_SIZE_MASK (CDC_SERIAL_TX_BUFFER_SIZE-1) +// Tx data +static volatile uint8 vcomBufferTx[CDC_SERIAL_TX_BUFFER_SIZE]; +// Write index to vcomBufferTx +static volatile uint32 tx_head; +// Read index from vcomBufferTx +static volatile uint32 tx_tail; +// Are we currently sending an IN packet? +static volatile int8 transmitting; + + /* Other state (line coding, DTR/RTS) */ @@ -393,30 +403,34 @@ void usb_cdcacm_putc(char ch) { ; } -/* This function is blocking. +/* This function is non-blocking. * - * It copies data from a usercode buffer into the USB peripheral TX + * It copies data from a user buffer into the USB peripheral TX * buffer, and returns the number of bytes copied. */ -uint32 usb_cdcacm_tx(const uint8* buf, uint32 len) { - /* Last transmission hasn't finished, so abort. */ - while ( usb_cdcacm_is_transmitting()>0 ) ; // wait for end of transmission +uint32 usb_cdcacm_tx(const uint8* buf, uint32 len) +{ + if (len==0) return 0; // no data to send - /* We can only put USB_CDCACM_TX_EPSIZE bytes in the buffer. */ - if (len > USB_CDCACM_TX_EPSIZE) { - len = USB_CDCACM_TX_EPSIZE; - } + uint32 head = tx_head; // load volatile variable + uint32 tx_unsent = (head - tx_tail) & CDC_SERIAL_TX_BUFFER_SIZE_MASK; - /* Queue bytes for sending. */ - if (len) { - usb_copy_to_pma(buf, len, USB_CDCACM_TX_ADDR); + // We can only put bytes in the buffer if there is place + if (len > (CDC_SERIAL_TX_BUFFER_SIZE-tx_unsent-1) ) { + len = (CDC_SERIAL_TX_BUFFER_SIZE-tx_unsent-1); } - // We still need to wait for the interrupt, even if we're sending - // zero bytes. (Sending zero-size packets is useful for flushing - // host-side buffers.) - usb_set_ep_tx_count(USB_CDCACM_TX_ENDP, len); - n_unsent_bytes = len; - transmitting = 1; - usb_set_ep_tx_stat(USB_CDCACM_TX_ENDP, USB_EP_STAT_TX_VALID); + if (len==0) return 0; // buffer full + + uint16 i; + // copy data from user buffer to USB Tx buffer + for (i=0; i0 ? transmitting : 0); } uint16 usb_cdcacm_get_pending(void) { - return n_unsent_bytes; + return (tx_head - tx_tail) & CDC_SERIAL_TX_BUFFER_SIZE_MASK; } -/* Nonblocking byte receive. +/* Non-blocking byte receive. * * Copies up to len bytes from our private data buffer (*NOT* the PMA) * into buf and deq's the FIFO. */ -uint32 usb_cdcacm_rx(uint8* buf, uint32 len) { +uint32 usb_cdcacm_rx(uint8* buf, uint32 len) +{ /* Copy bytes to buffer. */ uint32 n_copied = usb_cdcacm_peek(buf, len); /* Mark bytes as read. */ - n_unread_bytes -= n_copied; - rx_offset = (rx_offset + n_copied) % CDC_SERIAL_BUFFER_SIZE; + uint16 tail = rx_tail; // load volatile variable + tail = (tail + n_copied) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; + rx_tail = tail; // store volatile variable - /* If all bytes have been read, re-enable the RX endpoint, which - * was set to NAK when the current batch of bytes was received. */ - if (n_unread_bytes == 0) { - usb_set_ep_rx_count(USB_CDCACM_RX_ENDP, USB_CDCACM_RX_EPSIZE); + uint32 rx_unread = (rx_head - tail) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; + // If buffer was emptied to a pre-set value, re-enable the RX endpoint + if ( rx_unread <= 64 ) { // experimental value, gives the best performance usb_set_ep_rx_stat(USB_CDCACM_RX_ENDP, USB_EP_STAT_RX_VALID); - } - + } return n_copied; } -/* Nonblocking byte lookahead. +/* Non-blocking byte lookahead. * * Looks at unread bytes without marking them as read. */ -uint32 usb_cdcacm_peek(uint8* buf, uint32 len) { +uint32 usb_cdcacm_peek(uint8* buf, uint32 len) +{ int i; - uint32 head = rx_offset; + uint32 tail = rx_tail; + uint32 rx_unread = (rx_head-tail) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; - if (len > n_unread_bytes) { - len = n_unread_bytes; + if (len > rx_unread) { + len = rx_unread; } for (i = 0; i < len; i++) { - buf[i] = vcomBufferRx[head]; - head = (head + 1) % CDC_SERIAL_BUFFER_SIZE; + buf[i] = vcomBufferRx[tail]; + tail = (tail + 1) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; } return len; } -uint32 usb_cdcacm_peek_ex(uint8* buf, uint32 offset, uint32 len) { +uint32 usb_cdcacm_peek_ex(uint8* buf, uint32 offset, uint32 len) +{ int i; - uint32 head = (rx_offset + offset) % CDC_SERIAL_BUFFER_SIZE; + uint32 tail = (rx_tail + offset) & CDC_SERIAL_RX_BUFFER_SIZE_MASK ; + uint32 rx_unread = (rx_head-tail) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; - if (len + offset > n_unread_bytes) { - len = n_unread_bytes - offset; + if (len + offset > rx_unread) { + len = rx_unread - offset; } for (i = 0; i < len; i++) { - buf[i] = vcomBufferRx[head]; - head = (head + 1) % CDC_SERIAL_BUFFER_SIZE; + buf[i] = vcomBufferRx[tail]; + tail = (tail + 1) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; } return len; @@ -495,12 +513,12 @@ uint32 usb_cdcacm_peek_ex(uint8* buf, uint32 offset, uint32 len) { /* Roger Clark. Added. for Arduino 1.0 API support of Serial.peek() */ int usb_cdcacm_peek_char() { - if (n_unread_bytes == 0) + if (usb_cdcacm_data_available() == 0) { return -1; } - return vcomBufferRx[rx_offset]; + return vcomBufferRx[rx_tail]; } uint8 usb_cdcacm_get_dtr() { @@ -534,41 +552,75 @@ int usb_cdcacm_get_n_data_bits(void) { return line_coding.bDataBits; } - /* * Callbacks */ - -static void vcomDataTxCb(void) { - n_unsent_bytes = 0; - transmitting = 0; +static void vcomDataTxCb(void) +{ + uint32 tail = tx_tail; // load volatile variable + uint32 tx_unsent = (tx_head - tail) & CDC_SERIAL_TX_BUFFER_SIZE_MASK; + if (tx_unsent==0) { + if ( (--transmitting)==0) goto flush; // no more data to send + return; // it was already flushed, keep Tx endpoint disabled + } + transmitting = 1; + // We can only send up to USB_CDCACM_TX_EPSIZE bytes in the endpoint. + if (tx_unsent > USB_CDCACM_TX_EPSIZE) { + tx_unsent = USB_CDCACM_TX_EPSIZE; + } + // copy the bytes from USB Tx buffer to PMA buffer + uint32 *dst = usb_pma_ptr(USB_CDCACM_TX_ADDR); + uint16 tmp = 0; + uint16 val; + int i; + for (i = 0; i < tx_unsent; i++) { + val = vcomBufferTx[tail]; + tail = (tail + 1) & CDC_SERIAL_TX_BUFFER_SIZE_MASK; + if (i&1) { + *dst++ = tmp | (val<<8); + } else { + tmp = val; + } + } + if ( tx_unsent&1 ) { + *dst = tmp; + } + tx_tail = tail; // store volatile variable +flush: + // enable Tx endpoint + usb_set_ep_tx_count(USB_CDCACM_TX_ENDP, tx_unsent); + usb_set_ep_tx_stat(USB_CDCACM_TX_ENDP, USB_EP_STAT_TX_VALID); } -static void vcomDataRxCb(void) { - uint32 ep_rx_size; - uint32 tail = (rx_offset + n_unread_bytes) % CDC_SERIAL_BUFFER_SIZE; - uint8 ep_rx_data[USB_CDCACM_RX_EPSIZE]; - uint32 i; - - usb_set_ep_rx_stat(USB_CDCACM_RX_ENDP, USB_EP_STAT_RX_NAK); - ep_rx_size = usb_get_ep_rx_count(USB_CDCACM_RX_ENDP); - /* This copy won't overwrite unread bytes, since we've set the RX - * endpoint to NAK, and will only set it to VALID when all bytes - * have been read. */ - usb_copy_from_pma((uint8*)ep_rx_data, ep_rx_size, - USB_CDCACM_RX_ADDR); +static void vcomDataRxCb(void) +{ + uint32 head = rx_head; // load volatile variable + + uint32 ep_rx_size = usb_get_ep_rx_count(USB_CDCACM_RX_ENDP); + // This copy won't overwrite unread bytes as long as there is + // enough room in the USB Rx buffer for next packet + uint32 *src = usb_pma_ptr(USB_CDCACM_RX_ADDR); + uint16 tmp = 0; + uint8 val; + uint32 i; for (i = 0; i < ep_rx_size; i++) { - vcomBufferRx[tail] = ep_rx_data[i]; - tail = (tail + 1) % CDC_SERIAL_BUFFER_SIZE; + if (i&1) { + val = tmp>>8; + } else { + tmp = *src++; + val = tmp&0xFF; + } + vcomBufferRx[head] = val; + head = (head + 1) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; } + rx_head = head; // store volatile variable - n_unread_bytes += ep_rx_size; - - if ( n_unread_bytes == 0 ) { - usb_set_ep_rx_count(USB_CDCACM_RX_ENDP, USB_CDCACM_RX_EPSIZE); - usb_set_ep_rx_stat(USB_CDCACM_RX_ENDP, USB_EP_STAT_RX_VALID); - } + uint32 rx_unread = (head - rx_tail) & CDC_SERIAL_RX_BUFFER_SIZE_MASK; + // only enable further Rx if there is enough room to receive one more packet + if ( rx_unread < (CDC_SERIAL_RX_BUFFER_SIZE-USB_CDCACM_RX_EPSIZE) ) { + usb_set_ep_rx_stat(USB_CDCACM_RX_ENDP, USB_EP_STAT_RX_VALID); + } if (rx_hook) { rx_hook(USB_CDCACM_HOOK_RX, 0); @@ -646,10 +698,11 @@ static void usbReset(void) { SetDeviceAddress(0); /* Reset the RX/TX state */ - n_unread_bytes = 0; - n_unsent_bytes = 0; - rx_offset = 0; - transmitting = 0; + rx_head = 0; + rx_tail = 0; + tx_head = 0; + tx_tail = 0; + transmitting = -1; } static RESULT usbDataSetup(uint8 request) { diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_reg_map.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_reg_map.c index ea60cb3c2..3f5446aa6 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_reg_map.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_reg_map.c @@ -29,7 +29,7 @@ /* TODO these could use some improvement; they're fairly * straightforward ports of the analogous ST code. The PMA blit * routines in particular are obvious targets for performance - * measurement and tuning. */ + * measurement and tuning. void usb_copy_to_pma(const uint8 *buf, uint16 len, uint16 pma_offset) { uint16 *dst = (uint16*)usb_pma_ptr(pma_offset); @@ -57,7 +57,7 @@ void usb_copy_from_pma(uint8 *buf, uint16 len, uint16 pma_offset) { *dst = *src & 0xFF; } } - + */ static void usb_set_ep_rx_count_common(uint32 *rxc, uint16 count) { uint16 nblocks; if (count > 62) { @@ -76,12 +76,12 @@ static void usb_set_ep_rx_count_common(uint32 *rxc, uint16 count) { *rxc = nblocks << 10; } } - +/* void usb_set_ep_rx_buf0_count(uint8 ep, uint16 count) { uint32 *rxc = usb_ep_rx_buf0_count_ptr(ep); usb_set_ep_rx_count_common(rxc, count); } - +*/ void usb_set_ep_rx_count(uint8 ep, uint16 count) { uint32 *rxc = usb_ep_rx_count_ptr(ep); usb_set_ep_rx_count_common(rxc, count); diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index ab8816bce..5eaf70efb 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -100,44 +100,23 @@ size_t n = 0; size_t USBSerial::write(const char *str) { size_t n = 0; - this->write(str, strlen(str)); + this->write((const uint8*)str, strlen(str)); return n; } -size_t USBSerial::write(const void *buf, uint32 len) { +size_t USBSerial::write(const uint8 *buf, uint32 len) +{ size_t n = 0; if (!this->isConnected() || !buf) { return 0; } uint32 txed = 0; - uint32 old_txed = 0; - uint32 start = millis(); - - uint32 sent = 0; - - while (txed < len && (millis() - start < USB_TIMEOUT)) { - sent = usb_cdcacm_tx((const uint8*)buf + txed, len - txed); - txed += sent; - if (old_txed != txed) { - start = millis(); - } - old_txed = txed; + while (txed < len) { + txed += usb_cdcacm_tx((const uint8*)buf + txed, len - txed); } - -#if 0 -// this code leads to a serious performance drop and appears to be -// unnecessary - everything seems to work fine without, -jcw, 2015-11-05 -// see http://stm32duino.com/posting.php?mode=quote&f=3&p=7746 - if (sent == USB_CDCACM_TX_EPSIZE) { - while (usb_cdcacm_is_transmitting() != 0) { - } - /* flush out to avoid having the pc wait for more data */ - usb_cdcacm_tx(NULL, 0); - } -#endif - return n; + return n; } int USBSerial::available(void) { @@ -168,14 +147,10 @@ void USBSerial::flush(void) return; } -uint32 USBSerial::read(void *buf, uint32 len) { - if (!buf) { - return 0; - } - +uint32 USBSerial::read(uint8 * buf, uint32 len) { uint32 rxed = 0; while (rxed < len) { - rxed += usb_cdcacm_rx((uint8*)buf + rxed, len - rxed); + rxed += usb_cdcacm_rx(buf + rxed, len - rxed); } return rxed; diff --git a/STM32F1/cores/maple/usb_serial.h b/STM32F1/cores/maple/usb_serial.h index 740ab0fd9..96bbefc25 100644 --- a/STM32F1/cores/maple/usb_serial.h +++ b/STM32F1/cores/maple/usb_serial.h @@ -53,7 +53,7 @@ class USBSerial : public Stream { virtual int available(void);// Changed to virtual - uint32 read(void *buf, uint32 len); + uint32 read(uint8 * buf, uint32 len); // uint8 read(void); // Roger Clark. added functions to support Arduino 1.0 API @@ -65,7 +65,7 @@ class USBSerial : public Stream { size_t write(uint8); size_t write(const char *str); - size_t write(const void*, uint32); + size_t write(const uint8*, uint32); uint8 getRTS(); uint8 getDTR(); diff --git a/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h b/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h index 6683264f8..d0423fc11 100644 --- a/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h +++ b/STM32F1/system/libmaple/usb/stm32f1/usb_reg_map.h @@ -345,12 +345,12 @@ static inline void usb_clear_status_out(uint8 ep) { /* * PMA conveniences */ - +/* void usb_copy_to_pma(const uint8 *buf, uint16 len, uint16 pma_offset); void usb_copy_from_pma(uint8 *buf, uint16 len, uint16 pma_offset); - -static inline void* usb_pma_ptr(uint32 offset) { - return (void*)(USB_PMA_BASE + 2 * offset); +*/ +static inline uint32 * usb_pma_ptr(uint32 offset) { + return (uint32*)(USB_PMA_BASE + 2 * offset); } /* @@ -567,7 +567,7 @@ static inline uint16 usb_get_ep_rx_buf0_count(uint8 ep) { return usb_get_ep_tx_count(ep); } -void usb_set_ep_rx_buf0_count(uint8 ep, uint16 count); +//void usb_set_ep_rx_buf0_count(uint8 ep, uint16 count); static inline uint32* usb_ep_rx_buf1_count_ptr(uint8 ep) { return usb_ep_rx_count_ptr(ep); From 3469ef291baad000b3c64564623d7a09e1312356 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 11 Nov 2016 22:04:16 +0100 Subject: [PATCH 010/307] Revert "improve SPI low level functions" This reverts commit 5db25232840ec8f0922a79e3a1a19a86f5397207. --- STM32F1/cores/maple/libmaple/spi.c | 6 +- STM32F1/libraries/SPI/src/SPI.cpp | 178 +++++++++++++++++++---------- STM32F1/libraries/SPI/src/SPI.h | 25 ++-- 3 files changed, 135 insertions(+), 74 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/spi.c b/STM32F1/cores/maple/libmaple/spi.c index 64f06d301..1020c5baf 100644 --- a/STM32F1/cores/maple/libmaple/spi.c +++ b/STM32F1/cores/maple/libmaple/spi.c @@ -84,7 +84,7 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags) { } /** - * @brief Blocking SPI transmit. + * @brief Nonblocking SPI transmit. * @param dev SPI port to use for transmission * @param buf Buffer to transmit. The sizeof buf's elements are * inferred from dev's data frame format (i.e., are @@ -95,8 +95,7 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags) { uint32 spi_tx(spi_dev *dev, const void *buf, uint32 len) { uint32 txed = 0; uint8 byte_frame = spi_dff(dev) == SPI_DFF_8_BIT; - while ( txed < len ) { - while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty + while (spi_is_tx_empty(dev) && (txed < len)) { if (byte_frame) { dev->regs->DR = ((const uint8*)buf)[txed++]; } else { @@ -163,6 +162,5 @@ static void spi_reconfigure(spi_dev *dev, uint32 cr1_config) { spi_irq_disable(dev, SPI_INTERRUPTS_ALL); if ( (dev->regs->CR1&MASK)!=(cr1_config&MASK) ) spi_peripheral_disable(dev); dev->regs->CR1 = cr1_config; - //spi_rx_dma_enable(dev); spi_peripheral_enable(dev); } diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 08327912f..4eeec3811 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -41,8 +41,6 @@ #include "boards.h" //#include "HardwareSerial.h" -/** Time in ms for DMA receive timeout */ -#define DMA_TIMEOUT 100 #if CYCLES_PER_MICROSECOND != 72 /* TODO [0.2.0?] something smarter than this */ @@ -306,110 +304,138 @@ void SPIClass::endTransaction(void) * I/O */ -uint8 SPIClass::read(void) -{ - while ( spi_is_rx_nonempty(_currentSetting->spi_d)==0 ) ; - return (uint8)spi_rx_reg(_currentSetting->spi_d); +uint8 SPIClass::read(void) { + uint8 buf[1]; + this->read(buf, 1); + return buf[0]; } -void SPIClass::read(uint8 *buf, uint32 len) -{ - spi_reg_map * regs = _currentSetting->spi_d->regs; - uint8 b = (regs->DR); // clear the RX buffer in case a byte is waiting on it. +void SPIClass::read(uint8 *buf, uint32 len) { uint32 rxed = 0; - // start sequence - while ( rxed < len) { - regs->DR = 0x00FF; // " write the data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while ( (regs->SR & SPI_SR_RXNE)==0 ) ; // wait till data is available in the Rx register - buf[rxed++] = (uint8)(regs->DR); // read and store the received byte + while (rxed < len) { + while (!spi_is_rx_nonempty(_currentSetting->spi_d)) + ; + buf[rxed++] = (uint8)spi_rx_reg(_currentSetting->spi_d); } } -void SPIClass::write(uint16 data) -{ +void SPIClass::write(uint16 data) { + // this->write(&data, 1); + /* Added for 16bit data Victor Perez. Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, - * by taking the Tx code from transfer(byte) + * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) + * The original method, of calling write(*data, length) . * This almost doubles the speed of this function. */ + spi_tx_reg(_currentSetting->spi_d, data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } -void SPIClass::write(const void *data, uint32 length) -{ - spi_tx(_currentSetting->spi_d, data, length); // data can be array of bytes or words - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." +//void SPIClass::write(uint8 byte) { + // this->write(&byte, 1); + + /* Roger Clark + * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) + * The original method, of calling write(*data, length) . + * This almost doubles the speed of this function. + */ + +// spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." +// while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." +// while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." +//} + +void SPIClass::write(const uint8 *data, uint32 length) { + uint32 txed = 0; + while (txed < length) { + txed += spi_tx(_currentSetting->spi_d, data + txed, length - txed); + } + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "4. After writing the last data item into the SPI_DR register, wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... then wait until BSY=0, this indicates that the transmission of the last data is complete." // taken from SdSpiSTM32F1.cpp - Victor's lib, and adapted to support device selection - uint16 b = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! + if (spi_is_rx_nonempty(_currentSetting->spi_d)) { + uint8_t b = spi_rx_reg(_currentSetting->spi_d); + } } uint16_t SPIClass::transfer16(uint16_t wr_data) const { spi_tx_reg(_currentSetting->spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint16)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..." + uint16_t rd_data = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." +// while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." +// while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return rd_data; } uint8 SPIClass::transfer(uint8 byte) const { spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint8)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..." + uint8 b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return b; } - /* Roger Clark and Victor Perez, 2015 * Performs a DMA SPI transfer with at least a receive buffer. -* If a TX buffer is not provided, FF is sent over and over for the length of the transfer. -* On exit TX buffer is not modified, and RX buffer contains the received data. +* If a TX buffer is not provided, FF is sent over and over for the lenght of the transfer. +* On exit TX buffer is not modified, and RX buffer cotains the received data. * Still in progress. */ -uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length) -{ +uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length) { if (length == 0) return 0; uint8 b = 0; - spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. + if (spi_is_rx_nonempty(_currentSetting->spi_d) == 1) b = spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. // dma1_ch3_Active=true; dma_init(_currentSetting->spiDmaDev); // dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - + // RX spi_rx_dma_enable(_currentSetting->spi_d); - dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_8BIT) ? DMA_SIZE_8BITS : DMA_SIZE_16BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, + receiveBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); - + // TX - uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); spi_tx_dma_enable(_currentSetting->spi_d); - if ( transmitBuf==0 ) { - static uint8_t ff = 0XFF; - transmitBuf = &ff; - flags ^= DMA_MINC_MODE; // remove increment mode + if (!transmitBuf) { + static uint8_t ff = 0XFF; + transmitBuf = &ff; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, + transmitBuf, DMA_SIZE_8BITS, (DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit FF repeatedly + } + else { + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, + transmitBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit buffer DMA } - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit +// while (dma1_ch3_Active); +// if (receiveBuf) { uint32_t m = millis(); while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0) {//Avoid interrupts and just loop waiting for the flag to be set. - if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + if ((millis() - m) > 100) { +// dma1_ch3_Active = 0; + b = 2; + break; + } } dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); +// } while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); spi_rx_dma_disable(_currentSetting->spi_d); // And disable generation of DMA request from the SPI port so other peripherals can use the channels spi_tx_dma_disable(_currentSetting->spi_d); - uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! + if (spi_is_rx_nonempty(_currentSetting->spi_d) != 0){; // "4. Wait until RXNE=1 ..." + uint8 x = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + } return b; } @@ -417,12 +443,10 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length * Performs a DMA SPI send using a TX buffer. * On exit TX buffer is not modified. * Still in progress. -* 2016 - stevstrong - reworked to automatically detect bit size from SPI setting */ -uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length) -{ +uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { if (length == 0) return 0; - uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); + uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); uint8 b = 0; // dma1_ch3_Active=true; dma_init(_currentSetting->spiDmaDev); @@ -430,27 +454,55 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length) // TX spi_tx_dma_enable(_currentSetting->spi_d); - dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_8BIT) ? DMA_SIZE_8BITS : DMA_SIZE_16BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, + transmitBuf, DMA_SIZE_8BITS, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + +// while (dma1_ch3_Active); + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0); //Avoid interrupts and just loop waiting for the flag to be set. + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + spi_tx_dma_disable(_currentSetting->spi_d); + if (spi_is_rx_nonempty(_currentSetting->spi_d) != 0){; // "4. Wait until RXNE=1 ..." + uint8 x = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + } + return b; +} + +uint8 SPIClass::dmaSend(uint16 *transmitBuf, uint16 length, bool minc) { + if (length == 0) return 0; + uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); + uint8 b; + dma1_ch3_Active=true; + dma_init(_currentSetting->spiDmaDev); +// dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); + + // TX + spi_tx_dma_enable(_currentSetting->spi_d); + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_16BITS, + transmitBuf, DMA_SIZE_16BITS, flags);// Transmit buffer DMA + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + // while (dma1_ch3_Active); - uint32_t m = millis(); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0) {//Avoid interrupts and just loop waiting for the flag to be set. - if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } - } + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0); //Avoid interrupts and just loop waiting for the flag to be set. dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); spi_tx_dma_disable(_currentSetting->spi_d); - uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! + if (spi_is_rx_nonempty(_currentSetting->spi_d) != 0){; // "4. Wait until RXNE=1 ..." + b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + } return b; } + void SPIClass::attachInterrupt(void) { // Should be enableInterrupt() } diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 0f8497ae1..e949051e5 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -249,7 +249,7 @@ class SPIClass { * @param buffer Bytes to transmit. * @param length Number of bytes in buffer to transmit. */ - void write(const void * buffer, uint32 length); + void write(const uint8 *buffer, uint32 length); /** * @brief Transmit a byte, then return the next unread byte. @@ -264,7 +264,6 @@ class SPIClass { /** * @brief Sets up a DMA Transfer for "length" bytes. - * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * * This function transmits and receives to buffers. * @@ -272,18 +271,30 @@ class SPIClass { * @param receiveBuf buffer Bytes to save received data. * @param length Number of bytes in buffer to transmit. */ - uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); + uint8 dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length); /** - * @brief Sets up a DMA Transmit for SPI 8 or 16 bit transfer mode. - * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. + * @brief Sets up a DMA Transmit for bytes. * - * This function only transmits and does not care about the RX fifo. + * This function transmits and does not care about the RX fifo. + * + * @param transmitBuf buffer Bytes to transmit, + * @param length Number of bytes in buffer to transmit. + * @param minc Set to use Memory Increment mode, clear to use Circular mode. + */ + uint8 dmaSend(uint8 *transmitBuf, uint16 length, bool minc = 1); + + /** + * @brief Sets up a DMA Transmit for half words. + * SPI PERFIPHERAL MUST BE SET TO 16 BIT MODE BEFORE + * + * This function transmits and does not care about the RX fifo. * * @param data buffer half words to transmit, * @param length Number of bytes in buffer to transmit. + * @param minc Set to use Memory Increment mode (default if blank), clear to use Circular mode. */ - uint8 dmaSend(void * transmitBuf, uint16 length); + uint8 dmaSend(uint16 *transmitBuf, uint16 length, bool minc = 1); /* * Pin accessors From b2e349ca36d245869111db0502123b08c318f5e7 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 11 Nov 2016 22:12:13 +0100 Subject: [PATCH 011/307] Revert "Revert "improve SPI low level functions"" This reverts commit 3469ef291baad000b3c64564623d7a09e1312356. --- STM32F1/cores/maple/libmaple/spi.c | 6 +- STM32F1/libraries/SPI/src/SPI.cpp | 178 ++++++++++------------------- STM32F1/libraries/SPI/src/SPI.h | 25 ++-- 3 files changed, 74 insertions(+), 135 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/spi.c b/STM32F1/cores/maple/libmaple/spi.c index 1020c5baf..64f06d301 100644 --- a/STM32F1/cores/maple/libmaple/spi.c +++ b/STM32F1/cores/maple/libmaple/spi.c @@ -84,7 +84,7 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags) { } /** - * @brief Nonblocking SPI transmit. + * @brief Blocking SPI transmit. * @param dev SPI port to use for transmission * @param buf Buffer to transmit. The sizeof buf's elements are * inferred from dev's data frame format (i.e., are @@ -95,7 +95,8 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags) { uint32 spi_tx(spi_dev *dev, const void *buf, uint32 len) { uint32 txed = 0; uint8 byte_frame = spi_dff(dev) == SPI_DFF_8_BIT; - while (spi_is_tx_empty(dev) && (txed < len)) { + while ( txed < len ) { + while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty if (byte_frame) { dev->regs->DR = ((const uint8*)buf)[txed++]; } else { @@ -162,5 +163,6 @@ static void spi_reconfigure(spi_dev *dev, uint32 cr1_config) { spi_irq_disable(dev, SPI_INTERRUPTS_ALL); if ( (dev->regs->CR1&MASK)!=(cr1_config&MASK) ) spi_peripheral_disable(dev); dev->regs->CR1 = cr1_config; + //spi_rx_dma_enable(dev); spi_peripheral_enable(dev); } diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 4eeec3811..08327912f 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -41,6 +41,8 @@ #include "boards.h" //#include "HardwareSerial.h" +/** Time in ms for DMA receive timeout */ +#define DMA_TIMEOUT 100 #if CYCLES_PER_MICROSECOND != 72 /* TODO [0.2.0?] something smarter than this */ @@ -304,138 +306,110 @@ void SPIClass::endTransaction(void) * I/O */ -uint8 SPIClass::read(void) { - uint8 buf[1]; - this->read(buf, 1); - return buf[0]; +uint8 SPIClass::read(void) +{ + while ( spi_is_rx_nonempty(_currentSetting->spi_d)==0 ) ; + return (uint8)spi_rx_reg(_currentSetting->spi_d); } -void SPIClass::read(uint8 *buf, uint32 len) { +void SPIClass::read(uint8 *buf, uint32 len) +{ + spi_reg_map * regs = _currentSetting->spi_d->regs; + uint8 b = (regs->DR); // clear the RX buffer in case a byte is waiting on it. uint32 rxed = 0; - while (rxed < len) { - while (!spi_is_rx_nonempty(_currentSetting->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(_currentSetting->spi_d); + // start sequence + while ( rxed < len) { + regs->DR = 0x00FF; // " write the data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while ( (regs->SR & SPI_SR_RXNE)==0 ) ; // wait till data is available in the Rx register + buf[rxed++] = (uint8)(regs->DR); // read and store the received byte } } -void SPIClass::write(uint16 data) { - // this->write(&data, 1); - +void SPIClass::write(uint16 data) +{ /* Added for 16bit data Victor Perez. Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) - * The original method, of calling write(*data, length) . + * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, + * by taking the Tx code from transfer(byte) * This almost doubles the speed of this function. */ - spi_tx_reg(_currentSetting->spi_d, data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } -//void SPIClass::write(uint8 byte) { - // this->write(&byte, 1); - - /* Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) - * The original method, of calling write(*data, length) . - * This almost doubles the speed of this function. - */ - -// spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." -// while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." -// while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." -//} - -void SPIClass::write(const uint8 *data, uint32 length) { - uint32 txed = 0; - while (txed < length) { - txed += spi_tx(_currentSetting->spi_d, data + txed, length - txed); - } - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "4. After writing the last data item into the SPI_DR register, wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... then wait until BSY=0, this indicates that the transmission of the last data is complete." +void SPIClass::write(const void *data, uint32 length) +{ + spi_tx(_currentSetting->spi_d, data, length); // data can be array of bytes or words + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." // taken from SdSpiSTM32F1.cpp - Victor's lib, and adapted to support device selection - if (spi_is_rx_nonempty(_currentSetting->spi_d)) { - uint8_t b = spi_rx_reg(_currentSetting->spi_d); - } + uint16 b = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! } uint16_t SPIClass::transfer16(uint16_t wr_data) const { spi_tx_reg(_currentSetting->spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..." - uint16_t rd_data = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." -// while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." -// while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return rd_data; + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint16)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." } uint8 SPIClass::transfer(uint8 byte) const { spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..." - uint8 b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return b; + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint8)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." } + /* Roger Clark and Victor Perez, 2015 * Performs a DMA SPI transfer with at least a receive buffer. -* If a TX buffer is not provided, FF is sent over and over for the lenght of the transfer. -* On exit TX buffer is not modified, and RX buffer cotains the received data. +* If a TX buffer is not provided, FF is sent over and over for the length of the transfer. +* On exit TX buffer is not modified, and RX buffer contains the received data. * Still in progress. */ -uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length) { +uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length) +{ if (length == 0) return 0; uint8 b = 0; - if (spi_is_rx_nonempty(_currentSetting->spi_d) == 1) b = spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. + spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. // dma1_ch3_Active=true; dma_init(_currentSetting->spiDmaDev); // dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - + // RX spi_rx_dma_enable(_currentSetting->spi_d); - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, - receiveBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_8BIT) ? DMA_SIZE_8BITS : DMA_SIZE_16BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); - + // TX + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); spi_tx_dma_enable(_currentSetting->spi_d); - if (!transmitBuf) { - static uint8_t ff = 0XFF; - transmitBuf = &ff; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, (DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit FF repeatedly - } - else { - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit buffer DMA + if ( transmitBuf==0 ) { + static uint8_t ff = 0XFF; + transmitBuf = &ff; + flags ^= DMA_MINC_MODE; // remove increment mode } + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit -// while (dma1_ch3_Active); -// if (receiveBuf) { uint32_t m = millis(); while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0) {//Avoid interrupts and just loop waiting for the flag to be set. - if ((millis() - m) > 100) { -// dma1_ch3_Active = 0; - b = 2; - break; - } + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); -// } while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); spi_rx_dma_disable(_currentSetting->spi_d); // And disable generation of DMA request from the SPI port so other peripherals can use the channels spi_tx_dma_disable(_currentSetting->spi_d); - if (spi_is_rx_nonempty(_currentSetting->spi_d) != 0){; // "4. Wait until RXNE=1 ..." - uint8 x = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." - } + uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! return b; } @@ -443,10 +417,12 @@ uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length * Performs a DMA SPI send using a TX buffer. * On exit TX buffer is not modified. * Still in progress. +* 2016 - stevstrong - reworked to automatically detect bit size from SPI setting */ -uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { +uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length) +{ if (length == 0) return 0; - uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); uint8 b = 0; // dma1_ch3_Active=true; dma_init(_currentSetting->spiDmaDev); @@ -454,55 +430,27 @@ uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { // TX spi_tx_dma_enable(_currentSetting->spi_d); - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, flags);// Transmit buffer DMA + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_8BIT) ? DMA_SIZE_8BITS : DMA_SIZE_16BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - -// while (dma1_ch3_Active); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0); //Avoid interrupts and just loop waiting for the flag to be set. - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - spi_tx_dma_disable(_currentSetting->spi_d); - if (spi_is_rx_nonempty(_currentSetting->spi_d) != 0){; // "4. Wait until RXNE=1 ..." - uint8 x = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." - } - return b; -} - -uint8 SPIClass::dmaSend(uint16 *transmitBuf, uint16 length, bool minc) { - if (length == 0) return 0; - uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - uint8 b; - dma1_ch3_Active=true; - dma_init(_currentSetting->spiDmaDev); -// dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - - // TX - spi_tx_dma_enable(_currentSetting->spi_d); - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, DMA_SIZE_16BITS, - transmitBuf, DMA_SIZE_16BITS, flags);// Transmit buffer DMA - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - // while (dma1_ch3_Active); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0); //Avoid interrupts and just loop waiting for the flag to be set. + uint32_t m = millis(); + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); spi_tx_dma_disable(_currentSetting->spi_d); - if (spi_is_rx_nonempty(_currentSetting->spi_d) != 0){; // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." - } + uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! return b; } - void SPIClass::attachInterrupt(void) { // Should be enableInterrupt() } diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index e949051e5..0f8497ae1 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -249,7 +249,7 @@ class SPIClass { * @param buffer Bytes to transmit. * @param length Number of bytes in buffer to transmit. */ - void write(const uint8 *buffer, uint32 length); + void write(const void * buffer, uint32 length); /** * @brief Transmit a byte, then return the next unread byte. @@ -264,6 +264,7 @@ class SPIClass { /** * @brief Sets up a DMA Transfer for "length" bytes. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * * This function transmits and receives to buffers. * @@ -271,30 +272,18 @@ class SPIClass { * @param receiveBuf buffer Bytes to save received data. * @param length Number of bytes in buffer to transmit. */ - uint8 dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length); + uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); /** - * @brief Sets up a DMA Transmit for bytes. + * @brief Sets up a DMA Transmit for SPI 8 or 16 bit transfer mode. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * - * This function transmits and does not care about the RX fifo. - * - * @param transmitBuf buffer Bytes to transmit, - * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode, clear to use Circular mode. - */ - uint8 dmaSend(uint8 *transmitBuf, uint16 length, bool minc = 1); - - /** - * @brief Sets up a DMA Transmit for half words. - * SPI PERFIPHERAL MUST BE SET TO 16 BIT MODE BEFORE - * - * This function transmits and does not care about the RX fifo. + * This function only transmits and does not care about the RX fifo. * * @param data buffer half words to transmit, * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode (default if blank), clear to use Circular mode. */ - uint8 dmaSend(uint16 *transmitBuf, uint16 length, bool minc = 1); + uint8 dmaSend(void * transmitBuf, uint16 length); /* * Pin accessors From 1892447080db8c03799e564b295d3986a0d1394e Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sat, 12 Nov 2016 18:34:58 +1100 Subject: [PATCH 012/307] Fix issue 196, for Servo library --- .../libraries/Servo/examples/Knob/Knob.ino | 27 ++++++++++++++++ .../libraries/Servo/examples/Sweep/Sweep.ino | 32 +++++++++++++++++++ STM32F1/libraries/Servo/keywords.txt | 24 ++++++++++++++ STM32F1/libraries/Servo/library.properties | 9 ++++++ STM32F1/libraries/Servo/rules.mk | 29 ----------------- STM32F1/libraries/Servo/{ => src}/Servo.cpp | 0 STM32F1/libraries/Servo/{ => src}/Servo.h | 0 7 files changed, 92 insertions(+), 29 deletions(-) create mode 100644 STM32F1/libraries/Servo/examples/Knob/Knob.ino create mode 100644 STM32F1/libraries/Servo/examples/Sweep/Sweep.ino create mode 100644 STM32F1/libraries/Servo/keywords.txt create mode 100644 STM32F1/libraries/Servo/library.properties delete mode 100644 STM32F1/libraries/Servo/rules.mk rename STM32F1/libraries/Servo/{ => src}/Servo.cpp (100%) rename STM32F1/libraries/Servo/{ => src}/Servo.h (100%) diff --git a/STM32F1/libraries/Servo/examples/Knob/Knob.ino b/STM32F1/libraries/Servo/examples/Knob/Knob.ino new file mode 100644 index 000000000..0db8770bd --- /dev/null +++ b/STM32F1/libraries/Servo/examples/Knob/Knob.ino @@ -0,0 +1,27 @@ +/* + Controlling a servo position using a potentiometer (variable resistor) + by Michal Rinott + + modified on 8 Nov 2013 + by Scott Fitzgerald + http://www.arduino.cc/en/Tutorial/Knob +*/ + +#include + +Servo myservo; // create servo object to control a servo + +int potpin = 0; // analog pin used to connect the potentiometer +int val; // variable to read the value from the analog pin + +void setup() { + myservo.attach(9); // attaches the servo on pin 9 to the servo object +} + +void loop() { + val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023) + val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180) + myservo.write(val); // sets the servo position according to the scaled value + delay(15); // waits for the servo to get there +} + diff --git a/STM32F1/libraries/Servo/examples/Sweep/Sweep.ino b/STM32F1/libraries/Servo/examples/Sweep/Sweep.ino new file mode 100644 index 000000000..df904afb1 --- /dev/null +++ b/STM32F1/libraries/Servo/examples/Sweep/Sweep.ino @@ -0,0 +1,32 @@ +/* Sweep + by BARRAGAN + This example code is in the public domain. + + modified 8 Nov 2013 + by Scott Fitzgerald + http://www.arduino.cc/en/Tutorial/Sweep +*/ + +#include + +Servo myservo; // create servo object to control a servo +// twelve servo objects can be created on most boards + +int pos = 0; // variable to store the servo position + +void setup() { + myservo.attach(9); // attaches the servo on pin 9 to the servo object +} + +void loop() { + for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees + // in steps of 1 degree + myservo.write(pos); // tell servo to go to position in variable 'pos' + delay(15); // waits 15ms for the servo to reach the position + } + for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees + myservo.write(pos); // tell servo to go to position in variable 'pos' + delay(15); // waits 15ms for the servo to reach the position + } +} + diff --git a/STM32F1/libraries/Servo/keywords.txt b/STM32F1/libraries/Servo/keywords.txt new file mode 100644 index 000000000..0a7ca1e3d --- /dev/null +++ b/STM32F1/libraries/Servo/keywords.txt @@ -0,0 +1,24 @@ +####################################### +# Syntax Coloring Map Servo +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Servo KEYWORD1 Servo + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +attach KEYWORD2 +detach KEYWORD2 +write KEYWORD2 +read KEYWORD2 +attached KEYWORD2 +writeMicroseconds KEYWORD2 +readMicroseconds KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/STM32F1/libraries/Servo/library.properties b/STM32F1/libraries/Servo/library.properties new file mode 100644 index 000000000..68ac78d55 --- /dev/null +++ b/STM32F1/libraries/Servo/library.properties @@ -0,0 +1,9 @@ +name=Servo(STM32F1) +version=1.1.2 +author=Unknown (possibly LeafLabs) +maintainer=Roger Clark (roger@rogerclark.net) +sentence=Allows STM32 boards to control a variety of servo motors. +paragraph= +category=Device Control +url=http://www.arduino.cc/en/Reference/Servo +architectures=STM32F1 \ No newline at end of file diff --git a/STM32F1/libraries/Servo/rules.mk b/STM32F1/libraries/Servo/rules.mk deleted file mode 100644 index e013754a6..000000000 --- a/STM32F1/libraries/Servo/rules.mk +++ /dev/null @@ -1,29 +0,0 @@ -# Standard things -sp := $(sp).x -dirstack_$(sp) := $(d) -d := $(dir) -BUILDDIRS += $(BUILD_PATH)/$(d) - -# Local flags -CXXFLAGS_$(d) := $(WIRISH_INCLUDES) $(LIBMAPLE_INCLUDES) - -# Local rules and targets -cSRCS_$(d) := - -cppSRCS_$(d) := Servo.cpp - -cFILES_$(d) := $(cSRCS_$(d):%=$(d)/%) -cppFILES_$(d) := $(cppSRCS_$(d):%=$(d)/%) - -OBJS_$(d) := $(cFILES_$(d):%.c=$(BUILD_PATH)/%.o) \ - $(cppFILES_$(d):%.cpp=$(BUILD_PATH)/%.o) -DEPS_$(d) := $(OBJS_$(d):%.o=%.d) - -$(OBJS_$(d)): TGT_CXXFLAGS := $(CXXFLAGS_$(d)) - -TGT_BIN += $(OBJS_$(d)) - -# Standard things --include $(DEPS_$(d)) -d := $(dirstack_$(sp)) -sp := $(basename $(sp)) \ No newline at end of file diff --git a/STM32F1/libraries/Servo/Servo.cpp b/STM32F1/libraries/Servo/src/Servo.cpp similarity index 100% rename from STM32F1/libraries/Servo/Servo.cpp rename to STM32F1/libraries/Servo/src/Servo.cpp diff --git a/STM32F1/libraries/Servo/Servo.h b/STM32F1/libraries/Servo/src/Servo.h similarity index 100% rename from STM32F1/libraries/Servo/Servo.h rename to STM32F1/libraries/Servo/src/Servo.h From dcfe2ae817a4b3ed57a8a8aae7ff5df105b6868c Mon Sep 17 00:00:00 2001 From: Phisatho Date: Fri, 18 Nov 2016 02:29:12 +0400 Subject: [PATCH 013/307] Create pins_arduino.h --- STM32F1/variants/STM32VLD/pins_arduino.h | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 STM32F1/variants/STM32VLD/pins_arduino.h diff --git a/STM32F1/variants/STM32VLD/pins_arduino.h b/STM32F1/variants/STM32VLD/pins_arduino.h new file mode 100644 index 000000000..9f8632dfe --- /dev/null +++ b/STM32F1/variants/STM32VLD/pins_arduino.h @@ -0,0 +1,6 @@ + + + + +// API compatibility +#include "variant.h" From f43d07efb3f3efec500faeb3399fbece670b25eb Mon Sep 17 00:00:00 2001 From: Phisatho Date: Fri, 18 Nov 2016 02:30:20 +0400 Subject: [PATCH 014/307] Add files via upload --- STM32F1/variants/STM32VLD/board.cpp | 161 ++++++++++++ STM32F1/variants/STM32VLD/board/board.h | 92 +++++++ STM32F1/variants/STM32VLD/ld/common.inc | 220 +++++++++++++++++ STM32F1/variants/STM32VLD/ld/extra_libs.inc | 7 + STM32F1/variants/STM32VLD/ld/jtag.ld | 36 +++ .../variants/STM32VLD/ld/vector_symbols.inc | 78 ++++++ STM32F1/variants/STM32VLD/variant.h | 20 ++ STM32F1/variants/STM32VLD/wirish/boards.cpp | 229 ++++++++++++++++++ .../variants/STM32VLD/wirish/boards_setup.cpp | 104 ++++++++ STM32F1/variants/STM32VLD/wirish/start.S | 57 +++++ STM32F1/variants/STM32VLD/wirish/start_c.c | 95 ++++++++ STM32F1/variants/STM32VLD/wirish/syscalls.c | 176 ++++++++++++++ 12 files changed, 1275 insertions(+) create mode 100644 STM32F1/variants/STM32VLD/board.cpp create mode 100644 STM32F1/variants/STM32VLD/board/board.h create mode 100644 STM32F1/variants/STM32VLD/ld/common.inc create mode 100644 STM32F1/variants/STM32VLD/ld/extra_libs.inc create mode 100644 STM32F1/variants/STM32VLD/ld/jtag.ld create mode 100644 STM32F1/variants/STM32VLD/ld/vector_symbols.inc create mode 100644 STM32F1/variants/STM32VLD/variant.h create mode 100644 STM32F1/variants/STM32VLD/wirish/boards.cpp create mode 100644 STM32F1/variants/STM32VLD/wirish/boards_setup.cpp create mode 100644 STM32F1/variants/STM32VLD/wirish/start.S create mode 100644 STM32F1/variants/STM32VLD/wirish/start_c.c create mode 100644 STM32F1/variants/STM32VLD/wirish/syscalls.c diff --git a/STM32F1/variants/STM32VLD/board.cpp b/STM32F1/variants/STM32VLD/board.cpp new file mode 100644 index 000000000..1cecbd932 --- /dev/null +++ b/STM32F1/variants/STM32VLD/board.cpp @@ -0,0 +1,161 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/boards/maple_mini/board.cpp + * @author Marti Bolivar + * @brief Maple Mini board file. + */ + +#include + +#include +#include + +/* Roger Clark. Added next to includes for changes to Serial */ +#include +#include + +#include +#include + +/* Since we want the Serial Wire/JTAG pins as GPIOs, disable both SW + * and JTAG debug support, unless configured otherwise. */ +void boardInit(void) { +#ifndef CONFIG_MAPLE_MINI_NO_DISABLE_DEBUG + disableDebugPorts(); +#endif +} + +// Note. See the enum of pin names in board.h + +extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { + + + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ + +/* Andy Hull - the R8 is similar to the C8 but exposes more GPIO as follows */ + {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ + + {&gpioc, NULL, NULL, 6, 0, ADCx}, /* PC6 */ + {&gpioc, NULL, NULL, 7, 0, ADCx}, /* PC7 */ + {&gpioc, NULL, NULL, 8, 0, ADCx}, /* PC8 */ + {&gpioc, NULL, NULL, 9, 0, ADCx}, /* PC9 */ + + {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 */ + {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 */ + {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 */ + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ + + {&gpiod, NULL, NULL, 0, 0, ADCx}, /* PD2 */ + {&gpiod, NULL, NULL, 1, 0, ADCx}, /* PD2 */ + {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 */ +}; + +extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { + PA0, PA1, PA2, PA3, PA6, PA7, PA8, PA9, PA10, PB0, PB1, PB6, PB7, PB8, PB9 +}; + +extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = { + PA0, PA1, PA2 , PA3 , PA4 , PA5 , PA6 , PA7 , PB0 , PB1, PC0, PC1, PC2, PC3, PC4, PC5 +}; + +// Note. These defines are not really used by generic boards. They are for Maple Serial USB +//#define USB_DP PA12 +//#define USB_DM PA11 + +// NOte. These definitions are not really used for generic boards, they only relate to boards modified to behave like Maple boards +extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { + BOARD_LED_PIN, BOARD_BUTTON_PIN, BOARD_JTMS_SWDIO_PIN, + BOARD_JTCK_SWCLK_PIN, BOARD_JTDI_PIN, BOARD_JTDO_PIN, BOARD_NJTRST_PIN + //USB_DP, USB_DM +}; + + +/* + * Roger Clark + * + * 2015/05/28 + * + * Moved definitions for Hardware Serial devices from HardwareSerial.cpp so that each board can define which Arduino "Serial" instance + * Maps to which hardware serial port on the microprocessor + */ + +#ifdef SERIAL_USB + DEFINE_HWSERIAL(Serial1, 1); + + DEFINE_HWSERIAL(Serial2, 2); + + DEFINE_HWSERIAL(Serial3, 3); + +#else + DEFINE_HWSERIAL(Serial, 1); + + DEFINE_HWSERIAL(Serial1, 2); + + DEFINE_HWSERIAL(Serial2, 3); + + +#endif diff --git a/STM32F1/variants/STM32VLD/board/board.h b/STM32F1/variants/STM32VLD/board/board.h new file mode 100644 index 000000000..ba8d556c8 --- /dev/null +++ b/STM32F1/variants/STM32VLD/board/board.h @@ -0,0 +1,92 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/boards/maple_mini/include/board/board.h + * @author Marti Bolivar + * @brief Maple Mini board header. + * + * See wirish/boards/maple/include/board/board.h for more information + * on these definitions. + */ + +#ifndef _BOARD_STM32VLD_H_ +#define _BOARD_STM32VLD_H_ + + + +#define CYCLES_PER_MICROSECOND 24 +//#define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ +#define SYSTICK_RELOAD_VAL 23999 /* takes a cycle to reload */ + +#define BOARD_LED_PIN PC8 /* BlueLED(PC8) */ +#define BOARD_BUTTON_PIN PA0 /* USR SW(PA0) */ + +#define LED_G PC9 +#define LED_B PC8 + +#define BOARD_NR_USARTS 3 +#define BOARD_USART1_TX_PIN PA9 +#define BOARD_USART1_RX_PIN PA10 +#define BOARD_USART2_TX_PIN PA2 +#define BOARD_USART2_RX_PIN PA3 +#define BOARD_USART3_TX_PIN PB10 +#define BOARD_USART3_RX_PIN PB11 + +#define BOARD_NR_SPI 2 +#define BOARD_SPI1_NSS_PIN PA4 +#define BOARD_SPI1_MOSI_PIN PA7 +#define BOARD_SPI1_MISO_PIN PA6 +#define BOARD_SPI1_SCK_PIN PA5 +#define BOARD_SPI2_NSS_PIN PB12 +#define BOARD_SPI2_MOSI_PIN PB15 +#define BOARD_SPI2_MISO_PIN PB14 +#define BOARD_SPI2_SCK_PIN PB13 + +#define BOARD_NR_GPIO_PINS 51 +#define BOARD_NR_PWM_PINS 15 +#define BOARD_NR_ADC_PINS 16 +#define BOARD_NR_USED_PINS 7 + +#define BOARD_JTMS_SWDIO_PIN PA13 +#define BOARD_JTCK_SWCLK_PIN PA14 +#define BOARD_JTDI_PIN PA15 +#define BOARD_JTDO_PIN PB3 +#define BOARD_NJTRST_PIN PB4 + + +#define BOARD_USB_DISC_DEV GPIOB +#define BOARD_USB_DISC_BIT 10 + +// Note this needs to match with the PIN_MAP array in board.cpp +enum { + PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9, PA10, PA11, PA12, PA13, PA14, PA15, + PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7, PB8, PB9, PB10, PB11, PB12, PB13, PB14, PB15, + PC0, PC1, PC2, PC3, PC4, PC5, PC6, PC7, PC8, PC9, PC10, PC11, PC12, PC13, PC14, PC15, + PD0, PD1, PD2 +}; + +#endif diff --git a/STM32F1/variants/STM32VLD/ld/common.inc b/STM32F1/variants/STM32VLD/ld/common.inc new file mode 100644 index 000000000..0c2b6a42b --- /dev/null +++ b/STM32F1/variants/STM32VLD/ld/common.inc @@ -0,0 +1,220 @@ +/* + * Linker script for libmaple. + * + * Original author "lanchon" from ST forums, with modifications by LeafLabs. + */ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") + +/* + * Configure other libraries we want in the link. + * + * libgcc, libc, and libm are common across supported toolchains. + * However, some toolchains require additional archives which aren't + * present everywhere (e.g. ARM's gcc-arm-embedded releases). + * + * To hack around this, we let the build system specify additional + * archives by putting the right extra_libs.inc (in a directory under + * toolchains/) in our search path. + */ +GROUP(libgcc.a libc.a libm.a) +INCLUDE extra_libs.inc + +/* + * These force the linker to search for vector table symbols. + * + * These symbols vary by STM32 family (and also within families). + * It's up to the build system to configure the link's search path + * properly for the target MCU. + */ +INCLUDE vector_symbols.inc + +/* STM32 vector table. */ +EXTERN(__stm32_vector_table) + +/* C runtime initialization function. */ +EXTERN(start_c) + +/* main entry point */ +EXTERN(main) + +/* Initial stack pointer value. */ +EXTERN(__msp_init) +PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram)); + +/* Reset vector and chip reset entry point */ +EXTERN(__start__) +ENTRY(__start__) +PROVIDE(__exc_reset = __start__); + +/* Heap boundaries, for libmaple */ +EXTERN(_lm_heap_start); +EXTERN(_lm_heap_end); + +SECTIONS +{ + .text : + { + __text_start__ = .; + /* + * STM32 vector table. Leave this here. Yes, really. + */ + *(.stm32.interrupt_vector) + + /* + * Program code and vague linking + */ + *(.text .text.* .gnu.linkonce.t.*) + *(.plt) + *(.gnu.warning) + *(.glue_7t) *(.glue_7) *(.vfp11_veneer) + + *(.ARM.extab* .gnu.linkonce.armextab.*) + *(.gcc_except_table) + *(.eh_frame_hdr) + *(.eh_frame) + + . = ALIGN(4); + KEEP(*(.init)) + + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + } > REGION_TEXT + + /* + * End of text + */ + .text.align : + { + . = ALIGN(8); + __text_end__ = .; + } > REGION_TEXT + + /* + * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI + */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > REGION_RODATA + __exidx_end = .; + + /* + * .data + */ + .data : + { + __data_start__ = .; + LONG(0) + . = ALIGN(8); + + *(.got.plt) *(.got) + *(.data .data.* .gnu.linkonce.d.*) + + . = ALIGN(8); + __data_end__ = .; + } > REGION_DATA AT> REGION_RODATA + + /* + * Read-only data + */ + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + /* .USER_FLASH: We allow users to allocate into Flash here */ + *(.USER_FLASH) + /* ROM image configuration; for C startup */ + . = ALIGN(4); + _lm_rom_img_cfgp = .; + LONG(LOADADDR(.data)); + /* + * Heap: Linker scripts may choose a custom heap by overriding + * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in + * internal SRAM, beginning after .bss, and growing towards + * the stack. + * + * I'm shoving these here naively; there's probably a cleaner way + * to go about this. [mbolivar] + */ + _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; + _lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init; + } > REGION_RODATA + + /* + * .bss + */ + .bss : + { + . = ALIGN(8); + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + . = ALIGN (8); + __bss_end__ = .; + _end = __bss_end__; + } > REGION_BSS + + /* + * Debugging sections + */ + .stab 0 (NOLOAD) : { *(.stab) } + .stabstr 0 (NOLOAD) : { *(.stabstr) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/STM32F1/variants/STM32VLD/ld/extra_libs.inc b/STM32F1/variants/STM32VLD/ld/extra_libs.inc new file mode 100644 index 000000000..4413a5334 --- /dev/null +++ b/STM32F1/variants/STM32VLD/ld/extra_libs.inc @@ -0,0 +1,7 @@ +/* + * Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi- + * releases (https://launchpad.net/gcc-arm-embedded/). + */ + +/* This is for the provided newlib. */ +GROUP(libnosys.a) diff --git a/STM32F1/variants/STM32VLD/ld/jtag.ld b/STM32F1/variants/STM32VLD/ld/jtag.ld new file mode 100644 index 000000000..4cfd39afb --- /dev/null +++ b/STM32F1/variants/STM32VLD/ld/jtag.ld @@ -0,0 +1,36 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2009 Uwe Hermann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* Linker script for STM32F100RB */ + +/* Define memory regions. */ +MEMORY +{ + rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 8K +} + +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + + +INCLUDE common.inc + diff --git a/STM32F1/variants/STM32VLD/ld/vector_symbols.inc b/STM32F1/variants/STM32VLD/ld/vector_symbols.inc new file mode 100644 index 000000000..a40012a2d --- /dev/null +++ b/STM32F1/variants/STM32VLD/ld/vector_symbols.inc @@ -0,0 +1,78 @@ +EXTERN(__msp_init) +EXTERN(__exc_reset) +EXTERN(__exc_nmi) +EXTERN(__exc_hardfault) +EXTERN(__exc_memmanage) +EXTERN(__exc_busfault) +EXTERN(__exc_usagefault) +EXTERN(__stm32reservedexception7) +EXTERN(__stm32reservedexception8) +EXTERN(__stm32reservedexception9) +EXTERN(__stm32reservedexception10) +EXTERN(__exc_svc) +EXTERN(__exc_debug_monitor) +EXTERN(__stm32reservedexception13) +EXTERN(__exc_pendsv) +EXTERN(__exc_systick) + +EXTERN(__irq_wwdg) +EXTERN(__irq_pvd) +EXTERN(__irq_tamper) +EXTERN(__irq_rtc) +EXTERN(__irq_flash) +EXTERN(__irq_rcc) +EXTERN(__irq_exti0) +EXTERN(__irq_exti1) +EXTERN(__irq_exti2) +EXTERN(__irq_exti3) +EXTERN(__irq_exti4) +EXTERN(__irq_dma1_channel1) +EXTERN(__irq_dma1_channel2) +EXTERN(__irq_dma1_channel3) +EXTERN(__irq_dma1_channel4) +EXTERN(__irq_dma1_channel5) +EXTERN(__irq_dma1_channel6) +EXTERN(__irq_dma1_channel7) +EXTERN(__irq_adc) +EXTERN(__irq_usb_hp_can_tx) +EXTERN(__irq_usb_lp_can_rx0) +EXTERN(__irq_can_rx1) +EXTERN(__irq_can_sce) +EXTERN(__irq_exti9_5) +EXTERN(__irq_tim1_brk) +EXTERN(__irq_tim1_up) +EXTERN(__irq_tim1_trg_com) +EXTERN(__irq_tim1_cc) +EXTERN(__irq_tim2) +EXTERN(__irq_tim3) +EXTERN(__irq_tim4) +EXTERN(__irq_i2c1_ev) +EXTERN(__irq_i2c1_er) +EXTERN(__irq_i2c2_ev) +EXTERN(__irq_i2c2_er) +EXTERN(__irq_spi1) +EXTERN(__irq_spi2) +EXTERN(__irq_usart1) +EXTERN(__irq_usart2) +EXTERN(__irq_usart3) +EXTERN(__irq_exti15_10) +EXTERN(__irq_rtcalarm) +EXTERN(__irq_usbwakeup) + +EXTERN(__irq_tim8_brk) +EXTERN(__irq_tim8_up) +EXTERN(__irq_tim8_trg_com) +EXTERN(__irq_tim8_cc) +EXTERN(__irq_adc3) +EXTERN(__irq_fsmc) +EXTERN(__irq_sdio) +EXTERN(__irq_tim5) +EXTERN(__irq_spi3) +EXTERN(__irq_uart4) +EXTERN(__irq_uart5) +EXTERN(__irq_tim6) +EXTERN(__irq_tim7) +EXTERN(__irq_dma2_channel1) +EXTERN(__irq_dma2_channel2) +EXTERN(__irq_dma2_channel3) +EXTERN(__irq_dma2_channel4_5) diff --git a/STM32F1/variants/STM32VLD/variant.h b/STM32F1/variants/STM32VLD/variant.h new file mode 100644 index 000000000..52b39a629 --- /dev/null +++ b/STM32F1/variants/STM32VLD/variant.h @@ -0,0 +1,20 @@ +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) +#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) +#define portOutputRegister(port) ( &(port->regs->ODR) ) +#define portInputRegister(port) ( &(port->regs->IDR) ) + +#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) ) +#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) ) + +#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) ) + +static const uint8_t SS = BOARD_SPI1_NSS_PIN; +static const uint8_t SS1 = BOARD_SPI2_NSS_PIN; +static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; +static const uint8_t MISO = BOARD_SPI1_MISO_PIN; +static const uint8_t SCK = BOARD_SPI1_SCK_PIN; + +#endif /* _VARIANT_ARDUINO_STM32_ */ \ No newline at end of file diff --git a/STM32F1/variants/STM32VLD/wirish/boards.cpp b/STM32F1/variants/STM32VLD/wirish/boards.cpp new file mode 100644 index 000000000..5274e7a93 --- /dev/null +++ b/STM32F1/variants/STM32VLD/wirish/boards.cpp @@ -0,0 +1,229 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011, 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/boards.cpp + * @brief init() and board routines. + * + * This file is mostly interesting for the init() function, which + * configures Flash, the core clocks, and a variety of other available + * peripherals on the board so the rest of Wirish doesn't have to turn + * things on before using them. + * + * Prior to returning, init() calls boardInit(), which allows boards + * to perform any initialization they need to. This file includes a + * weak no-op definition of boardInit(), so boards that don't need any + * special initialization don't have to define their own. + * + * How init() works is chip-specific. See the boards_setup.cpp files + * under e.g. wirish/stm32f1/, wirish/stmf32f2 for the details, but be + * advised: their contents are unstable, and can/will change without + * notice. + */ + +#include +#include +#include +#include +#include +#include "boards_private.h" + +static void setup_flash(void); +static void setup_clocks(void); +static void setup_nvic(void); +static void setup_adcs(void); +static void setup_timers(void); + +/* + * Exported functions + */ + +void init(void) { + setup_flash(); + setup_clocks(); + setup_nvic(); + systick_init(SYSTICK_RELOAD_VAL); + wirish::priv::board_setup_gpio(); + setup_adcs(); + setup_timers(); + wirish::priv::board_setup_usb(); + wirish::priv::series_init(); + boardInit(); +} + +/* Provide a default no-op boardInit(). */ +__weak void boardInit(void) { +} + +/* You could farm this out to the files in boards/ if e.g. it takes + * too long to test on boards with lots of pins. */ +bool boardUsesPin(uint8 pin) { + for (int i = 0; i < BOARD_NR_USED_PINS; i++) { + if (pin == boardUsedPins[i]) { + return true; + } + } + return false; +} + +/* + * Auxiliary routines + */ + +static void setup_flash(void) { + // Turn on as many Flash "go faster" features as + // possible. flash_enable_features() just ignores any flags it + // can't support. + flash_enable_features(FLASH_PREFETCH | FLASH_ICACHE | FLASH_DCACHE); + // Configure the wait states, assuming we're operating at "close + // enough" to 3.3V. + flash_set_latency(FLASH_SAFE_WAIT_STATES); +} + +static void setup_clocks(void) { + // Turn on HSI. We'll switch to and run off of this while we're + // setting up the main PLL. + rcc_turn_on_clk(RCC_CLK_HSI); + + // Turn off and reset the clock subsystems we'll be using, as well + // as the clock security subsystem (CSS). Note that resetting CFGR + // to its default value of 0 implies a switch to HSI for SYSCLK. + RCC_BASE->CFGR = 0x00000000; + rcc_disable_css(); + rcc_turn_off_clk(RCC_CLK_PLL); + rcc_turn_off_clk(RCC_CLK_HSE); + wirish::priv::board_reset_pll(); + // Clear clock readiness interrupt flags and turn off clock + // readiness interrupts. + RCC_BASE->CIR = 0x00000000; + + // Enable HSE, and wait until it's ready. + rcc_turn_on_clk(RCC_CLK_HSE); + while (!rcc_is_clk_ready(RCC_CLK_HSE)) + ; + + // Configure AHBx, APBx, etc. prescalers and the main PLL. + wirish::priv::board_setup_clock_prescalers(); + rcc_configure_pll(&wirish::priv::w_board_pll_cfg); + + // Enable the PLL, and wait until it's ready. + rcc_turn_on_clk(RCC_CLK_PLL); + while(!rcc_is_clk_ready(RCC_CLK_PLL)) + ; + + // Finally, switch to the now-ready PLL as the main clock source. + rcc_switch_sysclk(RCC_CLKSRC_PLL); +} + +/* + * These addresses are where usercode starts when a bootloader is + * present. If no bootloader is present, the user NVIC usually starts + * at the Flash base address, 0x08000000. + */ +#if defined(BOOTLOADER_maple) + #define USER_ADDR_ROM 0x08005000 +#else + #if defined(BOOTLOADER_robotis) + #define USER_ADDR_ROM 0x08003000 + #else + #define USER_ADDR_ROM 0x08000000 + #endif +#endif +#define USER_ADDR_RAM 0x20000C00 +extern char __text_start__; + +static void setup_nvic(void) { + +nvic_init((uint32)VECT_TAB_ADDR, 0); + +/* Roger Clark. We now control nvic vector table in boards.txt using the build.vect paramater +#ifdef VECT_TAB_FLASH + nvic_init(USER_ADDR_ROM, 0); +#elif defined VECT_TAB_RAM + nvic_init(USER_ADDR_RAM, 0); +#elif defined VECT_TAB_BASE + nvic_init((uint32)0x08000000, 0); +#elif defined VECT_TAB_ADDR + // A numerically supplied value + nvic_init((uint32)VECT_TAB_ADDR, 0); +#else + // Use the __text_start__ value from the linker script; this + // should be the start of the vector table. + nvic_init((uint32)&__text_start__, 0); +#endif + +*/ +} + +static void adc_default_config(adc_dev *dev) { + adc_enable_single_swstart(dev); + adc_set_sample_rate(dev, wirish::priv::w_adc_smp); +} + +static void setup_adcs(void) { + adc_set_prescaler(wirish::priv::w_adc_pre); + adc_foreach(adc_default_config); +} + +static void timer_default_config(timer_dev *dev) { + timer_adv_reg_map *regs = (dev->regs).adv; + const uint16 full_overflow = 0xFFFF; + const uint16 half_duty = 0x8FFF; + + timer_init(dev); + timer_pause(dev); + + regs->CR1 = TIMER_CR1_ARPE; + regs->PSC = 1; + regs->SR = 0; + regs->DIER = 0; + regs->EGR = TIMER_EGR_UG; + switch (dev->type) { + case TIMER_ADVANCED: + regs->BDTR = TIMER_BDTR_MOE | TIMER_BDTR_LOCK_OFF; + // fall-through + case TIMER_GENERAL: + timer_set_reload(dev, full_overflow); + for (uint8 channel = 1; channel <= 4; channel++) { + if (timer_has_cc_channel(dev, channel)) { + timer_set_compare(dev, channel, half_duty); + timer_oc_set_mode(dev, channel, TIMER_OC_MODE_PWM_1, + TIMER_OC_PE); + } + } + // fall-through + case TIMER_BASIC: + break; + } + + timer_generate_update(dev); + timer_resume(dev); +} + +static void setup_timers(void) { + timer_foreach(timer_default_config); +} diff --git a/STM32F1/variants/STM32VLD/wirish/boards_setup.cpp b/STM32F1/variants/STM32VLD/wirish/boards_setup.cpp new file mode 100644 index 000000000..9de4d5396 --- /dev/null +++ b/STM32F1/variants/STM32VLD/wirish/boards_setup.cpp @@ -0,0 +1,104 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*****************************************************************************/ + +/** + * @file wirish/stm32f1/boards_setup.cpp + * @author Marti Bolivar + * @brief STM32F1 chip setup. + * + * This file controls how init() behaves on the STM32F1. Be very + * careful when changing anything here. Many of these values depend + * upon each other. + */ + +#include "boards_private.h" + +#include +#include + +#include +#include + +// Allow boards to provide a PLL multiplier. This is useful for +// e.g. STM32F100 value line MCUs, which use slower multipliers. +// (We're leaving the default to RCC_PLLMUL_9 for now, since that +// works for F103 performance line MCUs, which is all that LeafLabs +// currently officially supports). +#ifndef BOARD_RCC_PLLMUL +#define BOARD_RCC_PLLMUL RCC_PLLMUL_3 +#endif + +namespace wirish { + namespace priv { + + static stm32f1_rcc_pll_data pll_data = {BOARD_RCC_PLLMUL}; + __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSE, &pll_data}; + __weak adc_prescaler w_adc_pre = ADC_PRE_PCLK2_DIV_6; + __weak adc_smp_rate w_adc_smp = ADC_SMPR_55_5; + + __weak void board_reset_pll(void) { + // TODO + } + + __weak void board_setup_clock_prescalers(void) { + rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1); + rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2); + rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1); + rcc_clk_disable(RCC_USB); + #if F_CPU == 72000000 + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + #elif F_CPU == 48000000 + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + #endif + } + + __weak void board_setup_gpio(void) { + gpio_init_all(); + } + + __weak void board_setup_usb(void) { +#ifdef SERIAL_USB + +#ifdef GENERIC_BOOTLOADER + //Reset the USB interface on generic boards - developed by Victor PV + gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_OUTPUT_PP); + gpio_write_bit(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit,0); + + for(volatile unsigned int i=0;i<512;i++);// Only small delay seems to be needed, and USB pins will get configured in Serial.begin + gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_INPUT_FLOATING); +#endif + Serial.begin();// Roger Clark. Changed SerialUSB to Serial for Arduino sketch compatibility +#endif + } + + __weak void series_init(void) { + // Initialize AFIO here, too, so peripheral remaps and external + // interrupts work out of the box. + afio_init(); + } + + } +} diff --git a/STM32F1/variants/STM32VLD/wirish/start.S b/STM32F1/variants/STM32VLD/wirish/start.S new file mode 100644 index 000000000..a04f2220a --- /dev/null +++ b/STM32F1/variants/STM32VLD/wirish/start.S @@ -0,0 +1,57 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + + .text + .code 16 + .thumb_func + + .globl __start__ + .type __start__, %function +__start__: + .fnstart + ldr r1,=__msp_init + mov sp,r1 + ldr r1,=start_c + bx r1 + .pool + .cantunwind + .fnend diff --git a/STM32F1/variants/STM32VLD/wirish/start_c.c b/STM32F1/variants/STM32VLD/wirish/start_c.c new file mode 100644 index 000000000..05df0602e --- /dev/null +++ b/STM32F1/variants/STM32VLD/wirish/start_c.c @@ -0,0 +1,95 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * Copyright (c) 2006, 2007 CodeSourcery Inc + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +extern void __libc_init_array(void); + +extern int main(int, char**, char**); + +extern void exit(int) __attribute__((noreturn, weak)); + +/* The linker must ensure that these are at least 4-byte aligned. */ +extern char __data_start__, __data_end__; +extern char __bss_start__, __bss_end__; + +struct rom_img_cfg { + int *img_start; +}; + +extern char _lm_rom_img_cfgp; + +void __attribute__((noreturn)) start_c(void) { + struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; + int *src = img_cfg->img_start; + int *dst = (int*)&__data_start__; + int exit_code; + + /* Initialize .data, if necessary. */ + if (src != dst) { + int *end = (int*)&__data_end__; + while (dst < end) { + *dst++ = *src++; + } + } + + /* Zero .bss. */ + dst = (int*)&__bss_start__; + while (dst < (int*)&__bss_end__) { + *dst++ = 0; + } + + /* Run initializers. */ + __libc_init_array(); + + /* Jump to main. */ + exit_code = main(0, 0, 0); + if (exit) { + exit(exit_code); + } + + /* If exit is NULL, make sure we don't return. */ + for (;;) + continue; +} diff --git a/STM32F1/variants/STM32VLD/wirish/syscalls.c b/STM32F1/variants/STM32VLD/wirish/syscalls.c new file mode 100644 index 000000000..d42536c58 --- /dev/null +++ b/STM32F1/variants/STM32VLD/wirish/syscalls.c @@ -0,0 +1,176 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011, 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/syscalls.c + * @brief newlib stubs + * + * Low level system routines used by newlib for basic I/O and memory + * allocation. You can override most of these. + */ + +#include + +#include +#include +#include + +/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then + * assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by + * the linker */ +#ifndef CONFIG_HEAP_START +extern char _lm_heap_start; +#define CONFIG_HEAP_START ((void *)&_lm_heap_start) +#endif +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((void *)&_lm_heap_end) +#endif + +/* + * _sbrk -- Increment the program break. + * + * Get incr bytes more RAM (for use by the heap). malloc() and + * friends call this function behind the scenes. + */ +void *_sbrk(int incr) { + static void * pbreak = NULL; /* current program break */ + void * ret; + + if (pbreak == NULL) { + pbreak = CONFIG_HEAP_START; + } + + if ((CONFIG_HEAP_END - pbreak < incr) || + (pbreak - CONFIG_HEAP_START < -incr)) { + errno = ENOMEM; + return (void *)-1; + } + + ret = pbreak; + pbreak += incr; + return ret; +} + +__weak int _open(const char *path, int flags, ...) { + return 1; +} + +__weak int _close(int fd) { + return 0; +} + +__weak int _fstat(int fd, struct stat *st) { + st->st_mode = S_IFCHR; + return 0; +} + +__weak int _isatty(int fd) { + return 1; +} + +__weak int isatty(int fd) { + return 1; +} + +__weak int _lseek(int fd, off_t pos, int whence) { + return -1; +} + +__weak unsigned char getch(void) { + return 0; +} + + +__weak int _read(int fd, char *buf, size_t cnt) { + *buf = getch(); + + return 1; +} + +__weak void putch(unsigned char c) { +} + +__weak void cgets(char *s, int bufsize) { + char *p; + int c; + int i; + + for (i = 0; i < bufsize; i++) { + *(s+i) = 0; + } +// memset(s, 0, bufsize); + + p = s; + + for (p = s; p < s + bufsize-1;) { + c = getch(); + switch (c) { + case '\r' : + case '\n' : + putch('\r'); + putch('\n'); + *p = '\n'; + return; + + case '\b' : + if (p > s) { + *p-- = 0; + putch('\b'); + putch(' '); + putch('\b'); + } + break; + + default : + putch(c); + *p++ = c; + break; + } + } + return; +} + +__weak int _write(int fd, const char *buf, size_t cnt) { + int i; + + for (i = 0; i < cnt; i++) + putch(buf[i]); + + return cnt; +} + +/* Override fgets() in newlib with a version that does line editing */ +__weak char *fgets(char *s, int bufsize, void *f) { + cgets(s, bufsize); + return s; +} + +__weak void _exit(int exitcode) { + while (1) + ; +} From 6266342b1deea3d18dc4b6e9087b160c3807abc7 Mon Sep 17 00:00:00 2001 From: Phisatho Date: Fri, 18 Nov 2016 02:33:59 +0400 Subject: [PATCH 015/307] Update boards.txt --- STM32F1/boards.txt | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 8cbd57b63..95a5f8635 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -580,3 +580,34 @@ genericGD32F103C.menu.cpu_speed.speed_96mhz.build.f_cpu=96000000L genericGD32F103C.menu.cpu_speed.speed_72mhz=72Mhz (compatibility) genericGD32F103C.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +########################### STM32VLD to FLASH ########################### + +STM32VLD.name=STM32VLD to FLASH +#STM32VLD.vid.0=0x1EAF +#STM32VLD.pid.0=0x0004 + +STM32VLD.build.vect=VECT_TAB_ADDR=0x8000000 +STM32VLD.build.core=maple +STM32VLD.build.board=STM32VLD +STM32VLD.build.variant=STM32VLD +STM32VLD.build.ldscript=ld/jtag.ld + +STM32VLD.build.family=cortex-m3 +STM32VLD.build.f_cpu=24000000L +STM32VLD.upload.use_1200bps_touch=false +STM32VLD.upload.file_type=bin +STM32VLD.upload.auto_reset=true +STM32VLD.upload.params.quiet=no + +STM32VLD.build.cpu_flags=-DMCU_STM32F100RB +##---------------------------- UPLOAD METHODS --------------------------- + + +STM32VLD.menu.upload_method.STLinkMethod=STLink +STM32VLD.menu.upload_method.STLinkMethod.upload.protocol=STLink +STM32VLD.menu.upload_method.STLinkMethod.upload.tool=stlink_upload +STM32VLD.menu.upload_method.STLinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG + + +################################################################################ From 69413ee56e062a24de04bdae0d3385fb7f66248f Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 27 Nov 2016 10:10:42 +1100 Subject: [PATCH 016/307] Update InternalTempSensor.ino Fixed issue caused by https://github.com/rogerclarkmelbourne/Arduino_STM32/pull/132/files --- .../examples/General/InternalTempSensor/InternalTempSensor.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/InternalTempSensor/InternalTempSensor.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/InternalTempSensor/InternalTempSensor.ino index e207a3166..d6000cdf8 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/InternalTempSensor/InternalTempSensor.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/InternalTempSensor/InternalTempSensor.ino @@ -19,7 +19,7 @@ void setup_temperature_sensor() { // temperature sensor from power down mode. Do this first 'cause according to // the Datasheet section 5.3.21 it takes from 4 to 10 uS to power up the sensor. - regs->CR2 |= ADC_CR2_TSEREFE; + regs->CR2 |= ADC_CR2_TSVREFE; // 2. Select a sample time of 17.1 μs // set channel 16 sample time to 239.5 cycles From a6999719d77773f674e7a525eefd4007cc90c254 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 28 Nov 2016 17:57:42 +1100 Subject: [PATCH 017/307] STM32F4 add Export compile binary option --- STM32F4/platform.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index 91aeca91e..7d5395991 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -96,6 +96,10 @@ recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build recipe.size.regex=^(?:\.text|\.rodata|\.ARM.exidx)\s+([0-9]+).* recipe.size.regex.data=^(?:\.data|\.bss|\.noinit)\s+([0-9]+).* +## Save Compiled Binary +recipe.output.tmp_file={build.project_name}.bin +recipe.output.save_file={build.project_name}.{build.variant}.bin + # Uploader tools # ------------------- From dbcba3e01225222a7dad284fcbe819d653a63dd7 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 28 Nov 2016 19:47:43 +1100 Subject: [PATCH 018/307] STM32F4 fixed issue with stlink uploads, and added windows driver bat for STM Virtual com ports --- STM32F4/boards.txt | 2 +- STM32F4/platform.txt | 26 ++++++-------------------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 453d520db..7577d1949 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -3,7 +3,7 @@ ############################################################## discovery_f407.name=STM32 Discovery F407 -discovery_f407.upload.tool=stlink +discovery_f407.upload.tool=stlink_upload discovery_f407.upload.protocol=stlink #discovery_f407.upload.use_1200bps_touch=false diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index 7d5395991..99ae55549 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -117,28 +117,14 @@ tools.maple_upload.upload.pattern="{path}/{cmd}" {serial.port.file} {upload.altI # Generic STM32 upload via serial to Serial Port 1 (pins PA9 and PA10) - note. Boot0 line needs to high on board reset to enable upload via serial # at the end of the upload the program is automatically run, without the board being reset -tools.serial_upload.cmd=serial_upload -tools.serial_upload.cmd.windows=serial_upload.bat -tools.serial_upload.cmd.macosx=serial_upload -tools.serial_upload.path={runtime.hardware.path}/tools/win -tools.serial_upload.path.macosx={runtime.hardware.path}/tools/macosx -tools.serial_upload.path.linux={runtime.hardware.path}/tools/linux -tools.serial_upload.path.linux64={runtime.hardware.path}/tools/linux64 -tools.serial_upload.upload.params.verbose=-d -tools.serial_upload.upload.params.quiet= -tools.serial_upload.upload.pattern="{path}/{cmd}" {serial.port.file} {upload.altID} {upload.usbID} "{build.path}/{build.project_name}.bin" - -# STLINK/V2 - -tools.stlink.cmd=stlink_upload -tools.stlink.cmd.windows=stlink_upload.bat +# stlink upload +tools.stlink_upload.cmd=stlink_upload +tools.stlink_upload.cmd.windows=stlink_upload.bat tools.stlink_upload.path.windows={runtime.hardware.path}/tools/win tools.stlink_upload.path.macosx={runtime.hardware.path}/tools/macosx tools.stlink_upload.path.linux={runtime.hardware.path}/tools/linux tools.stlink_upload.path.linux64={runtime.hardware.path}/tools/linux64 -tools.stlink.path.linux={runtime.hardware.path}/tools/linux/ -tools.stlink.path.macosx={runtime.hardware.path}/tools/macosx/ -tools.stlink.upload.params.verbose=-d -tools.stlink.upload.params.quiet= -tools.stlink.upload.pattern="{path}/{cmd}" {serial.port.file} {upload.altID} {upload.usbID} "{build.path}/{build.project_name}.bin" +tools.stlink_upload.upload.params.verbose=-d +tools.stlink_upload.upload.params.quiet= +tools.stlink_upload.upload.pattern="{path}/{cmd}" {serial.port.file} {upload.altID} {upload.usbID} "{build.path}/{build.project_name}.bin" From 794d078de080054ea39095f8980bdcc2de9f3020 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 29 Nov 2016 15:17:01 +1100 Subject: [PATCH 019/307] fixed problem in last 2 commits with windows bat for STM32 com --- drivers/win/install_STM_COM_drivers.bat | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 drivers/win/install_STM_COM_drivers.bat diff --git a/drivers/win/install_STM_COM_drivers.bat b/drivers/win/install_STM_COM_drivers.bat new file mode 100644 index 000000000..eb57c2b00 --- /dev/null +++ b/drivers/win/install_STM_COM_drivers.bat @@ -0,0 +1,8 @@ +@echo off + +echo Installing STM Serial driver... +"%~dp0wdi-simple" --vid 0x0483 --pid 0x5740 --type 3 --name "STM Serial" --dest "%~dp0maple-serial" +echo. + +pause + From 71a1121c9f4f9102f6ec107ae6986dfbd2e51cc3 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 29 Nov 2016 15:18:16 +1100 Subject: [PATCH 020/307] Fixed issue with tone files not actually being added to the repo in a previous commit --- STM32F1/cores/maple/tone.cpp | 194 +++++++++++++++++++++++++++++++++++ STM32F1/cores/maple/tone.h | 28 +++++ 2 files changed, 222 insertions(+) create mode 100644 STM32F1/cores/maple/tone.cpp create mode 100644 STM32F1/cores/maple/tone.h diff --git a/STM32F1/cores/maple/tone.cpp b/STM32F1/cores/maple/tone.cpp new file mode 100644 index 000000000..5fd4a3978 --- /dev/null +++ b/STM32F1/cores/maple/tone.cpp @@ -0,0 +1,194 @@ +/////////////////////////////////////////////////////////////////////// +// +// tone(pin,frequency[,duration]) generate a tone on a given pin +// +// noTone(pin) switch off the tone on the pin +// +// setToneTimerChannel(timer,channel) force use of given timer/channel +// +/////////////////////////////////////////////////////////////////////// + +#include "Arduino.h" +#include + +// define default timer and channel +#ifndef TONE_TIMER +#define TONE_TIMER 4 +#endif +#ifndef TONE_CHANNEL +#define TONE_CHANNEL 4 +#endif + +#define PinTimer(pin) (PIN_MAP[pin].timer_device->clk_id-RCC_TIMER1+1) +#define PinChannel(pin) (PIN_MAP[pin].timer_channel) + +// if USE_PIN_TIMER is set, the PWM timer/channel is used for PWM pins +#define USE_PIN_TIMER + +// if USE_BSRR is set the tone pin will be written via the fast BSRR register +// instead of using the slow digitalWrite() function in the interrupt handler +#define USE_BSRR + +// construct static timer array ( +HardwareTimer TTimer1(1), TTimer2(2), TTimer3(3), TTimer4(4); +#ifdef STM32_HIGH_DENSITY +HardwareTimer TTimer5(5), TTimer6(6), TTimer7(7), TTimer8(8); +#endif +HardwareTimer *TTimer[4] { + &TTimer1,&TTimer2,&TTimer3,&TTimer4 +#ifdef STM32_HIGH_DENSITY + ,&TTimer5,&TTimer6,&TTimer7,&TTimer8 +#endif + }; + +uint8_t tone_force_channel = 0; // forced timer channel +uint8_t tone_force_ntimer = 0; // forced timer + +HardwareTimer *tone_timer = TTimer[TONE_TIMER]; // timer used to generate frequency +uint8_t tone_channel = TONE_CHANNEL; // timer channel used to generate frequency +uint8_t tone_ntimer = TONE_TIMER; // timer used to generate frequency + +bool tone_state = true; // last pin state for toggling +short tone_pin = -1; // pin for outputting sound +short tone_freq = 444; // tone frequency (0=pause) +uint32_t tone_nhw = 0; // tone duration in number of half waves +uint16_t tone_tcount = 0; // time between handler calls in 1/36 usec +uint16_t tone_ncount = 0; // handler call between toggling +uint16_t tone_n = 0; // remaining handler calls before toggling +uint32_t tone_next = 0; // counter value of next interrupt + +#ifdef USE_BSRR +volatile uint32_t *tone_bsrr; // BSRR set register (lower 16 bits) +uint32_t tone_smask=0; // BSRR set bitmask +uint32_t tone_rmask=0; // BSRR reset bitmask +#endif + + +//////////////////////////////////////////////////////////////////////////////// +// timer hander for tone with no duration specified, +// will keep going until noTone() is called +void tone_handler_1(void) { + tone_next += tone_tcount; // comparator value for next interrupt + tone_timer->setCompare(tone_channel, tone_next); // and install it + if(--tone_n == 0){ + tone_state = !tone_state; // toggle tone output + +#ifdef USE_BSRR + if(tone_state) + *tone_bsrr = tone_smask; + else + *tone_bsrr = tone_rmask; +#else + digitalWrite(tone_pin,tone_state);// and output it +#endif + + tone_n = tone_ncount; // reset interrupt counter + } +} + +//////////////////////////////////////////////////////////////////////////////// +// timer hander for tone with a specified duration, +// will stop automatically when duration time is up. +void tone_handler_2(void) { + tone_next += tone_tcount; + tone_timer->setCompare(tone_channel, tone_next); + if(--tone_n == 0){ + if(tone_freq>0){ // toggle pin + tone_state = !tone_state; +#ifdef USE_BSRR + if(tone_state) + *tone_bsrr = tone_smask; + else + *tone_bsrr = tone_rmask; +#else + digitalWrite(tone_pin,tone_state);// and output it +#endif + } + tone_n = tone_ncount; + if(!--tone_nhw){ // check if tone duration has finished + tone_timer->pause(); // disable timer + pinMode(tone_pin, INPUT); // disable tone pin + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// play a tone on given pin with given frequency and optional duration in msec +void tone(uint32_t pin, uint32_t freq, uint32_t duration) { + tone_pin = pin; + +#ifdef USE_PIN_TIMER + // if the pin has a PWM timer/channel, use it (unless the timer/channel are forced) + if(PinChannel(tone_pin) && !tone_force_channel){ + tone_channel = PinChannel(tone_pin); + tone_ntimer = PinTimer(tone_pin); + } else +#endif + { + // set timer and channel to default resp values forced with setToneTimerChannel + tone_ntimer = tone_force_channel?tone_force_ntimer:TONE_TIMER; + tone_channel = tone_force_channel?tone_force_channel:TONE_CHANNEL; + } + + tone_timer = TTimer[tone_ntimer-1]; + tone_freq = freq; + tone_nhw = 0; + tone_next = 0; + + tone_timer->pause(); + + if(freq > 0 || duration >0 ){ + uint32_t count = 18000000/freq; // timer counts per half wave + tone_ncount = tone_n = (count>>16)+1; // number of 16-bit count chunk + tone_tcount = count/tone_ncount; // size of count chunk + if(duration > 0) // number of half waves to be generated + tone_nhw = ((duration*(freq>0?freq:100))/1000)<<1; + else // no duration specified, continuous sound until noTone() called + tone_nhw = 0; + + pinMode(tone_pin, PWM); // configure output pin + pinMode(tone_pin, OUTPUT); // configure output pin + +#ifdef USE_BSRR + // Set up BSRR register values for fast ISR + tone_bsrr = &((PIN_MAP[tone_pin].gpio_device)->regs->BSRR); + tone_smask = (BIT(PIN_MAP[tone_pin].gpio_bit)); + tone_rmask = tone_smask<<16; +#endif + + // Set up an interrupt on given timer and channel + tone_next = tone_tcount; // prepare channel compare register + tone_timer->setMode(tone_channel,TIMER_OUTPUT_COMPARE); + tone_timer->setCompare(tone_channel,tone_next); + // attach corresponding handler routine + tone_timer->attachInterrupt(tone_channel,tone_nhw?tone_handler_2:tone_handler_1); + + // Refresh the tone timer + tone_timer->refresh(); + + // Start the timer counting + tone_timer->resume(); + + } else { + + // detach handler routine + tone_timer->detachInterrupt(tone_channel); + // disactive pin by configuring it as input + pinMode(tone_pin, INPUT); + + } +} + +//////////////////////////////////////////////////////////////////////////////// +// disable tone on specified pin, if any +void noTone(uint32_t pin){ + tone(pin,-1); // it's all handled in tone() +} + +//////////////////////////////////////////////////////////////////////////////// +// set timer and channel to some different value +// must be called before calling tone() or after noTone() was called +void setToneTimerChannel(uint8_t ntimer, uint8_t channel){ + tone_force_ntimer = ntimer; + tone_force_channel = channel; +} diff --git a/STM32F1/cores/maple/tone.h b/STM32F1/cores/maple/tone.h new file mode 100644 index 000000000..cf2705160 --- /dev/null +++ b/STM32F1/cores/maple/tone.h @@ -0,0 +1,28 @@ +/* + Copyright (c) 2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#pragma once + +#ifdef __cplusplus + +#include "Arduino.h" + +void tone(uint32_t _pin, uint32_t frequency, uint32_t duration = 0); +void noTone(uint32_t _pin); + +#endif From 20fa7b4f302b2630d96be07161f64f0fba1732c2 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 29 Nov 2016 15:52:16 +1100 Subject: [PATCH 021/307] Fixed issue with tone not compiling --- STM32F1/cores/maple/tone.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/cores/maple/tone.cpp b/STM32F1/cores/maple/tone.cpp index 5fd4a3978..bfd4c0386 100644 --- a/STM32F1/cores/maple/tone.cpp +++ b/STM32F1/cores/maple/tone.cpp @@ -182,7 +182,7 @@ void tone(uint32_t pin, uint32_t freq, uint32_t duration) { //////////////////////////////////////////////////////////////////////////////// // disable tone on specified pin, if any void noTone(uint32_t pin){ - tone(pin,-1); // it's all handled in tone() + tone(pin,-1,0); // it's all handled in tone() } //////////////////////////////////////////////////////////////////////////////// From a1f154bc3772ebf7c8f7e1afa4a69c4289406492 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Wed, 30 Nov 2016 09:45:16 +1100 Subject: [PATCH 022/307] Added newer dfu-util for F4 DFU testing --- tools/win/dfu-util-0.9-win64/README.txt | 26 ++++++++++++++++++ tools/win/dfu-util-0.9-win64/dfu-prefix.exe | Bin 0 -> 178765 bytes tools/win/dfu-util-0.9-win64/dfu-suffix.exe | Bin 0 -> 179276 bytes .../dfu-util-0.9-win64/dfu-util-manual.pdf | Bin 0 -> 10602 bytes .../dfu-util-0.9-win64/dfu-util-static.exe | Bin 0 -> 799602 bytes tools/win/dfu-util-0.9-win64/dfu-util.exe | Bin 0 -> 290852 bytes tools/win/dfu-util-0.9-win64/libusb-1.0.dll | Bin 0 -> 638611 bytes 7 files changed, 26 insertions(+) create mode 100644 tools/win/dfu-util-0.9-win64/README.txt create mode 100644 tools/win/dfu-util-0.9-win64/dfu-prefix.exe create mode 100644 tools/win/dfu-util-0.9-win64/dfu-suffix.exe create mode 100644 tools/win/dfu-util-0.9-win64/dfu-util-manual.pdf create mode 100644 tools/win/dfu-util-0.9-win64/dfu-util-static.exe create mode 100644 tools/win/dfu-util-0.9-win64/dfu-util.exe create mode 100644 tools/win/dfu-util-0.9-win64/libusb-1.0.dll diff --git a/tools/win/dfu-util-0.9-win64/README.txt b/tools/win/dfu-util-0.9-win64/README.txt new file mode 100644 index 000000000..5aa2e67ed --- /dev/null +++ b/tools/win/dfu-util-0.9-win64/README.txt @@ -0,0 +1,26 @@ +dfu-util 0.9 + +These binaries are for Microsoft Windows 64-bit + +They were built using MinGW-64 from MSYS2 with gcc 5.3.0, +for build instructions please see: +http://dfu-util.sourceforge.net/build.html + +Source code: +https://sourceforge.net/p/dfu-util/dfu-util/ci/v0.9/tree/ + +dfu-util.exe requires libusb-1.0.dll. The shipped libusb-1.0.dll +is built from libusb 1.0.20 and can be replaced with another +version if desired. + +dfu-util-static.exe has the libusb 1.0.20 code embedded and runs +without any libusb-1.0.dll. + +Notes: +1. To work around a bug in gcc/mingw, a small patch was applied, see + https://sourceforge.net/p/dfu-util/tickets/13/ +2. The dfu-util-static.exe includes libusb that has been patched + to work around a silicon bug in STM32F42X devices: + https://github.com/axoloti/axoloti/blob/master/platform_osx/src/libusb.stdfu.patch + +2016-02-11 Tormod Volden diff --git a/tools/win/dfu-util-0.9-win64/dfu-prefix.exe b/tools/win/dfu-util-0.9-win64/dfu-prefix.exe new file mode 100644 index 0000000000000000000000000000000000000000..5ae088804979feab4339592abc9c90e694d2b516 GIT binary patch literal 178765 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 literal 0 HcmV?d00001 diff --git a/tools/win/dfu-util-0.9-win64/dfu-suffix.exe b/tools/win/dfu-util-0.9-win64/dfu-suffix.exe new file mode 100644 index 0000000000000000000000000000000000000000..e54eb25d97c6508377c8c808a261e98292560a02 GIT binary patch literal 179276 zcmeFa30Pc3);C@kZa2-A?ifIfiMA0U(LmS(BvBd~(wHU?Ae%;^X&QoI3*DU%jY@3L z^t5Okbw+12X52!gTRWo1oV{ZVdouK;bGAv= zm(HnJTJJQrv^LkZ+8T{^TT@fB%UJC&wz`{)^-V@|Nx8AHxyF$c85tHQM3)vYR&)Jn z?4i!57cgTG8yCXZF?Jpc4+=Vi%>+{$t}w<7(SQa@luI`y9Hi(?sD=TdUmu{Bv3F{N zdAS%faJ%Rw$G1*wakMfTHG zGUsd10F;7{%CT)UAIg!X=y(4@#8-iD5#Y{K@MWhWg0XfTZr$Lcz7hi%@S}1BpuYtF z7uUdU{n=*5YLoP5D@JSae41eKX+A<9N$Kw;gJwWK20DZc1R{?HA|=%jwI-|h5?31% ztwEGG`o5bP^Rdou*TU^&CI0+ONbKzy#Ls_iEJ=^vhGZ6R5JKzKkVZygp8-;45Xr~9 z2EQqaLYm*%81rOFE=NkY#q(^!?(L+b|5J3EqkpVjXR%vmTBN;evS?t@ce;^{eyb(6 zcFlL;lB<9~kiN4LRL?dl@EHB|Wk7suPXI~j@7$-qeb+!PB~t67D{@~9py1EKb~gk>~_Cz@nxK-LPnqYw4M`^zGD&?eOi>aV>v>-ny0$B+XIb9)40_6nIaG6 zNJLV!9wfOU3R1dvAeN=<8|?GfP}6rsel`))j_CU~5La{yF?)mj{s}zJ_79lI68K^N zbW}cs9jl~x&8xrR*l9wvBK`7|eMh79XS0re*Hq7YlIuKf78Xypq~Bs_KWV(?W0QBU z$#YC!9=xT_QitV2j^?Vd;^$z&k;VKI{KeTwCL!&$b2K`N!!dO$@ zviKqn`^O{J($ykaykGbiP}pmJ2c?WUT;xTrJr>Vy$)5?jDf{hfUoP@|rn|V;oQN!m zGx0J=^RuzMBEGwvKy)5RzDO(XRN-EO)u)-pk?3S%{wj^4qY?CK#^Da*=y)B%e9`~# z0qb{%`_~~ipXNAF%bI7&x-PxE@-ovB(`CDd>qo!U99K1MMO-4Hym3y6^KeRVK8 zZ9QWHnM7L$8T%9&n*e&Xl&^m)#;$>@5MPk;*}&`n931ra`13(q2Y$t$eM8LLoB6{q zQu;UlFgUo5I#vQYR_>4e-*cQFvYG!)J#L-D{Od;i=3BfU1=bJY$kS-?%-Tp(I9D>P z{I?gAm0xx@Di%gG4IbcDP|(PO(WQbI3buA680js#>)mS8-q}n<~OMCqwkQW zN`AvCQ27R6@k(H2Y?Xpyvw&_r*J9yoMqvLPSrGlg&w2u1@&!<^W(Yz2I!wTc{ zzKkvz9kZSYJ(jN7k|p~e7JZ%{e!voXf=?DKdb8isB|nqWk9)i2+ixtM6K7cTg$FG& zCVrQLVy=XiN4z8<@;eSDz7KNBK1=qYGx|O6PxS0Eu8q=JJUx=d^W7P4Aq+0@5#sKO zTs@c4u8uSA(L4?cNOHTS=SUD`<^8e<4LWHWsGjf7aGg&6kW3Rz$1K^AUhuoyj}Aae z1())r$}sTvB$yUzZPn)hX^ zcbD1wiYwXFRWxYzb{BV9brK4ZS&o5^r}Q35MJckjuGM5YP62!qjc??NZh`NxqyzKIMN9LC^lFp^t}5k_+sdHwzdM027?5KZ1M zAk<$W=%rQL$t(G10^bfZVE#OW)~y>FFJLDHDgCCWU`c~J>GllWYQ4*+TD&jRdRHa& z()bE@2`(J3O8>C%| z%yNTkGe(u1OZiaCN6W9EzvrZ0f73q^Fwxk_Gqc!tp^@j!1J>n|j&O0r-kZ!)d^EQO^TjuKZ zTNaD~V>lRl-Z%8T7c0FAQe@BjI_Y`DM@Y|S@A8(%={xN_L19SG5uJCJeoLWN>Vq>} zeF+-Mo1b9z1|nVF=W4@zxgxNIz(uY zlMH!MA4HrFLNEwHDq$)J7(HV+j&Te;N%{^KHJA@|O~WeY152Qm=lzS?Pmb4j+>EfV zJj(3Lk2OhsrtH1?n_op0cJ}K#-vRXe1N@QDLbZNAws7l!t@vMszMb9PJ^HnOM#aNc zw^98gVy_a>t6!Ul=EXE3r5~MX6Q}As_kqi5|J-|(fyUejP`P3C3By7sv3PfZ{|dy+ zAUm={i1!QB`4aRK|E(ayD5%wMHel#5d47PFry(^$LHdq)2%*-f$e!;)^f$|Bb6yZL zkBFjibSh{x>3J8bpiTUXkmNL!x?>z7eC0+DRa7Wd)Je=f|HvD%G^piZ` zA)(Ks;ntzy0;^_V+WD}XHVGE=AT;aEHzFnL&5xqBmwsz$P|y2e-tq}M2n{Ze&3;~g z(+Xrba2amu{1x&g-aHrSJ8g;(s#OTVFvxb$?dWdg{Ynw);+ZMDE(X5CXovcl2^u<6 zS80{S`R?lSAQ(Bg>(yB8P@&rI?SA zoY#(S8H`>FHfU1}0vuotO;NqQT&Wjkt4f{lKggrcIBdYanVtM4iL@w`hNPuEbo(Dm`iGK)?ml_~1 zQk54nB#%Y|rIdS-cJQ@)i_Ly z7x?+W;{+ZLJi*enB+gjmJqY?_K|c?U`Of3y7OY+Q5vJ|%sjTM{o%f5i=D4YAE8-Hp zyLvt`Adp0XSOlhdclqlm#TWjA@u&)T24ym+%)fm3Myx|!ZJrbGv}d5OzI?+4`LWh6 zT37eth76c#JNZ3AVfKunFvjt?opTXxQwMQN9PC>APYe^9LDU-XBqB~5)LVMIU-X;^ zg>sWH-UFQLf9o6W)EU~09uXW%rH{#;CRdi-Ii zIx~sl%7Gm3?ExCsGhpcP$5JKnYBA-#Eu|PKv8qd)<5vz;_0|pS4;BGX22lSv4j|CHz*Z&3l{XjJ;OrgD50NOjC zVNe0fcw%{(SS|ufK>Fo6g+GiK{tO116Cpt|OqwDLEdSU@58osJfDQ zXN=6g9s+LU)14E8d}GJ8g4>0E5a}$w$XH@nMhw2lD1$h}&%NHlRMS-aGkvyIchJ3*^5ld8`CW;7MrKqc1oy8liAr#w1A5eSj4)9Nk z{lHAWDh3B_1`K+4yQXx$< zj%DM_11LeC`-`Ky0_0;q@G7!Hm-Z{ZlJC`A51i&8M?0tpmcjVVH_<{!{8GBrk|_kS zo96j67k>EgROq-Z_1?pYcf!jKxeH77ZY(;#ea+&X_!4n=p3PNuMs{O=p$kni7=33K z9ICH|f|nzR?x?^$gVEOmC$40y>Y{HUzO))3Ut0L`fu6ZpQ~qX2dBfuUrzPd@mUH%4 zvfp)~VUJn9?X!3@=1`7aO~t5;hwOdZin6FcvDa?q1Dj2vOspL|-BZ)@4-F z-hyKYwkW|9gVDbxFiZE!bqT_zGen?9Ze^R{=~> zlZW6yo7ySKemy6HU8i^UyT&P78DybD_V0fxLOc&qELXKx&AD^n=dyxa+Flj}g)wt? zjl(?Nl{+Nl(#v`KPdwvJ$~)sU0@+`=4r5J>N^}LGpLllbKyrT;n8sg(9FJ}n`?;g- z5&AAdRdiD2K*-cD^@fhPb|~Pbu205h@m9noe5oH>5toenlDI6~&2hPdeKZsZh!ZD>dt zC%j=8&nA4yF#Z?9t-=7_`e0;#w|MuW)dK5h?+6B7KUo&I-bLiaQP+#Cu=gq}>VK)? ziElw+V4U|No6$4x_1Gk__*`(;4V(#e;(ZhQx&CNG_`7i%J-!C)&n&Xo6CYm<0hI3n ztG5?R%A3AIqre{S1|55Eo^Ci?nA8icQC2wK0$f(92e|&ajbQZbf}8A)&HluVLF17B zSUA#BcYapi@d3%{YG`B@Y)%(>KeGlW7C~l_x4>ZPEkGpnOOC|U$X5{;VcM2V?ATzS zaR@xfRWqJc^H~#ggVE=DxnP&eXO1&>m3DjHe+Ikme%W*6dskeMcfcAP`6)brX_08?5q8EJA9GKhYNN zr^u7`AWWCjUSd0xg|nKBXmU~hc~pIOU?VaY*K;s+c>W{D{5w!f7|+tEllUgiBrxS! z_&B&7`jP3Nk7|yRM}iZdg5mT;$Th#lJ^Y%+esH8%DY?Ib0r z>X6Wf{hV@G$Pugbp64W<2rzwz34-+32jT8HY1DUI#RIwe&dU)fn$m6ceq!~0j;&2g zu!L=7Dv-CJ&p)3QElQTH5BfA=C|t^0DaWDYO|+_q0{R=MJGfu8`VxP*9v%1$xL9~1 z&mNfM?${X_Z>&PTm{mg#29jXS3&4E_c;$C2J_~l}xW#!-(&Hyc?KlnUz~~+TS1~qg zeDnPlUvZz=C&!uwUqAZrkpJd&Kurx5`l#i*uI}R{H*J%-@+Xl!s^Gm~iOSJM3$E<1 zTHhX+jwh7Uo04-hw_vGyg5$qmhK1;?OTgi6HG&5pRHV;A#>P zJn_~xDr96$9@S4i+B9G1E7keUU;+8hAp5frR_8l3{`sU?SR-_=w9mr$-tD|<7Mc}R z9EmE{-|!alnFW2@^&LM@P(yK@uOXPyza2e*`Muchfc0VvD}@?`T1STfj~wh14@K4a z$Sf>n!GKL%wlaSf7AipQC%LyG=)M**$)@}nLMFE6TrNvzKd)xjW*#}%KO{4k&BCrh zx63gLyCU80TqLJ@@gI*-Rf2oq1LZ0nLF(|KVaPsa!4G%4dS_w2(Cs>FXdK?ncQzDV z9)>Xg{_h3{MYgJrw}?!jqrP(yEF&O|8*#`=0#&gynp7z9T*3KD{Cj9Kh01I4B8B<_ zS&&$-49!1{{>MX56z_9BP2URglJ0m*=VvY>8r5PVzqAEZR6FypLKD&4AWAKbQOrhZ ze5dhpCE~lH?*;#M>Q&aR_~YolDaS3|!+1cv-AGmDeWPf~r}Vhk`^M3vJt3iHZ=GyG zXZ4jvP(SyUe;tg;J^b?&zs1w5^XC8HEk9xL{L|=4r3aR7E!V;QoTc-)zQc)X@P5hr zJDycQq=dj%T3iag`26{teWV@QBa4Qs8KOd*A!u%e3Fgf1&?^Re%v1P z9X^uDZQ@;cnT2j%8W-l^G!z*xwG18+pNE?sM_^eLX^wGyO|A9!mbC>5T@s&q62+B zPAReb<^Zca4B|i-7>DOK0XEq~v7e5#$UhV9;1G@X%{xK!KZ`AvfoBk*IuZfZ=V55% z_h4Xy(Ut8`#5eItAQp_OX%=7Nr<^p)0kF;&KKMFqV7>u^9s^@>h0;zsOo&#Iml}}7 z{WfIXPRaSouktc1*{YFL89!*?#^Y3<=2CEYU%|u(g2H$sU0#Wq+>TfVGw1zcG4w{Y zVSVhH>CLiuTWESPlPkI7T2fM@r(C)s69{-GN*v@H2BW`1H1GV>lXi2HIeM3pzsUU^ zScvxpWUUu`>U;s>4k2zZdZCiVqr#NN`wZEyxx?mqY5k>o+1 zWc6^i5JwhITFx_Ayrl;JrKfRSS98uXa30-n@s%R32g~h3P>;Sn)SvkC1#~vniboB> z?lCxb0S1~u+zsNen?QZ}G^dFu_+~uqmw}<k5R&uv)C z*RILNaidTyqm=YVU#40awttaczZE-JU1lj(zqLqv6%KRHc+Wf=vGd^GoOlCd?{VKCI{+_ zr}-245m*z}*8$i%i}zK30!oJ(dedUhL)muex8^~&B|*?F4+m>pyF7mACbwI&HR#+enQYfYW zkLcIP=+h#5?o23Tozhbzb(`=+NsC)<6lNk_W)|yu(enuuiTX7vsV_nJL#iulb`PF| zx9Vtw$bPkT!cbiyM>QMOp0SrOOfpl2(SA~NJoKY>q}sxO1HFWNsvn)Ao}cPRztwD@ zNA!HjF4CiXAIeda@-lzvgy;n=1UWx^D$$DhU3Dbg48sS(5Ss6LQBn$p8{4K-I_`V*Kz zs>S)4=1LjaT#7$AMSEcjaLBfKHon}rZ~J=uXNx>h%cJ$1=+5EwjU8;1aRwSKz@85I z7Y->nXQov;JNhv?yHY+Abrw%|l+S`?k~;*`7qnw9R!`S{WcFDiilsxU z`6>QnUa4gkot34nl-SlYENcch<_Tq%L>}U?EB|Jh(qjQ}(c%%i1H! z!3Nst;F}zHl7txSVi5FY`8Qz03KPm#GYQafloS4UXl;z)KFaUmkwiU4tL~|Y@Hcas z`XugQkZ5lzncSgip|T(s^9bmXNlO7=;<*I8H^xy7TD-T#-2u1*P8G|)Jyy^kLeT8H zKW-x+He@iq58#*$LNmRZuVRqtn_;9bl%$`YZhKAhtKBLL^H$e)J65fAS1U?krTI(dxVE2qwfx;<^Gwwt7z@OaBt&f@#3J zRy+}3L^)>n>O0;-dbFr}m&x-FWN;(UBKvbVzNE2A$FMrfF8Av@XnYQkOZn2c2>I>} z!~M;SjgqO@2yk6(_G!*Wx#(2KSr%UhuaNev9E{Fgkq0tp>&EXr>7NQ;*{k^^8j|qa zb`fr)PX^WR0^^O z(#+n!TkLzNEJe~Dldn*R(qC!utd2`&u2x^^Hsi!_?@qILA0A<)35c|M9-P~Wi!Vxy+_@43vHDOIWLKT_RH4z!NPNEwbAsU} zqf|0`C=!}l-}xf4-v-yq2F^nWwI4fhmI!z?-_hLt zPN1~#={$-6w&SqVb{p?Qp6(#8=1rOs+tEj?zL~qM-dTTNh9o7VCpd9-714aQJFpj( zPU5|q`$#I;hBBWT)nBuU@ih4*er~XXXG2|+x~jh8ZEPZ#eUWuYPiLt*P6O_lH3KNR z#2G+*(JPTXZFq$PqvBFu*Kc7n6LExwr`AOB)R?&54}9hY`i{E*J^l+G`iH(_EP|c= zn1jYa4Es3y-pq4=Y)8MANJDoz+2bWJyVPnv0Ko1aejJ9Z6x87@Sc zy(fIpzr6y1DaU#>g`kjD-Y=%~cq4Ox!IR)w4gwekqOg6KPHFU8E-dJPr5;df(M|%|!kd`);c*z1P%!VWQQWaT4=#eP=qP7vOZ4#06|5E}!B&cO)XQ z|3zh!K;ID#Mx0N68mVxg2_^a4~nNHEZa z-oWPbvZfyS?ScvQ~e&EzL+UWYFV%g=LxDd&Y?!|iyfOz=ny5FlY z6X`BA%6SOzM(JDzeT%wQNT&9|L_9W&K?EEUwJQ7^^)H~mqN=iMw1~50r}w(9CT4xd z6W}_octF`zpVAF#j%&QyY9{^8H~h~~Gs5TbDz(B+Hb9hBI4GR$Qhf&8ztMjQYJn8R zqx@N4;S8z8JL?84Huzo_4EHL8$#AVO76?D=`923W;{a9Pu?u27-$SP^(p=ahCIuIX z{5$?YMHnv8v(%8^FVuHFMU}^mXokLX6A;DxUV<3RjUgMuc=mH%O&Dc!^TR}r4ni31 zTFO<_d^m=?T|QE-LoVt_Ibj;65eq@^2jOIkYDm4BZQv&|x!I1n5U31I6VMKnw>!k6 zxeF|kFY<2|{h4ULGgXIP8^=cpiwe@mO|1n*`Ek z=nR1WD|8FYtms9Y5&H|^w_r4_q7-Ogs6w6SIh7mhyWx2FHxd7U8b26c+l*mp-C+Cz z0Sg7p6mYVDF#>7@Jl>?F`&hsO0`3uTi+~Rb_!|MQ7jT7uwE`{>uu#BE0VfL>BcN8m z5j|F3V;3^wCekco$2vLi z3*AcTw#eEQxeCukkoyYC1FKRaCg#)N%_`ZMti=-8v>YKJ<{KQ@jo}>G3KvHzq^rLrDRB2#TgA$cBa24DR#aaSm=PI!? z`BCd4UkDAbyl1xz%;EgOnjWgr`rlzsk9NJD~h0|jXmLCFJAJelV1^BH>vvq6lW zLf-fArnKB@!GMwmp^%U~i>lIf{;cr?&gBgj={tjJiQfH5Lvp_D@7F`R|IHUrKZ7{Q z{y6BK!C>X#hv##w89s(=^_)GOEq&!B48wTA3m&i=qcq=P0i6r0^>)Pl4iYFn-Gr$G z5$+O%nS`ttNHQTbXYp6Q4&AZe4%PgZ!qH;9Tk|ZL;E3fZa!`)?D@tDsB}kd;-oQHW zrGOYBCL(gAa-<4O^y~d7<i%j2&MW!F0gbc4zK^KFdRM6SrQS$mb;{Ds7 zS2vsC0r=wvYls z!OVZ9b8<TcLK3bD|N)FTx|2_T_@e4%!b`ekAA@FAx$TL3?Zxivm ze$(+=yq)X7wt^^A}I$W5KyS^2mVy~ zYP#s8`DziCg7kw3mD8@#IlhPB{0&uNxv^tSAfYD(TG-H#y zvD(o}oOW>9mpbgrj5BNN8ypvghURn3TsYq-bZD*>al~%}zpbWbh}(p40I#b#fY%J( z8b^b}Y;Km{|zIKCb0z}~JH;VG4 z;0g#>K>}7dnrfO`htezPzf4|3I#co*$BKHpV<@?T{>$X$NbYQL*o`ykK9rg(3qpNu zz1>C)`tyQVa#A)UD{#B&8+br8MMAuDiZR|9CI*(JE>}y=v}w*}cdOk|+uT~`NNRGp zrnO8{(@t~M+m|_9&S{FFN2J#r=%p}mTD|_IcjZ9#&Y}8#`+r9REkNX zm~>-Bb1Ob5WL(hPP~&I{8}aoam|S72!(l9Mu63=nwK|NprW)f?o6~5@D=)FmuPCrC zHqI?EE;N;undVk34l8YN*qjbytD~j46(22f*Ex-7LSB%i3+y?z9CJ=f&WfCxobnuJ zP6b=s>^3$z95uv5^;loK%4jo^eKy$|9bv4bsbQ6303+%&xh***IhpH1!4w-TxP@|b z)F>5Ju5>D=+ipi+sdYC%42)UHh{TKjcq+bDM`QB}aB_PUypMh~I2iI@ylx6ecSAt< zU&(U|UOQmHe~^ykM*IZ-d7zUEVZuK!?hzQOhAI7*p-VFKDu%AXs6~W5DIcM-H8eEC ztR3(`jm@pAjBpsv`YRpA_!?vNDi^$5WV|!<(s($r__T(Gn)rBQd`c<;A~r1EX{>2( zawLVZcxR3gqVt>Gh^6mat!%A_TvZU+164f;tdO9q83wYHYzo#N;1XC-(+XPyx^aM) zaMsr~*<9{c2MZwPm*pdGhm&X4Xmi<@vc$mrhl*BP-`dD6y&5*;Xk}#%Ta7WkUMYfN z6i!!7eG@mdVf~w198E%HC)cqR>FS&66!m#6p)XM}s_W|l%I$PGmQiV|Fjp5&6Z223spyhs;IDSy_+zaxHbBDPi*~Nf(SuEsj=Ky~7!XVX75=CC4a!$!+n; zS#4pZwp9(yXfCBjb5P&HeGlj7ZgMo)TUWKfQyJ$jDm7Y5^Z)&9e=Og)tUeDNFANR8 ztf_e=J`Oir1lOt-)y)Oi(~sHhZ*Fqg>YJQsg#S`4<%BV{otek2a z^Yo%p43;}w?W+rN6(w6o*t{cnyx`r$i`^EU7Qy0`N+&w@J|#&tim ztmew^s{irnKF6<0mPk>D8nkx%Ed9xEB6VGRjZHHyH`H4{G*!Lcy1ee*S3eA%IeWi6 z=O3Ms{mV9oJ#g}&%^3}MY|1;Z@2R(PzkB-84;l`px|bX-cqQ_{+lyzt`pBcnhbHH+ zcjvXwdt+~mt?!x5Uq5-yxz9ea;Lh83yrO^LuiMsd3rf(f)l_ae6tO36ApG$gRyR)@ zYhAkNk%_jRS&6k<)|uX3pu@R@tk_HXmwyDy|I z{X2X)=%LWx#NILHy{96txHfTCqwcp2HMdAh>>qzUZ`rbHTf>Bd$&SvstoqB(Zr3(k z^?-C{&)2%^7Cx*0X3wFGj?#gxr+u<*r*HMz?LQoz_)c|E;+xT5t$yuBhjst=i)@>U zU!J!)$Hkt$@BQSb_M09!eDNE%ADq?r?5p>G|Mh{_t{AA#|KU(mdg0o-Klg2`defOG zn?ITuoK|TK`_sPFk?+i0t||SKDd;?dA$;fc#)y6Ko0l$pqO;i;y1#b&Js;X$9`oJ1 zm*27P(3DAc^lg0dp*MO@pY_DzHIYvy%~`)tb-&-^ap{Vl=2>wnyp zJ^S@f{<5S%`+Vn3`8&6s{`yTDtNiyJIB?Caum0iLT?ezuzC2v=Mcq@c)-8Pc!FRNq zFPf9N$@1m}kq513hW+LE#le|XSIVZ{pI058f4J_U&u?lFO2upKE0v8 zIX?6KrDeCTjCe74cKB1DQM$d4YVz6HER$_{Of3SNb;l z)*qTW@v(O=-MFjf_mjW0e|pz_SGdD&Z47!?8+zA8nPZN2)`hf=TgWumUHr`LQCDtz z|FH`mzbfm@EfK%JssGoJJ7523>*sH;KIiaT;rshvyFTyz{a>7T;+>^Uo;S~aDQ4%I zODAtX{@%)s%`0bbjs5r%-P)Eb^n=gO(AF*qm&OjRcide6SoMk52AA0iUTKJFdp~T$ z-}@uqsPM>hcRdlDZJS*8$8Te*`if`Q7rnKz>B5Vzc=fTjFFA0iHvDkzu^9)amp}IO z!_TdM>fLK!*))4#aC7p6FaP@2U+voQeDbYNls|ailX05Nz8$w}-*{=t!gnj4sXKIT z(v`JOY`fU@Y|xoYFT3r6=JTiT41e+uH%06|^RVWUuFr!Ks~*VZ4x)X70uARWkP~q; zwbr>C9au!xG&jPh8y&5!m_{X-ONvcJbEgbPJ24WtX)tuHGA5K4%|;ymm0*@pi*eA{ zYHO;)z^x=NSx`_`Xf0Vdg_YVcFxnc74H#FISz%ohUjjAR9ma%GYe{)ImsHX0`bn;e zAuh)KGDcW;gUcvpP0mKl(3FW1tu7FW;$RR>m_OI7YM~B-Ts^LLC1!d{fhJ7BXzZjZ zO1v{6zHX{9zHW-qn9%BQVO}!}2s~`W_QAo+whaz;<9ZR-+qgc(^#iVA)XU1mm6_@E z5mr}yBSuMEeFJ7X7y;-f20CMW3tt>HH5=<2u|iLDI_$IvWJcqH`c{|Q)-ccQz`U6f zLwB0W#*4|Z(dME_4^1l|g$u=PC>@3r7i6g^`KV;aM_`Q@AliseEqja8;jU?>c^A#p zX#t9Pi>uk*+%U8!5MP4{xbpkCbk&$GiP`-Szp9t|y;BwE)A`bp@}fo7#g+LbWn~5V z6>1zob=*}pIk0p_JN%1yvGP#3L^_(lH=T#A5Zf|Zi5hLHS(Ct|^M^&+8ZpauH@jhs zd|QR*7|0NqIl_XgRhi3T$}>v#u;ft*1^Tbjk0{J3M68>aJA&Fb3a=WqAKJZYB>!l9 zUDL>T#zx|4ZDg?~5-m!BM&zUsk|_{N7v;t!3&?-+$|7=^R$k?9Si@Yqp! z@+iDzRQ;8X(yt|Xr2J!}{3RR3pF9e0*)TGF?5OytQMh3geq>a6*Nwtw=jZ1b6UrPb zQl=X7-1TsS)vJuf<%`QxsXJc*PcX%pk(8E{%#_~{f9n4-{{K|}U-*B%eSfK+U+M>4 zeyG3yPus(P>QDZs_4!Zb|C{;?H~L=(I1M4;qHnqz0OyUxr`-{*0(=-(1i~8u-^H2a zD1?sy2H|*j0>bo7{#0BRgmVE4aV=vYcIk_0Jq>_{XvAg0mn|lcjbu(u<%^Qen7Ys@LOEETTq5L#?HWHK-dU4 zA6G2GRe+mu84>OVd>hwPgpUCJ4OcS4#{j>=m5wlrXY2s3EaCxtYck46VL<(P_%u4g z2EbLgst|4m^x$ehcpc!YxLSxG@KaoE2p_*s+0k9O;{bWmkm*6@`{Qr;q_!$COVsak*0KsZNy^iUnaZHySQl)Ltl*-*feW8Nq z2DoPhl^~D;OO|MXxIuaiYF+^K^i$&DwTA>8eJ-d0%&Ufvfp5)#u z*(KwI_(IXl1NsW$kPzY4A+frdDIipt4~3v zJjqr^LseH{Z$N+f{Y(wa+&CP$c00zNO&IeZAEqtY0iXQDFdi8C;YkIH+N{8-0_F<1 zK)?n8R|~jKzyk5ZH33$JNn*@AXz&!%?3HYXf9}0L(z!L%nZBz7$ z5HL!>2?8bvm@42*0Sg73E8rpls|374z*YgT6!1C$efjeZdV#t5iTF|Pb#U%V=Qu`k6U{=4n#AXCnI<+MY~Yu+Hq!we_R5cGMK$cT0BXfjdaw^78ykf5R-4mRKu;ks zpC-H*XUG~H7MxCMaG3B;646Mw*qFy@W}=k4@SMWkQq)x2Y+^o6S%pJ-jTP9@H#zB` z35D2$6jOl%RXB#xrckBu;xaa!RaWL#DrdRs?Ujl)Xr)5Xv0cA{ zvAGE0lq3#ywAH)VJYaPW7d@3iw3C$quSab=npUuK3O83*)}p4crU2G}LkTN*Jk}_{ zoeo!}t)-<>IqOiZP~1+GP}ntF$YjyAZ;2D+goy zSS6knHQ~*mPgo@#gFx_mgy`S)7`s^F8KW{A*;c6%&sUbQZa_N0!!CwrU)4VyDaKMu@}uQC4)E zF4wluA<$ZujgZ@AXE_`?*(|x1=W-!IXjvrJ3Tbm?)GJjZTP4%OGm^JP#>p*v3oPhY zvJl8_k|EH^*zGa|aklj`6kdVzPwXCWSF3#~T5=PG#3QyRDU5nzY%7JD z?2RpK7lmBSNb`ogLRFhw56zMOhp#yWWpfLxX{r1eF0zY4e*d>$jm{PJR+m~Ls>ok{ z|66OIYHaQ)RWleA`jNPwh(AxnPd;@#`{nn4cMbF@?OG+^ga;Kow_Ab#cNgv#?MK#t z#9~3f)jpa|`(DYXpc9`3*PC;Ln@KO7G*;u(JJL5fXH9aqHsv^R*t^l@Ol+*Tw>CR* zpg+;x+?Zo?HYTk|nPkKqwZ7KjbS+TcCQ&lG5HDKHbhWyjE}Ap{o5Ip2Q8FaN=@&O0 zB~nlj=zImTaMa+9mKB&^)j6DMTwrWL8xqpl6{}-~1BZ&}K5LTAiNnjy%N(tfrm2Z$ zPWwrTGp7aSK6BboAt>!k6ubqeW2);L=%mxXtfLX^R9lJyGcomS5bt>msdP?aBAq_P z+bh*LgR>H6j%tX-fkP$3-0J%Z{0PuOur#l9;)oDh5+_xLL=Bzg#y>t6)y$f7m4n{q zNY9v_n39p6nV6nt&q%ao)H)KAle20Z4o6x|T5a;x0oC(g*Jb+8>XDX_l9pASZA;9k z$%Y=a)isG(j?|h&TWWfGa%yTuZFZXNzekU(pVcGXmRg&d9$NqTGoG)9!V)bt4T_2=JZVa^vuMpWJgM3dTLsBVs=J#bz)XpO>%8! zO>&KGI@iR=dj>4+}mLs`#x-BI&vAVW84Q=DdN<>R#B&KK8)?_5xQZj7W zyloUsW=;#RO5Qc5jWBk&l4+_hxllbdrh2Depjrb{5eVXlP9cf;UaCgr7zy#+M({r! zk0)q6qB}a5LyQglcVu=hhY7(7KKibtZ%b0s9~0>pL@JzyIk`Nb+!b2jUC}omPob3j zOV3p}_XRQqgcbf5tt!7!%wwMp;0X*)020JpWh#GQ9EFwmKP~*JcqPBOMQXe{Zw?tP zNZ<;8;bkiSF`?g2R3B6LKfPS#XYsjQ(pxk@pW-LV(>TOGibs)`gmth|pGU+z{=QLs zDyqo)0Q)DxUepKy6?yBic30xpiS>c?C-hVJXI-uGA4$mNl77DY@--^|F~J`-N)HuP zptI8i3M`1-?)NN|~k;GiiV)_Yr3V-y&Dt~gS!heO* z>3G_}o09)acmi|k`c>jPH~mz+lHVig&T7{@Qa|AjTM4W3*v4V^T5?tEi@cD8ap)0o(ZL*t2!F1+3} ztIpBnXsySK*o`)9rOj%~%1orlI%8r^PE<%j+p{1PYS0_NBH~7EH&wD_t!3+^4}4qzl2? zp$=#FadS7(h9AzRW3v%4n&B8C1iNu>akWy~Ig~bdB?%<7nm!8|6cnPoq&ZTItl`pR zMH+==-GfLi>n2hnIbsTe^rlg<6tsC;=~ztm}XrO=ZEN{DRVoqLR6lIDcMJ zW@dNDzYR@-i_i}3hUe2(u6#%6#Tw*4OfGD&VeeVKlhfspWTcUQ7mAOCG2Jke`Yb{I zedtCcH)!Ybm+SHF1Kw4}wlD^xi zC|Fd%`egZ9?YR)DElsgB;}L}1uKfd7u{2e|*Kk~?ElpGK>o{)EmZmGXhvTu@(hLRf z;J8s+nyKKO98b`SXA7dh*K4UFlC{Nc`Oa1*-@wsyZMmZ^AEjBVy%4ckgqneRIhsRg z0nlG@bS9yNKz$s&kkHvcZ{%n$q2)lkIGU#|5EH014n(E0hl<$}A$lFO|%% zD4L7JPX$faG8RcSF&}|3|FLTKfp;^NA3(}IFZQ(1v2EtOjI z3auM+D(;71sSBH1YnZ%@dk3b)^I4bMsn8lYEl68ot5XP#T2e~Zmf_W}R(zlVy{n0n zG+O>7xTJ+%h+=XxPpB2d+FCrzVsZ=jH*n_k%(xscrBgRz@^a1_F(eb6w3U;_Xw5d4 ztwf}D^3(=S8&2%voKZuG(W%{>6r=jn6+B(6f>svWoXeQJlG7$=3(2t6jtmdkrrn4t zHfk3&HU>~vX{nVqgsX*yueef64YfgH5uD@Bk7If8{@M z6b9m`v)NZM`H|tw;ISUnk~wUktWl|d=GaEUP#uqPteY^D?=KwdBMh2sqBY2GNOBnm<^$G zky6%C`oQ^2X-N?#3T5T!>YGDK z=|&)CE*&b6H;ws*5WGUU0`0<)5qXsr%r1hzGX+kh4Dv?Kc*b3n-x=TIPU1-_#BUxG z9}bDi=?hrfmNDehV$^5<@>Y%$=iV{&cW^O<_4p_ebucFH^d{~`7wNIrm37; zQCU%x$Fk(zV+N3BcuHl(HYt;zRTL+eVPBSqZ_Y6JIW9`4kgWBMI9(v`;WUG`++AHR zj(SuxxtCL8&mgspT2m`tb!@e@u9^?WQre91gSyO%oF@Sjn1)&=zr>Y*Y3ir|5kfin zWnP|$QWbw?%owcrWZmar(o_}|n`ReOnoG(nEd?gLrOI;UtiCM!wMzxPG2LMGo4%=^Es7N9Pb%g>e#s=7@466 zlWUaHsPab%ksUD)Lx!3~315nttZHo@k?Ujj8F+1S(_g04WyssGf4L!s2KS(lIygqT zkt4w&uTo5tl4r=v6w}NRUC51uv~VOMLlF*f0#e|TnDW;7h=ZEwXvWg>9LzWS8B}bA%=)aoe zt2mMz;wI6nIg%Q(nb@x8qSHgpr z(^N4%S-~N+67OI7p>8v(F)@{se-(2Qe6lV=|C4Qw`SvmSu9!zo8*cTxc^R0}>gxkr z{hq*9-@uiVl~(@)M?|aN%MsD)_i;qD`u!YQx~N`5Ma zjU9HBr)2mPEh+1WEmVwd82OaJtsEkBlH4CtIu5N}KJ*PP`8BQu)6(%u)r0NlepS|v z_H3_nTZtVqyAjgm12GMdE$hC77OFoV=3w$iJa09o!dhOLZ?anRO!;%Lx*PuxPx~0| z<9Fl6hj%{N;30_J2Wlh@GY2V}W?Ae^OVQl&3e(*Df=VocG<`oHW`es3Ck$(trjM3G zSd|X(fE0-xbXi9Nf=eq(N-M1e3ks|O8&hz}n8&e@v7`dlvp>gk+BgV1vl982Rm?9f znp;?6VoP;r)4PBZ?A1(X8fa%V82kPrUGCQ2hT+J;^H;E_)P%7$OShMNQ zB|LUQ&B{eg7e@k&2x9<#N-^5?}Z+T?$dESn!BS)ump7nhvBf zT@h8YtV>1{PjuPp@-YD~s>m~y7ciOrOeFO7aWRaYHB7E7o^P!vs<2?4Yc4RuEY4nl zHSgT{#R`8I3%WZN2^LgT78I9OELMVZ=Uc5zB4SZ03*s=H1rsbof8;QWX$a;oW?F(6 zatl}ph4N@mLdR)E<)x;IdP1e7TRtJrx0{0!uJ_j1R?Y1&Y4@Xa4w4^ z#9WY%iIJ6!A*3jU88`<5W0gQEJ533svvHgyi$y7fEEdfP5F4XV5IUVgd~YR|La2^% z)C)U<5Za9yPl0k%VF7(GaxpuT(0nC4fx`343(Cv|h1er8vx!7d_Fm3Xf(xn4XH!^g z@WxRXOCv5jo{;$}HkmM*0aX+g7qDEy@~kC!%tRr`DKHhYJSALGhIu;6AC4$6SC-^m zOy4jus~p3m0wR$pm8Xyhc$PYwLu)xUmMj#+*Kx|R8I6=8yCNf{1fpm%s3&{@pMs%} z5~9=uef9;6i^~cM(HAI;YAh&QKz7wmXpz-gFdL1AKYbm>icRHnz@bR3SX^2_1fVRq zvUEY=0v3L{j5!66B0^$mcjp{A{MUUj%L$lc^8?D^w+f$DiK8fVRKA|(=i#?)1=FN* znl+H|hu=-#B0sAVCz$D|wsJ5YQz=k}a6GwyWd{)8F@xB-BqRKu4bS}xTF}u^Ye!8!o%?BZU=I_E(>jN`*b6F`X)iB0csz20>%<4~lr4Ki za9Tkd93B!d!5L429N0gFrb=4)3i`1B6p}L{%OB-+xsum>%Buor-l;T~E7>Rq@PUyO zc7BapIbP(bY-z!nYE-F{Nq0%oW=d+aQ<$17-nN2*M4fC~(ZHnj(i?DIlk1su4`;xC zPe>a$?E?G_gYpLEw8Jcvwm zw9#jn=+nbYS{@GDlFAb4s6Kz#A+>VKyhJ)j&m&GD>oh6-kQ|hes~S{WpjX zy2Z$n_$NuRa&5u~lxpa7Ka(!w#gMik*U2qdPm5`UR4LtyHO=If(gKxICADH;o!m0F zLZM)yD%m8O&<@iuQIV>p7chxn(@=s+yYfPTbPZLedQ#UU3M<{^nSddV3LIs~<;AC) z)P5GoDHKe-0&!_q<3_)KOz>_7Fp&fZq@Gb;(K_>lPJ&Ih!*`V=VpCR@1 z`$f91NfoIqG}yR75tJd#3k{APLKcMv8&o7{r7<*^2@I81S;^nm$SYv#4^2_FhYVHW%+eLXl4|74waiYPdf3oipb4H7RJoi4QjG596_9`J+^+75zr zJn1aPE<6VEA|$-3_Go(dCW7Dewn28Z5OYl|NF%Y~iDwo1+sP4u|WARmq3+c~G!ekV2Is(ibby_ZQ zvB`*ofZ#BHFf*?d#C(M)CBx{XRAee8v&_{ZG6i~=y#ld;lgvBw4ndfS*!24aG8;&j zA`1p8Itt5tSVWg0IX~f z3*~tPclzAtFI3`mY8*Z~UTNn~ZKOp?l&nVaxeA}DNQ-GYGwiG^c)6^h8DI8|OJFstnkrolPG0y*dP}Vu+wV-u)trlGem9Qef|d8+_y?_-ly^2_ zWF2LIJe4SX3YSUw6k$=O9%yjo6+Wqew4S3*N$_GL*-GWoq9#-v-l1gDY+8bc2Cscs zF_|B+Hnik7iebh=!%S#!`%kep(Yh1dOe&&6hMX1$^691^K2V(9N=X?yyY(-R zZLtXD4;ygeDnDmQqjQxrGkwWYoZwmFTG6~j{da~${LRA>9Nl8HouK|=FhZ**vi^fJ zSpW7Jt6<$~WEHG?4)_1>XRLyTAN#9^GDbcBA9Wr>rn6#MI2sld7mZSnIG(}dQZgxW z@?W4H$J0^?PxuhHM){s5GyWg;-UPs^;>sJZd+)oi@9VwkrZ>8wX|`r>5D*2lS(<%c zv;kw&bT`lf-EA){ng9_^j7bb=T;d?2QKQBMcSJ{V4QeJai_RpIM3ShJWRe+1;}u3Z(-~2Ws=tl|X>0{AGnQ3??v8iS0j-KhVi*v(dd=^p zs8}CjMo0?zgo%ok5i<%EKNru0t`1(SFH|wMYOG%=L@s^dqWWbkX3m^b$8c@!jAcG( zr7xJea$2nq+A5*jCz8XU^Gptlu{IIO!GL}a21E{GnWS{9;zp)juxLhY{X(pY_~EHD zW+Ps4U#qZ&rXG;D_Wc35Wxi?VDH#~UZvm0TH=61-HK;9t zCDxcMtIkRHY?bXFksk?Ckl7xHa^wzlz4?TKvd*w_wTf9t2}nJJZ|ysTm)tx(8xo5B zP#T0W4_e5$KLPHgUw9W&+?>6;cINYo8rBkKc%BR0$&YJj@F{})&V~jnu^^K#pWM*! zWrVe5U&?0x1>geKdgyGhj-Nm0x6U1koN$UsqbKp00ua&`GuLV)+9Kgh2>`s^onZi# zeNH5yB-#_uA<-J2PW3*fuy#(aFdIDoc>uSg&b{Rtm9U=1_GaN_ldm9|)*KyMhvW}P@+DR^(pfbsvn&$#t(3Sk zBXPe`<({J?)kam`&HH729KXNJhwIQaM zXa3Y=Nx|HqOG-F(L4~zo+TLlZ=q*Dj$@1pvO7B3jdvr3qdIda=d`6<6? zD9G2^B#LU4`7;wqzCNuZ6V9Q4FMFP@H5=PBJuFOT;1jEV=<|1y!Z9sUg%thS1M^Q+wn>-hB^S=yiS-hI1^=7!j)pHQHn9xAi z%t73eO9587!5qXbC1My5{v5>ZL(B+Cq30lO88M@9#{B>oNnB6vy$wL6N2eof7q{PU zK#>udj$|ZHM>0~TBk9rUh~zM6H0r<{{OO3v!Jm$p9D?acChHuNq{Fu}>8jeLk;L;C zVCv=PWo6(iG=x_ytX(*L>B_~+v5^zxltuAV_V?dM{haHORdzj3{s2P&Rc1sMJI%ZT zS=avqA}s#Nmd>%RKLC;(+@?_04MeM4FR!tq5t74iX(?+tJHxUt&axXC8*wg6W3urr zBOIKwma|cH5u9;oA2K*62HSiA*7w}>2i-fGTc z^0~m6dXdoD_iu)w_E&|v$v z!SMBIYVJfsv~qL|f>r5*i|C}L7P^P9yz{mZtW01qNRwR1l$bsqsFA$N@a4v?pg3i9 zkUHViEQv;o7+9U`?S!+~q|9MyqOh>l!6?`X&9t(*nah%N;LzS%2%L!%H+?CM@xmH_ zkV^TBs&xGkioM_pL|q7)e%U4-&4KxbD!SLeKSC4nz$NflWoWLE}hno%kIj-SzQ&kp2 z3QLs8%5jsdzt8`^pMgST%U?|AS^6qN7UkiZt)%X)z#94dei* zFcDO*{8{@pqZ11%5LJZJM+HL>*uua#1Y)@eoQ=R@1P07Q;64QUejBAPHu?0@*(mGw zItX#WJBa#Mrs6BafILJF+GQx~4dqgn$6}fhJy?o)$Ev$&Fw3!43??Vm@*%0Idb9MZ zFPgj*jCJ8x48XB+w+VBs{0xl9SQ!(vbsZ+ks_@=Og6AR$O2CmMm>5aW4b)0bp9^1z zB>TPzbBIlrWHQ8FH|Su9%|&HPE;QH-aLa)wLPW7pd643@*o)LJ&DP3SfwT4_zij== zvy$PVG-B3jS|Mmb8o6N{wfrucewViHJ7!9F4OQmP+IIsQwU5r^K4x+`VZ9G%?4Whu z*Ey660=&<~eKaC{dSg7b>BIWg{XasU-y{ZV?g29SS=756yP*#f7>#=6K!GUhA%erD z7;H{kBdrl@!0uxln{=rqY8YhClWa3mjif@nu($@Gg6A(V{?f}(9wOjBL;NV>M9TXX zLohEkl$7#^K!?V3Y9qQ_PndbIdxzm#7~x+PA!+NBDw2nmXAHsL-f zw-6jd609*8?UGs53nq3rVvCMPNT;Tf7Uh*`W~fBgNGz1dKO2!!RnMDf%5Kq*4M2Il zO6QbtqVmc?{JtSN8!1G2917%9vuJyjm@*tkTb+ef>~b+o|3Qnj9IaMeOYwP|0`Vfi z^35&SU~XMs?~B1Z?2JD%23^$2o#)?D$8-N}3`h9X5?!5Ogez+j^r;N-H$WsqysQ+N z6uoXpS@Tt(5oX)h>GY~-l&MDp>d~R2ISPu-GI$QA&uKjDRnh85wIB3zJ7#k8d&l;s ztD=pO3|;iAEj#CQ6MFHcEa6(%U05QdAU znJ}CA2ZlQqHX}l_)Pz~FKWZ9OtZ;dRq|JocVq+jy(qbEfBWsG)hQtM*0sd?V$tWTRTt$sUk%`_uSq^iy?)Yw_lqs7sV|9vFEKbbIluMqPUk%Q_~ zA)luTe;6jJ`n3s5@xKcriZaajXKmL=ZYi~8@mUciQDwp`{u;mdKB>jeP=&+7M1>Q> zaM7|z2LI@1u&ak!8?6dggsH05o3K=%(~m%Rea3`Yf&MTUkl&u&b!8;Mt&s$EeuBk8 z1=wAjKCzcSAF7F>+fA7D{-PvL7L!8+IUWYI&t5y+01~>v5pwZ zB^cuTS^L&wYBNDkfzFXh)n_pBCx|Q0!1$eGy$aetgc1HENJq4nL3xNdt+QxPzfBl( zpp}yBP&wvLWfe6nPTeSfu`UZcdAgX~&s*fc-dj`jSwq8#_ZGzKQN~v{X&!5`DtRnI z5{b@4>sjMa%uh{xn<>W5#|eo|?Tz~VP4--@Zok0OFf-dCES}jH4AYyawOuN3KH!qt z{xy;d*$Kd7&)3_g_tVYTGxuCRl0;_%~?T(X_ zHW8}k=cePR{q~?F$efdI?dHrY{SgZ~C(<%JaIQI4MNb<%Ro9UaU-gtJPlWqr13;-2 z{ltVR-2bHu>M7hmk0kidNP^L*u8f8Qfod0BRQS6{f_NpG4?k+nrIJA23i2vzh*i{@ z;WTvyZeDLSVp@-5Uco!U*Q|=l8s?@3BM1JheXEeMk@T;L zq|ZRZ56T@-Bk^P8uTn#LLo(%E;vO-C*7BkOhJY zuScSP>POG?qsJYIL@V7T31^ufUG#b+x}P7tC*b^@Nc35L^id-es>DuhvLZjF>Oas@ z>H;K@F8?!b9LUmCmpH4ohVYdNM=J~;3HIrk{;Ik==2eBMrtkXKf5x|4leO>Sa9vx& z38kNt!o~HpvDTy>i|dn;PZgvcv8GIR@Jfq+>2oG&x5xUgx5%2L{UYnX@fWN~zIS8) znf5gJ(c}?^Gy)vyfN%^S(&2`HtifxJJ5fnGU6wy-Pg#@1@3Z{z=2(-oXK4M`n}{-`<&K)y|XRF?Y@}G!3*Chb|KTyrBCT#Qy|qX*d=K&5oT%sB#Zwadzt^Q zu#6uZPB@u&2y+gJ>-klmgq+8`OYqnI4~T7KwLaCo!R?@lr=?s5i2-R}^JDz=PI4I} z5nKi#y`${)ux1|4?wiXX4C>1u4Dm9EJaHL>PhJL*CoY5V$;%*o>dPPu>B}I33oe5Y zGM7PwL@t9c6kG-&5L^Z!5L^Z!z{?;)!OI{zfXg5{fXg64g3BNpfy*F*;AIev;bjnp z^koo+g3BNTCtU_1!dwQ?L46s7VgE7+!~XS;K?K6fAcVrpAcXW~ z5QhBAAUbR=gM<;`&5s#AMTn{;D(Nx^5xfi{PkkAL!Jd~v(wQ=H8H8|f8H9j;8AJ%p zWe|oVmq7@Imq8*>a2bTS6I=#yiw-~#Gt4nJ?TX*(zY#cp%zq7ofj?{Cl`a+`#0S5o z7+!&WhonP(14v@;U1P9vzHgw$ZOFz+PoB!L1~K;oNSo6%pavP^d@NL6?sfw#29S+x z^02x+QRQ3~p~<;60_5IffO;gDuM=Qqnuqo7y=(F?OWnIc{A1R0}x2PM`z#9I=dbj>r`(8&5rfDWJ!7nSY8jvt# zT|gi|y<*BSF+K%A z+Shysf74E4e7wN;kRHZ|+k0uy3&!{`sErRpG(Pf#@!^xkN1iY~eA4*vsf`aq+V}`A zFg}Eg@evX+J`4rMhd^L_2n5E50F94O(D>*8jE@e$_y`G%k4C`w2!h5(V`zLB(#D6O z!1xdl z;IOzNKWpD~kmvr$pbvsYmBEAC{M3GrU78pxp9`15Wi8m~@H{+D+XkUxU|A^O@{{b%uAE<|&6b1ZS z^r&^sUFhG~NffXfC}7gt%9j0Oj18lJV+d*m%n%i@JfVR3qym;F6fmDuz2%#c>V zf(sNdA)|nWL=-SXfdVEFC}0AC0wzEOEEH70IsgT%15m(10tKuQP{4wq0@fHRV1~2; zW++g=1VjNd5K+JceFe;Lk^&~eC}17b3YcME0W%yZU;?26CKM`QLRtYc_H!hr%N;45GuGzysEhyo@UD&PndC}85E z3OMZ&O#5P#!q|=5poU^S?r;MWC@;Cg9Yx3;Zcp;Ki87q{fcs5O*4G*9++ilL=`5=! zvD|cWvj0(N4;tDG@5g{MLu!00jMG3~59fxjlaU5}hy{3K1=3lYka|mF<0gD_BB0LH z)N6d3@fho_DzS@rikDgZYi7`zKg3+yh9&e-%Bpynm2%n**N*m}tNs}+6I1g~J@e+; z5O_ak>>gHzc>&14>SgDiZO7I!oKD?{EeT)7^DTpfb^J+FGQzu zoEl@mpf(0FpkWN;31h$~je$I24EUrm;8Pm|hO{vdTwn|c8Dk(MVhk7xi~)hb7!U}I z0Rb8Vp`bC)0T=@vfH4pf7z2%fF%SfefyU4nFrg$=3-=Tiaxe*j?^Fn{B8js zG4-=kuijvCc&i8ME%ieZ=YYBY0qX4ob(+I(Rq7i}z1VrF^|$t^OK~nErb=+0pOe2|1R+*B+qqw__eq9Ne0DXny6oU`^E(Q z%vPv0&+#h3mKX7BZ|{ufAXC@)wYPW0cL|Heuf6?gfj!swwYM)3IM+3P?d{zH7rVx< zy?v>`6|V7XZ(k;Gm7C<(-u_IS4N>iCzxMWL1svzX8U6H5WnUiegV>1#;n&{&oPcK% ztOa<5fRhQruf6?w0nZ{h3*Z+7tRc7z;1>m)<{H2D_LWl743~cG?Jo&$vjL1z_8tKi z1As~2D?lB9)0BOc0BZnDQ1;aVYyfb&vcD`qyGy_J_B8@*bLrRKzE*%;F8$iu*9maB zOTYH^^#bg1>DS)=iU8Lm2EYvh96(Hqvj0wiJCFf@eF7YG;n&{2QNo8@__eq9OZbRO zzxMV`0vrW^+8hwz6#%Hs%>w)r0MzCd0geF}r|ho^@CyLrm3^xK$6flAw{H{RcZsc7 zF~I%L6u@_r4AMR)(eP`ZAuj2i&!3J#l_9?CoiF?ttY>IP_Rbe85do9&fxhZ9 zf~iSt^aD&7`mT?S2@&vG6nk1g-<5sr83DB`d;5JV1ns@vF1FrBMgoWDBbU(biX%r+4b|M zE}d1&saNeR_&N0Kw=G^x$oVF+$?aD5`%+r&lI{jNnnH1ZwC+R{cuh)Y|4B-V`3~;w zS?+bFbY;(W4>O4?4({zaE;9%m+}m^AjiAgU`NR0vs}Rkfrs3y(I7j7CDZT2$^-x)< z&eX9va6x<=HX1~=_^#^hjWXbsyDW57Z*LNu?JhU2>g~;<^J1>=!w>_eRjWZa>Z;yu zlZ0`D)aTdX-=7@-{hZ{g-o8+1GlM)a?m7gO?b5-m?<1{KQs)XTa8+-231vZ$7~`~C zP=&sV+#>0UHK<+H+gk-!=BBu+x3|S_L(5gTaP1zts<*et+1>}z{Yqo_UleDPW2do) zt9tw5I9osefMwqqUyq^g8V_FfT>?TNwX1sj>tSI~LU+g6u?JW*8ucE54iZ9h+$+!# zLa5(;0=+^AoE#MB7$In)`vp3l4hSmu0fC@|07B_LC}6ID(1#BRSRo)(;==+~3rMZ_ zh`==(21}0$yja6v>X5)|Gz_*L6S!T&VC=BKyEF{e9v66zr6rcyQ6$(>1rW&FMJwj| zuIlZtiGTw3UDexn2qtGfW z>Hl42+AqfGW8R(CyuPJ1m?^v@lA+w%)}{dWvfyH_{vN$JUADg|I1J9kJ#x1HAx>ZS zj`u@wn70NZ-vm%9dm^X#_WlIl$WP!j-#(DIPBLQpSY)ykI?cBqPP~ptJ^y(m@hOD$ zunwK(+m9w*1S4QI{OCrIfqf`(BhvH^-y1#WCud@%qp)c!6esH1EVuuh*F|>%OWhQr zj}Z-15xjOfKYbthWh`6{7ck3LEW@TO^=y%6^}7tY7O(57?}T$5UU2JAH7y8y!4zH} ztV))Ptd?Wvg4Y&G>M>>4-&r+YdD_}Gw&4EYSbs|V8tD16_LX5$T-s>j$1O&YFZRdn z8F($x_t?g>bZ76uoqgcka9ty>CQev^@rGleW%CBrNG=)3qn!S%4(?QaI}H*D(BO_5 zy*P44UcbI`T|>*J?hY`r{+OZqgJeKP4&d#f0xGm|<8;H#dP=~rD#4Ad5cJ`rjr?s0}IyW?T%;X1|3^CX$MNMjv#dc+F zqAXVoKq(tqn?yvd&7AYvduNxuZ@7G0R}iP$4(J-Ivb@1Mln0Jj)lU3{8-oqyIM-gS z%9fev`8wLF2A(vyPZ#C_sLI~54UcMjOFJGDne+yewBApu%D!e$7iko7X!ZGc+(ca^ zQA^@^pSyh5u1~7|M+|-|Ud>b<`;~2H6h|c+yU(m;^}!6sd?&&h#1WHl*4(D^Cykj# z`xJwzKEgUAKgtdH9Kf*#f1ZI@`aL>=oF$y&W;viINj-d7wQp+P+>B3z zStB*ITB^Al)UXzErSxC7#!`=r=D|o^1>T5S85yBGO<po zWRk0#;_)ySj(l;-*{vA%C*+I>zAObF+_Eg`d}TG!Cz+?~jAgYlHingRbV~Pqri`1< zLb+F30)|s<_YLv4`hiO>`2GZpaa!Dbpd!g_xm#E|29YuEbo}+^<4@unC@isse;C3R zy8f;OlLg;%z`H_~TU?rrDSQUBY)6+d(u>wDZJ@PkP;N=-&zU?UwBV7*Qi=33f@E{V zxr^IJ@VOy=Iy}HlgBI^pZkfatXDpLXR;+67XqyS|-^wj7C9@S7(^EcH;r5k?fhvCD z3b_4BS>F@IDtD~Z%{Vr;O0z+jiL(R|=XCHv$Yl=ePP9SR6Zm5-{XXEV2PH_Bvc4ff zeo7*{T_0~-PU`G-sI(P7K;xj@X9Iz~e?MoQQBc;E%-J6@qe+OLwXZOScN{6|N*49W z0RW}AD_Pvb1f|F;S>(R~%yWm-NZLE05LB-fC@a@sS_IErA49JB?T8vO5P^#kcz}V= zATVVR4hHN+pnx}1d)Jt>gH2lQ!AZ)app%pqq9o-Y1PW8>izg-@lyC6gezZV)e-?mI7e!PSmWVd zaHhtuG59{l$Dnu=8u|$olW@vz*J*Sdj6IBjH9BA7)GN_AIYL*hW7Y&Q_1iX)gR#9K zD+y;}P!jRr;53b29N_8YQ2hK``URMTEnqA32}OiU;}Oq@ zoBtq*_ZS;q#$rH?Lg}AC7g`e(N<6M2AJq8SKK=u}0Y1pW;eFF@n`FY!E#O0%uHb}p z5&wV>Yr0%R*Y~@qD*svi)T1aVrk>3`<>pqrE;h?YPS?VOehf49k*(5SZjXEwNU{(iJmL!`$> zaZL;fu!r}*r-mXM#d6R_Z;zHSoU~C)#Q&Ze;+}J4qnKd0Q5=DSjbh@W8^vk$&Hg@< zs*2rl9puoH&ojsFd`}dZ_KSI!M0nUe#3viSek)>f3E)#vcM~Y~%uRsUJp?OM!n+YU zrE@Bsv2F#vy|BY=0xUqoD;Jk@0aKjkH-ip}O0*y7$b%1g^IyYgS zk;7Pgogj}c4)e$Y))jhv)9A5$v-%ORg*{YE9r)d6&DR6R3?-Hpk*M_DG+8R0f*9L-2`dX~OaYOa%ASW)+DYW(y2uwVGWl4*h`n2MtA#*S?A>AsRL9;exfKd2ud^$u z&oXa8L6{}ouJb9OFCG4iJy`M{9{lGnFZC}2`cHSerJe;_G40xl^p+{ZlLSt|l)F-nT;xS!$ z;$#+|Jeeg=oXp~rC$sp}C$kvRC$j_>oXjF*PG$*-oXlblUW+WlUWSulUWP}C$k91$t(sU2A80JGK=9PgG+=l zxH_m$W-;ua%wjk=nMEMj{v1pwSR$_>q)%osll^?UN zZ#Q3~wMyneB&|-WSh+qSuu7+ds-ZP9uo>jf+IKC28N7~$SMN-%4MGq5{r(d)a0+*O z4T<3j0-7zR&dopN+PA&4xx1-tWJfcO1w(7)nrgjh>Qw^8YU6Vbt=*0FTN>)I(%+@* z;%86;2QNy#zg9oyhrq}D7YQF}_q!Wtn@$huIds6EN#v!;N6h6**iJt+z$6M7C6(+ni%VR-?}({#A^Ys)!<*ypc7 z!M2<;h<#xa!+KdW_QhS~D7gN-Sd;JJDqq~YgM{-9ZZC0wWYEXHBG;O|3|rnula49G zY**Khb+E%@3GNuSoV{$$s@nSH%DuV@X>FZd{C#E@3tr}8$%@&lUr@UMADpenm-OaL zhaQ-@XeqvYz@5hGctu_xnA-$5cKl7nc>lav$Xq3+$`?HNWhvSBiB}5Vi{Rmsv&@qu|~Ae-U@7DM4$Gd@U2DiT4O!Gai=SiZd-(L)5Pg0u1u zVm4ltw;35`uwCba>C7$!(o|L~KD~&?mWc zpv&+jIJAWSz1*t!)FO`L#6s?7#itd~&w)xTXn|+T_{<^}>m^dY*BhTDS!O0!K)9eA zpDpOzMDQ76e;qhJM`8*hF&uyL^|MYDpDVG&VJtu3)Y`on-&sQJJc%t!_+LX_8cjOC z=pj_NB8W^%xj-T-6RC^B@r9D*K$UJ*!&BNMzNqLSG)Y|UAmpT2`6l+kHOCR3dlD<3 z7g%}HdpM+!h6GT+#>z9Otvo}t^74e0=aW`mp0M(K(#rFxtvo~8$_p;A@`Q|)7ZS1Z z3vH*XyqBwR-U22$`cSP&p^b= z6ZEY-!%0@22xH}SP+NJ1eJjs!VC4yfR-RC3Fd{VRGkl5=RZCQo zl_!E$UY^>@GuYG0_hQP3l_wlr#v$Nac_B1bp5cg&a9Rs(|Nj`I0e(U<}86x?8zDU#|@$HrO#h>sz{-H`i|&qpY(izxkQg%=eg8 z=XUrBo|T->Y{{p9-^sv|{TxCN`;+8~7vQs;rH<5T%qJ<3|3GZqj;3w6f9=Mxs4 zEbA>uu(%J-rS$HF5n62Bc|XDh_`(id?26{LzOJ*!zOnvZ5mF*u zTvf>Q*1Z=Zc~QM_dyKEjv~hpmwXFAnFGh=Y5TY?E=7(1hc4+~`yOgVM^B3XnX|zqT z31C@Y!-jXU*u!ssf$KPPCSEo199 zkh{~RtP+GKTKAyT(h__FZ-e!q1hJ(oP7^j;(k4`S?1{L?UXFVd8|)&OvldwU;I`B< zf6CMVDdNxC*Om^Cc$+)%Db8gKrVYi;MPG;)Sib6Kps@GW^*h~6w1!|JSh3UqV*yM+ zivGL?d(5m2^rw^2{y6h6PxU)5nrfo~mLpYzq*{XW51^!bzJ3>)SUQ;l@7*A%D zQ$#&6_*wgMvD7l;`-qx?IuH3N0?#n;8w6$zgIB(bP{bEZs>R6J%Cdf)0fOs+e+&de zi5zw-AZPEMox|@zp!aaNi+u!vOA)9zW)iofR*R4lErmL(e!0VHgoTTNA902OwhF-# zX2n+Vs?~@N6ZLtC0CesqN&J@WNPwDg-YQRp|a zrqrnG49RD}97wpvgh)J=fGs@g&?{Kt5MOop^hnFP7JP!!^bmB%>(+8KE8G63YY!|(e>@kEvHSKQ12@l(OGaT1Sx&RI%b&oJq9Fy*1peR1E6{ZYDb{oC4xFJu@ z46f%+J7Qv{DE;e~4Zg1c-(5&Iv>n+Gy9N*|IF7aWfuTRZg4->r!Bc*rKlclbSEJB( zPFUzTmLm<~j;xU~Utv~HTANU^WH%Ivr9l=jz&f-uyD^45xejAYW}h~(xmW?Up0ghF zGrQW)>`_0nA2PE$Pna2atJrB`I9mP*xrodk3WmcEBGD4H%Z~yhR1asGTJxNd^-F78 z4o5x0!^a}>PbhmB-Q}`9hs}_{7j}-g+N7BU;-If(JU?t=R!huEd@@Fj{AMZ(!C-~h z^)pgNSDLCXR*E^$Ams-SAcurA`*z*tagTrxg=e9CxtO>J#=RfQA2{s=5XMOF=+-$LCs}M$F%)hc|o^6UM=%N6NU3KUi#N#Um|p@HcWxsu(uL3l2W|x1&AmUYK?&CVTko1a8hGt_NAJccNQT%%C_-lX6Sy2ozO?O7~)3 z1=z|+z9p4~q+WPS>T>`AkDZNg2`b!@BJ6qLEh)meUU*B2aIqKOk|JE;g}0;#S9#`m zr>XE~;^ep53vNjf9OvO`lfETY0&pTheM^eqnFMRm3RlDlP9~^tNfA7YpuQzVu!f+% zB}H(W7v7R$Ni#fiONzYB27u%9d!(X^0pP`ZuK;xbaB%)A0oDMJTT)E30f5|+BGB%c zTT%qJdFGZBfnA=tB}L$J&)kwCu*WmEqzGJ(7+g%cLCQIR7`Y|Im^+Yx+>#=2(9^f1 z7(V3bTT%=k@ysnL0!IO$HU}iHR{)?kHw*Aj08pD-1ULo&cL2UBz%KyEEh%Pj+%vbN z2>dRS(;a1H^}HoD0wSdx6T#laMHPixQcQLrmX&%-is(CHStqz9#h8Q9nBb<8o6Q?TNNO~1;4$1rBU+y3jm8Rj*KAfX+ zSW9|xllc1Rftchq)Ql5fReBV!gfhM(SCu&Gl*dKS?#^@D@JVA_RU*#zB3G4IZp`y< z?LcZ<<3zb0w&L457PWIDLgA_s6UGfPxT?f)3?-R*Rf)8jL7ou)4oRNv@$hMQRf(x{ z1sA=l#KZ+bVhomUNnGgbsV$0v#hHSCyFVcorbJszeBy0H9n|BA6?nTvZ}iA)s7UB3Lb;zN$pH zM#Es~Q7LG#hQZV!f!AmlY&|A$yN1EoVS#sPSgtBDKU`H3(WZ(L(Y4^%idU7Wn(`x8 zl_;QqBUhD(Dfl-2=o}^^f#gtv_4CMGC0=Yy3ud@USChC}CIuI}_rFYDpUUUcG{M79Sdqxp! zn;+eNuxkYe_D;P0U{5W20*efuY(Lo3iq;}y<;nJgJ+p|#dS1%*gFQ>K%=D7CAMDwJ z#&kt*XTo-vW9arAi7AN0MD`Huxe|+Mjh`;MiD1u@*fKK_!)`}3>HH$9k%}NPDdhr* ztn^a1AMAyaa7ii^wx&pf~^fgW@|%8WNU+=U~7Xwu(d%T z*xDe#tqq~z)`kvXYeNUHwIL+f+RzAWZ3u!}8ydr{4TkjA21B#4Cck3-a#cb=wl)}u zY;6#nZcYp`oV2w;gxT8ALA|xXu)npzaIm#OAl%v@6mD%0(pwu0`CA)0Y_>MSh;Scc zhEEZqYKcnP+8|;&wl?Icw>B8;xwTQsl##6s!ok)C0e@>l2+h_8!;!5Gg5lOi1PZn` zh>LD*IQ8}I_1H_VU)PGA_C)o$kjFldf^+9!p@F-;c$e>U57s%#&cRM17B!}}HtClV ztBjKmRfetEO>OICpVTTR$|{@QhK-O#>$DQ*s~lEB`ZCHclN*1&fk$3uiedF*v{Po@ z-4?A2rmwU0`>?Vq#4;!+%A3_c7p#^0hYXk1&aRgwcKJ;MB1`)El3@Rix0Uu3nK8QVR92OCG#2v^VI{r(0lF%5uU zAdtoT^M4 z9Wpb-pe6S)YEY($`#u=0>=z+i93`w)m6IZIo1$@JRORYO+~t0`uZ{50QMNRfR}O}mkAH=hVuIiUw7I~()$tS&)PQynfKEtNx3DX z_p+WL_8Z_=3*2)QxV2c24kYq__f;RSDxZjuKV{G+_sZ`? z;{G`r2XXuNNZflSPKrUCGgeoF9OvU-MC2-qB60jk3*-E8P-fyd4ludkWx+hu@d zg4a(CY2J(vpz3ZJJso&lx;0&%Lv6Yvg>;)Ht!~w%MpTFSiVeFq=J{i!+(& z8bdjp$D!c6-8>SLM{ox~b^%t8Xho3!tidC`jtBo)14mqe2me`v)I)e9h^a%xn2K1l z7Otq6e#RLU<42t~s=8w2<_Y8Qr>ncQdCL0c*5;0uMt}_+jT@$Hn>b-4BiC1qTr{>~ zWM@~?6v*%yXTW>GnWMSiIa&_1jodn6+(;~Jj$Gf;H5wbdAvO##el-8#Dp%KrjwURA zR+~1y09uv5tFb!kFMj@QE_XU!3`SF~vD!P2gXNg4p4eaDqI^uRp4eaPhanfNp2W=2 zF8eFBM4#kJYb-p|<&3!x8M?Ci5i6FX=B~NY8oSbBMsdBLP`hyX(v|QH`w81YBc{#V z)Y7_9#m*N8nwVzjlI zh_w~tPI7PgrgB@%i0?{n)NDJv!F(ybx%}pT({UN%%;go9@mpq zY+Lzvz`jZ&--ea#4(Z9WzO*Y$alSKY|92!zBH9%OMjq%Bo;* zsZ4!EwSP76UM9Y8fwYw*$_0m_UJ3lD)pAqGEdUo)(GuV)d}ekSz)8l!OVi7WZhX?HIw(5n$!aIuN)jk5z? zh%c-)hy@@664xp2tkDUJZU|{3XnqW$9=b4WC>)yz>Y=Qm$C3PiNqUja3QSgD;ig2I zYbcxRMKDvMTWly>tZ5RCqu>Y%Gg8)YQvVsKKHoMOT?ftn8_l9MrZ;9;vsK}*Oq>Ve zWY!B3r|C*0qtOxUgB}&=z*(Lx&5=6PunrX_k9|QMejC)GhILpy89d{D#um-=G*I!6PQc4}%(1BcqZHGd69~ZzG`NxV!-z;v|v&y6r`*+JUnKgBwL#_@Uy9DSx-0 zjX4!1@KuxTF7$_W-CnGw^<}UhMX>C$ak}Lx%ZC2Ap+89a%bq4ZgPQ)DB>Mb>0cRPO zi@|WI9uk+cG4Dq1r5ITPybGYLuSp?oG}{0vZB+276XPo)!<`%9CB-Nrl=b9jb5x|X z6D;AY=Vq8>iKu`>`I>+}ByJ5RtMI~MX!^5X+8UL4#GkbKhhOoEKV_K>=ekm8j#EBw z*^K!M<}H6Hg2@c7oM#?Hehd?e*cNyH4YUO=j5V?W4j7@ID?|{UA`TSIfo!-)OzVI)^>q)8e#Sw@ICZ%Re z&)KsdSl4T0qQLdaQc|8|o*LQGi;ZCu=`yr0mZ!dj)Nz@(y2VzEK)7uO=PSBNV@++{ zYd2vdD|s_5jf_mhjK!-!APtV>^}_FrMa%qi_%-gMy}yX*Njfi@u5W2n?xEgoASR-5 z?WT6+J|?hD7|>yXVuU(2f%%Psb&m>auud{oxi9v<5v^1O7=>W+pxl>w zA4fY)R%vW5MoJ?)8otMe6TXj^NSnJa_hzT~K5>#`cr4HL81MHM*IfPXDsTrE%Dv(R z4UHRcTS2))3Uzn+*A#+tRBn~T*cm^=m~@90UJN#4>A_~hvhADKwryH2hf>{P66>W0 znMfp>YPdvXrt2+_MeTe+XxL=72;C7@vGS+tlpPVk;JyLRe~ z+NIbdKkn`;TmYMzzCg?Rji&JyG+fZuflZW+%^haRR=N8NIeP5$1ud;T;%<^S$25x^ zym1d`Rt;`W_>COy3M=(H>}kMYvLnyD_cn zm%(LT^X8x>?vPfh(k<~pM0X0&FrAaI6r{gPqDJWS$x&aIs8KrAvhKBX))y)HZi%ke zDSJlWBhh2i&uwWvZLBHo9C?j#@0E&;^Lv8}l*+wNkP{73OEHA}pr9wGPv6koxN#ZP z&HaL@Ne_xt?gLWRjC4$BQ#aP!2PJN%$rmRQ8aJBFcjZ1LT{1fwH@$81W}F0eAC{=a zAv^6ssz)TME)wM@dQ@W8q|a|_Xo539c{_Ix3BMbH@w;?O1NI3xXi>e#Byv+a#cW1P z2MjiE6S#*9=_R(^A6h*Ji~D#X2bHg;PDpSi29xWZgbbRra5IQ9jp>8T3nRT<620gp+!yRQ}Un6&FXi1Phf zgcQnsQ_9YYxzmewgRsZ7Hg`r5m1felHn&!AfsXN)aCD{Mm~3j%F05^)%f7NZt%$b= zp>BAs&7E1qop(>`xml8ruUY*qV|TWob3;8H#LSVHf=EncN7$V!vBhC*bW7NsC$VLr zd_PC-HgIZo;tgbXQPFbEisF(4un|EM5dx1v6@wVI>8d$xCs;`>fL146JVO!h+KF zY`P?hrO#~Z*xJy6k$^$j(h8rgf`=vJwL*8MK$(!Gu((-*%k|~HXL0Uq;oGm|2?*wt zeg^E|3=#h3)kEX7U@5ve)WcTsa|MvM)nok@L)!)~3a^{>q*;l9FYefkkYc>qzF>yJJg(vPQm+pw4bIvn%)k zbFOBBf`Q~@G^l1o;L|`2P*!W3mm}%Rkv#sf@ZT0vX$#;K{`+sC%5un|W5V!()6iBz! zvH|-^C(LB4RZRydEjNpK%_AtSH=C{ZX@C`Mz*%9l!A-7BA%^J+C<}M={ z7z6(KU282Ff5qhXcR?fk2xlewVy$oOt*FRtsEBTWCN@BoNKi8+$XY5D{Ju%gr7>&6 z4M?jiNI12Ezc;kHfU5`{5tKG&e z&r8_22Myup0}cvu(YVbEal!49dx5+Z710b`N`{7sd|gI{tU4`SpJ6^f2bq?x&r-Td zFdl^AhfMy*$nX_LvQEJ84^kP1KrF6}D4_!^z2@{9;d4U3?d9NBvv&&#q|6zHssamU z)~%+q5l(HS4Tdggq&b}n+gkZCdA>)?X`SBP(E<0i!UXO&QVZ@fN%jT|d^(S^xZK4%vGTLN zD-HDwvX_P$nMxpy_9mjG(W+*fMw^EKexvwh=jhd&UVKX)-PzT_d#mOVKb?ryM%+8~ zpYa9i&yd-eN-swToVrEJ&6vcE#@*$%cCL6;pHU;VS`4Y+?>D7*S?uA#rH~J#QtLE9T9gJzJHDszZh|}7}gC`MeM8? zro(9*ASzbFuu8-2=X$6D6`M+SytH+AqfxPGR2{i#yd@l)&WK|0n~ns+dLl*#ld)M# zfk4KwNJjvd>64 zrN|=PYwlu^Cpo2<8JtoieH>pyb&&uE$jm842K6aL`JO#aDasS46#3*SMS0?sBA+~^ z$frJ~$j~&Lc2l0Vlw%qc}7kyDBc1*a4V1g8`U1g8`U@RXuZ@RXts;FO{c;FO|} z;FO|9;FO{ucuG-YcuJ8WeM*s`;FKZ(Ii<)z1hs`O)Fd{sXIK!t1QME)Rol+!%rxfL>Pbo6k^ORy1 zQ$|iH5)Mu&67Wwc3ZXfr$Z+J8BEj&KVgw3KDH0bwrI@|G5!-23aPU}bAcQ%1O%Nyt z7n>!J3$r3#c2pi#el~Y^HFJc(bnW+*+aZil{_sr$%s_gzH?+33Vl?><4E8hgHfZ-S zM%)Pq{&C_-9HL6+;6-O7c(HC`e%8u@Mw}m{tK*xQ(>g>KG;VL))GUq+1h=0!m`eek zCUAiPM$d(YXccmUDQMN~p$0;JB`6BWuaEc%5$$b0IBFii&aDlY7vI7WzZGzAj@Ri% zx956b^3Fo;SKolR!Wjr8=Hq3B5yj^KS_%k1*Sj6{5w%fLzXdO(t?;DSZG8vGoOPQ~ zziukK9G2AmVPKXoBYXZa)pd=fwt^6zWGDWbYiQ}o4ox^ASXjiy*` zfIUd@C7l8BS*vOo-UAzW^28Y}CUzz@lhm-$g)1iR(q`zVT}?wU=>_x}(hWHv}3suWec1 z-PVn22(o@LknmpF2%imt_#P1D-!heZ98K{&dIrs5Z((cO-V{|nZc+_vtiFlZUna%k zV!7hvU*@nAIX`Fc6e-?40Ump#K@aj?KC{>Y(rYK{Vn}+fPrBxWq<0un zmeyuUV-|g@C7W4cB0=(7~Ch{tq`^6@rdk&hV`1!VCu96uHT znPE{vAQA&Pr$EQekRt89RfF0#p>tRQU-5u^!4;P^TWAx`fh9G#g!>XKNJo?hi0gXD{x+-zDfvb`wX^N)Ed6 z9~nwY%CtbP=ZH$S4}U$3!1T^aLH9aNG-Z8daVXHp5?PUTG;=uI4~$_uCIjHsLLHW^Xi;PZpL);W8N@mT5Xt%$4g7DLP& zUrx#q^;YHoW}+#c$8|JxQHL%->V2*%ubr-867_~eh)Tp4ZC9~HaZT4x0DAWYS!<)({g?7z_x`N&cpLVZLTcG;j z>nDNIypX4};n2oU@M(aCz~{B&6(OmJl8oSbKs!$OiKR|^@RuNQy;cl`k(@HLHmO*l zZm}m!ixH3iRjf$k4@K~}!-5-L8h<2$XO&`obe|o&Q&(xEe~t~A;Y0x4k)N}!a0Dpu(y3v%3laQSG(qEr4z6bKk(fk8 z()vbX0a1}Pki_X+W@v8RqRb<0y`^4(u*B3)`k~BIyab|;021QRJsDI|(r(-$NCWJ@U-!BPt8U1i@9 z``@J$RmwGn|KBd9WTNuXr4+)!QVIcoDMbj)QVPS7r4)kUQc460mQsj|E~RAE&*6Iu z&ed*gZo(}~T&7#!Y)(=s`}`P>EIa=W>C85}7QhLp52F|gjEHwZlSArUtwf>U@k;ao zss|rxI0RB({osXBe%8J`ofvlOWQpTUtY+0nBFwYphaFp3tzJC+9^42NLThP0hnG)} zHxW(m6&wS41?Eu&-$7s-0+^8pX=5xT;j|mGSxE30N=TE!;lWZY{D*LwQ3yMbaDHK| zgX?_i=BW{D(GXRmRB}4JnT?m)4jToANk61S=Qcb8gK>nxW(+BzAk-9JH%%&!w@9G| zGj=hy`NG6LGo!s`c--eMu^@(H zq^rkYaft=*4tuAevGT9(wJ{waa z2=vBTuHobC3~^JB z-4Hmtgxxm>@1$yOfBcyjjbazfHwg5%rd`0Uo?OzJt))h(g$Cj2o`aLuBm}CwI7Fa` zKn3*iRutt~sY<{f_pzup2$g{Jtgi&n6`}<6F!Z8wo`?(wNt5mml#EbRtETb_hMZ}l~Zpo2fG$D$n-i}rz= zth?B2M$<^IB`Z2n-PAA%-J9vD9hl*FU}mZc%S!G8t!JRbeN}=^3mXDmrj0~iC!QQ6DEx-UoE=+6eO;vAow&Ur$?bZ_xxcJ)qv7wS_7hIpaH|~OEDCg$r71m z8pIgn>lEjN=Y-cXthsTnZRTUpT2#C@}fcY?W+OPw3)-K z2nr&2JxTcQLU<|iHK@EAMXQ?pVq{FZ6q#Kl>V^|~>e(FqN|PJrg_op=2K#-_y2O87GV{73^QI(m#o=Uv13sd`k_K304n+MPnE`RUmFWRS*2^QKtFK1m zB`TV4>g=#0SvB_81CJKBQcLmxJ#!hDDieb~WYne7e`Fz#_F4GCtouD~A|VYBacwL- z|0Oe_6={0V{L-7z*JH?2X0$Q}Q5H7adLs z%8oX5QbXhFSJ2StU3Ruv#bLYWh1Db&&ITgG&scwB!g>cK$r?mbS%s0@P*(J9NDpC- z#t)edBw0P?F8vtQ%t4VKMK5EiDz$H1-&98D4l=^@+yNYTK_z9l=vNkuO26r34&hJL zjYMbo^Yh58K@0B*L?_yt4!hd%*p0E!e!50a_;QfOmmh5{g5@b#3*pF^l=P@h$?!!w z(--Ni=*m`hm=wApwTW{5Cd!M%NE7w)XA`sS#qe!5G0{S>f~~t0*r> z6O(8#OwLH60piRM5gnW|grg;r<-gF3`nEEz6<}JRO+`$7ZE8ja2MQ(7A1HckWk{M} z>XYfuy|Tiw!MRsJ^CDksLX=)$2<-!HTe}2=)gUA+Gd=m0~y`GL8m@0zC*pGwcTY z1d@&#rOSc}#H$UL*eNb#A`>T`G~RMaS3o=#cgJb{7@6{)CKsMe^;b)#Jx zPZk~SS(uSULmV!A`4WcG9cSvMfF4gk9EHe|W7? z1!FY&B8GnDBs`)?GLu!vNla{*4wEp^G{_BoAARH0cBfZ3IFr^0phLou2tf!3EhgWg z5ExY+|U>%XCl z3dywf8=WMvAPprpkgljmon*>J)eveF87#g=G4IWut{4^oqYH!K21rETOL8u#`)i0| z0J3}o5YaCF3t(ir4>=3#DYE9PqNF~hxJCLDZ+JnUqD3ikk=WkJ&0pvXS&{Byku};3 ztN{3hX`wDfUeVV&_GMJTL={iph(MS{bkQIrx zTAf4z#F%6O=FZXBWK>k9{~L9yZzR*Skql)$5Mhz&6H2=Xccw4g;kJ?VqZT87+X$V2 z*A{JKb9=7*K`xR6K1E)lB9HdYPgWDr{iHzlK^C2@rFL1dzmAD!{(tz_3s-e)^{<$f zSk@o#ifG}7>Ja|eZi^LC^0W3$ILbVFGu-}67^i(3;|VXx^>BbpC&+Tr>9nz;@e6sVI&QMy81_h2t!%W{+ojnL5EqH*}tDE;=rYin~uQ)hr~Y}?GF z0lc*fUvoF5`L}A20nTX2RTiCBBZ+j7=XG@mhmBF5A8x|6bsaVZYXECaw#uy$sde5} zmXmnfa^AA$UhHfiwf@ByUv{qD@mlBl^*4KOd5c#$iNnsOF6UR)Yu!(JYhH4`yu;h` zwDS|I>wt6X4tsz#Z@X9fS?^wF(&1k?SzblVc7EV^qhP?k{>iri9E;CI_^$1voNZlW zt^wk;_$5Hxvi%Y#z0T?Gaxz98y!F5Xm%aJKN^ireCszIQ%kaEsKjCD&=5)_RhDW`5 zbGB~1l@&{lzVyWxy%Hox4VT??AIL0cqqoPY zdAscs_d4nO@AbwGZ$YX55Z{BCtG2)G6u$lHdS{=t-?@9|CC-m_>|ap&;>uNHorE_^ zhin&PU@nBfR@ZSLoM2RZWRX^?vwPjTmTizK{NNEBorx|$<~a0*^XWR=w642;9b9(- z(p0+FK*bbonrJcyRM*Is*0V^&9z4>!MncX|Yo3$gy=`ZJS>TV&GWc&P%Nylnu5-HT z&cDdH=n`k0x6a$^JcqR|XLZ+&&bCX&I|IC~Gghov;k4CxpWeOdYUil(x||tx-tKB| z_bPAqC#IacYSol;>z%cAPHvaC+v%w5KKD|mPu){qfA7WB-hp>M;SJq=-pt)EzO>RQ zIPA20b>8URW4zJc?wg#ouX!)paWGXXI_40#{R>+&Xent=ep*~NPB=VGqxsDoB=DQo zZ%(vq(8@k8xru|3ge=+Ix${i3UT0YswAa|xy0wq{z3}h2D+ob*Ls8If-+A|a|Kct9 z&(5vY-@o14wZ&TvH3IzR!%nZeZ~C-1wrf=Q>>&1e2ZZbDfL2rf+q&)HxZGKe4UjDsQZ_)O+nFXY`(V-lgYGxyS22 zY2F6!@nxSleY{iYjrx`3_QM_C8xpwF@+wv@xDa70zAk>#ZI>fAZ{yIZPGa3#9rJg; zHUG@BHs0^$d-+b*VW)GllQq}*>W*~_pZcZqs)Z5b^>QxTdGy7Rqg&n@QQhLzOmZIH zIeEA9vf4A>I}Zbx!x)44jKeoOckVbk-}$Mv=PH)vReJ@`?Dan9Y(MN=wWIE)?(To} z+TQ7Q{$0HWCMP?SySx{juk5tPTF&oOmy=^xTh4`tozL$?E$wNR^BxW(TF&Qo+Etc4 zr_^4Y_PcXHZv&(@{*c~=e;v>^aakg zQEQwb>*jdpU50vnYURq6PIukB-TWps2MtM-rlRW>~@~m`G%8!$u(#f zr?bw<+T(PtyLRPy&i4He;-8b4>}(xXGjE&I{I-*^&got^aoS2}dmZpwobFLh#@sXN zm(Lq9f6Al2r8EeepkknDf&y#7Tcht>aN#HZbN$U{;L~?8d~XLTgX7CN=M&w{&bFgO#z)1S z9B)tlZ*R`EZM4Fl(H6G){Rgzj|M}$XW6rLOD1Hnf4(Dajxe@v~5F>=)R#5KcqOp4l zQiC+X>JMmwkHHcvgUR2fCfwxXCpo}?%EupD{qC<@$j6#Kf6N{V+Zp$j;J^37<+kT| zJ?0B*u2qm{r$PMCP-vD_f8AzLO`A6HI-zNLjFRJi!TDB!?V#Kt(j71Sb<6#D-J#ZZ z)^~Qd(|eR=*ne$+q()yG0EVv(C(s0HPz|bs&6Ba#SO0YNDyL$<({%LS^LOvwa89+8 zI0{=bYWmstc6WQvJ9%E+{^>7vzcXpd1}ER1U^$sxuuB);c3}r)Z_Mv`O-Lt2giu5o@L+!^XQK`20vzh;9ENA4Ha+a<5MOA-AHGvzqZbw4wt3t+Q(Ffisx8W4Ovu9 z!YY&o?_mw)>~+r6I_GS! zVwLx%ce(RR<;}%w(qX&=bm6(jo4?yT^9U);aUN&GUY14=i?G0zqPr zv-PlZEna;3b~QWQuQ^-2!_Jkq*UKw*3idm#-rNH#9lXx1b8fd@n{p$9hg+S(b?fm) zp1x;+(;E?)hvz%}@lv&RKVIubIa}wR?qpAPwoRS^>``YS{=L5AjVCX5y1h|e^>6V~ z_ItivdDFhT(7EWSGiv|p4NlqH&U)|Y2B!!weA~UFoxAZ8wA#r#>^!`~JKE7b$N7?V z*ya-9e~(Jr*0rrGVmsaymBz0koO%I-i1~Lawfsdz>7&|`9t(n$-RSHVa4@??Sbw_? zD;!4L{I7Q6E!bLQpI-R*ZC7_YXOF__!BJ5&-HA|Kb#ka%$_G$#u@cx;LGTU2i(m-?)WqZB~4L ze0AqdPM`fNoeghvcdlt0z8o%@}!-hM_sxpV(}kg&SPH(%}KzVY}5ik!07482*1d#9g-h$5?l+ua-sF`|%iGTQ*PMC(UwhvIUsqM-eUe*BC=db^EK)I)f(1)R zp)JL!n)Cr}DR}c}n?m6xO>WZIJT7_k0Tp5?54Fw&EiiDD{lW$d;jR%8rX#)8V`IQRkG>a zThIPl>YA!)siOwUZhgz9+m`?K+czw0KJUqa#i_>KsdEQX4GUB69!TYOrz#ev`pXtx z29mNF%hr```2lvhR+v%e+JyiYrk)J8|2lQ)iqwJ?sb%f&T~j8UQgfSXQkT7yx?tgc zbmSGOXE8|Kb3>JEzo)J(Tll`)?n~VX^ouBNSqN}p>eXO-s`sVKHm@n$g~{->E0#4v za_Nj|sXtx6B6V}gKz-NZc2A>H3AKPnB#>VQ+p2EVq}e zKo#gwI^$$f>bNi=K$2FxIhf}$IxRr8{69SCrkA zn)6cX?CtlCJl>J&AJ}CsJv|va+E+oXDVR_#L{GW*c7wlb^5g&WtD_$rOtlQB=G>K9 zIh;D`;O*EnKBvSil}|5Q@w*Gl-q(#7GUWRvKZ~90O?%G0_q^08WeYzHyX&!}9?TB* z+)*|ax|Yqj^E0XRupwSCx$Hd{I8TuM{F1Uk`Mc(})Z5MeehGA*{AB7K!}q36$ENpf z-%h=7eOaYAuIxX`&bv8P^%4f^>@!!qj8)}P?QrQW2NqP82obT zvIkT5q02rIEKHsK(xut+%1*Q_QT5pmcBD2Ak3OE7T6%6t>Z>=P;> zJ&g%M+0&^hD`ftP2r1i;I;shO%^I!)Nvf(F?q4#128&wJUNtN0yCBzrZ1QbLevdiVkKIt@v8Ku%x`Y^xi4u zWwl3_=FCayrt7)+_!5Ai z725SzV%J}$7L`|ibkd^oSv$q9o5il1j;t-O*-=(ozU;=ME-61$lDZKVE`x3dEkUl}5bZJ9^KH`}>mCu;+c^dEckfV5f!NSx> zi-lM1(Ww(kiiF?Nqf=9gU$<&FJNLf5#$f6&QH1 zq@PH=KyTIHDLr$b$s48r6_O|QhER_;Ld{Q+fkVBV)DwN=db9FfWw^%d?aecAxiwJa zNxi*VPvpo^NDsl69f5wV^cp@z>E$OR?$(syUYNh+i4CCVZJwu<9`U(T`rXaa?{1QQ zw?p#8jgyy@=enmL6FiKr_6Yjl_t2t`A`|Q{FI#MKZ{j63ujz*(Z|uw(Bk7MSkMXuc z*iNdF{0L z==@f*$qjWx58*SUd^DXFYzJxAy`bmagj$u0p1qB6C)dZ6-!Xc9q1HR3_!kwQ-;ah% z(tk7MjEbkDh%d>{8ISkiP_753ItT}{U@WI(NrksyY z8poxb_JN*z)h(u0)ck>TM?kk zk1o9wr=>@it})YCTg=fcmo{A8m|4)){dc%3d?Q($BkJB81v^10S< zF??>4{G<5*86G2SC9=*mWSt6R9mzKDi=hzzVyEznfAyYrA~_i2mK|Msv4SQuvtImL z^Q_mQ#E|*{1s6#O6!MSY_fCN>x^0Gc>zaf3y^22}h96V>QpHQZ5I*s5&q1%4f7(4~ ztcYP29bI}w)Q9+GoAQr;)(vsG&IDsA_##?Y*mN35e-?dm^J@Tw-%100BM6sa3TE;y z`R-A=j~Hq*ekxxfztrPfb7764oFCFRfpE#utD<~|l`guK=>78_l0D>Kpnqj80^Ql zgYe@5c>%lqO!#v1wdFZl#Z07~|QAgikk35i#udw4)x_A<_FUWv_dHuV7$};>k z^=0zeZ6}%ElEyO@_J!@yj~P=PdEh0J<=bhE9-;_@`DIf(|koc;mhCF z2z-mxeU91GF1UFH?%0Bt2RdO%e~@YE?(fLRGp+%CsnR)s7YBE%M0}?&{4#VXX0iPq zw6Pc;-_837xur4Hl*nTI&xh*=K;PHCH2i9~vCVU#<*+>V`EjQWKBe0q6#E=_^b6wr zVtoD=r}2j5toh^0su!HrQ7-Vzr00#N6`R?|}Wv`g>C&TJsR2wQa7?w)EqhdmG^VWze%L8+4hj)3+(x27cXUtGjV! zLu*S{*LsAd?IZb}882_{U7u+m?7_zkE{T3yv>)Adc~5(9u!$c0yqbHK)(ze_mWE@IaM`iL{>sZ$)cy> z!;`to8}&=fi}Ao~ODlSCXa7KFYk!anQ_AYjz5#qpO8Z^VNmh~sHidpcxZt^vf!^LA z@+~Z(Y7Ox79()%ODI@gsM050iWxZ#V`7~XRlmzJu6s!wTaSeVRtCb3J(?;U;3^HC* z9!Zyj@)C*uK_x$;i^S5PdW7&ry7Gsj@6yHZlX@01%RT%{R!`)yBK(ZvN`m_56?`Q` z5&VOqjtI5{bKWs>I6@Dq{wb}Rq}VG;V?H7eeM^Eyvc5#^0V*`aLacR89%sVs&NHje zQV!%;609b;GS69rKj{Rn{)&S1DQd=bpmo2dl|h;B_o=F&Jdzh9rFsD$O7DoC?ZbA7KG^ zZ_SY)9zU=)$2;|G>al=V7Zs|nN*L>rp-9E61DuXW>Xi!iNN@zoE-h z-hjnLRE8qfuKGotFYTS5_guV-Or zD1u;~h`pYORIDu|x+&n7dJWzCMFlT)>{q1~T&3sI;DQmtSA}Hj6}%%vjVky#J(mXO zj}ZQ2NXEFL{!k;{29K&*KXjU=$>@QsGdU=4i0Z(_GqMl&dp}f?MR2{*eMe4@gKs}BPD-!&+L#-l6$+o|;^jt_t zFkfh$H-qqnHc{w9j@N2}6w@L};*1h})ery97~%m$U0&(jStY^AC(b#1Qc#{=U1e&G zP}IMKS`ef~e+Dh$ZL~nOsc~AR3I3f!H4tQ5)dz#Y`7;ND8G1T@=8WH6zbW|L^{4(W zSYG&2o-2?41buwNZ0jHLX470OO>+KB{FyQDw2*revM68jqyI~#QA55c{Fk=7^~s-K zWKo~c7e5Z0nBa4Y`mbnW@@Cw>SxroS>_`9I#3y=ragDZXvz}!{CA`yxL47H=$`Pj){IFfpTA8@Ef zfIh!xPz_frxL(i427O49TY?$8CiMsJ7$JIFSc4!{z%-KJ zu8^vbHY*%S6TzHA)e)pwVr-Ka6|`)ztGJfn^$xX)Ae9qdYe!h3goKIEdCG(ONzf5) z(rc50TyRY=-BT@2R|-1Tp)Y~EA?_a5JN%Z3bD&{G+F(qTf7i4cQyWt(g4e#4s0M=D z6=egCrQ1(+gakjWC`-uF?&*$@-~)=Xge>g~2?9ggpj4VAtAv{5ki(e6cQ4=H$uqLH$%c8b}%^KlkTlc4)?i zWxE08TfHu3bl_XvM5{mGy5wqtv{c%&$=Q8}vwJl`c0x+p9ea(7?^OgtUti_>dR5%lA6J#X z5UNfv)U%OIdugZ?!7Ci9k=A@ZMA4exhA67u<5X|-^=ypmIag!5*2Q@B2;t?5E5k6| zU$$$KKLUMP`_KKZAEgN%Qq-iNX5q{cmL@ApjN^WPNHZkeQ!byUIX0bDxX1A6 z?*f6%i@6)c?S1k_Dc@Mecf z-=g3HA<@Rg~ez!V+hC-6aaHbf`4JFDc4YW#QhCj^NiFs*WJdOiXvbj2Vj1qnVF6 z0~%?-KRHyIAf@1@8^Lcm9nu6Jbto@&*61Z#S{l@NDQuq7EOczr1nIsxL4O6-v(qqM zp7Ez6L-_SnK3rBgv)XQ!UUZfxWt(#Ukdx9x@C%AMGU%VaYtp;UELiswu5Owj>mCcCntZb|d(pLp2cGt0>zkS^8c`Nbs=;Axl4Yg!KduI#dI}-#An~!6VP8 z3FJT`A$XcY)f2qfp}Z7rYU9sw3cyT)S%+#Mc)OyknJj%iBqaES2%#3-iR?OE#WcZP z4%I-AV$d5L2L<-%`2km}p5Wt(vZ`vqoj6xr<0_^JUg=N`+Z5d4P-%jpQl3l6h*qL) z2yReDsi6Oc5f(N%?j9=|+~i2s5o}h}G1z23Mjozx>o#m35lew5xvM#)dWVqla%o0Qqf8L4h4w50CaV?X59|5#q=IJeA5j z%}@-2kl zfQn$q+jHsD%KLRaV>(GNG(|RuXv;pQLS5VzA#*$w zIIh$JC+Rt1BK#x0^wW@ppnTmz4zvrwqZB1K%Lt#WxMPF8lK9Eh7QDENp& zr3pT*sPdqHQl3Lbi2qS|eOvx@;(z8?*3*fV&YF69X;p}#8`g&?g7i#W7rN<=u*yRU z?sKTLwKn{Fle%QLb4>$5dJ6;izzA7A?pS%9iuGnXV;gAfU4?5g4rp=G^dwGG5?mEp zU?Gy^`7lnxs6JKoD-9NS-78L$Ac-V-krS81NMd+kj3D@P6>erlEYM8}Go9y^o}{J0 zTud|c8w>b(`N z$?-IS!fYh038@H!JYktg&WjX4z97i8yB*_M;;bHo1Rv76mXM`?4mlG1U4)P&{-OdL z3Gx>imLp5=a)VPn!8;UX36;Hfdbd-hjv&pEigj+AfnXzH$DlP&Ei>QAx0tV7_r{6O3D%WZc>W7*RY`LUX`YWXplL_DLaC2NMQDvbc%+;W{ znti623%{f)KBs5l^`gRO>WoKlgm)?~VE`aWjU!24so=&CIw4qceXA|wS{MJ|E4Ov z?o>;6DBEq0efsMPJ{F>$Q}9rT`mKWHPF#Abf-^$YECuI>sJOpwS7o@&kya*rgbFeD z-RPVTC{hRs-;htp!oEC0!cXKAvT&SgCmadW7$cg6Gx7)t(?mna0vo{?6SFwUVA?h# zPh~dfm3cVA*Ermq5t>WcB9m~a#~d$dPglK~^_(!Ly-+VLa3pDh+;>RmfH|eU+108i z_)&*iMer{bWuurS4tbbD5&T(Lm*CGMby@nikWe9a@>Q#&YCB!6MuJpERI3|d>2^n0 zNAO=As*xa-v2|GrRipo$YM)c+?;Ni*!7+zwAfsP7RGMJO+gtE)?Bp#Jc$MH9m)sf% zHYv)s2unLdLY3`KZ_`V2^ehobc(JRNCZ`P{ihE&Xp44Av#<(LhlQ}2Nu!kTgETAG7 zs!&fAx||C2aTQR}8KwZo&-=n!1pi)9)>kZXrwMuye5XN)rH{yGtF3AgZBfb~vlDtqiLNBazI@b}T z-L{{xMANZIAxOI|AxktJgaq@w;4f1ASZGS}LQ{elnv%TGl;DM?Brh~2c%doD3r!=w z7n+j1&@|$Ep()7={%U4S!#mS(%)Xe3yr zsN~k+5LoIe)+u9mdQqWwI+6y0lL;1Viv2BZN+A z1>Ub$Kjb7d#Ywn!W#WM?4=6QxCzuy!oMc{wCfKuGqOG5!-~xxLBe+UY)?$`E6%xi3 zC&>pLN&035!&(etS9yt&wCXuY@iD!|SB0Ph5qwQASuI&QGG+OrT?legog8*2YlSvf z(Mx8h=p`=DS5`yGf5tV+%a0#!FKPnNV%6=v5= z6ICcFgji>-0?>rueTuRT&e8)RA?wD^Cp(flg534OI*}k53j4YdmO}O%`QqFI>W7dc z$lAiIDS?;Q0r?Q!r=6--5&V*(Qo#pq@P<~7n-rK3cqE~2;&sA&4q$TdfnWf?h-8_v z%Pjtkk`ZF44Qs@`K|{Lqf=DCGH7(kd;K!VCeK)vgo2Uio;_Q!C#8>o;C%g&L1!dBH zn1@VH@VmDycB1mR*YR6LFrOdZ(NLGfZIx?ge?7sVnImoF}2-tWa%evNWGdMt+j;X+q;(bvLd`YEne*^ zb2+~VyEI-A%zfp*O5f6CU~Vo)f4=IL#-xQp{c`WLzbR8+OdoK zkxJA$CF%%LGGdHiqmx)i@O6h;MUY}eiMkP%UQ*S-j^Lm2w5=Oq>0?u*Voq`r%FZ46g*yJIP{Q#F{>Y&key-r5 z5Ot-BTJJ=H+Z+wAjV{a@exM-Tfp-C(>-FJL)#88XS^7EQ7ZeBEm#ZwwPD%%3D(_XN zLOsFKW2^&gmx#N^uUMB<(ci80D>fxn^fx#wRG)M7jBZb`x~Qst#k!=5zN&u3rlg98 zqw3nEivCj@G-O3+Bf)f08~uuPNfmt?{fbRV6@451iffZ9`Zh8vyj4RA?HCWPI0+t3 z&wa7RPlXMU@;Lwa+a1QEryl&_{_o#v_2XMX z`0@k(ia)L=UuM7;7sT};U;d7teE2qi_%Hb5_4lhj{P{kAh0oWX#Oe7H{NYor9e3)P za_HADOt;tX(=+`{zh3+{dp*vd?R@bW_Bvmn$+u<3>9;B3Mm_J;Gk-V0hxqw(fO!40 zH2&x6`7%9o3wMuB{NvB0^1rIzFT0+l~m&&TNb z1U+-Z`cy5)>p!CSAL{vOJ@WzPIQ`=>dOoRKi2gs7{uMp*$(m_u51&8gW6W`R*C^e9 zo^R3fu%376nf{O0AFrL_^qOZCUpXiwjNsc>*6wh%a zE}!Gcsp`+u*$?#08%-A#@b}${=f1(cTK`!GHuW|j^ zzbf=P``1+k=yxdoBYM6~&+!{IUo24nL{)&Bhw)9hxPFf*;z>QfpyyxdnOkVwFH`h? zpZ*{5KvjDuJ|7YU?fCzv*Mp#=q_q#<+{jk7MiqR&7E6N4AfGl^sSNyRI0A=4YU(9EYY1tPdf4i^)10G@~aJr?~_)W8?72f<~;7 z1+?u*IbdqWsr3=iRF6Y*4`@cmp^-TPY$Dm1%Lo*po&5$&EwvNzjbJi4s5Jm>}2<%t3<@&sKHe(?)HZgI66!Xub)W3ha*ATA;z#q51~o z3lV5&R|{W8bQr1iJ=EGWjz0ejG<%ECRLRGLgc%Nzl`4@>Ph4io{8QD|GSH$0u_;v| zQ4&3>*7x@lW8$Y|CX4P|wIyT(A>gwCf2X+X0#xNf8j+GJS%$v|i`bFEMaeeuKb}QN zdMs!v$D!dv6cSabl84R=0?r1>B?$O{`LTvZB>Tr4#me2s%XbW4>~ zJtQNE4{b)O0VLjx9+Hv9fU+5B2#{zNJtQMZ9;_KnFBb#b4N%PwE%K z@+8n4!vAnIKMSQAwJ#N{A8fChH+TLV7pq2(i$IeGWO9qaEE7H`hI|@;sl+{|5YrCK z5C%hO0ow|Fz>Gy`hJdMY{*icwDtgf4e*>Dma8Ahi^T1T1`7DP0)Y>I&u^M4CN;c-q zep*9I%{nDQ68KqkR+IoGX1_5sk+G{pzJu)_-+_jmngl(uBX!gE?UsXv;_XjYNO+kbb(Qiv9E--va-JjiIE{Prm^{ zwx3>Mn>EVD^wWPwE8Bj$5Q*bKkB{`z9O{kNPn%KG_EXsds*Xtt0_mr1_;35^Y0!sJ z6Ou|lt;UrKpi(7%o)b#xr(-S-3-{A~(8Bi9We_A%!-M_wRiJD?#TRmW|C(b?8n*s&Gll66^)d zxNiD;f`*JbS&iGM6W>M;M%}YO!?}=!KrkGmbP{!oFJ{zz2qJkyEu@pEI}ZKKMjf9v z53dU(qr*EZ8FhSuD@r3#w+E?Xj9IAF z%vuKXF2NLuI(#G6%&qoDYORr4sE-q@Wj40@i0!iX1Bd1v%*IZi*shU~`f(WbjiJ%? z*EAQ05@XSWad-%5;gB?^l^PO<`&Tj!@6jA5SHeT$a4SYM8;2s*KO_!koX$A>f=>X9 z#Nimu*plPf?06%7{?Z!y`8(hu*(!R7pJ!l#Z2g>^$HdRohvDZRqwiQhXQM*2Bt9HH3?E92 zSs%9I`_A1hTS6BaPOS(o8>^Mcv8sDSVLVHI0@J*M@jUc~{G8Ahnxn)&cC1XG(LJK6 zppmPIGrh(2jWe5;FP??#(i`Hl0;(>3r=y8&`cssmxmW0kT(69Yg24}BplMF63^qc>1yz?ZMp?qP$70mn+7LCU!01~Z5A9xn|=oDZJT!V zXZi$nX2cdzxj5l12S)Ii{a##B_)DMq|#n=`JqsYM+ll!hV#wsJ%rNH@*`~p^* zEomOkRjsq4qym)moN%#+#NmrqGY)Ts&HNn*DQs>z1%rhhFMb25{vmUu$4}=RNuG-E z$s|_y06ku;KIvjreuwMxk+ECuVTeVkl2d$TfRT8vK8$$Y;NtlK)Iz1agE{Jcs9@tc z)05rY-P@M8OXKEIkR_TX%{JahY)BBAI83;IA*z{qR5#n}L6Iov$RT;-NF?6z#`iHO zY}=v|^?g6fJnHvgV)I5eB7+6-b8`_t(}yoQ9}aZ&BPZnN1L1WXhO{x`!^%V-3e9Pt zsgOO4pi(3GTwrR7u5PxpWm*FB%UUzS2AK>n*FtCTvl!vL1bl`ZXTME93z}$GeIspJ z;o4LpHhQqXH^D!)zx#7h_IH_QN`xk@cdE=>V&#%$xL#;3p)`wYiqYt<^)Rzv(mKw_ zT5?5mgbxaNhn2OY7SonIeewtZRv{DwQ;Gkw<%V5r{1pqsLv_9)4OD1XcwHc+sa;Tv z2C`;eafQ*@$`WqTL-d(hTU#sGLNszs`e0QL``|awy6+TpHTa^|)( zm^0U+Bl~2MGbPx^%b8cBy=*_71SUQo$(i>-g3X!HyAae&`top*zASVyud9T`c3w9M zjAX0uV1Jiq6m&k{+0z+)GKKwX*z`DQ_pm;pH`2dEAJHO_kBQaASBTxk<7aWL$SzK^ z{EF)FX=(N*? zHVWtPy+zucZ7T11ux;9%?dywYaI7tmMQxiRKl`c}{o6s~+RI=DfEjbS7u!(-8^HaL z!}!s%61>Hp@R(S%BxC?x+2tU?X5*Qm5QUhHH-HAtP0q%eMMt3~Ivr?gKn+7XM!bb4%56L9|d=@jw`Dmx;XeBiyTGB3BB#u#t9TF{%xo9~O zvV3upNq*rniGRmgSV|^2R3xH=Ml#7>SZp)NFfh?xz^IcKdf2E#SI)HO=2VA~hhkqA ztHd#Mxk9T6B?%mjo6lQ}w2rh<^mro?RSm^O_r(085w#1Bv=IffV+SKjer+sQllBUv zibTu1Kfq{t3>cr6M9VFh5sf$Z8#;_gcoO-?=8dh84Gg z)UlN_u9fA%jLjK&Dj?g}@0$7};Blx(D~o?VB^~S(jRe=qww8Dm+X%5^Vy*0ZowK+* zTq`H!7TpmN8sU(%Y7_OOl_y=#R{j=BeqWYW{+es$&&RB?MYGyEj8?t`xy82f4^c6> zmD7jO%0sS|mw}I17#?ip54%>*^=Aj$de804cJ;QpMh?CV9u?YxNxexpJ_wp2(ijm3 zfLX#m7-0Co#!+kkGKUeO=Rh-t+fd=!;kUrlL}-pcqveXMCWOy?&*8kXDvo zctrcg8;Lrnp;^C+2I0Xq{unx!?SuZP%g7vcktws}=)wFWYjbJ0r1gc=kjVV@c1Gr> zksaEjj8KxuT!TBIHvjw%?d=~jS{->dN2?mYtDuTR@7OreD^Go-VK|xtI?GJRKV(EZ z1q3$2<=1I`gv*FlivKVOeAfF+fRS7$E5z|~-9AK>&2_J!7Q!p~$E%s?|qgReq0lmJqt*jl`z zf#T;sqAy!Nw?&0$N&H+>#Lx7hd^yYdP%3uA%J5*{IUFBK^hqC0^s_!o9Qx4q=1`J_ z#D_P1ojyDU9D#@(;=}ES;ln+L;lm94V|~~YlVXeF!`xx`u*Uf?hoyRJei#}?AB0z} z4=WS>BSfD9&EA>$dF(5|j72ct0jB!Qe3~Bub0C8GcVKczZ{aH7NIbu=CxUq^Fg5SU zr#T0hp$O&@U@B*k#*c&*@C`)e9qdhq6A3v~E!3NsMQ0*NkZ|C!WqDF8$SgVwG*ARI zTktn}zfveAqHep75%s^3ysi;+?1IUQ~BmB1`eq+QQ79@H{i$t%`nGqi?Z8Plw2*Ok&?_j$hGLayD zK0oiO1>dxG*XLWR&$bpPW)giC^#3--M04@afg=84h8%FcyCXY*A6(=OGR6U&@SoK= zxp!}F>Fbf`JY?(wjj6Q>we}z$r4)ZEh9M{~lFFT9`yk$()Ya0O1+}bUg(4NSbg%F1 z05p8O@(Fr+@iYlA%?^V?@Hz0Qj9|VF%-#q_UdvQjMOjko2f#Q#3nF*{n7f^H!5jkS zo(SeOU}TbD>=Kfo3=5_jC(HT}kvq@IvbLTmG!e|(foXOa#$gy6@CfnjcR7>4IuD|Fq?Cupsl#C}(9`LpvieW1R*n! zUn6JQ(era?Y~M7=QRl*eHb=cTk&pC2+0V4S;G9Gn$x*{-ZJVPGK~U5*_S1g>ot??p z{Z+lqV!A8iXUIg9*yW32{74oQ2N(N&WwH1X&Soa_4BPZ6;U?(FA#M6R*5>2Q2CG45 z+p7}weZ{3MK8B&sw#CMX3>L)C)kXa5`6r+^#^??AY_qdHsOpq-JoCaP^m!Q)@f@|q z%zF{?BAB^5;nE0Z{>hjFC`L2?t!$k)B)!p-F2D1Q$eO#ulYWdReRx9B)1LI_Jn7p! z>7}0ZJ0>K3r6>I7DeZMDNvS_3&=D+Akzh^?ymw3`2@uatT z(tqYj-!mcUHJCbx7ADEEzg`V{LJ?V{}^d~*(dnY7)fhT>pCtbe85^eWK zJn8!;Bz>+Y{ccaX+)<56mtSy3WB$N|q*r^=@ARZE^rU~?lm6_4q|f%G%Uho!md>5) zNx#RFJ~kogvpnfLJ?XPO>34b3e>EZLGd<}$Jn6D#jCf=IE>HTQ2}!T?q;K=2PxqvM z*pvRsgrraRqz`z~r+U)2d(wmXb_RiwT31qsGrmvrq<4AJkMX2m>q#%0ko2jZ^fpiW zBu{#uC%s}q(knda>pbbNVvZDzy7zn1r%g!uF`o2BPx{NA^kz?b<%Fb{dD2&U(&eew zsO?Rj^jQ;|_yMDtv%j$(_i8vl)EV_$ zPrBUgih6#bC%tAu(qHkU&-SG6_oSciNnbW0=`VZIXL`~f@ubi4q^Bn&{g5Ypx+nc1 zPx^FEdeelYzvxMy>Pf%flRnjx-aH}czw)FX<4ND`Nk7JuzF|Vr4|>ukdD3O~DH`*o zp7h*=q>p*hU&WF=B5UrQp7d8hpftLM-7+ER&w0{c_N4Ffq#yF64^2q=v!3)9J?T3= z=?6XOw@ygSuUrZ)G^-R4P`=dqMV+kJRKw(s|(Kjldu z@T5QLNxx%4()W4N_j}U2Jn0X4(nlvG{Si;Pyn$D}s-AE2q<`I$e$RxY@AafV_X-$BRl|=}EuYlm5VjY`@==ezzxmi6>p2 zp;ryH$L*bv^gW*RJ3Z+OJ?U+p^nDYOzT1<&%acCWlfK%Meqch<@A0JX^rX-Bq_23B zq~GmHmp3_Tn`(cb=}DK5ohXgA`?C|Webke_&67UelRn#%J~kogcY4wXJn2(C=`-FW z>34Y2yFBT~c+#hY()CTeuVFqGJ}dG~xhWAjs)0FV{8O2Dhee-Z48l7IQoS*+7MAfi z`h_zdcamoqpeT;N$-|VoXM3zH+;=EB6*RW4A;%wYe*6>c> z`*0DB7dvFNn#O;TQ0Pvd+&Oy9-8qu?ru%&4&QWubJ4Yf`?$8b4_LIFsw+t8{@($ji zI~oqO@zdV2F`GvKa6?Z^x1ho}Y#-P#*t0PR@?uppK!u47u`9|$N^EzzPbd+QNTbgq z4WVBYdn@z9P2s?%SWyuDQG59BWrX zJX_o6y^LlYhvvd{+$SmVW7)IIZyk46(X|D=df^T)YpwILmb|shXvkXg<-G=q(P){* zXn8}@MV|=gd5xa*mp$pf@}yTzNcuKU`btmwi=OoTp7dE0lD@^0zQmJ$(3Af6p7iPo zNgwc}FZ858=SlyPCw;+$q|4Y8ZTGpJbh)1&p_%^~PkPOSq<4AJXM583d(wA!(w9w0 z`UX$>Oi%hFp7fk2Jv|}mZJzY$o^-yI%{^%_f3+vQX+qMQJ?T?D>GylKFY=@}Pe}SY zPx>*Q^xdBH*`D+b6O!KKNuT6NzuS|3f+syUA?b~t^jA4HF{{tL)06%OjHl5&zhy$w z)1Gvh#YKAe++CjZ=RN5|6Oz8tlm4P7eWxe=Nl*H%6Oz8nlYY>XzQdD#zbAcoLeiIb z(x3CBZ}X&o#*==>grwJa(x39A4|vjtJ?WzplD^QBzTcDHNxx@8(ieErAMvEO zdD6Q)>3b$5eXb|{Ay4``Px@+4`U4Y^UhPT0-;>_xNw4vw@12nJ*`D;>p7fQTbot&y zG}rB$kn~xe^t(OjOFZfF{fnsd0~3-y)02LuCw-wO{nbfMx~`<2hCbu1B11l0Mdr!U zb-@^|_%o~`VV3n_kyT`pmdHf$@0a}5G!av;SkXH>v!QJYj>GL;slywOUh8y2%pOwk$^vk{mrYK6sI3(P@{I*Yjln3o+U*VoxI(2ie!m}jvnRr<$4!}X4> z^(A0xG)t5Q{R4e?Yfo>VeO8vW9t91bODPR9c-O;5XlL&Nljfg5BL{+9Wyw1)EAb8i zX%j2U27bPOjzw4C+tk51v!yH35(EoSBlPMSpy3?A@~H-fvq6hl1`OZNW-%FH_G+7g zbE|zTyS(CRzSp5Vr6)rYVJ@`B@vhN$pdH|TQ2%jf_c_?D(^T0%{ z_zf^mMQHvA%-#r}6J@Ivht;_|+ufSmik#r$c~iD;eQ$p@7zP2BX|NQp5ZZ+AWCZqk zV|xBH@YxZu>z%+1xmqG)DKPwYRcVkLv|pUD&+d}XYN-{`a2qhq5N)LkpWA_X2<{Ah z_!VF(Bk}VDFx3vz-O`2r1RpxPgwJ!J;oJ``D6dSqtT7mNZHk|0nIA!oMXWf4TC*bU z^(rt2BeoxfIIWJ*ycHNefny`#Oi61vLc1;irYq83mje^_FQL8$m~@2mt-=TY!+0J= ziSuwP>pozHBU$1xUxZDJiPZW9Fx*SAoaI+W(<1tu01V&qWNA(Z zrV0GQc)kFbS8*|H!OMY}i}r@ej8is55R<0WHNXMb0&j&`JSJG$PF>b^8>wI$fA*` zdpl^jI<}nO4Gibu7E=!le?4R|y};b<+Dl|y3rx;gA(#&VgBHt+ggbz#!G8o5dafMz zpfoqa=YC+CA}#nRFwuy54j6fYLU>p{FAK);Y1RHUE8;`(aV2V?IkeUkV5YlTKnJG? zO+@=#Rb;V&Gm^tHfnK3^Ja?!!wHQDZ?wdKNUhBC`6VR-}Jj4@@|hz}wHv za6ZlPF`pUg=?!i*7+P^BYH?T1>hn!t_B&Y(UD>QyupnaB_ds(1|HHO;8YSryVZV3* zm}y`sTrKC9fZ66a10B2$%>5C}vB-1Hk$KCh!0d=vdLA%x*dB-e-r3WJEE;Lk<)9gj z=zIk*FS_1@nM0?{$Ev|6)VWEFVG8IyGv<4 zYTe^(7tCeA$PwC}0Y>hLhq2lX4EF)dOs}W4I~NSkv-hB_KDU78&PeNg5}1V%%-4Y7 zK9a5VC@|4h{%2r@(GNp!{3kH7!vM!>{LDNVtsIG#Il$DwkG2+UH$$WS{f>A;-Xt&Y zSxQG@z81B(vt;#Y0!EH-+}Q}sq=*$C0_LfR^uGpXX9V+ES~{L4P;3C~Fol2O@mt1G77#;SylBT$u0GtASY= zq3Hw$h&<`n1M^~p=A*#ujQHnofvI+Op?Yv1FyYKoFy95{kw~p4fm!J=W51KfI%gt$+Sx!fLC4K5DrIRt#eOAXL)y>I9Pma{d_JkOCr+W3(Q`pv+$_{W>19A zdSDtOp3e!!@oC3&xfL}lTrJb?K-B;n+I|yiZ2-oOxybYQ2R|brgc^PfG^3HMb(hqN zX!uQF);Z~57(5QlixJF^fSDTc&mmxP5m~PSvnx{TSp3?XZ_KtHI}?~u7aM$Uyd>2y zuPy}5kh8sAhx|kHm;o{ao!!~_bAx4uhHY^%YCRY6YNN=C#C$6-a)hyQorl>8%p(y# zp8#fN1oH)8_D3we4;a4h!dki)m^~5CKMjoRON5pl0%kbU7Qv~gu5ox^O#t8CTPYYt+N6c(JZvR9T+)6%=N&`j##=An7f^&8LS*IMGA%^`g|HR z(_9N?^g}g65$S&in&%uJk@^@gcSdAA1x!~2GX_lBwIJr$UD+PwC>IIB=ifmyaIF!rd# z+nzBNT}pWjB*mw{<^mI}>-z=WBtwM$m-@K1!# z_d&zwZAybpI`JKHwqt~qN`d{2A#|2Pa1gclG*oHuTa>EWvg-#sGA(^AJssJ87CU>| zdkMF!U*DJA#8OvhPnK|dpFF3f9N>O}vQSs7vc-4T%zJJ-dp5Onb+)A;t{dA(eaq~d z31M+!2?7}q2$I=HAEXJqVIyd2swf4H*B8@AXi4lPqi^B~q{h8L* zfnG#eOoL1t+FLg7#Da`0WY@P~=hY*#q14;emfg~tb8pe~>5Ly+TD#l2dJ0@Ll4KLq zlVP^Ildvrbw6YZQX*)3;TGQEcSy*+$Ys3%5Wh@u~p zSX^7H&~kxnN+^;8!u}o08__J1pDRpyunl+ZwJ_Vtuo)ziS+Tf2vvPSuBYIONgHJ?e z`tY6dek6ztDFoS;jiF=C!$e7T`^>GJDh)CH=yX^#&*!?Le2Ca?Emq|avQ^cAU~+xE z9eC4vKYDmy(ACmE;4t!S;qxs@rYlmsz*N!wNq*QkW2QHmR@@K4{|nB~479B8${Nb9 z-j+7AD-mxLZqy2oegt~fQuS}>-Hh)_wYPU}$sk=ql`KHD5@Sr~#%$MCni-a@ovy6G zZ@%Ul7p$p6XC>Gd>&yRlP75P5Y>-o@6U_)KeWcdjejo$VQbYJFMx;8v!i zzrCfiYp^dHT+)zP+}k5JcI&gPy?t$hSjrBOfJ*mb%Lp%D7c(`Hh}n6?#LTFB&B%FO zh)S(tz1-K*iGhJ#tbbrtf41*3eCS~*HfT8#Vu?NoG>H(~tyryOa#ooD>%VB3cADEx z;9}zoyZya=TN%3ej$i{`If#A_V{+Nf3l_}J^bPh%prSfPWqi)JFW8JkDi&2;biuqi z7x_(Dzv}YF<(DnZq#Ks5TJpY3{nC~1TWmY$(#x0l!(Ap*xPtU%>yn10%Vd_>+vhS8 zub8Br<<9{`IeZW!3+13)knKiiG;b#m$bMWPlbqp{A6`K#HfJ_wx7z5XbMmgY_6NM2 z=|Y-;mYL1-=UP>TK}%bkV?YxG-)cSQ(f6SlFshL$t7IBiHn`y^{}u4(id5XI&a9T% z5JtD4ekPyAotB#)e;dskU&exM=I;G8dy$FUbxl-Nn6qwQX&Z%n~jx?nQLO zI4#|hg<@ckUh1?8GRylf@9mM8lQg!xXYpWPAG)6*aD1~pgWWO-k?z>lxxTNZZ!3oK zZpp^|lPa$YV24y8PJQZO;Z& z{=9h?%meW_T~`|B5=4@ntS!fypca(`Ywx&Zq?yrg@OLAcAlrp;t_6nKNR)1CCwgX7 z&n(FsA|jJjEttiUh3f~pR(E0o+0wPDXR~Z`H)ID^_1GNI=5qPPon2^o)kyjorX{dR zW`d@PO|G)5h)nXFGLs2IoC^-sMh8QfzY^m=GB+}(_+l$&CEbn4sI~o&pA|^sLJ}F) zDB-dKV-qG0{U-CON~)~6^`sIg*G7gik%7pra}23je7Cg1TI7vRWFbkc{TN^~z3pOa z>qZ$9yD|Hf3!S~|Gwp*t;tbQZbSfLKA)k`zL)J1$y5;>y&HaPx`;C1WOhx)-`Y6{h zi5ZXw4(LRTLCC<^ zXO}}Xw!6Or^It3^sd=aFr78hNA?$U;SRiO|0}2!RFnZK`=*|YO;~1h*=HHpF+~V%G zm1Zrh3spDXhpZ20VDy$FR!xMO=Gev!vRA%bmWT-};xO8H87WI9!6AcmUvDeYKR7gY z^#hHOWl%;6@f|X$+}~_Oenz()$SSQ~HJkLA41OWyT(3^dEY9@jvaOx%ovmT!E0#`d zN0=jS{Yq-iYaEp!(Gl>T3eM1h}KAh z-2)ghv?sf@J3~kuh1G%WU68dh+p;Mk_H7r=Ni4yG2`-{~VPEGC0|#!jp83R+wg8%| zv9oof9j95_(fTV{X1l_XXB#3k%-&}(ERg|v`y*Xn{0bEklOCEb+voNFVjB&%Ap~mjghpYkL6ew*k>b(br+My z!4KAA_Qu}QXx5OH2YRku3OEJyW33v)xz-#5(G0|FXVX=zE0vKx43w0Ou@=XjMC3a& zal^zME7yb}Uy{vby={YCS-YPnvjj;RRwfk;eHY!yi^O%7L+(*Tb}IuV6BjzfhKTDv*}JLn?>U`p7sMTFcd}RH-$q; z%Z&g_s{1L-bsTql8n7FJq1Q#ZNw(Ch;L=bYnU19g(Pue4V|OaNL>6t0j{I(5OhNpa z31=}DB0{Gk-DZN7kY2fSuV%w|oryS`bSPsKNoI+TM*7gE^;^NzWiJ<-NK>NisCk2+ z*ui^NUhw5l>(Tq7^LDbd!ZYDa6bqoZ0H#inW}m+)Fw7ctBv(f^P~3dj%pvk8w>Coz zvR;TyIgmGG#lrk-QwB;w z@y-&PA{(Db=%71wM;9b{Yl+BSy>(;WVxd63;QSV0pEpLEI5onoRp`9tIT_dDoR!x_g2L)G9_L}bk(*k;zP{l|9g+0R> zBF!2dGL=}e8rCwlq))!tf_=WmwS_!|FE=1KJv0x2xni+7Td`$c(o}5RiKjpAK!429 lbTw?%4;zLH5~r;FK>-I_v#(=jdv037DTCXGi1q2<{{R@CPJ;jd literal 0 HcmV?d00001 diff --git a/tools/win/dfu-util-0.9-win64/dfu-util-manual.pdf b/tools/win/dfu-util-0.9-win64/dfu-util-manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..12f5c819cd0cd81b3935cf9404478b4900f6f4a2 GIT binary patch literal 10602 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 D%j{l| literal 0 HcmV?d00001 diff --git a/tools/win/dfu-util-0.9-win64/dfu-util-static.exe b/tools/win/dfu-util-0.9-win64/dfu-util-static.exe new file mode 100644 index 0000000000000000000000000000000000000000..fe7f875326eecc3b6e8809605871001701da5abb GIT binary patch literal 799602 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

l?WXrpr-n2W5bu&ad2(a>|Q&=%)* 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 mSz1{EtL9r_4&H7D=T}rL zjfF3;)^PaevG9iGmcpv0iqi5JSF!abb8R(T>GPt9CYoQ`L^~n8w^&P$BqQFE@aYns zUR7ONuDrKe>kw>+1=Wjdxh~#jJp*!{@an>fW@o_a+pSMn-xd?!?CSCiiZQJP^>}e> zO9g7og) zoPYCP$(&~k=XB0uaAsAMQZkhHS?{~x&~!v#(>Hs620hOdNq*JJ=IXN2TC};crs_tz zaMk;qcW^N!sokXIz-ynpv*fy<6KueAjRn!xA1H3-zPWYxAdSD{(7!m1a% z7qRLUjudhRaEsBo@S^u==4lk3GvO(;cuF!9J@yjN@>42X~fIg~pR5S`Thh zUT6`=Y~e`!JqNdXPL;z+9(CM;>iVLBnZ?R#z5-OJx<|LcwpD%Ukxff)73me(x%1O< zvNNI!vU9UC)PO}_K*mp}ZdMxe7MGSS#epkjofGOkjTELX)C&EdgYCpwMUc+OoS&Ur zm>J1ROV5lV_UP=qg2HHeUT$F|FDEB60`GMl&bi@PQl2LEB1U@BGnF^2x!d>6J-cY8 z@)l~=#=W!VWY2_2DbcL#9GIxQ3$%oJut`k8e${PA8K3U*sg-zwr#sH0cEW!Q#ZRY% zwQiiB)(fW3zKZ)so+OQW7`Hq@ysjRF^GnrW@GN5-efaY* z%0`YPUlQUcZ70$jNBM=L(b|SGT$o-<94E4=N_#uB@0^U&SjiNkh*aqWkMD12rgZYo~?9oEm&HovVug3VP#cI>EbB9 z6!w}m{z%HEpalAY6BeQ#F-u!hbxTFG4nA@PZY;+pHHt{NwCEdq->~lE>iw2vkrv1N zL@gc8GokNEXd>;1yb-Z-*(D${+-0t>qvtds%fAa<##U|on{H7o@|F>SeX+Npxdp!u zZDzrBB1jDaRbxdL{X0TB*E$Rv<(OO355m$YEUUJmCDPY(`$^c4SE2YP=?QDqw*Cmf zw|~~E%kf9w{-oT1{W_+w z=<7-FtiBaA`t}>+KdBB^GB=bd`Agbpt^OWd^zAp!zq(^E7GCh}_d?+0x{A88#+6F` zPQjRhwwB7@z$quev63eFOM2WQmNJ~Ql)r(KSM`Qn^zEO0Qgb6lc`Zwn`5&~(TGftN z={ul&)ik7xz5^;&&qDn4?N{Po^;eWEeFs#pZa_BB*Awrdi0I7$@;9*fq~_+b(t0S@ ze}hi9R^I|v`g-2BR(qgC- z*Yl>;ZiTMtHer17Vr=SMwFrzOg_)`wK{E>qBPz(W?1KEX!t~iHL|A4d zk{3~N%#xRvqv8pIE!kuQyhz%tOqCuB$jpf5&76~&UZ^q*M~sw7BvNH~ zvWSqLrDpLzJ-4da1kTTl6lCWiB__J;IFdx%+LGUU5-tXY)`8NlW_`V=f2;^u1%rp1G zhV3;ay>KjPO_l2TZ{eu{PtTtnNMb^J8Yiq3A*=1^dJhvaVy9Jdv^Q#@eegB{ctYhX zw8%H42ou~nf2_41LW5+@R1z3?x<~b$CTuMrKp(%eQ}v5VHcOTzQTE`%85x(@!JKyk zb>Qa`*q?IlP#8Rb0F@MtR^$CQcCigP20^~yVEhhTfF6{-{`G_O08oa3{RXyyN?&X6 zz)Jkl*MH}rXlp%>6V1QXU)=!1eCp++|L~5evaGDGw7MSsP`>2oqmuC*c;xxt=!d*G z{8C=MWC{8GV(Qa8|HC?_eRMuoq2&F6E}c(b5IvW@jNfki=zM~9=R^GHd={Z%c7x}T z&WAwV`4B{%5C5a{p?~Up_#d4Q{Zr>d|GM)bNOwL=vpXNcr1N1G?tBQcJ0C*q&W8}Y z^C5&fALgLWM+4}5G=R>BSu3G^jftf=%Z`u<33_5fbZs2#a+-gz3(QAk+D1SUR6rK&+?9FdQ*bCXrm74-u&I z;eXxv5V(8i6Cz1R=R>&N`4D0{A7+%!hhRtNLujn?abR}mLo`?CL%m3pkD$e0inGI|b1r!N>T4SNBx&r{+FMayAp8z}sZcfudz97|Pmy$BAB)LO8 zMv<+gAGzv!#Em$HW1Μ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 z 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 literal 0 HcmV?d00001 diff --git a/tools/win/dfu-util-0.9-win64/dfu-util.exe b/tools/win/dfu-util-0.9-win64/dfu-util.exe new file mode 100644 index 0000000000000000000000000000000000000000..fff0d39420fac66f0ef8a60ba75969350922b400 GIT binary patch literal 290852 zcmeFad3+RA*7)5WXb4NJs6^rtZ8VGt0ww|u0itQ>U`3ln0*Z=C$O0K5!K9l-9SnB2 zQkIR3<2X7xqvJT6&OFZeIBYVSgeBk_gA3w@sAIK(8N?A0m;Qavt?JIA&hz~Kdf(6c zdHVx(w{y-t_uO;OJ$I?fv@6%S`nX)KzWh%lT&|6T@+(o#|NLm8__#ARALn{KiK8U%p%Mbq!M}9@id!nNqSr) ze`u6@T5EpfXn5z0RPN%+6~c?;aGyzhWr zbE4ZdUIhI;ztO?!6+z0z|CoocC~c=5-GB34Gv|-4st8t)X$h@${1@IL{O|TFam{ZY z-QWODpx`0?OSp#r-G0E8j9zNPsW$GTQ0i>$21K;PRZuc|g$=hy>N~`Lf!oRdZa)RL zps`W1<_(mmTOQx~H3@&UPQ4=QOyH!=FZKk5Ui0WFvt~=~B6)a$lWu-T5?#L%S4s2e z;9^y;f};-<+`cXtiP>^#Y^Wrz`j$Rc?bzQNuAuqcv3A}=9>SRpoYfmHbMm=`MJlsj zH8At}U&H@@eh1u`LX|nFfS{d5oJTlY8q@VFaY1kFIF<2d0nen91@6}GfE)Ki1($g; z!A#&zA>7y-u4MALKa>hxu6GCVSPC3t$<@&tj(W%2{9X4K%A0_Dg7BU1fGZM)s8af? z1Z6mZa2@d7e$tL^$^Sq4|6&Pj)z0vvw4=2%Y$KwF59H~l$FtStD(q-;q0BCl{Ya(~ z1G*=kZ|zp{cr&C{kDqpBa0N)erpUf(xtXyAx;9io2 z&6_d^^w@0BjMqQaAJfg^JY?rLwNhFW-Gb1ob+hkqF$21pa}(0j&86vu2LtBtm(tv> z&g1o>9a>~8aGPXO@g-i-4eOAu{dJ5UZ4T|%&2e+VDLiQQ3m`b5L-`V*=jne!`N9g#@Q@ZpY(3=N2Xp|k&4bP?{BF_Hw zaqy%g{@i))jWV}s(NB09o~Le-(&4WhaJfoji*w!6Di4;meAp*o#I5Ek@}eK;#&$a8 zF#xo+SD~zhZ|dgYcdf~k>anG6-T1`1N8*P6ZCW|x-7;$l60~rsoJref2icuB)!O_G;fe-_={YK7mz6Y4l)QKhX&-`Vs*2A7kvcKJiu( z4t?Y0MAl0Qmn(k0RU)xY238&etK{4E??WLDUw|I-@rZW8uj}!fqZ=P~mye{W)2oMzn^u7y zEI`YDe!FP-7vCUQl;~V6z)#7clM`77oXi1$%>*IQPGl&E@aDZb{^Js2G0#27yYp?~ z)UL0Kg>qGynNx*`61%~@3d(_)KHs--4^%cQ`CPQXDLmaw7FHs4yKqFZur`(~`~WPw zFoVKP@PPghL!M%K!UqblBPWp_%nm&BzCJA zpl|d@aD;C9bMub zpI>GiwSEn0$(%WVlMF=5AiasX0evF|)?9@Js9=En2ar2=+VmCs<9!>&eSvx5TQ{Dw zemNh^iSu&vH2)458h_O_TWuNpF85uQvbo^{I)m4ENw0ji)OfMXc;0VBavzeKLzq{D ze*vRLH+Gb28xB~H3dvZ;bh3OK-2fGKSkuoXuhPaTE!-v6ethTH!VaI&!l?HfpZMKh zT30};wCF4C&SsDTh-*A#`U~aC-PT|z__Yl$XzMQ@s+%*$ml~FC1arN|Fys9YweDg$u5m1Ho~Z@)cCqgE8V88FQ->78IJ;NS5tXu?0UDQ=S#O}Ytk5V z(<)!}yZ<%K{faZ6>&9W-c*FXw0$DLaTkp@+CwYR4CJhW$nSoq?bXV}LMAi?!gaaG$ zMg_U@HKewbToFvh@9#-U&6|>1`87SIR!Mr(#S~k$#25?_;<)-Z<(6Q5Wd-Js`HMwk z$3ji7e0^GFv-PWyE?3b_xszzmi`t!R5F}D9WU#m4s|XEiVV>PUQv_8hDtG8-wh~

m_r#=c4_Maxg}QT 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ð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

;+loWv*K*7PJPf0ktL6K8Zq}%}k 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�e@Y6Gp)`XYZj$nfG?b}LOf$k%#XKWhYM5e9eT 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

^A~$d+_&V!80`0!P{1BqCxAH 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

=YDo*~42Mk7eYG(m=YJD#-2#+VgsC zx$#BE+nVAb!Ipx2X-6F06O?P;*NdPCXxn(XwRoR8`|DbJL+#9ULb&LLS}U|6GsPdOu~Zxg;D^5~Pa*c&{SZ&=C*$a7!co1!8T&r9~w zw0Fc#poyvVOm8CC)AQws1)6sYh*L+7fGH{HA<6d+9vg2aPvI$dx|b)`f^e9%l?w3i zvznONkjb+uZv@jsYxvR;?B}&MR)H>baetku5=yC5DSW*qNOh7|(uo=V7{RKyHJlj1 zvadCKXl9;RrSjU;>bZ|g zo2)1X`IP;wj`vzzIWd1y1?(5ouCEp( zjvQ5L&buh9T63acD7#t_I4VzBHhjX=DrMF1U}e+B>NJb~qA%4^7A-X_8XoMirz(N; zPU-oOr<#m}AFQY&c`8qQh?F_`Lv2kM9Z{yD()0E5k0xO9JbsSx=<##-NyE#DG@m>p z^Mn>I)+yOzY00WcTSN{BfcSJzSD=RK8gN>pGV`~ zFiW^MQVYiVMpiNBa{z5qHAvxIbK{Oh1rK}kvC4lr2LPN ztb<=h(kf+{j(bh{%CC;^1z_!$DBAMi()t3~EhR1G-xQWc`{qifu)qMPr1Fi%J{@N` z`&7Oc9*mmFG$-fn2uI4*#ELSctJsYEBz}KM$ZjZcpFki1d4WRq1hRurn{uaS8_T_; z_}cM)W;}^j5S;}ft}R6uZ`|AQ6$2m|#C?415);r1f0GYP60$jubt!M~ZsU8bhu8B= z4a56{obyWDW26GHO$-Sx<%t)+A&Cj!qx{IfgzsVRDdk^t9ksjL(97}N&UXl~zZRSD z-OQ_Wj~Rok=ZbBI6Pl(m&Jeb?yyMLBoWdojmjU{(X9|TxO*^v$FoT;ohkE2EXG~p-Ps1Z}15vPZ;^?e2FLDlO_)4Zh%m{ zuU!|fTT@o;RQ0W`BnnsC)S`kA>h-#7`$#O3y2>?;ACsk)d$-7Ie7>h1 z9CG~InTS~GO`drQ)fpiAlgJUciH})t^F#LQoHx?bpYMexokrVMN@$T#{DL0T?X;dy zZY8mQ#q=18-?XZ%qc`HXEL8bJcyU@C6NTCBN8zyJR#uH!*|T0|zOQq9muhubA+F<~ zO$Ajds)GY%qNbJZBaCYb`l5DH6}ODNUN^X{Hoq00|AwCYsp^L&60gqdAAVWxJ&gCe z9U`qS^Ymk(Rb3@cZY!@Xk{P1%^=l8#&^$@_g~p7|Y;oWQ>O*>~SAN*+JY%seym%rp1- zv#ikml6+9tH$G1Nr_vTW965j(qH;z0DOKVfBK_d{S$T5uV95DHw$xbVsZe^L?|-?K#!IYg zyy}jrsZ0|_fiE6fDaC2V1tRTWg~#c6lKi9TGPBF>|1FFlb#ji9T}zzVMLj4@GV<~Z zOHgLnmeJf%bKbvBym;trjuW|*E8m$XK|biC_O=5^2RJcIRwe?OrvjUFWMPQHZGlZ|tC+;md+3PnV%Q9iZ~`b=1A@XMbhO0bQP2 zT(4zM{M|pIFsSs=XEl(XId?Q+nv|V};S2KdWz3#F_Unc_n#x*TKi0)hwI@IQm1DX; ze1)&+VtHX1D@b!wr#9X2hBVzYT{KlmO1f_TP1F1rn_#(az0>=!Y~^frxn`^<-0=HD zPzTDFn%JY1(Q4I^lTO7Eb1cW<`@Eg!Rnt>ja{2GJlW%MEP)}OROJBc?qhop6{G5=R zmLRRq4WU-^r-ktCW&X5~{;CiP)D16D+*nD``cm)pyxi!4wfNmvv@vwLcCY` znjD%wB<(LD`wC@$813qLHFOM(UJl0u@yJQ-19Dj+gav;OF=6|yT3%3+uZG~+*k_KM zP1bK5x`v{>qxhRQq3@&;o<%rMpMXIpyauIL9RA%ZGuEAHz+2AQRmcO9oyX`HnBR5- zh4pWTXg2k`JF&8LCoJCRh3e_P>|JL@$#^M@hh7H9(kC zoDIw4pK4X@>;49mgM~N0k~u@QzrA(0m9^1b&AQ{CYB^5a{7Ux!wz^(9{;A{9`qkYw zXBMg~n9nlnC-Gm-{AI_3{SRQLmhLAQ1H#cW^U$d%Bs8aZnk0||aQSG$8+%|LeuL!V zvOwra#c8Mygl8~*8<|Ju-!lFQ<5w9!!+0;_2N>VZ_*%vr7+=ZwGRCVIFJOEc;~9+K zj&b~qf5P}x#?LU`%lHAtw==$$@dn0MGQN!QD#i;KpT>9wW3*%2P{xsu<7(c@JF~<8C zzsUGi#yY;KZ9tqnW{~PG3KJfIrd~O=lvh`dBcXj--!~;Ap%zAvOn7@o2nH zL{h0lN`xal**=ktZ;U54$3;tXT~|k4put<$wHjevm5B~S(wX2u@*3l+On)j83^zAi zWAp|?(O5JyXv89$A~EBt-fTRSi6-JkC>V=fV_XD3>0n>v5-c&QU)6u{PX~Ne#nSMi zis}_%h*wd)a?3Raoo7w=tTHOnut{HIh&+owVLfN#o_CIn?SALTO~9K0@kk_WWD-U+ z9zq(^5hNsuG-d`xCXp}(g7HBkl!*66`?9GZB~s8ECw*;v?!Co)DVl1W9O zWg`d;11T{OS~`@9CNnYv)0tFakRvcEpb)cKN8>0O@nFnINBe+c$aZ6MDw>HP3!^cs z`WND(%+_p)WF*cZTO`SrO~uo2(D~dT6KV7Z}n=vx|5uFsML@^@K@kl6xu;8~hm?E?}Vo;G)G1nr) z;-N?^CUeK=O@Jki+^p)2Mf>^@sE)ipn2yiOK#K#(ScC$kC`nF|#1^$mfyfD$eIq;K z5FUThq5eoX3q=|z{N&w?h(tibL;dzpksywX73Pl&BsRgf>8&DZ^rjL6(vu~A3{@Nv zhJslXO;wPzj^RP6S%%oldE65WZKU!H#i4A(46cwume-!aOeD>jhq$AtwwYASl;Kj8 zKIKc5k%fkAC@7bmWe^ssG;*aN4q1@UJVbI0MlhC1M=}}GGx#F$a54dAqhgCd@r?ur zP>ixhBq>W1qf{g-^96lXFdL&>Lvh}c5mZMh?{e)`RW~+OWEbiG6{@CEO+uBSdO`x^ zdOV7g%BXZ=Ai_;cKFBI&X~_#IPjx20nSNwBC%B_a zD&JUau!YH7-`?tL@lu)=Ea+;xysdq0+kyo`jNpi>fqlUD;lEx7^cdn0APMLO_y9G4 zYJdSK2MEC7=iWIo2`EQC2*6?3O#&tWOCzyBIE9WlW%n139NpdFF`!yeyZ_!)Bog3eP)BWdN2{I)6=GnyQxP<++%OgL zA3`&g3iP81cDUvnI6Ml?Y{>)g7T~5k*M}KDB1lIpKbnu-L$P3VAm7#0FU9BRN^<=7 zP30a=1Z3}*!*AMg{IUTi9t;hm@Il(3PCQQ?(p`;}3Nmnb*?20_dlY?>yaT~4foM7r zz&LUvjA;x4&Gc$_ha1Vq;gdTJ5d%C#Bq#Z^xvS14KtluV%IQl7QH&8?0Rh9&bO-~E zR3uD}=>YmI^u(e+lS!^xyjX?4NKO(|n6$n$NBm{M{FIvauDxF2$((tpmLQGMuI#5V zRHhD>$EX-=U@Tb?UW}fk^rNCmZbiU}QeT(LaI|q|ULT)`rkkmks0-!V^vMdlITl+_ofgqN!Qh_KnX1Y!~`EyM+|LJr9 ztv$Dq0aJm4M-9v7pFA%ORAUU0iNw=b6R>+!i4(dG{MbVWnKA4sB6 zcg8_JWPfG#j_6`hf&)E+0a=0_{fVkPIZ-M(bv!~Sv)PKV*-`HtDM|%5%Mb$@bi}f8 zb~xu5Z0S>@Aoi6bmg&#Nk0OTklc^Zlhix7$ZF1_}KmrrNL_8WYFhU4zlr!6S;$l^o z$%9%&FsH)0jWL^-V0thP&vLCnJEHo*T?La&U|FL#oHhm$;b?D^)-+JDY4nD4gTQIuyYuSuYIHdIU-tFIoh2HpzmGbr@PY#xuY^b0osZkmWPm2@r2RkuS+k)QlG&woduN8znifizTA8B8-)Qf+ z(BZK+n!-AfmOL1vK4s9rNGgf}pTJPda+IY|a&;@Lk6Re&076~1m9ZE|Z;>Psh<*L=~pTT8>5 zaSB}6zgjFtBc;=;LNuE(D=;)Ap)5*HL@Uj5k`$*Wo$VQb#&prKnAlye2jsh&`c~@! z1sJf-*pUsOLQdweB$e)Z+3ElLd0i3q>foPCi^2?QLs0>TuiKO0Me4f`S(^hd6Z_K7-(liEnZA%vJ*C0QE`rXUem zuu0UHN+dF3bwmY@A;N|vQW(~;8EMLv$Ura{PbDHrB(>d^sJ=*lB-8I{5|VsYLJJofas>5p+`Fc~EO=|DMR=G+OOwMEIyU z@86AG1e6UqU(?%cRKDR8-BNEhy?>7^F1k#ESC$d1mS8)COSo_U9_*_1)8CJvL}56Q zN@O<$d$50nqL$56?cYn$g!k{kXqUF6_U}O{kL}+>S#4*xN;-Hq>>n`_p-?snp>2g; zcFbheuzybv)F8{AnMw@2Xhf!dC=b|YC3WxLjbTKv2TdsiP)RbyLNvTZ^vj{oX0baZ zH~r>|R>+sY7{HNa8E`v9;wl(N!Qcu3nGB3J$cE~KN*!6Iq5cpyaUdHta@0RYL~WK- zf|`NM5fj@F-Z1gP#FGbak>O8#{@~V$eG`vQJToz7Ogw>q&rf`1Vr=om69@0m24b9e zXyQqjpFB7;@f=*9HW0=b3}X||!t%z0Lozh*-8=F8!5d(4)5HtL#8=_|0=S+$c-z6d zC!RAZC!U*l(l~evLK-`GBOKusA<1x_kU31^QE(9BX`)C513}&h!%gxptPnVPtds(N z6%sr@@f1RSejzvs8xxO1#;=(^Vf!RfwU1&acf>UDMYumn!XrJ9f#kxUv5BX_2s<$` zf;cG7p@TQ5ggkfflLv3)WQvLVrF2h1Z!(@ID3ue>9{ePU@D!qg5)s}$WkLFet`6P` zhkat=VQG94DtsQkl~DU8o)pf^K#oX>zBVxidAA`f(g(@RIY3$TRRr;bQXxeFy-GDx zHaZl8Oy4*0We)H8iDz|(0a=iRl(K_&8ZwHHOW}~a#0-&SVPWAZHBwU~`Bz9&h?7!F z@lr9kfjCssp=VW0AU|AgMkWr)tfF(Vsyyw3j8vv5U5HHT$|{ap)ed~_?P`7VZx~;~ z*vEK?@nej~8Go1YFB$)i@mq{5?@-~^Fus=Yt&Hztyp8cb#)lZ6d#CchgmF9L9>!V5 zH!&Vze1P#AjQ@r4e=t7jE){My<8H?HG2Y8~KjR-U{uSf57_az*3dhIzUdG!Pk1>9Y zvG^qGgYj<0uP{Eu_`G4ocQNC2jK>&HFs{5?@x^1JHziUzt43B98=N1;rxgFWjL&C` zSxpu*aJ9y#C(ZEA<1)v%n5Ut1)MOzq3CO939+u$*LfD!R(Uw6d(HD=>i3s%RnJgxr z3G}p>>IgCO7w;UY1gvD-1iTK=4~XGf?Dc?h#uov%0ImjL|AST}0zKK-#sb4hE8$E@ zW-VaA9Jcdu2pZu!e@_08TC}&ZuwKv^(lLW$OCZNjG>zp25hG{az!tP5)p%U3Ed(%R z!9`3Up3rtU9z-WJnise0tdj##9ZXkT z_W5*zLap@>W2PSiF?D(+D5r~Zy62qYasY{VY!I_abfdk7e{I0;t!7@{Gc!>@!z&?MHE((;(8A?VQdf)k5yvLc^A4*uACe5uAUizuemyzyXui=C)c?6q$#5n~FUb^xwR?t=;bp z*n{bq%C|lKh^py0D$>4|j^A`P*S5&|TF|#8xAxc7*&e8G@z(kS^1R6uQQ{;Z%^^^? z2Z9;QpG|$h1_#w>=4DfHm2Q)$6zkTSvJqACJ%>X%EO)$>f2&H@`kE0Btyd%0=Y?zf zjuGN9!=oL3okPb6>*)Gt`5Ybju>+i1KKqf7|2N^tq9c!v96OYw=|2_8IU@3If;(D% z;)sOVDA5rWG(^m16`qwf<4i0FKO zmZ)i=wY?NtH>?%P-k1i=%#NicGZt=IEgx#nKygnUZYqL>nsi38shD`L;UidcoJ_&S!YU zW<3NoT_~VhY9{4Ur%f2Fl1B0@rOGV716g?_7)?8lR?!fM_I^nJ^;xXM#51)qxg(N^ zz)FpVxTwt4!IY+C)5I#!3?;I($ME(kgax^e04RDl#8qP^>TJRTk(xk6oys z%siB}idGltdV)SJP7*jdXy~GRf|u@KnEXmwA$T4^3gDjIRJW1A61+U(UqB+YODT5@ zaI6cnbmUc3UNA7DFwUhiPL0LJ$Y4(btKu|+8^A0qf>m}kU9y;2FVLTw5?ix7OK7^_ z0WsCh1H>sCE}@SdpCc}6>uPDa1a$;k^C8;Dq`eoTa$W^`j!kKUuwGY_JQ+C_#DKpy zi%}d7!y)hJvIwfBmG9QPkCF&IQGQz9MU=LQ1nLc;UQBSZDJ(iq)xKe(n8fK$gcP5};EZ<87H$}q@0rW(*8E6O_+U9P6nm6GfC#K*7 z$Vb{q>%j&Yx-;26Aw14^D?VAzC>ESTK(j-$Q`zcN>R5c*z5!!wou8I}=|_rb9!Wxu zq98`YJ`xf~sF1(NYl;J_7zhnLh#}AWRHo;v`XUU&uk4!}Rv9>@sAgSL=j$p%-VC7? zE3EoUngecbK+ftpw%KtTP@uk{#P@e>!oZJSF{5rD7qe*2M?cFKP10pqbadL#DD~T- zKN^-d+_ciHtP%NEwFT_fns(q{osEWb&6X!-uzWaj$n@v1wR}6QIgCae=XThuK=Q0P zlstP&l-6K8i}sPKSgJ$TUsIlZCrhY&H!DbADiKDd%?Zt6YX#)6w!-L$q|lwV$@^>F_=NDa%;OzR>ZW@N4`DBn(ttR)X1%!EKy)&v*nX5 ztaLkkpfWmrSQeHKU;khlOO~+)>wuz+4!rqJmZtLEtRQ9TRrNLtgU!wg#AazFx?Q&P zcJD~J-O@_F-IfE8_@+ua4B_jWdEa=^cU~w{%TBufDDI^+h z(8Wz&so_pT^)+caoRE&9)1p;S9Lwi{BSnIr8V=Z{rEV5IBKFnO7FWTgHJ&5Sx2stt!RMoAa4!|_0CoP@qkhY6L*Xz z$q$ycZTuvVFM;cIgLcaVPA)iYo6Yfu=0ibE4K~Pgqs_SZOmkY&I>#zq&4i#9&@?IS zaJB2gj{&sPoK}-GQUM2vK#q}qaO9_lEc4T|mhS1w7^xFgYq=O!_87F##yzn$&oO!I zEHoIQF&~Bt@*upRC2og>PSs*FHpi@3&i?ci(>~OaUAG=`>!Iw_;|q-HC@8hKf!UY$*-q&bi5MvlV{qv*q{eoX3fL#5jxL=qk2@2r8~xI)|8yQDp1Gb z&s{KTZjdozAA=eX1cCvb?S8wVk8NUcn$7_03$wH>l+$=PQsGOaGoA980KIsm(wH~W z6TI?`Nq#S#UZZ(J0?X-i8ZDLxhA)-rS&LC+ zVpY|onqbRPWS5g#9IgU%|G>a4G}8lRW*p0K73-|bR{Moit=INbwrV=4lPf0nMJwii~4$i;t4N5yd!kYd%!LflqKLRsTe}Ko3%+(^z({q*YG%4bMj-rW*}Wk;e30hG+@Hg}x#! z?e*d`X8mz$0fV%*LB%hP{Q$ZLinRtht&qm6Af}8)B^~2K!$u1RxMvXAjFSmy>(zT2 zxB-(1Eh0Ivl!wiKeR5x}IZ+QM_t?#KP#Rv6Dw0_HL%`0kxR_m<9~#!_tP>ybr3)lg zI<%Z}nd_>Gb=P2DRxUZ>S~lMOunKN2AFXv^kc__GQWff{EHLt^4DulF=+d}@R@f2P zl;6ku0TvK-xt^*&Sp_lm zd_%41>in~Z3Mr&iR%+#{8iYXJ=Mv)vz@ z(x+UC%k@5We=}t`ys}4ShXlweFUOSM-V>P#c=z(>dRGZhrEN-)wX8UgLJ!e!uGrOz ztg7s(w`Z1|d*f)Eyf-Rm1&(@jtnyR2W~u6JZAFF)5psO$a?b2}08E$AkX^cveh?ZqpnDm5{i}tQF@Z$m|Ry?;3+MA zbBv}1w8otlPIv6+vEp>PXjcPoD4}aGIb}Kx|9xn-urSk0b zYiXT1&+#;L2I||}8k<+^hh$*U(dln)vs+LeS^@aI^hS=&!q>FEqq)Ae1%11Dro~RP z`10T-l%zJ3rq**mZb@?s$7P6io1iG@3}af=h*HC?YY~+Yo?PqwN5@=SPH}OWLXS#J zM>OSh!5*;?%R<_GRkw|_722CdbAMK@JIJ)C>^g~{BRJ9*d z4L&AG7ZdGMbz;ZW8e7bM8rf4S{c;IG#yFM!5T7iE?>ai-M$I~W)sZ9rfREu+Uw!0A zH(&^mgk34VRdR0kks}}d@R1{1uTf^Q`|pG|0!NN~4sa>rZ|fA7UMiL>p)F1t;ibgV z>Lni(OR5Pk4fvOem5Y{0TC4=BUP)FTl9X73!CH{WWn!I=FutN=wWoYs)!e368EdQG z+_5?tFvOKFcu}2PvAn7WTSBnv@R^ouB6s4|?RY2M+2YkyYP_*7C*Qk-EncFsHf2S9 zZ{I*)YS~h`%T(V=OOOGd9P|l?sn%&+tBv(|(=O~Vn4HqdWbBCc(5Z0E%0`o!%_e(; zy5-*7P%GM7yiWNnH`BXig%Dagnj0E10_7c<4myj9wL+Cdry~MzTCAm`BiUp_6pE;) zrz8<_y0)NYVOui*FIs3N7OlDJ5S+GV5KilYVem9PT__~&Rxmv6xEA%$N}LvrT^sOn zQ#4j9JHdCsrx}kGo|zIXcGIJCI@aDq3%%FF-U~XKX({Mx2HcKwUI-P>e_kFL)B!py z&43)Xq>X%is8>W&gT54I7OBkORO!s)W5!&4g$T=n7T7mH8g1;R8dbi|T)aJ2Bo_c!2l2qJ<6W1&k!qV2#mo}`mooB1H(+{#8{N5?uOFR7XvXE@&{#|!b$AX?+*70a_m)3s{G zX0_Wi4?u4y&rJkzCm350#LW$@W7A%4!=-TF5L3+%t&7sc*9wVy0LR%sYu3xIjsUGm zyDY5uWAUeHOe#+l@;N^(+(Ndd8^{=oU=~j2Cg^r@FojDuDkSQ6Fe$*Wa?0}ucxICx zd!!D0(6)S_{9{B>Sfxn1^AMMH#Ks&>^CCzj%-e;SoAH4i`+*!8k)=KD$w=d|Fj~}e zoZhkckk5%2_CRT;R9}=xi+{&=GTsFI3NWqjy~6?c`y${Tz_ozm0VJRmFL&SOfE%+O zSxj267MK=20)qiL0aM$O)wEWJfsuK3jID9Cb)bj#_^^E$-$=#mI$IoQlj1yEfs<7V z?Q&27RTmzd<94YrU2KK5yM$6;$y`nQLpXSXeH6aEf)r?^qz2-F^) zT!^Iij_9f!bLG41Ek)JP+THVSXi)j*88bg>nES+|iyh^kAfGo#KNwMmH*{Yi|kvqki@1j`Hz2l9u{*Zj0 zv%qs_a-Emj5G=mibfl-hSkA$-GPWjCrh|qeECJ~&n2ZK!MTe}EsYA?o*Xw3on%2qzNL4JlF+ye>qr;*Vu}}T`-a&Q0J(r`rM%h<09(kl&zO^*O*vHsl ze0Y~~A7?zwxSMe`W5IZ0r{W)BoMc?X*u?_~MWg9y0b!`eQ=sECY~5ne`Sc}9o`zqV;? zS=UtG+$1`iVZBUvJN@l#l3LSTD{*Z{Yo{dS$s$lXJLl){6CBay*=*$s=+g{Cm;Bw&AAd+! zKQZUXAOG!~FO4+aUNJQLkv&U(ymi*?|5UbrV)oXP#KrI?dGb@E0!Br&!Dzk zo*u(a)GGDG89s+=@XL`{4u}o}`yy3ob(aM9F4ja-^n{39YvQA4Y6_~~BE}mMdJ`1y zP4dt5hXpvg@TPsrO-^|!PCYek;LA-L=|eq6G9Af=X?ILLrGfPatk&R!B|i3{*S~Q{ zLVqXcX#TLcuCLpf{93L>^bTlHn}oPXWO3?eBLJTf!rx2aL?`cRG1pJavp^Y~4obkq zkf(y8A_m*AI7iIDKOfEtB}5qod=aN*w-Bz_ocQH{sxyvj^s~aC;!|}JKf83%p%8Jnqw9dPXDDj=JFh~kz+pmBd0vW z3!LF?<@eyVj^-Lp_uO~lSJ&6CGAjL%O-mLUby@7M(le&59qT)mQt_qZn)8hhE?TyT zR*mRq@-Ka#|F2p<@3lO<&wup#^1golYxVP9+n@h!`hS=DQLXy>fB(}OC>Np?AViVy z0pEd-nU;bc27cv4A^-lhN#Hdfgw8>C z1HZCDh%z^11O5lV9MF@%cYFvs2R#fteI;ZDT@HL0&;XjSuO2!FP58_Plq=8%@J2ue zbP~AFE5yx21Mh2u%%I1CZ(j{F=waXwG(n%BtAYCflf(}kX+}9A8u(g(@IaryuK`Ly zPXd3d4SE4R0sNVE$O(D`crTy<^ce7FALIl*1bjQ-YS6>LYp=jLY0%xk8vq&5N#IF8 zbPk&E@(v;H1ziJt0PrB_3Ei?_P(rfF1$<(|VM7(Bevj7eLtn zJp_CkU`{dkfj+WH-tQXu|V@LaYQ`4P4%Xw16i37@!mM81S2bFzCa;Z6TCx z&_3X20Yjk2fm^~T+hh;?ali=ZVc?emyFpI?zZpRt2Ynd$ExvRhOfy9#U@Pcq;5xv)pnbrfNFrZA4+GbH1Ze?HcoSe8^bqhf zfCHe%fmfx3_#yEC?@c3*K#u|cB?|zJ3o&95V9qqe1^i)v0lFLbTY!b2CxAb-8EFAM z0=#z%bPak8IDn_gyNMsT^*ZDWXdm#)fUTe>fa|Xp;(oFR9s%qCP55oV7-;dgLNo)O zB_7~CfCHe%fKU4<CVc+Kkr%`R{MuIJJ?Kf` zlW&LqK^wsTd?(yMi@Q)(KZ&{l+6TOM7xG0=qX1ndJn z4E#C3IOq}J-GBq2$ACZdAnG;f8sHYd&p`WtzXW)lcz~xpgn9wG9C$9^FQ5(JN`Pku zWB^_VCawXMW6|Hfe(x#?}!KZzU|06&?CT+9f%ur5_r{4 zA&sC39|k-Mn()9F^bR@+{M_T{D?yI~-|__V6!b9g4PQoCB^vmNuR#7X@Bkm!hr9!g z=eb4t8RQY@A>cEXz5#ZMV!=NXD%U?h{2Ac5P zapVQ@1IJ&4oS>7yf7%Z@L5r8rro93=L5~9$e@h5)9Q*=53YZIe4EWOTK%by%fLHto zIwTtSKYoI83|jmYsd>Imp@;O;}H z3!n)Xy@7lOT@L(dz+1!*e9!Npw^^Wp=l=n99CS7C?Qf#}0X+v0bg*kOKb&Q1ANjcF0li&0X+RYm-q_t15aD&5)(uNAH38h zeh+#Q_zO4g2DpjLpnbsq3a9}s zYF*+~Koe*KxC`I|-3|OCU>)dj;GY4)peKQ!s&k2cvIqWJy-RE%8u(4XR?vrm*EhJt zFz9aJ5a2=3N#G1%1oRN_&43-Chk^eIup6}SxF8;2#052R#Y=u`ZVw0zCx$3gAxS0X}t&OWX_E0Pa`|-Gc50 zK6{-@jFCNX1z;R>%~dXO8Q>+*{}n$M#!2UxD2Dbjo@P%kp6x%*J)?Sh zcWH9kc=3dLQp%>{>XGTQ)5M=Dz^~*VwWrWEcg8Jq-Q_oyRnP36k(@q0ZK8P6eHi*8 z8J{?c%#<(woV+V!r}DGM%+K7k+x7LI@t+%Bu34pTG%tNq=`^>T5Z}@Qy38%7+TZCj zZ#mt4qU%(V8zaiQJ&#Dv+&up00`YKovkQecRoW=*lr8VzxiSH$Uw;#U?Yy~q z&Nb)y)wEY0>bG4lh5C|0ex}lo zU0%gwwL6sVdkWOAsq&w~((S&T*6CLM3a9Z{ecDuIF*jXy-Pmcno~EL6!*nyMYOr^`+k%6Fx=p1g83RbCve?JSfA70&1s;lEe=8}q`+ ztwXtHm1p_&TI=xLV!Ix5{ZO3teka%cy_)Ui!cOO=Z7SW`Wwq0}a@xcGpFnFp*=3#p+a>v?5(s(hR(Ua~LL zE>QkXHAW$w>OM&8xlmdQ=}pPklP5Q~1!or;%Su8s=jZ!XVN`mvW2mgU4kvMB%g zZ3p`~rI4Sax#i}oUAF~fDj0rlUXdPh$Nq)d({c~Z!9@QaOK5nrj1^SIa`!&Zpyex7Z%ebdQ+sI+IF9w~UW;sdakXG;y5k zGGS>A@shme$PQ)-i}MWR`@jE$1}3g~b`5#kv8zbx6U*bYye=w7u%0zqB-ZW3TGQXV zgaN1qlmo^;gSERVtX~1j4XpVA4&PTKwuWGTI@Y;=1m2Hh-{g}*?ydO99`1(#e*wHj zyznyw7=at@<8)Fu3x(Y4r2S*s2ctbr+P9{CY1-qaeKOi-roCg@U!?s;+Eb=|S=zs) zy;Ry$r#(8_x1~K-+OMWPQ`(oMJz?6nrLzUJCrtalv|mp9v2;#=&J!5mF$}~HGws{c zK0fV7(zyfL2c)wIwC7KI{j^U^d%U!7OMAeyk4<}#vsE}FzwUR9;V)Bq`hC-!=*i4+MA_) zRoaWC^98i8O8Zzo=yWoIJPNzS{h;p!7~jWQF~XrU7+bG*$@2xYw?%t(w0B2)d9+tI zc>`n^f*E|Yhc*{}X|J8mYtTO0cq81Q3)-`zebC8nq!Y5xUL);K(!M0^q0;^;oui<0 z6|~<-`;WB0NPCI2he-R5w8u#M`?POIdv3I+MtiYz&f@Snh$jf%`{Dj~C@XsqH`0?t zx%o26><I)qo~I7_bR&58w-cuL8agI1HGxw@54m z)Bpwm4*?zrd=u~{;KVN!i7G%npc`;2;9i|7~7~o@odjY!u-vk^4 z{2zdL5_JtgJyVfz3y&xkC1M)RR87Zu^O>Sd94BUp<3+icElv<8iaFvWak4lCP0gv| zG;uo4Tb(J+5@!oToFhIU&K2j03UR)eCo08!u>cLgLQy3aiN&}DkJod=GMvNupjd&2 zb5@EAaMt}ooW;5rXXq~#HKJD3iF(l>yrNO8#<{F!ahbRrC*WH}n`p<`tSfMSy+d^3 zR{a{BW?v`PXZ4ffBRDmm z#(SMvG}D`Lj%!d{i#zt$qhfzld`t|98^n#`CULX4McgVrF1Cu>#O>k^obkF#d_sIu z42!$PJ>pa1UU8rJwD^p;Uwl?PfDQ8p#Y5P3eprl%ZDLex7dymGzD`rMWKp$zd4^uv zl+RAa4oM-BBqJJrC3y4&a6>t`kByzHDfj z5xpa9`2TybkjkCa!IP@rHflRPjo8{AFrx$tc!M@uvO98xx zA}iVD=XGqQFAz+JqPUi(>M^mr+p@|R@U&Ow<#7(rVJYihj6POY&`*FmnyK8VFR^8Z zGhB8o6n+{_tggjoto)_zF#4@N+~Y@E6VeyvwcN}yC4+p@gPG;i0jX@#`Vg#+$%pQbvGPcS=W?6k@Y;80l$uU655c7@(;SmrEmm%!9f=jQltl?qJjd zBerfv`Jln9d@|kGgTD37y9l%G$bok0c%xx><;*FVr~$2 zCiK$j2+0vjMU(hOfbvT9hAGqh%fEwlr~O#J__}2`2|ME( zSVw}r{v9U1Z(3$;PdLf;*E7DI@dJ!^Gv3Ge+l*gl{Ab3cFRSnk#!DGDGQOH|it&w% z?`Qld%(Veuweg11g?M#&wMSjN^=NW&CNzV~oGe_%+6d82^Rwj8`}vjF&TR zW8A|y&iGcwI~YI8_$kKUW&BIVe_~wps*2|<#>*LB#`tQ+F~+wtevq-w!`*Ctit$T~ zzt8w}#(!Y^XU0X}Qt{7VJcqHtcoE}Oj2jvI7=M^?FXK4lEsTd4Z)JQhJS2AA8_!7oie@!{&_v?ew=lk_R>EVBS zeejBU`kYOy8T&Xviks4%U zHOepDn6E2~@48l-A7%8Z_l(8&^6i?#;s-Wc^$j~%irGc*--0o_S5BYAd1P+ICv;;G zN@^Qs7He_u&9YSzB7K*UUAs9`@$+{r$(97E!IO zsM&luH&>l4?v_Y!Q(gv%c6SRVGA-(ZZ%FC$Zu#7i51(|Qh)`gp7?G5CA4+>axMQl#W`RMA?STp-8Cl?PgURF1#Gu2*Y+QcEyOTbnBudD( zKA5BrCR6F5>CJIu*OEwV%qBH63Qr0Bt0Ew9Cs0|ih?6!wv&BV zTunE^-Yp?~`2~{{QI+8=lTsnlg<(qbt7enKEMWYY#FOq9NsB)Tu;V7NbLC8|@wBOsCR-JUi^+ zgd=8paSGR`w2jP6+{f~)RbNwV#rIgFN&P)V?C8I(UF_dk6z3POrB8Cm3~dvEKp3-S zEEr;*+5uBE(G#F|sc|=31h8Gur)E&tX$tgUttrlLB5uJQa}mH&MI0^8YoN&gWiC0x zf^rAMS6ym86eS1M1?rTL#tm2$h^wai;usj#U&n^^WqMir`L?788jsvH&s1-XwTx< zOCR(Mu+JMj_*7jeiPCl>Q8b$pHxZS_K8pC1Cl#c}$?x-^F_lq0?BNN&*x^ZYLUw!7 zY0P$Urs0boBuJ*`D@4WUMd+^*6(`GaqB7WfKq<*2rra~T;7db z&;RN7?Z$K7xy$E#-{!AE1Cu?n9CS0jlizEr&Ux4EuOhAg>l1;qeb51pnhiNs;lgPa zoWUw!kK>y-TY~%2hjF$EwEivhEC;!UdTRXj%CjcTICp}694ArQa3-Z)vOec|^Bq3L zDgLrx4(wbKU&;Y_aDqn7oY(^Bb~kZ#;Ot3CzQ)*x(9~;>^aa^oI-)0fB~LZZ$5i8F z4B;M-4CBGGamYCZ5pRz zDE=hmQ13>P|9W9?81yD(3Zc`xl?hM=PRS5IamR6@#(+<<&w#H7e&|)oE~Kgs7$5%z z*CyD}85=|TFr-w?+?icbBoNa#!`Pnq5u1e7n}|>fY7AE4gdyuHjwx?;6>)d)L^meY?hYP3)?9r0Eg7 zwZA91XK2sxo{>Fcd&c)n?3vtyv(kIZ_ZoYv_txz7?d{&1+&i>)c<;#GvAxKc3GDR% z%^j&8Svdk?QkjjBN^Jwn_kVxQ8d!+Lsqs~*N+!?y&Yq%GR{Rg))W6~%nWN^37k{9z zmK1*yD;SD@as|&Tajw76Pw{{FIg{V7_`h^!A#S{T1Z$kco`x57B*So0@&99CcIJQZ zc+Efb5yk)Wqo()e1)9Hmlj83yE*yc9r=wQ$Ph6+?pJnyt`cnKAcwvU+zgh7&(H)Bd zKgIv+gyx^*cl!Hx7GQ>z;-7<){3?7OzpMXBVRq(!2q)PUzfr5+>wb0$e#*uo;eAH) z=d!8zuX{nePjYxaMY~++r}*99)%<#$VS6EF*s1vU{ZRAgvZ?UWKho~W29+L~X%zY? z{slkP{KL%u%2CV5w|=MjyPH+`wMXUuHf{ze{f@ON{tda492QQc@8;>6KUZeue$kAn z+*Nv-W@>lCr{cTpsPbKKmgY}(Dt=6-3jS31;%v=7&io|>xpjFw`y9Q^MQ}a!PBSbePOi)I$5Qz6UNqR4$Q1J?H!g>Vf_wSe{>sK`|k>JO%bn~oL-GQxB2 zvru_a=`?Hz^cnIGK5Q55i>r??!ll@9!8*PuDw>w=$8ll9$>u4RjvmFW=xI)t(rFZ@ z{Jd3>N5$u4aFv>7DWj(pPj!jnfOlQJ*VozH-WKqC>)ZVe;(qsMrq4n(FERIb>J#CJ zaNj?D0hKn(x-k~)OAGgBrM<_p_v1sNsjzTAFdf~6D775)&Y$~p({D#me1Plkx4^tJg;@48OBCF}lJi5r2I_?9%` zGp52lRC1jZ*SA!eZ;NSjeP&OG%hdcz=v{?nyn>g!F44W8(_Rm8ds6g3*+t5co7*JVZ1{c zFCpV<81IzE8Zvgkc$YNRm3TSgPso@WN*Yqt!u?4pTN4aRgnL*Td@w8(?z^R79SqBa z`yOfNhGB(pe@YtqVfc`6-zyEt5`S=uaNj2lTT1*P7(OixLnZz&44;vPttI{*819#b z;Szs3i9#R^_rnE-2c%&HE>YqBoHXo405Ci#4Pzz#mBRgyr1zEhFA(m}OM1M-j}NcA zAC`s#Fd#J}(l7x7QnO7OUV{Ot8I^`f7?un7c4;^S!v}?Xhcp~6@kb%dPHA{+dM`>2 zuD7qjmR}-;4;jl--opKS$^GQuW(U3V?tVdf8}ZC&ptH%Q^|-X&?U_M4<8>))`Sy1v zWIQiQmod8weUn_eeOGvh+e83~zxXM-6-rgdLKlUFaaoze( zuPD9)LpV55#Vx)Q4^0YpgEHK;5DrBiPj4&{%m{ajZ%sQs`BeN_s@iC$xD}F3K~Yh$ zYIUe(ad)+}x2+ENI{l(#2{m6Tz!l3y$=9V(1>}C40-8y@!abLs6A&|-YTFuGyu$qn zm+7Y5f93iS0-7m9RyMD@D6E;b#;3ijv$+kPzgBb@b*7AxI19b=anyz!N6p1?<%m#H zVy3Tv$LEXYgWps7Bk&dnT9+(cSu4ujtBbFKZAnXFvv4;RzXUf?(iH9M7w+cbFT+$S zW-3;Bz-^m)emrFa#b4GH`F+HP-W~J51x^>(n z{moUzfZU^ZZ`2#O2;ovIe!hqzUIPa8SX$R~k_&B7MQopm2Y|iVW?~qa{=ZMks11^^4Lp zMkc7^OVTt>CZz8%X__DtBpH*YNiv}kdR&?g&wvT7?Gw_3_6J6^w_ldVa%n_U_!Vh1 zq!F#*lhRl%jnp7MCCxR;43WMn&3OM1fl;%#Pnx@x8Dc#x%}Hg3V9!YNkTOHGuSqjj zy<}mhhEW!F7w-8Mxp&D1aZY0_(}5!}!u^OWpfDqUl+A8wbJB%0Gms%rrz}G_Rm|Fe zLb*?yXNi+b-H*@u8O(Fq=tzqDiCME}z>rKuHbD#0kTV8Z-Q3aXueA?I%H3m<@e~SI zoN@{RC`G-aP!ar-vuY_sb@~W-`_wFIHs+`^DlmUlnu+tktO4R|jAG0|#aXytnMDoD z96lf-+^^1}-W&q8bp|?{>%>a;{#nH{QE<#QyM;dT>3&HGP8Bq?u@0wqg!>yZs8VIs z5*@(l4fi*tU3p1Iwnv|X=@IUirS05PNNl5|HigfSrGlx!E>vS*0xd8V&~HngN_76Q zUg7?Z6rvhwrUcAn;oRSq>6z)%=I_l~09ieyGx2w(uer5$wKve&(h;byZE2~it-oBj zPd=?ha`^FgZXf=rhLsYn8rD-Y!M^(T=CcR;8c}s95u#MuHFx-GJL{XobTWDU{&v5ZAz7$noJka9X|8SS6lG-S zYP-CxeQldKjtmXndMKqu%pybc5>YNWK+IOeQgMPJmWvZ5%StgvS*#Q%Necvfva$hn z3Q@9Col6wd(E+`PQ^`QR=V?TA)HZr+{r=kZ;&d|BEBXwg>4-yvw-KFQgE*5cT6~nw zvlO|O=(CCDVflGPHzThp>+!liO=XLGAp)R3vJrM*tn5`}QQwXLE~(d~Ye z3Q=!4cpC!kb(eYTJ4J)$u&lgfML}tvMzW~KMSY1|IxwPWB65w_-+?Ivd~$TnXOK@A zlq5%vC-WLagA5bpWKfzAhGbmt_cjVqLp0Rr^{=6FHAKc{+;d-zOgnPKW@@eNxEvfR z)Xw!jFIm7S+yUR3#x-L4DbJw|fT5WTbE&&Na}5frEYH&)x`m2o07s$d9!fMA!^9~p zZA>%WHgkc+v;aeqIE%uV{%|e4pB=!Ln}gxL^hY*RmtFKqksKSn3@3xTN!Za4?3@%j zTy_^92y}Yu#JO#m`fMtN^P`;+GzgCvzk)Znr<8o39cZQ|fUdJd!t^=ZU@C&v2hCYu zL^lsb9rR4Na9?peVr#(l8ahcwmwn(M?Yvv+r3bPgPJ;r9V6+NJl?|GSweWo&xjLfE zi|fNGuI&_8XE23>UZUv3DjIb#4<-slRG?80gw&NF*CjL{(o^JCqVaP*Sc-N0^Jy*L zRYN5G<{ht(@L-DnN5oR;^1EjUmzaMVJDdOqSQgPPsi&0MmIZ-&KUIe2PBG&an)UgZ z^+FN^Ki7lbKLPL1Y$o#Z9bjk%^*3>8q}I+r#{A6_(pUrI7ht3nB9WSn=lWa7{$rG; zMQGWIePKVlTb~V%`Y%#Z@47fv7$egjg~%TdfIffPsF^2u>yUc1kYYL0Gbn zdGMf*{G9}zrRqc<-M@3)B^85ptYrt7^Gu|F{+n#5WMyoE=S5c|)+6jN1Pj-F7b3L9 z_rm&egiw78NwsXu7LHi{IZn=p!6{XJ$Svl-#Fi^m=&p7lJ~#%y=Sy9zAzdU8;L={| zJ8@mjwU(?tMOJZ?KhzG_I?C}^V6);oP}*-fK+a@%z%wG^L&F7}Q2rNx0rvB-zOypd z-v!UW1wWY+?{J`#uy9?u7y-(hXn{wW6G;#%CsvSVs!ve4VakwQPhLnnpCV4Fo#h5= zCk{8QkLB00f7`q96049lKpq6HE!`xYD4!Z7c3 zHf(_5z7tgq%#s>V4@nOwfb;&uJhPzUrwj8eJLyD~3lzh=1#BP>zb))x-i6FV5zj)p zsp{uO+-VDEiJiw)&9W`qz${sc_gXek%7PC5B|0tl*jR3Mu;?J?J%=lQ@0Q()gf1&(!`(1kayA<%0P=kI zx)ONy+#SBxL%#3sM?t$Z5J=)wcOWRAKB2Z@5w#828{m(m)&%gpNG6KwmAL3h<(@Fk z5l`RtJIHh%bZN^T;%ddX)_(8)O%*$^f&40$`iZrtn}qkcp*bH)p*O;99s7 z%=Oh6C?jCin#sm%iYDk7?%pqJClHk+bbNT$D zmycC5nmO)jd=Bgc)4$Y+zw$SI%qx#+%Re(;a5ds}GCWuWo?9Eg14Q6DxA6=h0$0Uq zE^I>M88qLtJ#FF{i$|H?*L<~PZR|L*boTebrbc5h-dEikRo?!AkahK=tYUr zF0``d;nn>jZRt7tX;>HWVt?_uWhii-sTcdxnz8DGk}-GfKa0s>v3)zKwfj>0B-qv6vd@~ zB5%3d2PMBETXV(BqZb-I&ZV#7(sQ8aX{96&-eU=2(SLmhY^G;6;Vyhglw5fa!jZZQ4D%*bNVM---S43#Na}KKkiu&Vph(ySq5|8 zhv0tvQKrr1=CqmkXNsa1sny1uho{X%s%bM(G;Nj`(`LdnZI&3*X2LXWCak8-M5$@B zv@@s8Wa4SFWRcTmqReSC8O&)j8O&)j8ED!pIcVCf2uzz5foZd3!L(UfVA?D#Xxgl7 zXxdDanl=+}$}w#w3z{}dtftLG=1-evlTX{Unat+2nGAZ`EE##) zOtfvD zq*pPNXNiS;R0$oV`3!>WY%!)jk!N2Av-C6XI@c-+p4%<0_R(O%!=Z*Obw z>JTm+wUec;tL1W36_(ZM2BA^d2aPBSPcqbNvN~S@3j)3y>`H>b~FXFJJvQdAfr1_ z<2iZSks@vIcGUZueYC_xxy}@VA zSTLOyWxtbL9&L*SU3Pd=IuvUMx>J}4C1RrNkJ6!JPETuai%-5c)`4ZFYEkxQ=`d|h zG`t4Y4ZAL7|0bg>g$=xiv$&F2_7`b2gQQY&h_WNns%%cQH5kwK;#D}@^n~Z4B1+7x zIZ@MZv9vjUPP7A4^M zvO;_Q2*$GMeo?ke+Dw~+m2~X6nh~s!)}?c>xsVEqvQk^QwN7ZA zsP^(to?|1FB&pr1h)aUtqKEL<<=gsGnWbd`sUVH7e*WP>WefC)= z$roSw8Y^Btl@L|A(*@;=nyosZ;n@PVZ6q%>pt*v80R@$$jO#?fK??ycWnT*g2QvzA zPVQoX#X66MI&+svv*K1WD?~Hhjb>JhW(wdEK7^)cacJ1CUv8D;#ByijbdftxI2ZpKl1)fmNE{{5ph-7+a=@X zH_u$XZsCfWC96(G0KD7_#WbL3Xg+8t)VV{bq0Tf*Hs_JKmkKhPzdQ};wz#^PBk3A}U>F7($h}^q4Rm-@Scf+UI`liB;g3R*w&5GhTjoyp-1Gg@fy`gI z@DvX8A4?9|<*S&zNU|QXjcZpsxjQ8r$zQb)uK?#>Cb_KqwT({h75)}*iRGIaZP5}Z z_bP$Joh*)=XzUzHKp(%$K(5xe`IiIGmFWW4|2zvD&>RzD&HsW!LURpEmv6-G-2bQS z3v!k)paG)BAu5vp)j4>%Dwcx~LkxC=$Fbi;0f+|x^D46c?{`prLB0(?2Rhd!VPOiS zl%7k{(fP|X+En8r5J!c$Gz?VoEFrJUU%KKnMisSA1j^(}nfg{3E!aT{F3U$)*@f69 zE^cVV0ejpn!r8?d0!>&a1McLW3h+jP8y6wQA%dhWmdAp5;^S}47mXlBE~8WVU4-*C z1I!GDiW?AA;ts_!Dj94*OZJkIyE1SX9nk#|?po+;x8hj67AlZJ`_ShM3DIC8s`>q0 zx?@k~FSl_`{lTJ-{rLf4i2E!!9FS}%Re~jKIG@Y+K4NZBqYnH$Qj4S)BUxX9A zz_+Ta#BRp!0yDrhQ|F{S*BL@Nfe&{Bm)pQ5RZX0f^0EzV#;iI7txoyX2zP*qFv6je z+dFbG4uk^7nd#6eQ{ghsu7ZcU zDH8$rd+Mwy70wyyh_YET<~paR!}zR~Tb9Alof@hf< z(ovAHwzAe)p9zH%Jgcs5>hzf?vMwDtb><`}_h(yz{ICQeKH?w-qTH2yoaP!CoS*WJq;Pu)hh) z1bWR1mf27!-_Y31&Al@6TeL7AF(Sl=_^DX9)42o>O>(c6OeCKN&QMA2wPJO+1g4&E zpfjupOL53}d*m(f!T}oo9{vyf>BT<)e2IT{y|;y&(%icvZ{rBNbBq>!ucRF;RlFyg zdw+zUx_W01MRYL z_HrW6rRDq+0CVbPxA={zaJok9FCss|X}Im)@?>4Zq$IDQ)FsQRYN~i6BojAj>dd;D zSrZ+%lMZ)VXc9u$>nKh~>M)prp*%B*O`r*O(NHnH3Iot_@rIxFDC1GCz)HSC?f7DfA+}MjJpuO0CnI%K+Om1oR1yc4Bmc1@0E5(j59kV?9 zUx3@TtI`|Le4OQ&DUs((&|pPshHsOqrg8!XJp|njM>86uhZ$Ret5FTha47<}E^CKl zLC!I^yrwYiM`<4cCS1^O2;iI+)7s9{}$Q_!I=eW4t6o}3N?NP~i_*EJBvI~g4Y z5*Ei9F2mHCl1_&~qXEpNrhbA%Zyw3wy(6PsC)Tl?4p9!mwRWr^jbl9BCZ}U1^%}{+ zT{L*U$WLHC3&N32G)5;n8lyXtC)EYRyw2b5{-g(nIR}sbV_9dB!P@R$Ad57dn!s_Q zT5x?^;N61}jytkE1~1IFO!2)0+~XEj@I%(&N!CgRiS>854}z{(ClP*LCGB=n>NX)>$*1fhT%mC*dRSm%e%k|7m=57XN>I{ru-t3)$OL1n= z^D;=v&1}!%5XnHPT~$=gNY>Ti^b58X%OIICtE{$aCa(WZ#Nl$fR8>IlN{7c~!@9;@ztB6oH<(H&W`D59t(=3o8Xv3h zhk5K=ZaMMD&mZkw3PSESnH%pN4qW$qT)5GIv*sC zxdo21E1wTsQ_vszLjc{K-)5|L{}K^v4{WK8Z*ch633jjUEHb_u;@>IQdr%f4tma23 zXpfG6zdr^w?#pk=h;Hsb?Uw=ZB_!o`+8Y4X#yV6qq zfmHkhAh&8b8bjuAjvEVp6=~tf(b9_pzZZR|UN>@4iN^kF(Htfr^tZrTnsz`53yu{- zL#NR22@@V|3D>6+N>(dm<gOT+w8vCim(EL*vaW=s6E{oL3})n4<{w)c4gy0XYEpC_poi01rTO4lgmg5<73pwVot>g5AuXz+ z%}J;B;yT`o2Ow6^xt3-pX;?uorogVR=;lmh`pA?_FAzhfup7bF{ z8E`7jIZC`HIDn47&R+_m0dPeSqS0SRuW5j|QzosXi{Z%n=lSP^NY4`oYhWs#pLe93 zP5RG(s2|)-2LPt~;@%C@G_-zKx&nWmG><_6fd3tEr*JnAg>3&I(Hv$v#^=K|^o!_9 z`uTk!7p^I2egJO|AWfcwdDYe5As*+zjMdeAGs$sJ@;Ln53UC=ha(96MoT2kjt$U$t zMBMX$H9d4;ggrE5@%oi3PjlRhWuG(z-MAw%0QAEyfJ9e-n1!8Oo`5nZ9$+UYi)@BI z&(7U#_`V5%;k!GH?{xv+>r;IH4q_HIe3=uzICLc&({X0uUhU`iOZD7p(;Y!{MQ@Pl zjg_D=y)h`%8-qftTAQY zl`@aA%wM$309)e{+=P5z+VwT?{E5a61A~#&bE1p6$b&Y?kK1wp$x(xWnv16oqedce z2@_>VJdMQBqo*R}){S0(f8Nez$C1K`luS`Z@e^@5(p-c)9v9)-Ig#VdMY!YLx!#6C z?0;n-z~>2nV8XrKTc8Zi4nhW@gAQ)AH#Bpe@GoI7TtxB40Yq{S$1LUOxfpd~)DYh3HaVfxPh_|l5DYK;p z0$%>15)GG@@~+=>G|?@>eKTpA@oLnWa4!|n4{Dhmw%V2}(LZCQF_%hX=0n7yUM?DN zna7jT`;b3ogOB{>V$>r<5myMeo|sQYVBGE!gFYX*WbdweAqzsy25U&}7NG;O)_v(_ z^;_U16G|`@1WkqjcTYj#CY)rwBH8yp4v)-_cW}(9V(#BHJ>5&N~`Z+GQ<@ zWtU9=m|fNch1{-icG*cGxUG-$8x+0{^tKk#UzCEE5A0?Xo6+0DZEuHm6zN|iaSuwv z6I%XUD}Bq)F$hf09~4#Gg_fG0|3rFz&|y%O^!BI1VH@)@yMHG6TaX{mWp}r-<{27) z+<$q^;63V}1=yCy(WX60z_u;|Ms-v2UkYbi73L(TgorOz;!U`Xy(5DdFkEmV_eqiBU@JCv1Z5w*Elw55duN__l1rv2w{OiLLE!lOnj_KSqtn>t;&ig3;c0gMhvmTTMtbP7bo*(%V{KM_T5^t-V{X1*(f=I6Fb^7F>qYr zWxf-0dYC@B4(7@qEPF@WYTgk)_7+rAB-OklzU(*5S8+amSNz$tv8@?vBBBQ%JoKr= zOFc~l{2g4qodqLsY=UXJW)~b{TTZr7@s^0?2ay+MAun3$SER9En33Q znk{cyvtr?CI39EVTlnVq1$vL1v$LM)+d@o|uSswlVYZ;C!0XlER~?ed;R|7*a(9hr07Fqrv1z$?IQ)PEtd ziHSW({ECSdB;G=zWR8|IUPe7$Wq?}|*?9m5jn4R=72xzh37}{Bam#bg0`t;4fgAM@ z{&dC&81*y~$01R2vyyKM&4lB~=UYXviEb?CoirZvEsw28OwK#pv;{A-lnm4KF2gU! zU!zLkLW}jd-iwv0q?QzGjr_PdIaRQTl%&73weZv9lM|s@sxxc3r&TS}&?~D|?Z1IA zCxbP5#ou|bS=anN+QQ}N*{clJI0Wjm<@h6hU^?)4ueks(?Kov8YQ2wvVaY|BVRrf(om7wEUf~eg!{y9b*UPgdBQ( z-#{B?U{1*4Ci7Up%)p$O!;RJ|f(8su4d%l0;FWqGNW86#7PM==J>h_a-lXnT^8}$v~SD?(OPmuTs ziCSW(#QI{RhEvt#v9=8QZxafz+t%Ulw5&5Xj_BX7&MDcW6m<9u7L6IlwP~zk;tK$Nx{{;M0GOki27pA9`@p{%T*78e`z$cG>dMt{t{rCB2R?R$(+@rkqq|LcG=zn~_LyL<#v$7F!hd8$x~=*0des z%_OvjI|4l{A7S;dL%f;m(9)t>wtS~g+_%gpX*N5B!|g{vPs<(mQpxql0fyNaT;_9l z^VCuFv;{?T`~zngn@`>qYS~1f*u}%8i!F(??n&FalIOI*L1W4o$HkfgKvuLCX z4)KgeZV`1-n}r=xm^orQTQ_8mraShCDd?7FTT%*2(^ zs-TC;j3tjEcM<3=Mq4cQDV?K(@iUyGdd z&vY=&@%L%})bUBX+bvS1l_v`|;h*F8)A6dOtC!1`6j?R$!Q8d45ji> zfhpybG%Gyau5IPg^B>rrH(g5cq)U4`S!{o%;zCd7<XBAEbuTQ~C+8^20#9=FM zOTiRR6x`d%qK>RPzkXHtgm*=xKsnzKX!PSzR--FKqc=+X%|$kMl_=q8h%HL^7PLA3 zRyzxfQf6Feih;7Tg9nl!KmVGikBzbqzJ7m1f zw8nPvc`RL^)jftZf83Ubk4FP#y6qyShwbi3DjZ0?o7b7o*_zVi-rCVLL&2(4e_vvGFF^&iM#VTp3 z2PwPzpBx7VjOi((fcz^Ml_Zs708E3X8>>TullAO zdd)TwJ9_zXYyH1bvR8rI2$sc}1XKP3Obak&eHV7b4;9Y?!hd|IZ}gG$eBT1v>LpCHfjm15|!4wWaR_ad9Sg7TL`ruM9pV)yhYG zWwYf|Ps&y%I!IU@K%w2V&}gySX9@&B_7ASUh(6nu1(X?BE`V(7nFA{9p z6Zn5Dj=n}ehXh=6+qBCvnzqW8J{82pnb=umH;cS7_>|oKADU(>lcv>&n)V|tRG!&1 z>oCZt;oV1MS=y(>Ex}yWxzw&@kH}hf5kwwq!eu$`ZzDu^#mF%p?ql+t>}uxq(Y)h6 z9^rHH_W?UrPWzvbXYk91fCf|4lTz)kkdsMh5ZLAT300gN0#EK|>>?QLuS7PDgZBSf z0NvpzCOKURICxG5hPJv6eR`6@?H~cnJWaVm5oyRmHU%%46oTvIj2VSzsIpU`1&FKA-pT5Lbl6JuflNd5 z@^#A^HY~?i=NVkakt5v&%JxBY9e*(WB<(8dM!9Ku4ZS)RclYoX9q-EF-4ptz`8fC* zyT-gp7Xmi{JPC_6Tnj(SHPzp_W6Ox8_-rIfMxvbho(GAU$)l1_K&v>FT(uY>9o?)b zt=`|cYYUg&?C7@;X(8?p}H*>eXtjoHH=1!WsELw1sF<#df&7gyaPJmk^Vk{FA=!jL) z%tNP$h?g?I1|80qg7ns=d#Wh^1f1c>gfj*_aDJc@&N$l4Wm?f*4=q18T3m@);c>uk z;)&32kT{4$EwNLcNA5UiY0A4uJcq>SgGl7~aphO0jH1hB zVDB54niU>b-kVJSWAaHgMwsjlCc3vm#r~aE%$!=J)!kj|c1n5`rfOsB4q4M0Tg2#W zhqiQ$51q}7&VW+oG3pIas*}7;`)oNz#Hm0T&Q9_ng;Sqr8@S&*Itw0GNTELqBep4G zJviMJ;$-V5r)Lz-Y3{xdqxVwqnNKSGUkZbZR`#62IE5x((G2I!-mo!>45E^^6mH!} z`gTt8By9*g`V>PQ?r3Yk(no=Fm)sC){tvZ|Gr{d@h0~m_3c+twIMw(og=1PteyB3B z@lS>5zfm~(yq$v2%~#u?62CL>?B=~&vSQ16ImsGD(zEJ@;ir97vRmPFCKYC;298mg z8giX1j(NKz@X55fT52zTy1$muolqN_>{55ImzI)AnC0bQ`qwg5JO!&U*In+8-UzDc zBh1u%uatikIhh?MqgalA@N_e9>UYET?w*JlS!TC=Q68_s?@L}AvgvH#A$_=WYT0`q=z-}aq3++~|2O`Ul+tQ=TT0ooQj3CUYSvNKv>Mvq%M>G2&Q#dG&I?+Go8Lb^8N-!$x{!p+INy6g@V zf%a?JD}u%pPPUC1D2VHWj>z#@iNVI8 zl8z=g-@Mhjfwr79@Y-+#FcV&3aPV zCwFUt3i*eTJv_#3xwaMZfEK1g+Myn8cyhnOsgS-Y_z8bkc!om4_Ca$`yQYo+N#-Sc zcdIna8DhHfp+GU`)mX)B6~&x_rW?haB_+DU?Hh~BdL~9eil4#W39KmU3b4uX7ucb2 zyw*d-}49Q&c_1{NAcn8A>% zcgk)E6)m|Zl%Y<++bk_?i%cd3xc`Z?olHVk{M|jGoPEk-WuVUbTC2`IqRuHe4m0QG zzmRZOe?ndqMnY_At-?N5PE^i)`sc4c>jA)+y zS_#wNjd0%)5qD^jZGnhiPO(~kM?`!8B93KP3Hw%s`)(HRM%QDHR`eH4_sH)@{!`}f zrnC62aK31aHjNCirk`e(;pEeyracE#MsHX;Y1)h7-bk76Ja<@Tr*J}7Q$$JR=A!lC zr;ll`fVkg^hy}{#yrA*VPPL8yRvJHOtZn3X(#S`dmqvak92&-HBUup3m2G6ba%TVC z4pc@XEuA#-{q#mU^S1w|)@5{RoA0o=z2zR$UggsqH17(W4jZqmw_Kw73gVjy=}0N@ z6C4|eIoUyIjPP3^yx+VRL_ftgC^Q#>lLmDux1|Nasc z<5q_1r49iM5Jp_$Tet&a@!_VS0+#te9{I#$!;3-)eKoK_Uh{K1#0nHS{@fhI8F;@wX$#9-(ugr*Bk5LwoA5dg|eGVxD{p__s!tr z{pNkJl3?9T9--`cR6N$O*JBbK6%Py{=P7bCS}o_uMImIfBDYxNiHf8uE;mRl@qsFS zuIODr-_;5|^Ik>&PT4j=_fIJ7dK7sp1b-#O3SUt+eUehT?RE-sq(!F$IbZvnf{bg8 z-l=H%in9%xN1tUcC|nL#4r+#u;~6QU+^p!|K$a$p zF4Q`WVU#={s`x)unx)pthkQIUmm_$46l|UCK=`UlXSwA!_xW@W{z9HNn&EGrd}tB zA8WjMox%bX8Bw}KFMCngFW*UP#H?H63LKG zjnolZikAGLDHZPS8b#9@V(F>4FePH@VNW`}l>oMg>!o9uO=wdQ>kV+J@tgi!!W3jl4%Nm983w5{`58! z=s>jIs02c4kPrdxJh>CRKnpI1yxXSQxO{c@(3vwqyitX zeTd!0xE=0f#v8%DYuKVwslV1#j1A{jndaG%zUUqJQvCILdW~E0pT8X@G+$)ET`?qZyeFIlz0(SPxiT?8syz1)#M z@pB=Q5SFXl~B<%mZ;}+$hB!6>C=I!}yz96m5J7TH|krs>SIc z?Bn~~#>>Hvza0_Z4*&Sualy&pijyxg=f6d(As&Bo2Spd13$Faljb$(D25SE1=43A_ z0G_|Ozt3tM2|Ry0lr~-o5Pv%)7cIg+{`xPti>?Efzy6DE2+aTDL$rP>7=5H# z%C;Gd-fR73T0azwK61w2QLWE`j_~S{?IqAIzTktu_(pB;Ia(ZgQnVlpeVgB}jl}k_ zSY{ad=oJD@i}xb;NvNZS)T*#Co^bOZ1u_wx9WMkz z_;H5f@k5|g)aFPCYU6-A(Gaj~>I~R=&gmNh)lHf^ zqYB@!bNYpVlV+7UgF<TsQ)RnT+M-Z)&a zPN~l}R)U^e_5siYJ+~}d#|syR4eqkH2FFX_9M!fJ$60*pM7oJIy5idLwEg`-cv0cK6w{L|G#|v+TwDH0%LYSq+ z3%3#C^agKg2swHF8}0yXK01}5zx+2{zV_vGx`7#dxE2{VPveFAAGj|g@8zY%3-|vj zR1pgeLOT0@7ev$|f_Tn2P$u83yv%sv{uhGC&I{s&`~Q+EV}RJ0-~KlOYDcLmG$hb> z0?N%xj~DKH9_#6t7sLzqqXIcBFFjtk9}{pqkD-^#)8mEv?FH8`U?Q!eh5OS5<%^Q7G7uMRwt#I5Q_;fxxq^WC1eK&r>qNmp2LUc+ zT?+*VBMNYizgS?gPEWD*%cNOxqn8z;m+nR{t3@vbShu^Q;ZY6?J8+fFX$t;4c1&+2gYmQnGP87P4mix8L&lN~-=wPvCDm{M2< z-+$gKh3{x=`-QL!FB=&;olRZ7YHH8R)1Hc(3U0! zsPdz5m7i#p(#M~L`q<2Ge$MH&1J*zh6K*x zv8igx=#ZG7_y(=<^v2;XGsg8ou_(0FuY~IyFvMzY2l;R%0u_eBEhEfS7_( z4pYReBB-$vaRzJnZTK<)W3HSvJPfWBX0f0-eEx#Zf#Jn`T+|JX)O^3zKRal`RAHvN znkgC8)m+J7q)yjQmOK7@0r`1YU<_-xgMNc>LzGl1{W37_Ojq|XCn{}=T?0t;A#_Ln zZ#n*N^Y;SKh3Nv<`@Bya1J=YL@V?-Tt~m{M@BNdoNK7t|nqc?dSKoC36@!totC}3| zn=Jsu1Aqyv>HT{U>*sZu!uzRmS3hm=KP6fO7`n&X+pUew_ z-Ft&YAN%ucuzPQaTh$d22`xZ^-Q%mfEcZbG41(Qz!vynD&<7Ii-b)DAgI!ZGTkVZz z*un@wI&N1v5Au$eY}|G7i#ZoQcNPj4SY_GxFWyX{EtFN)ET_Q- zUc6a?8Cx}KQ$&K8O1Z*lp7J<& zUES#5&~aY8RU#4wr-r}xR*OhOgMFXTh1n=S>z|mH+L@VsWDx#7*g;6FdkKG^4l?2I z(_tq3eLBpBzqi{&u7>8bSTtBaC*pNZ2~jq)VNTWbN<`hAfp4Cb+4#(%eRQym2PrAI zm{r!#tenD6ai@0lz#fuCu*U}x_G&Ye_!{~2228?{KusE>pCjJy9a)f{l5mEN(cisQ zjQ$KrdW`;bq>a&^4o!uE-;{|6V)UmYOpN|?mHFC zc{@EG$&69%7iaf@a5%=p-yU34deSy}KFvQop>i@xhE^fJH2Xv;+sLv_L0KsliTxZ4 zc_hXaJexC<1{3#c`JLOC1QYkBFzv+T$)m||JHcf*TOJm0p^;$XIeod-#B4C}oB^ak z!B8;qoPn~=;|wqqOgv}MuRz$IO*#zIthgSolWl{Ew=3s@6GJfZb`_*?j3?3Lw5y~7 zBC)mlT1vYK%x3{YHjx;elt_%LMS5Uvr_S5%_QHc%nYUA~_+#n$vCLrn$^d8S3uOMo z0+JqC+`CZV-Sc=J$%qEtMQ$JTLSdd=#28uJyI6Q(jt?S>dplfutHp3G_;~{CWaw^< z)_M6VnU_lqQk{aU1!f|Phx|W{*5r8JGcM!Sizn;-LD(5L(0f)gu5&n5wgfai`3L$q z0lJB2yn*e+y)NEe)Cl9ucwN0GKVum-gx~f?d$k~p=gA{-Z# z6gtoJ$~vzJWCejoA;Gx4bA{YEhK_fw$M`UbJoDm{cZ+uovZKSi!i(!8-h)7w3Oe;n zDkB)T_loy6s3r-OS?ohS;&`8U?Rz;+UEAnXFmBKFj|E+Qh|a!v;dS+=0<{2MLFPLd z-avmjP|MJu^kCdxi6GX%>B+p??NtkEqp%CM)8Sy;-U7K`?G_xzErn+rW@w z828ZeHu+TOj=b~>r`{I-aS-pyOS_5b{m6e0(A{}$US#wx5wZ5bmf8r$?Oi9>z3S*> zT(a}-6zn}Hi&2#d#_iqje}NkJh zfv^mD=0!yN+MDM_iU2-f!9k%=FmCVg2rK-6mKO@f?Hv`FhN1^`0EL2ad&fjL*uLzl zj<{Btinr|*3jy5WpuP~YM36BZ=Nvyh>E~jcbI{4)KiL9%G6l>^{ENi+sf$Q#hNap@ zD*geGo?|3-8ZtdNZY=mRq=h3#OHU5`o@Zl-_LNA#k=P9u&0!Kkvw4<=(T{`$$BLoh z6lnN_2|uue$D|WVRx4!Xkys}X2uqF~5!F_9yv1ukRk=QJYq4}pUvZ{jRYK!Jb zFlask0_Gx%q1hV@XD}nbGT&oqI0y`ls7cYk2eb#RRhkc;e?>YXpC9Q#tF!a8hqSbd zHYc6hlj~qldMj4Y&X%T{G_0T}Q((vEW0BY>WR5U{+nyIAgok@Nz`c0}={7J4LLM<5 zDRXxad)m8*E`onQ2nrZ`+T?rRh)utD5xc4nqm6ny#F02sJ(tEc>l@asMu5Pgk@zA4 z4-fpqdV>KzH+C(L75aKO%>$s{qS223bE5h!BIykzb^0{$oiP8#cPW${MH~qV^#}TE z6=ppM&a?b?v)FF`Tu>gxjS2wtn2~O3G_Jn?UKWjPz^U99neeG+gDPX;r+GLbJU83t4`*3M83{qtF)@GLsfk(Oq_upyWnV_ z^}75*!%=ek>u8@N_$cgD9QPRca>IbDNtp0OSatx?EHvP%RJt&iG{b!!01j%9!oz)r zqc6OKL?e8j!wte~)WuSCa5s=&0W@WR0gy5hW8wA>0YHrCJ;#Zjhx8C*M8PWJxDVN9 z;J1LBKW@v)0&H+MP>hF|{CpxVH=x3YDQXfgnGHL|aUWr3BQi(FN1019xJfTR4Ja~f z`BJ>`{CE?Rw}a-GIWUA0rR!+O9QTp^Q_sKAelh zcvu{X@j!gIXMtB9a`WtTXT!w2UqaErao7?On=3O{8Gt^mF#nfSB!SA5&v&> z6{LDrNm`)Fq61+$j{PE>i^P^es*y4fasJSh_SsZ-7VZpzqS#t z%n#$^6?gjRkj=Wo=yLr5auA9OHb-;F_MD8juElIEijUdmrkn4k2`HMLRIs;cyF{ewb-R8d5oKKg7mjR-+Gem2~oX>Dm z=DbM?8FMyiTIyzj4#JJ_EhZ&zjBa%~`4moKWoL;SUnn;BLzhM;cFiF46s80lX~+H8 zJ${gcPyD6fvS^81e7aTYS9@m(vG>kSl%kL6Pcwd5G_$@RCNLS9FLV3UTWWiSmGzc! z`3l=1^P>9-3-lJPzRF}DwBmJ1hyZU$5+eOs64Jv^-+^zlI*BnvR-@yBg> zeHiY!N+*6Q_BgZ#c?q%mnb^UCT8wO&T0avG-!d;9Y4R;o?8yJzC9nOMwo11{Hus-m z(_N=wc153kDW#K~UH<_xyqEGrb9KFp!*t|vX7KJ{!GF7hL6LA_ZjAAj_#6b|W+3q) z602q+@dgq{&qCrkBo3dAs9G#o(E%kMM6RM661=Qj(Fcjkk*FMoguip^mWtz$$i`*b z3Dc3dy~I>oS&0lT7^+AU4}#m`q1e-$0QjVn@u%zp{5kx1L%x+`;D9@Q2qbtC@af=} zcmRn)TuV*-3W;90o0+%?iGC*_!FSP5M53GpEB=Vw706Y*jzq(JB;H5jP9_c_@h2v} zMPlDcNOXnO-PM2w^g)7ALMnzL@iHJ4qmVdmAzD&_#E-{lOKOnG@fX;ZI9afL$XPKD z@I9ce+KTm|&Nc*C_pi4Nz$@Z60GzlAe@Ilm6^M$x$o(0)>SaoP+5~KAKwKklT06Bn zlBQCwFbZ>=iThFZ{y`|e6jkOgg6_5>F=woyEx@|s*10!CGR7#kBQHaShy73<@E<)2mHzL>r@TZ zKhfHA`Z&(ofkxUhA@j5xf9RRU4r?S7P7U9RcdB0r(chR(zhQHVeiK;CjW+M`@xFU? z**Md}3!#nIO&K?VD%@hQPRW82IsTi<#Hl`2OHs1iLaWC^OZL-HEu#&6qesKMS0_;P_y zi!|?dp}czHYbPq6UHCn9?z6J9wJ3|y{nTh!D~AK2)mQ4+Ve>yyQMCC}x1=m-GfIf% zouC7m^t}cfMr~N?I!kW{K1H5n=rj7*&IL~ON6MQ5E>Paz)(k5#)6NQ2H$u1@t9EycdM$CMJg&6q`kzOl;-Yx%^` zXY@^4MTwxImqUZR20E3XWMR)FUIpf`;W$s1$eq+jHZ*uUucyWK3j-2XyRAZ+VIL-^UA^4<< zQ~hCRs5w~f!%Z|+VVmgGzHkT=$e=^R2dPACc$wkq#R{G31EKytr_I`S=u#nF{$%Ha`(0tm7id+K-ZyN`h%T*Od^VQ^sAGf7*!fJkyXuc9vp(hw# zZLmk=P5{IM9)t{{1gOc?PF7aB?1X0`OCx4ESFML;^DbOTF&pv{v+3nTdmtSa{*Y(( zZmG0kjaK|m(*(5PV3BP@skGq@h-^0YNssRRm{VXs;@+2g+>+BJogq813Xf&!V;9Tz zq0-|%=BK0=dz&CN`a8ebOlzDdxg$?ig~W$bA^TJzGw)Ejx`HEnXgwz)Gh4aGK@}W2 z)z2vrXRM?W>Wnqd4l{J<29Um?q?{J!2Bgl+FBHBdtsc&C^apH3`IV-p6Ywd2E|k+` z9uyi5@ghH+pz zeywzT4f3Yr*J;OZ)sA1U9e;4M>G%!O@wbp(I=)#u{v+x5jgmWNrFJ~!!Mj-2Promu zt$`z2t;?29)OM2XWOe~mJ@Zp7Ji`<;<63))7Bm;Oqw{Wcw+W_CX*>*HA6QwAA2J@l zd57y%_g7k4&lO6$1@%=Z{Lw?zXS`sU=&KhgF^%X$DKJgUT9#BwwFySFLWyWZE;M7L za%yi@c)Ag#X(Q8!%v>N#2oHwCU7UL6=KfTAW1q5rDwqbA9Ba+wryieY+=2cY!P~2D zi&#f|74Y)8y%vuT9q_ePIoi8gup3ru@2&?MyalekJ8>T-;X;7SgmImBI?~+D89TXN z?WAQ3Cy1XL$-rrP^+eNG!Cb9wC zAnWZ!sR9{^+buBqp9ft?t&fTDJ5-!Y0=3>g(yH|_8GSixtXj>@*`G5n2ZE2wpnC&( zD&tAvx8w&?G^7vbxD7Gr!`lGw z<~^mPd2S*#O|l6l`7cG3z#K0VHYgTxYCBIdozew!k!3BLC}) zJ1S7jQAnDGzvs~*x(!XOu2wQSkB5Q4^uIHEuEO=$fsu;R=fm&4;_QAc3SFa&J`d#B zJet!XUp4>63fhLkM9xi!KUMW>yiE~z^2Lxq~r5Q4DJ1@04dZAGqVuNGn#&we75fl^xc zcV?yAgwX*l_ScB1*=>o8N5wXV?lzxK!`?(~MwavCiPFjIF~-bOq94m6BRV)!i2NyZyL797@JbU`-1{`q7Vt0|B4GSVYTNuyP!7a!@!KiKhXsoFkBfn=2ZT7y_5AawQTu{vJF24zErP zoGXtPg&Hxr2YxRYI`w|@L6^=1hTt?U@)q>J*AzimkD z{xZwm&i5D88cA6GmhUg0c3M;FRR20u{N0S=X1ktN{SK|(seVWcUNagdW(z_=aNa|h zuCN9(FFMsZQ&N)7H}IgPZB$j5-ck+-9&$E^xG-)txF3RxQ~P*`_Rw^q*GaZv=#o>^ zqB*f2)CTBACC#i3ShKoJ3$PCcj1!r{dqO*hNJR(LFrDffv=oi8+?3+z;<>O>{fL?c zC)5)SQj8mCqM;t!C7587q9a4OwjvPm?!M)*K&O+)&y|^{wOyN z?l==pfLs=M!RHG+V>ScdinZgu=(FStz!uB9Hfb;PIPOdSFMuAg#V!>uo25crfro&> zcY5qp^qtDY!5sq%#)eO0R2NK5%@U&x*z_IogTVARX=;Y!uskvC5qw9kN5KPj$$H<+ej6 zNQbP14o!zlln(il`FZfc+({AA?)V|QAY2V1n?xQ3=I_85FRD7E{a1lO7(A=}hg1M+ zzaLN>8WlL;RWRq+83t^%|F^cZpFb_Ncx)GXJ2Y%ft+kJb5f!0gDeb2fNz;A>_0G0M zVtlbqw9f{K_WL@~r;x7C*e|uM{uL3o2e=IoO|BGuIdk7c@dYXp+;jPHTNu4Qk&8do zKZ5ssisBEwTgtr5)v&OsaXGJl_%%;voAu zvwDln{ZWJ$Z!S6)2hhCZwp-=IY$QMK&d9BmP{g~yJqn`4OGtdk#FI$$Jr9ZdZDKDH z69B1wNtyfyhuVkdU>$1g#puJvzQaHDVdqhn50uSBE6Y_8kz*5Ur5x8XK{+VC$nhv4 zl;eFQYLA(2%=1uk0^V5UqwBP5Rgg7~kYffXh9R6## z0)3te_|s?t`Q$nTFSrFf`0M{ZYXJfLZU3O_44(|Koa&BP`Tk#wcC&o-|0c?f_Reib znEq|fgE}&z-1z;T0rLMW%8g$wW&cm2-1uj_k7{j{8-M$743S9eNc{a@N4aSg-v&)= zT7L4XC5sChmn~dt!qqUeO{D+%42FdniYh$iMAUD zK(>aqiRKOf8_7y&n`j5-BaYCU&^B4~7^%q?$U33I7Ld?3S@T&ShIefvF^Zp~p>47+ za#^h1-Qa#X6781(*#SCau&j2ZyakC|LW6)e!Todd0v#KOgEf9j#Jhj0t$1 zZRXs%N_o3&`qY|3p{p1fWct)8Q)kUcg~v(fP&TWk+6m(1q~n6O#8Odn(g|3&0fBWY zleM9D>-0fm=s{Or>`nI6w+gd5jL zB(V=%es9ntAs?TWuUOcGFUS5>s3H~`go}v%T@X==2x3LVJ{3e(JTnqW>L3gobOdL)uqOu+GY8<9w2 z?FH8fw(=yj)`=FB_urV+Vz>FP0MMD~0=yPpl?}7BuZ44HYA$#!oUllC+H2vxfg<<&4PH^YvCj;Oo5crb4fZnp7B~ZiA%#kCC?J_x_Dc! zg|ke3D~uNGAO)AjGhPe76Vv+|0z)t4;kEF;0lbmm%-6y>B)7&hUJGXnwi#d>uZ2^I zI~1GwS~yGY%D}-RmDj@CL({tzm-bpX3+;>RFwys?`s1JtZ_&iVuZ2?|`{SY4!WV(# z0SmCNg|plT0WkbpI58guePCY;C)b1dsTc0-oC8}J;S%Y%UGB=lm^)r_cq`n#&}k%= zcfwcVXe@5u31@qpc&7%+31{7^rR8G2PQ2|`!YM(_2)V*&o#Hrn zBiv}Z-mQQ@~nRr9<|%G@`q-Q>)wXcqUA*tZXQoH39xp8*LG+m81>15q7R& zUgh+u4Ry)#>dKjL`Rv4)dchfss`Y0O&hyI1oscq)JNM%B{8VIjy4G;2xLPuiu0Oz3 z8@pCU1;Qih4nAlzmanC&oY?J==fEfudkKGgyp2CS`3Hax@XtzN3pu5+yCcuxkbrZD zu4hi{UI95+Uio5l?EVPn$yhviX)X3py>QhpCep<3$Yw5BK&WyoA<_L36q6v}4cz1%PzdITUR`2Ebv_AHoN)7V`g1v;o^Q_C5R9k=gWD z;FmbDKG{^8)AbM3%fRe=kckBSZwfSE#Y6Ov#zju7IQw}NjKp5X-yU>sda`s+mg-5B zW|jnKpld7h20;Y*T8tW8_zvaY!kj?55unJCWR$4HGrvcB_U=4>{KuWabB|1gCP(W&kTm}9Dwbpz@x!H_GPZqYb-6jT{(TMY>9** z{c{BSr(LCVPj)H{0`m-mKn9T*o$^SG-nh}Hx6!>Fh>nO~Qq@piGqt?Bp%%NanNz1! zm8XNTb*ka~>cGpA)&+x@5ftWjf`M>sAZmiK7V%>)5ElU+R;!>1Y;AWLvj~{LeP&_Y zGSq+xWRvK6F&c$X2`?g3tTO^aC2&Rn_0& zhH1E+N*huOh?{|#I-|ktmS+f&Sz|a$9)2qAac z(O>jC+sVV-Ei1A zNvO;&AiVe@SVSq%b#0?lH>?mW;uO%;hv-7VBF+YC0rm^_+FO7c=wA)gGULvtK5*wC zSOgJkup4S4SOifUg9=%Io|P^>+$rM81b5W82mK&^vC5PJ{GW(JEGf*SY5+Xxm>1jLgt zr)vT{5Zw3Hk%BC4%yjm6MX3`Ul+NNl^s(CAYb@lL?<=N3)- zH)uMj!2H%?XzT{VdCSPJ%-^syG<`!OYErZdXb;+`G#@+*kVXJSbVm=`nw`x@AuSr9 z%}J;Bq=V42p7klONtR|SX$b7e6xi{cITBleOs{O1ZbAErk05Q%glL6s*g6#hr>cggd}eErR0mgEelY>fe!)uOdGHj)5*9%TGsSgLfkw`~$+E_XIR#C`J7+LKo-XD0mFJ zIj0wXeP_G5RF>GFq6~!eXF~|I0M~^QKUVN@0AFXoe$zf+`5~~xRUzy{2J1C#G{~ZR z6zDfd1kDI;)%6%aXL{c!^029Q+mvb?$>IX106>3 zG;W0GDl1AYuRb5T6BWdwRKZusiwe4c5I0=UR~1BOnhvDEx1xHgASASz&R2=oeqY=DfMnNf}$N;gZ2 z50H->;`_*wJC0G}+>OzaQ5$Kir$|9mZ#KdWOV_SmnJ&ZSMutU!44116ytBPa>w+7$ zQd++jJ3{wLQ!gaAN>a}8YEzkRj(exz>$FeC;}DrYZp*oSt!3RQmesJ`TGm}s`-8}j zF(Nze-NIz_j|p2pxkSj|f!Aq{m*+~49kVQ!3_`8*V`HtC!@nSHsW{ryiPLZwA3{qTu zk@0EEiK!=ad_n``&H>xMs9a7C?g#bwTqNE^!l_&X^i1HAUx0yk zG45@!@TXdMHw&+hPGmtTGzJuCz%!s(u3Fwtn)%T!U^4zgz#Bj^{?ADKh_s1swVlhV za3=vY&>P<4af)iSiYCAnhJ6eNLy2m65{mQ3{U|!Q4|om&?ndye$|Oi03(W6;nVdu- zIR}3}MQ$9I{OQWf!FjuTO|%yo9SeB39pId>SPEAR6a~SJ%Azy1lobvzP+zW1VK1L& zsKYaxHN)03+nFeQbx04_XjSV0zcB>AJ0(KG+6P5=HU%%9r+V8Ac=-~|98?0_zE7-C z7~2%X_|P^bt_dl;AOycD1Rt$%2v&ZS>Yzqpdpb;N_(q2*kc+D3P^6!*6ig_Ff4Xbd{dEJ0otm!QXy=d2Ks@Z>2eZ`I3v%3>vUwsmN|xF^ z+3ZDKtnSX{Du-KkRb09*%XU9T1tZ1bxJ>9wnai_j30weoNoBJ7ehX3-GpjFivif#( zI+00DMoSRdON#DR{mcvu?(_lHLw!ctbRJBKRXr>8qqMhg?|`5?oIvpNmBDa{PG!;L0^18i``b>j60c$ONi#;9O&#yUF*-?C}o* z*7H)XQRMj)a&^ch|AfR{NR%BwBF7)SO}(zQTKvZtmERpDb}3(HEV@Mzc4-;dmE$CQ7NNmlJ{62RM#w(P=8kpn6)1=6kDm+IYnap6x(zGA>k9#YOfa4oH!cS& zb7qe(BGXrUWS7n`k3a@|`BasE98Q&2H^_;fdu(j1u{I2ppT%xI(KNempSHiVX})vI zKs1O)q3#i}C%|mOl|WSPM_2bBjM`T&X=++{GQ7qwEBP~lC0uU9y?9;FKB!u__wsgKP8J$GTo%S%(p zJ=z4>g;Bcy*3y*jaxG0MPCv=?6uJK1z{B%%8q+fay<8P4<-t(?Q{ODGrHcQirDSz3 zY%mpHi;6jV(R8fqYMzvGjNvQ2H%H-=a_#rjx7#|n#mlsmY~prmhCAXL42$;7pE;LB za=*h*PwH_r%;$uZR1c^C?36NvvlCwo3HA$xQ?MRG{<9(uhNrj94!VXne4WHS%Hvk> z7;kt)n!j|iAQA#1V44)FS3)&y`ktCPhkJiBR{!g@_kUpuLfK%R#Y+0cP(if$T_^%0 z$=kfeDet1)^vAY|z4cp!5|WPznL#Ja52havVUh>KLct`b{X$ElhZC=cIGyl)oCbtB zp?T9gt1bChaMqd9@-}H=f+FsLYHu=#9REq%4}1-8Uy!Ny+vUfcqNQ4dJSJIt6 zgOC5*W3qT?>Q0*}jz*EVm65f3w_M{`Z#Afe&wN6)jF*x-TGjNEpr%r-$?z@<^Oi$1 z>z1rtxT*;k0pu;{6-&(dS)I7FyOn!s;Gz8P7`VhDYn||0i#dA)Z%@Fkc&F%ndourLm@o;Heb{lx$v$ir_hDwic}Yv|Wyx!z*RmuxVHbcF7x)#+$>(06 zwD*g%7MMAK76I>Pw`NP3!w;j`j9L2w3FWw01iu69ie6AM&J5rbo>XmXWa%n6N0%kKjpUgQP*Pc zlZl;7ev`>7gHO@L%BPL-Ve68f+-iFg%^am=sEZR&uN@$jp=LIv;6<|({xs;>_f6X{ z$=F#t^`HVC_p4cZm3F*o78LV3IGM);ugWu)NoZiv^C1yhu?#=U0Mie%4l4CY0n?@t zmg$GW^ygrjII=M{!xV$SGENLs1RGpq5aJJwQ23t!Ut$aFcAeQ}Ax^={VV=gwUq#m`yp6uMJTv-U1}tlp0o&c_L_z0V4!hc?yepFR+GvKYCZicRp9!g|H>$KM`8=d5 zg*kH$pwc?6WK__;vnZ*LXIOVZ(&ke$y`eGamJ?mFgo<-O-B5Df&S1+P%hU*3FicLHc)3Fh$9;E$gtE8%Irg z=TjbB;K2aqg&jH6%RyxyGb)0PMxu}FW$D6UnBWBA@ZV5rx>AF zmioqwhS6lDI}zQx3597c+~wEPXc8Z&FkCP%3$O^cql`JEo-**X9fT@Ita)Q#&3&~L z{Yl2bF?BhKh7h;z&@AAG+J8TYgSO# z0WHPz_3Hv|G*@V;=&y>U!&3$BQz7pA?wOWe96f)>&!oO+gOI*@uyKY1klsfCQG>#wT$8GsdP-n5!`8+C_ z%j4~lGKG6P7Zj~+vr2Enn*UT|c=S$|y0^Bfd(t@D-pNvT`@MF!R_AcIRv<63)CRI# z_a9`T5)RS+;F-{35oND(nIEX(Fu3(*)>|y1>_F8rkt`9_e}^n5j+3Q$^&NKNSf+y2 zC7x539AB@aUB*5*zSd!U9Z)Ro>Z=fz0Y#mnFBMB0wsvKAAv`iNj)GoXTCx@%LbP4{ zR5Qwl22HpiXhO6dC+@Q#Wqt5Yf}7QjFEhB)>O(IZ0LZr!-1-@O-^0yr$F~gJxw>2D zT@X{X*-O zxea-lXx$_y+PKaqvj2TpD~n@*xI^2GLQS&&&Ak%|UJRIvgp*jRWdFnzH3c+KpgYM) zT&ZBrT$d;~bi2paBs14bI{x+SL!1H5inl8dPTDsc9`X$Jz5j=|_W-Y}IR1wBoO8>$ zk}S#gl_hs!%W}76EL<^ImSjsJG)1TJ8&g%cY&W0s_z*pR2uoSHboxss9yG|?oOxL9C^>9`qHO*BAu!|GGvK~ai2TD zzNF1iP#bL~P|QDWc#ASxR|r{SkSBV`Z6Rd4LF)Mw)Ywin$izWPecK?VSg7N6ZYbon z2HEGaeZwG=2zjqT_PVO%69Z=xe8Gbw&>HI0jWyX!?XV9G@+72gVhHY{JefMyx|tz( zp@E+O_*?@Yi^%60I2SVqhUn`JybqIt8UvpK`qGslkJ-pFx>jBbpPSKQXfpk3HmuUC zW^<)=SD;v=be!k?4&`bP{sc!`d0?Hla_~tr8u?*ri^{?UWAUI%I0enTCwL z$8q4p8i(YR?l5qvDVKyiCD#}a>n^S8AcWJq2dr)mAs+D%*gY$`Cxm#-LtqA4@`ypO z`hMmiuq9RUOen-)h%Ip-?W^842Hq(ES#0KKI3`>P+huIgGmjcW;B`R$yIIGZvWRWpiy)-dPc#le|Sb+(`qn(?%@6-k};P(EaW<`9lua12c&&IWLqyzl7WnD_o^LI?16v zFNaF6Goje}O7?_2f6*+YDSm0-Y;rNg3f6?L%J0^NNqEV$kY}1Ea(W*_ja?K%l(ZNR zOL2>)`dTT^Fj8`;7rm2`%_cOZ{Z1fAd7pt_YhY+7B`1WUy*Hqpb*6!vGX%2}v>)mQ zb?6V1bAt_S8(aH3#CI?+h7Hby>xexuoD<;R ze$PV5bzo;&nV+ott(KF4;eVo{WetA#Z{G+V+O{?&pR5P0mN@|OKT+NCQWUcj{3n*S zEO4>D$A4nk5qHONsD*#GD0;-1_~pMlA=>gB0`Why>4+|X_;0^&wLASAo!nH-f|D3 z;D5&9E!X0Q|A`eX`vS@Tj8JZvbl0a{mQl4S=$7w1r~wT z`zl+0OO?alhEf%g-+3y^-}1F8#@~vvm6a+^*Af^*Qm(+N8|%wfmRG3+ecH4_hLF_3 zUQ;Grkfpk;cBRUqr>S;%ZQbfxHHe;y%JS+JWi=|Bp6XdDS18~ZtR4HRA=*)@h6>3% zmDGTFDo+4lJ4{31%BO2pU3G;jpbOd2h8XdnBj{)>TZ${R4P|T9NP5e)dlcPG zjg<`*l}oE@k%yxRsHtZ<$7ttjy2sMpP+4BrP=N;#;fC!f;XQ$#CeK$)-_mMWpx~Y7 z#q=$ysavAT=rV?+mS}ffL)o%QXp#B|+Mrl+P-Xc_RpC(tph|+s%A;9IK>1R&Onz$` zk@zY)S5-DNR@WgVUUb!QhD6+2lCN^;UxjGu8nAmzkIo5ID1>VpDwpEWpKfGhWdpCo zt5fK$h8c`yD73G>3i(!)H7*B*=1P-Y1i-6Ym(OP=e#S~^MtWl=CCNHGCh`FQ&Esn%%r44 zQ_Q5KBI{OG!N|wuC#y_!t)1&zd)w9@-L34Sn7htM^!i!N&ArFX0%Q})K|E;fz6bZA zRKE)}J&P;YLBW98+JPP0E6C65iLs?4f7UJwV@bA8!x%a+A;d!vv<7x}lj;~f zTV0F)DjZsN=sZc>4)1W(66({KAA7EvIFbXzJIVj$dBC>L_5Z~j;1p9RuOjdGcRPgk z<^cbHjQWmiqj3HojQyzwAS3-yV5R{`2hY8Mf7k$|;AYJsviLnD@qae>7eu ztvK4Y&4guV`Boh5s6cYEQmr`Ju7Gp1_F~1+&J^5W<>e@hRP^<9bx>!szgxNX2ImIk z=Afnoa^^@!a&pj5vHGx&5sx+K4SM<<$+|&*qi3slB7))iJpRnN?pD_;^{gkkXu~69E4)dGQf7W52-_1owt<6J5KYtP%61hG= zTY`yx@eo25W(DRUqn1U&Ndd@E+7?OYWo_>2>+a~^1Y<_Mm^=&d;xN#V$Ar8-Yk+yk zXqJRoGXP@(4w8VIv%=;fqq)`*5UQKN&>2N^uyrxOTM14v4;dXI9mOeG=GYh`)ln*% zC!EjFK%-jG)2!{1sAz%3Ox$j;<~F&JX_SP#I1NYpMJhVl+8;T6mB9t(A)|#7Xm^%r zf7)V7w8&yF@>rH{9x^&b^5dy2Z{sIA)w%>6U-tlF9x^&j!tL>azIn*#biusmmw}jv zjFt%34+jUPg}lxT#Wq`z${H-Uc%uu&3;U2>1=k|0mT0wAkJ_50^RGq{q_T{C$mj~m zF*l29C(%0VN(hbi6WE809xQFS05S*mA)^ff9G(@j4;gK=zK_6#URL3B2}V*N=SrcS zl(iT8kkKZ=P0rF*5u>ZDKSI)JSvo~)Bt<1zDFz~=Yc0-57JJczdc^3V(yLcw`354R zhe_(zWO?QoqeoazBQy*|((P01b;`FTc20&nS)^akRFhPnn>`lLZpmp-XTZ|Rc? z4K01r5&qIA6`_|tsW5-(lL`)&KB;iM^ht&JLv$sUKB*{g>5~pkS^A_R{iV+UYl5DI zNGa)t$hFV|_R7kiasX5>UUEAR?0-7@4rcv`Iw0<11;sHJ5& zzrzbq)wN6Of=(}hS5z)(f+0J<81?8K7<#lz<0nEm$2}F_JWf-FF&~E=&kwUIJ!EKJ zV=s>1Eny#ESWd@uSP7QT5w2Mb1?5Ipd=6x;m|Kk2(hYNPoHS~Wi|83TUzY2fu86tC z*f`Euay^4Nv0~C7U{{|Q(V+pe*hIo|RU{Nr#U|Sb7iTh>;V9th%ToC|g$_x&i7>xuAz76AsCFjHJdtKYJe^5SjgA+9_WW1l6w zou_;u&K4omxL$0n_~k{Ts@4Q=`(y!9$3JV=5jfEtPuZ;r6#a+Twko=b-idjT<`3{r z7=^B?6J!ae`vSd#RD8SHhPiVDZnN`5b0RcKN+;4%kw-I;mWo=;rWI-yb^wKo)T~^U z&4|-P^cCI17lNkmHgO#%5>w_LoKUkHHTT2I8faa`ws9K0Y=72O#q{>AtV5ZXx0(oQu$9I? zYuCpGUU?tN?q%9T@Uq9V4r7ORHoffhwD)0p+3#70vD^Cs-f8Umv=`+)UB5MTI4cJV zd>Z>g>u}Pdyme(bTvvv9y7Ze_`uqJHZA@xa3j=-+UR@blb!E6wD#JQ@?1xQdhz@6E z*zQ#ZjvV9qbgq8L%5Zc|K1%dcfFDJWl6T?wf{xeVD8$D3tY_hv^(a0i_u^9y&};@Q zbKWjnDD6MaVu0BM z2=VAgNIZw!4=}`6k@&%=aNY>?YyyP%Od*CQNCBie-jKfztkv^8({~)e&w!?+6OK>m zSO-V>qj0Q(ql=D%;P@^b2f%R$9J9%w^xN>g0G~*5xtC5zWq+zA`4>qG0T4;XJVvpR zBY!bfh)v^t$Y7er5W^vX4fF)+6u_|^*Po2b>T2>9gBuCleje^F;?N^Tc07h@kF_R3 zYBl)@L(3+%LetXb)8tnToK37P1TW|hn$n3O_}L-&g(3Le2F@n-h`_yO=GCRtW;Xdb z6M(|Mt{I8Qs`ziADA?j5rf!t1o6;!rRW{p~*C^9^;4fIA)v;Rs8O&V#S-W0BXx#&U z!5+8_8LxZbFWGM%2k%_n%D!Y{`3cd|1%F9)@4>6P;4f3U;IB*SFi z{zY`rA)w{I{YZ4tZv67!ek^)Gsy>ao+d44yaW+NswGnkVs>=VS%8c1j{x43;T1*CS zit5UG$7m$bytejVoR-NGWZiwZz^0t#=#+6@74O}Q&C0_5PV=l8suoVkqUNWgt8-JK zcE?jm+;}gJCiU7n5*NBu0?YON@>JUYeEOB9G$X?5x77|owM;o$6Pz5aMT)T`QxP|6 zj?ALxS&sn_V~{=gkI%Yn-m4LDmsYgRG+h#o33IAv)78OWNBK2q}<_b7Bv6rKvSf=0xtBgmn z)fv0lS&F>Nq`MHWdi@mD6Pvp{wy{4M#$41s|5Y!-BIe{kj&1CJ&cQsy&GL_J?9cDS z-d?T`&<7Is7r#Qt!bEUvV_OypCj}rwXJh``yz+761;vL-bIGp5WVCZB9--&MEKao&J)gO zXkhxWja^_d6So^|%CU_-N0c*o;3R9pRsnq$2bwNh-`gB}oPQyZKvF;rf&$ z6_#>Jl8W+9Nz$PyrzELJ|CGeb-Sv1~V_kbkd*3z{kwX3?au~WHFN@2|>hbJHBNQX+ z%a&BvR8w6v9ap6v&QaD7Qw(09D(K{y+)YKIi0koWRU=eBSC*AmH7~DhsI9DNuHaic z4GQ)^J?TQ5*dkm`lzpTpK(N7F3*E-O!ObT2zySUx_CS>0#2yIuHnF2-K9IhN9V?CJ zqdOVuj>b31PCJivHt$FLa9*L(LWX+z*y4Djgk8(9?S9ylVE(8C&2?(Jo94#ZF~xUzw|yp}JZ7ZZ<0RBT;*J2)El?eV1?V@*kW z?Dzg=(!ZrLZzg$p;zcQ=nTj0~{{V5OBdM$}DaY$zv2)|!h9pDXbMVb)2HXHgo_uI` zDvxsNd>`s^mNwMo6r&(?B4DrhBWSYZM8K}4TV3bErj7-o4V z0`X!QXR^X40`ZB2r9HqDpZqp}F-p1=42E-ZX{iG5M8GZQhzRWr=R3v3yak#N|vbn4x}0RD8dycmbF935wDU*HKXBFPo9HF)NqJ2NB)UA zor|LwDA7=gFr%d?yt;C9Yv20KvZs9!qqTkxiZQa!dl8d92263mhaAT;E^8;_8aoKm zSQnEP`A4A&rAnCBAoh?4PF`TVz&>57ghulculKY>0k&d1niEMgMn6SylF;unhY>ts zeS=gY%@ct%PXy9DNomG)Llck2f=u~ZPctRse0!kJkjwby=A})wUUD zJ+m=}&0c{?g&MAkP6vL1>7%@y+R)b1wh40v8l5w3NLi(pJQ%C(%$Lf{W+Kbj+Ru_g zmW-M!xoYwVnV_JWRe-GkFa3R?^otwYZ;;AcbRGra_-F098iA%<1XSWza9j;X6CF3g zaWx%3h2woVrq+{?zWI+Ed=DKA@gq9O<4riGJ!}@X!HqL)fbjZ0w?h!8v6W_2u%xmm z>&~Z4sGo~ml}bs@YZQhk2P0(%4AS&}n%vkFcB4R(s8 z&#=UQ3;klL^&S>v<`dYC`z7e=x3nC^2v0%ctcR-+GUJ1M^{lbVe0y_$=K$$yS zr87;S34m`4!514iGx}Ns*Y}~d8B1Q@UCTZ0(&dJdoVjCaIPceK;3a_1IX@H)2%^|s z8efmyJ67|n3@!tS;h(kZKfPzS1`hTgv!j1TZp|?z2s22W9+K z0G~6*z**vQE!wb%2`o3Rv#^J0(H?%)%_8 zv@8yC)>~{@ZSc-CW-8y}K=d&29KEbP-d+!8 zIJr20W0dta$0&QpyaS|Xdxs)8J9e|pZV7dT?@a>yw}@b|xgy#Qo%{D0E6%Q3^m%6) zO*}LnXWB9H+Zt+(#Cg(`OjP3b=i&Gg1iywu&A%1s2Z39HyAQ)1i_7D9X zw*1k{Kr?@YHAAGj{^Zh|40}GH)r0UXII$t?V541?zGBd9_!oxIxF63JkK6F29~zRA z!QnE8{Q)&FA;Olu2ny(*n=__Jyag4kr% zhaK2n183DTFb+^CprP($h&$9}XIhameuqXS3`)vcVbvQkw@7P17Vr8Jaa2m@yh28( zYUJBe>3?fwWO@+(CAtIFfQ%QETE;H-e8UT+BY#$-^&pr@zq=7cshTd+5C?$tv(q){Esg?D7Z0V z4U0B)_9M{rjh$W7yN+(}o4&E9_2{Bw>%eyRU> zTiR(B3t4kYv7;S1{%r(x^dkl;a#krjjmZD)wspjHR`Y6L^qfrab1Jmw+-_kW+1Sz5 z3gsi5ET9b2_ODYmtm8FxP`8Q|Sd%~*H+$8w^Q?>Djk@m;*hCUd_NK*La9wQB&bQHj z)pTvCZ^gCZSj_$&NL9ugtV?n6L`avgTT|#V!gQI2F0;9*rmSIEC2u%ZF2f?-jYaIs z5H4#lK7;yIEK8yrbZ~#`1|45Et{EUc$d(c?mLu_nw)Ar&QkomO`q$xdS$1$!(v7~F ziSnpzf+NcDFIq<5cpS22H#e?rTv@q-TQRuV zIO{fY+_DyL9I5!eH0cH33MkfWR`J>N+Bt}7TiwRhZEZ)Xcqu^<0jcx%6k`Y-wzhP1E>1`m>1dzyd>nQ0JOYXtr`fLd6%1giP72e8;wS zphz-4qKtjV;?Bf+EQVO@;>G4K{DbI6I(d6YDsN&6OI*TZw{E@4%{Zhq5-`X(bg9Rn zlMFHrBLf#V^#a{EXGJSR$V%9$rCa4lr>Z?J>KR#P2P@%jTveC0kN5pX|A>LfPGycE z9i+tonmLvwlAEKK^qGaMsRdykeOOIrj{6e>d#mZpVjVubn$Da^SlVhjb22044UP8Z zqmlnx^^UYPe;>qR&A@_q@XM&^*8G3KKLi@`uo2pp6GO3q_P9O6qDa$_XHl$odI;T6=gh)@9?92Ny6n#i{7o4Y0K#(EEK+G9rG6Z@z#<8!m&Jfp((wn8{I> zmkozCSF=awW_R0$%B|>CJMr*@ePD#O!r}9Z`72v{pjk$kcvrP{^!pUxLhIuNq}I73 z7M7eY=OTc;?CFv;4-b`&w!<`*!g@VF7AW#(?fM)+M@YKIGTrB3bRLO4Y9y+Vs&Nxv z#ANX!GhU3QrrBuPE*h;3wS{BBW;ZnCV0UmLBdR|^PkQS8i1x?+wT@^aBRUg|RX9AB z{c;Lm&0zSeO!!0m@U)z&!_Q#&FA;u>SGQ&|*XOdSCu&)$eO@nv zS78zr(@+X+7 zFVh`P9@VPb*PE77#U$Qp0v@TuVZwC<80#cf(OCy3F^m zni#glgk9!`<%N?G(zKe`v{oamsaLC5ueQTqbSx0Zn2;zD`LotGBV^$jK>d>OO(4-$ zLj)l-(IGyp_g4Rtn;9$ z3vA4*CgS-s|6qaXQPgm;(Tm?smbChJ0p~GrH z{;XZc_!1pOi5>yFF&p`es@25+3t#gj?52c0@P_$oL+;AjM%vd6^Pmjw_nB`a^Xq+P zCz9D4Y0PxTcr#g*oT3x^1GxET?JB~oUgzA+WHsh>ucqG2#&{jP6WQ?|WCAW`F5NQe zd4NtXd>r2yZy>{V!*M4ZlZoDkx6BXt16Bne!J+oS&Z@c;-hC2q{E?2Ka18&W$^UN} z&Zm&`<)>nuDfxdh@T!Po$EAi~H~{>!uDFdv#{%^lD@*68YgIkjTH4&h7^@NW{ob@z`BU>Z#WnO00Y2?<~?WV;&(L zv+8X+m~&ZwLidtRKaJTojafF0IW~>CHH|riCCyzX3)pR41HR}9XpU|AR|ft7s^cL^bn417}MhOb;}= z>yakPadm^PYPU(PH36=~e35_Fu66{~RqZxbwOPmo-6{TBw9M!s=6IZ?kHl{}d?%-tkP7sah!{{n24{S#M98@n7D3+lmq`)qG3oy(j zaL}%U3-tGddX&wb=pKIRAn7~z0DQE}GVx$0N1;CeQo;s*FK4^7$2*=4RBveDe!`~O%>Pz$7E7S+jt(neOS=@z5@pf`y@J8;J4GkLjM8|>7MdW)%**w zwPam>4YnGjhMxQ`vQ%p5Ohe$+JL`(4NW>a?4Tz+9{DRcNuG3K0lihWH_1Nw4*`1fp z?gwMB*cW!0?-_P8;LwqmeoIT24*>tHOILW*2Yb|gq@LPtC_ORdz9pN-PSUY?+yjT? z-MDnxf7dh)GV-!%{0wokZeqV-MzeuGEwF=WziaxD2FAMmc0fBl$H>NJ6vIDw1kGrw zK~6G=0nKP;qoGJ?8Z+XiVl?P*Y%rse2BsSj8|tyZM%^xa_hq%4EwejbL6Di|Z`qJe zG3>J>hmps-O53`-a7d$T@#q^Fn5&!pg3S<^)!Hw02L#5r)P1A5$eA?ue|<-T=W+iZ zwllVylvkNbGpGnlNuy=wP~DAsbK@~r`!|~$POnEe-9cvBZrWbQf4sF3ai=i+|Mdn& zXptT<`xSQTYCUb=BBXcMM+w3vEd)1vU+%U{DhD#kIw1?*XvPq9jxn>~jb_aPR=l#{ zjSiweqT;TzgjS?tr!sMRXC-z{l5V}T5<9nSgUf~!|jIw%v{>h-g%UA zj}V{AT%x_r;&l;nyYLPIx-B+A8O;qVYnsa&s#jK*m(?^k!tN5!_OymUiF?@S=g>ql zS8juC0{8IIg$SWC%dyec*VVHG2mdR3TGzK#i=7$w2tnIGw_|GG+R%2^IGqky%Jo(5Q9W;qQhbkZJ(L97!*5mL%q zlJ0u(PTIRP+>cT229ao5W+QcRk!<_|Yu3Tw&1Ic64hubXAd^CkVIz z(zSa@JaKeA(~ja|wkPWUP1(2`M_&%HBJL{)k=Prda!-=di&j<_4T}0K zD$gr2H41OqQ1TonQz&lJT zkz^(W0L?d#KsT4s=f*ZyQU^gLbPg&f#4a(0(K>YKMCeU`HCz!Gf;Y?B%Dc64gc{_SM<+wrg_~z~Cp?N!@ zpm{s(fO$LZfO$J1fq6R(fO$Isz^L6Y4S_44E^Xe9F5kQzJ!0ODj*xjfdOh=Ybf=iN zBfyxq(@t&Pj&9Gq9o^Xc)#mN!3C!Ek=kK~Mrcax?s*(SsAHl16DNU2Sb3+^DS$MEGiJ15sLSZ6G|Pw&q`j&R%g6Vn$shr}7s_UnJ(KC*>@qKZfw%LVygJ zA^O)$>a)+XPRl@xrlMlzk4~i)23^sP$_2xdJc9wBJ&<66cv zDW-SynP*lVN0bs(un3{8_9Q$Gwd#h?5kG|-@eU%`4KGR5$cOQvZ&V|22{oG3W4>;$ znbRyMidDkcV6R!c{$8`p0V8fEXbS1xrx^1>Sg77b9y50l233?e;{0{>&el?M6l;*Buv02{Q-AyZe z&z78~*O04qJc#HWFqp&=vYurLodM>P*BPn{u!i}qjsPl24Qk4 z_Eo08mnxF%mCUfg+&aSf0Yc5(yu7Wav#nz`&J|kzg&|vto$6U6(#1}n6nl;u%`he0 z>=*0eG>>3i_MwSm4sxG=FsqIgEeqsw7RYyzj9I?`w=WFcDO~VhIXoL{#ZLgf6Zn1K zg5xDP)NE4D{I)I!e=qjNWgd0x14BIp4mF!uw!~2TJD%5m4C>N!@P222b`?U+xde`c zbJb3*_)%16!e56_$liogbfLzmqRj^NprG*1?Q{<{{Vs#L9RJrxK$G=B7Qa?v@YnlUd=r-1%;Gng#pfVZlEqbq z?p9{;A5TCulEt?IFIoIsIMgh585w8j7+)vlyQ9Eu-cEq$(?91LxDw78CW99I%FrSc z4QnKAfpVpBcm!jbKI>S%xidq%*U7t5i|BfnDjruqR$)VC-nr{xZvkC`@=MAhrfGzyk!0tocp6;Hdxl($mQb@#NNrdT)*mW+p{)B$5(2zcZ zA%K6@uG*p4?&JUk3XU72|Av&cuIDPV8CQ0&`?*-sa}D5S9I)W$h&B8pG(`?t@N?9n z1{V^)M2NQoS-yqQmP@qGj#Ez7nNcB`q5cl-A&xjlAohf_)l|KOcNy^{f9$h$vZ_!= znJjFs73CS&VF7H~Bm-meY0aOsC!#OC)WBI6Z_sevY;}F~B9;1hy;mO>-ef{CXN$(1 zqeXZ;h_3Qm1{T3aY^?IUu&?MI;~R-&vDZEUUtFukMQg-j@2Hx9`@E0=w|UWT>#Mxe z-!NfPnvCvQQba7d$aGV>n`X{QH=V6UvkaGt&bDW;_EgI{4ZvkGz@I8*qO_8e41+8g zs4kqVQ&;O(h6kV^wn)nDVvFu$P)-L5k4uF|*2mC?S`WtinV^MmTi00M1MR+B;oeLF zb~qlvDJ1x|brA{JF< z$*~eh&vtR6`0jvDw~L$nc2V?@;ZcH+UOj)xz$!wpQQNh&YXaE9?;DtiX0)0~H~NRA(Z67%d_<%?=u=P1M*}Hm?9j14AH-fX-@x7pU<=PQFiKSX zs_~d)sr`fbS4hfNC6>bP>IgXF)LHpsN-16FtI}(n0=bx%uZxt?&pavL2&6pEFgXE1 zy}Z1{z_y2ArRVF&z8An2b{d%ErS3nuWWqay65lBXeLuF9w0tXZ)Q6(R0PuyyCDlSm zvovTU29)rPNt>s)6R4XL3W zo9l(E5z7Ih{T>lNML0+{)b$HHN7{e5Navz-<;;zQv)Odz)9y3b#hGj#8Z}D8?YFYN z!rutaTj!~1Plib5c_b2scAn6As+J(B{5Z0U{Y)&vATXCEezw$!iR0S z%DNzu_)31w| z)LWzqEjC0?>uQQFDLKM)Nt$4*WtmQWn*{g^{L7)8bDa22o_1I$mS1QgWNowXn+Cz| zvgirp`A}12^(yD}>DmnXIJIz(!Lq2Pe;8tjOp6?wbpe(hTJ$a0>4xa%+8Ak6;l(AMz&p*UP3iAioBS9LG!CcO=AV@Jsca0!|5MjW^R+ zVxnTjD!STu?n6dFz_hg7=V4jx{$)IG?TvK$L6_(Rqzpn_p#?F^bmOzsv7EBWSe~Iq zGsQY41=U5#Ha^^P4nY#heWBE@c z#LOt0Hx9QYg0tb1d?Me3Q)Tk$AbHgGIr~);|H5;OL-OrD<9P=%bGic!r=l+m%mtr; zc{%FRpb1Yq)OeU%%QbnpNq90yj!iHEsp&U_LLmYjLg#Txh#-$;_o9XyP_2EP0Ge=KZ_~|ZB=1iw3K7c6 z5IZKys-LbYO+#DJ4s*B|qIl(uhY42WpCNF2>>JfoJf{^=Cyd7i*8i?Xy3s_3rG$0=g*N)@riyI-zBCrK zV=~q!X~(yb@h<}T^*ZYQ@oi)}t@;c&zICAZsST(^4j@5_>N;6FTd3pC1JZRI>Hp*7 z-c(I?Va+K78J$IgU=jD{;2v?;lIeeYC>(KLXRvgWEYT+cjk)?*6$Zg?hu5i>Lsk_X zZlm5r+_wm8Dz7SQP|;DO2Z8pD9xntgz786Ioa;tUrhNL0H+rhL>owxr2MhINQZHGH zUDoK?!p$hxGp~H*ddgvYht*EKCg1*DVX&GEY7A@#VNShK%HMgrQ1IPWP#ECF1UfwD zP|+)?x1Dy{opQV#aYZKoR3tW2iqt=bj+IEk1jo>^SwbLj$*D^0fqYC9&AD{^pMOGx zamg-R?`8q&djRnQtA&`=8dZpEoXqPM1dX`I;TxqhUQ=H#XE^amRv-QKntYjcxezXu z?+@{f(g`#UOAyMsmOgU;9zV|#A-uDt_%5rFXr@UH%;SF)D^H>82k|#8rpk5WA6ert zWGBwW5E%cv#f()6UQLaEEKGRyApWVf)Tj9@O!E&zgH!jE%L8uwZ`N@LlKCa%$m&<| ze@ZNa+ORVd|J-^RP>7cjB>sg&g4m+=?S5=AJ0wwDJR(uTe!-{72-9R5nv4M#A>t8x z5c<%}?FdMbvLqTUQnvk`h?I5*BAz4BWH&Es!V68g?$D#aAO}|&T4yOY$ttXU`zkk& zwL2oX*~%S8Urcw zLp1jg@u1FV@8J&#*>(7aR6tTSKhV5^9un6E9-8Har}(D{W@|1#Sva*7fozq_DmKdV zQ;hil3~jD!GzWJ)yDC!`#GfB^7N`elHU6@AauZXq{}}(hFiYy#FZE(SS;f<$jlVK#9I$EPRIVvgyW;PSIuAO*TA=rZ zxk`vYe-V!n=mYT>fj$(E5$LbtF#`Qf3zWnSksjW5uZJqfiq<2$aF^txQR|Uq7o?)v zJBj+cpe_QcAM@T7t-ZLF^0B}!PHr)loJ3P3{>dnIaF-^xG_=7=(6Lza#Xl9$Woc<< z+Tx#$x(%szR_jNzqSt+ju&6EagjVziaTHLtubw~^hUimoA}jK~K-NZ|V($!cp8%kb zfyF?BZ+6x4%C!>Y>3rL5>hL4Z@yr(t0b)c*ptuk8?ho)M&8|Je$%0oQ+|UJShc zLvZT#pLqzKUA4Nlg2E(*Qwd#!NeuUd0Zt``-zvgTr9B%82=d?!4F0VBJpegdRpJnK zdMam|N*qcT;?N|C!|nvdFgGJViKTpwQP0RI(DG@os8M7L*Rtii8N+6QH1lnQEAZ4a zGDfmBAmJh1iNXwdEFs5N&&Wt}Y*0Qx^UWjB9nR=;bBuaM#_0P1EJ#t$$QZ+DQM#ch zGRFJ>u!u{{P$YXr<1$r}`CTWUbI#3MVD>5Ve1}=4lAbk!%nO`fB9mRzyH?x|gldNK z0~A?qvcvc-~S2D>iV^1mF z6~z!&%KcQ)uaE7&WTf3Qz;{AP6dZsWNkSh97A)Keuc0wDu;P+lx)WM z>M3MBSlJg~NE{8#0i&Kmr&dp)i|Q%z3-uKKQawd}p`OBDs;BT*tEbSV)l&rKtEbRs z)Ki2+)Klp4)l=y4)l=y4)l=x9dWuj`Jw-d9o}wL4PZ1KRr)U7wQv^Wu6b+$z3SC+~ zg)VOjF`OPzPoX2Eov>m%2e zq@F@=pq>))`RXZzh1FByRTY)1L{DVMc1sVzjrAyafw4xFslp-OwP=7L5y!AQS|Boj3lfQMXUu}3OU@pQgJc3R)(Ot5}0 z2wHcDxI_kI6Oi3O7VtBOuDa;7-p@iVb2OV+FYjGAvak2Vc687|Hz1r43s$lE}jm# z(c)|gDz1A?ehRZ8H(76ey?p7UXCYcl)DR$aJ#^^W2Lbl_(xHc(glTrQ_3r*J(m$|yz!#^{V* z4TNfPNKsG3)0Z4>xtgKNb9zvKk)*(biWewg| zp5>R8DWq_X+hJY5my(hvBB?-KQ3eYN0}4{VAX!s}{4Vrj_3~SAt5D~W*^Bpz^heQ_ z0fON*%=Yef>N)Frbgi`zN0kAW^6L6(Tmta=sJ&o?c@6IQBu|BxtMKs*D(d7ld? zgHq}7PUU?ipsZx7f#E#cW@56FzJcMqs6cX(sRoAgTmk1M*VXnPjoS(v+c)+1;8t@N zuEXVJ3U08UgF&C!*1Nu^y&Lx@RAJswyAgN5bROnO2$P2+#DhGn?A#!RPs+^OdU=I{ zu@g(M|ByFXJWg^8-b&^gzOAnj_j^>{G@DtD%#~RQZ?@#k6jJ0~LmT$adpE1R*#e0t z*EQl{md$TsOxT%Z)riMR#IawJS0^4ju`fLh;&Bq|F@WT)5>F(tjGndPi6$L_m}E0(3l3YR-kA5ydBRD0rZFI!F%aZR?IB_1oW zgE?`ol%1WplQC}>OeAp(lX$*(qKV_Mp3A#PJTYAlE)h>WaTxRHO7WobdxfL&u9cYm z{P;mQKW^~zV>+aZjzdZ!?mRlVgoVjL|G^*qtf~F+-8eDJ@$6&E{)P7W_OS_zXk#1A z#y<9w<1v%V!AS_R1eT`k&+7ol^#NLi*8YMU28GEK``9F$6o3q+ZIN_da&zceQ`pBQ z@!~MhkjI3)KDjsh*bK8~0LBCyBmp-kp*{oK8+gQe{W=Bv*e{HOeQW|lmQ(G)))27T zN-zw7rP#;j=JhE_t*UM~=LzRCG;lBWv6+e64VJ1AZ9Tmv;Xp*#i-K7049tN?=U~_ro-K@<#P zb9Aprh7DpfIct(3gV>j16X!5B?q?ixf91S_tQb#siM`2U^Pda~wOx}DY z?IqJxu-NEM1!)`IsW5G$I~C^H==N3;#zr^g%o`J_z^z@M-m}qNWY%7?EhR6Rra{bk zxZZ(2DHZA2=uU-(Y;>n1d>h@V2yLS~73SOMP6czTbSblFYbspZ=uU;nl#fdn+^jn` z73JCJPKRQ~tc_qJNM9<_x6$q8uGeat&9j(#X4()bDh%@3Un+%OGWE*9$C-OY1K^>T zOb6gXFPRR&VSbL6Z~e8lA5Ty){*v3r`S}|2>#v_aeL+VjuRHSS-jbL4lIZ}6QeHCM zJJyqAFLDoj$<&)!1lN_qvx}^}OCovuV0JNz(}v4LaFy82X~Pxbi6jnXuW_|B30K9< zxb7zyBNj|n=G_vR4K6qq!*@ajKE?b1a1eex5xhWZao$fO6EPGfHgnc>x40FCQeM!_ zyD!52(agvmh;Xwek(4`3c@K#%BXJjlJtFdDY5ATM`EqqKo{6v-Cv`G@C!T^NbvQR5stKz66Y`%-iZ7a`$Z**_v!hQ1fQ2o%RZI2Co&x=*dIyc(2~od z-X8$HCGXYy&^0>g+j63u0eGdFevNJ*JgvG10sL!p1H=jh2 z(Z<^BTDp}s)}}q28FMTT8Ed1VwPE8pN69gh8a1q#Gzb`a$aL65nFA z-vnVU6Z0Aza-?giY@G_6L6>u)k^@zv{0h=2Jp=7k`ISt1B*(iNn7@>MUJWFhh`R`r z-H6Ls#zd)#_Eu{nIE`*`kZQaVc+UoLDFz(#dh&4Y;4HZfKmQin? zW#vymjc4Vv&z5l$?PFe zqnd-B+0r@VW9l05Fhgwx4xNOEJ9~B-iRrqzOBzW-neEPs>PFrNFKfUkcZ(=cb{mYw?-@9yni#%@-*zU#ejAS)7J3!>kdyLY<-}orxutbP)N|ev70RK@+H= zZZ#g8s8lEUo~GK0%B9t{5b)&D9zj!WFnB5-x~5(o?0fbtDVePreD5mQU?@{9zJIQ2 z_1*K-y1?B$s~Hci*OcM#L9O?}E6UcW4QiBs9h3!@e~>#7<>g-orAuE2rOUexI{5@t z#r%VZf^-Vo$2d5O`9bApeb3f<_a*s_rvfPLXr;8Hyk{_SNZ-LnP0&&fx8FSbIA|dF$YN<@?~9f$tiffv&4$BeG7KQv^Xy^}a)nIaf%Y3X^DRiqtG0UYOE=Lz zy9Q*1{_2K(kFvilRDf>0&&!BuEX>4|zJL$F+$(YWyvjKa3Ir3h5ery#gdt`)>>|u4m zLn(zSFS zz)D}tg)$l^TZ(iHi#=d5UBE2GPsIHWT3W=N=25khiXQ;E5`}pUcqXv2d*Gwt7LKgq z#cZv`oRJlOm!osUJ;_6}Zimp11MAUT?$NMoygC3!a+zb(l*F?z3BknsM zB`ds$>P40WK;&h8*BI#lBkl|j!zvzNWMT!DRUVp^UZXkP1!j|nVO7@{b~{>r!~7c_ z4J*E;k!&*P?*lr4HB?dso)5zvaoLYgV6F4|@R#8h=~?HbP>VSsD&`2`3HqK#Q$!j@ zP)rxtZHH75Hy0j`1GJz`z2)ZC?smUFy~;V}{23S-aQN=@(53PYMq77!*{!-crlqp4 z)e{=0?_v<;=HQ}E2#32C{R~`?qs_G*`(tR4$3*6?y5X?NzMri;I7YOU*()g_?kTSPR>bd;cm%e z=j5EsST^TPqx+Ozz`OIV#(3v^gYK<)4`NHz`6k_`oIh^amjU_@Kdxr|5{(@sOyv~_NRN`$kE5xL4!9H6)Z z&kmit-ht4g`OX*)|KxPnoXlG(z-mmBF*^>^)i+>i0i7)zHhW;6TAJXA6rcppNCEl5 zGt)$rR{*um5Ox91gKKB`5>jVCpQKmU)?>cz2^qjKizmVpH9+_$&#F+DoE#0xFj(j~ zk1pI7J;br>A|7MDVR1!*Vvlnniz4TWYW;i7Uv#6o6+q&Qr_5f5bHHHP;rM zr&|ehRPH>C7$or2hpAyloc7E2WT^3h<1s!Idisq^%&BbnG~M|vcX)?Qa$flgv^luX zgUa>lIUFZ)(9Nz>&TB-tc~@j1mtJS*EPZFFpL>JqGRZuiaXEj;n9X!xpBgDy&sF5c z{!UCFyI@U)^JeFd6uuCREegVD33_&13_$oouYWfa2r0VysPo)gpum zDwA^l{3+ehX%H>kCpd30drP9z2F`t*JsjbyqAK@1kTAHE%2*_p^?j%xkvU?49#O6{ z%vxA#cCDOzvs=!QPS2&3Qy?%`O-;+H&|FKMVLKzOTfio1^2LuyIit*a-v{}eM@tZQ zA8xYC{yc^gn!R(zSPy^~uA$_9fi%!<(jogDPX_*>o=o0|qo<(t&Lpd0KS;wRNh_W& z;GHXHvNZ|Q1eN%Lg)~L>21=4_wz!A55%;Q`sTQjd&e3!y3_+#|1czvVv~7hIe^xEs z;-*`iaaF0QW;pNY>N={w8|y4*mUSuPmPL}YuSE@6wGW=-foxsf%9(9Z6*gi`m-#}e zB@+hhnQ*Gxk3{Mxi=o z*82z>aX-R$%HwFK@i`cI{(^Xme}cuFG9jybS9fihQwqHRu@ZrR6;?4QF|);Y3fs(L z2IOkDxB@;eU}IZfe|JUuvbH`mP8{1?#(0-mZ4&$_2B$*pnGAjzqAb3dJgB%_EQ;7h z0>h{hr^ywv0->2fa;ma!5l(lI69svKoXAqb7Y{?TPm?Ch#5?36t7_|?!b;6Gtj5Ek zS&@qtk3tncFpw#d=m} zP&gm*kX!M|tc>?iJo#MgxkBv9c@^7aX`{72f=1jW_zI_kJx*Q#WZ4QFlD2MYlRR2w z9W4QR8GyBS2LnuI`;#U>ef?s7yzupS)+EeewRN*FxZPv$yRTu8%B8EfPaE0{^IBv5 zQ+TNbMwl^h=yDM`cv+yBHw081`;WDC6_v_4T-0Idr@c(iA8{EpUhjjCunr)gp%Th@ zwK9iNPO}cG_1=I{PK(t9su^R^BxFz7*=aQ|#PqASOV|7IuFg*BS^-OkSO&5bZ4M7( zpr2^ddPSIxY1(CcL#efc1eo7o;%Hd3(x_)0_Df)vv_~|@45qfLud=hNf79mrt}W>H zqv_x!&|KWoz5yeD%%H0J*VUq-wryD11(DmjJGQB~K~;Cwv~6l#zYQdq7ms5aovW?m znJcDuUeS!o(TuAYkb%|mht`=$Jhl+)|M_fTMT@Kdjqnfy+0ycfib=a&C~Y zshk_z*U7zMpntR%w9bv@>I$itH(Ig%8F?1I68RK3biChTn+O`#P)^)@rMd9jE#dsy zdI-Tpr^)$^CF>ticXOT)kJf2&o)nMPX>y(tkJf2&o)(YRX>y(skJf2&o)wSQX>xum z9<9^lJSQF;*42NlV9xW_o02*vYJ4NciiGom)w0MF^+jQ!^^BaC#H00$oR`Ihht@N4 zelHlUXXLyh9<68Oyeb~8XXHT74>LHeXXLyt9#jCv>bzmS0|~UGDf*w`Yy{PJAsY5z zK0FE%&RfDxC7$5IeUEso^*NVFzJ9w=N}L5%!C)uwSMLtF5EhzOc%co0EaCmH_Z{u3jj3`nX&|uaffC1jeCYDXg4I zo0IHFvRwBa=%E6QMpFz+ZI=JAWMelT+QrmIy!nP#buT*vr^-GXeSU!fdTNDEwWN7? z5-W3D=&#$zv9KOD{ISG4NJJW$G<_mgFpYQ}rXQH)HapF+Y8=zytg!!uG`SJyV0+wR zrDituuA4Qh1cRQw5NnMU5RO~$rj-GW5zuUcRvOS~Rno~lohI!cjh+WLY0>b#g><8e zICb`N#E{jGU7mWO%X|_!h!@0C=$zFe2qZexewh;KOs(!k;@D$%ZYt|*?1x+OtFDJv zU(~s-HO9MnaNMv$^s}2Q*EFx% z*F3l#an{=7%1p8j(aCCs*g9GNDHo?j(mGV~?0*b|N&Pze8APhv<9dlzCB0_5L8m2& zjXmu~13h3#=kO_N8DfCPFJC4FQ9A+Vtxt@MpE_Bp5M&_JvE5w7o=tBD$ zIFepu*w7LQG^83$Xs0xxND>OX?ML??9a7?TF4nz7QrP1F2fJHB%<%xnk5Uz@>v=uN zFK%pf*&iW7Y_KtY*SXxTDrcX??(Yf-trFSvKuHuW*-C;h4u+hoBrY3=VH?`EVl)?T zM6@uRYqT7==dUBh=2TOCbA4I)a!z!vwf}*rJX|n%nv46+bvAVee2Kr7V0C*Z^0c{( zTdd434*l2LyCHqVeFR^bQoaO7@dkcm0FIkLrVLm1w08DlRm-3^+W(TER)q;V84ewk zIZ~Ww<0B*g-yvS{`8b|LBD4%kJNkP!dotWEGWaOkVFmlU>_fm0whlb@T^@U%3uZuN zy{Ja*u&BDhpYJp9z4lHCe7P6+PA{+|tN2?GFwDku$YmW^jdg+>7Le>)$ZEI!2Vu3x zWA(YuiYW|p3A%a)eApgY$pq|!uVgLF2nSiK1>vxjmQ!JloM>u$w7BMtNA1Y>H+HY^ z-RAM#>GNeC>$L}02Vq9c>-w&a_Vu!ud)B^FSls8ac+F?QQV*4y+*bCA2Kgbkt@OgLWq8>bNGT#&g_({VOZgtW z?~O5xx$&k*;7KTSeoZi?2;*hSdB^^t#B_@n(_@Uuujs{`diohAY`p6Ef&E7b`L-7_ zzAPoAD5%3{ONjeO3{%I*ET`%XE|RAqezuW+&DNw#V?Ffc&w&9FE2?$ z9OjKDrleMvF$-*j!}dR>c{zLGrL{PZ(5t+$&d?eRFg_Sor=d>}1}sGnf*~cKz;06e z(SEJK&=Q~;+Hls~8*CO}p%);LVDtzdb2{|=XB19*8|6AS{3!(Hj+&;j>u!()!R)Y*u3 zi&+?Lpg7AMIeJgxJzaXM#EUsv`}&?P?5&E|P1d${!grAPvQ#{UqqAH(f_Qx@w8q(i zXrOL|Z@i{`-E!`ea4Xs@li0P?I(G=oz4%I>{98DRX|pD@Q{e|*g=-;ZuvzK+MFRdE z-w9ta(DC>vo)`3EX4UR(IjUQoHO`beB$o&9dbq<(bgd)9axy4d=Md-n=&4;U%s5B( z=2yx&)Zt7l7xQv6Q^K0Y;S8%FDgB#sxKjaNVG_yPTibJva5!O_MEuv)e5cvryr_gU zp$^MwaX81BNAQ3;;IulN$1El?RP~*84yPei0uBZV<*au&x2VSy+sg>$Y;ZVDSd*02 zHn4d+Z4RdaEgJ84zi5S=lVQ!W(fJ1On>C(7C})$y@w_|fHv?z0!*O~mAiY{r<+M8- zd{0UKn?A!i(m4_|XOJeGyrZ0p0NyU(aPm4Fj-3}LgJ$L&?Qj&lN=K|yr<_h_5rEfY zmW~5xOzm;>T-MMC^Ack30PhWR3h!n(Tb#>SZRC!jvsG-WsHDDg$rJf)j^5`$h2GGQ z-WZ_c1QY|2R8!NGo#O?Jg$&}WXf9ic`}0ehR#rAbW5Zd7C`6ES#IJ#fxPoqKEL(;h z+mkh$#m*_tod-j(CT>PUbHjNCq$)9v`%>Q&kBuV6DRF}wEHByC*XAuiPc<^v$tm(c z{I^U3mg=MAfdr>%8N}#>^KFqM!)$WY;6<)-oW@~fLKCfpf&!|?=|Vrvkcd=E`uqCu z%2jJO&}RsGMi?!7FB*HMU`xVSn(D%)81`}y`YgfkYw$WvVeV%OzBC0NVtlW+v*3BiI?f=~?K5&ZtC_>?HN3&jB{mv!k8l&Tzq=1Ntmr%?n{k{!;@FK|ox?zZM@e+G)3p%mc@JVI^&zDY-6qM4cpy?~Pz)Pp@_sFD1`Fkn zh0+a!Nv**dNt0=9TZQ;1LYx(Xl2${rDeWE3HNLdUxzmWs?uX{NW_ch_RIHud!e1r;EEu?0_!AmOQi+lGVLs9qp}XBD)-J zPddpZ?R`tz+d44tU9JRLf%Q_gk0T^)EvUOC?rSWdF4wYRn(ddAN81(2)zn(HKGgP9QBA^$++ z9fGc%i5ImfY@rA+sY~#Ol2yZ!O&IQaE4Sj5{RU$gOCUH*5pPklrfU;l@RO=_qr-E= zNj{7fOT(rm>o;%f^$Bkh!jb?;N)0Sc_G8;as^C1`vadp!Nz2Aoc6ymQ_eo_iqfw}^ zfp{9>A};HSIT1pOt>7%G43D%!pR5n+LzqO}@BC8;)haWIO2VO+?myw!kQNwBXj6zG zA8<-R8gUokJE4-HPLB=@P~X$m-P(i0Ha0^B+wB}B!H&UKW^Jc2sO%Nc1%{k)g`?#} zX#krCogWLEyF50Jk`05VghhH+w08F6<~{YBdUPeD7!NsrlklH;;Rmnw#NbL-W{~Ne z%y1nr`MEF&%Zm75DG*adJ%9(K52umVvnV)LQJ7yiCnNTVdm6rSgnS8wVPcA3Kp&bS z2WB+jZH7atrU-{eoCk%&qvXKp>C5CGxysdhItSBnGww&z1d}=v!aue*yjPur=_XnI za&M%e=>%zhHGl>Q3ePD>^!NZGnLlHq*)N-lzjkg}!~D7fUrFu5a7b!H36&i7M^v)? zjq_&-_MR6kV=aPlq$|D)ji6XIIHd}WKOCFWxz5~YDswnxF`b$Gz74g&!mGy!a z;Y5lc+4h3)-cRCuQR3V$o1(p#NmW3``LYCAaHQu_b7Mn5P@9m%ybDhA*LNHx3DB_l z(DeeEx?Xd5Fk#gvs7baUc)$GM1Wj))FprlvBxvDw0qSa_7 zWsGx=CEpHRHgga2>PAPXY&wIoApryEvhZujdhXJN*3i~#aY@p4@{{s;?f+2r9dK1w z@Bg0<7ZjYh(o&Pu%F@a*7Y%XYM($1In$-mX1w=(aaiL^Oo7nhfMMbt84I7$mOieRQ z)5>gVwlpoZrD^5={fzUupAU%s{=8nm8PD^a_j%59=I4ysR6boFp~NJTP=3o~QZ##N zi`9j)(bbTlqXJ>v?%wEVx2n%#e}dSaRKE~#qzlB-hiSNJBGz@AxQQknmT-1`+E8@ezb#8?}Drw7s~Z~%V)PUD2w8bACKqj zqGb&W-0N7>9kNX0~I{6MC>PlxI z?O6@z5MWi?mH>N%1hai*uWvyWjsWI z2J&!3Z>$w@H?=dq5+Lq^M-wYQASkgTMMzj9tZmDuXs;m{C7jq;3USIi3EykVk;}^GPt{Mpxo@2Qk?DRX+P_!C*CEc zNNQ_2OLv2S7(^ENSXNytidYlO09MYn*{{?#uYR-w3;o#T2SL}H3-A>#z|W&>Ew~k2 zaDD#KheG<|$-tNseeskNz3giBBWtl9k*8`dVqqli>?}OWdJIu^pnomchV4&mjDOYu z1EoMdHoC_+HjkM)tE@JTtS2B#pxM#XNVl(LTfKSUBOLkgi;eksc-&{Wits?~YX^ZC z6F~=p9Ieex&qEg#&1okqW1N$A+*p%#G^hO*rA-H7z(Gqr(X~z5btLWl8q%(Xw4+a) zt$8sMJQ$Cq24sw~_JbMo5=x+lHmf zcv2#*ew22ZiYMcuAG`byg!X?4e^9h<(?7p80A1|_i~vmA;65#BALP+^g~~yN;vc&_ zI1b-Pc!(nuc3>de-@zCvWZOTGi&*1=)*xgEE#ow_<@}l2Z8?j19lb!o6T5p--v4Co{$FYPEE z%O;ddy+G%znI4vHGA$IyG*2C)>eJK_na-h(JgPn&T(pDM02;fWB*T>rX(*Gd;xQsq z@f#psGAtAe093SE*-*49*_GIhPIljG7@pFtX~^@2L6WrFM%VG-pyiq>)2W z8?77h5!QYLA@)(xcG$!oM`-`+@CT-vP5=CE@$xiZTM@qj(IQ>~tbW8CS54%8g!X@v zWChslb%a@M!j{WoJ1c(&M_1Ewjjn{^n4_y)9)WhLV@y)w^Wc}pEssZ~eS#`dT4294 zYgmh+I;dc%%$#n_eTAewnNg)xLv`+WgGwl#CKOy7Co`&V98?nDye{JDvPzYh48Nc( z6qNH$in6ag3T-efzyj- zoGNQP2N_DG@?GH+W4}D3Frm1-9+Kvoe6SJKtRHnIf#Vfdk4``M%22#L3E4}jf7ti9d{x6M-W}1 z;?>AJh)&krwQNl7Q9?CPb0-)z3B~S zp; z<5|wftK{c=NPLsVC@)?dT;l4zmU8dK_(>q%@H6;VdGO;gL@Jfbxl{}dXJWEuqAwnx zj=(otS;?VMqxSZ)!^|_rX~+YR-I~JQ2+5RPeyqThjZhQ-vy@Fk9)LXF#NSj-$8O!)n=0>(WTnw_w?vWV+$bZdRA3B)$dD%^A$=rDyPZ zX?`;lGZr$MGt~RxVQXz$WAfF97vUr143wnYcpeVZw6aei_LMMbsInDcr$s;qL5e_@#s0%H3H7{L+ej%tOL@%}q_()+ju- z-Ok;cj5j~wl(`c0Lt$iN2{xEjs(GEY6A0E^Yb%O!UtM!!a2Uj;x_3DP6`D|3 zb(5wT)d@wj7DjdNvg(rH7u8j=>XySVs$0#fYjvhk-Fq(8t#PStZCG`4kXVebvs-nq zDWXH9y7wFP1_i5b66Cs6N71ahdlAm6`v4B8uJcnTQ=LiTWU3<&th%%D@D<#y;iY?$ zzl&k#tN4wMt*x4B6ebkso@H9;T|BP5f&4t_-_?kk+DiCEVc)XC2DUT`+v8H$cP@o} zA6D1~Bo^a~bt`PPB8qDYh5gv502HjS2O-y`Fp6e{y@7C6*kL%(O8w(f*ppxm+nY&- zm1aGx!;L=iPm6}p;$dAP$mpkxi{A(#n7-6AR5*Da`Jx-7sVy;K_Z0$_uam zlwy1$)mJEnwK6t%Ach8hx00U+eg|S`;P)>4Tos8C{n3Xy=oq7tWzgYme3gdtmSFOx z2H?gmLweKX;B)If2Ay9G^tsavXrVajfZoTTFKw+Li7>{u)quRWW{`%4L6(IDuB&1Cj=^uO2L6`mM!!Pwl>`1e2H)&#)$ao!jPaEk@W0gz-q0}kxJT5$ zr7I#S48ENeMM<9wytgyj&A_c^q;`a@`RW-4xKJbksAzpR1Ha7xPXb|#FU^6f(^;C@yOQUGsG23tku;4?njQZ!qFR8?~jF zTQg!q!-!+cJw`%O7;y_Lijwvqc6S~-7;jlMyt%UsUZHr(!MlU;eocPvJa)uT=W#}y z;-3LVG$IE7%QfRSG>kv!#ZOWg{~1;kLGj=}$=b>%oQ=wA*|@aCWJ4&11E$U*IUDoH zFSAINu-asU7-M|PO*Zz_oDD<6*{E=`!Gj$S?3(AmA9LD=s-ZvOpcjf`4*HK7eV20# zdWp{?Kd)bj|7rNys2a|u+?1N!G=A1S6!COFhK6%<$jJ>inljBxHHE$da#5&IJmVl;$4GY>q#uD0qo)tFO?w4bG@;_R#r~v5=SfY6FcZ7dN9!W5RE?cx0lC%crB2*5& zhUD!H34apdp<0Wjwnj{`UcQkh>)~WDCic~_aBT+`;reTKk$0Nq`=3(2UBU!990&08 zf&edkj6z5xX6Bvk&Q>UQiIYfkWCSzh|63yODPMnKiYTOEx&tZM3n}e;rKUwiFXhc% zN*U^uLMWHm2`k+c7A!w}!*8f4oAy-D7RaeGJ9+I1j5%**WOP%twV8JxaLz zJ>2t*(gX9Ajf$@!0CSpF(h`?6D!v*eeQYGjUf}Qt2fhJbwyE62dReX_)0~nz?{-sC zLecg@Qx$KjM_=G)lb@^NP4%cMeht5@VBNwc^;kz!QnyM;@prJ>T%|LQOGm2Wd`7_~ z(+vruDsGnMldEFP3);qu8CmvS^@h%`UKOj7aaH^TIJhbvfdfS`L1j@@ya__8*}o=S zr7Aw=Vp}h4?xx?sWiEGBjF@eqMs`5AWclAw8DBELA5m6dpN3Hp|7PS`Nii>mt?iTu ze{_nN$62I2uAz;sC@MjxhSod*>ddN-)dY7N6_?+3hcN)5xTcdafX-|H^U2TCH;La* zex3k{f7nIFATDErcoBZ7x?NlbaXA}=?1bsc2Jr*v*boRnj4w^gBk-n6C08Pf)WYK! z{SImfrQj;G_YHiYY^308gbgEsqpS0N!lARJlTW5{BMPu(&D=>Qp{gyS(3{`dOCBGY?YZjKT zmhGDiX?zp_9(o-r9%l$^+oS?$+ZWB7Bg4BJap0M5dUdwcwT~{-v=2Ka-WT7S$ME5T z_R(~d=qKbSo7C~7l74DP&x=k;M);u1Y%8;BWa4#*368~|Wr)ssNqI-2mCE_X?TLLw zRKqcy+@65jGtT8f`d9R$^1Z-kKLxaMwCDmKb-1z>qN8t78r;0Qq?3<2-fld(zQ}ie zTe$g?_{DqxijIU_!Z$|nE>RLkqGh{*YgcGiwI@dG3!=*u6ej2VW0$WfgW2#mxC{6+ z%N}H2Aw?4;?wBi-t&BS6j?t~}(T@4zE|4>V^uJXpDv6?V^rMiPl8kUaC{igf@jCc| z+4yrif`UbGY=9%Nl!EWXpGKG4R__1ci1D@1sRgHPB*!+Rw0#emv zV^DH)mu(uU@iSa04;C(W%8Oh=OHU&-(Fh&&vP&pnxCBB6Z>SFL1 zV<(0Pez_Zl#XQvgfvd%F_^Ac`F`9US-QgRHTi7ub|0$YInSPBB8Ak7Atz6IpZ7ged zU$nE6gEcSy0>pElOL(zC$6W*FuMk^Kpc-&I`jLCJ_WcANYXnu`ZYzbNlqj0SY<>U~ zdlBBcr){Nt1;=7?Y=xsvJnAEn1^<9A0lr)d`o)KGlVTHi*QmVRByVT*1d`VS;fq0^ z(g}{%SHKYm$9OnWi7eO;z9-;IOok(P9sYa`Uoabv3t)h`)8N2IWlbjVmnK1#>!JIq zRW3uvm8(+g0nMzUiuYRg)51*$-ha~NHOcwwB0_etN6bQ94N`nyoW@f!dumR`3QSVM zC1`<;sW4h6n4#g1LO_fArGX*wGI;#nC4RKTx|@g^a{(fggJUXUrV8i2)Rlv_t0ae% zgO^=N(72WszC39hHZ4YAsIt+hYom%Lh0Jt`^PyZNC)Fj*e?rD@q;u9}g^RH#GkRJ> z4~&V*Y$dI6aaCzQJscej2Ot)?OyeWEi$9*7OFH#>MbLXL72v231U8R1X_XlE{%qIswF&$MvH#z^5zd= z=)t3$S0iY69D+=l&j`mmT&m{L!Cfxji;1$o+hQVa7uB+oHWkGOywzSVp7{Y7(2T-ql!174W^?`6I!5K z=1;7qTdsMUdr0=|n%syLzzmK%W^jo2?B0u_5Hk>tvw9gb5dU=eso;N;Q)&sO;D6^G zzBzAb0#qdaAJy{>(xB{#?r6Ct$W81hS^^l=>P^vbJGS=#tw@6a|AIKP^+PNS>0vfG zd*Z_wBe7*Y%$C(N3rEi%j*z446N|26>8_0Mq_4(38FP4|7pLeS!LWmV?D83pnyH{r^ni|Jj6a7ri>-lQ1}8W2X0e-l zL!(?7=JMXB8~PZX-o#TysZ2LFlFGDd&JYwb9&NF2X+$YK3+lnV3~?*tiRue!`Dg}k zNdgCqp#T(^_@0B0Yg!q2V|*26(-fJ(Sj|f3GmwpY8}%s1xT6Ks65S8Oje2l&f+Lk; zgYDoehA-F|j`zvY2aZPl;TQ@>S8|MmV-y^@X>edrrAY;%-wt=Fkw~LT$7JZZZth;B zEo{&at9O;dXi)YI4jeHNH33vNv(tP^psey?}r0 z@*$6zE@zXR4}f*_=3}kGu@ZjiMn01B0x;VxEGr_>wvy_-BMRIFXwZT*6!KBg?ukOI zRcO^YapEi*Gsy^#|KbxPLVEb>?8VxSgF1ZfmK%zKoP3>$7NakI!V zw>B+u^aP$Ul52Bpb#85Hh!!HE_nnPVf#%kxHz4Z_03l!HFt_%H5SIi0z!vp5{$6M} zVnLkb_+~vJ!Mg%N+4N-*cy6hkca>$W0MlUpsCz35`5gYF90j@G(MFJrq7aFAa_M>W z%ahqhII|Thr-zf-15Rci;mjUKa+0S9PgR^`FXmtTg)H`6vAbwz?6mp`)5Hr!Hd2!&{;ybCReF{DJm35) zmS*!!2Ad}TNNm4zEbArsrO7|a-|bosfyQ`#`*-Z3G>hBoW1RNOh#8VG36H^qpYgJf zv(V5`ZORD^M(10k0pn$x)(SbFn)1J6lR?4Xa=r(Tm6NHl)JX>(QV-eDOwhrIqNiB( zPT=P(D^Tf*y-#9!@0eE73XRkX$s-&;*i5bDW|XjVGa6|{QC0_J7p0HE<8p;K;~vL%bmXrVmE0Tw zH2AU06Q71{^A?dfzOLgzKpc|I`$5_=ORHoJxD5LYIOGlr$;pJa+OdB%`O%)VXWu=3 z_%Ikhmxn~(kgsrtWuM2=+XvLFMj}~EaLrh}*?WSE=2=fY$vVNdF5PlspdmP=TCgx1uxK8nrU^ESQm`Idm2r%mC?$~ zCDasG2Y#&xPxusmY2Y6tDxX`=%Pm_B#=$}K~7 zEqG)^Kjj)`&K(l5$I+5v}4Gt!GwnX>uC zSW#qFyfZ;|N*$BCGS*67-iR{R_tR3-)(OP}un(Cx9&14J#<*+9nCKp!e;UwSZW;X2 zy8hdMKSlHE`F{=QlMA-GWQNk6i~cOzYDgE-qB74Oj_QrAGPu$#lu0k`+IB;_@(i=b z*~2sFMU@;pikX8uQtgO_bgQUu!J*kh}Y@E_#Yx1e(NaJgF|rr|FT=3B6J_7HmJlol-OG~Ck8vOWS2 zkDu!=quS9!KcM@+R=w?fhKkA`nJ~D08&rHb-$etEI5=T2QT0l(@CO&|eDc>`C))ml zxy-(#;))2%-%Fz!JS#PTKlO1Vl%+9bZbKy2ZL$Uun{58mE^|W*<}Xm@v2L-x;)O_Y zzDCXDD8H|GcZ3yq(UsWC%EJqA`qj~s+UJ^@71-or+jly)g$`ST_roafw=U=49&9vSYMvV>oqpc{4bG9`|)BP5Isjk!{F^S?IyZq|sOw%nC zH>R4V`z`(={u=z!biY%Fn(j_P({#VfU&ZCaXC;3vmyh%B@fY$jprb~04X3*hK5h~z zIXqsc^L+pKjZ!WL0RI2nBnF;QE-DQl1aiM;C4Hm8WLl(88djOzV z^-C-`6su$Gz)qFf6M(LGo;4*KLSlSNP37_*RH7S%AUuR1D;`C&#ZdGnQ3b~JGu>ja zTxa>aYve=j7_I@-e_f@q&pWY}|5^=O?FyTxVV`OkBBHthEZXTwOO*z7v&PDryeS(Va(wEVjJkF(PT+CNwm9>GU{bx zsx*2`yUL_MR;NbAhwr*$DgP$L zQVU|KhVzg=#&?B7uvZDr_Yw>>1ZkUV02|lbvJNQNT@3a=0{ej?nk@2M%JqM%QTKY2 zy51z^ulKR&+-?ZceyIU$8o)mEl4y1}gDo8mu*Ve9*@*I5g1_-c zf~A*48O1$elJXB#ENNbXRSrS665Qw|*lGyU>VI-_GpGRA#Fqu^w+uGoI)Lq{h(4?i zwy#DV@Fum_B;~(TvDAlHml^mL8=GCM1Q&Y=+8Bbgi)sM78(@D|uzMKn%>?#3MKn$1 zxy_(RqaN}mb%jaFze%yY;U(}p1bda>OD{pTAxIlm1K2ox+NpR&H2WQct#v)X-ld4n zMN}0tcv_oS8~4nejOboCPaVhGaissU^Tz#dbuKQP!jHvsHG zMKnj`xy_*V7ExSu+$DgT{{Wwn=}$r8tAm0*vTppzj;d%gy+y8-su6{6W68SI?| zHckru2 zUL~6SnZe#qV7Dlu-PIHPNuz9Vxk@?S$n;;Nh*}AOyHr{!maDwH!wqlRrPaY^nMi9w z+*$a(`MQAJ&tT6;2iU(A(OuOOY^1}G7rY71G&22pTFP6z1a~+D^OWF_m!RAbq)j-v z8KkBGEDaJ5FwkWL^g>0`4SA?y0(~?pRiZGA#K=0v_q<8Qf0rgxP@VTVjk?dv`>x?l z+Yp9m1aC8u@)d`#c9PNYc%COFXhFOkX-3B*-ZP_Pp}1&_86A)3`RG{qDZdly(4cr7 z`S5&d&eW_B=2wt!*%Rx~cE2|=WIj5H(>X5_XX^NEHhr|pvh(YV9ZD0aiaA5_Px5M; zWlyg2AP8;&XPCg@E~rBC6_(lTO{o*SfDq$**U*SH z8@*{AFa)8FJEX#+wm+#fh0(AkF8ZK7#0vEcQ>-%-bmUVhx?7<)B zHgB_1e1*GRBz>&V_Ap5wL$cRJ(%TAs8z#vzB!^ri{jJc!Fv&baa@0jK&dE7T}V@{u8#=OXEAh1!Nm4jYm(7fGTO>Jlbt`i^FLp^K!473voz>263W zTqJ{FPhpa44as5`$(7iJrzBK8%Y>%J`tsNFW;pkba=j!RvbY!HyW}}Tutf>Bc?l96 zg565+yO$ub5=!b@<%A;?yO<6eShj;g0CL90rS9?o|NZdZbG|(fwhxWObDf^#*>HOMs>KFAa-|oCZk7gvHD;o-5t{V7i!IC|A4)wCEn|4H zD$HL$tDW6_l{a2kUy8y9Sn^|+H(p~#D?%|20|MFf@hWfnsDNMg^{wPh9y{TeO&zcC zrVd$6U*)>5`E@>w-Fz(g_>ArwobpQeC(?o3XoXOQVW0h4EN|dwFwO=ZXZ>F{Csw(- zXb2x^Ojh=bv8GHvcKLtnOb&$NQV5eA4B^wqufQ)k7{;fMhh$?s#GiJP_z2?>_$5cf z>n%z%2cwc*#~J;u#aKokw2m!@hY zH?}uUG)+^g?4aXjE6BU+nolxCI?8n`#lTdq=M0hIxEGiZ~OOv+(o3 z*yo8ip<<~Gdx9dkO%wmm@JpL^17~M&D>6E9cbRN9nS^5H=-EHB$!^k^au#Cw+aBc? z+p*PdxW(JAO6iP-%1(`K`hm81hrna;y#P1v7Hh%mRH{IBY(7y@tJkDJTfJ`NpjK}* z9GO*FxCOisG28;Kf&=>lb5t&W_uQu*GQE|M4oiqEuCQI^V^CLV5Sx7)Zccs|Mt6JV z;qo+yWbl4vrUtRqMoyI)75XShA1=eK;wwr>n<{z3bDqd{YYKJ!Jf<0l73ni{bkR4u>TFn)!2pcE{DDx}K806{UC|~gb$Q`Fq)WmKy za;?BTS8_glXFiQGhiQsdpiCL5k!>Z6zT!jpM!i%cxU4=@4{0rdse<-p*qisAWRhrd zR;Y)x5!k05D%=M}Y>nBss%F3T_agRXNr{idY4*Em6v^E$a!+M6*(RS!IWET2D95$G zl+M67VhdIJ~9oAP&6$>1H;Fmw(|83fg;l{Y~!)d%~MPxvfVY_ z`Gm(i(ujQOjA7(DhtGKY^9K0n_{k2&L7UIS<(sNCpMc;#Cmrhqy8a+aorEH+vzaY~ z73;^^ixrrrv2*~et;SM+QmWx(9`PDZ)#whFv|v?f{=YRgPh%*BD}D@Dh(!|awg`ih z>-r<6*!+W(Yo$xl2o0kuu-Qnm0&`pmL?Z7fWzTL7PYTPO6dq8v7Rmyw{ueZ?Q#dTJ z-j!-!38&pWzqwMKak^Avm+SN>Q2di{X)aKV7 zDphQSB|mogq%Foug<=@2My%9sOq(xngXK1Em7%iz!nORa%VR;zl?worc3b zcfo;o7xZlAgnV>XbqwVZ5TsH_B9T`iok*|3PS<3J$bKj~oNjXpEVlg4aUK| zBN`zEY&II1T(a^1;GAjgw;ajD?h}39Do8Qgn))$-twz*MfReHqj*kh`S8ycm#h>6G z_|s)3bod_}xD9cOSY7566@?)z|FDpeAY>u4;HX9tmYPUXt4K_`M|s8XC@lpRd9C ziywFh!k^63>?4fZx8R@I(r_QGYes)O6eIYsXdQ}W&`kU*%_Hg(|JaA?KDiC0OV?vP z3%OQc;?Gk2WD1ptB8!rHsk-3aJdGsv|0R*`A}~pD5tzHPtiZdR?F-^CWuPxI&}nqaf(V zE?@R33g>P_ZA9UuJPJprQdGUgaOA##mtVLO#?%N= zyI?HA)^Hr03#+*R4qSP%J0;ZHCbf12N7TioW&Rk7NvTXy&8`v7VrwRu+B zBN|HuFUPtICHWClI!|b90&v?iq6dGD%;X_F9>P;8FgOjqo8SxH49BN%B$mOESdKrz z#rSj7!1$~xjKR@oL7cz{tkc*TXd^E}Fu|Dxcn41oFM}Ee>!28Nve8#T^gjgfEyT6F z6*{X*5Zr*6OvD5~fny~ciM!!QJb*vJqxiEEL9DY#6|J)jtQSPDcfk73(b#VlsH3-} zei}pBkStIma47&Lm1vZ7-DV_WY^CZ*l*TnO!=f8s3KHZ~`0;!V#Pf z$6s(H-UP>l{8m^oBSMP5XdVcOBLj|9ib^DErW|$lAyJ_Bz&;3z~QR^7}eY_@jZVqB`DySq_2uD73 z1_PXj+UeYp`xxnq@_71hl97f^^1mT@xy%*6UVz=C%(eUV3x`=wdJPwaxcnFKvc!!!-ob73d@0nSE-7x4Tzv82t^3=V= z)0)HAOc`I8l`l7pe-kkeOz}mNaP`G5=7@*2N}T%HOn37U2!TNyyp{{KQIeC*(FXSo zgS^ehchI*91YPJZK;J>ST<|JfE_jH}0A7W=1rK9SJG9=O1_&QUlE;4S8@-GW0d%Uq z>wS$mlHKPwf_qaW&0o8ArSMIWq(Hj7P@cEn6iMr;-T3Clk0R;hguF|=g~Q`C)*=wKEg_(T-l#6O!m|3 z*`G$f3Phyo&mtGX#a2L>qD;y|(cK>*E6bAn-oDG^H;V=J%to2YO=?6#S&*z|aaJWe z<0Ly+Zr119HGl_D*$hxJk;9pwK~pX#N4Unb{^Bz-LwMRgRG2-f0Oy=1ME1Oz)FFYm zA7BbyEk7~xQw^2#my;st>H*FY;ii1ZWi#EMtBWipN|yd|vXsbK>c%=8DEegGid*zK zNc4%v(k*+ifXolOIV}=M3CLS#-JhWrV|5gp%ZS}jA7^`Y6qO6#V~I#Mm)%r$??sV` zP{!9XizsGY6qPPZClMr4-V5mdDUB-c5b1jy>36uK-{F#eCrg(S61P;iJ6V7{bt`T{ zaCa1$gdn(w5p?5kQDsccXedd7Ab0xFgq!cyqq`}zcIDwpKFi+CEX%b;o!=H5__51V zBg}re-3)m(8u&4x%$&juu;a+;?x+N;5q((3pD|3}o~T3we!2j&;~k{4@1pJpgro2$ zbK~}XlpK9MG&%WtvfUq|{zE*jpD!59Pr&~eMQ_ZP-pd!)XNIIH`zdNB+AR}%AHs1A zmn0)szp-L7p+?ToB3Z{#5oo4a}^N(&_(dGX&zzY zx$G$bfjk^3){6*^a`>~)fNmtr-u^p^+LUt_o3BR4qU5Vl#pGn1SGR2Ae`+#bt1KuA zO+Bo`#&Lly zFQCi1q!9m&dH|)m5!6GV_y3}2_K4cdTtgw-kO{{nH^gv2TR}xy@*loZEyq^;7|AE z@I3-Y?$h`a<4Z7js0&_nOz_0D2A(-l5B~r>7a;s0Fr}OY$96bUDK^*@zL=LV>gojt zPVG$&4u|6!gak*!@g6zG!_oF-EQa(uE^_I+)#2}DEXF%@>5J7EjogpHQ!}J!25NNe zA&tr~m z5tg)DqjfYVOjw@iq1xG|i4Z)w^I{Z@EaeL{{&k>Z#rWSDCwn82+&#)ivzmq|Vr0<0 zB4$c}r#D}&a6Y^7J>r4h3WnD|PQ(1KGUL;mEn;~6!*E$iuV}E$uWCl|gAs&PXd33M zS3Avb4ZDb~edZz9Mg4Cqs{nckx6R(3KF&lq^MfmgWN?1`T9ACZ$t1YA8$MNU9RS>cS4qWPQ z%$Ft+10p2X`DX*>Pmxdl1ei2&xEb_3mDmDDD#a$!G=irPQLiHjnnI8xk){xdG<`@) zR#`Mjk|8}6_7v)iM%=RtD~vIc)^bW~U{q)?(yBoCRS=U(fr-z-m$(Xlf@|@o5aGF7 z;qWa$1^tR0TPNr4g#)W0x*8sMRHZ%$%e)XGk!Fmq>zis5xG1i86TeVWygSlL+Ni`@ zn(|dccfc8mY*axNK-k~<2HLDA0(TSkHc^l72lfL9UjmFNJK;D=j?Hikcmug1vfxqp z%HYe5)I0>6!4dH$ly(jr!He)G6TV<~ICjF3+Zzr{5+?^o!qN6EMCHM;8IIgpaA4J0 z%Pw$2@lf+nXCLRA+^E8;i{bUlT8Qk(J z-~w?C1svr$@@Huj@Ufq+La_YvG;*j!a695bPWuE$fs~=cL$|ZA&x`$il|vw>8CeQa zcEcDAT7hj!ORZj+(DG%hw=@=@oPPz1{J)^Voc~jb=EBK;-CH<;uU!1+!vImooWk`& zWB$%n`I|Noft3C@;deKxCST0l;*D_PQ6(0=R~oon`RR6^8=dsgJ0xXj%zngBfy}7~ zTLCu2p;x&<+l3`4x7UOZ70=3m9Vn9Q>pyWo3GZ#t{h_fpG$P~L3i28mo*RKGfh_&c-B?HdwJMS zV#J?o4Yva8U2IcN$5!F6^==wg%U!}oYMG$Hq?XMdX(z!RbTu<-KR-1Ki~Zgan-qJ7 z1d~`AT=0Gb?YTYb_)iOvdhU@}EgSf!4$#}6=k8mp)nWA94e3>M7t_FJ6zx2s zv5~edSO%|uLLl6uOoUOdh63hMb{{Kn#0p#RGeSlcBhEFG_)&sk^6s)VI^(iE^s={X z13g?5lz+owjo!&*uKN9CCgTws=N1bS3E0~4k~NMHenNYp29wzPPcL?_+Y(9a2p9k6 z)AOe(EGsa)c36Aghw)6)V8YWL23);nc(UoK8Nict*wqP~hPTpSfkJ4Gl&15^tyF!M z)mlx}hvrD5-$Nat&n-{GkxH@QIntL1;yDsITyvyxDof@_bTAG-8NIOnxb(JZohTZPdE!5(50#D{AFY5(HubfylTE^V2_du(LvlEc>HcFB8=Z zh${nCW>td3*AWwZ4}ab#A=ZfAV=&#-5>1XnIy-80{0kDsBK&8Nq>P3mbuBeLhz(AL zZvlLP`;})ia?=D1)Xs4YtY7@9@BT=+m9$HHE9r6VMVtkR4LlYdaeNmZ9@3Fh86|v9 z?Z=NG;r6>RWk(7rE#T<54vuf?G zI<6wma|{uBHaAOJffUya^f$?Ydw6AJauX1I%hd!(6NC*hv_6vW8X#N({Ln*o35d3`cZG2A%hV^%Ie-5Rum=+7}lfdXN~3TQ$b`+fwSvMsgU|!6{&9B zdqlc)Z#oez!LF`h(y`M>>G1YR?0}{nfpV9W1n9Ji9sD1$99JpSOWvSTFk-}Rqd1?H zbj2x4-IK(ssv5M=X&32A*vldrBR4B>yM|GUTQod6fqK#&mVcLypMK>C=Tvnmb+71| zV*ipRko154v6Gc*nT|cURI^_ZLZG;$$KA_CoOVRd=08;-t z4JNEFo*rv(Mc8(Agg;IDKw1x2ugIufddanJTkD@{#_TE87AvcX9j6^A?KFrJc1^HY zV<^D{Cx%B}+#tTB@sy>K(>#>YZstzyud4&kp6`c^fW9d{xU&NA8*`k|Aa` zK!3Ti?sr(Nz-A32{j~qjTT=jmb|kth|8h+RH_qx})3;E{mCVS4FaISz0WwX5dDJn~ zQ$to&t04oFmukp8!cR4%Sc3`U$5k*&x8uRM*HxR@A>v@>Ki_T{TOK#0(lK^AC%Jnl)<% zKLIoBA+D{b;VLuZtiZE6!l3KXe>P~jJ6fSJ)Tr1t<%3VKee7ar$-%U9ntHbHHD*6V zT_G{DbRzLN$6TC&Wc{c>Xm2-SPN8L&0jZXXToTq)k#Lggx!Wn=n8spTl(AjHNC){i zcY`&KV4V|j+QLiltl*IrlHNJx5XMt0Vx8rqSlWI?AH8{dQ!gtv4WGB^TQ>X8$9=rC zhbiijYq1}1e#o*C&X6p8ia`(k*yUIFFmQbuQF}2sO?e59b2ehk`ZgTF5AbIRe8KH- z`~gSq*KpwE&4kY9SXLZ3`x9p*UORf6S+DsJgI|hc{zT$WB;G{g8`Z42BtH6SZY`Wc zEPenbGw!$vpkI|%Xiu^zn3k#U=&aLeXgiqHxi-Qa9&xz5jnHqysCb4IJ;fl2)ezRWylsZqUAE_fHJwJIg}Pn zyDcN5OU`iTQ1;Mywt1FH4qt!($ziGF(5i;(@F7MwMV^-b^ zBNUIr8syB(j}7U}jJ*jT{P=A9-iG~PBzc>mDSk0zU&BRd*k{DI?ElQ~D9fIs{rtYN zoU1v|koHSOY_YMCLmrR%r6HY}S&9%j@%$^_mjBXLYz*NG84flyXJX{c%pt~&54E!g zU)&gQ#BY6Uwy7L$_#yH^H|W!TpWm3e17i6^4P_25N$9kV4>w<-8c0K4?0pRnN1+1I z&hp;dY|JRqz8Yf zeb0qus>l-!$(X{Up|UWR4m27L{H@IUk&*uiv$>a^bz!#@UC?y%1qDkw3bc}N;`^v7 zAEu8dG@cX`31g}#sV25k&DzpnWL;E^ zlz9C48rB|mT#t~Rdl2G><4YlI4*``4>{VwG5UKrn#1u49H}HUm;>L)A5e#; zz>)kT>d=jFQ1!~a9}e6xV=B`;SE)Q)r&>M?U6snT&Be9jG+fmx(<+y?Thu*ulJ1&P ztAyVZx}kk+^$WoS4-`p%(uAO#j^Jeg2CH1&=dNlo>r-(6Fs zC9ncR)C8$|#2bFx<>RuzrZE!ozqA=WTYkSb8$J@ zlIrP6-&H%%1>SwVWgXI{Iu7GdyK!u6BlJA4Aw1<*{CNo0oU#XwoS)$M433R^;rIZK z)O~O)gJUi^9)~0TXVeH1lY0z4?5Hfr!AVV{Y(Tfm$$ z365oOjLd)|vnqM;HiUkJ=-{JpoOKWaSHi)4?|X3g5fa=CM-e$bhvQ*#dHx)(w z20a@B{3?W>>`%&8MEngTDQn>vatNhDY`I^-N0~rvJXaM@wQ3S%RWUzf1>C58tBcT< zzpHZ17Y_6cs4?6n8cQL0@1929OGaKGP4z=uf1ZY`!r>}Wg%MZB*i&QQ>ToSpE;?2< zgt^RlXk3tr_l!PtNxktjQr~l=ey?0q!p{homM|3~N|;1PY1t9ruTCTS9wR#Gpo{BN z#q)>ZfTe67V_Ca(^bv=Fy?sV(BHD(OS{ayg9)jZ-2=>8|O0kKJ5sYTy6&-R@s}?w@ z9y+g{3tny$tw0MMbWaU-oM0KqTVCoy;HqM#rueQ{}%63^&S)N>*_r&-VN&gN4z`K`>%L^RPTS{ z{ZqXs#2bZN#v_B4E&gWex5eL!;v&S&cUADw8M$wIm5=lk+g{qzBTb+n{MhApT!8a2 ze1K?`k0!+J4%>WWxiC;rT~|=S85P_Z@^5+Z+DV_17Sg-&_xo4 z1xGy7cZQ_E-?g}n!08D8G9~F;Ef%{oZ5(}g>|&9TB?Ko06SLX@!{31Yw_hRwPn?3O zX_zT4#`lNj$MSDf-p@|Kd%Q~SLy?_bIXxF5CM5HzCoH7E40(Z&bDrnSn2X( zd?O8wf0jad%1e;x5Im#=>%0Voh9K>#uBvcP;?{&xpuMF9&~^aYw#Q+dzbl?P2=zks z*E?T?bd)HAbFN9nU;k1e80sas$02B^1QWajj~ars(KX<#1kQ`j1kUcj`4r)7qhMaH zjNZ8QXF57vOwIuED&2xlU2p7#%M z4pA`IiYQmn`!h9arZ<%@Oe+2oRad!};4g>ZVI_FmOAzy(l!KKvy#|~Kz*%w@aHas~ zV!}CF!9*aG%l&|p%7Yr!PNIx9TA5V*S1XKuUV@$u!DuDO@)8U-1ZmsdIGvPXpTK!; zOW@1|&I|tq&X*L-QiHRT5#rydQ6G9!8SN1Kt1u3D3Gy9+vn~_G)kl)9a=+COq^)q{ zbW*k^R08K_!dVEM&k@e=6-+=x#rPa*|Gyel=uM^Eq~d>Dao+DGc-bNNLJ3xQ2|h3c zX$`wcMz|!Ml&uLCRdGUY1*}Q{L9;=SCvqrT9gG(E`O)CDYR9#nk3I1^i zu2q8Ty#!~jG4^@527M*~XY1C$xd1qq6VAa3W|4?;>oY^6)_7CtVN&szD2(sD1ZfVz z!%7f^Bwab3X9&_RszINnz`2faRsiQ^CxEj=!3-8rZk+$qsPW!ZmYP)jZ!3&Dy#(tW zf-jWdc`v~ah9GT74LB=-bHdrc`66(>N;sD*nBS`7{6M3cfWf5=-&!p-|Gx_3axXy( zhv2L(LYm?wxY!V+<R?&T+5qP}z}XFZ9Q@xYn1@A_Tc7`E)SKQ^2AWj-S1F9I zyaf3U!L>^8ua{tldMvayzQ|=WG!P}~?SzdzY9D*;D;88EZ>xLlhgj=6Z${2+L=k;xYvkoS1 zm4tJTg4t6Y=W&hlfx%Vo@0(Qo#R{Xnmtea?aK94t_Y!<-2-0plInLBl;0&GtjD38- z*z7{l`mG`+#^>b7f3ZeA>rLUHNx}cGLfGIXhujkKfbFv*liFjUClldofjcD#N5{wrE0tn%^Wlr}Wt$JKC0Gucr`*-jUo|x#+v&nat(46Rf0#sxK0DN{oArBxG)Id%;UP z<_iUZY?*Pto13OY|8ql>c^NWITlqpIN`jTqSKMN-H^cHT(a4Y8G0wZWFKFx!PAooE zoGY*>FD=ilrWmsvz$#D3G%7E5aRr3SQ&JwbIA=V)McF1ZOSSiQf6(Y#B${%R_qT>2 zyE#pChSv8v=(CM_=)K*y1p*$SePGOZUUl(buF)SWx)QL=)-cLz^m*>Glg~XK)XpQk z{xW52$t=8g=t&JClj|jt!im$OW@jtM%#mY3uj0WMxBl= zc7v%s-L=K0r1OQ1+Ne|wCTY)}PTB@%6(~*F-c%Oa2;Ws(C`w^lIE55f!xe+&zN(Fv zM^%eW3V~HFwgeB`N$Sl}M>`u`AX0@5*-ZM`CGC^|mKsU=Y>vFXH%;E-z+F8>Sp{R$ zGjQEZFTPnfwuk6XSeGt5$|OHum^7#^U6@o< z57PL8q``INf}}&U`DP!wQ7ANVl3t-Rq%M6R=vg1c-!?@4hSq%tmO!89hK!vwWnyM% zY)&53XW7FTb6kT6*)l~M!j49CpI=o;E+|b3zouBd6lG= z`zSm(NTx`pEWSd*S4!DhuXn-_?-kIrY8qip*{HGiYwZ1q&E3Xw->9O|3CADwLKNvkoGQS4FrEM0?7`bGjAntN#NPdx`L(D6By3t3_{=RHB4aQk^uI zlDhTuNqNraBB{LY$}d{%?@DA@IFVdeBKuFDi04=>^%r-#_}im~!@N$V59e5I-uoVO zpS#cv5;3HLe_hh&pI*A>kS)+9jp!wsB^90qnK@+3W(!`F)eh|!zT%Yqye}fqv}agk zo6cUb(y5t7kSk`w2U;gk8}v}Uf0&Bs!R*1>Mb;FnZ9BZ~INc?Cn#gw7c#q)83#$u0 zp!|0;ukM}-gtStVc|C2U;>eo@lWsni;3_3&(zEiOS6VTp=~{{C?ybm6Sp^X#*zAaN zr9Ye2E9XWfdjAPn$ph-40|XZ+2dZ#jg@(7pNVm5ue65Dlr~gqV1<-GDg-;IC`xCWR zJ+EQhphn`#mNwK7<1C0d3dDD|MAd^P5>U{cVPpP0<^4c;xh0p4XMtNaj&OYI!ts@c zlS==Q@TlVD*y4%9PA-$Z@-nY|$dJ&emF*+eWgl4WumUk^vLyN%;isB#iOZ7jJH6Ng zRr-TKnoI1`u-H3XVt=V3_9WI^>OyO-h$weSj>ISc^$dWM*1IHEuX-LG%yWTNsd9{A zcz)lZ*9_{HSTJeAHAMv&GFiUf_U5kCzi((S^R=n@g9=k8VWUHG!6aOlSZMkB*|ob_ zSbfO9hIWqk%NdYW)R*pP?1w8Rdt1H%b^@ZYD_I3Nbp3H$05mxnS%c^jR^LE-J`=7w z6`_tKk?bJ*BPL&7l^p3Cu}a-9t0+Au4_JoS?Ya||#Z`Iw;o`@FNz)DA*hxd_UQORH zdoI&gRHYxDpEVK0fvj;uaBHG3$zIEJ3#-yOSU?Gh1=FFm{H%ha=>Rj_Zr+2ylvQO? z;j9?Vfl0`3&tjf=4i94dQ?d%Ck4(>-lGT4&s^tsVA2Usk8N?8y$->{l~xKXG^ig? zKWBf>@{&z@19LL_QHs5bV8>&o6lK9;-tp~7p+pB(B?9pPTpeop-t{#dNfZfHDUxwX zcX~l#R%XBSqIAnw>FdvQJv?-Y1zA~D2v_^=V8YHGLQ;78#3`5(6-_C~Dlk>;J>PmJ z?ogE&Mw2-uqsY*$@ij^%lyOz*uE{FMNzY4~GGRl~C3E$v5 zj_~28NRqRs7v^N7=b_GJ6y)U7g{!^~d@X~NCCeimLKs6Ji*7Qtd>eg_h9o$(;2922|YL8`)ABDMGjIV=I#GV*xS&Mt<;iL%by40MBDcAG~T6W<= zgkqQNIfAKpeqEZf33sJ(PaBjpviHzI{X(gOk`nt_%}4JCPZXWHnQq{XNzWLM16P(k zKc;a{7WkPY{q~TaQEv!a!}HU{(;2aefx)ydT8MAYet0n4o?~p7(R4p{{ULA zC!z>-XPr&dz(#WV_P2a~p^iH>^}v)qmT!cR#@0+abWk5a>KsZOG!zgmU#f7JiA`+h zi?B}-Ipfn^k=As~;OUO@kdyHvF?Hi9<8j+G<2yk;BO7lr7P>c7jr|XEYv@}S9hIOc zCu4je-N25TU@OU9Ljs%2$PN|dOhCDg%jZN6eWrEi`C_gwF%A1sd3)Ayxb60q6 zaR#v#go?OjwCsrzyHFR@Jh8a!*Rm(kHNN2$w;6h!duU=hAt<6dmodv$+n7O0$i^MP z=~L0OrH{!2$rM`CKzE`kOwTS#9}~ha#eHI5b_JGScNqmcVv^#5oT9AI1hkRU zaAP?(sgV@3C@&;(WAA77t8Cs!RYekq^@%(>oM&SH(b!np5&1My<+7`X#Bi6nTu0A& zg35o7d4N$>WQbmw<#WRVeBsy7yo`UuY>@0IBUK2P#Jo{>27Y5b$#GX|8TgOq-ojfpCGA67xX&00mx z?9vn$-Q&0UxRS{@!$-dn-`FMJHNi7v_>HI+QL+kQ^xN#Bs96(mCG(^VOaHZ~v`Zqu zOux-8jVgHz2kPjz*``{vCuB{?$e(WMzd0CF(AHA@cV_olXjn;-{%i4$O(YpOX{rCt z>^3tFV(IscL9+_;G0H0%YnlIN&9rCU4Se+5Jags%obZjy)%-+7{{I<^iOD`4CMa#44 z6CT-c|srvJviu1@mX%xV(V1!@VLfhJ9Vsio+k z5op@h*dt6UqNA&`ErWmhJA2#PI$N4EFmH(QyD^L~Blr&gjPPVWKS%mhY88$MPhv&T zBIgeun?6-vcml(6VAU$0ueGDA5sfecx=9Le`c)IC8W~bO4D|`$oNK{7eAXa-{l7yO zP0QEZ)lclnjPr3fH0ZNFi!_0VzQ(qqs?v3(b*l<%ON7q{qOv)z)pg)`6kNByqCyxHDqVnP&~uTH^sHHg z7SeN>@YA!XK?LYoTv%5kA}F+~wys84j4Q3JF03nBD}n@-)YMefh)7OSRaGIPD1^3@ z7Otxk(FCktSH7-l<2o^pfZ~#((#paL5ko*}u889l2*j(v0x@0%7KsE-vP>i@#4?e@ z2o#&FFbJhkXhT(Lu}Gy5hNBkaBGL$`MuR6%ptf*zNnuS*VS|`RV37)^Q+R!CNlkId z>e6)>!%2jwsHT2SR>6%Fom>nFOr2p;-h$oR`#u>j ztrCS4LOCUcm130&SJf1*DG^0(L`iX|YE@ZDQJpBZQ@E%SLQzq6n$?6TS}oS_llHA* zEd@7})YO(%p(l2ArIC~qb*q-V8%yv8RD%fjPVJxZHKyA4XZZ@e+tZmB8s_#UJb&Sx*a%s&3}#- zJpPPBw?Gk#Ztd@E(kc3J@;y$ipsm?uQ!aN6d9jb>n}h(WsrQmvmUZk8Xjyd?ohh66U}3nrXnpJnM@-$ z4-HPCfJhC6+VTAxXWG&)LzK^&h~KmpNKpFsAD^HUK&=KQr5yy8{*8%g{dmy7|KSOt z{!Z2t?Wd6}?nA?T;+0E2a6#18)U>0qy%TaMLyzdQdf+#g{Zn#C;^mj-_SRP7`}HK# z%zrV#bP?h6Da^b-FiQBq{RhJ5+xU&Ri14u-;X~;md^UqHBfvSd@S&g*J`^J1!%qkw zdXn(rCxj0@N%+uH2_Fh6;lnsb_z56F!6>;locQd?WNgtK14nDRkR)Q&ov0giOoO3A zbbwb!!*D*GfYSiR9nzWT^D!~>zK7iu2$4{Tc#$v`pVEoaosx@?Jnn}YjVtQVSbF&h zhhETKu?JmXpaL{opCZLmqqif^c##kak-QI8l;ZFsB#h`SKm%FqMUEq6qLxJZ;je?! zG|)cr>-irzpYCkz!*_dnXv46h{GVdX|IhGYIf?=Q9+Pd{{&~!=?;;G??=WCWZwhk} zD8Prcp&2j*6$7RaF<^dz0n?KhFh9Y7=}8Qjo{9leNHJi>ISiN}&44)xGhhli4443i z0TbXbU;>B%a|&X>DgXwo0${+L1PoXqzSF*BG@Fh@{@QsRx>xI&gI8 zq>fgp-?nAOff)2!?9KeZxn^5$sJFkHObFncXSMYB0XPZ$byxh$^HKMl#5r;aKQNJ2 zH}S<#NqtdCbshG;_Da3WyfZifr^5b{T}>_BeR!F@sH++0Eq4WHV`e?*)g6s(y~6w? z<9&e#K)dFrf>)tb%gtNZ+>B#&B>T7E$B{kGuPjZl>EVbPhDyX7;sR3LJY?GK*#XK0 zJ(+h0>mqUVh=UYqO+&LRHba!u*NK;X=Dt8I3iVg#uI<`^ChiaH=O$J!Q1FKtw*1u# z6+FmroWFXJf`=GR^;a)e@BxN1{MAboe30Qe{vzDC*0QTlcli1M4MdK=a#v9=4%%*D zaFM^ZrL73PxiK&ivC9Z72KW&MmlIe5@S_ao5x5%Q#~55m;2MB8F<3xgEx?-@T;(s( z72m=&75j^Oa)kMDZrfS_xxyS~pc(+A(+C6g02T`KRtB~Jz*|SRF|ZB5Qel3Afo^|I z<1Xw{7}({nX##Ku1N;3o%>eFX;6{JVRseS~Fzm1C?Z(72a2H|#e2Rgih-t@MGjKl& z0C0$b<9-~EnRj#eX@AY7!aU63Q~sJ<^yUZyrvachM;Uk-0D5x|1Fr)>Z|-H_EPzGA z{4@i<0I*n?_c8Fczos3H`3wVp4(<$sV2#KPEu?oUYkCW2?76@L6d`p4%`WcK6Xx@r z?WixZxMgd9n}a^Z==*(<6^*@pt8nRF)3&-UuIB}gIqr=iHwcbj3Lan4fG8DHYa zQ==lCykFwz(>@WkssU$+@?%S}sG>H~DVn_LM`(Ifu>x+!J0BN4OO0}*tS|culyQAU z)w(q-;C;C+0#{J@USN<5Ch$cDt64)Z|3VBQnz9Nr)%XhvVn8AO)A%|exMYQS)1b`b zEb~0Rc!~8{(X|r`9;d#)H<*V6o*`cG2jdVTeU$D`Mmmm1+;o5Tru!eAE+$k_ShJ>t zw1|>5F#K8OIb%Jt#eN;d#PtjFFI-#P<^7G#s=B`!4 zjsH$vyD-=KPf!;B+V-|>!YuVu0hWkXNzF3d{oTv8xBddpj?9;je|5?uW+=;W`*+`s*6o z6k-SSJfFX&rMIPLprsiLrc<#&e@RbIS5H-U6Z7jX&KS_h*4Ew@Oh7lY5b$S8S=-XV zD?^x9bJ}R9Osu;eM#cEad7(<@?&aKZjB_*hamqv|GuCN8qmpeFIl%c+6&R{)?A`|&3gZdCd#|gr4Jj~E3g3!N5 z7Ao$_q3}!G0miPpNISdk4e3Ib; z1*1t%FnA!!WN>M~OQ!1sfs}1o>I!igBwu z`f3{oAWT2U1PU1QqcHa~Cbj}}t4esrE+GvTEjR~|R5rgHATb?X?Lnji;S1HQUq|Qr zq1Efx6_LUrqRlgbMG)@(Rdi16XbN9t$`JmN&SnSqHOBe;>pRJffgNhhuQLvdv-*OP z&2I$Opuw6O8cpbuOSwmx}X=&m`{8aD^8iJ;}6*vW$PY3Tto+Nh*WXb8X&ON{3l`f*rr88dWAFn_^<`?q1~&v6yPd*GTtGgfm-f6J2z)WIf0bw-={hvPvD@ zN1=>KIFm;zF}YSFfj}A|ri8F<;Lj7c^|r!;f&7Pzwo^LQU%467kfX2_XMlw^Z7|2W!|63&}>mN7v%YFXQlN(+^r+)U_;c@B8BTk4!tIsJd3oPo84>xwH%g#Q+UL04h* zziIGLxSQtiy|T}OT~tH_s$qVI0$NuAS}v@pSXEe5F8s+8a!I^dOYv(};3xR+s4O@@ zKNP|VxSOrG6z5?$K5l@DJ;$FqAqI|9QQ%cQeOlC2wbnEe&u3D+R-Hws*jzzu1zIFBHZco;uP8O4e_&C+@49FB92#|DdY zmQ#Rob|H{FI(-Tibw6TKsJOETfF*C#g>n;NeeUb%X=zi#fMLR0WjY=?_|G`>J5-yd z#IC+cY=qBG`x2-O7TP4hIb=QxN= zuv8-(7fK*bob|@B89hhEY;j^jyE>=^3t;R)jyX!iz9G(vMSkOXJ03Sdl)l zG4}(XIz^t_S~{Sl_hSCKHS++4@t?2iUw%FU&M$Q zaEyqQ9$p;fm{C9MJKBgyL1jdw5E&8q2_qss$%x2L7!m17MnrllBO-;A5s`6@5s@Hm zMC2rFM5K^oL?pm5A`;*j5eXn8BBvlDq6)x>r~)t|auOI36#_;?MvxIvVaSL`A!S6Q zkYhw7fQ^V0@E8#Zw2g=q4l^PWLK_iPP#F;^Y#R|N>=+RVaE>=;5#(%v3kXt1L<-qP zL>1OXL^r~<7#7h5jnZ|=(MX@SuaTx(c& z>x}N#tHiZJAvj+*g$5c!*vVu2llme$Bf-MA_T#z)m@w@a+{Z0^_SVWqnp2JeZIZ(? z_D*v8yOiiXoveKqI9X%lwR4-SPs4op#&mA;DX(ih*twb9p?#xvT&UFXx<=fE4&J`e zUe|uhWIKZIW4EJXlT8P{n^sU*ZMb|l@23{o8!oe2B_F2!N5HzD5>{y32;l(nqW680 zovtn1VnLEJ%%$7sb?G+UjhR1}M$W7)-Gq&l@ZUBEc}-PZ;4f61&)J3f!gpa-sIsII zTc;3QyGx6}2Ub_rR2K3{Voo3bpq2EZ+Y-| zS*{O9;UX|S{uG)J7o?--u1?x0iNK8bOHoW}5Zg2u&jT|#Nk-7gGm8;3f_1yQ5j~rs zIU@2s8ylDtzXJtE(YRKi(b0VfM2KV@TDb%W%4edRBxZ_*3s)TXS zOw``27TZcP;;tp1_8KuKP?$n1Ik=8as{*T1@=&k{R<`#xiNNXMa~eBdY?XOOafIYk7Gyz77cRjC@J4eb8!3H zh>yF7l#h3$Jf*i_gurbyabUn&%2QBDc?yw~=O?5*JxR**6H=a@B<1O;q&$U`lxLhH zx50gjX>fTTR9AStf`kn$=3DbGnDl&7#Q-K1Pmn9+2~tv?LbjAwVJ+p| z2v?*R+bLXB38BKIJRwNR^HWKA3SKDX$5T#^lqcA66(Ycv@|;jhc?x@^Jb|v1_dt%6 zC!ANxCs@Xcdq8}Njm^!xo6aK^Ari6aZiAuE$S2STGhTlu9lzskMG}xWK*s_NVRN=4 zG?0rA;t~BOL>sIBL`C)P-hqpX!pm99Tz@$l8io)QY_w-{S?bkX^}-!T3Hd@4p1N|WCpVU&v3 zu_%nIq(mxzkHN3rHAul=ddC#U6Nd3Q9B8NNbB~28KhKR0Z)K~30@A1!dQkv}7sfo) zl!mEkrgJ|JjH$BcbBRhcupqRJTDO$zN<(Ow@epdAkk%!PZN_69>}=V|uXOA%cua`p z(M$v^n&p5+WP|e!ZA-yjRdirhYpYC+pd$J+4t3$AJ$*+noXlz|IAx+KCQSx;p~<)Y z6e-M+`YBIoMQb(`!Hn-{U;%(7$T5|ibhqeZm8tYu&Z)3zl#3}p^yd064b&l5Bj>st z_6?-O?L%V9?{w@I#G>u=ot|l=pH0UbcH7A~MP5QYk?N(@$Bk1+GDFSb8A`EMr>5!uU@n*X&StOZ&oQOF}l2VV;H8 z9zmrq8(VZE{s#+^{)|J{$HEzFXQO?l{2kC4G#zU@HzD8Lmr?w@ z+W}Dr7f~-7bb2u#6?YrlgV*dz|7uq{8J7Oc-Z6Wyh$`Yf9MthSRMc}u2WsZx3Xz!y zq=f?1ha0K5N5?D!shDa;RAxUWxT7aq1Ey_ zN@1E`_PQ!vWH#uG6wOh>jzU9-J)F=(eViKdOJf&^a4v-}S%Ao-=^&UD2+(-WE9SsW z`{pO;I@chvGuOPH7weeK9MeD-j%8MiZi2H|!6=Ss^1Yqd;^e+VcWyRZm|Q(_@Js@BJSI?3XYunP#gBpXtf{)2T(TUqD|ch{{EkwOQS#ULU52d^_O_1a~l3XCPo zfv11tvrGPfBT4!5;1j>cjDNs(+@_ws(6+|T=8l#goKI}g zb6W^$M1SWlhd9+I4w82Fe8lhqV*WMX%gtK|rAd1e--Tpx)>z)eR6wemXOuVbDXi!WymRfd zzrG5>s^xkU6P#hW-oymYv9ue6<4sKM z&9NMBVgeUgZ~<1{#AyJR5vaV030zK~@+KxQk3i*3OyEial{Ybg1q3Q@VggrLt~W8& zRBUN)Vrtu30B|!K4iHcc02|m52I>L8!R%HBwg6ynVoJ6R0DBV?&~0gNVghzq+MAew z{g(D7Cg4U(dlM5dY-w*|0`5W#9C$y)^&CYEdlOU4{V0IFi3vDvDQ{v5KW!;*VhW$K zv^OyUrvachN4cz*0iZYcFz`A6^yXd$&H`8@;7v?-$ zdK1qFN#Ugm6`>tE$(xw69rcYH?M+PR`+eia@Fu31}eI}EG5UAm@=Lk z73t*t66b|CvDBx4tFfr0J_Y=5YPx+2n2QL8(dpJiGM%3JcM4U3v)w4LB~n zPG#)UOEZ3ys>Yx`6d>q0K^TsQ89GG}`u7M!FB6289B1e(LG02?`Q9D}h+TRK0w(~- zF1-ZCF~}~x1ZFVEF1-ZiFsNL52`*4Dn)DP`RIOk%>S>0zC>YIphT(1nqhTi)-mhSG z>80}E(#xbwEQ(3j!0W5z(o3u&5~XcC8T=&@ir_G*9!~{nB+xRqLMIzMc7t3n{W8nw zK|r&VB%fK7azEgN(Z~2^aSHV|!F!BvmM{*@8~YgFEKGS8n{|ti@y%5!TT!sE_!!?@ zokG>(S{Y>)aCD$u1nn9?!F#H>nr14H7oXpnu@&k#=j466A9 z0)Z=Nd}MW9RduMMWJ5`XM2X&2H|#D`aeAvw1Qb*z0t%6dfS)iC(34CA{Dg^so@64Rr!o;xNSO#2=a>ix z(k22B47lW2o#1)1Qb#x z0t&6g**4!LL;#xzDBv*>5Ll!R#?vVrW+EVjHW8?xG7(VNHW5(RF%b~png|GTO#}of z69I*66M+hA6M-Ay+5?L16fUZSP+=wlLKMM7z)xi&px}ijf(ew=|zh zc$B483}XsK%XH13s#+cOb*GO3(2>%nMhjP z-iwbdG{Mtf@6&|QNNN9w$P9SLVw{B0L{)!xmMNxQO}U$CXumTX;6?&lDE4L;wx@kg z@AF^6F~p~ER5Km7C#{%{lgJz~;{_e}kd4Q8Nic0^p zMlaIIt94uyMuTcyB&OZqNj_Vnx%6By^ClhlJrp(Vh$msSH(`#LcG45q;f>1`(|+KI zyV0(f+LJ40{mv8Tj6$wwg4rpvMIVs}VxorGHKm#JO)eUY|1 zZ|kg&Qg`uZ9Lh)GQ{3drCiEg$CA<+W1Ph%3+PR>2i*a z`?QT0)ABsYpSMd{{)P4|vUx=SU^=~PKIsm`+* z8>}Cg>~80D5T6Q9g^CfBr*z6o=%Pg2(54^3y!kJI$=3?%oPNH=NM-bG zF$wjaryGG#O@_lI11{8%G&Ts(; zY;^RhNgduI!TtR7YJl%bjy4gEE0^GNuk8?cmvYkA$O$O|ItG0bpaRz+_woh$zAcl2 z=u}(;zgEZkhVV5`+KO5-B3LHFqk%4^fFdG%TRCC|hJY@k@HH_wXYAJS$&jy^TQonS z7MHWPs8g^OMrC1i$LhD3?Qj6*Gu?&DuV)Qu2< z31>CKnWCckYOe7wBlbbWCjM2&Ccy^ZhZML`+$3mOYen)^I?h7k@HQrXWbCF}7R|v09q55i4DJm=)qL@r zFbb#-M|By8oId>C=|chap%)FD(B0EApc=i3rtCX}!-`O-B0}Y4q@x}{?-S=~AiS&88?|Y`i+W%=`Zb^3YtX;~or4%R{TYXHP*B>o;*Jir z8xh8CT9;oy3*nK&R~i|6sB2H>Fh{+`2|f0Kv;*Xv@>&PS1Vj^H$HG6km) z38wq2Rd0xvp@UKSZk;|Z6X_4qC+#LvP^C`_OP}x&opuf7#$PHLJV7mq8)-1Vv;gCa zmBqlgg{DY9taI=foz}ppF-m-AY+97 z9p!9o%%Y|S~<#^yZW2$>|df<6{%NsrQiSNO8;e*#(cEETGy`^?NM5gmn zS@dzV5bw3MsL7SeaT~3rcK`1O-)^r*d?q=(qX$oM51don3+?^dlppau?%NA`vZU<` z|94ykES2q)%`Sh9Es{^nx%2~{!){!a(nJH0p_f(}h>`wg;@c^s?e6Auy2tik)$T5B zMO5y42hCI_J^8UhkexE=$(w#oc%_ueoAHf6S1HvdJvn?BSijXonVgraYbfPK^i+>Y z&zDO>r0U?~J>T=+MD749uKrYmUYZNIW;?uIt%meHjA;?nkY&(VtPBJqa9x}__${ug zwf)%({7)s_4D}=uu4Uv;D*R6;bs;e!nznXy3;#0=n*;+o!H|!jo(`lw$#8&U8+*uw z(*G=@ETAAP6gTpJk#UiPYuu%A&oM3h0el{4X#(9x$$< z^1sMXBF75S%4`MtzAfslap%ban~V_7)}nt{}t|WIz_kaz}G(f|IYC< zG=jc=J!WKOd*=mlM>tOEVPVG`|54RcjVpC;!X>M)@ZZDHmX2QUy?s(8 zxR(<|N4m$kbo&X@@`mGsggq?sEExPv%M|MOKnHA$(Omt`8ZgBEsx=pRyURoC}7XQg)T2wZh8Z*Hy zSWJHFBFVr>lXoCdv=%-1OodvFwOEdp;r~u@JWc`8PaMVZhs*rm<>m^eRGZO!kC~n? zax?>ag;#T`)5fsU{jVmIyRqMT4E5W+a8n5XTU_@zpT8(&2njEEJIo{jAXmAe^m;-g$H&+uZQ_pr;z2{QhaU=mt%8Q`^_)^T1LmY zeA8=D>#tzwse(oOT>Vx43-RNUcL>4YHt* ze+RPBNF4#3&<#niDcYFu6$r${|D?!?3o%>?-JoqdGW`>vSd_dPSF%-?*e82NCQ+7g zDGsq!shL!2QqMr6FfxCPpein#ic9=Dm7GHv5>p^njodgS5Xm>8Nw%(TpV}CQdQoJ` zgNVw(E;sc_1kz69$EZpBE*`Qc^@z$@ptXE#Klsl$M4!y!obAXtfpXqUMNsZk$~&<} zXQ5V$WEznz8dKsF@-7u(;O7Ul$&N$8y$HbY6E-lbcJpK# zMbz8ly7a?N>A!<-|Kx6+gn)ZdMj}s32@T*Bo`lsjY6Upmo5CZvhRSLpkVkJVjov2# zX3zkBS=UiOhYVHEpvb8-c+&{x(R2Gh{m&5ToI5nGzcNVba^;`6@v)P|TryRpAzQ?F318czcQ8Bhs!>e^^|K<$B58*2@8E1W4 z??Xqvh>oZMXr=*}!xYp)6lBzJ2kUhH{pgUf?Nj8%&mAOqbO(3qv^>FLF3s?D8g+`Y zcc=-)8!ec=X@ugbow7tv?J5e;)b2uH?Eb0aUZb1#WpC@Umpff+f@w(griXf?7C|pf z=Ukes-|Gw_3ym32{h;vZex%l@8BqNgO=Bgy$mBUlgPWrhe#~h>VjKpyWgT7=8+;hZ zL+FTV&;e@DJf^RM)F7i?QP=fU&R>yCQP&MbUAegCiW|I0mtQ~){-~y`F&f-3y1^ib z>JkqVI!d*l(y5j>t-TSgRn5DX5^$Yg(y8`So%iX<9;41*jIOh^cU@N}y?8+Th|19J)a)o5#wnuaVic$P{UY^Sv7(oV zRDOz>OH{%1X;!?G(*k0ii5KS8NPL+_LMP~j#@W+Xv!PHJUm+>G1*v$D?$fpBP%qDH zMa^oE2p&C1XTk<)KCR>b(5TDo#(#$g>J1dn1C=>C0T0?ch~_~nSgr@H2?6|N(f6CY zuds}#U2-3=xU+nbFwgbys3{Lu9j_Cnx{Mc}+cI3vmwJ3P> z;2DP^ycUmfpFkR;CZc&~jkb8iuwr<5Lo{sP&{ zqp0Hse6;cZ73v^si9;Pzhz#s|SX}D(dp-mn>fodoqmD}2fcOrOHEi^-jiL+xZKLTT zP)nF_x`=2e9O#1F`SI*kEWtY|Mx3ZeN-O3@^8t=&!a?t-vGT2 zDr9stb(uiilL&Ym!9Kz1_uw0m!t(v)XPjXVor2RR?|0%2ZsGf@UuE1AYVPH+6u!R^ z3O7oG`L0mKz1=7}&c6xHluph5&2*;$gPl~f{|c(v!n-TVN)fn;hEQ860yh)8amaoY z8;oG9LPV-TB}8m2T3c8nA~KA#$p4-WEI!u**b4l|*QjCPmuUxn467+)!!FYfoFz2g zlyV%113&o~VM4VHwRI(x{C(0mEB9(hQ~%C}7F?ojEr1&+L6x}Oc$=^m5@`ByhwJXD z){QMK+l94=P(DTpYcT-<|IW2t{m8t8APbp!@P)OM;7I>YY?-?7jdp7p!O;}o0UI78 zdxdo=VPk~!G|F231K@lizF~b6zGND9Khm*aQWg%M{j1s=dqpsLBa-r020EK@D8YNq zUHae7mYg?;|l=%48S-tuNVnT;xU$y_zGGP+u56&lOv3zCs0CcD>S2I zA{!AG>cq=sM#>XNBS((zjjKcLo3M1euaz39)DhfTzBj&a50vIKqN0)&rWpUOW<7II zbpl^(zE>p9TCY?xMjXYv-jUXM^dr)uwM(6Jdl)&7TDf0mD5dV<&p7lL^$;CgOkbN>3f%|eEEVZsk#EH zE+J1 zSITVdZxzO@1YmvxOk^uu>St47a^%!CLG`^UW6owoe`uvCq6&1yUj*^31BpjtAw`M; zG43NeqEjJ_oM^s5BO2F{M8XCg^_Y(T7BW7e(!eDfiDcxvQ;;es@6x{A(MAKV-iXGf z`Z&|VV~%+(J#xq+Y~1U*m^Z!EP&p_d=lhC!P=G&rJSq24@9N|~K&@~Pq2^NA#^rFM zv0ceyrfyXE{u_y+F44f>0A#8h#%d9@Sfit`YKk>_p@>406pyFiXE7i46f@!+ zBh(a+rzu`}8BH-h6iTz(PXMNxfd>fycT5t9`8|NBUAj8@R^}{}P9rq{$u_9*G~rP< zdlJ!=m1;Oe%$?pu5%p>~A4SmvI#C~uIi^!Y#p+o46zDBZtcaiD!Nc2|JhS}wqub*Z zTXgTejHV_h>`)#7`r$ieBwhmAr~imVnY6R1x2b!#&=3FK1n=Dyz5*kurx6ldsNX<- z0$vG#bxr;H78=PJD2M(d>Jl%*gZ?AVn@Qp44*sPHuAh|ec|#O}CVk@U$`6#I_VzWm zcV!Rsc6RsR#>!Tx+!=agG2r}H@F6gz(HC%LzJR!~F5sk_-7ma=bNhopyBBc&FC}`< zo&Ne31(yZt(khP*%?FK%M?@sKB(?x3K|V~j{{p` zzXi*Mh@}2Stp$D2zb_uB|NqZB0!F+s(@KbvR=hDjA}$3)H$y~4tpoz(nhc6v9 z6mOjPVu7cCKf#bzR21-j17KjBO5`t1ScU`22ug+p%8C4TqTo1zXe^LOPilZsx&~wh zvr95&rlNB0QfEGZu3fW@e#{R6LbOb5@Xg z=PGXfER>`xHZhO0KQd@wa&vh+=X`X~z{|HIt5RWIup@++=QPh#+#Ra8OVCPBar2{$ z^(izanQk>WKc0jNY7kQ&)xdqr_KVyEsy>GTFrh@D4dWvy;{x4N3=Ab$h-L_CpAd^w zizv}zss@)RQMr`SE_bO1fl*(kiWTD0MO@8t)juItM5^J8iU)tm8>@SIwDMJ*x35Z5 zBec>3Lm+wDiXkg-!OPNUehL?34Xv7rpQ2ejEydmxCbE>!4CbYE;!B=1yF#qih!{1h zLaYf(0V2b$O|Qj??rQWdK}l;%T0~erca{3>g&9yyiBKy;tw5r7o*1k^MK@}hMyh2R zzW(ghHjY*sR-cFHxr|tQImCHlcsaz|%K_`r%N!C=D-n@q4xTkhydp_26{h`Uu)i<$z_X z0k;tsE@x82SX9tB(zMYCRVwzkjzqqN_D`^AmTwT=fB^QRiyB?Xe|;Zc(jw zba0%dGE%PfihXVXZD?vzq_;5&71Y}-zrizFlxvd%!wp1*g}A~&Qj!ma3ovI$g}71= z4~YSEDWt^O78iRNk3^$JV8#{8-5SO}F>p;`2(XjpFoud0En$eLPN+1k;V2>6T*P~D zV3*Urhd!j(Za}f!2!{bO8?(aMZcwq^NUz!xWwYIA#dgPem@AhNW3$~@PYjcNoKu3C$ZaNpi&X)v&oDRE`lCm&)0z+XveP^)KuA{yL^8&qaJnH$}qqPZqqzx+%b=H4vjnr4t&)76--C_|Gy=#We#CBjd@6a2Ge}iI(D; zK`+;gw7F)K&DO?XpFAZl`*bQ%%+tf_P)WREMX@hbu$CDvJ^q{M3e z#H2T)h(hd|@qD7k@&bg2hZ8dhZ0yi&w^^-QM$BI_}{4jdY^eoFPZxy3B z3ahs^&&aXYFEM1|ro8usHtQ`QY>|!Tr^ur@@M6v6JZk+CJ%B7hmb$G6|MYS^HQJZD zOmjIg%@y7@*qzY2S)Mz(G!prCR$^)ws=2IvB3XfAh~S!vA+E9+qE>8a5Q=TySYq?W z)gGn@f?cCn;#x1Opp05$6{1Y>(sFk=RR1cxT~=eNd!xB1^H7(l!jcdNO#{uE&6HRY)`7JH}e~_PgG(+Z~ep_b@ zcw(6CMc7+)=BgyKgNpM-+R9y&L$0hms5y_;BgayHTzHDGWfkKlB!Z50$BMu>4+(NZ z<86{2uhy*I&LntvK%$BP!&L#2@5!EGF>@)lG)T3jLE1k$oc1Y-PfHo@D4(t1jMFQ5 zBJ8>>rLPA^kFXj@%wSZwz=;kQIOD?QMU0w-Sck3i@Wkmnn*YapiU3uOA*>u-J<*=d zBwJTcR=PR~CUt(xHF!qMbF!!=9ooGsDJFW=?{v3aI0JPj10u>@M5++HiDdJ7SOnaa zg0oLIseKwUO`|}0VN_)wykH!NjAo!1Ezby?NuVtWX1P={+e1a9<9oDn=MueETvjM&VW#u193Jyq1Fyf76H1f3s-K+P+|Rv8eN zxrl#|gDD-)?_FsDd!FH%eOHa!n(%fRO zB9zX>rUH6XJl4nzGFC5xdJ4&6s`hGI)N)^uq~ z6=NT4vPv}Dr5wB~pw|M&KqFK~`Od*0bU{Vemnb@SwLh#X&x&<*ztP+PRtCGXM7CI4 z_Q(;48_vDpXuE@FG4aT1>x0@7>TNWMm?esjXk7w2pK7#wnrW+5%axk6!jqnuN}kJy z@}1GUaIvrSG#+ct-X;^H1L(0l5LoDGJku%^Kbw-N>qQj8~T+7^ruQrtBVJWc6#x!qS>~IaHMtgO^v;otimp6bH zxTd_(oItN6%^0FmY=Osp0WTn}$HM~@2k^+mSXa8yQj80qK1KdeTx==>KXAtf2W_Jl zT%t>^P-5Izd+jDW<$HD{S#oFaOh!>PbD`+Q@%hZ1=i&G66+BW8LLID*uYl?7L3ZP)NjR!OEbP7uV#tmA`3ltk$NJOc|g?77Y zNw{ZeSagcK7mudqf0%fQ#9T``4~T6kM=eBEwxyg%JN#(F5fDtTQ66E1Y|)zVxyW%| zoh(KXwug8@y0(!!-lL^*RwcqvV1g%xD^!{zRxE3d>QvX(9m8c*DrlK$&OJK7CD=9@ z!hVjqa83&*+R{ATmUxrYq(EbIWsAKgNQ7w-4Xsg;zpXENh+pewwvmpwCMcOD81168 zw&)VdOb_{MMbWj&IbueWKM2$A3ze!>MrTh-S|bQl3kds2L)WQ=nvyCG*@9@@Aya&W zPB9$84I`aPpJ5C;*SltjOt2zS9w5mV6=d< z35+^dqFT!52dg!gMfqx&aoAzE0KP!p`c>^TaNa{>UI}I1)0lF%OT?_mZl~vsDz9`w zWx!fDnuSz_2}CTse~zc9H4{+k^2J4>9&uKV!(||N3Na{KEoK?x*^mBRfoLz~czY?2 zSLe8NVCwM=@*bF?!}fuxW`MBxy9b>qUQR~VerHXj*(_`VR|dW`kphru9>&EiZIZ30 zPxi#{L{72wb=TU@Ii`AeD+-?G-9k)v6mTwL1{Z;epJ{9QP=Ki!v%@w0IjB3#A!x2w zbD!t#11{mQat?6kyM3lTNv7tsm>L4JJf(7TvfY+PMU9J!j-px4aWlEdTs^X!%{DGE z3sozF&Ox2QUgWMDn-eegt{iX@cNu}3D8Oa^(2iY>Pn%6DnaK-UvJ2ou)Xu3Ik*6yG zX<(b_t|e?Su?Crt!A0mW6}&^0GwOt3G~aNTGnj^l=|d&9l^o5vpb9JI2ql9IQSW7+6$tX3N z&P7>2P*T8a`bQlh)meSww?#p85NgZ73x&g0m!fDSn>?bAyVY!~r!DR{gh`jy(Rdo2 zHW#U=ahtbXd~Xs>(<1OHTas>9&2^N44wZ(5&klQM*y$a1A-Y`J)5F(Iqfe^t)w&57 zVbuhD?u6(R*NnnH0B!8EMG+j$UEw^SR|-}bm9o3B?!Qfzm-8B~fr-V`)v z*NhfZ*Nzrs*M+43bK2{s5MrMTsB`T72EHSNf?aV(GxGjiO-ZT{N3fkMJbaz`w`Ftu z_c(+_<3^okD{9b7-*c!<(T40k(VcRK>Z#14}v)3!~pc=yhQa@B?| z=(=VnLJ4tH9r8KyoVM6LM`#3f=pvfng><3$C~Y)tWgMh6(F0=a_2CDx(XitWMSxx} zZBXzHhPFKDqCNgd#3QCE3Z%t5O-<=^rIC|KLN`Gz<(cnIeq+tH9(U%7St)W#(}d0ck4Tblj`%Z7G^r{$7UNoNJ>=z0obDhKI6`U=9ze- zPU*KE{;S4mj8=O4eGzwaupOH_MbP=x-?z*-`+#tFM;bl*5R2&+hgjShW-4Aw3=dJ9 z&6mB$S)9+c$ar^^_6Ah57Uk^dIM*bjw^}^~+Zn9{rs`qkmZa$!W?%yCLngXQ#9PYA7%NuW{TJ!=I##a%ZUiVZ1cVyZ_BPE%w&-K|K?_YAjqW%|@h181!6f=Lx<4O!;~BQ_!R?1rIIa1PdyC< zA6mhu++_rdyzPP;qjx2dwzFjPnq3;kR@td{Sy&nf`b)#o0I}Rf{5`4bT>&m1wwY}} zFX}W<~_=@7j5^x1I2w)?^d8;WRUboZI1^4^%*9~_hjE5mtP_R z`)C)7l0e%fK!fD+>)A6-^RABRp4Bl!MG%?JL{RU~yvBc*l!y}NsPx`rT*?b$gS}Q2 zQ@q3_6}5kvA4Xm1>KJU(W5&|V-AhK{Mr~&pd3bGCM@>4eQ;tn>k&5D6UlL}7_Q{=Q zY~z$F5;K}rc)V|*uMyjdzko%+cBK}6g1ahRmmANBC%Yq_qJrQC*q~fw=DmU&Q|%Sp z04J(a6z3x)O;6$^4^QCUPFANAQ#OOetwH9@4}Sf}TAT z?!IzYA~=ax=)hn(>JSZ^RYgSDu99vHc?lS^gDF=LG}-Rf4I)y-|2@8;WgGJiw>``^ zMpMaDDidnCB9`ecJ!w{<=xhuN5apV!gss<02(6#%twX;JpzTVCg~+sd2Q_FuB_{Hq zmlh#BZ55YXgLF5P9-19Sv14--N}_Uk1gw{~$D+f(%X`8Jz!BUqM!M5Wv*s?053riB zRpl%br7CM#r`g|_)(~5C25r&Fa+svzKX)WV2W;2~yC#cpL#sQdZEJZhcN<3pjANkZ5%L3;Z@$MLF73QK|cN!Exlc6bgUdk5+wTO1-3 zcicQj(OSv(t{9Asr3ORyCFmKANHqshVND}3^)K;v5;r24f-glh{))|)fj=}1|3=aB z?4FkHu57*_Bop8K%EY&UGTYkwvU_`)T&x?S_-y9@{l|g*8o%KinWs?z39umqea?b|1z6 z!ACa5Tdp~W@H-J@6yB93clF(NI}qn0`hd88*Wd;jon_6q@6qdj_EkBluR%Vu@3dTY z`uvLg94mX|!xi&44rn z?aUc#qHM5UE$?5^wxrZry2)BlYWhK}^fdufbQ8IbLB8*s_K0}icj9bNw8+Zt>IE_2 zJBA<`{PDFgm^HKn)7Rg-m1Z4(1NbBaQwt(o(g9#o1E`CyOvIIjDm#_L#D+vR-BD&Q zIZ>2d0K%$9RUy7z*wWbC8zQ>w+NtTSt2ev5tE0n%MANo)^>ugjx2bFn*`YYPk_}k2 z3>WfX4XbwL(UR`VZ12SVJM#WW?dfp_* z*JpziPF&k}eO=|yX3)ca!^${PdfC8;Ps&r*3<7h?H&|W@=%s7Q`T>5?S0>Ly)yrr5 z`gRhX?0fCm9$A0lOz$SE^3uz4kI2Zf+VcMVf$ZyLr`5MEKeItj%Q|0r*%fP7^lx$s zebG0F@N?JXRLWF=5Tt(M;|IVgW>o*OEccV0Ir ze=kmym&^D;{N&;1qj&}f%k$+&jp0}G8_EyJXUtcD`=uN#|9a-iPhBC?kCi{vpDn*` z43=-&AR`aUfvk`IeC{vh?ksDz{10(hj>8)4&6DE>w=J%a{|*FJW#7?zAG&>HMS1?F zww&cFE~DPcE!L~_?7!{gh@A4KjP1MK`UOVt+||~ri2X#&VF3Sqbv?p&#?({FKw036 z&;EWu9@_V+%(q(mH}%VbdO6wRNLgoP$&Ihdd3|!jVfj^ImKf%$as6_pm36RuWBE3D zw8tv5@(W6~FSck#ZoiiJ!GFnPD%`LlAK=RoS@Q6;dGe>Stf5@qeeGbwF8M?GCWdMR z;c^+9htxM;ORN2~@7&>nhRX8x&E?s9t*5Mq+|KFK^d&y zxLNKTwi-4f_<1W)_6*A;tG=wge2V;@u*M%=SW?(fJ+NWuLzP3>vU|{aSk50lyjboo zE3(nshq8YxyWT|1Jge*;kVixQindKMu1sD%XwFN#)ym#9aByg4k9_62bKs%5>&|by zEx)%xKDzI;HC~?Cnkk?WyVqSgx8tue+RQNkotoS6F_~`8H>{M^>v{&d zw*PeC*8GjvkF3aVKO%45H;AGCA2E1yd4K<=w#@7$sQ=?TPhK7d!J9C_{K; z=P<2+-&*wz71^@a>NB$vhK7b@FiUQ;`i4F!b6>UcmdIUY1=oMy%u0Ny0?jl6t$}M! z-f*NG%UE{53i@reb}cK|X5A_y2hX2>L_V@FPkvj}Z*_Wg0P@L!K_I`*2_7F%tMseEbDPeL49T3q z1CJcc{~e8&+(QHH3!K1jz{&_%(-_-HurF|qvGoC~;aT}KX7p&A{Jt>f8S;UBnBBh# zGuyc5yX_~>AAp=$Cp!nN(((p#X=3H3mL=w_B)JQT_F%xRx8x~t?#L?*=g;@bsVBbn z-P|>oo!nf$ac909XvIJ^JPz{PeeA8w>}=WJDrcWlDe^bw=C^HVkdenI`c;meeC+%) z`Muet`Oj`1di3Oq1)Ho*`-!aM>QO+0+;eP5P8mG%ZvOd4tnA)1GWpzVR%U+xBUVC7 zzDzrJW@Fnc`7PN;5qbPmmxdmc@o!RbZO;PniM=-ik&I^Q6q~QU`N{|7gwcq!(TH!0 zb5`HV=er6wy>aJTEAnNqwP7eTd;1Tq$~9KO>OYm-DEE|YK62z}C1&NFZj$~Vjy;F) zyWPYJhGGXBtm6Rxm!pPa`w;$Hci&E84EtmIHl1(C%wB*3bDtflK-AB=NhvwV$^OdW z-^RQtv(BB*`37Rocb`D)$75eb_;=lX`40iQIo7J*G~|<*ODTWT&FoM169f`sV*_u}{ z|Md@bA8(Ms)6b%Um$(Jba|>S3E%+i@AeYt4vObw+wYFJD+N`5PBRL~OBO|iH%CoYq z5xL;ByxgisAc(Y4d9uGuM%A}tRqKX7(ruB%3vc+horcTZr{w|DI$TaX47_-lICA~4 zoYN;a4a-@5@`_v*NF3}3k z^M+xKXW?}+Fc=uB9BIHT8zVH;fmZ&Nx9=M!q?ErB!#_vBlmmkh_v0IO%DW)^&gBDV z+{$TH4wfM+2*G5&@r#>o{qS4zsq4;NZaws;qa!!4E+wxnJM;RQ%BSS)V{&_*4CaBg z?z|kbuV!0CY3XKpRhI0t2IcH5`AL~&9q!+FX7i<$@}v7&@32ljZzX@jT4YTvUs1k& z#j2$%hX%~KX`tLJ862*#c3Ef2SID-!BUZ(b^|kf#()tk@n`O>Q7%7rv*6=oY>)tmj z)()7{63~^;?ISMmeKE}8ypsTaB8Dql)~+0S>l>$T|K<&=u_UiLx?+{JaJpL0%^S{P1dE0eh5C1`lb*%5Pg;szQ2s`X>J#9VAVyrN!u#Rc5Y8kx}Pz0_e|7%A>jz0AyY0HNw@~u0%`DQ9HS`+= z-Kye#tDuqVXsUj1zKL`<*5$hhzmvPpKBd@fbwA$tPH?1_e+bX+i=j#<$T5Ttx z5m|}zbF!^lA;P*au!%RyN$0H3$lZsF( zLq+bqdgs4gb{_O~Lhfw6$2wXrqYhimN93N?HaYR|z1`amt~hzLLPmmIcOM(6IQZH= z8EcijhRPfATTaS^bJoiIHQOID>yTar*RbWM7H6 z9|Vp8e0X>L4R=`O&>5|S6{JJG6rkOFe)4nq73G(RKVYNN~+>O?z={5QX8Wv^(sN;X4_8^TUP##nEbS6osqm*kCP z%T^28K$4kh$Tet&+zzTTGgGX4)^B>_h5U_j&0!EA7SCZbGg00HGQryY{RZe^78U@& zzQfj$jq*0*%|EWbs(KF;+jgrmKU;Pj!ZHYz|M%D}*4jj1$0pC3Q1On#*=kJ*!ztV4wKiZR1XhFkU(30KIR=UZ0Enn^$ zl<6m4U%oQeqP0P4{mAAsBl#`hxyCtbk2SY+Re$-~25bk;U3X00YC=7I`?`90r)iB} zQ7%8Wul~6&TB+b}M+YpL@IMC20DNSith|EM`;UUFe_0G-KeMvo2zcTRAGzUxd}psU z_%SOP={_-F4VEL>Z#dVj17)1)hmph0GV0g?`Ov=8*CW-h`)S|!$;d&3f8MV)0(VB9 zleg_X{93h@{qgdn%`3Cp)}Cyu1b3Z?74#{ZZrSdC#^R7TThaBWdgXHS5KGk$0iIYbCf$|k2n=oU@n{O?zu<}PXHw+zxY-nA1 zq~9uU!Pt*~y;|<7UkRoCiu{%r&X?vNe2ZETz`;pC{;Jm+PlR$ubYCS(|9Nj-1?@rZ zjPCm|68XCEgC#{N|Erfr5DAg)m%Su1J{e8q{|lYx_UOKb{0~D&{o&Hf7QEFqRCO|Y zWA2e`IdBY;jt@Fy=Lu{UA?LDB(v%xl%b3&P)j7N6p1va=8akQZOIW$HUQT=U=<<~) z$KrluEC{`unz7T>-MM)rG%?dXg+^`t3FN7rK-kStO zKmuZ|OQLkOCUI$NYoe%KD5&NA)dg@VZx_I>v<+_EFsQY)t-tS?nKRG5&%FVx{ruj3 z{{QzXxo74%bLPyMGiT16nP={mGB>ajYrA)4Zs(%f4{?7!;evf}{!ngdXc8rVM}H(~ zawNTz#Ha(qK04>X`_mh0KW7iz76{GATau13)mi(vy>vj*ZLr7Ewl(RH*4uuyYyCD2K`|2AGFW2CXX)_^+Q{* zR6_BNJ$Co2(q%>;rO2vkNin?Q(jn1qrx5Y#nojY?&33S7X4cHoybgMbnAWrgwag1j zQA!_r$->;VlxdM&yJ*m!fCh;_t{W8FL~x4u01>Lsh%{sb#n%M|2xt;|KpbATvr{}I zc7lN}@%p+U=)PY(B4{mla9zLn28tY9m)0!?#Llgk*KQHZ6`v?uXLld!6z8Uim)F_J zrQ%7kQ?XPuDE^9C_lUvV^hsjurdwM>ScHx}uqguzPfY6v9-N*r^~j=uKiw)@3TAt} z=(F5hDc<$yS350zNhyL#^_b>MTT?q9qfz?P#+=6>nC(e9Vl4&K4>rIUzkC*=J~w8xl=kA|1KO4j(#`iz*#!9Z4l44OQw{+BjD$as@NE+Q@RS3k zi^NzvO*E&7$$t3aW5szj2nNCaclbNSqw#jy%RkDfZN9Qs2djqSxpV&SO8*}1j5wxrKUe?lbWh}NF}7N@3(K+X#L4D0;y zox3{s%J@J1+?eIL8-G99a+V_9)vc|(EDeu)pKRbg!hN7QyQ@Xd**#t_tb14paBvVI5=gcBc zjB-@i0V|Z^8-`RkWSoajW zbj7tZ+w0-*r-Sl=(LL$nO~iG+IJ$Tvsew=8ubqJ^vS>(NmxjEwQX~gLa%1Bb zOr)hNim%H+)<((FN2C4XTY$V`A%*I%N)xY+PU#~i{~jbJx7ptp<9C9|M%({h>0_lL z(2ofE&QehcHqZ4Fi*;bJ)*gJYQ+(cgpwoU`q-?@p={It(-S8Wdqjvl75FQ05Ak>BB+)=? z#16Y-{x5dC~P)W|H(O(O-G(NBTG_&u}!Y+t;m?kh8wUO%&O zVRI(!W5S`K9{aV2Ci@3A z6XR;Py2>W}=#uN?xMob?R8AD=9&$|?Fe8scpy#*Lb7Ga4U z>#Yl9=oK_&#y;;R`Y!n({T69_U%_^`-vYGpD(xYOM7i+nx zcIuR+=ne0m=nvjK!r$N8Z@ebw87nSj54`#BO=$~lE`4lDTbn&@gFXJ>=F&q`I(FFO zj&zoGPmw!38)e~f->}EO4)ys!?&E*9!{0h1{SeacokGjK+dFcWNss5-68VfHolB=6 z;5x$l4VfPQ#%9`YJ%dJ0!=Oa`k$f=W$V*C(NvXYY_E`w~0220q4whd8FNHG1a_lBZ z;DR*z!YGxgWi;4D$!_ItwGSfYMF?c<>-KE1Hf{FQeO0A_ys8zoluz44UOVZ?*3$YP zOV9a5l_4%4grl>prgp~EkiBb!xDzDKppDAc?I*7SEqT3AnDK2s~6X$S0BNu>L9vv8sdt%D@4c6g`Hv{%{mXCLR-IwJNz;Z&?krPuRAs^ z!=oOV_#;*zPi^Smd(S&m3yxiQtO7aEuvVjt>*$Y7gH7#d(=tU|b^}7+lf58vIL@Y3 z#lvg-fn7-cB93gsLu)oI+bd4BrV%0Q8Ttb!mA+{CXdRs87 z+TD3rp7hwWZk$!uEndEPlfBSBVn2YU+-s%SwRX3iYVQ)izq#v}xZB$KOB`QF6OB8? zI1H}FG%;>SH0Fq;pmoi-?@5PVv=512-#lbpJl_6^cpQ-|G_|45-b!rluxruz-Kps_ zteHu*)-@AEi%nM1Yt1+f`@RbEA*mxgh&ZiZT#jFHg|I7z#3&r( z>Ux>XyEU8si21bAw#4;>fmF|}C0hVdsPT3Mkmuly+bhP9ZIp|7924s8tqs6G8f#CL zYhv-t21xAeq29WzI{S4ycM0N({(HK&i0vEfowec$Rjfa5t8l>G4(tT@|FZ9)rCY5lCStSBzxn#SCIn(-4P^+8od(yw34$0KEZy~mUN~t8 zL)bU$vhdSu-p)y6gXxEAKiT5$Up&zU^Q%ve;b(L!)Vk1R*jy;mg?H>R7!S9)NIF&* z3AVZbYeV%_>gc4(H?S(NeJJ$|Kj};MSS4Dk^^vqNV~;1sY7>^U(hi9TD{h`Eia4_w zYEj2D@g&T=8*dHSECXfgqa8Mw_v09R5C{(`5aDK3xeV@qSk@|3U% zfc*e*$QsH8*2ql@tMc*?#eQ%z4*u*Er}}Xy4LdU8U2hJpqAdG?()5FsH(#o@LtyZyS%))~1zoIUxx zY>ILftqY_(Yg5eFE8~zdJQ=dConU9&l51T)!J0a8K|a2Te^E<8`>DIEY2(DFu=6_g zLu*QcSOW;(L;<$^eA-VG-#OJzKD0>O8uW|zaCqac;NU()3zpD&@bB@63q0|TJy0zw z4*=)$z&Qe(o-mw0I5^`D^okDyIbt&g{6~QvBJ(Jbxnm5Gv1iyv0%BuJSEt?m-yi2+ zuAMun0tLj&s}KAThX${yvwwc+8te}Ht&2|&+;dmmZ~Izdlb39vb6f2=4nXo6VHMDf zJ0cr@L|o5M+zL@|C)3#k1d3_Z=atq>g^n+!^cv|H(m^V5>QHSi9fJB(BBJ+*>)Oe4 z?C}&F%oBkg`z>jlyQhg(yC%2WPRcH|(+^^s@^UW>8;%Ny2T$wyD>ituS0h&G6C2y? z6cWV@62;chLw0Ywoj&7W_KLR==jaj%K??3X-M-15nT3-K=((;23Msxdp8S_DG|)nw zVRCnmj+e_#oDjATl{VO$uV0#HpP^K|+0KF5Z@01ch|uwzpglI-hoE%2Ps*UinmRU4 z{A4|t>9nhfnWwPN)!UBwe8#e@Jo^bvWRQ&d7;u#&zO*5DaM87kWO1r*+pdRxuCSVd zsOj;)*u5Qu_rtj0t6vghh%w8$G@-OJ-9B&nO0lc$fIV&@txD?b*TjTD#3UrfMdM35 zb6*3F=%^8s{Fq*LmXxOdAb1UKnHhk7Z}zTpTUTEjlFj*xvP+ zaw+xbDvAoexp|}b{^}vxxgNYR%`Ua;tP4(m!w%6_b-H~Q#D#;PHU-MQ9H6ko>tjg3 zUk*qCkJ(9)TrXTUge^WFAV=|!7CpcBW;&{JVfJFZM;m1@uwNaG^J3$&w$0A~j+ZuP^M10qZINBP?MGruQkOk0 zzZnM@a7@yVzl0(ls<6A@EQx=dlUBRjKKL#Sw9IcFBu*^*$MP?>84lRJrJ`uiF6|U| zRrJ71s_V6`JpHb_P%RxO`Sm%QL}FL3eGnSbE4EbZq0B#=)734$*Vyw=asKoxr&(8? zkvj`VHuoHOxSr~ObN9J}oqe#_{qKp>hPIRz&suJWM9G1C`~Az?#rtC^o5T{|%`?cJH!Tp5ca8*>|1?7nV`Xvcx>bb+C|7)NW+S%DgS zcT-qayi_(M7xC#&5C@WtZ3NAyKO{8T(Y`lZhW>2nK;pCyvIUJv5g@Dw?O9)`d;T+U zo|FXJXs~$2Xc^)a=cEv#s3(_kq-dvSBkA%KTZmMYR((A*7;|Fs`U^1 zJRC(DMaNc8?|HV(UUZO}E#hRWuqmuuUNAT|ZkwHJ_g+e89eWmDhO;GKh1ZPEu1m3d zVGVHV277ebc^{=`&76smC6Cis_BrCb!6Thp_Tuy;{@sIrBKH7J{?uZXLPr+8_Pf}M z27d=I3G|4&Hqe2TeI5$Ic<+r1#@X)?mkS2$W6LNw-+@hd8&kr225)WwHr1)|9bvS5xsHAM5M}i{&CQ4X(Ht=T|1SZV(F!YgW?c#W&D7 z}dv@h;ya`FykZa7Sl?Z3`>^KfvaxQff{@Ra zfg{Xn}fc#MwKq6|kn@P;{*SF0eIee2)zN56DJon=M9q^XuY?lF53 z1vf1^Cnl16)L>buLVSDizwdMaulhW!s4IDNZAVJ8da^5JWWJd>0fLS|n zgrXM1-T&!QyggA%|Li_72IuF*BV+bJ!gp6}!sPM6IW)iBRzXhDyXWj&*xvcrRPmYi zLAwvx?>CTBdhd9g`c9i^(zi?Jm7ghxwFXvXoan^Kbny>Q8eXSBq$`IU;}^*ny#=p6 z*}V?{WoGL=I8=Fs{dz-gpuz68t{+!8V<0~_+q!(b>g&Z&zO#q+!tunkiAh8>SZOpr zh_2N;?NG+0bMeAPEg4#Pq(z@TB0@otT!VF9s(h)T!A`s9>476Sw)22kMMuYNL`v55 zi096N6NCo*xk4U?+;&bH9n1{`XCdzo71YR{bI5D^Z3TI4+u%`*?y76czGde1*5%TM z!Xw`&-fbJ2Ms1S*^V0-cdzwnYSJn@brq)3(5kGqRX95T1Xc_7K5WY2 zfKX@d66zZHHphrK#O}ykkFd$UjkrRBauhe()5K&s{~%JdPdvM!AM4VTZAw5B#0>~^ zb=Z4Cc$=dehdK7(ovHyWHt}*JP6em5bz>IZv7x7p-0Por*qiL$0(d5&0?@~i?Kmrc zLT+`sHD`Qhr~Rd?>|cKx`QC%rSp33UfGjxb$v6gjVG>TVTsh&0eF0t$sk5>Xg71Mo zt+_O}_exk|vM*jykJFIi(oJGXj`+stJ;$Ne`_A*-WmXN3UTm4j83sGO>p7Y09*Ce$sc?NO2Mtg6by*SUh2>mc~RY;85X=P3vScI5o zol+~j%^*g@BgV2=bqHL)zl22D9&AaAwjL;$JyVedqbZMrzIM`SBmC)Y3ftgc2 z_m!ohpuacw7|w267f&2mGIiSWhecA4D91$l2G)@ei@Kf%#og=e{+AZavY(GRgZ|$8jwLzQ- zrM1snVlNZFUXR7c%&dkm@A{kYuAkfX9r5${;1C7j)}}qZc{9R*=PYK5)Yo^#bF^5rri zJ1DN`7sYAzl7r&1eo@jdE)5<$bg<#Rb}Z+`;q`PF{Q)jU z&6c)|mO?)X^~?>4_F%~F%uZj`D;^(B$AvFWf(b#VHu270mP zs=2!tL$BYOIu7skTIZh;y1Q1qG|E1Jy@^mQ4lf+Qc}Y?07t`>H*^ChU#_C>i>P|Y9 zY^9IeEB?>T)=V#6cDu&gXDGquiY~szT{2Yb@xC&@Z-(v3y?ZqSM8p zo72Rv+A;7x7>%tCA-)}?N#>>a{w6Vb4~{+7OcmerrifF!9uMukKKBp~HLf`_BUCSf zsHR^WTR&)L_gYgi2$HhX>+DB+_jPyn!NlRMs%1T53kGd7y;*RkbsbKi*m%3bx^kR& z+roR9S+hc+>+|hW>~V@cH`Rz8Bd||+Q_b58^1mP+9nmEY-GtbBXX(S@o|`s_cSiW_ z40t_ja?X{HC2uU5D4_#I5W7;*EA|HEf7Doi-2Nq16j% z5Uh1J*@}b=HLwk5L3=K-kHz+It~_uLtd}+=0%{Q0SYBuE_i8 zfc-|GEtLCRgi+-2wb4D+<>;jiuoBjkB=I?{8&OkNJgS09?v&=_1$i!WXCSQ`!rY1| z%0be_zad0$@TNgTEAf)a4K#gKEU!So74 z8N}8{r~qe%aOCV~F!ZHMLgG)};AU}1Sh?1fgdij7d&p~ zwpE415ca;j1LD{^KMuRsh>b!YAyk9VmU{*>NR-k?Ay|BEF@3pMGnm#A{L3l`s^AFtu;7Rvh{ z(TdiNAa8vH31&na{i&`O12@66*%yW|4Ua|LH^MwpnjEK2Cp7%>VQmBdKFsz=V=R9F|v#une@Y^cEy-)m zYdGjk-;^<=t?3b40m)bAcXV{n6 zolCGe&;yBGK<~45;bd#d&^r4(7$$pCx;-vEfBHg^fF9aDU|l#aqj+_9cBtVQu}{!z z*y7ktJ>pMzdl)Yhi}5M;(#L(YPdb0_Me)H+gW|~mh~|l(Cl1+9EV~i&Us~JZJh2zr zo@njEmwDyA#zjuG^UYN-%F>{u(Vm8J|(wa z+^}arzK45k7v2uSocHj}pysjiy}9CHFC>6I?}2LfIOIEU0fzW+-5$JbhKb~_3hA!( zJ-uz>fks%zuVFbb7q0@KveowO;w`)kYbTYa^64 zEyHai4S31y`u4z;_6k^&Ca^uWrW9sy&mpu4@9x8};jM%m@e5B{>45n0P5r(0gRhCk z8tdw$8Df0TKwZfG**6{_7i49PxJ?Xhv-jHP?b}gnC;eEQF=S7k(pj2aE8g*d&OG=z zGt$HyznDpHTKH)b|J`HQW4gv`x7uH!|90#Urz0$#&|`nqnwB8Gz0S(;ihD#4&e2cJ z&aK_I<5=iEJ5#*3c2FD}XSx1{i6Lc{=I~M`;gviziR(Le&dOFex$vJ?C~?W zY~`OMnY%`yNp1Gv<*@Qecq0Sh>C@n~^kyI2f~W_c#miGySY**GaHZ{kd_jJlJ$1mY z&b6-&1rBD@n}bmBcc;SCLs2&`c~HK?K^-OXF|42W^dH0P<8)|sTXBOqY?7>6@1Dy25vzuX9C>kmoTuG(u|JuYizJtBaJsN$HE_-^9?aXDF*r;@q` z#P&u4tL1c*NN?%X63QiRW=@c+07 zJ++mUtIO+~PAmiGAOnOGE)Wtya;6r+IB)*zQ@@dauR70!cCsC>hH9|j|Q*nTs%7cMmc`GR# zWav_)i=|S$FpLQP1(yExapkEElm$X9EzOcuYJ|S!3tWdEVL{S4!V*I(4zpHV>3!%Q z_bx?@NL1~4?1s+Hy2Ytt)E?}oq|BN1SSVyaPsc5L=Ijk&MynG^)~B)f#hnc)H}#5k z9Hrb zF8hk5*t_aqwX1F^opbCs5PGKbvMsa@{yr%XK2|?we`R>~$u3#_~)+X`Dhiu$oo9pw!Dj__G6D% z%&HNYelg2VUW#*_w~^6+ zOze;bamJg@7m#ChZm?Q}4&aT(o%Dk8So=(hJ~!Dp*lNV;x&}8*97w+(;Lav70XNKa zBCwv1jmsJ_2IslXgHK=4lPQn(UD@f^h>SFxm-bH!QJnXQ4Y+~lz^<<@3yI}JKf;+g zKf*PyuO1M_M#*sd4YTmx~ z)IYwHTZ+ZXSiEV9vn~5@UB%`y5gNq3a=6g4en?z%K;-Tb z$p;>PI=AHZ)`4Epd;pzEG46>yc-!B)402ux30t0}|6VzJAhFdLE=ppa23bedzqyWZ zQ$3}zKESn|4QX4RAO3r5`xhrj+@V@s$%~njH4$NE#hk;{qd(cFwFbX&G|JmH<+e+o z5I3friD0mO+Zk=$+3)Y#khOB^tHC*OL z%#jnqTDoHuZ+v<-{ZZuRi0L^Zt7g^`n<$B^{TU*E2rq=bjDegZ4q^UyWJ3xfI@q+b z(-w6R`|CF0PM-YsCH6M>No#YmiczyQ`AqRo1g>wze$n67r-<9U zoA4Gbjvx&o^K-~tlL9aeZvx`7oguLiBsY0;Py~G7MF?W#BmCIkl1`lY{1u8kiXw=z z{R%~1M3Ks&{I*)WO_+nWEhOa6;d(^G)NaJ4)DW%%qyrva913bLU2ECU_>k1bf47%5 zr?9xJre#{HR(V+JmSWvkqu}9?dq|5*%k$`egks|M;A-3(ye6hi3sXSp3UfnF^Ny2m z^wQX}Jm39KX^68{cG>2zb~v{d>yflyH)^74QkR@==KcHpjMeplPjEN%$6sB`dwxB& z)j@hwv$>|KTz74R%Nq6y0>t3loE!Fb=kOwQ&uCO=EuuBXjnVXU1m-Yn&FL^za5`z@ zGWA&AU8xA+l|FXFu6>UzQmr_x$3M#+S9gL&6dDyJ`h|*x3v6PTBE(=PM5JewC8_6 z|9_CcI5hGjd=NG0NFH;F-3JRnpR3guemzFLo0PB9nF)!V*4%{Dn?@%jX8s_-&Wz7i zfPTJBfBST~8FF&)cxERg-f7KFIP(sXnUH+zh|Gjbwv5b7NZlNlnJ~Tcl(`8jts6%t zOb5l(%;yp=$$UN`IrD{tGiSe?kU0C51Uon0`sQ&SXU1C_kMnpQeiqnt;E+B;%hVU)fqQ8!Dls%20K3hJI{fg=M&BZONn5~o*nPGK-1fwr06Zu zX%t&LI>DYF-;iKa*74-K5UZk$kngR;&t~GMbHtoeuOGk4Bnek-|&IK-&KdQ@j$G|0&6T6q>LhMrRL}%j!#qZa{>7boksGXZh?wuncyR5NsaaOe=llj8fQ@mM< zrRQY=Wtp$kGZejB!|4sjS6KvKbBHgJ8}YSU(-|F32W^?B<;ZyZPZIC&N#Y$nNj%S) zs-5_q1Nq^8o~!x00=d+VM2$yj`fxvYin$3HkgC1>2P8uL_?5!X(D=i(o9X&A-o=ut zrVIHLjV1=N{pqX$+A%8@2y#?x>mXimJ}8i(B9!JkpbSo5DBS-2tX%*{00G%~bD=wE?Ia!rkJY2adU5=ClpGN$n zcI?*WzVh+f;fZcXPP~;L)wmq3&PHx4FHn3wE4gsw7JJ;zP3ZDs+$LIG4rSST-3qL< zbUTtSRCK*^jpWe1oBHD}>W@1|&Q3_ZgZg6&^~YvAGa;*U6xV>?>Ts%<{p#!=QZ?Rr z@z!r*WTSR7&Mr~)=7h^Ha^B976x0B$&OcI zk`p{E5s%Z|n%-&`y)e6yYebqKpTk1p@~KxSewMq+8#}ljrIqnRSppPdF}|ohUAp{j z;pK;u?@GxD`#p2GN!kyR@@6?DPf>hr4W~PdoQf6Mm~!I&+pg)gyXb|? ziG|KM@-9+yx>-+Lf%3#(;&esta5z2mlXbi7pxN=(BH2>XAHqMX@mFdGn%i@td1paF zmj(Uo!dv$ds-zV3bThxr)%E!1D860^=L`12_yyKi&^mGq=EajiBxr7Yt^!bo<{9EQ zd9I=}yx(KZW*bUXksYLRExO!aC=(xU=kdph^+?o^z?zvpG`=O>d5WK`@NohAdSdzQ zr}6Exeji?glHMptkLmB8ujucSwK{yCi2mFJWk0N2qv?wUYW^qwyA~+=$MIj4`Bt`; zyf?Lo*FBu3<&c`C=v*7lr|w_5Zew>nj}+ILr&teLbouwf%O7VwvXP|cvF>(SCyCCF zcdd}HJdhM={LB8zR(!hGi)8LN-avR8HD1KJ4()N~qqRm93&Z?t?zh9b{O?Do2C=@K zsNWVO9Ho}Ei2sgZ_fO4^=kc_Ep=!sA;qn@0{*ClZQ~{Pp-=gEogX`O_@jhvN8+|8N zUzf)Fr1h;VIDUOqtQQ)Oeu9xc++VT%`UMFa1$t?tB~rqyA8FwEbK?smb@F_vfy2!! zWVie9kbf9~>=k`v{jl3*I)1Q9>*v*YM)(;;s$CI&U4(vGHyH&52Q*Hp+_6`ex~YI+ECt_K3>+idDU{KDIxjRzhMyn84Vd@y?H@`H<*$Em8DwY*2oV-w$&W zS`e48tlJ_*?#+y+aY*#~{EA+&i{6RGp;=c=jK%NV_@JimS*qx-Q(`iDb7K12X`H8u zD@HiHvphy(#s5@{Yy^O5+)}$XmZ^G&i>EPO*9q`g?tL0B!zHKK`pEI&vu17(d1;w``Qtz=5YX-Phb6^dT(Nzf}$ zt&kKl{ziD{xVz5D=TW0_CaQzAD8>#Jmo>lrQblqWD5> zml(h6B=MQw{ThE#xZXw0V``K??68RN(dw{NW<2Zr(Q3sn&E@oAJ32@68AKkn%TuH9 za7VQKoXE~7e?xe~tby$AxiK7$8x?0NCJL2+yCvftQZMUNy{lBUioXcEtxA(REQnWu z3WBv-dDfvE(b=f!><*V3{H5djvtoQ0|2lq$7||SuVH4D&P-^6oMY6zh&S+5WaId2{ zp3itbjdw|Sd!av-x<43i;|cKQ>UM9}cx2z{Bl|5ve$A3`l38}V3h0H)kLycZrT8bk zr4Q>#iPY-_W!e^P7jHk_I)2HJ-I&940ASHk_T~AAss>dDwG4@dIevv_p zbog2Ro@P~kIK5zdlB)5>hRYwk&zJo)Kc4+|)(@Y?pLsIv|5il%7t%_BOvAA2|8wD= zv?#u}hw~FdVG6heVrw2whQLOTQpThnwGiJ zUn4%Z2UI6!=0Vaa#$Te} z*RI+>+SQMD#Ig?|?kH&=^5d-*Or)*yR|02aY2c1*14tSSm~E zft24GMemO;K2IzMz0No%h8|$t(Rd*GKK&~M?sZTse&t~T9cde`--&MBWb~h=>)!7) zc9AzLbK)1H;bb7?P8gT>tyAsxx#Vcd)3zX$njgPV0Sb}qCDq@j%P$Qt54~F_^(`~r zul1bqJvXcRBK&mV*Gl|(2A}kr==(H&sf#|ZQ~k2sTvLwpgUW5!1vMcE%|H`jzI z#N7DBj;>Hq<~w=4;@j<)E|&Grk6-L+=Sq#gAiVyt@yPgO?UHxmJn8S``-^t7r7(s-wOR&G%3SnsN5xOJDZ(3wg^VY}{1OeVv~>9D5nZa2s6 z-R(}@sQCH1Yup{5pIf5&aplaR$rT@#@8MfiJ-wF7XFGTN`9wSyF{(+t)6v&XUD|zB z^DD`B<7QRQ7*&n&^Qb7T5r!Mj#OL&jFyHI)p9?R4LOPp&Dp&5;5q-~{ivB_u{o{@= z@%1pGQgab;s75!)b)i~zl81Z>;uJkXcpEJIo=>NAIWzIMZi~HOoIfNZLbAEgi zX(fR)UrIgvqADMu=dcH1<+qsf@Tr%W!~%H=N>Q6H_X~*L$}cH;9pUnfnt#<8`J56R znF&OJRRe~zlNaFe%F7YI)_4D(9o}BduY6vP=550B+^6`M;=(JC^LB20p0>+OH&x?L za^bTd!+1W8m+ZnTbjZoZi}BF+h-J$)K)xOfxUWoq|!jW_&yncYEo z+*IvXqg=*Ul)T*Y*8<%xrti~uH@MnwWop5y1#>1ZIJn$)UCur4gz4D=qgojMET6>t z6<@=(oAHuQ5-(Nbx#I!luKrtjl6YMwiMLzh&2Y&r=&IM#quP5Syo?jz@i^G1@gn?u zjF$@8U321VT=nnQ_z~-sF#nbN)7Pu`yeqstk#?goyg$jF%kitrz3G~lPBicFKC?J2 zhCRfDk*4YIe^Bv7Z@SSZ$}h3*09)jk%!@BqfW+hSeGh%I@+}Xm@)7&!k#bRI^dR>$ zv*N4S9o+MuK z*H5m!zLUh;sPWwM46lz^5Bg3(Z!WZ!#?yX{m+Tr(cf|0g#bV>$kq>YQ%&a zq1s7rA<~D}NyGVzDhg(OS≱D`nl98gtUox23xjgKn2$KQ8RtIY$7m>iwN8-2)6 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%0A6nq}Yq?12C03zd9q~}o} z8EZ?V{w7jRJ|9*KpKVli0TN6sjn^v+o@)*uQtDdQ)7Fh1XR}T;p9G#tCmM}F12Sf~@MP9-+z^f1fHXKG(kFmSu8s5D3nT~4QEq$X2a zEB{QStaZ`+Cy{cpr2^ml%1^SJY&i%B_u>pP2gs-s)g?g2oIG3&Bm?Ueuwta%1%#gy zpAqyGOxGQB>V7SFCI%RJ@o-oW$LG%gks}&KzX7Ddsp;cDp0Iil=l)(S-xy6%YwSt)#Kq{TN={z7qj`a(HxbfKxgge_Nquv8#mz4_F z&lrCiVBPe=yeyt|&IPD--wvq}E46l``2rsE+2oA!d=or@)25FD8FYO9H;~y*d(C=1 zdWsXVBZ0J9J;+1p?m?>)u@k{FYW)#EPXaRH=s69Dd%xTQWVe%tYk;&kdIo^ZvU34K$bi0)dFO$!_y9= z(zX}W2PGhbppmW1fs8wMtTzJL<@DvdflN65d>e?&U(sm%OCVXt`kw@`vv8Qt?Lc5X znp0-uTh=;(V0vQRfy~+v_pk~`&e6OA$Zp5_dBWq=v>V9fcGiRX;4&a{9iHof6dmL? z(PMoUsry9=G^*(jf$(=LObb2*L{>5pPX)dYENk0+?Z!U*{tnh-PL3T2p52br;Xt;+ zR@6FkfXs4u-YA-#@n$-7AWm-d0_k-0T%uA@u6_W>7DwuKhi7qHPkW(zMKAZ~ zjjj8@)9U#1T_8IhJwFFhbXxE!AcOktrbf@RKxRAbelWf_Yr@XUc?>sQ7;k1dnqLQ= zQ3qKJWT&;2H$UqdWE`Hez~kPrb^@t%W}*Qg;#m}*_W_Y3LOu>;ixbt)0$J{4=EFd? zS|nfS>+9(af(FN*KZ_oltN1Ni)Eaenvjx8dTxsJR{va}V>Owsk?K>|6Pu3aL=K|rg zq!|H1h_7wMxaw%G0Z*OvP%JM8(rWee_u{t?3w=RDD8+tyHh2OjV(WoyvU=7Q2l`83 z8Fy^GTcj)x%E665+_v~UkbgRJ!PiA9JTgI-{MV_gRjeiG0~ zy%PwZGtLM$;0vJT%k%0SpRWSXCTqQ~t*cak)-4XtHt-a!^|gHkVF`9RJa>Ud<^tpM zmvA<(qp)URUB0cat!G`K#M7>xwY@C2ty$Ao*ub;yuATzRYy0GrsHy>J#iDFrDXMDm zz1R8ny!-%}{>aXpd3}Yo#s0o|dF`BQ3hVG4v*x!)yo*@!m@TdqXRK(#CUCK@7ZZ4Y ze_MNJp~Dx#FQRsBzz-YAuc8hV%|5rMIl%;G49*@`$L5}J$5LF+%bod}Hf)-EY~fvE z8rqh^D^D(bURjak^ZI4G*v?yRy!ScPacsTF7xm_G(^2Z}38oY@KNZ$iEav++7g1C5 zJ8Fv-v8DFV_ra=qOY0k?J4ymC5rPF1OuftUHSIjo*w+T02FNK zYWEs-Bee8xEajyoC9y)0@Wzb-A=1%RO6Un;?9?k;e$8h5c2=p>)!UQr>Ik~K)_@@| z*HOs#46I*+;WCEGFUO|AZGG~{CB|sn&bM`R;M?L$DOXCx0@7Y3(2wZ1r-MAWr^&Ys z^!I{M`b_@9LSIjzJKxcVZeo2Drm&eP)!9};$`{+#bai+2Z#Hr2?p>GP5XiR)qrh{vTok}>Sr`DM*# zEN)tH<{9}sIJ4O*W2@ALPSsH(n-7NwHtaBI8P4fJ9B#*pTT+xC`J-7{~M4QhLLTi1F_Js4fqw)t5! zf4=nqzpsa}w6G`MI(jP}Se^N{ZX}I-$#%~=&+7#-PbBi4VD^}*ZGMJ75K$)M=T}$L zz8SAD$`;zzd+9zOZLR4Zrc_xr+uY88kZ)_3`O|Z?1v%%V~zLGRWS3ic1`E_+cQV>0_JsMvNo3I2)s9BI* zz=~mE-rJWCzhEOaUSP7eIsf`*evv8@mJ)ln$5_jMKfd;5aE zwvFLw9%HlNPdK-*4xP^RcVS&!jR#?@NpfZ9n^8fhlXh7w#cd~+Afbbt6JwQE@tD&| zL-jVpr4O6r(b~lACB*8pj+m+ap7^V3O?{$)0xi%{*d+7thPLj3WWp}2pKseWCKFX8 z5{!2i-;r1_O5wBXaQ%TAt}kMS!t5WZOg2J&jqTW`Cr%|F_he14OsY0lVs0d^BqLi_ z<@r%-M=lA4EL7&_v$%i6YX{*1CT1t8t=^9MVHNf$8}kvN5>}giTt~#KX6=x{ zXicdiW)Usdj}cYBeo138%<@v0$rGYi;aT8LObKyeI2-aNc4ITtw+ors5 zT{YHl^1GS&@RuUwu07##ea*t;y$Bko3qf%PYN`nrA-=uw{OCU$tW zi|j*?ONGtmL;?)MW`4p{G7e98lFhKdjwmr+<-&R_J+(UW*l}$~Nq>GdN+Z22?bss|x#m}*UUgagJfp{>vfAJ#rKo_- zjyoYYMCjmlnUpF?kDZIDV9Z9UD-zP^PD~QnL_r4x32~TyxRui@p05~~Lzb@Ia1mop z`U>*?Tse`2HC7~C&cq_Djo?|Svjagm+K?^YH=_GpPdZwpql&0=TX(^DV9NOtwgz!? zi%5hDl|$W<&MT{`*frc<;XYo#Qc&95({6{QeEXV&@r4VqE_8WpM#lQ1n*j?K;(o8A zHy_Ha8R)*y8c1rdn{V@1rh&fRJq(d}g059^RVo-R|M~`su@TyYx3|C8jUBf2ZT-0O zMg@J;g`CO6tyq1w$~I)D>W%G^*!?MWi7a*-#WHB>cgdZ37I(IePce;{#LTtz16YN} zGSr-7l10pPYrsGl5~WwfrIP2mD;wH0LbCbR)o#}KJ{;#qD|N)&2u~d^LS#)}Z(B!u z8}6V(Z6T(wJVb!xQS7>mOC2GWSQrc_2a9uq&7?Pd*%xzo5G_Ahka zzHZsw=m^>|vGo`7F(lkdlpZK|i{T;?GhDIDY*iQed<8G7xouxpzpyHh{vHks{+%YS zYdaRZu)k;OX^gMcjv4xf6XQ7c!BEyrKt;@XL$?>|r3U>nBlrxHWCZR^-#r6bv#lKhQ6>~Ed-enVV?x_i;-ov6f)?-0W zn+3buSP~CWzfIVxOzsl!N_%f{vmI&j;kN^KVkPPe7*wVU-Pu~+)v+YMtb3r;xoV(* z8yU%p-V)|$lj_lFINnF6$-Rx}iYT`?q_RH&Al#maSbV>tYvFr^5(XI(W9}H7E22{D zN=oG!X@4)NzNQYDBVj1(r;|YSwYBrHKm~uY#!0qpy=|zpMoh5J#};B#X)zmu@$+q#>u@;UQaGN;E zEL(~(W(|!dMA`6E;jSh{Y)=ubT99gKk1?%U;F@vzcd{m!;o~lqZ-FXo7sNUJ{*hE& zg+VPIq;h@ElfzbQOm2#tuF6)s>^dOE2d9LEY<;rQ-gaz#ZMGhRcg&5HZd#kITWE)7 zvp0qbKR_vb5Z|+IUVY7ingx~xqc?7IFlx(enaA(l%fo<3B`8cJuVD()!wk*hJ=lJ4MDXsI9WB<(qv0_TQ;+Z%3mA^Rw!v#Ff%!?uvJI zy&67l(p3tFd=8GrF^)HQve~sEG3eCP)P;jusKvc!Nk*@FenPf3i}X)&nK3d{hoAAo zGlSSH=knInV8@xBmJLo+>w(x_jFpqCWp^LrD*P?Y zaB7)y#9dfb71)PT;q#-;{r-7{AB3|yl6_G>wvX0e0bMfC>O%h+1M64x z;N6H*2G(M8D6w%+Ut6=V+Dhm83gNbK#}fQ1nxMHnbS`cys#`g%JC+WQqnAj5S~+Hg^Yy}~dgT#_^D zx^C%dALx^(o!A+~P=Ilvx76PhjuK@Cgqk{xE{r4SsRLMe^E}tNxr9x(?j_M4DV+-+ zA-E}4TZNm#PAnmkqXuO(dEJ>OaWAmqjI$Q4T(Km7_KGu>ElIR_?Sci>LHLw49MBV2 zYih7RC+1VlBwWQPXGfJiO>PSo#upb3CnLYdjlcSudgQ6}8*HG%H@jj?IA1#-&L`qD z)mmUdY?yK8g{1DRscbkNX>d3kCRl6g7uMO{?#-GKT&W8Bi#%yZ3hGmqd0nNxwt09! zLJpzP<*@#;A6UW@nb;HkdFXci^Xh}er%Q*+=gf0@JzEk!lFqMKvdB6lwsm9)pVAi5 z&j*T2x*)u`8v`vwN|^l=U5Xb3jFJ`du8o@jH48C;C!lI95Gjm|m;3HWex*Du=GC}r zed<}V7vT-X^x6`<6VTNid1g5p!RMl^Fmrlxj*7g4+%v4YRHHM*{$nraLb?7v>eiN97+Upv3X3u`r=Vo}|fFdtsNn@+QAf8oRh>9Afh1 zV7gxPr^OU=>(B9kEA;8j2?S-N|(nx`F^7@lmHSqN`si@R5 z_O@E`VGTbbn#cQWeT8*Kq5}pyWTQFM7+@jjp3_;ggPYHXn>%@YN}{)Kvl$<=0bZP0 zjkm4fD?(i?bS&G!xTgtq{=hr)KTIENpV4nsH(PbBbI#A|`Z<};dBoW3-lTfMY- z$(i}ar7O=|Y~B%Ddd3pGC-yu9Qkc8eW4(blzVP&2UO6+_w0h}svkR@yEF^;Filjik zVAk5k^-jFC1lQqvP*^{ZFNV82QZhd!oL|>7fTyY2W=Vax5t4}D1&GZiB^f%kC)e9c z0WX_(fAWZSZMAVo7~~lOIq0Yn4C4yO<=1BjNs)Zh%GGuoxL7I-bo8DWw$h0*Y2hcE z^B9liJLn24Bxa`|WY$~nN|0ZM?a$m&ZU4mSDVxub_d^*}%qz;bthaBGzTDkGYWJK8qOd30iu!hzs-DQ|!28s_AcMw6-NT(Nf<^D^R? zZ!4UKZEkrXH88(T9-W5S6rF}+)I3aFcy@PcGgg~RmY%iZjHacH%N8wOiav2l^XgNw z`DH6s0+MDg-*qI{!?7{)6tTyXh}d#lu7`sk6vC*eTz7skFqpk4I4sdu+9Oz84BIw-!(t07(bA%|c-a-x&gpHX z3j@F_@i1d)_!tc*k&BB;*2QS#!e(!2pjRH+;&nGafsj36MlD{7YN0iYrLg~(OydS; zcXUT=9&vIxXUCO`Y)gO);dIu-V?SuYwASPd_=sx6E6<8qY=?Dy4p)f zAYFs@%ETvI%$Q5%P0!x7;sy4QkT&wN0}{B@qn~EO2jat>_tWK3l=#!TCck!|N7~et zmHVJRJU$Ia`nC&XQ9rPz6gF#~3oE&n$9Mb4_ldAoO@)@gN`GN7h84ND! z&ASVd1Txm1En$Jib>{0tBB%E}M3~g+?Z(Sg?Rb94dC%xVzUjznJXj&CBCHFXK`wlG zJmS|o@A6Sq# zmsjF3<4QBDEDEBnCwXD9#5WeDJtPEJu!#qo7MTZO$=7DM+D#c1%2b0xo~Cr5$%x?g zqsIoOQSJNwOueEFsHxk^LfZx}+s&m${Q?SYCsd-TtNlVVKS$A+su7GX{hEWw3)2Cp zhIQc}Y=pv_!R6s=NjCh+9T-#-9UO1UMLnBJ!+|InXQLT)NgYJPI{LE<@}|&Nen`Nl zKjgC;($b5=C$3B74Q#nx?uxHF=~uK87m4tLUT9)$)XBb_-U+BW4jU!2z{Z0-Y}d+t zL^yb)e-gwv5>?Nc#>AreP*!ZVAHaASpX=o-dVonE6Mp?rv^hb9&P1rq(`}4gm?nZf zOxY_IH92D)bjjCU?5XeOgK#{};eBnH-mx)*EzY+M;MPRs)S>YErOX*(ht(vzc#{qt z!e<&IoG+v?!WB$>;MGrLx?}qPSID*PHVp((e^LK|!b6KHB9S52|aXy zs6v!nw#Xtw^1A2eQ|Y1zUC;pi?tnx(FJ+c!`z;^O!&m64!4;pwVg~%Ck&(b z@auBocHylDH}&`*H%b}4og2+S_fX*;5kvtU<=}?cz)Q`l@@h5-KS*n2S2-QDHSr=U zHfn%7JW`wUX&9XsG=oMOyq4j;AUt;nD=)>gYT$#=EAR*4&o~?bRkWU%yUfrXuCc?4 zyHi}SML{}otgmG?ljCi}a$uNbjt%(of!c+t)6;DgR_9E^ z-@`3yiEVe068jxwFLvG$B464!X=SYFonLnNM5aZG*?~hc=c0Muga;t;>A_COHIM-9 zPV4VXpf%wP33_J?^>K{Bq=S)pf4u%Yg1Ev($6J_#4?j`vb|uDBYFBL`WrsOFQEfUL zCdgh*v%a~pfq?V9M11jlBdD%=UF<<3EJRake42b Date: Wed, 30 Nov 2016 10:14:27 +1100 Subject: [PATCH 023/307] Add new.cpp from Arduino SAMD to resolve issue with new operator pulling in loads of library functions and taking loads of flash --- STM32F1/cores/maple/new.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 STM32F1/cores/maple/new.cpp diff --git a/STM32F1/cores/maple/new.cpp b/STM32F1/cores/maple/new.cpp new file mode 100644 index 000000000..f18977585 --- /dev/null +++ b/STM32F1/cores/maple/new.cpp @@ -0,0 +1,36 @@ +/* + Copyright (c) 2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include + +void *operator new(size_t size) { + return malloc(size); +} + +void *operator new[](size_t size) { + return malloc(size); +} + +void operator delete(void * ptr) { + free(ptr); +} + +void operator delete[](void * ptr) { + free(ptr); +} + From 378cd2a6af43a360c5a7d20979863150f516f5f7 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Wed, 30 Nov 2016 17:27:21 +1100 Subject: [PATCH 024/307] Fixed #231 --- STM32F1/cores/maple/Print.cpp | 4 +--- STM32F4/cores/maple/Print.cpp | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/STM32F1/cores/maple/Print.cpp b/STM32F1/cores/maple/Print.cpp index cd371cb0f..76f386b78 100644 --- a/STM32F1/cores/maple/Print.cpp +++ b/STM32F1/cores/maple/Print.cpp @@ -126,9 +126,7 @@ size_t Print::print(double n, int digits) { size_t Print::print(const __FlashStringHelper *ifsh) { - size_t n = print(ifsh); - n += println(); - return n; + return print(reinterpret_cast(ifsh)); } size_t Print::print(const Printable& x) diff --git a/STM32F4/cores/maple/Print.cpp b/STM32F4/cores/maple/Print.cpp index cd371cb0f..76f386b78 100644 --- a/STM32F4/cores/maple/Print.cpp +++ b/STM32F4/cores/maple/Print.cpp @@ -126,9 +126,7 @@ size_t Print::print(double n, int digits) { size_t Print::print(const __FlashStringHelper *ifsh) { - size_t n = print(ifsh); - n += println(); - return n; + return print(reinterpret_cast(ifsh)); } size_t Print::print(const Printable& x) From ed82be4c6e4fbd1e6b393fdd598e36f62cd9d22d Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 2 Dec 2016 10:32:17 +1100 Subject: [PATCH 025/307] Updated Linux 45-maple.rules See http://stm32duino.com/viewtopic.php?f=16&t=1103&start=40#p20732 --- tools/linux/45-maple.rules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/linux/45-maple.rules b/tools/linux/45-maple.rules index d1bda5fb1..e53d9690b 100644 --- a/tools/linux/45-maple.rules +++ b/tools/linux/45-maple.rules @@ -1,5 +1,5 @@ ATTRS{idProduct}=="1001", ATTRS{idVendor}=="0110", MODE="664", GROUP="plugdev" ATTRS{idProduct}=="1002", ATTRS{idVendor}=="0110", MODE="664", GROUP="plugdev" -ATTRS{idProduct}=="0003", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple" -ATTRS{idProduct}=="0004", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple" +ATTRS{idProduct}=="0003", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple", ENV{ID_MM_DEVICE_IGNORE}="1" +ATTRS{idProduct}=="0004", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple", ENV{ID_MM_DEVICE_IGNORE}="1" From 2e54594f46255653f6588ebfa312d0d38d93ac47 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 2 Dec 2016 21:24:13 +1100 Subject: [PATCH 026/307] Added #define LED_BUILTIN to Maple mini and generic_STM32F103C --- STM32F1/variants/generic_stm32f103c/variant.h | 2 ++ STM32F1/variants/maple_mini/variant.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/STM32F1/variants/generic_stm32f103c/variant.h b/STM32F1/variants/generic_stm32f103c/variant.h index 52b39a629..4a9cfcd19 100644 --- a/STM32F1/variants/generic_stm32f103c/variant.h +++ b/STM32F1/variants/generic_stm32f103c/variant.h @@ -17,4 +17,6 @@ static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; static const uint8_t MISO = BOARD_SPI1_MISO_PIN; static const uint8_t SCK = BOARD_SPI1_SCK_PIN; +#define LED_BUILTIN PC13 + #endif /* _VARIANT_ARDUINO_STM32_ */ \ No newline at end of file diff --git a/STM32F1/variants/maple_mini/variant.h b/STM32F1/variants/maple_mini/variant.h index 8a88623e7..22a77ceb6 100644 --- a/STM32F1/variants/maple_mini/variant.h +++ b/STM32F1/variants/maple_mini/variant.h @@ -17,4 +17,6 @@ static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; static const uint8_t MISO = BOARD_SPI1_MISO_PIN; static const uint8_t SCK = BOARD_SPI1_SCK_PIN; +#define LED_BUILTIN PB1 + #endif /* _VARIANT_ARDUINO_STM32_ */ \ No newline at end of file From e71d176618b8b77c727af0891343a278246016fd Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 2 Dec 2016 21:33:01 +1100 Subject: [PATCH 027/307] Fixed issue with tone for high density devices --- STM32F1/cores/maple/tone.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/STM32F1/cores/maple/tone.cpp b/STM32F1/cores/maple/tone.cpp index bfd4c0386..2bb11e5d3 100644 --- a/STM32F1/cores/maple/tone.cpp +++ b/STM32F1/cores/maple/tone.cpp @@ -34,12 +34,13 @@ HardwareTimer TTimer1(1), TTimer2(2), TTimer3(3), TTimer4(4); #ifdef STM32_HIGH_DENSITY HardwareTimer TTimer5(5), TTimer6(6), TTimer7(7), TTimer8(8); #endif -HardwareTimer *TTimer[4] { - &TTimer1,&TTimer2,&TTimer3,&TTimer4 + #ifdef STM32_HIGH_DENSITY - ,&TTimer5,&TTimer6,&TTimer7,&TTimer8 + HardwareTimer *TTimer[8] { &TTimer1,&TTimer2,&TTimer3,&TTimer4,&TTimer5,&TTimer6,&TTimer7,&TTimer8 }; +#else + HardwareTimer *TTimer[4] { &TTimer1,&TTimer2,&TTimer3,&TTimer4 }; #endif - }; + uint8_t tone_force_channel = 0; // forced timer channel uint8_t tone_force_ntimer = 0; // forced timer From 3759f2e6ae48892449d29ef84f135f9ae9090163 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Wed, 7 Dec 2016 19:55:44 +1100 Subject: [PATCH 028/307] Changed Arduino IDE version info to bring up to date --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 70e20006c..019cb2b26 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Use of these files is at your own risk. ##Summary: -This repo contains, the "Hardware" files to support STM32 based boards on Arduino version 1.6.4 and 1.6.5, and 1.6.9 including [LeafLabs Maple, and Maple mini](http://www.leaflabs.com/about-maple/), and other generic STM32F103 boards +This repo contains, the "Hardware" files to support STM32 based boards on Arduino version 1.6.13 or 1.6.12 (some older versions may also work) including [LeafLabs Maple, and Maple mini](http://www.leaflabs.com/about-maple/), and other generic STM32F103 boards ***PRIMARY SUPPORT FORUM: http://www.stm32duino.com/*** From dd453357b337d5a888370f708eb304ecc6603ec9 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 8 Dec 2016 20:00:20 +1100 Subject: [PATCH 029/307] Added shiftIn to F1 and F4 --- STM32F1/cores/maple/io.h | 2 ++ STM32F1/cores/maple/wirish_shift.cpp | 25 +++++++++++++++++++++++++ STM32F4/cores/maple/io.h | 2 ++ STM32F4/cores/maple/wirish_shift.cpp | 25 +++++++++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/STM32F1/cores/maple/io.h b/STM32F1/cores/maple/io.h index ce5446108..5c8ab0e2e 100644 --- a/STM32F1/cores/maple/io.h +++ b/STM32F1/cores/maple/io.h @@ -160,4 +160,6 @@ uint16 analogRead(uint8 pin); */ void shiftOut(uint8 dataPin, uint8 clockPin, uint8 bitOrder, uint8 value); +uint32 shiftIn( uint32 ulDataPin, uint32 ulClockPin, uint32 ulBitOrder ); + #endif diff --git a/STM32F1/cores/maple/wirish_shift.cpp b/STM32F1/cores/maple/wirish_shift.cpp index 2825507c3..b5aba0c97 100644 --- a/STM32F1/cores/maple/wirish_shift.cpp +++ b/STM32F1/cores/maple/wirish_shift.cpp @@ -35,3 +35,28 @@ void shiftOut(uint8 dataPin, uint8 clockPin, uint8 bitOrder, uint8 value) { gpio_toggle_bit(PIN_MAP[clockPin].gpio_device, PIN_MAP[clockPin].gpio_bit);// togglePin(clockPin); } } + +uint32_t shiftIn( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder ) +{ + uint8_t value = 0 ; + uint8_t i ; + + + for ( i=0 ; i < 8 ; ++i ) + { + digitalWrite( ulClockPin, HIGH ) ; + + if ( ulBitOrder == LSBFIRST ) + { + value |= digitalRead( ulDataPin ) << i ; + } + else + { + value |= digitalRead( ulDataPin ) << (7 - i) ; + } + + digitalWrite( ulClockPin, LOW ) ; + } + + return value ; +} diff --git a/STM32F4/cores/maple/io.h b/STM32F4/cores/maple/io.h index 1cbe2d953..df1ab969e 100644 --- a/STM32F4/cores/maple/io.h +++ b/STM32F4/cores/maple/io.h @@ -218,5 +218,7 @@ uint8 waitForButtonPress(uint32 timeout_millis=0); */ void shiftOut(uint8 dataPin, uint8 clockPin, uint8 bitOrder, uint8 value); +uint32 shiftIn( uint32 ulDataPin, uint32 ulClockPin, uint32 ulBitOrder ); + #endif diff --git a/STM32F4/cores/maple/wirish_shift.cpp b/STM32F4/cores/maple/wirish_shift.cpp index f67364d1f..57ae94eaf 100644 --- a/STM32F4/cores/maple/wirish_shift.cpp +++ b/STM32F4/cores/maple/wirish_shift.cpp @@ -38,3 +38,28 @@ void shiftOut(uint8 dataPin, uint8 clockPin, uint8 bitOrder, uint8 val) { digitalWrite(clockPin, LOW); } } + +uint32 shiftIn( uint32 ulDataPin, uint32 ulClockPin, uint32 ulBitOrder ) +{ + uint8_t value = 0 ; + uint8_t i ; + + + for ( i=0 ; i < 8 ; ++i ) + { + digitalWrite( ulClockPin, HIGH ) ; + + if ( ulBitOrder == LSBFIRST ) + { + value |= digitalRead( ulDataPin ) << i ; + } + else + { + value |= digitalRead( ulDataPin ) << (7 - i) ; + } + + digitalWrite( ulClockPin, LOW ) ; + } + + return value ; +} \ No newline at end of file From e7456e191650dc54b0fa8e7b95670f5621356265 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sat, 10 Dec 2016 22:36:21 +0100 Subject: [PATCH 030/307] further optimizations - extend read function to 16bit - add repeated write the same byte/word a specified number of time - revert increment option to dmaSend --- STM32F1/cores/maple/libmaple/spi.c | 26 +++++++++++-------- STM32F1/libraries/SPI/src/SPI.cpp | 40 +++++++++++++++++++----------- STM32F1/libraries/SPI/src/SPI.h | 35 +++++++++++++++----------- 3 files changed, 61 insertions(+), 40 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/spi.c b/STM32F1/cores/maple/libmaple/spi.c index 64f06d301..e0ee90d42 100644 --- a/STM32F1/cores/maple/libmaple/spi.c +++ b/STM32F1/cores/maple/libmaple/spi.c @@ -93,16 +93,21 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags) { * @return Number of elements transmitted. */ uint32 spi_tx(spi_dev *dev, const void *buf, uint32 len) { - uint32 txed = 0; - uint8 byte_frame = spi_dff(dev) == SPI_DFF_8_BIT; - while ( txed < len ) { - while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty - if (byte_frame) { - dev->regs->DR = ((const uint8*)buf)[txed++]; - } else { - dev->regs->DR = ((const uint16*)buf)[txed++]; - } - } + uint32 txed = len; + spi_reg_map *regs = dev->regs; + if ( spi_dff(dev) == SPI_DFF_8_BIT ) { + const uint8 * dp8 = (const uint8*)buf; + while ( len-- ) { + while ( (regs->SR & SPI_SR_TXE)==0 ) ; //while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty + regs->DR = *dp8++; + } + } else { + const uint16 * dp16 = (const uint16*)buf; + while ( len-- ) { + while ( (regs->SR & SPI_SR_TXE)==0 ) ; //while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty + regs->DR = *dp16++; + } + } return txed; } @@ -163,6 +168,5 @@ static void spi_reconfigure(spi_dev *dev, uint32 cr1_config) { spi_irq_disable(dev, SPI_INTERRUPTS_ALL); if ( (dev->regs->CR1&MASK)!=(cr1_config&MASK) ) spi_peripheral_disable(dev); dev->regs->CR1 = cr1_config; - //spi_rx_dma_enable(dev); spi_peripheral_enable(dev); } diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 08327912f..9b6e28e7d 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -160,7 +160,7 @@ void SPIClass::begin(void) { void SPIClass::beginSlave(void) { spi_init(_currentSetting->spi_d); configure_gpios(_currentSetting->spi_d, 0); - uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE); + uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_RX_ONLY); #ifdef SPI_DEBUG Serial.print("spi_slave_enable("); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif @@ -306,10 +306,10 @@ void SPIClass::endTransaction(void) * I/O */ -uint8 SPIClass::read(void) +uint16 SPIClass::read(void) { while ( spi_is_rx_nonempty(_currentSetting->spi_d)==0 ) ; - return (uint8)spi_rx_reg(_currentSetting->spi_d); + return (uint16)spi_rx_reg(_currentSetting->spi_d); } void SPIClass::read(uint8 *buf, uint32 len) @@ -321,7 +321,7 @@ void SPIClass::read(uint8 *buf, uint32 len) while ( rxed < len) { regs->DR = 0x00FF; // " write the data item to be transmitted into the SPI_DR register (this clears the TXE flag)." while ( (regs->SR & SPI_SR_RXNE)==0 ) ; // wait till data is available in the Rx register - buf[rxed++] = (uint8)(regs->DR); // read and store the received byte + *buf++ = (regs->DR); // read and store the received byte } } @@ -332,11 +332,21 @@ void SPIClass::write(uint16 data) * by taking the Tx code from transfer(byte) * This almost doubles the speed of this function. */ - spi_tx_reg(_currentSetting->spi_d, data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + spi_tx_reg(_currentSetting->spi_d, data); // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } +void SPIClass::write(uint16 data, uint32 n) +{ + // Added by stevstrong: Repeatedly send same data by the specified number of times + spi_reg_map * regs = _currentSetting->spi_d->regs; + while ( (n--)>0 ) { + regs->DR = data; // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + while ( (regs->SR & SPI_SR_TXE)==0 ) ; // wait till Tx empty + } + while ( (regs->SR & SPI_SR_BSY) != 0); // wait until BSY=0 before returning +} + void SPIClass::write(const void *data, uint32 length) { spi_tx(_currentSetting->spi_d, data, length); // data can be array of bytes or words @@ -346,18 +356,18 @@ void SPIClass::write(const void *data, uint32 length) uint16 b = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! } -uint16_t SPIClass::transfer16(uint16_t wr_data) const { - spi_tx_reg(_currentSetting->spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." +uint8 SPIClass::transfer(uint8 byte) const { + spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint16)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + return (uint8)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." } -uint8 SPIClass::transfer(uint8 byte) const { - spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." +uint16_t SPIClass::transfer16(uint16_t wr_data) const { + spi_tx_reg(_currentSetting->spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint8)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + return (uint16)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." } /* Roger Clark and Victor Perez, 2015 @@ -419,10 +429,10 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length * Still in progress. * 2016 - stevstrong - reworked to automatically detect bit size from SPI setting */ -uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length) +uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) { if (length == 0) return 0; - uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); + uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); uint8 b = 0; // dma1_ch3_Active=true; dma_init(_currentSetting->spiDmaDev); @@ -438,7 +448,7 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length) // while (dma1_ch3_Active); uint32_t m = millis(); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 0f8497ae1..717a2e90c 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -115,6 +115,13 @@ class SPISettings { init_MightInline(clock, bitOrder, dataMode, dataSize); } } + SPISettings(uint32_t clock) { + if (__builtin_constant_p(clock)) { + init_AlwaysInline(clock, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); + } else { + init_MightInline(clock, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); + } + } SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); } private: void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) { @@ -216,38 +223,38 @@ class SPIClass { */ /** - * @brief Return the next unread byte. + * @brief Return the next unread byte/word. * - * If there is no unread byte waiting, this function will block + * If there is no unread byte/word waiting, this function will block * until one is received. */ - uint8 read(void); + uint16 read(void); /** * @brief Read length bytes, storing them into buffer. * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This + * @param length Number of bytes to store in buffer. This * function will block until the desired number of * bytes have been read. */ void read(uint8 *buffer, uint32 length); /** - * @brief Transmit a byte. - * @param data Byte to transmit. + * @brief Transmit one byte/word. + * @param data to transmit. */ -// void write(uint8 data); - + void write(uint16 data); + /** - * @brief Transmit a half word. + * @brief Transmit one byte/word a specified number of times. * @param data to transmit. */ - void write(uint16 data); + void write(uint16 data, uint32 n); /** - * @brief Transmit multiple bytes. - * @param buffer Bytes to transmit. - * @param length Number of bytes in buffer to transmit. + * @brief Transmit multiple bytes/words. + * @param buffer Bytes/words to transmit. + * @param length Number of bytes/words in buffer to transmit. */ void write(const void * buffer, uint32 length); @@ -283,7 +290,7 @@ class SPIClass { * @param data buffer half words to transmit, * @param length Number of bytes in buffer to transmit. */ - uint8 dmaSend(void * transmitBuf, uint16 length); + uint8 dmaSend(void * transmitBuf, uint16 length, bool minc = 1); /* * Pin accessors From 71a198a1d070f933f7968a757f13c88c22ca21bc Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 12 Dec 2016 17:57:50 +1100 Subject: [PATCH 031/307] Fix problems with tone functions --- STM32F1/cores/maple/tone.cpp | 40 +++++++++++++++++++++--------------- STM32F1/cores/maple/wirish.h | 1 + 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/STM32F1/cores/maple/tone.cpp b/STM32F1/cores/maple/tone.cpp index 2bb11e5d3..26aa67679 100644 --- a/STM32F1/cores/maple/tone.cpp +++ b/STM32F1/cores/maple/tone.cpp @@ -11,13 +11,6 @@ #include "Arduino.h" #include -// define default timer and channel -#ifndef TONE_TIMER -#define TONE_TIMER 4 -#endif -#ifndef TONE_CHANNEL -#define TONE_CHANNEL 4 -#endif #define PinTimer(pin) (PIN_MAP[pin].timer_device->clk_id-RCC_TIMER1+1) #define PinChannel(pin) (PIN_MAP[pin].timer_channel) @@ -30,22 +23,37 @@ #define USE_BSRR // construct static timer array ( -HardwareTimer TTimer1(1), TTimer2(2), TTimer3(3), TTimer4(4); -#ifdef STM32_HIGH_DENSITY -HardwareTimer TTimer5(5), TTimer6(6), TTimer7(7), TTimer8(8); -#endif + #ifdef STM32_HIGH_DENSITY - HardwareTimer *TTimer[8] { &TTimer1,&TTimer2,&TTimer3,&TTimer4,&TTimer5,&TTimer6,&TTimer7,&TTimer8 }; +// define default timer and channel + #ifndef TONE_TIMER + #define TONE_TIMER 8 + #endif + #ifndef TONE_CHANNEL + #define TONE_CHANNEL 8 + #endif + + HardwareTimer TTimer1(1), TTimer2(2), TTimer3(3), TTimer4(4),TTimer5(5), TTimer6(6), TTimer7(7), TTimer8(8); + HardwareTimer *TTimer[8] = { &TTimer1,&TTimer2,&TTimer3,&TTimer4,&TTimer5,&TTimer6,&TTimer7,&TTimer8 }; #else - HardwareTimer *TTimer[4] { &TTimer1,&TTimer2,&TTimer3,&TTimer4 }; + // define default timer and channel + #ifndef TONE_TIMER + #define TONE_TIMER 4 + #endif + #ifndef TONE_CHANNEL + #define TONE_CHANNEL 4 + #endif + + HardwareTimer TTimer1(1), TTimer2(2), TTimer3(3), TTimer4(4); + HardwareTimer *TTimer[4] = { &TTimer1,&TTimer2,&TTimer3,&TTimer4 }; #endif uint8_t tone_force_channel = 0; // forced timer channel uint8_t tone_force_ntimer = 0; // forced timer -HardwareTimer *tone_timer = TTimer[TONE_TIMER]; // timer used to generate frequency +HardwareTimer *tone_timer;// = TTimer[TONE_TIMER-1]; // timer used to generate frequency uint8_t tone_channel = TONE_CHANNEL; // timer channel used to generate frequency uint8_t tone_ntimer = TONE_TIMER; // timer used to generate frequency @@ -138,7 +146,7 @@ void tone(uint32_t pin, uint32_t freq, uint32_t duration) { tone_timer->pause(); - if(freq > 0 || duration >0 ){ + if(freq > 0 && duration >0 ){ uint32_t count = 18000000/freq; // timer counts per half wave tone_ncount = tone_n = (count>>16)+1; // number of 16-bit count chunk tone_tcount = count/tone_ncount; // size of count chunk @@ -183,7 +191,7 @@ void tone(uint32_t pin, uint32_t freq, uint32_t duration) { //////////////////////////////////////////////////////////////////////////////// // disable tone on specified pin, if any void noTone(uint32_t pin){ - tone(pin,-1,0); // it's all handled in tone() + tone(pin,0,0); // it's all handled in tone() } //////////////////////////////////////////////////////////////////////////////// diff --git a/STM32F1/cores/maple/wirish.h b/STM32F1/cores/maple/wirish.h index c2ab4f333..3ffee8331 100644 --- a/STM32F1/cores/maple/wirish.h +++ b/STM32F1/cores/maple/wirish.h @@ -76,6 +76,7 @@ #include #include +#include typedef unsigned int word; // typedef uint16 word;// definition from Arduino website, now appears to be incorrect for 32 bit devices From 6030e1325878a264338c65905bbda47a8fa9d85a Mon Sep 17 00:00:00 2001 From: Testato Date: Sat, 17 Dec 2016 12:29:42 +0100 Subject: [PATCH 032/307] Update boards.txt PR for issue https://github.com/rogerclarkmelbourne/Arduino_STM32/issues/200 --- STM32F1/boards.txt | 82 ++++++++++++++++------------------------------ 1 file changed, 29 insertions(+), 53 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 95a5f8635..030a96190 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -25,17 +25,15 @@ mapleMini.upload.auto_reset=true mapleMini.menu.bootloader_version.original = Original (17k RAM,108k Flash) mapleMini.menu.bootloader_version.original.build.vect=VECT_TAB_ADDR=0x8005000 mapleMini.menu.bootloader_version.original.build.ldscript=ld/flash.ld -mapleMini.menu.bootloader_version.original.upload.ram.maximum_size=17408 -mapleMini.menu.bootloader_version.original.upload.flash.maximum_size=110592 mapleMini.menu.bootloader_version.original.upload.maximum_size=110592 +mapleMini.menu.bootloader_version.original.upload.maximum_data_size=17408 mapleMini.menu.bootloader_version.original.upload.altID=1 mapleMini.menu.bootloader_version.bootloader20 = Bootloader 2.0 (20k RAM,120k Flash) mapleMini.menu.bootloader_version.bootloader20.build.vect=VECT_TAB_ADDR=0x8002000 mapleMini.menu.bootloader_version.bootloader20.build.ldscript=ld/bootloader_20.ld -mapleMini.menu.bootloader_version.bootloader20.upload.ram.maximum_size=20480 -mapleMini.menu.bootloader_version.bootloader20.upload.flash.maximum_size=122880 mapleMini.menu.bootloader_version.bootloader20.upload.maximum_size=122880 +mapleMini.menu.bootloader_version.bootloader20.upload.maximum_data_size=20480 mapleMini.menu.bootloader_version.bootloader20.upload.altID=2 ############################################################## @@ -46,10 +44,9 @@ maple.pid.0=0x0004 maple.upload.tool=maple_upload maple.upload.protocol=maple_dfu maple.upload.maximum_size=108000 +maple.upload.maximum_data_size=17000 maple.upload.use_1200bps_touch=false maple.upload.file_type=bin -maple.upload.ram.maximum_size=17000 -maple.upload.flash.maximum_size=108000 maple.upload.usbID=1EAF:0003 maple.upload.altID=1 maple.upload.auto_reset=true @@ -77,10 +74,9 @@ mapleRET6.build.vect=VECT_TAB_ADDR=0x8005000 mapleRET6.upload.tool=maple_upload mapleRET6.upload.protocol=maple_dfu mapleRET6.upload.maximum_size=262144 +mapleRET6.upload.maximum_data_size=49152 mapleRET6.upload.use_1200bps_touch=false mapleRET6.upload.file_type=bin -mapleRET6.upload.ram.maximum_size=49152 -mapleRET6.upload.flash.maximum_size=262144 mapleRET6.upload.usbID=1EAF:0003 mapleRET6.upload.altID=1 mapleRET6.upload.auto_reset=true @@ -94,10 +90,9 @@ microduino32_flash.pid.0=0x0004 microduino32_flash.upload.tool=maple_upload microduino32_flash.upload.protocol=maple_dfu microduino32_flash.upload.maximum_size=108000 +microduino32_flash.upload.maximum_data_size=17000 microduino32_flash.upload.use_1200bps_touch=false microduino32_flash.upload.file_type=bin -microduino32_flash.upload.ram.maximum_size=17000 -microduino32_flash.upload.flash.maximum_size=108000 microduino32_flash.upload.usbID=1EAF:0003 microduino32_flash.upload.altID=1 microduino32_flash.upload.auto_reset=true @@ -123,10 +118,9 @@ nucleo_f103rb.name=STM Nucleo F103RB (STLink) nucleo_f103rb.upload.tool=stlink_upload nucleo_f103rb.upload.protocol=maple_dfu nucleo_f103rb.upload.maximum_size=108000 +nucleo_f103rb.upload.maximum_data_size=17000 nucleo_f103rb.upload.use_1200bps_touch=false nucleo_f103rb.upload.file_type=bin -nucleo_f103rb.upload.ram.maximum_size=17000 -nucleo_f103rb.upload.flash.maximum_size=108000 nucleo_f103rb.upload.params.quiet=no nucleo_f103rb.upload.usbID=1EAF:0003 @@ -174,16 +168,14 @@ genericSTM32F103C.menu.device_variant.STM32F103C8=STM32F103C8 (20k RAM. 64k Flas genericSTM32F103C.menu.device_variant.STM32F103C8.build.cpu_flags=-DMCU_STM32F103C8 genericSTM32F103C.menu.device_variant.STM32F103C8.build.ldscript=ld/jtag_c8.ld genericSTM32F103C.menu.device_variant.STM32F103C8.upload.maximum_size=65536 -genericSTM32F103C.menu.device_variant.STM32F103C8.upload.ram.maximum_size=20480 -genericSTM32F103C.menu.device_variant.STM32F103C8.upload.flash.maximum_size=65536 +genericSTM32F103C.menu.device_variant.STM32F103C8.upload.maximum_data_size=20480 ## STM32F103CB ------------------------- genericSTM32F103C.menu.device_variant.STM32F103CB=STM32F103CB (20k RAM. 128k Flash) genericSTM32F103C.menu.device_variant.STM32F103CB.build.cpu_flags=-DMCU_STM32F103CB genericSTM32F103C.menu.device_variant.STM32F103CB.build.ldscript=ld/jtag.ld genericSTM32F103C.menu.device_variant.STM32F103CB.upload.maximum_size=131072 -genericSTM32F103C.menu.device_variant.STM32F103CB.upload.ram.maximum_size=20480 -genericSTM32F103C.menu.device_variant.STM32F103CB.upload.flash.maximum_size=131072 +genericSTM32F103C.menu.device_variant.STM32F103C8.upload.maximum_data_size=20480 #---------------------------- UPLOAD METHODS --------------------------- @@ -211,7 +203,6 @@ genericSTM32F103C.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp genericSTM32F103C.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103C.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG - genericSTM32F103C.menu.upload_method.jlinkMethod=JLink genericSTM32F103C.menu.upload_method.jlinkMethod.upload.protocol=jlink genericSTM32F103C.menu.upload_method.jlinkMethod.upload.tool=jlink_upload @@ -234,22 +225,21 @@ genericSTM32F103R.menu.device_variant.STM32F103R8=STM32F103R8 (20k RAM. 64k Flas genericSTM32F103R.menu.device_variant.STM32F103R8.build.variant=generic_stm32f103r8 genericSTM32F103R.menu.device_variant.STM32F103R8.build.cpu_flags=-DMCU_STM32F103R8 genericSTM32F103R.menu.device_variant.STM32F103R8.upload.maximum_size=65536 -genericSTM32F103R.menu.device_variant.STM32F103R8.upload.ram.maximum_size=20480 -genericSTM32F103R.menu.device_variant.STM32F103R8.upload.flash.maximum_size=65536 +genericSTM32F103R.menu.device_variant.STM32F103R8.upload.maximum_data_size=20480 genericSTM32F103R.menu.device_variant.STM32F103R8.build.ldscript=ld/stm32f103r8.ld genericSTM32F103R.menu.device_variant.STM32F103RB=STM32F103RB (20k RAM. 128k Flash) genericSTM32F103R.menu.device_variant.STM32F103RB.build.variant=generic_stm32f103r8 genericSTM32F103R.menu.device_variant.STM32F103RB.build.cpu_flags=-DMCU_STM32F103RB genericSTM32F103R.menu.device_variant.STM32F103RB.upload.maximum_size=131072 -genericSTM32F103R.menu.device_variant.STM32F103RB.upload.ram.maximum_size=20480 -genericSTM32F103R.menu.device_variant.STM32F103RB.upload.flash.maximum_size=131072 +genericSTM32F103R.menu.device_variant.STM32F103RB.upload.maximum_data_size=20480 genericSTM32F103R.menu.device_variant.STM32F103RB.build.ldscript=ld/stm32f103rb.ld genericSTM32F103R.menu.device_variant.STM32F103RC=STM32F103RC (48k RAM. 256k Flash) genericSTM32F103R.menu.device_variant.STM32F103RC.build.variant=generic_stm32f103r genericSTM32F103R.menu.device_variant.STM32F103RC.build.cpu_flags=-DMCU_STM32F103RC genericSTM32F103R.menu.device_variant.STM32F103RC.upload.maximum_size=262144 +genericSTM32F103R.menu.device_variant.STM32F103RC.upload.maximum_data_size=49152 genericSTM32F103R.menu.device_variant.STM32F103RC.upload.ram.maximum_size=49152 genericSTM32F103R.menu.device_variant.STM32F103RC.upload.flash.maximum_size=262144 genericSTM32F103R.menu.device_variant.STM32F103RC.build.ldscript=ld/stm32f103rc.ld @@ -258,8 +248,7 @@ genericSTM32F103R.menu.device_variant.STM32F103RE=STM32F103RE (64k RAM. 512k Fla genericSTM32F103R.menu.device_variant.STM32F103RE.build.variant=generic_stm32f103r genericSTM32F103R.menu.device_variant.STM32F103RE.build.cpu_flags=-DMCU_STM32F103RE genericSTM32F103R.menu.device_variant.STM32F103RE.upload.maximum_size=524288 -genericSTM32F103R.menu.device_variant.STM32F103RE.upload.ram.maximum_size=65536 -genericSTM32F103R.menu.device_variant.STM32F103RE.upload.flash.maximum_size=524288 +genericSTM32F103R.menu.device_variant.STM32F103RE.upload.maximum_data_size=65536 genericSTM32F103R.menu.device_variant.STM32F103RE.build.ldscript=ld/stm32f103re.ld #---------------------------- UPLOAD METHODS --------------------------- @@ -305,16 +294,14 @@ genericSTM32F103T.menu.device_variant.STM32F103T8=STM32F103T8 (20k RAM. 64k Flas genericSTM32F103T.menu.device_variant.STM32F103T8.build.cpu_flags=-DMCU_STM32F103T8 genericSTM32F103T.menu.device_variant.STM32F103T8.build.ldscript=ld/jtag_t8.ld genericSTM32F103T.menu.device_variant.STM32F103T8.upload.maximum_size=65536 -genericSTM32F103T.menu.device_variant.STM32F103T8.upload.ram.maximum_size=20480 -genericSTM32F103T.menu.device_variant.STM32F103T8.upload.flash.maximum_size=65536 +genericSTM32F103T.menu.device_variant.STM32F103T8.upload.maximum_data_size=20480 ## STM32F103TB ------------------------- genericSTM32F103T.menu.device_variant.STM32F103TB=STM32F103TB (20k RAM. 128k Flash) genericSTM32F103T.menu.device_variant.STM32F103TB.build.cpu_flags=-DMCU_STM32F103TB genericSTM32F103T.menu.device_variant.STM32F103TB.build.ldscript=ld/jtag.ld genericSTM32F103T.menu.device_variant.STM32F103TB.upload.maximum_size=131072 -genericSTM32F103T.menu.device_variant.STM32F103TB.upload.ram.maximum_size=20480 -genericSTM32F103T.menu.device_variant.STM32F103TB.upload.flash.maximum_size=131072 +genericSTM32F103T.menu.device_variant.STM32F103TB.upload.maximum_data_size=20480 #---------------------------- UPLOAD METHODS --------------------------- @@ -360,22 +347,19 @@ genericSTM32F103V.build.error_led_pin=6 genericSTM32F103V.menu.device_variant.STM32F103VC=STM32F103VC genericSTM32F103V.menu.device_variant.STM32F103VC.build.cpu_flags=-DMCU_STM32F103VC genericSTM32F103V.menu.device_variant.STM32F103VC.upload.maximum_size=262144 -genericSTM32F103V.menu.device_variant.STM32F103VC.upload.ram.maximum_size=49152 -genericSTM32F103V.menu.device_variant.STM32F103VC.upload.flash.maximum_size=262144 +genericSTM32F103V.menu.device_variant.STM32F103VC.upload.maximum_data_size=49152 genericSTM32F103V.menu.device_variant.STM32F103VC.build.ldscript=ld/stm32f103vc.ld genericSTM32F103V.menu.device_variant.STM32F103VD=STM32F103VD genericSTM32F103V.menu.device_variant.STM32F103VD.build.cpu_flags=-DMCU_STM32F103VD genericSTM32F103V.menu.device_variant.STM32F103VD.upload.maximum_size=393216 -genericSTM32F103V.menu.device_variant.STM32F103VD.upload.ram.maximum_size=65536 -genericSTM32F103V.menu.device_variant.STM32F103VD.upload.flash.maximum_size=393216 +genericSTM32F103V.menu.device_variant.STM32F103VD.upload.maximum_data_size=65536 genericSTM32F103V.menu.device_variant.STM32F103VD.build.ldscript=ld/stm32f103vd.ld genericSTM32F103V.menu.device_variant.STM32F103VE=STM32F103VE genericSTM32F103V.menu.device_variant.STM32F103VE.build.cpu_flags=-DMCU_STM32F103VE genericSTM32F103V.menu.device_variant.STM32F103VE.upload.maximum_size=524288 -genericSTM32F103V.menu.device_variant.STM32F103VE.upload.ram.maximum_size=65536 -genericSTM32F103V.menu.device_variant.STM32F103VE.upload.flash.maximum_size=524288 +genericSTM32F103V.menu.device_variant.STM32F103VE.upload.maximum_data_size=65536 genericSTM32F103V.menu.device_variant.STM32F103VE.build.ldscript=ld/stm32f103ve.ld #---------------------------- UPLOAD METHODS --------------------------- @@ -419,22 +403,19 @@ genericSTM32F103Z.upload.auto_reset=true genericSTM32F103Z.menu.device_variant.STM32F103ZC=STM32F103ZC genericSTM32F103Z.menu.device_variant.STM32F103ZC.build.cpu_flags=-DMCU_STM32F103ZC genericSTM32F103Z.menu.device_variant.STM32F103ZC.upload.maximum_size=262144 -genericSTM32F103Z.menu.device_variant.STM32F103ZC.upload.ram.maximum_size=49152 -genericSTM32F103Z.menu.device_variant.STM32F103ZC.upload.flash.maximum_size=262144 +genericSTM32F103Z.menu.device_variant.STM32F103ZC.upload.maximum_data_size=49152 genericSTM32F103Z.menu.device_variant.STM32F103ZC.build.ldscript=ld/stm32f103zc.ld genericSTM32F103Z.menu.device_variant.STM32F103ZD=STM32F103ZD genericSTM32F103Z.menu.device_variant.STM32F103ZD.build.cpu_flags=-DMCU_STM32F103ZD genericSTM32F103Z.menu.device_variant.STM32F103ZD.upload.maximum_size=393216 -genericSTM32F103Z.menu.device_variant.STM32F103ZD.upload.ram.maximum_size=65536 -genericSTM32F103Z.menu.device_variant.STM32F103ZD.upload.flash.maximum_size=393216 +genericSTM32F103Z.menu.device_variant.STM32F103ZD.upload.maximum_data_size=65536 genericSTM32F103Z.menu.device_variant.STM32F103ZD.build.ldscript=ld/stm32f103zd.ld genericSTM32F103Z.menu.device_variant.STM32F103ZE=STM32F103ZE genericSTM32F103Z.menu.device_variant.STM32F103ZE.build.cpu_flags=-DMCU_STM32F103ZE genericSTM32F103Z.menu.device_variant.STM32F103ZE.upload.maximum_size=524288 -genericSTM32F103Z.menu.device_variant.STM32F103ZE.upload.ram.maximum_size=65536 -genericSTM32F103Z.menu.device_variant.STM32F103ZE.upload.flash.maximum_size=524288 +genericSTM32F103Z.menu.device_variant.STM32F103ZE.upload.maximum_data_size=65536 genericSTM32F103Z.menu.device_variant.STM32F103ZE.build.ldscript=ld/stm32f103ze.ld #---------------------------- UPLOAD METHODS --------------------------- @@ -479,9 +460,7 @@ hytiny-stm32f103t.upload.auto_reset=true hytiny-stm32f103t.build.cpu_flags=-DMCU_STM32F103CB hytiny-stm32f103t.build.ldscript=ld/jtag.ld hytiny-stm32f103t.upload.maximum_size=131072 -hytiny-stm32f103t.upload.ram.maximum_size=20480 -hytiny-stm32f103t.upload.flash.maximum_size=131072 - +hytiny-stm32f103t.upload.maximum_data_size=20480 #---------------------------- UPLOAD METHODS --------------------------- @@ -529,20 +508,17 @@ genericGD32F103C.upload.auto_reset=true genericGD32F103C.build.cpu_flags=-DMCU_STM32F103CB genericGD32F103C.build.f_cpu=72000000L -## GD32F103CB ------------------------- -genericGD32F103C.menu.device_variant.GD32F103CB=GD32F103CB (20k RAM. 128k Flash) -genericGD32F103C.menu.device_variant.GD32F103CB.build.ldscript=ld/jtag.ld -genericGD32F103C.menu.device_variant.GD32F103CB.upload.maximum_size=131072 -genericGD32F103C.menu.device_variant.GD32F103CB.upload.ram.maximum_size=20480 -genericGD32F103C.menu.device_variant.GD32F103CB.upload.flash.maximum_size=131072 - - ## GD32F103C8 ------------------------- genericGD32F103C.menu.device_variant.GD32F103C8=GD32F103C8 (20k RAM. 64k Flash) genericGD32F103C.menu.device_variant.GD32F103C8.build.ldscript=ld/jtag_c8.ld genericGD32F103C.menu.device_variant.GD32F103C8.upload.maximum_size=65536 -genericGD32F103C.menu.device_variant.GD32F103C8.upload.ram.maximum_size=20480 -genericGD32F103C.menu.device_variant.GD32F103C8.upload.flash.maximum_size=65536 +genericGD32F103C.menu.device_variant.GD32F103C8.upload.maximum_data_size=20480 + +## GD32F103CB ------------------------- +genericGD32F103C.menu.device_variant.GD32F103CB=GD32F103CB (20k RAM. 128k Flash) +genericGD32F103C.menu.device_variant.GD32F103CB.build.ldscript=ld/jtag.ld +genericGD32F103C.menu.device_variant.GD32F103CB.upload.maximum_size=131072 +genericGD32F103C.menu.device_variant.GD32F103CB.upload.maximum_data_size=20480 #---------------------------- UPLOAD METHODS --------------------------- @@ -601,8 +577,8 @@ STM32VLD.upload.auto_reset=true STM32VLD.upload.params.quiet=no STM32VLD.build.cpu_flags=-DMCU_STM32F100RB -##---------------------------- UPLOAD METHODS --------------------------- +#---------------------------- UPLOAD METHODS --------------------------- STM32VLD.menu.upload_method.STLinkMethod=STLink STM32VLD.menu.upload_method.STLinkMethod.upload.protocol=STLink From 99ba590bd491df803d7fc6f4fb2ca1859c0f1a18 Mon Sep 17 00:00:00 2001 From: Testato Date: Sat, 17 Dec 2016 12:38:20 +0100 Subject: [PATCH 033/307] Update boards.txt PR for issue https://github.com/rogerclarkmelbourne/Arduino_STM32/issues/200 - replaced `upload.flash.maximum_size` and `upload.ram.maximum_size` by the new arduino standard `upload.maximum_size` and `upload.maximum_data_size` - corrected Flash and Ram value - Tested by builded --- STM32F3/boards.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/STM32F3/boards.txt b/STM32F3/boards.txt index 82b2bc5ae..6c011bce3 100644 --- a/STM32F3/boards.txt +++ b/STM32F3/boards.txt @@ -8,9 +8,8 @@ discovery_f3.upload.protocol=stlink #discovery_f407.upload.use_1200bps_touch=false discovery_f3.upload.file_type=bin -discovery_f3.upload.ram.maximum_size=17000 -discovery_f3.upload.flash.maximum_size=108000 -discovery_f3.upload.maximum_size=108000 +discovery_f3.upload.maximum_size=262144 +discovery_f3.upload.maximum_data_size=49152 #discovery_f3.upload.usbID=1EAF:0003 #discovery_f3.upload.altID=1 From 54d67d77c4b01f22fa4910b841d13f61da8163af Mon Sep 17 00:00:00 2001 From: Testato Date: Sat, 17 Dec 2016 12:41:23 +0100 Subject: [PATCH 034/307] Update boards.txt PR for issue https://github.com/rogerclarkmelbourne/Arduino_STM32/issues/200 - replaced `upload.flash.maximum_size` and `upload.ram.maximum_size` by the new arduino standard `upload.maximum_size` and `upload.maximum_data_size` - corrected Flash and Ram value - Tested by builded every MCU on every Variant --- STM32F4/boards.txt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 7577d1949..daa1a0492 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -8,9 +8,8 @@ discovery_f407.upload.protocol=stlink #discovery_f407.upload.use_1200bps_touch=false discovery_f407.upload.file_type=bin -discovery_f407.upload.ram.maximum_size=17000 -discovery_f407.upload.flash.maximum_size=1048576 discovery_f407.upload.maximum_size=1048576 +discovery_f407.upload.maximum_data_size=196608 #discovery_f407.upload.usbID=1EAF:0003 #discovery_f407.upload.altID=1 @@ -37,9 +36,8 @@ stm32f4stamp.upload.protocol=maple_dfu #stm32f4stamp.upload.use_1200bps_touch=false stm32f4stamp.upload.file_type=bin -stm32f4stamp.upload.ram.maximum_size=196608 -stm32f4stamp.upload.flash.maximum_size=1048576 stm32f4stamp.upload.maximum_size=1048576 +stm32f4stamp.upload.maximum_data_size=196608 stm32f4stamp.upload.usbID=0483:df11 stm32f4stamp.upload.altID=0 @@ -67,9 +65,8 @@ netduino2plus.upload.protocol=maple_dfu #netduino2plus.upload.use_1200bps_touch=false netduino2plus.upload.file_type=bin -netduino2plus.upload.ram.maximum_size=196608 -netduino2plus.upload.flash.maximum_size=1048576 netduino2plus.upload.maximum_size=1048576 +netduino2plus.upload.maximum_data_size=196608 netduino2plus.upload.usbID=0483:df11 netduino2plus.upload.altID=0 From 76dcee39a93618ad5c188e4e30afdbf537a64878 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 23 Dec 2016 09:48:43 +1100 Subject: [PATCH 035/307] Removed old - mainly non functional Due related display examples --- .../libraries/ILI9341_due_STM/ILI9341_due.cpp | 1670 -------------- .../libraries/ILI9341_due_STM/ILI9341_due.h | 1171 ---------- .../ILI9341_due_STM/ILI9341_due_gText.cpp | 1936 ----------------- .../ILI9341_due_STM/ILI9341_due_gText.h | 385 ---- .../ILI9341_due_STM/ILI_SdFatConfig.h | 196 -- STM32F1/libraries/ILI9341_due_STM/ILI_SdSpi.h | 188 -- .../ILI9341_due_STM/ILI_SdSpiSAM3X.cpp | 411 ---- STM32F1/libraries/ILI9341_due_STM/README.md | 48 - .../ILI9341_due_STM/examples/arcs/arcs.ino | 243 --- .../ILI9341_due_STM/examples/arcs/roboto16.h | 167 -- .../ILI9341_due_STM/examples/arcs/roboto32.h | 165 -- .../ILI9341_due_STM/examples/arcs/roboto70.h | 74 - .../examples/gTextBigFont/gTextBigFont.ino | 63 - .../gTextHelloWorld/gTextHelloWorld.ino | 39 - .../examples/graphicstest/graphicstest.ino | 410 ---- .../graphicstestWithStats.ino | 427 ---- .../sdFatTftBitmap/images/blacklab.565 | Bin 153654 -> 0 bytes .../sdFatTftBitmap/images/blacklab.bmp | Bin 230454 -> 0 bytes .../sdFatTftBitmap/images/giraffe.565 | Bin 153654 -> 0 bytes .../sdFatTftBitmap/images/giraffe.bmp | Bin 230454 -> 0 bytes .../sdFatTftBitmap/images/gloomyTears.565 | Bin 153654 -> 0 bytes .../sdFatTftBitmap/images/gloomyTears.bmp | Bin 230454 -> 0 bytes .../examples/sdFatTftBitmap/images/health.565 | Bin 153654 -> 0 bytes .../examples/sdFatTftBitmap/images/health.bmp | Bin 230454 -> 0 bytes .../examples/sdFatTftBitmap/images/lambo.565 | Bin 153654 -> 0 bytes .../examples/sdFatTftBitmap/images/lambo.bmp | Bin 230454 -> 0 bytes .../sdFatTftBitmap/images/motivation.565 | Bin 153654 -> 0 bytes .../sdFatTftBitmap/images/motivation.bmp | Bin 230454 -> 0 bytes .../examples/sdFatTftBitmap/images/origP.565 | Bin 153654 -> 0 bytes .../examples/sdFatTftBitmap/images/origP.bmp | Bin 230454 -> 0 bytes .../examples/sdFatTftBitmap/images/radioP.565 | Bin 153654 -> 0 bytes .../examples/sdFatTftBitmap/images/radioP.bmp | Bin 230454 -> 0 bytes .../examples/sdFatTftBitmap/images/smokeP.565 | Bin 153654 -> 0 bytes .../examples/sdFatTftBitmap/images/smokeP.bmp | Bin 230454 -> 0 bytes .../sdFatTftBitmap/images/soldHouse.565 | Bin 153654 -> 0 bytes .../sdFatTftBitmap/images/soldHouse.bmp | Bin 230454 -> 0 bytes .../examples/sdFatTftBitmap/images/stopP.565 | Bin 153654 -> 0 bytes .../examples/sdFatTftBitmap/images/stopP.bmp | Bin 230454 -> 0 bytes .../examples/sdFatTftBitmap/images/woof.565 | Bin 153654 -> 0 bytes .../examples/sdFatTftBitmap/images/woof.bmp | Bin 230454 -> 0 bytes .../sdFatTftBitmap/sdFatTftBitmap.ino | 320 --- .../examples/utftDemo/utftDemo.ino | 341 --- .../libraries/ILI9341_due_STM/fonts/Arial14.h | 173 -- .../ILI9341_due_STM/fonts/Arial_bold_14.h | 167 -- .../ILI9341_due_STM/fonts/Corsiva_12.h | 167 -- .../ILI9341_due_STM/fonts/SystemFont5x7.h | 157 -- .../ILI9341_due_STM/fonts/Verdana_digits_24.h | 116 - .../ILI9341_due_STM/fonts/allFonts.h | 18 - .../ILI9341_due_STM/fonts/fixednums15x31.h | 127 -- .../ILI9341_due_STM/fonts/fixednums7x15.h | 92 - .../ILI9341_due_STM/fonts/fixednums8x16.h | 50 - .../ILI9341_due_STM/fonts/jokerman_255.h | 73 - STM32F1/libraries/ILI9341_due_STM/glcdfont.c | 263 --- .../libraries/ILI9341_due_STM/keywords.txt | 38 - .../BMP24toILI565/.NET/BMP24toILI565.exe | Bin 8192 -> 0 bytes .../tools/BMP24toILI565/.NET/src/App.config | 6 - .../.NET/src/BMP24toILI565.csproj | 58 - .../.NET/src/BMP24toILI565.csproj.user | 7 - .../BMP24toILI565/.NET/src/BMP24toILI565.sln | 20 - .../tools/BMP24toILI565/.NET/src/Program.cs | 210 -- .../.NET/src/Properties/AssemblyInfo.cs | 36 - .../tools/BMP24toILI565/C/BMP24toILI565.exe | Bin 43008 -> 0 bytes .../BMP24toILI565/C/src/BMP24toILI565.cpp | 210 -- .../BMP24toILI565/C/src/BMP24toILI565.sln | 20 - .../BMP24toILI565/C/src/BMP24toILI565.vcxproj | 95 - .../C/src/BMP24toILI565.vcxproj.filters | 36 - .../tools/BMP24toILI565/C/src/ReadMe.txt | 40 - .../tools/BMP24toILI565/C/src/dirent.h | 838 ------- .../tools/BMP24toILI565/C/src/stdafx.cpp | 8 - .../tools/BMP24toILI565/C/src/stdafx.h | 15 - .../tools/BMP24toILI565/C/src/targetver.h | 8 - .../tools/GLCDFontCreator2.zip | Bin 76786 -> 0 bytes .../ILIScreenshotViewer.exe | Bin 11264 -> 0 bytes .../tools/ILIScreenshotViewer/src/App.config | 6 - .../ILIScreenshotViewer/src/Form1.Designer.cs | 108 - .../tools/ILIScreenshotViewer/src/Form1.cs | 141 -- .../tools/ILIScreenshotViewer/src/Form1.resx | 123 -- .../src/ILIScreenshotViewer.csproj | 82 - .../src/ILIScreenshotViewer.sln | 20 - .../tools/ILIScreenshotViewer/src/Program.cs | 21 - .../src/Properties/AssemblyInfo.cs | 36 - .../src/Properties/Resources.Designer.cs | 71 - .../src/Properties/Resources.resx | 117 - .../src/Properties/Settings.Designer.cs | 30 - .../src/Properties/Settings.settings | 7 - 85 files changed, 12064 deletions(-) delete mode 100644 STM32F1/libraries/ILI9341_due_STM/ILI9341_due.cpp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/ILI9341_due.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/ILI9341_due_gText.cpp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/ILI9341_due_gText.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/ILI_SdFatConfig.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/ILI_SdSpi.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/ILI_SdSpiSAM3X.cpp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/README.md delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/arcs/arcs.ino delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto16.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto32.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto70.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/gTextBigFont/gTextBigFont.ino delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/gTextHelloWorld/gTextHelloWorld.ino delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/graphicstest/graphicstest.ino delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/graphicstestWithStats/graphicstestWithStats.ino delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/blacklab.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/blacklab.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/giraffe.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/giraffe.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/gloomyTears.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/gloomyTears.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/health.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/health.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/lambo.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/lambo.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/motivation.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/motivation.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/origP.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/origP.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/radioP.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/radioP.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/smokeP.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/smokeP.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/soldHouse.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/soldHouse.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/stopP.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/stopP.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/woof.565 delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/woof.bmp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/sdFatTftBitmap.ino delete mode 100644 STM32F1/libraries/ILI9341_due_STM/examples/utftDemo/utftDemo.ino delete mode 100644 STM32F1/libraries/ILI9341_due_STM/fonts/Arial14.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/fonts/Arial_bold_14.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/fonts/Corsiva_12.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/fonts/SystemFont5x7.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/fonts/Verdana_digits_24.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/fonts/allFonts.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/fonts/fixednums15x31.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/fonts/fixednums7x15.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/fonts/fixednums8x16.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/fonts/jokerman_255.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/glcdfont.c delete mode 100644 STM32F1/libraries/ILI9341_due_STM/keywords.txt delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/BMP24toILI565.exe delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/App.config delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.csproj delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.csproj.user delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.sln delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/Program.cs delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/Properties/AssemblyInfo.cs delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/BMP24toILI565.exe delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.cpp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.sln delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.vcxproj delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.vcxproj.filters delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/ReadMe.txt delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/dirent.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/stdafx.cpp delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/stdafx.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/targetver.h delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/GLCDFontCreator2.zip delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/ILIScreenshotViewer.exe delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/App.config delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.Designer.cs delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.cs delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.resx delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/ILIScreenshotViewer.csproj delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/ILIScreenshotViewer.sln delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Program.cs delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/AssemblyInfo.cs delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Resources.Designer.cs delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Resources.resx delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Settings.Designer.cs delete mode 100644 STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Settings.settings diff --git a/STM32F1/libraries/ILI9341_due_STM/ILI9341_due.cpp b/STM32F1/libraries/ILI9341_due_STM/ILI9341_due.cpp deleted file mode 100644 index 1338e5aa0..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/ILI9341_due.cpp +++ /dev/null @@ -1,1670 +0,0 @@ -/* -ILI9341_due_.cpp - Arduino Due library for interfacing with ILI9341-based TFTs - -Copyright (c) 2014 Marek Buriak -Modified 03/19/2015 by Victor Perez to add STM32F1 Maple mini DMA support - -This library is based on ILI9341_t3 library from Paul Stoffregen -(https://github.com/PaulStoffregen/ILI9341_t3), Adafruit_ILI9341 -and Adafruit_GFX libraries from Limor Fried/Ladyada -(https://github.com/adafruit/Adafruit_ILI9341). - -This file is part of the Arduino ILI9341_due library. -Sources for this library can be found at https://github.com/marekburiak/ILI9341_Due. - -ILI9341_due is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 2.1 of the License, or -(at your option) any later version. - -ILI9341_due is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with ILI9341_due. If not, see . - -*/ - -/*************************************************** -This is our library for the Adafruit ILI9341 Breakout and Shield -----> http://www.adafruit.com/products/1651 - -Check out the links above for our tutorials and wiring diagrams -These displays use SPI to communicate, 4 or 5 pins are required to -interface (RST is optional) -Adafruit invests time and resources providing this open source code, -please support Adafruit and open-source hardware by purchasing -products from Adafruit! - -Written by Limor Fried/Ladyada for Adafruit Industries. -MIT license, all text above must be included in any redistribution -****************************************************/ - -#include "ILI9341_due.h" -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED -#include -#elif SPI_MODE_DMA -#include "ILI_SdSpi.h" -#include -#endif -//#include "..\Streaming\Streaming.h" - - -static const uint8_t init_commands[] PROGMEM = { - 4, 0xEF, 0x03, 0x80, 0x02, - 4, 0xCF, 0x00, 0XC1, 0X30, - 5, 0xED, 0x64, 0x03, 0X12, 0X81, - 4, 0xE8, 0x85, 0x00, 0x78, - 6, 0xCB, 0x39, 0x2C, 0x00, 0x34, 0x02, - 2, 0xF7, 0x20, - 3, 0xEA, 0x00, 0x00, - 2, ILI9341_PWCTR1, 0x23, // Power control - 2, ILI9341_PWCTR2, 0x10, // Power control - 3, ILI9341_VMCTR1, 0x3e, 0x28, // VCM control - 2, ILI9341_VMCTR2, 0x86, // VCM control2 - 2, ILI9341_MADCTL, 0x48, // Memory Access Control - 2, ILI9341_PIXFMT, 0x55, - 3, ILI9341_FRMCTR1, 0x00, 0x18, - 4, ILI9341_DFUNCTR, 0x08, 0x82, 0x27, // Display Function Control - 2, 0xF2, 0x00, // Gamma Function Disable - 2, ILI9341_GAMMASET, 0x01, // Gamma curve selected - 16, ILI9341_GMCTRP1, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, - 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, // Set Gamma - 16, ILI9341_GMCTRN1, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, - 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, // Set Gamma - 0 -}; - - -ILI9341_due::ILI9341_due(uint8_t cs, uint8_t dc, uint8_t rst) -{ - _cs = cs; - _dc = dc; - _rst = rst; - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - _rotation = iliRotation0; -#ifdef FEATURE_PRINT_ENABLED - _cursorY = _cursorX = 0; - _textsize = 1; - _textcolor = _textbgcolor = 0xFFFF; - _wrap = true; -#endif -#ifdef FEATURE_ARC_ENABLED - _arcAngleMax = ARC_ANGLE_MAX; - _arcAngleOffset = ARC_ANGLE_OFFSET; -#endif -} - - -bool ILI9341_due::begin(void) -{ - if (pinIsChipSelect(_cs)) { - pinMode(_dc, OUTPUT); - _dcport = portOutputRegister(digitalPinToPort(_dc)); - _dcpinmask = digitalPinToBitMask(_dc); - -#if SPI_MODE_NORMAL | SPI_MODE_DMA - pinMode(_cs, OUTPUT); - _csport = portOutputRegister(digitalPinToPort(_cs)); - _cspinmask = digitalPinToBitMask(_cs); -#endif - -#if SPI_MODE_NORMAL - SPI.begin(); - SPI.setClockDivider(ILI9341_SPI_CLKDIVIDER); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); -#ifdef __AVR__ - _SPCR = SPCR; -#endif -#elif SPI_MODE_EXTENDED - SPI.begin(_cs); - SPI.setClockDivider(_cs, ILI9341_SPI_CLKDIVIDER); - SPI.setBitOrder(_cs, MSBFIRST); - SPI.setDataMode(_cs, SPI_MODE0); -#elif SPI_MODE_DMA - _dmaSpi.begin(); - _dmaSpi.init(ILI9341_SPI_CLKDIVIDER); -#endif - - // toggle RST low to reset - if (_rst < 255) { - pinMode(_rst, OUTPUT); - digitalWrite(_rst, HIGH); - delay(5); - digitalWrite(_rst, LOW); - delay(20); - digitalWrite(_rst, HIGH); - delay(150); - } - - const uint8_t *addr = init_commands; - while (1) { - uint8_t count = pgm_read_byte(addr++); - if (count-- == 0) break; - writecommand_cont(pgm_read_byte(addr++)); - while (count-- > 0) { - writedata8_cont(pgm_read_byte(addr++)); - } - } - - writecommand_last(ILI9341_SLPOUT); // Exit Sleep - delay(120); - writecommand_last(ILI9341_DISPON); // Display on - delay(120); - _isInSleep = _isIdle = false; - - uint8_t x = readcommand8(ILI9341_RDMODE); - Serial.print(F("\nDisplay Power Mode: 0x")); Serial.println(x, HEX); - x = readcommand8(ILI9341_RDMADCTL); - Serial.print(F("\nMADCTL Mode: 0x")); Serial.println(x, HEX); - x = readcommand8(ILI9341_RDPIXFMT); - Serial.print(F("\nPixel Format: 0x")); Serial.println(x, HEX); - x = readcommand8(ILI9341_RDIMGFMT); - Serial.print(F("\nImage Format: 0x")); Serial.println(x, HEX); - x = readcommand8(ILI9341_RDSELFDIAG); - Serial.print(F("\nSelf Diagnostic: 0x")); Serial.println(x, HEX); - - return true; - } - else { - return false; - } -} - -bool ILI9341_due::pinIsChipSelect(uint8_t cs) -{ -#if SPI_MODE_EXTENDED - if(cs == 4 || cs == 10 || cs == 52) // in Extended SPI mode only these pins are valid - { - return true; - } - else - { - Serial.print("Pin "); - Serial.print(_cs); - Serial.println(" is not a valid Chip Select pin for SPI Extended Mode. Valid pins are 4, 10, 52"); - return false; - } -#elif SPI_MODE_NORMAL | SPI_MODE_DMA - return true; -#endif -} - -void ILI9341_due::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) -{ - setAddrAndRW_cont(x0, y0, x1, y1); - disableCS(); -} - -void ILI9341_due::setSPIClockDivider(uint8_t divider) -{ -#if SPI_MODE_NORMAL - SPI.setClockDivider(divider); -#elif SPI_MODE_EXTENDED - SPI.setClockDivider(_cs, divider); -#elif SPI_MODE_DMA - _dmaSpi.init(divider); -#endif -} - -void ILI9341_due::pushColor(uint16_t color) -{ - enableCS(); - writedata16_last(color); -} - -void ILI9341_due::pushColors(uint16_t *colors, uint16_t offset, uint16_t len) { - enableCS(); - setDCForData(); - colors = colors + offset * 2; -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - for (uint16_t i = 0; i < len; i++) { - write16_cont(colors[i]); - } -#elif SPI_MODE_DMA - for (uint16_t i = 0; i < (len << 1); i += 2) { - uint16_t color = *colors; - _scanlineBuffer[i] = highByte(color); - _scanlineBuffer[i + 1] = lowByte(color); - colors++; - } - writeScanline_cont(len); -#endif - disableCS(); -} - -// pushes pixels stored in the colors array (one color is 2 bytes) -// in big endian (high byte first) -// len should be the length of the array (so to push 320 pixels, -// you have to have a 640-byte array and len should be 640) -void ILI9341_due::pushColors565(uint8_t *colors, uint16_t offset, uint16_t len) { - enableCS(); - setDCForData(); - colors = colors + offset; - -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - for (uint16_t i = 0; i < len; i++) { - write8_cont(colors[i]); - } -#elif SPI_MODE_DMA - write_cont(colors, len); -#endif - disableCS(); -} - - -void ILI9341_due::drawPixel(int16_t x, int16_t y, uint16_t color) { - - if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return; - writePixel_last(x, y, color); -} - -void ILI9341_due::drawPixel_cont(int16_t x, int16_t y, uint16_t color) { - - if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return; - writePixel_cont(x, y, color); -} - -void ILI9341_due::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) -{ - // Rudimentary clipping - if ((x >= _width) || (y >= _height || h == 0)) return; - if ((y + h - 1) >= _height) h = _height - y; - - setAddrAndRW_cont(x, y, x, y + h - 1); -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - setDCForData(); - while (h-- > 1) { - write16_cont(color); - } - write16_last(color); -#elif SPI_MODE_DMA - fillScanline(color, h); - writeScanline_last(h); -#endif -} - -void ILI9341_due::drawFastVLine_cont_noFill(int16_t x, int16_t y, int16_t h, uint16_t color) -{ - // Rudimentary clipping - if ((x >= _width) || (y >= _height || h == 0)) return; - if ((y + h - 1) >= _height) h = _height - y; - - setAddrAndRW_cont(x, y, x, y + h - 1); -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - setDCForData(); - while (h-- > 0) { - write16_cont(color); - } -#elif SPI_MODE_DMA - writeScanline_cont(h); -#endif -} - -void ILI9341_due::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) -{ - // Rudimentary clipping - if ((x >= _width) || (y >= _height || w == 0)) return; - if ((x + w - 1) >= _width) w = _width - x; - - setAddrAndRW_cont(x, y, x + w - 1, y); -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - setDCForData(); - while (w-- > 1) { - write16_cont(color); - } - writedata16_last(color); -#elif SPI_MODE_DMA - fillScanline(color, w); - writeScanline_last(w); -#endif -} - -void ILI9341_due::fillScreen(uint16_t color) -{ -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - fillRect(0, 0, _width, _height, color); -#elif SPI_MODE_DMA - - fillScanline(color); - - setAddrAndRW_cont(0, 0, _width - 1, _height - 1); - setDCForData(); - const uint16_t bytesToWrite = _width << 1; - for (uint16_t y = 0; y < _height; y++) - { - write_cont(_scanlineBuffer, bytesToWrite); - } - disableCS(); - -#endif -} - -// fill a rectangle -void ILI9341_due::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) -{ - //Serial << "x:" << x << " y:" << y << " w:" << x << " h:" << h << " width:" << _width << " height:" << _height <= _width) || (y >= _height || w == 0 || h == 0)) return; - if ((x + w - 1) >= _width) w = _width - x; - if ((y + h - 1) >= _height) h = _height - y; - - setAddrAndRW_cont(x, y, x + w - 1, y + h - 1); -#if SPI_MODE_DMA - const uint16_t maxNumLinesInScanlineBuffer = (SCANLINE_BUFFER_SIZE >> 1) / w; - const uint16_t numPixelsInOneGo = w*maxNumLinesInScanlineBuffer; - - fillScanline(color, numPixelsInOneGo); - - for (uint16_t p = 0; p < h / maxNumLinesInScanlineBuffer; p++) - { - writeScanline_cont(numPixelsInOneGo); - } - writeScanline_last((w*h) % numPixelsInOneGo); - -#elif SPI_MODE_NORMAL | SPI_MODE_EXTENDED - // TODO: this can result in a very long transaction time - // should break this into multiple transactions, even though - // it'll cost more overhead, so we don't stall other SPI libs - //enableCS(); //setAddrAndRW_cont will enable CS - setDCForData(); - - y=h; - while(y--) { - x=w; - while(x--) - { - write16_cont(color); - } - } - - disableCS(); -#endif -} - - -#define MADCTL_MY 0x80 -#define MADCTL_MX 0x40 -#define MADCTL_MV 0x20 -#define MADCTL_ML 0x10 -#define MADCTL_RGB 0x00 -#define MADCTL_BGR 0x08 -#define MADCTL_MH 0x04 - -void ILI9341_due::setRotation(iliRotation r) -{ - writecommand_cont(ILI9341_MADCTL); - _rotation = r; - switch (r) { - case iliRotation0: - writedata8_last(MADCTL_MX | MADCTL_BGR); - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case iliRotation90: - writedata8_last(MADCTL_MV | MADCTL_BGR); - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - case iliRotation180: - writedata8_last(MADCTL_MY | MADCTL_BGR); - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case iliRotation270: - writedata8_last(MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - } -} - - -void ILI9341_due::invertDisplay(boolean i) -{ - writecommand_last(i ? ILI9341_INVON : ILI9341_INVOFF); -} - - -uint8_t ILI9341_due::readcommand8(uint8_t c, uint8_t index) { - writecommand_cont(0xD9); // woo sekret command? - writedata8_last(0x10 + index); - writecommand_cont(c); - - return readdata8_last(); -} - -// Reads one pixel/color from the TFT's GRAM -uint16_t ILI9341_due::readPixel(int16_t x, int16_t y) -{ - setAddr_cont(x, y, x + 1, y + 1); - writecommand_cont(ILI9341_RAMRD); // read from RAM - readdata8_cont(); // dummy read - uint8_t red = read8_cont(); - uint8_t green = read8_cont(); - uint8_t blue = read8_last(); - return color565(red, green, blue); -} - -//void ILI9341_due::drawArc(uint16_t cx, uint16_t cy, uint16_t radius, uint16_t thickness, uint16_t start, uint16_t end, uint16_t color) { -// //void graphics_draw_arc(GContext *ctx, GPoint p, int radius, int thickness, int start, int end) { -// start = start % 360; -// end = end % 360; -// -// while (start < 0) start += 360; -// while (end < 0) end += 360; -// -// if (end == 0) end = 360; -// -// //Serial << "start: " << start << " end:" << end << endl; -// -// // Serial << (float)cos_lookup(start * ARC_MAX_STEPS / 360) << " x " << (float)sin_lookup(start * ARC_MAX_STEPS / 360) << endl; -// -// float sslope = (float)cos_lookup(start * ARC_MAX_STEPS / 360) / (float)sin_lookup(start * ARC_MAX_STEPS / 360); -// float eslope = (float)cos_lookup(end * ARC_MAX_STEPS / 360) / (float)sin_lookup(end * ARC_MAX_STEPS / 360); -// -// //Serial << "sslope: " << sslope << " eslope:" << eslope << endl; -// -// if (end == 360) eslope = -1000000; -// -// int ir2 = (radius - thickness) * (radius - thickness); -// int or2 = radius * radius; -// -// for (int x = -radius; x <= radius; x++) -// for (int y = -radius; y <= radius; y++) -// { -// int x2 = x * x; -// int y2 = y * y; -// -// if ( -// (x2 + y2 < or2 && x2 + y2 >= ir2) && -// ( -// (y > 0 && start < 180 && x <= y * sslope) || -// (y < 0 && start > 180 && x >= y * sslope) || -// (y < 0 && start <= 180) || -// (y == 0 && start <= 180 && x < 0) || -// (y == 0 && start == 0 && x > 0) -// ) && -// ( -// (y > 0 && end < 180 && x >= y * eslope) || -// (y < 0 && end > 180 && x <= y * eslope) || -// (y > 0 && end >= 180) || -// (y == 0 && end >= 180 && x < 0) || -// (y == 0 && start == 0 && x > 0) -// ) -// ) -// drawPixel_cont(cx+x, cy+y, color); -// } -//} - - - -#ifdef FEATURE_ARC_ENABLED -// DrawArc function thanks to Jnmattern and his Arc_2.0 (https://github.com/Jnmattern) -void ILI9341_due::drawArcOffsetted(uint16_t cx, uint16_t cy, uint16_t radius, uint16_t thickness, float start, float end, uint16_t color) { - int16_t xmin = 65535, xmax = -32767, ymin = 32767, ymax = -32767; - float cosStart, sinStart, cosEnd, sinEnd; - float r, t; - float startAngle, endAngle; - - //Serial << "start: " << start << " end: " << end << endl; - startAngle = (start / _arcAngleMax) * 360; // 252 - endAngle = (end / _arcAngleMax) * 360; // 807 - //Serial << "startAngle: " << startAngle << " endAngle: " << endAngle << endl; - - while (startAngle < 0) startAngle += 360; - while (endAngle < 0) endAngle += 360; - while (startAngle > 360) startAngle -= 360; - while (endAngle > 360) endAngle -= 360; - //Serial << "startAngleAdj: " << startAngle << " endAngleAdj: " << endAngle << endl; - //if (endAngle == 0) endAngle = 360; - - if (startAngle > endAngle) { - drawArcOffsetted(cx, cy, radius, thickness, ((startAngle) / (float)360) * _arcAngleMax, _arcAngleMax, color); - drawArcOffsetted(cx, cy, radius, thickness, 0, ((endAngle) / (float)360) * _arcAngleMax, color); - } - else { - // Calculate bounding box for the arc to be drawn - cosStart = cosDegrees(startAngle); - sinStart = sinDegrees(startAngle); - cosEnd = cosDegrees(endAngle); - sinEnd = sinDegrees(endAngle); - - //Serial << cosStart << " " << sinStart << " " << cosEnd << " " << sinEnd << endl; - - r = radius; - // Point 1: radius & startAngle - t = r * cosStart; - if (t < xmin) xmin = t; - if (t > xmax) xmax = t; - t = r * sinStart; - if (t < ymin) ymin = t; - if (t > ymax) ymax = t; - - // Point 2: radius & endAngle - t = r * cosEnd; - if (t < xmin) xmin = t; - if (t > xmax) xmax = t; - t = r * sinEnd; - if (t < ymin) ymin = t; - if (t > ymax) ymax = t; - - r = radius - thickness; - // Point 3: radius-thickness & startAngle - t = r * cosStart; - if (t < xmin) xmin = t; - if (t > xmax) xmax = t; - t = r * sinStart; - if (t < ymin) ymin = t; - if (t > ymax) ymax = t; - - // Point 4: radius-thickness & endAngle - t = r * cosEnd; - if (t < xmin) xmin = t; - if (t > xmax) xmax = t; - t = r * sinEnd; - if (t < ymin) ymin = t; - if (t > ymax) ymax = t; - - - //Serial << xmin << " " << xmax << " " << ymin << " " << ymax << endl; - // Corrections if arc crosses X or Y axis - if ((startAngle < 90) && (endAngle > 90)) { - ymax = radius; - } - - if ((startAngle < 180) && (endAngle > 180)) { - xmin = -radius; - } - - if ((startAngle < 270) && (endAngle > 270)) { - ymin = -radius; - } - - // Slopes for the two sides of the arc - float sslope = (float)cosStart / (float)sinStart; - float eslope = (float)cosEnd / (float)sinEnd; - - //Serial << "sslope2: " << sslope << " eslope2:" << eslope << endl; - - if (endAngle == 360) eslope = -1000000; - - int ir2 = (radius - thickness) * (radius - thickness); - int or2 = radius * radius; - //Serial << "ymin: " << ymin << " ymax: " << ymax << endl; -#if SPI_MODE_DMA - fillScanline(color, radius << 1); -#endif - for (int x = xmin; x <= xmax; x++) { - bool y1StartFound = false, y2StartFound = false; - bool y1EndFound = false, y2EndSearching = false; - int y1s = 0, y1e = 0, y2s = 0, y2e = 0; - for (int y = ymin; y <= ymax; y++) - { - int x2 = x * x; - int y2 = y * y; - - if ( - (x2 + y2 < or2 && x2 + y2 >= ir2) && ( - (y > 0 && startAngle < 180 && x <= y * sslope) || - (y < 0 && startAngle > 180 && x >= y * sslope) || - (y < 0 && startAngle <= 180) || - (y == 0 && startAngle <= 180 && x < 0) || - (y == 0 && startAngle == 0 && x > 0) - ) && ( - (y > 0 && endAngle < 180 && x >= y * eslope) || - (y < 0 && endAngle > 180 && x <= y * eslope) || - (y > 0 && endAngle >= 180) || - (y == 0 && endAngle >= 180 && x < 0) || - (y == 0 && startAngle == 0 && x > 0))) - { - if (!y1StartFound) //start of the higher line found - { - y1StartFound = true; - y1s = y; - } - else if (y1EndFound && !y2StartFound) //start of the lower line found - { - //Serial << "Found y2 start x: " << x << " y:" << y << endl; - y2StartFound = true; - //drawPixel_cont(cx+x, cy+y, ILI9341_BLUE); - y2s = y; - y += y1e - y1s - 1; // calculate the most probable end of the lower line (in most cases the length of lower line is equal to length of upper line), in the next loop we will validate if the end of line is really there - if (y > ymax - 1) // the most probable end of line 2 is beyond ymax so line 2 must be shorter, thus continue with pixel by pixel search - { - y = y2s; // reset y and continue with pixel by pixel search - y2EndSearching = true; - } - - //Serial << "Upper line length: " << (y1e - y1s) << " Setting y to " << y << endl; - } - else if (y2StartFound && !y2EndSearching) - { - // we validated that the probable end of the lower line has a pixel, continue with pixel by pixel search, in most cases next loop with confirm the end of lower line as it will not find a valid pixel - y2EndSearching = true; - } - //Serial << "x:" << x << " y:" << y << endl; - //drawPixel_cont(cx+x, cy+y, ILI9341_BLUE); - } - else - { - if (y1StartFound && !y1EndFound) //higher line end found - { - y1EndFound = true; - y1e = y - 1; - //Serial << "line: " << y1s << " - " << y1e << endl; - drawFastVLine_cont_noFill(cx + x, cy + y1s, y - y1s, color); - if (y < 0) - { - //Serial << x << " " << y << endl; - y = abs(y); // skip the empty middle - } - else - break; - } - else if (y2StartFound) - { - if (y2EndSearching) - { - //Serial << "Found final end at y: " << y << endl; - // we found the end of the lower line after pixel by pixel search - drawFastVLine_cont_noFill(cx + x, cy + y2s, y - y2s, color); - y2EndSearching = false; - break; - } - else - { - //Serial << "Expected end not found" << endl; - // the expected end of the lower line is not there so the lower line must be shorter - y = y2s; // put the y back to the lower line start and go pixel by pixel to find the end - y2EndSearching = true; - } - } - //else - //drawPixel_cont(cx+x, cy+y, ILI9341_RED); - } - // - - //delay(75); - } - if (y1StartFound && !y1EndFound) - { - y1e = ymax; - //Serial << "line: " << y1s << " - " << y1e << endl; - drawFastVLine_cont_noFill(cx + x, cy + y1s, y1e - y1s + 1, color); - } - else if (y2StartFound && y2EndSearching) // we found start of lower line but we are still searching for the end - { // which we haven't found in the loop so the last pixel in a column must be the end - drawFastVLine_cont_noFill(cx + x, cy + y2s, ymax - y2s + 1, color); - } - } - disableCS(); - } -} -#endif - -void ILI9341_due::screenshotToConsole() -{ - uint16_t color565; - uint8_t lastColor[3]; - uint8_t color[3]; - uint32_t sameColorPixelCount = 0; - uint16_t sameColorPixelCount16 = 0; - uint32_t sameColorStartIndex = 0; - uint32_t totalImageDataLength = 0; - - Serial.println(F("==== PIXEL DATA START ====")); - //uint16_t x=0; - //uint16_t y=0; - setAddr_cont(0, 0, _width - 1, _height - 1); - writecommand_cont(ILI9341_RAMRD); // read from RAM - readdata8_cont(); // dummy read, also sets DC high - -#if SPI_MODE_DMA - read_cont(color, 3); - lastColor[0] = color[0]; - lastColor[1] = color[1]; - lastColor[2] = color[2]; -#elif SPI_MODE_NORMAL | SPI_MODE_EXTENDED - lastColor[0] = color[0] = read8_cont(); - lastColor[1] = color[1] = read8_cont(); - lastColor[2] = color[2] = read8_cont(); -#endif - printHex8(color, 3); //write color of the first pixel - totalImageDataLength += 6; - sameColorStartIndex = 0; - - for (uint32_t i = 1; i < _width*_height; i++) - { -#if SPI_MODE_DMA - read_cont(color, 3); -#elif SPI_MODE_NORMAL | SPI_MODE_EXTENDED - color[0] = read8_cont(); - color[1] = read8_cont(); - color[2] = read8_cont(); -#endif - - if (color[0] != lastColor[0] || - color[1] != lastColor[1] || - color[2] != lastColor[2]) - { - sameColorPixelCount = i - sameColorStartIndex; - if (sameColorPixelCount > 65535) - { - sameColorPixelCount16 = 65535; - printHex16(&sameColorPixelCount16, 1); - printHex8(lastColor, 3); - totalImageDataLength += 10; - sameColorPixelCount16 = sameColorPixelCount - 65535; - } - else - sameColorPixelCount16 = sameColorPixelCount; - printHex16(&sameColorPixelCount16, 1); - printHex8(color, 3); - totalImageDataLength += 10; - - sameColorStartIndex = i; - lastColor[0] = color[0]; - lastColor[1] = color[1]; - lastColor[2] = color[2]; - } - } - sameColorPixelCount = _width*_height - sameColorStartIndex; - if (sameColorPixelCount > 65535) - { - sameColorPixelCount16 = 65535; - printHex16(&sameColorPixelCount16, 1); - printHex8(lastColor, 3); - totalImageDataLength += 10; - sameColorPixelCount16 = sameColorPixelCount - 65535; - } - else - sameColorPixelCount16 = sameColorPixelCount; - printHex16(&sameColorPixelCount16, 1); - totalImageDataLength += 4; - printHex32(&totalImageDataLength, 1); - - /*for(uint16_t x=0; x<_width; x++) - { - for(uint16_t y=0; y<_height; y++) - { - color[0] = read8(); - color[1] = read8(); - color[2] = read8(); - - if(color[0] != lastColor[0] || - color[1] != lastColor[1] || - color[2] != lastColor[2]) - { - - } - - PrintHex8(color, 3); - } - }*/ - Serial.println(); - Serial.println(F("==== PIXEL DATA END ====")); - Serial.print(F("Total Image Data Length: ")); - Serial.println(totalImageDataLength); -#if SPI_MODE_DMA - _dmaSpi.init(ILI9341_SPI_CLKDIVIDER); -#endif - disableCS(); -} - -/* -This is the core graphics library for all our displays, providing a common -set of graphics primitives (points, lines, circles, etc.). It needs to bex -paired with a hardware-specific library for each display device we carry -(to handle the lower-level functions). - -Adafruit invests time and resources providing this open source code, please -support Adafruit & open-source hardware by purchasing products from Adafruit! - -Copyright (c) 2013 Adafruit Industries. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "glcdfont.c" - -// Draw a circle outline -void ILI9341_due::drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) -{ - int16_t f = 1 - r; - int16_t ddF_x = 1; - int16_t ddF_y = -2 * r; - int16_t x = 0; - int16_t y = r; - - drawPixel_cont(x0, y0 + r, color); - drawPixel_cont(x0, y0 - r, color); - drawPixel_cont(x0 + r, y0, color); - drawPixel_cont(x0 - r, y0, color); - - while (x < y) { - if (f >= 0) { - y--; - ddF_y += 2; - f += ddF_y; - } - x++; - ddF_x += 2; - f += ddF_x; - - drawPixel_cont(x0 + x, y0 + y, color); - drawPixel_cont(x0 - x, y0 + y, color); - drawPixel_cont(x0 + x, y0 - y, color); - drawPixel_cont(x0 - x, y0 - y, color); - drawPixel_cont(x0 + y, y0 + x, color); - drawPixel_cont(x0 - y, y0 + x, color); - drawPixel_cont(x0 + y, y0 - x, color); - drawPixel_cont(x0 - y, y0 - x, color); - } - disableCS(); -} - - -void ILI9341_due::drawCircleHelper(int16_t x0, int16_t y0, - int16_t r, uint8_t cornername, uint16_t color) -{ - int16_t f = 1 - r; - int16_t ddF_x = 1; - int16_t ddF_y = -2 * r; - int16_t x = 0; - int16_t y = r; - - while (x < y) { - if (f >= 0) { - y--; - ddF_y += 2; - f += ddF_y; - } - x++; - ddF_x += 2; - f += ddF_x; - if (cornername & 0x4) { - drawPixel_cont(x0 + x, y0 + y, color); - drawPixel_cont(x0 + y, y0 + x, color); - } - if (cornername & 0x2) { - drawPixel_cont(x0 + x, y0 - y, color); - drawPixel_cont(x0 + y, y0 - x, color); - } - if (cornername & 0x8) { - drawPixel_cont(x0 - y, y0 + x, color); - drawPixel_cont(x0 - x, y0 + y, color); - } - if (cornername & 0x1) { - drawPixel_cont(x0 - y, y0 - x, color); - drawPixel_cont(x0 - x, y0 - y, color); - } - } - disableCS(); -} - -void ILI9341_due::fillCircle(int16_t x0, int16_t y0, int16_t r, - uint16_t color) -{ - drawFastVLine(x0, y0 - r, 2 * r + 1, color); - fillCircleHelper(x0, y0, r, 3, 0, color); -} - -// Used to do circles and roundrects -void ILI9341_due::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, - uint8_t cornername, int16_t delta, uint16_t color) -{ - - int16_t f = 1 - r; - int16_t ddF_x = 1; - int16_t ddF_y = -2 * r; - int16_t x = 0; - int16_t y = r; - -#if SPI_MODE_DMA - fillScanline(color, 2 * max(x, y) + 1 + delta); -#endif - enableCS(); - while (x < y) { - if (f >= 0) { - y--; - ddF_y += 2; - f += ddF_y; - } - x++; - ddF_x += 2; - f += ddF_x; - - if (cornername & 0x1) { - drawFastVLine_cont_noFill(x0 + x, y0 - y, 2 * y + 1 + delta, color); - drawFastVLine_cont_noFill(x0 + y, y0 - x, 2 * x + 1 + delta, color); - } - if (cornername & 0x2) { - drawFastVLine_cont_noFill(x0 - x, y0 - y, 2 * y + 1 + delta, color); - drawFastVLine_cont_noFill(x0 - y, y0 - x, 2 * x + 1 + delta, color); - } - } - disableCS(); -} - -// Bresenham's algorithm - thx wikpedia -void ILI9341_due::drawLine(int16_t x0, int16_t y0, - int16_t x1, int16_t y1, uint16_t color) -{ - if (y0 == y1) { - if (x1 > x0) { - drawFastHLine(x0, y0, x1 - x0 + 1, color); - } - else if (x1 < x0) { - drawFastHLine(x1, y0, x0 - x1 + 1, color); - } - else { - drawPixel(x0, y0, color); - } - return; - } - else if (x0 == x1) { - if (y1 > y0) { - drawFastVLine(x0, y0, y1 - y0 + 1, color); - } - else { - drawFastVLine(x0, y1, y0 - y1 + 1, color); - } - return; - } - - bool steep = abs(y1 - y0) > abs(x1 - x0); - if (steep) { - swap(x0, y0); - swap(x1, y1); - } - if (x0 > x1) { - swap(x0, x1); - swap(y0, y1); - } - - int16_t dx, dy; - dx = x1 - x0; - dy = abs(y1 - y0); - - int16_t err = dx / 2; - int16_t ystep; - - if (y0 < y1) { - ystep = 1; - } - else { - ystep = -1; - } - - int16_t xbegin = x0; -#if SPI_MODE_DMA - fillScanline(color); -#endif - enableCS(); - if (steep) { - for (; x0 <= x1; x0++) { - err -= dy; - if (err < 0) { - int16_t len = x0 - xbegin; - if (len) { - writeVLine_cont_noCS_noFill(y0, xbegin, len + 1, color); - } - else { - writePixel_cont_noCS(y0, x0, color); - } - xbegin = x0 + 1; - y0 += ystep; - err += dx; - } - } - if (x0 > xbegin + 1) { - writeVLine_cont_noCS_noFill(y0, xbegin, x0 - xbegin, color); - } - - } - else { - for (; x0 <= x1; x0++) { - err -= dy; - if (err < 0) { - int16_t len = x0 - xbegin; - if (len) { - writeHLine_cont_noCS_noFill(xbegin, y0, len + 1, color); - } - else { - writePixel_cont_noCS(x0, y0, color); - } - xbegin = x0 + 1; - y0 += ystep; - err += dx; - } - } - if (x0 > xbegin + 1) { - writeHLine_cont_noCS_noFill(xbegin, y0, x0 - xbegin, color); - } - } - disableCS(); -} - - -// Draw a rectangle -//void ILI9341_due::drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) -//{ -// writeHLine_cont(x, y, w, color); -// writeHLine_cont(x, y+h-1, w, color); -// writeVLine_cont(x, y, h, color); -// writeVLine_last(x+w-1, y, h, color); -//} - -void ILI9341_due::drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) -{ -#if SPI_MODE_DMA - fillScanline(color, max(w, h)); -#endif - enableCS(); - writeHLine_cont_noCS_noFill(x, y, w, color); - writeHLine_cont_noCS_noFill(x, y + h - 1, w, color); - writeVLine_cont_noCS_noFill(x, y, h, color); - writeVLine_cont_noCS_noFill(x + w - 1, y, h, color); - disableCS(); -} - -// Draw a rounded rectangle -void ILI9341_due::drawRoundRect(int16_t x, int16_t y, int16_t w, - int16_t h, int16_t r, uint16_t color) -{ - if ( h <= 2 * r || w <= 2 * r) return; -#if SPI_MODE_DMA - fillScanline(color, max(w, h)); -#endif - enableCS(); - // smarter version - writeHLine_cont_noCS_noFill(x + r, y, w - 2 * r, color); // Top - writeHLine_cont_noCS_noFill(x + r, y + h - 1, w - 2 * r, color); // Bottom - writeVLine_cont_noCS_noFill(x, y + r, h - 2 * r, color); // Left - writeVLine_cont_noCS_noFill(x + w - 1, y + r, h - 2 * r, color); // Right - disableCS(); - // draw four corners - drawCircleHelper(x + r, y + r, r, 1, color); - drawCircleHelper(x + w - r - 1, y + r, r, 2, color); - drawCircleHelper(x + w - r - 1, y + h - r - 1, r, 4, color); - drawCircleHelper(x + r, y + h - r - 1, r, 8, color); -} - -// Fill a rounded rectangle -void ILI9341_due::fillRoundRect(int16_t x, int16_t y, int16_t w, - int16_t h, int16_t r, uint16_t color) -{ - // smarter version - fillRect(x + r, y, w - 2 * r, h, color); - - // draw four corners - fillCircleHelper(x + w - r - 1, y + r, r, 1, h - 2 * r - 1, color); - fillCircleHelper(x + r, y + r, r, 2, h - 2 * r - 1, color); -} - -// Draw a triangle -void ILI9341_due::drawTriangle(int16_t x0, int16_t y0, - int16_t x1, int16_t y1, - int16_t x2, int16_t y2, uint16_t color) -{ - drawLine(x0, y0, x1, y1, color); - drawLine(x1, y1, x2, y2, color); - drawLine(x2, y2, x0, y0, color); -} - -// Fill a triangle -void ILI9341_due::fillTriangle(int16_t x0, int16_t y0, - int16_t x1, int16_t y1, - int16_t x2, int16_t y2, uint16_t color) -{ - - int16_t a, b, y, last; - - // Sort coordinates by Y order (y2 >= y1 >= y0) - if (y0 > y1) { - swap(y0, y1); swap(x0, x1); - } - if (y1 > y2) { - swap(y2, y1); swap(x2, x1); - } - if (y0 > y1) { - swap(y0, y1); swap(x0, x1); - } - - if (y0 == y2) { // Handle awkward all-on-same-line case as its own thing - a = b = x0; - if (x1 < a) a = x1; - else if (x1 > b) b = x1; - if (x2 < a) a = x2; - else if (x2 > b) b = x2; - drawFastHLine(a, y0, b - a + 1, color); - return; - } - - int16_t - dx01 = x1 - x0, - dy01 = y1 - y0, - dx02 = x2 - x0, - dy02 = y2 - y0, - dx12 = x2 - x1, - dy12 = y2 - y1, - sa = 0, - sb = 0; - - // For upper part of triangle, find scanline crossings for segments - // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1 - // is included here (and second loop will be skipped, avoiding a /0 - // error there), otherwise scanline y1 is skipped here and handled - // in the second loop...which also avoids a /0 error here if y0=y1 - // (flat-topped triangle). - if (y1 == y2) last = y1; // Include y1 scanline - else last = y1 - 1; // Skip it - -#if SPI_MODE_DMA - fillScanline(color, max(x0, max(x1, x2)) - min(x0, min(x1, x2))); // fill scanline with the widest scanline that'll be used -#endif - enableCS(); - for (y = y0; y <= last; y++) { - a = x0 + sa / dy01; - b = x0 + sb / dy02; - sa += dx01; - sb += dx02; - /* longhand: - a = x0 + (x1 - x0) * (y - y0) / (y1 - y0); - b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); - */ - if (a > b) swap(a, b); - writeHLine_cont_noCS_noFill(a, y, b - a + 1, color); - } - - // For lower part of triangle, find scanline crossings for segments - // 0-2 and 1-2. This loop is skipped if y1=y2. - sa = dx12 * (y - y1); - sb = dx02 * (y - y0); - for (; y <= y2; y++) { - a = x1 + sa / dy12; - b = x0 + sb / dy02; - sa += dx12; - sb += dx02; - /* longhand: - a = x1 + (x2 - x1) * (y - y1) / (y2 - y1); - b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); - */ - if (a > b) swap(a, b); - writeHLine_cont_noCS_noFill(a, y, b - a + 1, color); - } - disableCS(); -} - -// draws monochrome (single color) bitmaps -void ILI9341_due::drawBitmap(int16_t x, int16_t y, - const uint8_t *bitmap, int16_t w, int16_t h, - uint16_t color) -{ - - int16_t i, j, byteWidth = (w + 7) / 8; - -#if SPI_MODE_DMA - _hiByte = highByte(color); - _loByte = lowByte(color); - fillScanline(color, w); -#endif - - for (j = 0; j < h; j++) - { - for (i = 0; i < w; i++) - { - if (pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) { -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - drawPixel(x+i, y+j, color); -#elif SPI_MODE_DMA - _scanlineBuffer[i << 1] = _hiByte; - _scanlineBuffer[(i << 1) + 1] = _loByte; -#endif - } - } -#if SPI_MODE_DMA - setAddrAndRW_cont(x + i, y + j, x + w - 1, y + j); - writeScanline_cont(w); -#endif - } - disableCS(); -} - -#ifdef FEATURE_PRINT_ENABLED -size_t ILI9341_due::write(uint8_t c) { - if (c == '\n') { - _cursorY += _textsize * 8; - _cursorX = 0; - } - else if (c == '\r') { - // skip em - } - else { - drawChar(_cursorX, _cursorY, c, _textcolor, _textbgcolor, _textsize); - _cursorX += _textsize * 6; - if (_wrap && (_cursorX > (_width - _textsize * 6))) { - _cursorY += _textsize * 8; - _cursorX = 0; - } - } - return 1; -} - -// Draw a character -void ILI9341_due::drawChar(int16_t x, int16_t y, unsigned char c, - uint16_t fgcolor, uint16_t bgcolor, uint8_t size) -{ - if ((x >= _width) || // Clip right - (y >= _height) || // Clip bottom - ((x + 6 * size - 1) < 0) || // Clip left TODO: is this correct? - ((y + 8 * size - 1) < 0)) // Clip top TODO: is this correct? - return; - - enableCS(); - - if (fgcolor == bgcolor) - { - // This transparent approach is only about 20% faster - if (size == 1) - { - uint8_t mask = 0x01; - int16_t xoff, yoff; -#if SPI_MODE_DMA - fillScanline(fgcolor, 5); -#endif - for (yoff = 0; yoff < 8; yoff++) { - uint8_t line = 0; - for (xoff = 0; xoff < 5; xoff++) { - if (font[c * 5 + xoff] & mask) line |= 1; - line <<= 1; - } - line >>= 1; - xoff = 0; - while (line) { - if (line == 0x1F) { - writeHLine_cont_noCS_noFill(x + xoff, y + yoff, 5, fgcolor); - break; - } - else if (line == 0x1E) { - writeHLine_cont_noCS_noFill(x + xoff, y + yoff, 4, fgcolor); - break; - } - else if ((line & 0x1C) == 0x1C) { - writeHLine_cont_noCS_noFill(x + xoff, y + yoff, 3, fgcolor); - line <<= 4; - xoff += 4; - } - else if ((line & 0x18) == 0x18) { - writeHLine_cont_noCS_noFill(x + xoff, y + yoff, 2, fgcolor); - line <<= 3; - xoff += 3; - } - else if ((line & 0x10) == 0x10) { - writePixel_cont_noCS(x + xoff, y + yoff, fgcolor); - line <<= 2; - xoff += 2; - } - else { - line <<= 1; - xoff += 1; - } - } - mask = mask << 1; - } - } - else { - uint8_t mask = 0x01; - int16_t xoff, yoff; - for (yoff = 0; yoff < 8; yoff++) { - uint8_t line = 0; - for (xoff = 0; xoff < 5; xoff++) { - if (font[c * 5 + xoff] & mask) line |= 1; - line <<= 1; - } - line >>= 1; - xoff = 0; - while (line) { - if (line == 0x1F) { - fillRect(x + xoff * size, y + yoff * size, - 5 * size, size, fgcolor); - break; - } - else if (line == 0x1E) { - fillRect(x + xoff * size, y + yoff * size, - 4 * size, size, fgcolor); - break; - } - else if ((line & 0x1C) == 0x1C) { - fillRect(x + xoff * size, y + yoff * size, - 3 * size, size, fgcolor); - line <<= 4; - xoff += 4; - } - else if ((line & 0x18) == 0x18) { - fillRect(x + xoff * size, y + yoff * size, - 2 * size, size, fgcolor); - line <<= 3; - xoff += 3; - } - else if ((line & 0x10) == 0x10) { - fillRect(x + xoff * size, y + yoff * size, - size, size, fgcolor); - line <<= 2; - xoff += 2; - } - else { - line <<= 1; - xoff += 1; - } - } - mask = mask << 1; - } - } - } - else { - // This solid background approach is about 5 time faster - setAddrAndRW_cont(x, y, x + 6 * size - 1, y + 8 * size); - setDCForData(); - uint8_t xr, yr; - uint8_t mask = 0x01; - uint16_t color; - uint16_t scanlineId = 0; - // for each pixel row - for (y = 0; y < 8; y++) - { - //scanlineId = 0; - for (yr = 0; yr < size; yr++) - { - scanlineId = 0; - // draw 5px horizontal "bitmap" line - for (x = 0; x < 5; x++) { - if (font[c * 5 + x] & mask) { - color = fgcolor; - } - else { - color = bgcolor; - } - for (xr = 0; xr < size; xr++) { -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - write16_cont(color); -#elif SPI_MODE_DMA - _scanlineBuffer[scanlineId++] = highByte(color); - _scanlineBuffer[scanlineId++] = lowByte(color); -#endif - } - } - // draw a gap between chars (1px for size of 1) - for (xr = 0; xr < size; xr++) { -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - write16_cont(bgcolor); -#elif SPI_MODE_DMA - _scanlineBuffer[scanlineId++] = highByte(bgcolor); - _scanlineBuffer[scanlineId++] = lowByte(bgcolor); -#endif - } -#if SPI_MODE_DMA - writeScanline_cont(scanlineId - 1); -#endif - } - mask = mask << 1; - } - // draw an empty line below a character -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - uint32_t n = 6 * size * size; - do { - write16_cont(bgcolor); - n--; - } while (n > 0); -#elif SPI_MODE_DMA - fillScanline(bgcolor, 6 * size); - for (y = 0; y < size; y++) - { - writeScanline_cont(6 * size); - } -#endif - } - disableCS(); -} - -void ILI9341_due::setCursor(int16_t x, int16_t y) { - _cursorX = x; - _cursorY = y; -} - -void ILI9341_due::setTextSize(uint8_t s) { - _textsize = (s > 0) ? s : 1; -} - -void ILI9341_due::setTextColor(uint16_t c) { - // For 'transparent' background, we'll set the bg - // to the same as fg instead of using a flag - _textcolor = _textbgcolor = c; -} - -void ILI9341_due::setTextColor(uint16_t c, uint16_t b) { - _textcolor = c; - _textbgcolor = b; -} - -void ILI9341_due::setTextWrap(boolean w) { - _wrap = w; -} -#endif - -uint8_t ILI9341_due::getRotation(void) { - return _rotation; -} - -// if true, tft will be blank (white), -// display's frame buffer is unaffected -// (you can write to it without showing content on the screen) -void ILI9341_due::display(boolean d){ - writecommand_last(d ? ILI9341_DISPON : ILI9341_DISPOFF); -} - -// puts display in/out of sleep mode -void ILI9341_due::sleep(boolean s) -{ - writecommand_last(s ? ILI9341_SLPIN : ILI9341_SLPOUT); - delay(120); -} - -void ILI9341_due::idle(boolean i){ - writecommand_last(i ? ILI9341_IDMON : ILI9341_IDMOFF); -} - - -void ILI9341_due::setPowerLevel(pwrLevel p) -{ - switch (p) - { - case PWRLEVEL_NORMAL: - if (_isIdle) { idle(false); _isIdle = false; } - if (_isInSleep) { sleep(false); _isInSleep = false; } - break; - case PWRLEVEL_IDLE: - if (!_isIdle) { idle(true); _isIdle = true; } - if (_isInSleep) { sleep(false); _isInSleep = false; } - break; - case PWRLEVEL_SLEEP: - if (!_isInSleep) { sleep(true); _isInSleep = true; } - if (_isIdle) { idle(false); _isIdle = false; } - break; - } -} - -#ifdef FEATURE_ARC_ENABLED -void ILI9341_due::setArcParams(float arcAngleMax, int arcAngleOffset) -{ - _arcAngleMax = arcAngleMax; - _arcAngleOffset = arcAngleOffset; -} -#endif - -//uint8_t ILI9341_due::spiread(void) { -// uint8_t r = 0; -// -// //SPI.setClockDivider(_cs, 12); // 8-ish MHz (full! speed!) -// //SPI.setBitOrder(_cs, MSBFIRST); -// //SPI.setDataMode(_cs, SPI_MODE0); -// r = SPI.transfer(_cs, 0x00); -// Serial.print("read: 0x"); Serial.print(r, HEX); -// -// return r; -//} -// -//void ILI9341_due::spiwrite(uint8_t c) { -// -// //Serial.print("0x"); Serial.print(c, HEX); Serial.print(", "); -// -// -// //SPI.setClockDivider(_cs, 12); // 8-ish MHz (full! speed!) -// //SPI.setBitOrder(_cs, MSBFIRST); -// //SPI.setDataMode(_cs, SPI_MODE0); -// SPI.transfer(_cs, c); -// -//} - -//void ILI9341_due::writecommand(uint8_t c) { -// //*dcport &= ~dcpinmask; -// digitalWrite(_dc, LOW); -// //*clkport &= ~clkpinmask; // clkport is a NULL pointer when hwSPI==true -// //digitalWrite(_sclk, LOW); -// //*csport &= ~cspinmask; -// //digitalWrite(_cs, LOW); -// -// spiwrite(c); -// -// //*csport |= cspinmask; -// //digitalWrite(_cs, HIGH); -//} -// -// -//void ILI9341_due::writedata(uint8_t c) { -// //*dcport |= dcpinmask; -// digitalWrite(_dc, HIGH); -// //*clkport &= ~clkpinmask; // clkport is a NULL pointer when hwSPI==true -// //digitalWrite(_sclk, LOW); -// //*csport &= ~cspinmask; -// //digitalWrite(_cs, LOW); -// -// spiwrite(c); -// -// //digitalWrite(_cs, HIGH); -// //*csport |= cspinmask; -//} - -void ILI9341_due::printHex8(uint8_t *data, uint8_t length) // prints 8-bit data in hex -{ - char tmp[length * 2 + 1]; - byte first; - byte second; - for (int i = 0; i < length; i++) { - first = (data[i] >> 4) & 0x0f; - second = data[i] & 0x0f; - // base for converting single digit numbers to ASCII is 48 - // base for 10-16 to become upper-case characters A-F is 55 - // note: difference is 7 - tmp[i * 2] = first + 48; - tmp[i * 2 + 1] = second + 48; - if (first > 9) tmp[i * 2] += 7; - if (second > 9) tmp[i * 2 + 1] += 7; - } - tmp[length * 2] = 0; - Serial.print(tmp); -} - - -void ILI9341_due::printHex16(uint16_t *data, uint8_t length) // prints 8-bit data in hex -{ - char tmp[length * 4 + 1]; - byte first; - byte second; - byte third; - byte fourth; - for (int i = 0; i < length; i++) { - first = (data[i] >> 12) & 0x0f; - second = (data[i] >> 8) & 0x0f; - third = (data[i] >> 4) & 0x0f; - fourth = data[i] & 0x0f; - //Serial << first << " " << second << " " << third << " " << fourth << endl; - // base for converting single digit numbers to ASCII is 48 - // base for 10-16 to become upper-case characters A-F is 55 - // note: difference is 7 - tmp[i * 4] = first + 48; - tmp[i * 4 + 1] = second + 48; - tmp[i * 4 + 2] = third + 48; - tmp[i * 4 + 3] = fourth + 48; - //tmp[i*5+4] = 32; // add trailing space - if (first > 9) tmp[i * 4] += 7; - if (second > 9) tmp[i * 4 + 1] += 7; - if (third > 9) tmp[i * 4 + 2] += 7; - if (fourth > 9) tmp[i * 4 + 3] += 7; - } - tmp[length * 4] = 0; - Serial.print(tmp); -} - -void ILI9341_due::printHex32(uint32_t *data, uint8_t length) // prints 8-bit data in hex -{ - char tmp[length * 8 + 1]; - byte dataByte[8]; - for (int i = 0; i < length; i++) { - dataByte[0] = (data[i] >> 28) & 0x0f; - dataByte[1] = (data[i] >> 24) & 0x0f; - dataByte[2] = (data[i] >> 20) & 0x0f; - dataByte[3] = (data[i] >> 16) & 0x0f; - dataByte[4] = (data[i] >> 12) & 0x0f; - dataByte[5] = (data[i] >> 8) & 0x0f; - dataByte[6] = (data[i] >> 4) & 0x0f; - dataByte[7] = data[i] & 0x0f; - //Serial << first << " " << second << " " << third << " " << fourth << endl; - // base for converting single digit numbers to ASCII is 48 - // base for 10-16 to become upper-case characters A-F is 55 - // note: difference is 7 - tmp[i * 4] = dataByte[0] + 48; - tmp[i * 4 + 1] = dataByte[1] + 48; - tmp[i * 4 + 2] = dataByte[2] + 48; - tmp[i * 4 + 3] = dataByte[3] + 48; - tmp[i * 4 + 4] = dataByte[4] + 48; - tmp[i * 4 + 5] = dataByte[5] + 48; - tmp[i * 4 + 6] = dataByte[6] + 48; - tmp[i * 4 + 7] = dataByte[7] + 48; - //tmp[i*5+4] = 32; // add trailing space - if (dataByte[0] > 9) tmp[i * 4] += 7; - if (dataByte[1] > 9) tmp[i * 4 + 1] += 7; - if (dataByte[2] > 9) tmp[i * 4 + 2] += 7; - if (dataByte[3] > 9) tmp[i * 4 + 3] += 7; - if (dataByte[4] > 9) tmp[i * 4 + 4] += 7; - if (dataByte[5] > 9) tmp[i * 4 + 5] += 7; - if (dataByte[6] > 9) tmp[i * 4 + 6] += 7; - if (dataByte[7] > 9) tmp[i * 4 + 7] += 7; - } - tmp[length * 8] = 0; - Serial.print(tmp); -} diff --git a/STM32F1/libraries/ILI9341_due_STM/ILI9341_due.h b/STM32F1/libraries/ILI9341_due_STM/ILI9341_due.h deleted file mode 100644 index f06dd7153..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/ILI9341_due.h +++ /dev/null @@ -1,1171 +0,0 @@ -/* -v0.94.000 - -ILI9341_due_.h - Arduino Due library for interfacing with ILI9341-based TFTs - -Copyright (c) 2014 Marek Buriak - -2.4 TFT Pin-out -T_IRQ T_DO T_DIN T_CS T_CLK MISO LED CLK MOSI DC RESET CS GND VCC - -This library is based on ILI9341_t3 library from Paul Stoffregen -(https://github.com/PaulStoffregen/ILI9341_t3), Adafruit_ILI9341 -and Adafruit_GFX libraries from Limor Fried/Ladyada -(https://github.com/adafruit/Adafruit_ILI9341). - -This file is part of the Arduino ILI9341_due library. -Sources for this library can be found at https://github.com/marekburiak/ILI9341_Due. - -ILI9341_due is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 2.1 of the License, or -(at your option) any later version. - -ILI9341_due is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with ILI9341_due. If not, see . - -*/ - -/*************************************************** -This is our library for the Adafruit ILI9341 Breakout and Shield -----> http://www.adafruit.com/products/1651 - -Check out the links above for our tutorials and wiring diagrams -These displays use SPI to communicate, 4 or 5 pins are required to -interface (RST is optional) -Adafruit invests time and resources providing this open source code, -please support Adafruit and open-source hardware by purchasing -products from Adafruit! - -Written by Limor Fried/Ladyada for Adafruit Industries. -MIT license, all text above must be included in any redistribution -****************************************************/ - -#ifndef _ILI9341_dueH_ -#define _ILI9341_dueH_ - -#if defined (__STM32F1__) - #include - #include - #include -// #include "pins_arduino.h" - #include "wiring_private.h" - #include -#endif - -//#include "../Streaming/Streaming.h" - -// USER CONFIG SECTION START - -// comment out the SPI mode you want to use (does not matter for AVR) -//#define ILI9341_SPI_MODE_NORMAL // uses SPI library -//#define ILI9341_SPI_MODE_EXTENDED // uses Extended SPI in Due, make sure you use pin 4, 10 or 52 for CS -#define ILI9341_SPI_MODE_DMA // uses DMA in Due - -// set the clock divider -#ifdef __SAM3X8E__ -#define ILI9341_SPI_CLKDIVIDER 2 // for Due -#else -#define ILI9341_SPI_CLKDIVIDER SPI_CLOCK_DIV2 // for Uno, Mega,... -#endif - -// comment out the features you do not need to save flash memory and RAM (especially on AVR) - -// commenting out/disabling the ARC feature will exclude the drawArc function. It is going to save a few ROM bytes. -#define FEATURE_ARC_ENABLED -// commenting out/disabling the PRINT feature will exclude the drawChars and print functions, it saves around 3.6kB ROM and 1.3kB RAM(!) -// I recommend using gText for drawing the text. -#define FEATURE_PRINT_ENABLED - -// number representing the maximum angle (e.g. if 100, then if you pass in start=0 and end=50, you get a half circle) -// this can be changed with setArcParams function at runtime -#define ARC_ANGLE_MAX 360 -// rotational offset in degrees defining position of value 0 (-90 will put it at the top of circle) -// this can be changed with setArcParams function at runtime -#define ARC_ANGLE_OFFSET -90 - -// USER CONFIG SECTION END - -#ifdef __AVR__ -#define SPI_MODE_NORMAL 1 -#define SPI_MODE_EXTENDED 0 -#define SPI_MODE_DMA 0 -#else -#ifndef ILI9341_SPI_MODE_NORMAL -#define SPI_MODE_NORMAL 0 -#else -#define SPI_MODE_NORMAL 1 -#endif - -#ifndef ILI9341_SPI_MODE_EXTENDED -#define SPI_MODE_EXTENDED 0 -#else -#define SPI_MODE_EXTENDED 1 -#endif - -#ifndef ILI9341_SPI_MODE_DMA -#define SPI_MODE_DMA 0 -#else -#define SPI_MODE_DMA 1 -#endif -#endif - -#include "Arduino.h" -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED -#include -#elif SPI_MODE_DMA -#include "ILI_SdSpi.h" -#include -#endif - -#ifdef __AVR__ -#include -#endif - -#define ILI9341_TFTWIDTH 240 -#define ILI9341_TFTHEIGHT 320 - -#define ILI9341_NOP 0x00 -#define ILI9341_SWRESET 0x01 -#define ILI9341_RDDID 0x04 -#define ILI9341_RDDST 0x09 - -#define ILI9341_SLPIN 0x10 -#define ILI9341_SLPOUT 0x11 -#define ILI9341_PTLON 0x12 -#define ILI9341_NORON 0x13 - -#define ILI9341_RDMODE 0x0A -#define ILI9341_RDMADCTL 0x0B -#define ILI9341_RDPIXFMT 0x0C -#define ILI9341_RDIMGFMT 0x0A -#define ILI9341_RDSELFDIAG 0x0F - -#define ILI9341_INVOFF 0x20 -#define ILI9341_INVON 0x21 -#define ILI9341_GAMMASET 0x26 -#define ILI9341_DISPOFF 0x28 -#define ILI9341_DISPON 0x29 - -#define ILI9341_CASET 0x2A -#define ILI9341_PASET 0x2B -#define ILI9341_RAMWR 0x2C -#define ILI9341_RAMRD 0x2E - -#define ILI9341_PTLAR 0x30 -#define ILI9341_MADCTL 0x36 -#define ILI9341_IDMOFF 0x38 -#define ILI9341_IDMON 0x39 -#define ILI9341_PIXFMT 0x3A - -#define ILI9341_FRMCTR1 0xB1 -#define ILI9341_FRMCTR2 0xB2 -#define ILI9341_FRMCTR3 0xB3 -#define ILI9341_INVCTR 0xB4 -#define ILI9341_DFUNCTR 0xB6 - -#define ILI9341_PWCTR1 0xC0 -#define ILI9341_PWCTR2 0xC1 -#define ILI9341_PWCTR3 0xC2 -#define ILI9341_PWCTR4 0xC3 -#define ILI9341_PWCTR5 0xC4 -#define ILI9341_VMCTR1 0xC5 -#define ILI9341_VMCTR2 0xC7 - -#define ILI9341_RDID1 0xDA -#define ILI9341_RDID2 0xDB -#define ILI9341_RDID3 0xDC -#define ILI9341_RDID4 0xDD - -#define ILI9341_GMCTRP1 0xE0 -#define ILI9341_GMCTRN1 0xE1 -/* -#define ILI9341_PWCTR6 0xFC - -*/ - -// Color definitions -#define ILI9341_BLACK 0x0000 -#define ILI9341_BLUE 0x001F -#define ILI9341_RED 0xF800 -#define ILI9341_GREEN 0x07E0 -#define ILI9341_CYAN 0x07FF -#define ILI9341_MAGENTA 0xF81F -#define ILI9341_YELLOW 0xFFE0 -#define ILI9341_WHITE 0xFFFF - -typedef uint8_t pwrLevel; -typedef enum { - iliRotation0 = 0, - iliRotation90 = 1, - iliRotation180 = 2, - iliRotation270 = 3 -} iliRotation; - -// Normal Mode On (full display), Idle Mode Off, Sleep Out. -// In this mode, the display is able to show maximum 262,144 colors. -#define PWRLEVEL_NORMAL 1 - -// Normal Mode On (full display), Idle Mode On, Sleep Out. -// In this mode, the full display area is used but with 8 colors. -#define PWRLEVEL_IDLE 2 - -//In this mode, the DC : DC converter, Internal oscillator and panel driver circuit are stopped. Only the MCU -// interface and memory works with VDDI power supply. Contents of the memory are safe. -#define PWRLEVEL_SLEEP 3 - -#define SCANLINE_BUFFER_SIZE 640 // 320 2-byte pixels - -class ILI9341_due -#ifdef FEATURE_PRINT_ENABLED - : public Print -#endif -{ - public: - ILI9341_due(uint8_t cs, uint8_t dc, uint8_t rst = 255); -#if SPI_MODE_DMA - ILI_SdSpi _dmaSpi; - uint8_t _scanlineBuffer[SCANLINE_BUFFER_SIZE]; - uint8_t _hiByte, _loByte; - -#endif - bool _isIdle, _isInSleep; - - bool begin(void); - void pushColor(uint16_t color); - void pushColors(uint16_t *colors, uint16_t offset, uint16_t len); - void pushColors565(uint8_t *colors, uint16_t offset, uint16_t len); - void fillScreen(uint16_t color); - void drawPixel(int16_t x, int16_t y, uint16_t color); - void drawPixel_cont(int16_t x, int16_t y, uint16_t color); - void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); - void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); - void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); - void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); - void setRotation(iliRotation r); - void invertDisplay(boolean i); - void display(boolean d); - void normalModeOn(); - void sleep(boolean s); - void idle(boolean i); - void setPowerLevel(pwrLevel p); - void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); - void setSPIClockDivider(uint8_t divider); - -#ifdef FEATURE_ARC_ENABLED - void setArcParams(float arcAngleMax, int arcAngleOffset); -#endif - // Pass 8-bit (each) R,G,B, get back 16-bit packed color - static uint16_t color565(uint8_t r, uint8_t g, uint8_t b) { - return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); - } - - //uint8_t readdata(void); - uint8_t readcommand8(uint8_t reg, uint8_t index = 0); - - // KJE Added functions to read pixel data... - uint16_t readPixel(int16_t x, int16_t y); - - - // from Adafruit_GFX.h - void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); - void drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color); - void fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); - void fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color); - void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color); - void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color); - void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color); - void fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color); - void drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color); - -#ifdef FEATURE_PRINT_ENABLED - void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size); - void setCursor(int16_t x, int16_t y); - void setTextColor(uint16_t c); - void setTextColor(uint16_t c, uint16_t bg); - void setTextSize(uint8_t s); - void setTextWrap(boolean w); - virtual size_t write(uint8_t); -#endif - int16_t width(void) { - return _width; - } - int16_t height(void) { - return _height; - } - uint8_t getRotation(void); - void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color); - void screenshotToConsole(); - void printHex8(uint8_t *data, uint8_t length); - void printHex16(uint16_t *data, uint8_t length); - void printHex32(uint32_t *data, uint8_t length); - -#ifdef FEATURE_ARC_ENABLED - inline __attribute__((always_inline)) - void drawArc(uint16_t cx, uint16_t cy, uint16_t radius, uint16_t thickness, float start, float end, uint16_t color) - { - if (start == 0 && end == _arcAngleMax) - drawArcOffsetted(cx, cy, radius, thickness, 0, _arcAngleMax, color); - else - drawArcOffsetted(cx, cy, radius, thickness, start + (_arcAngleOffset / (float)360)*_arcAngleMax, end + (_arcAngleOffset / (float)360)*_arcAngleMax, color); - } - - //int32_t cos_lookup(int32_t angle) - //{ - // float radians = (float)angle/_arcAngleMax * 2 * PI; - // //Serial << "COS_LOOKUP angle:" << (float)angle << " radians:" << radians << " cos:" << cos(radians) << " return: " << cos(radians) * (double)65535 << endl; - // return (cos(radians) * _arcAngleMax); - //} - - //int32_t sin_lookup(int32_t angle) - //{ - // float radians = (float)angle/_arcAngleMax * 2 * PI; - // //Serial << "SIN_LOOKUP angle:" << (float)angle << " radians:" << radians << " sin:" << sin(radians) << " return: " << sin(radians) * (double)65535 << endl; - // return (sin(radians) * _arcAngleMax); - //} - - - float cosDegrees(float angle) - { - float radians = angle / (float)360 * 2 * PI; - //Serial << "COS_LOOKUP angle:" << (float)angle << " radians:" << radians << " cos:" << cos(radians) << " return: " << cos(radians) * (double)65535 << endl; - return cos(radians); - } - - float sinDegrees(float angle) - { - float radians = angle / (float)360 * 2 * PI; - //Serial << "SIN_LOOKUP angle:" << (float)angle << " radians:" << radians << " sin:" << sin(radians) << " return: " << sin(radians) * (double)65535 << endl; - return sin(radians); - } -#endif - - inline __attribute__((always_inline)) - void spiwrite(uint8_t c) { -#if defined __AVR__ - SPDR = c; - asm volatile("nop"); - while (!(SPSR & _BV(SPIF))); // wait -#elif defined __SAM3X8E__ | __STM32F1__ - -#if SPI_MODE_NORMAL - SPI.transfer(c); -#endif -#endif - } - - inline __attribute__((always_inline)) - void spiwrite16(uint16_t d) { -#if defined __AVR__ - SPDR = highByte(d); - while (!(SPSR & _BV(SPIF))); - SPDR = lowByte(d); - while (!(SPSR & _BV(SPIF))); -#elif defined __SAM3X8E__ | __STM32F1__ -#if SPI_MODE_NORMAL - SPI.transfer(highByte(d)); - SPI.transfer(lowByte(d)); -#endif -#endif - } - - // writes 1 byte - // CS and DC have to be set prior to calling this method - inline __attribute__((always_inline)) - void write8_cont(uint8_t c) { -#if SPI_MODE_NORMAL - spiwrite(c); -#elif SPI_MODE_EXTENDED - SPI.transfer(_cs, c, SPI_CONTINUE); -#elif SPI_MODE_DMA - SPI.write(c); -// _dmaSpi.send(c); -#endif - } - - // writes 1 byte and disables CS - // CS and DC have to be set prior to calling this method - inline __attribute__((always_inline)) - void write8_last(uint8_t c) { -#if SPI_MODE_NORMAL - spiwrite(c); - disableCS(); -#elif SPI_MODE_EXTENDED - SPI.transfer(_cs, c, SPI_LAST); -#elif SPI_MODE_DMA - SPI.write(c); -// _dmaSpi.send(c); - disableCS(); -#endif - } - - // Writes 2 bytes - // CS, DC have to be set prior to calling this method - inline __attribute__((always_inline)) - void write16_cont(uint16_t d) { -#if SPI_MODE_NORMAL - spiwrite16(d); -#elif SPI_MODE_EXTENDED - SPI.transfer(_cs, highByte(d), SPI_CONTINUE); - SPI.transfer(_cs, lowByte(d), SPI_CONTINUE); -#elif SPI_MODE_DMA - SPI.transfer(highByte(d)); - SPI.transfer(lowByte(d)); - -// _dmaSpi.send(highByte(d)); -// _dmaSpi.send(lowByte(d)); -#endif - } - - inline __attribute__((always_inline)) - void write16_last(uint16_t d) { -#if SPI_MODE_NORMAL - spiwrite16(d); - disableCS(); -#elif SPI_MODE_EXTENDED - SPI.transfer(_cs, highByte(d), SPI_CONTINUE); - SPI.transfer(_cs, lowByte(d), SPI_LAST); -#elif SPI_MODE_DMA - SPI.transfer(highByte(d)); - SPI.transfer(lowByte(d)); - -// _dmaSpi.send(highByte(d)); -// _dmaSpi.send(lowByte(d)); - disableCS(); -#endif - } - - // Writes commands to set the GRAM area where data/pixels will be written - void setAddr_cont(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) - __attribute__((always_inline)) { - writecommand_cont(ILI9341_CASET); // Column addr set - writedata16_cont(x0); // XSTART - writedata16_cont(x1); // XEND - writecommand_cont(ILI9341_PASET); // Row addr set - writedata16_cont(y0); // YSTART - writedata16_cont(y1); // YEND - } - - //__attribute__((always_inline)) - //void setAddrAndRW_cont(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) - // { - // writecommand_cont(ILI9341_CASET); // Column addr set - // writedata16_cont(x0); // XSTART - // writedata16_cont(x1); // XEND - // writecommand_cont(ILI9341_PASET); // Row addr set - // writedata16_cont(y0); // YSTART - // writedata16_cont(y1); // YEND - // writecommand_cont(ILI9341_RAMWR); // write to RAM - //} - - // Enables CS, writes commands to set the GRAM area where data/pixels will be written - //__attribute__((always_inline)) - // void setAddr_cont(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) - //{ - // enableCS(); - // setDCForCommand(); - // write8_cont(ILI9341_CASET); // Column addr set - // setDCForData(); - // write16_cont(x0); // XSTART - // write16_cont(x1); // XEND - // setDCForCommand(); - // write8_cont(ILI9341_PASET); // Row addr set - // setDCForData(); - // write16_cont(y0); // XSTART - // write16_cont(y1); // XEND - //} - - // Enables CS, writes commands to set the GRAM area where data/pixels will be written - // Also sends RAM WRITE command which should be followed by writing data/pixels -#ifdef __SAM3X8E__ | __STM32F1__ - inline __attribute__((always_inline)) -#endif - void setAddrAndRW_cont(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) - { - enableCS(); - setDCForCommand(); - write8_cont(ILI9341_CASET); // Column addr set - setDCForData(); - write16_cont(x0); // XSTART - write16_cont(x1); // XEND - setDCForCommand(); - write8_cont(ILI9341_PASET); // Row addr set - setDCForData(); - write16_cont(y0); // XSTART - write16_cont(y1); // XEND - setDCForCommand(); - write8_cont(ILI9341_RAMWR); // RAM write - } - - // Writes commands to set the GRAM area where data/pixels will be written - // Also sends RAM WRITE command which should be followed by writing data/pixels - // CS has to be enabled prior to calling this method - //__attribute__((always_inline)) - // void setAddrAndRW_cont_noCS(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) - //{ - // setDCForCommand(); - // write8_cont(ILI9341_CASET); // Column addr set - // setDCForData(); - // write16_cont(x0); // XSTART - // write16_cont(x1); // XEND - // setDCForCommand(); - // write8_cont(ILI9341_PASET); // Row addr set - // setDCForData(); - // write16_cont(y0); // XSTART - // write16_cont(y1); // XEND - // setDCForCommand(); - // write8_cont(ILI9341_RAMWR); // Row addr set - //} - - // Enables CS, sets DC for Command, writes 1 byte - // Does not disable CS - // __attribute__((always_inline)) - // void writecommand_cont(uint8_t c) { - // setDCForCommand(); - //#if SPI_MODE_NORMAL - // enableCS(); - // SPI.transfer(c); - //#elif SPI_MODE_EXTENDED - // SPI.transfer(_cs, c, SPI_CONTINUE); - //#elif SPI_MODE_DMA - // enableCS(); - // _dmaSpi.send(c); - //#endif - // } - - // Enables CS, sets DC for Command, writes 1 byte - // Does not disable CS - inline __attribute__((always_inline)) - void writecommand_cont(uint8_t c) { - setDCForCommand(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - enableCS(); -#endif - write8_cont(c); - } - - // Enables CS, sets DC for Command, writes 1 byte, disables CS - inline __attribute__((always_inline)) - void writecommand_last(uint8_t c) { - setDCForCommand(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - enableCS(); -#endif - write8_cont(c); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - disableCS(); -#endif - } - - // Enables CS, sets DC to Data, writes 1 byte - // Does not disable CS - inline __attribute__((always_inline)) - void writedata8_cont(uint8_t c) { - setDCForData(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - enableCS(); -#endif - write8_cont(c); - } - - // Enables CS, sets DC to Data, writes 1 byte, disables CS - __attribute__((always_inline)) - void writedata8_last(uint8_t c) { - setDCForData(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - enableCS(); -#endif - write8_cont(c); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - disableCS(); -#endif - } - - // Enables CS, sets DC to Data, writes 2 bytes - // Does not disable CS - __attribute__((always_inline)) - void writedata16_cont(uint16_t d) { - setDCForData(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - enableCS(); -#endif - write16_cont(d); - } - - // Enables CS, sets DC to Data, writes 2 bytes, disables CS - __attribute__((always_inline)) - void writedata16_last(uint16_t d) { - setDCForData(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - enableCS(); -#endif - write16_last(d); - } - -#if SPI_MODE_DMA - // Enables CS, sets DC and writes n-bytes from the buffer via DMA - // Does not disable CS - /*inline __attribute__((always_inline)) - void writedata_cont(const uint8_t* buf , size_t n) { - enableCS(); - setDCForData(); - _dmaSpi.send(buf, n); - }*/ - - // Enables CS, sets DC, writes n-bytes from the buffer via DMA, disables CS - /*inline __attribute__((always_inline)) - void writedata_last(const uint8_t* buf , size_t n) { - setDCForData(); - enableCS(); - _dmaSpi.send(buf, n); - disableCS(); - }*/ - - // Writes n-bytes from the buffer via DMA - // CS and DC have to be set prior to calling this method - inline __attribute__((always_inline)) - void write_cont(uint8_t* buf, size_t n) { - _dmaSpi.send(buf, n); - } - - inline __attribute__((always_inline)) - void read_cont(uint8_t* buf, size_t n) { - _dmaSpi.receive(buf, n); - } - - // Writes n-bytes from the buffer via DMA and disables CS - // DC has to be set prior to calling this method - /*inline __attribute__((always_inline)) - void write_last(const uint8_t* buf , size_t n) { - _dmaSpi.send(buf, n << 1); - disableCS(); - }*/ - - // Enables CS, sets DC and writes n-bytes from the scanline buffer via DMA - // Does not disable CS - inline __attribute__((always_inline)) - void writeScanline_cont(size_t n) { - setDCForData(); - enableCS(); - _dmaSpi.send(_scanlineBuffer, n << 1); // each pixel is 2 bytes - } - - // writes n-bytes from the scanline buffer via DMA - // Does not enable CS nor sets DS nor disables CS - //inline __attribute__((always_inline)) - // void writeScanline_cont_noCS_noDC(size_t n) { - // _dmaSpi.send(_scanlineBuffer, n << 1); // each pixel is 2 bytes - //} - - // Enables CS, sets DC, writes n-bytes from the scanline buffer via DMA and disabled CS - inline __attribute__((always_inline)) - void writeScanline_last(size_t n) { - setDCForData(); - enableCS(); - _dmaSpi.send(_scanlineBuffer, n << 1); // each pixel is 2 bytes - disableCS(); - } - -#endif - - // Reads 1 byte - __attribute__((always_inline)) - uint8_t read8_cont() { -#if SPI_MODE_NORMAL - return SPI.transfer(ILI9341_NOP); -#elif SPI_MODE_EXTENDED - return SPI.transfer(_cs, ILI9341_NOP, SPI_CONTINUE); -#elif SPI_MODE_DMA - return _dmaSpi.receive(); -#endif - } - - __attribute__((always_inline)) - uint8_t read8_last() { -#if SPI_MODE_NORMAL - uint8_t r = SPI.transfer(ILI9341_NOP); - disableCS(); - return r; -#elif SPI_MODE_EXTENDED - return SPI.transfer(_cs, ILI9341_NOP, SPI_LAST); -#elif SPI_MODE_DMA - uint8_t r = _dmaSpi.receive(); - disableCS(); - return r; -#endif - } - - // Reads 2 bytes - __attribute__((always_inline)) - uint16_t read16() { -#if SPI_MODE_NORMAL - uint16_t r = SPI.transfer(ILI9341_NOP); - r <<= 8; - r |= SPI.transfer(ILI9341_NOP); -#elif SPI_MODE_EXTENDED - uint16_t r = SPI.transfer(_cs, ILI9341_NOP, SPI_CONTINUE); - r <<= 8; - r |= SPI.transfer(_cs, ILI9341_NOP, SPI_CONTINUE); -#elif SPI_MODE_DMA - uint16_t r = _dmaSpi.receive(); - r <<= 8; - r |= _dmaSpi.receive(); -#endif - return r; - } - - // Reads 2 bytes - __attribute__((always_inline)) - uint16_t readPixel_start_cont() { -#if SPI_MODE_NORMAL - uint16_t r = SPI.transfer(ILI9341_NOP); - r <<= 8; - r |= SPI.transfer(ILI9341_NOP); -#elif SPI_MODE_EXTENDED - uint16_t r = SPI.transfer(_cs, ILI9341_NOP, SPI_CONTINUE); - r <<= 8; - r |= SPI.transfer(_cs, ILI9341_NOP, SPI_CONTINUE); -#elif SPI_MODE_DMA - uint16_t r = _dmaSpi.receive(); - r <<= 8; - r |= _dmaSpi.receive(); -#endif - return r; - } - - // Enables CS, sets DC for Data and reads 1 byte - // Does not disable CS - __attribute__((always_inline)) - uint8_t readdata8_cont() { - setDCForData(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - enableCS(); -#endif - return read8_cont(); - } - - // Enables CS, sets DC for Data, reads 1 byte and disables CS - __attribute__((always_inline)) - uint8_t readdata8_last() { - setDCForData(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - enableCS(); -#endif - return read8_last(); - } - - // Enables CS, sets DC for Data and reads 2 bytes - // Does not disable CS - __attribute__((always_inline)) - uint16_t readdata16_cont() { - setDCForData(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - enableCS(); -#endif - return read16(); - } - - // Enables CS, sets DC for Data, reads 2 bytes and disables CS - __attribute__((always_inline)) - uint8_t readdata16_last() { - setDCForData(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - enableCS(); -#endif - uint16_t r = read16(); -#if SPI_MODE_NORMAL | SPI_MODE_DMA - disableCS(); -#endif - //TOTRY - /*uint8_t buff[2]; // not tested yet - enableCS(); - _dmaSpi.receive(buff, 2); - disableCS(); - uint16_t r = makeWord(buff[1], buff[0]);*/ - - return r; - } - -#if SPI_MODE_DMA - //void fillScanline(uint8_t color) __attribute__((always_inline)) { - // //for(uint16_t i=0; i 0; --n, ++pdst, ++psrc) - // *pdst = *psrc; - - // return dst; - //} -#endif - - // // Writes a sequence that will render a horizontal line - // // At the end CS is kept enabled. - // // In case of DMA mode, the content of scanline buffer is written - // __attribute__((always_inline)) - // void writeHLine_cont(int16_t x, int16_t y, int16_t w, uint16_t color) - // { - //#if SPI_MODE_DMA - // //TOTRY move this down - // fillScanline(color, w); - //#endif - // setAddrAndRW_cont(x, y, x+w-1, y); - //#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - // setDCForData(); - // do { write16_cont(color); } while (--w > 0); - //#elif SPI_MODE_DMA - // writeScanline_cont(w); - //#endif - // } - - // // Writes a sequence that will render a horizontal line - // // At the end CS is disabled. - // // In case of DMA mode, the content of scanline buffer is written - // __attribute__((always_inline)) - // void writeHLine_last(int16_t x, int16_t y, int16_t w, uint16_t color) - // { - //#if SPI_MODE_DMA - // //TOTRY move this down - // fillScanline(color, w); - //#endif - // setAddrAndRW_cont(x, y, x+w-1, y); - //#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - // setDCForData(); - // while (w-- > 1) { - // write16_cont(color); - // } - // write16_last(color); - //#elif SPI_MODE_DMA - // writeScanline_last(w); - //#endif - // } - - // // Writes a sequence that will render a vertical line - // // At the end CS is kept enabled. - // // In case of DMA mode, the content of scanline buffer is filled and written - // __attribute__((always_inline)) - // void writeVLine_cont(int16_t x, int16_t y, int16_t h, uint16_t color) - // { - //#if SPI_MODE_DMA - // // TRY move this down - // fillScanline(color, h); - //#endif - // setAddrAndRW_cont(x, y, x, y+h-1); - //#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - // setDCForData(); - // do { write16_cont(color); } while (--h > 0); - //#elif SPI_MODE_DMA - // writeScanline_cont(h); - //#endif - // } - - // // Writes a sequence that will render a vertical line - // // At the end CS is disabled. - // // In case of DMA mode, the content of scanline buffer is filled and written - // __attribute__((always_inline)) - // void writeVLine_last(int16_t x, int16_t y, int16_t h, uint16_t color) - // { - //#if SPI_MODE_DMA - // fillScanline(color, h); - //#endif - // setAddrAndRW_cont(x, y, x, y+h-1); - //#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - // while (h-- > 1) { - // write16_cont(color); - // } - // write16_last(color); - //#elif SPI_MODE_DMA - // writeScanline_last(h); - //#endif - // } - - // Writes a sequence that will render a horizontal line - // CS must be set prior to calling this method - // for DMA mode, scanline buffer must be filled with the desired color - // Advantage over writeHLine_cont is that CS line is not being set and - // the scanlineBuffer not filled on every call - inline __attribute__((always_inline)) - void writeHLine_cont_noCS_noFill(int16_t x, int16_t y, int16_t w, uint16_t color) - __attribute__((always_inline)) { - //setAddrAndRW_cont(x, y, x+w-1, y); - setDCForCommand(); - write8_cont(ILI9341_CASET); // Column addr set - setDCForData(); - write16_cont(x); // XSTART - write16_cont(x + w - 1); // XEND - setDCForCommand(); - write8_cont(ILI9341_PASET); // Row addr set - setDCForData(); - write16_cont(y); // XSTART - write16_cont(y); // XEND - setDCForCommand(); - write8_cont(ILI9341_RAMWR); - setDCForData(); -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - do { - write16_cont(color); - } while (--w > 0); -#elif SPI_MODE_DMA - write_cont(_scanlineBuffer, w << 1); -#endif - } - - // Writes a sequence that will render a vertical line - // CS must be set prior to calling this method - // for DMA mode, scanline buffer must be filled with the desired color - // Advantage over writeVLine_cont is that CS line is not being set and - // the scanlineBuffer not filled on every call - inline __attribute__((always_inline)) - void writeVLine_cont_noCS_noFill(int16_t x, int16_t y, int16_t h, uint16_t color) - __attribute__((always_inline)) { - setDCForCommand(); - write8_cont(ILI9341_CASET); // Column addr set - setDCForData(); - write16_cont(x); // XSTART - write16_cont(x); // XEND - setDCForCommand(); - write8_cont(ILI9341_PASET); // Row addr set - setDCForData(); - write16_cont(y); // XSTART - write16_cont(y + h - 1); // XEND - setDCForCommand(); - write8_cont(ILI9341_RAMWR); - setDCForData(); -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - do { - write16_cont(color); - } while (--h > 0); -#elif SPI_MODE_DMA - write_cont(_scanlineBuffer, h << 1); -#endif - } - - - //void HLine_cont(int16_t x, int16_t y, int16_t w, uint16_t color) - // __attribute__((always_inline)) { - // setAddrAndRW_cont(x, y, x+w-1, y); - // do { writedata16_cont(color); } while (--w > 0); - //} - //void VLine_cont(int16_t x, int16_t y, int16_t h, uint16_t color) - // __attribute__((always_inline)) { - // setAddrAndRW_cont(x, y, x, y+h-1); - // do { writedata16_cont(color); } while (--h > 0); - //} - - // Writes a sequence that will render a pixel - // CS must be enabled prior to calling this method - // Advantage over writePixel_cont is that CS line is not set on every call - inline __attribute__((always_inline)) - void writePixel_cont_noCS(int16_t x, int16_t y, uint16_t color) - { - setDCForCommand(); - write8_cont(ILI9341_CASET); // Column addr set - setDCForData(); - write16_cont(x); // XSTART - write16_cont(x); // XEND - setDCForCommand(); - write8_cont(ILI9341_PASET); // Row addr set - setDCForData(); - write16_cont(y); // XSTART - write16_cont(y); // XEND - setDCForCommand(); - write8_cont(ILI9341_RAMWR); - setDCForData(); - write16_cont(color); - } - - inline __attribute__((always_inline)) - void writePixel_cont(int16_t x, int16_t y, uint16_t color) - { - enableCS(); - setDCForCommand(); - write8_cont(ILI9341_CASET); // Column addr set - setDCForData(); - write16_cont(x); // XSTART - write16_cont(x); // XEND - setDCForCommand(); - write8_cont(ILI9341_PASET); // Row addr set - setDCForData(); - write16_cont(y); // XSTART - write16_cont(y); // XEND - setDCForCommand(); - write8_cont(ILI9341_RAMWR); - setDCForData(); - write16_cont(color); - } - - // Enables CS, writes a sequence that will render a pixel and disables CS - inline __attribute__((always_inline)) - void writePixel_last(int16_t x, int16_t y, uint16_t color) - { - setAddrAndRW_cont(x, y, x, y); - setDCForData(); - write16_last(color); - } - - // Enables CS - inline __attribute__((always_inline)) - void enableCS() { -#if SPI_MODE_NORMAL | SPI_MODE_DMA - *_csport &= ~_cspinmask; -#endif - } - - // Disables CS - inline __attribute__((always_inline)) - void disableCS() { -#if SPI_MODE_NORMAL | SPI_MODE_DMA - *_csport |= _cspinmask; - //csport->PIO_SODR |= cspinmask; -#elif SPI_MODE_EXTENDED - writecommand_last(ILI9341_NOP); // have to send a byte to disable CS -#endif - } - - // Sets DC to Data (1) - inline __attribute__((always_inline)) - void setDCForData() { - *_dcport |= _dcpinmask; - //_dcport->PIO_SODR |= _dcpinmask; - } - - // Sets DC to Command (0) - inline __attribute__((always_inline)) - void setDCForCommand() { - *_dcport &= ~_dcpinmask; - } - - protected: - int16_t _width, _height; // Display w/h as modified by current rotation -#ifdef FEATURE_PRINT_ENABLED - int16_t _cursorX, _cursorY; - uint16_t _textcolor, _textbgcolor; - uint8_t _textsize; - boolean _wrap; // If set, 'wrap' text at right edge of display -#endif - iliRotation _rotation; - -#ifdef FEATURE_ARC_ENABLED - float _arcAngleMax; - int _arcAngleOffset; -#endif - - void drawFastVLine_cont_noFill(int16_t x, int16_t y, int16_t h, uint16_t color); - -#ifdef FEATURE_ARC_ENABLED - void drawArcOffsetted(uint16_t cx, uint16_t cy, uint16_t radius, uint16_t thickness, float startAngle, float endAngle, uint16_t color); -#endif - - private: - uint8_t _rst; - //Pio *_dcport; -#ifdef __SAM3X8E__ - volatile RwReg *_dcport; - uint32_t _cs, _dc, _dcpinmask; -#elif defined (__STM32F1__) - volatile uint32 *_dcport; - uint32_t _cs, _dc, _dcpinmask; -#else - volatile uint8_t *_dcport, *_csport; - uint8_t _cs, _dc, _cspinmask, _dcpinmask, _SPCR, _backupSPCR; -#endif - - -#if SPI_MODE_NORMAL | SPI_MODE_DMA -#ifdef __SAM3X8E__ - //Pio *_csport; - volatile RwReg *_csport; - uint32_t _cspinmask; -#elif defined (__STM32F1__) - volatile uint32 *_csport; - uint32_t _cspinmask; - -#endif -#endif - bool pinIsChipSelect(uint8_t cs); -}; - -#ifndef swap -#define swap(a, b) { typeof(a) t = a; a = b; b = t; } -#endif - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/ILI9341_due_gText.cpp b/STM32F1/libraries/ILI9341_due_STM/ILI9341_due_gText.cpp deleted file mode 100644 index 89cdc9630..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/ILI9341_due_gText.cpp +++ /dev/null @@ -1,1936 +0,0 @@ -/* -ILI9341_due_gText.cpp - Used for rendering GLCD fonts on Arduino Due - -Copyright (c) 2014 Marek Buriak - -The library is based on GLCD library by Bill Perry and Michael Margolis: -https://code.google.com/p/glcd-arduino - -This file is part of the Arduino ILI9341_due library. -Sources for this library can be found at https://github.com/marekburiak/ILI9341_Due. - -Fonts .h files can be created with GLCDFontCreator2 (not the one MikroElektronika): -https://code.google.com/p/glcd-arduino/downloads/detail?name=GLCDFontCreator2.zip&can=2&q= - - -ILI9341_due is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 2.1 of the License, or -(at your option) any later version. - -ILI9341_due is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with ILI9341_due. If not, see . - -*/ - -#include "ILI9341_due.h" -#include "ILI9341_due_gText.h" - -//#include "..\Streaming\Streaming.h" - -//extern glcd_Device GLCD; // this is the global GLCD instance, here upcast to the base glcd_Device class - -// This constructor creates a text area using the entire display -// The device pointer is initialized using the global GLCD instance -// New constuctors can be added to take an exlicit glcd instance pointer -// if multiple glcd instances need to be supported -ILI9341_due_gText::ILI9341_due_gText(ILI9341_due *ili) -{ - // device = (glcd_Device*)&GLCD; - _ili = ili; - _fontMode = gTextFontMode_Solid; - _fontBgColor = ILI9341_BLACK; - _fontColor = ILI9341_WHITE; - _letterSpacing = 2; - _isLastChar = false; - defineArea(0,0, _ili->width() -1, _ili->height() -1, DEFAULT_SCROLLDIR); // this should never fail - -} - -// This constructor creates a text area with the given coordinates -// full display area is used if any coordinate is invalid -ILI9341_due_gText::ILI9341_due_gText(ILI9341_due *ili, int16_t x1, int16_t y1, int16_t x2, int16_t y2) //, textMode mode) -{ - //device = (glcd_Device*)&GLCD; - _ili = ili; - if( ! defineArea(x1,y1,x2,y2)) //,mode)) - defineArea(0,0, _ili->width() -1,_ili->height() -1); //,mode); // this should never fail -} - -#if INCLUDE_NOT_WORKING_YET -ILI9341_due_gText::ILI9341_due_gText(ILI9341_due *ili, predefinedArea selection) //, textMode mode) -{ - //device = (glcd_Device*)&GLCD; - _ili = ili; - if( ! defineArea(selection)) //,mode)) - defineArea(0,0, _ili->width() -1,_ili->height() -1,mode); // this should never fail - -} -#endif - -ILI9341_due_gText::ILI9341_due_gText(ILI9341_due *ili, int16_t x1, int16_t y1, int16_t columns, int16_t rows, gTextFont font) //, textMode mode) -{ - //device = (glcd_Device*)&GLCD; - _ili = ili; - if( ! defineArea(x1,y1,columns,rows,font)) //, mode)) - { - defineArea(0,0, _ili->width() -1,_ili->height() -1); //,mode); // this should never fail - selectFont(font); - } -} - -/** -* Clear text area with the current font background color -* and home the cursor to upper left corner of the text area. -* -* @see defineArea() -*/ -void ILI9341_due_gText::clearArea(uint16_t color) -{ - /* - * fill the area with font background color - */ - //Serial << "clearing area from " << _area.x1 << " to " << _area.x2 << endl; - _ili->fillRect(_area.x1, _area.y1, _area.x2 - _area.x1+1, _area.y2-_area.y1+1, color); - - /*glcd_Device::SetPixels(_area.x1, _area.y1, - _area.x2, _area.y2, - _fontColor == BLACK ? WHITE : BLACK);*/ - /* - * put cursor at home position of text area to ensure we are always inside area. - */ - - //cursorToXY(0,0); -} - -/** -* Define a Text area by columns and rows -* -* @param x X coordinate of upper left corner -* @param y Y coordinate of upper left corner -* @param columns number of text columns -* @param rows number of text rows -* @param font a font definition -* @param mode constants SCROLL_DOWN and SCROLL_UP control scroll direction -* -* -* Defines a text area sized to hold columns characters across and rows characters tall. -* It is properly sized for the specified font. -* -* The area within the newly defined text area is intentionally not cleared. -* -* While intended for fixed width fonts, sizing will work for variable -* width fonts. -* -* When variable width fonts are used, the column is based on assuming a width -* of the widest character. -* -* x,y is an absolute coordinate and is relateive to the 0,0 origin of the -* display. -* -* mode is an optional parameter and defaults to normal/up scrolling -* -* @note -* Upon defining the text area, the cursor position for the text area will be set to x,y -* -* @see ClearArea() -*/ - -bool ILI9341_due_gText::defineArea(int16_t x, int16_t y, int16_t columns, int16_t rows, gTextFont font) //, textMode mode) -{ - textMode mode = DEFAULT_SCROLLDIR; - uint16_t x2,y2; - - selectFont(font); - - x2 = x + columns * (pgm_read_byte(_font+GTEXT_FONT_FIXED_WIDTH)+1) -1; - y2 = y + rows * (fontHeight()+1) -1; - - return defineArea(x, y, x2, y2); //, mode); -} - -/** -* Define a text area by absolute coordinates -* -* @param x1 X coordinate of upper left corner -* @param y1 Y coordinate of upper left corner -* @param x2 X coordinate of lower right corner -* @param y2 Y coordinate of lower right corner -* @param mode constants SCROLL_DOWN and SCROLL_UP control scroll direction -* -* Defines a text area based on absolute coordinates. -* The pixel coordinates for the text area are inclusive so x2,y2 is the lower right -* pixel of the text area. -* -* x1,y1 and x2,y2 are an absolute coordinates and are relateive to the 0,0 origin of the -* display. -* -* The area within the newly defined text area is intentionally not cleared. -* -* mode is an optional parameter and defaults to normal/up scrolling -* -* @returns true with the given area selected if all the coordinates are valid, -* otherwise returns returns false with the area set to the full display -* -* @note -* Upon creation of the text area, the cursor position for the text area will be set to x1, y1 -* -* @see ClearArea() -* -*/ - -bool ILI9341_due_gText::defineArea(int16_t x1, int16_t y1, int16_t x2, int16_t y2) //, textMode mode) -{ - textMode mode = DEFAULT_SCROLLDIR; - //Serial << "defineArea input " << x1 << " " << y1 << " " << x2 << " " << y2 << endl; - uint8_t ret = false; - - int16_t disp_width = _ili->width(); - int16_t disp_height = _ili->height(); - - //if( (x1 >= x2) - // || (y1 >= y2) - // || (x1 >= disp_width) - // || (y1 >= disp_height) - // || (x2 >= disp_width) - // || (y2 >= disp_height) - // ) - //{ - // // failed sanity check so set defaults and return false - // _area.x1 = 0; - // _area.y1 = 0; - // _area.x2 = disp_width -1; - // _area.y2 = disp_height -1; - // _area.mode = DEFAULT_SCROLLDIR; - //} - //else - { - _area.x1 = x1; - _area.y1 = y1; - _area.x2 = x2; - _area.y2 = y2; - _area.mode = mode; // not yet sanity checked - ret = true; - } - //Serial << "defineArea set " << _area.x1 << " " << _area.y1 << " " << _area.x2 << " " << _area.y2 << endl; - /* - * set cursor position for the area - */ - _x = x1; - _y = y1; - _scale = 1; - -#ifndef GLCD_NODEFER_SCROLL - /* - * Make sure to clear a deferred scroll operation when re defining areas. - */ - _needScroll = 0; -#endif - return ret; -} - -/** -* Define a predefined generic text area -* -* @param selection a value from @ref predefinedArea -* @param mode constants SCROLL_DOWN and SCROLL_UP control scroll direction -* -* Defines a text area using a selection form a set of predefined areas. -* -* The area within the newly defined text area is intentionally not cleared. -* -* mode is an optional parameter and defaults to normal/up scrolling -* -* @return returns @em true if successful. -* -* -* @note -* Upon defining the text area, the cursor position for the text area will be set to -* the upper left coordinate of the given predefined area -* -* @see ClearArea() -* @see predefinedArea -* -*/ -#if INCLUDE_NOT_WORKING_YET -bool ILI9341_due_gText::defineArea(predefinedArea selection, textMode mode) -{ - int16_t x1,y1,x2,y2; - TareaToken tok; - - tok.token = selection; - - x1 = tok.coord.x1; - y1 = tok.coord.y1; - x2 = tok.coord.x2; - y2 = tok.coord.y2; - - return defineArea(x1,y1,x2,y2, mode); -} -#endif -/* -* Scroll a pixel region up. -* Area scrolled is defined by x1,y1 through x2,y2 inclusive. -* x1,y1 is upper left corder, x2,y2 is lower right corner. -* -* color is the color to be used for the created space along the -* bottom. -* -* pixels is the *exact* pixels to scroll. 1 is 1 and 9 is 9 it is -* not 1 less or 1 more than what you want. It is *exact*. -*/ - -//void ILI9341_due_gText::ScrollUp(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, -// uint8_t pixels, uint8_t color) -//{ -//uint8_t dy; -//uint8_t dbyte; -//uint8_t sy; -//uint8_t sbyte; -//uint8_t col; -// -// /* -// * Scrolling up more than area height? -// */ -// if(y1 + pixels > y2) -// { -// /* -// * fill the region with "whitespace" because -// * it is being totally scrolled out. -// */ -// _ili->fillRect(x1, y1, x2 - x1, y2 - y1, color); -// return; -// } -// -// for(col = x1; col <= x2; col++) -// { -// dy = y1; -// GotoXY(col, dy & ~7); -// dbyte = glcd_Device::ReadData(); -// -// -// /* -// * preserve bits outside/above scroll region -// */ -// -// dbyte &= (_BV((dy & 7)) - 1); -// -// sy = dy + pixels; -// glcd_Device::GotoXY(col, sy & ~7); -// sbyte = glcd_Device::ReadData(); -// -// while(sy <= y2) -// { -// if(sbyte & _BV(sy & 7)) -// { -// dbyte |= _BV(dy & 7); -// } -// -// sy++; -// if((sy & 7) == 0) -// { -// /* -// * If we just crossed over, then we should be done. -// */ -// if(sy < DISPLAY_HEIGHT) -// { -// glcd_Device::GotoXY(col, sy & ~7); -// sbyte = glcd_Device::ReadData(); -// } -// } -// -// if((dy & 7) == 7) -// { -// glcd_Device::GotoXY(col, dy & ~7); // Should be able to remove this -// glcd_Device::WriteData(dbyte); -// dbyte = 0; -// } -// dy++; -// } -// -// /* -// * Handle the new area at the bottom of the region -// */ -// -// for(uint8_t p = pixels; p; p--) -// { -// if(color == BLACK) -// { -// dbyte |= _BV(dy & 7); -// } -// else -// { -// dbyte &= ~_BV(dy & 7); -// } -// -// if((dy & 7) == 7) -// { -// glcd_Device::GotoXY(col, dy & ~7); // should be able to remove this. -// glcd_Device::WriteData(dbyte); -// dbyte = 0; -// } -// dy++; -// } -// -// /* -// * Flush out the final destination byte -// */ -// -// -// if(dy & 7) -// { -// dy--; -// -// glcd_Device::GotoXY(col, dy & ~7); -// sbyte = glcd_Device::ReadData(); -// /* -// * Preserver bits outside/below region -// */ -// -// dy++; -// sbyte &= ~(_BV((dy & 7)) - 1); -// dbyte |= sbyte; -// -// glcd_Device::WriteData(dbyte); -// } -// } -// -//} - -//#ifndef GLCD_NO_SCROLLDOWN -// -//void ILI9341_due_gText::ScrollDown(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, -// uint8_t pixels, uint8_t color) -//{ -//uint8_t dy; -//uint8_t dbyte; -//uint8_t sy; -//uint8_t sbyte; -//uint8_t col; -// -// /* -// * Scrolling up more than area height? -// */ -// if(y1 + pixels > y2) -// { -// /* -// * fill the region with "whitespace" because -// * it is being totally scrolled out. -// */ -// glcd_Device::SetPixels(x1, y1, x2, y2, color); -// return; -// } -// -// /* -// * Process region from left to right -// */ -// for(col = x1; col <= x2; col++) -// { -// dy = y2; -// glcd_Device::GotoXY(col, dy & ~7); -// dbyte = glcd_Device::ReadData(); -// -// /* -// * preserve bits outside/below scroll region -// */ -// -// dbyte &= ~(_BV(((dy & 7)+1)) - 1); -// sy = dy - pixels; -// glcd_Device::GotoXY(col, sy & ~7); -// sbyte = glcd_Device::ReadData(); -// -// while(sy >= y1) -// { -// if(sbyte & _BV(sy & 7)) -// { -// dbyte |= _BV(dy & 7); -// } -// if((dy & 7) == 0) -// { -// glcd_Device::GotoXY(col, dy & ~7); // Should be able to remove this -// glcd_Device::WriteData(dbyte); -// dbyte = 0; -// } -// dy--; -// -// if(!sy) -// break; /* if we bottomed out, we are done */ -// sy--; -// if((sy & 7) == 7) -// { -// glcd_Device::GotoXY(col, sy & ~7); -// sbyte = glcd_Device::ReadData(); -// } -// -// } -// -// /* -// * Handle the new area at the top of the column -// */ -// -// for(uint8_t p = pixels; p; p--) -// { -// if(color == BLACK) -// { -// dbyte |= _BV(dy & 7); -// } -// else -// { -// dbyte &= ~_BV(dy & 7); -// } -// -// if((dy & 7) == 0) -// { -// glcd_Device::GotoXY(col, dy & ~7); // should be able to remove this. -// glcd_Device::WriteData(dbyte); -// dbyte = 0; -// } -// dy--; -// } -// -// dy++; /* point dy back to last destination row */ -// -// /* -// * Flush out the final destination byte -// */ -// -// if(dy & 7) -// { -// glcd_Device::GotoXY(col, dy & ~7); -// sbyte = glcd_Device::ReadData(); -// /* -// * Preserve bits outside/above region -// */ -// -// sbyte &= (_BV((dy & 7)) - 1); -// dbyte |= sbyte; -// glcd_Device::WriteData(dbyte); -// } -// -// } -// -//} -//#endif //GLCD_NO_SCROLLDOWN - - - - - -/* -* Handle all special processing characters -*/ -void ILI9341_due_gText::specialChar(uint8_t c) -{ - - - if(c == '\n') - { - uint8_t height = fontHeight(); - - /* - * Erase all pixels remaining to edge of text area.on all wraps - * It looks better when using inverted (WHITE) text, on proportional fonts, and - * doing WHITE scroll fills. - * - */ - - - if(_x < _area.x2) - _ili->fillRect(_x, _y, _area.x2 - _x, height, _fontBgColor); - //glcd_Device::SetPixels(_x, _y, _area.x2, _y+height, _fontColor == BLACK ? WHITE : BLACK); - - /* - * Check for scroll up vs scroll down (scrollup is normal) - */ -#ifndef GLCD_NO_SCROLLDOWN - if(_area.mode == SCROLL_UP) -#endif - { - - /* - * Normal/up scroll - */ - - /* - * Note this comparison and the pixel calcuation below takes into - * consideration that fonts - * are atually 1 pixel taller when rendered. - * This extra pixel is along the bottom for a "gap" between the character below. - */ - if(_y + 2*height >= _area.y2) - { -#ifndef GLCD_NODEFER_SCROLL - if(!_needScroll) - { - _needScroll = 1; - return; - } -#endif - - /* - * forumula for pixels to scroll is: - * (assumes "height" is one less than rendered height) - * - * pixels = height - ((_area.y2 - _y) - height) +1; - * - * The forumala below is unchanged - * But has been re-written/simplified in hopes of better code - * - */ - - uint8_t pixels = 2*height + _y - _area.y2 +1; - - /* - * Scroll everything to make room - * * NOTE: (FIXME, slight "bug") - * When less than the full character height of pixels is scrolled, - * There can be an issue with the newly created empty line. - * This is because only the # of pixels scrolled will be colored. - * What it means is that if the area starts off as white and the text - * color is also white, the newly created empty text line after a scroll - * operation will not be colored BLACK for the full height of the character. - * The only way to fix this would be alter the code use a "move pixels" - * rather than a scroll pixels, and then do a clear to end line immediately - * after the move and wrap. - * - * Currently this only shows up when - * there are are less than 2xheight pixels below the current Y coordinate to - * the bottom of the text area - * and the current background of the pixels below the current text line - * matches the text color - * and a wrap was just completed. - * - * After a full row of text is printed, the issue will resolve itself. - * - * - */ - //ScrollUp(_area.x1, _area.y1, _area.x2, _area.y2, pixels, _fontBgColor); - - _x = _area.x1; - _y = _area.y2 - height; - } - else - { - /* - * Room for simple wrap - */ - - _x = _area.x1; - _y = _y+height+1; - } - } -#ifndef GLCD_NO_SCROLLDOWN - else - { - /* - * Reverse/Down scroll - */ - - /* - * Check for Wrap vs scroll. - * - * Note this comparison and the pixel calcuation below takes into - * consideration that fonts - * are atually 1 pixel taller when rendered. - * - */ - if(_y > _area.y1 + height) - { - /* - * There is room so just do a simple wrap - */ - _x = _area.x1; - _y = _y - (height+1); - } - else - { -#ifndef GLCD_NODEFER_SCROLL - if(!_needScroll) - { - _needScroll = 1; - return; - } -#endif - - /* - * Scroll down everything to make room for new line - * (assumes "height" is one less than rendered height) - */ - - uint8_t pixels = height+1 - (_area.y1 - _y); - - //ScrollDown(_area.x1, _area.y1, _area.x2, _area.y2, pixels, _fontBgColor); - - _x = _area.x1; - _y = _area.y1; - } - } -#endif - } - -} - -/** -* output a character -* -* @param c the character to output -* -* If the character will not fit on the current text line -* inside the text area, -* the text position is wrapped to the next line. This might be -* the next lower or the next higher line depending on the -* scroll direction. -* -* If there is not enough room to fit a full line of new text after -* wrapping, the entire text area will be scrolled to make room for a new -* line of text. The scroll direction will be up or down -* depending on the scroll direction for the text area. -*/ - -int ILI9341_due_gText::putChar(uint8_t c) -{ - if(_font == 0) - { - Serial.println(F("No font selected")); - return 0; // no font selected - } - - /* - * check for special character processing - */ - - if(c < 0x20) - { - //specialChar(c); - return 1; - } - uint16_t charWidth = 0; - uint16_t charHeight = fontHeight(); - uint8_t charHeightInBytes = (charHeight+7)/8; /* calculates height in rounded up bytes */ - - uint8_t firstChar = pgm_read_byte(_font+GTEXT_FONT_FIRST_CHAR); - uint8_t charCount = pgm_read_byte(_font+GTEXT_FONT_CHAR_COUNT); - - uint16_t index = 0; - uint8_t thielefont; - - if(c < firstChar || c >= (firstChar+charCount)) { - return 0; // invalid char - } - c-= firstChar; - - if( isFixedWidthFont(_font) { - thielefont = 0; - charWidth = pgm_read_byte(_font+GTEXT_FONT_FIXED_WIDTH); - index = c*charHeightInBytes*charWidth+GTEXT_FONT_WIDTH_TABLE; - } - else{ - // variable width font, read width data, to get the index - thielefont = 1; - /* - * Because there is no table for the offset of where the data - * for each character glyph starts, run the table and add up all the - * widths of all the characters prior to the character we - * need to locate. - */ - for(uint8_t i=0; i _area.x2) - { - putChar('\n'); // fake a newline to cause wrap/scroll -#ifndef GLCD_NODEFER_SCROLL - /* - * We can't defer a scroll at this point since we need to ouput - * a character right now. - */ - if(_needScroll) - { - putChar('\n'); // fake a newline to cause wrap/scroll - _needScroll = 0; - } -#endif - } - - if(_fontMode == gTextFontMode_Solid) - drawSolidChar(c, index, charWidth, charHeight); - else if(_fontMode == gTextFontMode_Transparent) - drawTransparentChar(c, index, charWidth, charHeight); - - // last but not least, draw the character - - //glcd_Device::GotoXY(_x, _y); - - - /* - * Draw each column of the glyph (character) horizontally - * 8 bits (1 page) at a time. - * i.e. if a font is taller than 8 bits, draw upper 8 bits first, - * Then drop down and draw next 8 bits and so on, until done. - * This code depends on WriteData() doing writes that span LCD - * memory pages, which has issues because the font data isn't - * always a multiple of 8 bits. - */ - - - return 1; // valid char -} - -void ILI9341_due_gText::drawSolidChar(char c, uint16_t index, uint16_t charWidth, uint16_t charHeight) -{ - uint8_t bitId=0; - int16_t cx = _x; - int16_t cy = _y; -#if SPI_MODE_DMA - uint8_t* scanlineBuff = _ili->_scanlineBuffer; - uint8_t fontColorHi = highByte(_fontColor); - uint8_t fontColorLo = lowByte(_fontColor); - uint8_t fontBgColorHi = highByte(_fontBgColor); - uint8_t fontBgColorLo = lowByte(_fontBgColor); -#endif - uint8_t charHeightInBytes = (charHeight+7)/8; /* calculates height in rounded up bytes */ - - uint16_t lineId=0; - uint8_t numRenderBits = 8; - const uint8_t numRemainingBits = charHeight % 8; - //_ili->enableCS(); - for(uint16_t j=0; jsetAddrAndRW_cont(cx, cy, cx, cy+charHeight -1); - //_ili->setDCForData(); - for(uint8_t i=0; i 8 && charHeight < (i+1)*8) /* is it last byte of multibyte tall font? */ - { - data >>= ((i+1) << 3) - charHeight; // (i+1)*8 - } - //Serial << "data:" <writedata16_cont(_fontBgColor); -#elif SPI_MODE_DMA - scanlineBuff[lineId++] = fontBgColorHi; - scanlineBuff[lineId++] = fontBgColorLo; -#endif - } - else - { -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - _ili->writedata16_cont(_fontColor); -#elif SPI_MODE_DMA - scanlineBuff[lineId++] = fontColorHi; - scanlineBuff[lineId++] = fontColorLo; -#endif - } - data>>=1; - } - //delay(50); - } - //Serial << endl; - cx++; -#if SPI_MODE_DMA - _ili->writeScanline_cont(charHeight); // height in px * 2 bytes per px -#endif - - } - _ili->disableCS(); // to put CS line back up - - _x += charWidth; - - //Serial << " ending at " << _x << " lastChar " << _lastChar < 0 && !_isLastChar) - { - _ili->fillRect(_x, _y, _letterSpacing, charHeight, _fontBgColor); - _x+=_letterSpacing; - } - //Serial << "letterSpacing " << _letterSpacing <<" x: " << _x <fillScanline(_fontColor); //pre-fill the scanline, we will be drawing different lenghts of it -#endif - - uint8_t charHeightInBytes = (charHeight+7)/8; /* calculates height in rounded up bytes */ - - uint16_t lineId=0; - uint8_t numRenderBits = 8; - const uint8_t numRemainingBits = charHeight % 8; - - _ili->enableCS(); - - for(uint8_t j=0; j 8 && charHeight < (i+1)*8) /* is it last byte of multibyte tall font? */ - { - data >>= ((i+1) << 3) - charHeight; // (i+1)*8 - } - //Serial << "data:" <setAddrAndRW_cont(cx, cy+lineStart, cx, cy+lineEnd); - -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - _ili->setDCForData(); - for(int p=0; pwrite16_cont(_fontColor); - } -#elif SPI_MODE_DMA - _ili->writeScanline_cont(lineEnd-lineStart+1); -#endif - } - lastBit = bit; - } - else if(bit ^ 0x00) // increment only if bit is 1 - { - lineEnd++; - } - - data>>=1; - } - - if(lineEnd == charHeight - 1) // we have a line that goes all the way to the bottom - { - _ili->setAddrAndRW_cont(cx, cy+lineStart, cx, cy+lineEnd); -#if SPI_MODE_NORMAL | SPI_MODE_EXTENDED - _ili->setDCForData(); - for(int p=0; pwrite16_cont(_fontColor); - } -#elif SPI_MODE_DMA - _ili->writeScanline_cont(lineEnd-lineStart+1); -#endif - } - //delay(25); - } - //Serial << endl; - cx++; - } - _ili->disableCS(); // to put CS line back up - - _x += charWidth; - - if(_letterSpacing > 0 && !_isLastChar) - { - _x+=_letterSpacing; - } -} - -/** -* output a character string -* -* @param str pointer to a null terminated character string. -* -* Outputs all the characters in the string to the text area. -* See putChar() for a full description of how characters are -* written to the text area. -*/ - -void ILI9341_due_gText::puts(char *str) -{ - while(*str) - { - if(*(str+1) == 0) - _isLastChar = true; - putChar((uint8_t)*str); - str++; - } - _isLastChar = false; -} - -/** -* output a String class string -* -* @param str String class string -* -* Outputs all the characters in the string to the text area. -* See putChar() for a full description of how characters are -* written to the text area. -* -*/ -void ILI9341_due_gText::puts(const String &str) -{ - for (int i = 0; i < str.length(); i++) - { - write(str[i]); - } -} - -/** -* output a program memory character string -* -* @param str pointer to a null terminated character string stored in program memory -* -* Outputs all the characters in the string to the text area. -* See putChar() for a full description of how characters are -* written to the text area. -* -* @see putChar() -* @see puts() -* @see drawString() -* @see drawString_P() -* @see write() -*/ - -void ILI9341_due_gText::puts_P(PGM_P str) -{ - uint8_t c; - - while((c = pgm_read_byte(str)) != 0) - { - putChar(c); - str++; - } -} - -/** -* output a String class string at x,y coordinate -* -* @param str pointer to a null terminated character string -* @param x specifies the horizontal location -* @param y specifies the vertical location -* -* -* Outputs all the characters in the string to the text area. -* X & Y are zero based pixel coordinates and are relative to -* the upper left corner of the text area. -* -* See putChar() for a full description of how characters are -* written to the text area. -*/ -void ILI9341_due_gText::drawString(String &str, int16_t x, int16_t y) -{ - cursorToXY(x,y); - puts(str); -} - -/** -* output a program memory character string at x,y coordinate -* -* @param str pointer to a null terminated character string stored in program memory -* @param x specifies the horizontal location -* @param y specifies the vertical location -* -* -* Outputs all the characters in the string to the text area. -* X & Y are zero based pixel coordinates and are relative to -* the upper left corner of the text area. -* -* See putChar() for a full description of how characters are -* written to the text area. -*/ - -void ILI9341_due_gText::drawString_P(PGM_P str, int16_t x, int16_t y) -{ - cursorToXY(x,y); - puts_P(str); -} - -/** -* output a character string at x,y coordinate -* -* @param str String class string -* @param x specifies the horizontal location -* @param y specifies the vertical location -* -* -* Outputs all the characters in the string to the text area. -* X & Y are zero based pixel coordinates and are relative to -* the upper left corner of the text area. -* -* See putChar() for a full description of how characters are -* written to the text area. -*/ - -void ILI9341_due_gText::drawString(char *str, int16_t x, int16_t y) -{ - cursorToXY(x,y); - puts(str); -} - -void ILI9341_due_gText::drawString(char *str, int16_t x, int16_t y, uint16_t pixelsClearedOnLeft, uint16_t pixelsClearedOnRight) -{ - cursorToXY(x,y); - - // CLEAR PIXELS ON THE LEFT - if(pixelsClearedOnLeft > 0) - _ili->fillRect(_x-pixelsClearedOnLeft, _y, pixelsClearedOnLeft, fontHeight(), _fontBgColor); - - puts(str); - - // CLEAR PIXELS ON THE RIGHT - if(pixelsClearedOnRight > 0) - _ili->fillRect(_x, _y, pixelsClearedOnRight, fontHeight(), _fontBgColor); -} - -void ILI9341_due_gText::drawString(char *str, int16_t x, int16_t y, gTextEraseLine eraseLine) -{ - cursorToXY(x,y); - - // CLEAR PIXELS ON THE LEFT - if(eraseLine == gTextEraseFromBOL || eraseLine == gTextEraseFullLine) - { - uint16_t clearX1 = max(min(_x, _area.x1), _x-1024); - _ili->fillRect(clearX1, _y, _x - clearX1, fontHeight(), _fontBgColor); - } - - puts(str); - - // CLEAR PIXELS ON THE RIGHT - if(eraseLine == gTextEraseToEOL || eraseLine == gTextEraseFullLine) - { - uint16_t clearX2 = min(max(_x,_area.x2), _x+1024); - _ili->fillRect(_x, _y, clearX2 - _x, fontHeight(), _fontBgColor); - } -} - -void ILI9341_due_gText::drawString(char *str, gTextAlign align) -{ - drawStringPivotedOffseted(str, align, gTextPivotDefault, 0, 0, 0, 0); -} - -void ILI9341_due_gText::drawString(char *str, gTextAlign align, gTextEraseLine eraseLine) -{ - uint16_t pixelsClearedOnLeft = 0; - uint16_t pixelsClearedOnRight = 0; - if(eraseLine == gTextEraseFromBOL || eraseLine == gTextEraseFullLine) - pixelsClearedOnLeft = 1024; - if(eraseLine == gTextEraseToEOL || eraseLine == gTextEraseFullLine) - pixelsClearedOnRight = 1024; - drawStringPivotedOffseted(str, align, gTextPivotDefault, 0, 0, pixelsClearedOnLeft, pixelsClearedOnRight); -} - -void ILI9341_due_gText::drawString(char *str, gTextAlign align, uint16_t pixelsClearedOnLeft, uint16_t pixelsClearedOnRight) -{ - drawStringPivotedOffseted(str, align, gTextPivotDefault, 0, 0, pixelsClearedOnLeft, pixelsClearedOnRight); -} - -void ILI9341_due_gText::drawStringOffseted(char *str, gTextAlign align, uint16_t offsetX, uint16_t offsetY) -{ - drawStringPivotedOffseted(str, align, gTextPivotDefault,offsetX, offsetY, 0, 0); -} - -void ILI9341_due_gText::drawStringOffseted(char *str, gTextAlign align, uint16_t offsetX, uint16_t offsetY, gTextEraseLine eraseLine) -{ - uint16_t pixelsClearedOnLeft = 0; - uint16_t pixelsClearedOnRight = 0; - if(eraseLine == gTextEraseFromBOL || eraseLine == gTextEraseFullLine) - pixelsClearedOnLeft = 1024; - if(eraseLine == gTextEraseToEOL || eraseLine == gTextEraseFullLine) - pixelsClearedOnRight = 1024; - drawStringPivotedOffseted(str, align, gTextPivotDefault,offsetX, offsetY, pixelsClearedOnLeft, pixelsClearedOnRight); -} - -void ILI9341_due_gText::drawStringOffseted(char *str, gTextAlign align, uint16_t offsetX, uint16_t offsetY, uint16_t pixelsClearedOnLeft, uint16_t pixelsClearedOnRight) -{ - drawStringPivotedOffseted(str, align, gTextPivotDefault,offsetX, offsetY, pixelsClearedOnLeft, pixelsClearedOnRight); -} - -void ILI9341_due_gText::drawStringPivoted(char *str, int16_t x, int16_t y, gTextPivot pivot) -{ - cursorToXY(x,y); - - if(pivot != gTextPivotTopLeft && pivot != gTextPivotDefault) - applyPivot(str, pivot); - - puts(str); -} - -void ILI9341_due_gText::drawStringPivoted(char *str, gTextAlign align, gTextPivot pivot) -{ - drawStringPivotedOffseted(str, align, pivot, 0, 0, 0, 0); -} - -void ILI9341_due_gText::drawStringPivoted(char *str, gTextAlign align, gTextPivot pivot, gTextEraseLine eraseLine) -{ - uint16_t pixelsClearedOnLeft = 0; - uint16_t pixelsClearedOnRight = 0; - if(eraseLine == gTextEraseFromBOL || eraseLine == gTextEraseFullLine) - pixelsClearedOnLeft = 1024; - if(eraseLine == gTextEraseToEOL || eraseLine == gTextEraseFullLine) - pixelsClearedOnRight = 1024; - drawStringPivotedOffseted(str, align, pivot, 0, 0, pixelsClearedOnLeft, pixelsClearedOnRight); -} - -void ILI9341_due_gText::drawStringPivoted(char *str, gTextAlign align, gTextPivot pivot, uint16_t pixelsClearedOnLeft, uint16_t pixelsClearedOnRight) -{ - drawStringPivotedOffseted(str, align, pivot, 0, 0, pixelsClearedOnLeft, pixelsClearedOnRight); -} - -void ILI9341_due_gText::drawStringPivotedOffseted(char *str, gTextAlign align, gTextPivot pivot, uint16_t offsetX, uint16_t offsetY) -{ - drawStringPivotedOffseted(str, align, pivot, offsetX, offsetY, 0, 0); -} - -void ILI9341_due_gText::drawStringPivotedOffseted(char *str, gTextAlign align, gTextPivot pivot, uint16_t offsetX, uint16_t offsetY, gTextEraseLine eraseLine) -{ - uint16_t pixelsClearedOnLeft = 0; - uint16_t pixelsClearedOnRight = 0; - if(eraseLine == gTextEraseFromBOL || eraseLine == gTextEraseFullLine) - pixelsClearedOnLeft = 1024; - if(eraseLine == gTextEraseToEOL || eraseLine == gTextEraseFullLine) - pixelsClearedOnRight = 1024; - drawStringPivotedOffseted(str, align, pivot, offsetX, offsetY, pixelsClearedOnLeft, pixelsClearedOnRight); -} - -void ILI9341_due_gText::drawStringPivotedOffseted(char *str, gTextAlign align, gTextPivot pivot, uint16_t offsetX, uint16_t offsetY, uint16_t pixelsClearedOnLeft, uint16_t pixelsClearedOnRight) -{ - //Serial << pixelsClearedOnLeft << " " << pixelsClearedOnRight << endl; - _x = _area.x1; - _y = _area.y1; - - //PIVOT - if(pivot == gTextPivotDefault) - { - switch(align) - { - case gTextAlignTopLeft: { pivot = gTextPivotTopLeft; break; } - case gTextAlignTopCenter: { pivot = gTextPivotTopCenter; break; } - case gTextAlignTopRight: { pivot = gTextPivotTopRight; break; } - case gTextAlignMiddleLeft: { pivot = gTextPivotMiddleLeft; break; } - case gTextAlignMiddleCenter: { pivot = gTextPivotMiddleCenter; break; } - case gTextAlignMiddleRight: { pivot = gTextPivotMiddleRight; break; } - case gTextAlignBottomLeft: { pivot = gTextPivotBottomLeft; break; } - case gTextAlignBottomCenter: { pivot = gTextPivotBottomCenter; break; } - case gTextAlignBottomRight: { pivot = gTextPivotBottomRight; break; } - } - } - - if(pivot != gTextPivotTopLeft) - applyPivot(str, pivot); - - // ALIGN - if(align != gTextAlignTopLeft) - { - switch(align) - { - case gTextAlignTopCenter: - { - _x += (_area.x2 - _area.x1)/2; - break; - } - case gTextAlignTopRight: - { - _x += _area.x2 - _area.x1; - break; - } - case gTextAlignMiddleLeft: - { - _y += (_area.y2-_area.y1)/2; - break; - } - case gTextAlignMiddleCenter: - { - _x += (_area.x2 - _area.x1)/2; - _y += (_area.y2 - _area.y1)/2; - break; - } - case gTextAlignMiddleRight: - { - _x += _area.x2 - _area.x1; - _y += (_area.y2 - _area.y1)/2; - break; - } - case gTextAlignBottomLeft: - { - _y += _area.y2 - _area.y1; - break; - } - case gTextAlignBottomCenter: - { - _x += (_area.x2 - _area.x1)/2; - _y += _area.y2 - _area.y1; - break; - } - case gTextAlignBottomRight: - { - _x += _area.x2 - _area.x1; - _y += _area.y2 - _area.y1; - break; - } - } - } - - // OFFSET - _x+=offsetX; - _y+=offsetY; - - // CLEAR PIXELS ON THE LEFT - if(pixelsClearedOnLeft > 0) - { - int16_t clearX1 = max(min(_x, (int16_t)_area.x1), _x-(int16_t)pixelsClearedOnLeft); - //Serial.println(clearX1); - _ili->fillRect(clearX1, _y, _x - clearX1, fontHeight(), _fontBgColor); - } - - puts(str); - - // CLEAR PIXELS ON THE RIGHT - if(pixelsClearedOnRight > 0) - { - int16_t clearX2 = min(max(_x, _area.x2), _x+pixelsClearedOnRight); - //Serial << "area from " << _area.x1 << " to " << _area.x2 << endl; - //Serial << "clearing on right from " << _x << " to " << clearX2 << endl; - _ili->fillRect(_x, _y, clearX2 - _x, fontHeight(), _fontBgColor); - } -} - -void ILI9341_due_gText::applyPivot(char *str, gTextPivot pivot) -{ - switch(pivot) - { - case gTextPivotTopCenter: - { - _x -= stringWidth(str)/2; - break; - } - case gTextPivotTopRight: - { - _x -= stringWidth(str); - break; - } - case gTextPivotMiddleLeft: - { - _y -= fontHeight()/2; - break; - } - case gTextPivotMiddleCenter: - { - _x -= stringWidth(str)/2; - _y -= fontHeight()/2; - break; - } - case gTextPivotMiddleRight: - { - _x -= stringWidth(str); - _y -= fontHeight()/2; - break; - } - case gTextPivotBottomLeft: - { - _y -= fontHeight(); - break; - } - case gTextPivotBottomCenter: - { - _x -= stringWidth(str)/2; - _y -= fontHeight(); - break; - } - case gTextPivotBottomRight: - { - _x -= stringWidth(str); - _y -= fontHeight(); - break; - } - } -} - -/** -* Positions cursor to a character based column and row. -* -* @param column specifies the horizontal position -* @param row specifies the vertical position -* -* Column and Row are zero based character positions -* and are relative the the upper left corner of the -* text area base on the size of the currently selected font. -* -* While intended for fixed width fonts, positioning will work for variable -* width fonts. -* -* When variable width fonts are used, the column is based on assuming a width -* of the widest character. -* -* @see cursorToXY() -*/ - -void ILI9341_due_gText::cursorTo( uint8_t column, uint8_t row) -{ - if(_font == 0) - return; // no font selected - - /* - * Text position is relative to current text area - */ - - _x = column * (pgm_read_byte(_font+GTEXT_FONT_FIXED_WIDTH)+1) + _area.x1; - _y = row * (fontHeight()+1) + _area.y1; - -#ifndef GLCD_NODEFER_SCROLL - /* - * Make sure to clear a deferred scroll operation when repositioning - */ - _needScroll = 0; -#endif -} - -// Bill, I think the following would be a useful addition to the API -// Should we add a sanity check to these? -/** -* Positions cursor to a character based column on the current row. -* -* @param column specifies the horizontal position -* -* Column is a 0 based character position -* based on the size of the currently selected font. -* -* If column is negative then the column position is relative to the current cursor -* position. -* -* @warning -* While intended only for fixed width fonts, cursor repositioning will be done for variable -* width fonts. -* When variable width fonts are used, the column is based on assuming a width -* of the widest character in the font. -* Because the widest character is used for the amount of cursor movement, the amount -* of cursor movement when using relative positioning will often not be consistent with -* the number characters previously rendered. For example, if a letter "l" was written -* and the cursor was reposisitioned with a -1, the amount backed up will be much larger -* than the width of the "l". -* -* -* @see cursorToXY() -*/ -void ILI9341_due_gText::cursorTo(int8_t column) -{ - if(_font == 0) - return; // no font selected - /* - * Text position is relative to current text area - * negative value moves the cursor backwards - */ - if(column >= 0) - _x = column * (pgm_read_byte(_font+GTEXT_FONT_FIXED_WIDTH)+1) + _area.x1; - else - _x -= column * (pgm_read_byte(_font+GTEXT_FONT_FIXED_WIDTH)+1); - -#ifndef GLCD_NODEFER_SCROLL - /* - * Make sure to clear a deferred scroll operation when repositioning - */ - _needScroll = 0; -#endif -} - - -/** -* Positions cursor to a X,Y position -* -* @param x specifies the horizontal location -* @param y specifies the vertical location -* -* X & Y are zero based pixel coordinates and are relative to -* the upper left corner of the text area. -* -* @see cursorTo() -*/ - -void ILI9341_due_gText::cursorToXY( int16_t x, int16_t y) -{ - - /* - * Text position is relative to current text area - */ - - _x = _area.x1 + x; - _y = _area.y1 + y; - //Serial << F("cursorToXY x:") << x << F(" y:") << y << endl; - -#ifndef GLCD_NODEFER_SCROLL - /* - * Make sure to clear a deferred scroll operation when repositioning - */ - _needScroll = 0; -#endif -} - -/** -* Erase in Line -* -* @param type type of line erase -* -* @arg \ref eraseTO_EOL Erase from cursor to end of line -* @arg \ref eraseFROM_BOL Erase from beginning of line to cursor -* @arg \ref eraseFULL_LINE Erase entire line -* -* Erases all or part of a line of text depending on the type -* of erase specified. -* -* If type is not specified it is assumed to be \ref eraseTO_EOL -* -* The cursor position does not change. -* -* @see ClearArea() -* @see eraseLine_t -*/ - -void ILI9341_due_gText::eraseTextLine(uint16_t color, gTextEraseLine type) -{ - int16_t x = _x; - int16_t y = _y; - int16_t height = fontHeight(); - //uint8_t color = (_fontColor == BLACK) ? WHITE : BLACK; - - switch(type) - { - case gTextEraseToEOL: - _ili->fillRect(x, y, _area.x2-x, height, color); - //glcd_Device::SetPixels(x, y, _area.x2, y+height, color); - break; - case gTextEraseFromBOL: - _ili->fillRect(_area.x1, y, x - _area.x1, height, color); - //glcd_Device::SetPixels(_area.x1, y, x, y+height, color); - break; - case gTextEraseFullLine: - _ili->fillRect(_area.x1, y, _area.x2 - _area.x1, height, color); - //glcd_Device::SetPixels(_area.x1, y, _area.x2, y+height, color); - break; - } - - /* - * restore cursor position - */ - cursorToXY(x,y); -} - -/** -* Erase Text Line -* -* @param row row # of text to earase -* -* Erases a line of text and moves the cursor -* to the begining of the line. Rows are zero based so -* the top line/row of a text area is 0. -* -* @see ClearArea() -*/ - -void ILI9341_due_gText::eraseTextLine(uint16_t color, uint8_t row) -{ - cursorTo(0, row); - eraseTextLine(color, gTextEraseToEOL); -} - - -/** -* Select a Font and font color -* -* @param font a font definition -* @param color can be WHITE or BLACK and defaults to black -* @param callback optional font read routine -* -* -* Selects the font definition as the current font for the text area. -* -* All subsequent printing functions will use this font. -* -* Font definitions from included font definition files are stored in program memory -* You can have as many fonts defines as will fit in program memory up to 64k and can -* switch between them with this function. -* -* If the optional callback argument is ommitted, a default routine -* is selected that assumes that the font is in program memory (flash). -* -* @note -* When the display is initilized in normal mode, BLACK renders dark -* pixels on a white background and WHITE renders white pixels on -* black background; however, if the display is set to INVERTED mode -* all colors are inverted. -* -* @see setFontColor() -* @see SetTextMode() -*/ - -void ILI9341_due_gText::selectFont(gTextFont font) -{ - _font = font; -} - -void ILI9341_due_gText::selectFont(gTextFont font, uint16_t fontColor) -{ - _font = font; - _fontColor = fontColor; -} - -void ILI9341_due_gText::selectFont(gTextFont font, uint16_t fontColor, uint16_t backgroundColor) -{ - _font = font; - _fontColor = fontColor; - _fontBgColor = backgroundColor; -} - -/** -* Select a font color -* -* @param color can be WHITE or BLACK -* -* -* @see selectFont() -* @see SetTextMode() -*/ - -void ILI9341_due_gText::setFontColor(uint16_t color) -{ - _fontColor = color; -} - -void ILI9341_due_gText::setFontColor(uint8_t R, uint8_t G, uint8_t B) -{ - _fontColor = _ili->color565(R,G,B); -} - -void ILI9341_due_gText::setFontColor(uint16_t color, uint16_t backgroundColor) -{ - _fontColor = color; - _fontBgColor = backgroundColor; -} - -void ILI9341_due_gText::setFontColor(uint8_t R, uint8_t G, uint8_t B, uint8_t bgR, uint8_t bgG, uint8_t bgB) -{ - _fontColor = _ili->color565(R,G,B); - _fontBgColor = _ili->color565(bgR,bgG,bgB); -} - - -void ILI9341_due_gText::setFontLetterSpacing(uint8_t letterSpacing) -{ - _letterSpacing = letterSpacing; -} - - -void ILI9341_due_gText::setFontMode(gTextFontMode fontMode) -{ - if(fontMode == gTextFontMode_Solid || fontMode == gTextFontMode_Transparent) - _fontMode = fontMode; -} - -/** -* Set TextArea mode -* -* @param mode text area mode -* -* Currently mode is a scroll direction -* @arg SCROLL_UP -* @arg SCROLL_DOWN -* -* @see selectFont() -* @see setFontColor() -* @see defineArea() -*/ -/* -*/ -#if INLCUDE_NOT_WORKING_YET -void ILI9341_due_gText::SetTextMode(textMode mode) -{ - - /* - * when other modes are added the tarea.mode variable will hold a bitmask or enum for the modde and should be renamed - */ - _area.mode = mode; -} -#endif - - - - -/** -* Returns the pixel width of a character -* -* @param c character to be sized -* -* @return The width in pixels of the given character -* including any inter-character gap pixels following the character when the character is -* rendered on the display. -* -* @note The font for the character is the most recently selected font. -* -* @see StringWidth() -* @see StringWidth_P() -*/ - -uint16_t ILI9341_due_gText::charWidth(uint8_t c) -{ - int16_t width = 0; - - if(isFixedWidthFont(_font){ - width = pgm_read_byte(_font+GTEXT_FONT_FIXED_WIDTH); - } - else{ - // variable width font - uint8_t firstChar = pgm_read_byte(_font+GTEXT_FONT_FIRST_CHAR); - uint8_t charCount = pgm_read_byte(_font+GTEXT_FONT_CHAR_COUNT); - - // read width data - if(c >= firstChar && c < (firstChar+charCount)) { - c -= firstChar; - width = pgm_read_byte(_font+GTEXT_FONT_WIDTH_TABLE+c); - //Serial << "strWidth of " << c << " : " << width << endl; - } - } - return width; -} - -/** -* Returns the pixel width of a string -* -* @param str pointer to string stored in RAM -* -* @return the width in pixels of the sum of all the characters in the -* the string pointed to by str. -* -* @see charWidth() -* @see StringWidth_P() -*/ - -uint16_t ILI9341_due_gText::stringWidth(const char* str) -{ - uint16_t width = 0; - - while(*str != 0) { - width += charWidth(*str++) + _letterSpacing; - } - if(width > 0) - width -= _letterSpacing; - return width; -} - -/** -* Returns the pixel width of a character -* -* @param str pointer to string stored in program memory -* -* @return the width in pixels of the sum of all the characters in the -* the string pointed to by str. -* -* @see charWidth() -* @see StringWidth() -*/ - -uint16_t ILI9341_due_gText::stringWidth_P(PGM_P str) -{ - uint16_t width = 0; - - while(pgm_read_byte(str) != 0) { - width += charWidth(pgm_read_byte(str++)) + _letterSpacing; - } - width -= _letterSpacing; - return width; -} - -/** -* Returns the pixel width of a character -* -* @param str String class string -* -* @return the width in pixels of the sum of all the characters in the -* the string pointed to by str. -* -* @see charWidth() -* @see StringWidth() -*/ - -uint16_t ILI9341_due_gText::stringWidth_P(String &str) -{ - uint16_t width = 0; - - for (int i = 0; i < str.length(); i++) - { - width += charWidth(str[i]) + _letterSpacing; - } - width -= _letterSpacing; - return width; -} - - -/** -* Legacy function to print a number -* -* @param n is the number to print -* -* -* @see print(n) -*/ -void ILI9341_due_gText::printNumber(long n) -{ - uint8_t buf[10]; // prints up to 10 digits - uint8_t i=0; - if(n==0) - putChar('0'); - else{ - if(n < 0){ - putChar('-'); - n = -n; - } - while(n>0 && i <= 10){ - buf[i++] = n % 10; // n % base - n /= 10; // n/= base - } - for(; i >0; i--) - putChar((char) (buf[i-1] < 10 ? '0' + buf[i-1] : 'A' + buf[i-1] - 10)); - } -} - -/** -* output a character to the text area -* @param c the character to output -* -* This method is needed for the Print base class -* @see putChar() -*/ - - -size_t ILI9341_due_gText::write(uint8_t c) -{ - return(putChar(c)); -} - -// -//#ifndef USE_ARDUINO_FLASHSTR -//// functions to store and print strings in Progmem -//// these should be removed when Arduino supports FLASH strings in the base print class -///** -//* print a flash based string -//* @param str pointer to a null terminated character string stored in program memory -//* -//* @see puts_P() -//*/ -//void ILI9341_due_gText::printFlash(FLASHSTRING str) -//{ -// puts_P((PGM_P) str); -//} -// -///** -//* print a flash based string -//* @param str pointer to a null terminated character string stored in program memory -//* -//* The string is output followed by a newline. -//* -//* @see puts_P() -//*/ -//void ILI9341_due_gText::printFlashln(FLASHSTRING str) -//{ -// printFlash(str); -// write('\n'); -//} -//#endif - - diff --git a/STM32F1/libraries/ILI9341_due_STM/ILI9341_due_gText.h b/STM32F1/libraries/ILI9341_due_STM/ILI9341_due_gText.h deleted file mode 100644 index 415d853e2..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/ILI9341_due_gText.h +++ /dev/null @@ -1,385 +0,0 @@ -/* -ILI9341_due_gText.cpp - Used for rendering GLCD fonts on Arduino Due - -Copyright (c) 2014 Marek Buriak - -The library is based on GLCD library by Bill Perry and Michael Margolis: -https://code.google.com/p/glcd-arduino - -This file is part of the Arduino ILI9341_due library. -Sources for this library can be found at https://github.com/marekburiak/ILI9341_Due. - -Fonts .h files can be created with GLCDFontCreator2 (not the one MikroElektronika): -https://code.google.com/p/glcd-arduino/downloads/detail?name=GLCDFontCreator2.zip&can=2&q= - - -ILI9341_due is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 2.1 of the License, or -(at your option) any later version. - -ILI9341_due is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with ILI9341_due. If not, see . - -*/ - -#ifndef ILI9341_GTEXT_H -#define ILI9341_GTEXT_H - -//#include "WString.h" -//#include "../Streaming/Streaming.h" -#include "ILI9341_due.h" - -#define INCLUDE_NOT_WORKING_YET 0 - -#define GTEXT_VERSION 1 // software version of this code - -// Font Indices -#define GTEXT_FONT_LENGTH 0 -#define GTEXT_FONT_FIXED_WIDTH 2 -#define GTEXT_FONT_HEIGHT 3 -#define GTEXT_FONT_FIRST_CHAR 4 -#define GTEXT_FONT_CHAR_COUNT 5 -#define GTEXT_FONT_WIDTH_TABLE 6 - -#define GTEXT_DRAW_DIRECTION_RIGHT 0 -#define GTEXT_DRAW_DIRECTION_DOWN 1 -#define GTEXT_DRAW_DIRECTION_LEFT 2 -#define GTEXT_DRAW_DIRECTION_UP 3 - -typedef enum { - gTextFontMode_Solid = 0, - gTextFontMode_Transparent = 1 -} gTextFontMode; - - -// the following returns true if the given font is fixed width -// zero length is flag indicating fixed width font (array does not contain width data entries) -#define isFixedWidthFont(font) (pgm_read_byte(font+GTEXT_FONT_LENGTH) == 0 && pgm_read_byte(font+GTEXT_FONT_LENGTH+1) == 0)) - -/* -* Coodinates for predefined areas are compressed into a single 32 bit token. -* -* This works as the coordinates are cuurenly only 8 bit values. -* -* This allows the creatation of an unlmited number of predefined areas with zero code or -* data space overhead. -* -* A macro is used to create the tokens from a set of x1,y1 x2,y2 coordinates. -* -* A union is used to extract the coordinates from the 32 bit token. -* -* WARNING: -* This is non portable code in that it will only work on little endian processors. -* If you use big endian you have to switch the byte ordering in the union. -*/ - -#define MK_TareaToken(x1, y1, x2, y2) \ - (uint32_t) (((uint32_t) (x1) << 24) | ((uint32_t)(y1) << 16) | ((uint32_t)(x2) << 8) | (uint32_t)(y2)) - -/// @cond hide_from_doxygen -typedef union -{ - struct - { - uint8_t y2; - uint8_t x2; - uint8_t y1; - uint8_t x1; - }coord; - - uint32_t token; // swap byte order above for big endian - -}TareaToken; -/// @endcond - -typedef uint8_t textMode; // type holding mode for scrolling and future attributes like padding etc. -// the only textMode supported in the current release is scrolling - -const textMode SCROLL_UP = 0; -const textMode SCROLL_DOWN = 1; // this was changed from -1 so it can used in a bitmask -const textMode DEFAULT_SCROLLDIR = SCROLL_UP; - -/** -* @defgroup glcd_enum GLCD enumerations -*/ - -/** -* @ingroup glcd_enum -* @hideinitializer -* @brief Pre Defined Text areas -* -* These enumerations are used to easily define text areas -* using predefined display areas.\n -* They are used with the -* \ref gText::DefineArea(predefinedArea selection, textMode mode) "DefineArea()" function call. -*/ -typedef enum { - - //textAreaFULL = MK_TareaToken( 0, 0, DISPLAY_WIDTH -1, DISPLAY_HEIGHT -1 ), - ///**= firstChar && c < (firstChar+charCount)) { - c -= firstChar; - width = pgm_read_byte(font+GTEXT_FONT_WIDTH_TABLE+c); - } - } - return width; - }; - - static uint16_t stringWidth(const char* str, gTextFont font, uint8_t letterSpacing) - { - uint16_t width = 0; - - while(*str != 0) { - width += ILI9341_due_gText::charWidth(*str++, font) + letterSpacing; - } - if(width > 0) - width -= letterSpacing; - - return width; - }; - - //#ifndef USE_ARDUINO_FLASHSTR - // // when the following function is supported in arduino it will be removed from this library - // void printFlash(FLASHSTRING str); //this overrides the Arduino print function to implicilty store the string in flash (progmem) - // void printFlashln(FLASHSTRING str); - //#endif - - /*@}*/ - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/ILI_SdFatConfig.h b/STM32F1/libraries/ILI9341_due_STM/ILI_SdFatConfig.h deleted file mode 100644 index 84ad39a35..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/ILI_SdFatConfig.h +++ /dev/null @@ -1,196 +0,0 @@ -/* Arduino SdFat Library - * Copyright (C) 2012 by William Greiman - * - * This file is part of the Arduino SdFat Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino SdFat Library. If not, see - * . - */ -/** - * \file - * \brief configuration definitions - */ -#ifndef ILI_SdFatConfig_h -#define ILI_SdFatConfig_h -#include - -//------------------------------------------------------------------------------ -/** - * Set USE_SEPARATE_FAT_CACHE nonzero to use a second 512 byte cache - * for FAT table entries. Improves performance for large writes that - * are not a multiple of 512 bytes. - */ -#ifdef __arm__ -#define ILI_USE_SEPARATE_FAT_CACHE 1 -#else // __arm__ -#define ILI_USE_SEPARATE_FAT_CACHE 0 -#endif // __arm__ -//------------------------------------------------------------------------------ -/** - * Set USE_MULTI_BLOCK_SD_IO nonzero to use multi-block SD read/write. - * - * Don't use mult-block read/write on small AVR boards. - */ -#if defined(RAMEND) && RAMEND < 3000 -#define ILI_USE_MULTI_BLOCK_SD_IO 0 -#else -#define ILI_USE_MULTI_BLOCK_SD_IO 1 -#endif - -//------------------------------------------------------------------------------ -/** - * To enable SD card CRC checking set USE_SD_CRC nonzero. - * - * Set USE_SD_CRC to 1 to use a smaller slower CRC-CCITT function. - * - * Set USE_SD_CRC to 2 to used a larger faster table driven CRC-CCITT function. - */ -#define ILI_USE_SD_CRC 0 -//------------------------------------------------------------------------------ -/** - * To use multiple SD cards set USE_MULTIPLE_CARDS nonzero. - * - * Using multiple cards costs about 200 bytes of flash. - * - * Each card requires about 550 bytes of SRAM so use of a Mega is recommended. - */ -#define ILI_USE_MULTIPLE_CARDS 0 -//------------------------------------------------------------------------------ -/** - * Set DESTRUCTOR_CLOSES_FILE nonzero to close a file in its destructor. - * - * Causes use of lots of heap in ARM. - */ -#define ILI_DESTRUCTOR_CLOSES_FILE 0 -//------------------------------------------------------------------------------ -/** - * For AVR - * - * Set USE_SERIAL_FOR_STD_OUT nonzero to use Serial (the HardwareSerial class) - * for error messages and output from print functions like ls(). - * - * If USE_SERIAL_FOR_STD_OUT is zero, a small non-interrupt driven class - * is used to output messages to serial port zero. This allows an alternate - * Serial library like SerialPort to be used with SdFat. - * - * You can redirect stdOut with SdFat::setStdOut(Print* stream) and - * get the current stream with SdFat::stdOut(). - */ -#define ILI_USE_SERIAL_FOR_STD_OUT 0 -//------------------------------------------------------------------------------ -/** - * Call flush for endl if ENDL_CALLS_FLUSH is nonzero - * - * The standard for iostreams is to call flush. This is very costly for - * SdFat. Each call to flush causes 2048 bytes of I/O to the SD. - * - * SdFat has a single 512 byte buffer for SD I/O so it must write the current - * data block to the SD, read the directory block from the SD, update the - * directory entry, write the directory block to the SD and read the data - * block back into the buffer. - * - * The SD flash memory controller is not designed for this many rewrites - * so performance may be reduced by more than a factor of 100. - * - * If ENDL_CALLS_FLUSH is zero, you must call flush and/or close to force - * all data to be written to the SD. - */ -#define ILI_ENDL_CALLS_FLUSH 0 -//------------------------------------------------------------------------------ -/** - * Allow FAT12 volumes if FAT12_SUPPORT is nonzero. - * FAT12 has not been well tested. - */ -#define ILI_FAT12_SUPPORT 0 -//------------------------------------------------------------------------------ -/** - * SPI SCK divisor for SD initialization commands. - * or greater - */ -#ifdef __AVR__ -const uint8_t ILI_SPI_SCK_INIT_DIVISOR = 64; -#else -const uint8_t ILI_SPI_SCK_INIT_DIVISOR = 128; -#endif -//------------------------------------------------------------------------------ -/** - * Set ENABLE_SPI_TRANSACTION nonzero to enable the SPI transaction feature - * of the standard Arduino SPI library. You must include SPI.h in your - * sketches when ENABLE_SPI_TRANSACTION is nonzero. - */ -#define ILI_ENABLE_SPI_TRANSACTION 0 -//------------------------------------------------------------------------------ -/** - * Set ENABLE_SPI_YIELD nonzero to enable release of the SPI bus during - * SD card busy waits. - * - * This will allow interrupt routines to access the SPI bus if - * ENABLE_SPI_TRANSACTION is nonzero. - * - * Setting ENABLE_SPI_YIELD will introduce some extra overhead and will - * slightly slow transfer rates. A few older SD cards may fail when - * ENABLE_SPI_YIELD is nonzero. - */ -#define ILI_ENABLE_SPI_YIELD 0 -//------------------------------------------------------------------------------ -/** - * Force use of Arduino Standard SPI library if USE_ARDUINO_SPI_LIBRARY - * is nonzero. This will override native and software SPI for all boards. - */ -#define ILI_USE_ARDUINO_SPI_LIBRARY 0 -//------------------------------------------------------------------------------ -/** - * Define AVR_SOF_SPI nonzero to use software SPI on all AVR Arduinos. - */ -#define ILI_AVR_SOFT_SPI 0 -//------------------------------------------------------------------------------ -/** - * Define DUE_SOFT_SPI nonzero to use software SPI on Due Arduinos. - */ -#define ILI_DUE_SOFT_SPI 0 -//------------------------------------------------------------------------------ - -/** - * Define LEONARDO_SOFT_SPI nonzero to use software SPI on Leonardo Arduinos. - * LEONARDO_SOFT_SPI allows an unmodified 328 Shield to be used - * on Leonardo Arduinos. - */ -#define ILI_LEONARDO_SOFT_SPI 0 -//------------------------------------------------------------------------------ -/** - * Define MEGA_SOFT_SPI nonzero to use software SPI on Mega Arduinos. - * MEGA_SOFT_SPI allows an unmodified 328 Shield to be used - * on Mega Arduinos. - */ -#define ILI_MEGA_SOFT_SPI 0 -//------------------------------------------------------------------------------ -/** - * Set TEENSY3_SOFT_SPI nonzero to use software SPI on Teensy 3.x boards. - */ -#define ILI_TEENSY3_SOFT_SPI 0 -//------------------------------------------------------------------------------ -/** - * Define software SPI pins. Default allows Uno shields to be used on other - * boards. - */ -// define software SPI pins -/** Default Software SPI chip select pin */ -uint8_t const ILI_SOFT_SPI_CS_PIN = 10; -/** Software SPI Master Out Slave In pin */ -uint8_t const ILI_SOFT_SPI_MOSI_PIN = 11; -/** Software SPI Master In Slave Out pin */ -uint8_t const ILI_SOFT_SPI_MISO_PIN = 12; -/** Software SPI Clock pin */ -uint8_t const ILI_SOFT_SPI_SCK_PIN = 13; -#endif // SdFatConfig_h diff --git a/STM32F1/libraries/ILI9341_due_STM/ILI_SdSpi.h b/STM32F1/libraries/ILI9341_due_STM/ILI_SdSpi.h deleted file mode 100644 index ee4102416..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/ILI_SdSpi.h +++ /dev/null @@ -1,188 +0,0 @@ -/* Arduino SdSpi Library - * Copyright (C) 2013 by William Greiman - * - * This file is part of the Arduino SdSpi Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino SdSpi Library. If not, see - * . - */ - /** - * \file - * \brief SdSpi class for V2 SD/SDHC cards - */ -#ifndef ILI_SdSpi_h -#define ILI_SdSpi_h -#include -#include "ILI_SdFatConfig.h" - -#if !ILI_USE_ARDUINO_SPI_LIBRARY -// AVR Arduinos -#ifdef __AVR__ -#if ILI_AVR_SOFT_SPI -#define ILI_USE_SOFTWARE_SPI 1 -#elif ILI_LEONARDO_SOFT_SPI && defined(__AVR_ATmega32U4__) && !defined(CORE_TEENSY) -#define ILI_USE_SOFTWARE_SPI 1 -#elif ILI_MEGA_SOFT_SPI && (defined(__AVR_ATmega1280__)\ - ||defined(__AVR_ATmega2560__)) -#define ILI_USE_SOFTWARE_SPI 1 -#else // ILI_USE_SOFTWARE_SPI -#define ILI_USE_NATIVE_AVR_SPI 1 -#endif // ILI_USE_SOFTWARE_SPI -#endif // __AVR__ -// Due -#if defined(__arm__) && !defined(CORE_TEENSY) && !defined(__STM32F1__) -#if ILI_DUE_SOFT_SPI -#define ILI_USE_SOFTWARE_SPI 1 -#else // ILI_DUE_SOFT_SPI -/** Nonzero - use native SAM3X SPI */ -#define ILI_USE_NATIVE_SAM3X_SPI 1 -#endif // ILI_DUE_SOFT_SPI -#endif // defined(__arm__) && !defined(CORE_TEENSY | __STM32F1__) - -// STM32F1 Maple Mini -#if defined(__arm__) && defined(__STM32F1__) -#if ILI_DUE_SOFT_SPI -#define ILI_USE_SOFTWARE_SPI 1 -#else // ILI_DUE_SOFT_SPI -/** Nonzero - use native STM32F1 SPI */ -#define ILI_USE_NATIVE_STM32F1_SPI 1 -#endif // ILI_DUE_SOFT_SPI -#endif // defined(__arm__) && defined(__STM32F1__) - -// Teensy 3.0 -#if defined(__arm__) && defined(CORE_TEENSY) -#if ILI_TEENSY3_SOFT_SPI -#define ILI_USE_SOFTWARE_SPI 1 -#else // ILI_TEENSY3_SOFT_SPI -/** Nonzero - use native MK20DX128 SPI */ -#define ILI_USE_NATIVE_TEENSY3_SPI 1 -#endif // ILI_TEENSY3_SOFT_SPI -#endif // defined(__arm__) && defined(CORE_TEENSY) -#endif // !ILI_USE_ARDUINO_SPI_LIBRARY - -#ifndef ILI_USE_SOFTWARE_SPI -#define ILI_USE_SOFTWARE_SPI 0 -#endif // ILI_USE_SOFTWARE_SPI - -#ifndef ILI_USE_NATIVE_AVR_SPI -#define ILI_USE_NATIVE_AVR_SPI 0 -#endif - -#ifndef ILI_USE_NATIVE_SAM3X_SPI -#define ILI_USE_NATIVE_SAM3X_SPI 0 -#endif // ILI_USE_NATIVE_SAM3X_SPI - -#ifndef ILI_USE_NATIVE_STM32F1_SPI -#define ILI_USE_NATIVE_STM32F1_SPI 0 -#endif // ILI_USE_NATIVE_STM32F1_SPI - -#ifndef ILI_USE_NATIVE_TEENSY3_SPI -#define ILI_USE_NATIVE_TEENSY3_SPI 0 -#endif // ILI_USE_NATIVE_TEENSY3_SPI -//------------------------------------------------------------------------------ -// define default chip select pin -// -#if !ILI_USE_SOFTWARE_SPI -/** The default chip select pin for the SD card is SS. */ -uint8_t const ILI_SD_CHIP_SELECT_PIN = SS; -#else // USE_AVR_SOFTWARE_SPI -/** SPI chip select pin for software SPI. */ -uint8_t const ILI_SD_CHIP_SELECT_PIN = SOFT_SPI_CS_PIN; -#endif // USE_AVR_SOFTWARE_SPI - -//------------------------------------------------------------------------------ -/** - * \class SdSpi - * \brief SPI class for access to SD and SDHC flash memory cards. - */ -class ILI_SdSpi { - public: - /** Initialize the SPI bus */ - void begin(); - /** Set SPI options for access to SD/SDHC cards. - * - * \param[in] spiDivisor SCK clock divider relative to the system clock. - */ - void init(uint8_t spiDivisor); - /** Receive a byte. - * - * \return The byte. - */ - uint8_t receive(); - /** Receive multiple bytes. - * - * \param[out] buf Buffer to receive the data. - * \param[in] n Number of bytes to receive. - * - * \return Zero for no error or nonzero error code. - */ - uint8_t receive(uint8_t* buf, size_t n); - /** Send a byte. - * - * \param[in] data Byte to send - */ - void send(uint8_t data); - /** Send multiple bytes. - * - * \param[in] buf Buffer for data to be sent. - * \param[in] n Number of bytes to send. - */ - void send(uint8_t* buf, size_t n); -}; -//------------------------------------------------------------------------------ -// Use of inline for AVR results in up to 10% better write performance. -// Inline also save a little flash memory. -/** inline avr native functions if nonzero. */ -#define ILI_USE_AVR_NATIVE_SPI_INLINE 1 -#if ILI_USE_NATIVE_AVR_SPI && ILI_USE_AVR_NATIVE_SPI_INLINE -inline uint8_t ILI_SdSpi::receive() { - SPDR = 0XFF; - while (!(SPSR & (1 << SPIF))) {} - return SPDR; -} -inline uint8_t ILI_SdSpi::receive(uint8_t* buf, size_t n) { - if (n-- == 0) return 0; - SPDR = 0XFF; - for (size_t i = 0; i < n; i++) { - while (!(SPSR & (1 << SPIF))) {} - uint8_t b = SPDR; - SPDR = 0XFF; - buf[i] = b; - } - while (!(SPSR & (1 << SPIF))) {} - buf[n] = SPDR; - return 0; -} -inline void ILI_SdSpi::send(uint8_t data) { - SPDR = data; - while (!(SPSR & (1 << SPIF))) {} -} -inline void ILI_SdSpi::send(const uint8_t* buf , size_t n) { - if (n == 0) return; - SPDR = buf[0]; - if (n > 1) { - uint8_t b = buf[1]; - size_t i = 2; - while (1) { - while (!(SPSR & (1 << SPIF))) {} - SPDR = b; - if (i == n) break; - b = buf[i++]; - } - } - while (!(SPSR & (1 << SPIF))) {} -} -#endif // ILI_USE_NATIVE_AVR_SPI && ILI_USE_AVR_NATIVE_SPI_INLINE -#endif // ILI_SdSpi_h - diff --git a/STM32F1/libraries/ILI9341_due_STM/ILI_SdSpiSAM3X.cpp b/STM32F1/libraries/ILI9341_due_STM/ILI_SdSpiSAM3X.cpp deleted file mode 100644 index 1108e60ed..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/ILI_SdSpiSAM3X.cpp +++ /dev/null @@ -1,411 +0,0 @@ -/* Arduino SdSpi Library - * Copyright (C) 2013 by William Greiman - * - * This file is part of the Arduino SdSpi Library - * - * This Library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This Library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with the Arduino SdSpi Library. If not, see - * . - */ -#include "ILI_SdSpi.h" -#if ILI_USE_NATIVE_SAM3X_SPI -/** Use SAM3X DMAC if nonzero */ -#define ILI_USE_SAM3X_DMAC 1 -/** Use extra Bus Matrix arbitration fix if nonzero */ -#define ILI_USE_SAM3X_BUS_MATRIX_FIX 0 -/** Time in ms for DMA receive timeout */ -#define ILI_SAM3X_DMA_TIMEOUT 100 -/** chip select register number */ -#define ILI_SPI_CHIP_SEL 3 -/** DMAC receive channel */ -#define ILI_SPI_DMAC_RX_CH 1 -/** DMAC transmit channel */ -#define ILI_SPI_DMAC_TX_CH 0 -/** DMAC Channel HW Interface Number for SPI TX. */ -#define ILI_SPI_TX_IDX 1 -/** DMAC Channel HW Interface Number for SPI RX. */ -#define ILI_SPI_RX_IDX 2 -//------------------------------------------------------------------------------ -/** Disable DMA Controller. */ -static void ILI_dmac_disable() { - DMAC->DMAC_EN &= (~DMAC_EN_ENABLE); -} -/** Enable DMA Controller. */ -static void ILI_dmac_enable() { - DMAC->DMAC_EN = DMAC_EN_ENABLE; -} -/** Disable DMA Channel. */ -static void ILI_dmac_channel_disable(uint32_t ul_num) { - DMAC->DMAC_CHDR = DMAC_CHDR_DIS0 << ul_num; -} -/** Enable DMA Channel. */ -static void ILI_dmac_channel_enable(uint32_t ul_num) { - DMAC->DMAC_CHER = DMAC_CHER_ENA0 << ul_num; -} -/** Poll for transfer complete. */ -static bool ILI_dmac_channel_transfer_done(uint32_t ul_num) { - return (DMAC->DMAC_CHSR & (DMAC_CHSR_ENA0 << ul_num)) ? false : true; -} -//------------------------------------------------------------------------------ -void ILI_SdSpi::begin() { - PIO_Configure( - g_APinDescription[PIN_SPI_MOSI].pPort, - g_APinDescription[PIN_SPI_MOSI].ulPinType, - g_APinDescription[PIN_SPI_MOSI].ulPin, - g_APinDescription[PIN_SPI_MOSI].ulPinConfiguration); - PIO_Configure( - g_APinDescription[PIN_SPI_MISO].pPort, - g_APinDescription[PIN_SPI_MISO].ulPinType, - g_APinDescription[PIN_SPI_MISO].ulPin, - g_APinDescription[PIN_SPI_MISO].ulPinConfiguration); - PIO_Configure( - g_APinDescription[PIN_SPI_SCK].pPort, - g_APinDescription[PIN_SPI_SCK].ulPinType, - g_APinDescription[PIN_SPI_SCK].ulPin, - g_APinDescription[PIN_SPI_SCK].ulPinConfiguration); - pmc_enable_periph_clk(ID_SPI0); -#if ILI_USE_SAM3X_DMAC - pmc_enable_periph_clk(ID_DMAC); - ILI_dmac_disable(); - DMAC->DMAC_GCFG = DMAC_GCFG_ARB_CFG_FIXED; - ILI_dmac_enable(); -#if ILI_USE_SAM3X_BUS_MATRIX_FIX - MATRIX->MATRIX_WPMR = 0x4d415400; - MATRIX->MATRIX_MCFG[1] = 1; - MATRIX->MATRIX_MCFG[2] = 1; - MATRIX->MATRIX_SCFG[0] = 0x01000010; - MATRIX->MATRIX_SCFG[1] = 0x01000010; - MATRIX->MATRIX_SCFG[7] = 0x01000010; -#endif // ILI_USE_SAM3X_BUS_MATRIX_FIX -#endif // ILI_USE_SAM3X_DMAC -} -//------------------------------------------------------------------------------ -// start RX DMA -static void ILI_spiDmaRX(uint8_t* dst, uint16_t count) { - ILI_dmac_channel_disable(ILI_SPI_DMAC_RX_CH); - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_RX_CH].DMAC_SADDR = (uint32_t)&SPI0->SPI_RDR; - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_RX_CH].DMAC_DADDR = (uint32_t)dst; - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_RX_CH].DMAC_DSCR = 0; - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_RX_CH].DMAC_CTRLA = count | - DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_RX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | - DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_PER2MEM_DMA_FC | - DMAC_CTRLB_SRC_INCR_FIXED | DMAC_CTRLB_DST_INCR_INCREMENTING; - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_RX_CH].DMAC_CFG = DMAC_CFG_SRC_PER(ILI_SPI_RX_IDX) | - DMAC_CFG_SRC_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ASAP_CFG; - ILI_dmac_channel_enable(ILI_SPI_DMAC_RX_CH); -} -//------------------------------------------------------------------------------ -// start TX DMA -static void ILI_spiDmaTX(const uint8_t* src, uint16_t count) { - static uint8_t ff = 0XFF; - uint32_t src_incr = DMAC_CTRLB_SRC_INCR_INCREMENTING; - if (!src) { - src = &ff; - src_incr = DMAC_CTRLB_SRC_INCR_FIXED; - } - ILI_dmac_channel_disable(ILI_SPI_DMAC_TX_CH); - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_TX_CH].DMAC_SADDR = (uint32_t)src; - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_TX_CH].DMAC_DADDR = (uint32_t)&SPI0->SPI_TDR; - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_TX_CH].DMAC_DSCR = 0; - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_TX_CH].DMAC_CTRLA = count | - DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; - - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_TX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | - DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_MEM2PER_DMA_FC | - src_incr | DMAC_CTRLB_DST_INCR_FIXED; - - DMAC->DMAC_CH_NUM[ILI_SPI_DMAC_TX_CH].DMAC_CFG = DMAC_CFG_DST_PER(ILI_SPI_TX_IDX) | - DMAC_CFG_DST_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ALAP_CFG; - - ILI_dmac_channel_enable(ILI_SPI_DMAC_TX_CH); -} -//------------------------------------------------------------------------------ -// initialize SPI controller -void ILI_SdSpi::init(uint8_t sckDivisor) { - uint8_t scbr = sckDivisor; - Spi* pSpi = SPI0; - // disable SPI - pSpi->SPI_CR = SPI_CR_SPIDIS; - // reset SPI - pSpi->SPI_CR = SPI_CR_SWRST; - // no mode fault detection, set master mode - pSpi->SPI_MR = SPI_PCS(ILI_SPI_CHIP_SEL) | SPI_MR_MODFDIS | SPI_MR_MSTR; - // mode 0, 8-bit, - pSpi->SPI_CSR[ILI_SPI_CHIP_SEL] = SPI_CSR_SCBR(scbr) | SPI_CSR_NCPHA; - // enable SPI - pSpi->SPI_CR |= SPI_CR_SPIEN; -} -//------------------------------------------------------------------------------ -static inline uint8_t ILI_spiTransfer(uint8_t b) { - Spi* pSpi = SPI0; - - pSpi->SPI_TDR = b; - while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} - b = pSpi->SPI_RDR; - return b; -} -//------------------------------------------------------------------------------ -/** SPI receive a byte */ -uint8_t ILI_SdSpi::receive() { - return ILI_spiTransfer(0XFF); -} -//------------------------------------------------------------------------------ -/** SPI receive multiple bytes */ -uint8_t ILI_SdSpi::receive(uint8_t* buf, size_t n) { - Spi* pSpi = SPI0; - int rtn = 0; -#if ILI_USE_SAM3X_DMAC - // clear overrun error - uint32_t s = pSpi->SPI_SR; - - ILI_spiDmaRX(buf, n); - ILI_spiDmaTX(0, n); - - uint32_t m = millis(); - while (!ILI_dmac_channel_transfer_done(ILI_SPI_DMAC_RX_CH)) { - if ((millis() - m) > ILI_SAM3X_DMA_TIMEOUT) { - ILI_dmac_channel_disable(ILI_SPI_DMAC_RX_CH); - ILI_dmac_channel_disable(ILI_SPI_DMAC_TX_CH); - rtn = 2; - break; - } - } - if (pSpi->SPI_SR & SPI_SR_OVRES) rtn |= 1; -#else // ILI_USE_SAM3X_DMAC - for (size_t i = 0; i < n; i++) { - pSpi->SPI_TDR = 0XFF; - while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} - buf[i] = pSpi->SPI_RDR; - } -#endif // ILI_USE_SAM3X_DMAC - return rtn; -} -//------------------------------------------------------------------------------ -/** SPI send a byte */ -void ILI_SdSpi::send(uint8_t b) { - ILI_spiTransfer(b); -} -//------------------------------------------------------------------------------ -void ILI_SdSpi::send(const uint8_t* buf , size_t n) { - Spi* pSpi = SPI0; -#if ILI_USE_SAM3X_DMAC - ILI_spiDmaTX(buf, n); - while (!ILI_dmac_channel_transfer_done(ILI_SPI_DMAC_TX_CH)) {} -#else // #if ILI_USE_SAM3X_DMAC - while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} - for (size_t i = 0; i < n; i++) { - pSpi->SPI_TDR = buf[i]; - while ((pSpi->SPI_SR & SPI_SR_TDRE) == 0) {} - } -#endif // #if ILI_USE_SAM3X_DMAC - while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} - // leave RDR empty - uint8_t b = pSpi->SPI_RDR; -} -#endif // ILI_USE_NATIVE_SAM3X_SPI - -//********************************************************* -// STM32F1 section -//********************************************************* - -#if ILI_USE_NATIVE_STM32F1_SPI -#include -#include -/** Use SAM3X DMAC if nonzero */ -#define ILI_USE_STM32F1_DMAC 1 -/** Time in ms for DMA receive timeout */ -#define ILI_STM32F1_DMA_TIMEOUT 100 -/** chip select register number */ -#define ILI_SPI_CHIP_SEL 3 -/** DMAC receive channel */ -#define ILI_SPI_DMAC_RX_CH DMA_CH2 -/** DMAC transmit channel */ -#define ILI_SPI_DMAC_TX_CH DMA_CH3 -/** DMAC Channel HW Interface Number for SPI TX. */ -#define ILI_SPI_TX_IDX 1 -/** DMAC Channel HW Interface Number for SPI RX. */ -#define ILI_SPI_RX_IDX 2 - -volatile bool SPI_DMA_TX_Active = false; -volatile bool SPI_DMA_RX_Active = false; - -inline void SPI_DMA_TX_Event() { - SPI_DMA_TX_Active = false; - dma_disable(DMA1, DMA_CH3); -} - -inline void SPI_DMA_RX_Event() { - SPI_DMA_RX_Active = false; - dma_disable(DMA1, DMA_CH2); -} -//------------------------------------------------------------------------------ -/** Disable DMA Controller. */ -//static void ILI_dmac_disable() { -// DMAC->DMAC_EN &= (~DMAC_EN_ENABLE); -//} -/** Enable DMA Controller. */ -//static void ILI_dmac_enable() { -// DMAC->DMAC_EN = DMAC_EN_ENABLE; -//} -/** Disable DMA Channel. */ -static void ILI_dmac_channel_disable(dma_channel ul_num) { - dma_disable(DMA1, ul_num); -} -/** Enable DMA Channel. */ -static void ILI_dmac_channel_enable(dma_channel ul_num) { - dma_enable(DMA1, ul_num); -} -/** Poll for transfer complete. */ -//static bool ILI_dmac_channel_transfer_done(dma_tube tube) { -// uint8 shift = (tube - 1) * 4; -// return ((DMA1->regs->ISR >> shift) & 0x02) ? false : true; - -// return (DMAC->DMAC_CHSR & (DMAC_CHSR_ENA0 << ul_num)) ? false : true; -//} -//------------------------------------------------------------------------------ -void ILI_SdSpi::begin() { - SPI.begin(); - SPI.setClockDivider(SPI_CLOCK_DIV2); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - // DMA setup stuff. We use a line buffer and usa DMA for filling lines and blocks. - - - -#if ILI_USE_STM32F1_DMAC - dma_init(DMA1); - dma_attach_interrupt(DMA1, DMA_CH3, SPI_DMA_TX_Event); - dma_attach_interrupt(DMA1, DMA_CH2, SPI_DMA_RX_Event); - spi_tx_dma_enable(SPI1); - spi_rx_dma_enable(SPI1); - - -#endif // ILI_USE_STM32F1_DMAC -} -//------------------------------------------------------------------------------ -// start RX DMA - -static void ILI_spiDmaRX(uint8_t* dst, uint16_t count) { -// spi_rx_dma_enable(SPI1); - if (count < 1) return; - dma_setup_transfer(DMA1, DMA_CH2, &SPI1->regs->DR, DMA_SIZE_8BITS, - dst, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT)); - dma_set_num_transfers(DMA1, DMA_CH2, count); // 2 bytes per pixel - SPI_DMA_RX_Active = true; - dma_enable(DMA1, DMA_CH2); - - -} -//------------------------------------------------------------------------------ -// start TX DMA -static void ILI_spiDmaTX(uint8_t* src, uint16_t count) { - if (count < 1) return; - static uint8_t ff = 0XFF; -// spi_tx_dma_enable(SPI1); - // dma_init(DMA1); - // dma_attach_interrupt(DMA1, DMA_CH3, SPI_DMA_TX_Event); - - - if (!src) { - src = &ff; - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - src, DMA_SIZE_8BITS, (DMA_FROM_MEM | DMA_TRNS_CMPLT)); - } - else { - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - src, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT)); - } - dma_set_num_transfers(DMA1, DMA_CH3, count); // 2 bytes per pixel - SPI_DMA_TX_Active = true; - dma_enable(DMA1, DMA_CH3); - -} -//------------------------------------------------------------------------------ -// initialize SPI controller STM32F1 -void ILI_SdSpi::init(uint8_t sckDivisor) { - SPI.setClockDivider(sckDivisor); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - spi_tx_dma_enable(SPI1); - spi_rx_dma_enable(SPI1); - -} -//------------------------------------------------------------------------------ -// STM32 -static inline uint8_t ILI_spiTransfer(uint8_t b) { - return SPI.transfer(b); -} -//------------------------------------------------------------------------------ -// should be valid for STM32 -/** SPI receive a byte */ -uint8_t ILI_SdSpi::receive() { - return ILI_spiTransfer(0xFF); -} -//------------------------------------------------------------------------------ -/** SPI receive multiple bytes */ -// check and finish. - -uint8_t ILI_SdSpi::receive(uint8_t* buf, size_t n) { - int rtn = 0; - -#if ILI_USE_STM32F1_DMAC - // clear overrun error - // uint32_t s = pSpi->SPI_SR; - ILI_spiDmaRX(buf, n); - ILI_spiDmaTX(0, n); - - - uint32_t m = millis(); - while (SPI_DMA_RX_Active) { - if ((millis() - m) > ILI_STM32F1_DMA_TIMEOUT) { - ILI_dmac_channel_disable(ILI_SPI_DMAC_RX_CH); - ILI_dmac_channel_disable(ILI_SPI_DMAC_TX_CH); - rtn = 2; - break; - } - } - // if (pSpi->SPI_SR & SPI_SR_OVRES) rtn |= 1; -#else // ILI_USE_STM32F1_DMAC - for (size_t i = 0; i < n; i++) { - buf[i] = SPI.transfer (0xFF); - } -#endif // ILI_USE_STM32F1_DMAC - return rtn; -} -//------------------------------------------------------------------------------ -/** SPI send a byte */ -void ILI_SdSpi::send(uint8_t b) { - ILI_spiTransfer(b); -} -//------------------------------------------------------------------------------ -void ILI_SdSpi::send(uint8_t* buf , size_t n) { - -#if ILI_USE_STM32F1_DMAC - ILI_spiDmaTX(buf, n); - while (SPI_DMA_TX_Active) {} - - // uint32_t m = millis(); - // while (SPI_DMA_TX_Active) { - // if ((millis() - m) > ILI_STM32F1_DMA_TIMEOUT) { - // ILI_dmac_channel_disable(ILI_SPI_DMAC_TX_CH); - // break; - // } - // } -#else // #if ILI_USE_STM32F1_DMAC - SPI.write (buf, n) -#endif // #if ILI_USE_STM32F1_DMAC - // leave RDR empty - // uint8_t b = pSpi->SPI_RDR; -} -#endif // ILI_USE_NATIVE_STM32F1_SPI diff --git a/STM32F1/libraries/ILI9341_due_STM/README.md b/STM32F1/libraries/ILI9341_due_STM/README.md deleted file mode 100644 index 5b52f7943..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/README.md +++ /dev/null @@ -1,48 +0,0 @@ -ILI9341_due -=========== - -Please see http://marekburiak.github.io/ILI9341_due - - -Version History: -``` -v0.94.000 - Added AVR compatibility, the library can now be also used on Uno, Mega and alike. - Please check the github.io page for more information (especially if you want to - use gText) -v0.93.000 - Breaking changes: - - setRotation now needs iliRotation enum as a parameter (instead of an int) - - the meaning of some gText drawString parameters have changed - (event though the parameter type is the same) - - new additions: - - gText drawString with new parameters - - new gText drawStringOffseted, drawStringPivoted, drawStringPivotedOffseted - functions - - gText fontLetterSpacing default value is now 2 (previously 0) - - examples updated - -v0.92.002 - Fixed drawArc - - Added setArcParams function to change maxArcAngle and arcAngleOffset at runtime - -v0.92.001 - Added fontHeight function in gText - - fixes for NORMAL and EXTENDED mode - -v0.92.000 - Added drawArc function for drawing arcs and circles with thickness and pies - - Added screenshotToConsole method and ILIScreenShotViewer app for taking - screenshots from the display - - Added alignment options for drawString in ILI9341_due_gText - -v0.91.002 - Updated graphicstestWithStats example sketch so it does not use Streaming.h - -v0.91.001 - Performance improvements (especially fill circle) - - Fixed a scanline fill bug, clean up commented out code - -v0.91.000 - Added functions for controlling TFT power levels (sleep, idle, setPowerLevel) - -v0.90.026 - Fixed fillScreen after recent changes - -v0.90.025 - Added PushColors565 function - - Added BMP24toILI565 tool - - Updated sdFatTftBitmap example - -v0.90.010 - Initial version -``` \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/arcs/arcs.ino b/STM32F1/libraries/ILI9341_due_STM/examples/arcs/arcs.ino deleted file mode 100644 index a1fe0597c..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/examples/arcs/arcs.ino +++ /dev/null @@ -1,243 +0,0 @@ - -//#include -#include -#include "ILI_SdSpi.h" -#include "ILI_SdFatConfig.h" -#include "ILI9341_due_gText.h" -#include "ILI9341_due.h" -#include "Arial_bold_14.h" -#include "roboto16.h" -#include "roboto32.h" -#include "roboto70.h" - -#define TFT_DC 10 -#define TFT_CS 8 -#define rst 9 - -// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC -ILI9341_due tft = ILI9341_due(TFT_CS, TFT_DC, rst); - -char textBuff[20]; - -ILI9341_due_gText t1(&tft); -ILI9341_due_gText t2(&tft); -ILI9341_due_gText t3(&tft); -uint16_t colorLightGray = tft.color565(192,192,192); -uint16_t colorGray = tft.color565(127,127,127); -uint16_t colorDarkGray = tft.color565(64,64,64); - -void setup() -{ - Serial.begin(9600); - while (!Serial) ; // wait for Arduino Serial Monitor - - tft.begin(); - tft.setRotation(iliRotation270); - - screenIntro(); - delay(2000); - screenLoading(); - screenClock(); - screenPie(); - delay(2000); - screenSensors(); -} - -void screenIntro() -{ - tft.fillScreen(ILI9341_BLUE); - t1.defineArea(100, 100, 220, 140); - t1.selectFont(Arial_bold_14); - t1.setFontLetterSpacing(5); - t1.setFontColor(ILI9341_WHITE, ILI9341_BLUE); - strcpy(textBuff, "Arcs demo"); - t1.drawString(textBuff, gTextAlignMiddleCenter); -} - -void screenLoading() -{ - const uint16_t x = 159; - const uint16_t y = 149; - tft.fillScreen(ILI9341_BLACK); - t1.selectFont(roboto32); - t1.setFontLetterSpacing(5); - t1.setFontColor(ILI9341_WHITE, ILI9341_BLACK); - t1.defineArea(100, 85, 220, 140); - strcpy(textBuff, "Loading..."); - t1.drawString(textBuff, gTextAlignTopCenter, 0, 0); - tft.drawArc(x, y, 10, 5, 0, 360, colorLightGray); - - for(int i=0; i<2880; i+=4) - { - tft.drawArc(x, y, 10, 5, (i >> 1)-45, (i >> 1)+45, colorDarkGray); - tft.drawArc(x, y, 10, 5, (i >> 1)-45-4, (i >> 1)-45, colorLightGray); - - tft.drawArc(x, y, 20, 5, 1440-i-45, 1440-i+45, colorDarkGray); - tft.drawArc(x, y, 20, 5, 1440-i+45, 1440-i+45+4, colorLightGray); - } -} - -void screenClock() -{ - const uint16_t x = 159; - const uint16_t y = 119; - tft.fillScreen(ILI9341_BLACK); - t1.selectFont(roboto70); - t1.setFontLetterSpacing(5); - t1.setFontColor(ILI9341_WHITE, ILI9341_BLACK); - t1.drawString("15:06", gTextAlignMiddleCenter); - tft.drawArc(x,y,102,11,0,225, colorLightGray); // 15 hours - tft.drawArc(x,y,113,8,0,36, colorGray); // 6 minutes - tft.drawArc(x,y,120,5,0,360, colorDarkGray); // seconds - - for(uint16_t d=324; d<372; d++) - { - tft.drawArc(x,y,120,5,d-1,d+1, ILI9341_RED); - tft.drawArc(x,y,120,5,d-2,d-1, colorDarkGray); // to erase the red - if(d == 360) - { - t1.drawString("15:07", gTextAlignMiddleCenter); - tft.drawArc(x,y,113,8,0,42, colorGray); // 7 minutes - } - delay(166); - } -} - -void screenPie() -{ - const uint16_t x = 159; - const uint16_t y = 119; - const uint16_t radius = 80; - - tft.fillScreen(ILI9341_BLACK); - t1.selectFont(roboto16); - t1.setFontLetterSpacing(2); - tft.drawArc(x+3,y-2,radius,radius,0,60, tft.color565(198,255,13)); - tft.drawArc(x-3,y+7,radius+10,radius+10,60,340, tft.color565(255,0,54)); - tft.drawArc(x-2,y-3,radius,radius,340,360, tft.color565(0,255,241)); - - t1.defineArea(0,0,220,180); - t1.selectFont(roboto16); - t1.setFontMode(gTextFontMode_Transparent); - t1.setFontColor(ILI9341_BLACK); - t1.drawString("16%",175,70); - t1.drawString("78%",140,150); - t1.setFontColor(colorLightGray); - t1.drawString("6%",132,18); - delay(2000); -} - -void screenSensors() -{ - const uint16_t radius = 55; - float temp=22.4; - uint16_t hum=73, lux=1154; - - const uint16_t s1x = 0; - const uint16_t s1y = 10; - - const uint16_t s2x = 110; - const uint16_t s2y = 70; - - const uint16_t s3x = 210; - const uint16_t s3y = 130; - - tft.fillScreen(ILI9341_BLACK); - - t1.setFontMode(gTextFontMode_Solid); - t1.setFontLetterSpacing(3); - t2.setFontMode(gTextFontMode_Solid); - t2.setFontLetterSpacing(3); - t3.setFontMode(gTextFontMode_Solid); - t3.setFontLetterSpacing(3); - - t1.defineArea(s1x,s1y,s1x+2*radius,s1y+2*radius); - t2.defineArea(s2x,s2y,s2x+2*radius,s2y+2*radius); - t3.defineArea(s3x,s3y,s3x+2*radius,s3y+2*radius); - - t1.setFontColor(ILI9341_WHITE); - tft.drawArc(s1x+radius,s1y+radius,radius,10,-3,3, tft.color565(127,0,27)); - t1.selectFont(roboto16); - t1.drawStringOffseted("C", gTextAlignMiddleCenter, 0, 25); - t1.selectFont(roboto32); - sprintf(textBuff, "%4.1f", temp); - t1.drawString(textBuff, gTextAlignMiddleCenter); - tft.fillRect(s1x+radius-7,s1y+radius+17,2,2,ILI9341_WHITE); // degrees symbol - - for(uint16_t d=1; d220 && d % 15 == 0) - { - temp+=0.1; - sprintf(textBuff, "%4.1f", temp); - t1.drawString(textBuff, gTextAlignMiddleCenter, 3, 3); - tft.drawArc(s1x+radius,s1y+radius,radius,10,temp*10,temp*10+3, tft.color565(127,0,27)); - tft.drawArc(s1x+radius,s1y+radius,radius-3,4,temp*10-2,temp*10, tft.color565(255,0,54)); - delay(random(350, 700)); - } - if(d>300 && d<600 && d % 38 == 0) - { - hum+=1; - sprintf(textBuff, "%d", hum); - t2.drawString(textBuff, gTextAlignMiddleCenter, 3, 3); - tft.drawArc(s2x+radius,s2y+radius,radius,10,(float)hum*3.6-4,(float)hum*3.6+3, tft.color565(0,43,127)); - tft.drawArc(s2x+radius,s2y+radius,radius-3,4,(float)hum*3.6-5,(float)hum*3.6, tft.color565(0,86,255)); - } - } -} - - -void loop() -{ - setup (); - /* add main program code here */ - -} diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto16.h b/STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto16.h deleted file mode 100644 index 89b83c62f..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto16.h +++ /dev/null @@ -1,167 +0,0 @@ - - -/* - * - * roboto16 - * - * created with FontCreator - * written by F. Maximilian Thiele - * - * http://www.apetech.de/fontCreator - * me@apetech.de - * - * File Name : roboto16.h - * Date : 18.09.2014 - * Font size in bytes : 10574 - * Font width : 10 - * Font height : 17 - * Font first char : 32 - * Font last char : 145 - * Font used chars : 113 - * - * The font data are defined as - * - * struct _FONT_ { - * uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; - * uint8_t font_Width_in_Pixel_for_fixed_drawing; - * uint8_t font_Height_in_Pixel_for_all_characters; - * unit8_t font_First_Char; - * uint8_t font_Char_Count; - * - * uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1]; - * // for each character the separate width in pixels, - * // characters < 128 have an implicit virtual right empty row - * - * uint8_t font_data[]; - * // bit field of all characters - */ - -#include -#include - -#ifndef ROBOTO16_H -#define ROBOTO16_H - -#define ROBOTO16_WIDTH 10 -#define ROBOTO16_HEIGHT 17 - -static const uint8_t roboto16[] PROGMEM = { - 0x29, 0x4E, // size - 0x0A, // width - 0x11, // height - 0x20, // first char - 0x71, // char count - - // char widths - 0x00, 0x01, 0x03, 0x08, 0x07, 0x0A, 0x08, 0x01, 0x04, 0x04, - 0x07, 0x07, 0x02, 0x04, 0x01, 0x06, 0x07, 0x03, 0x07, 0x07, - 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01, 0x02, 0x06, 0x07, - 0x07, 0x06, 0x0D, 0x0A, 0x08, 0x08, 0x09, 0x08, 0x08, 0x09, - 0x09, 0x01, 0x06, 0x09, 0x07, 0x0B, 0x09, 0x09, 0x08, 0x09, - 0x09, 0x08, 0x09, 0x08, 0x0A, 0x0D, 0x09, 0x09, 0x08, 0x03, - 0x06, 0x03, 0x05, 0x07, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x04, 0x07, 0x07, 0x01, 0x02, 0x07, 0x01, 0x0C, 0x07, 0x07, - 0x07, 0x07, 0x04, 0x06, 0x05, 0x07, 0x08, 0x0B, 0x07, 0x08, - 0x06, 0x04, 0x01, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - - // font data - 0xFC, 0x11, 0x00, // 33 - 0x1E, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 34 - 0x20, 0x20, 0xF8, 0x24, 0x20, 0xE0, 0x3C, 0x20, 0x02, 0x1E, 0x03, 0x02, 0x1E, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 35 - 0x38, 0x44, 0x44, 0x83, 0x84, 0x04, 0x18, 0x0C, 0x10, 0x10, 0x70, 0x10, 0x11, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 36 - 0x3C, 0x44, 0x42, 0x3C, 0x80, 0x40, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0x01, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 37 - 0x00, 0xBC, 0x44, 0xC2, 0x24, 0x1C, 0x00, 0x00, 0x0F, 0x10, 0x10, 0x10, 0x13, 0x14, 0x08, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 38 - 0x0E, 0x00, 0x00, // 39 - 0xE0, 0x1C, 0x02, 0x01, 0x0F, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x80, // 40 - 0x01, 0x06, 0x18, 0xE0, 0x00, 0xC0, 0x30, 0x0F, 0x80, 0x00, 0x00, 0x00, // 41 - 0x10, 0x90, 0x50, 0x3C, 0x50, 0x90, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 42 - 0x80, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 43 - 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, // 44 - 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, // 45 - 0x00, 0x10, 0x00, // 46 - 0x00, 0x00, 0x00, 0xE0, 0x1C, 0x04, 0x20, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 47 - 0xF8, 0x04, 0x04, 0x02, 0x04, 0x04, 0xF8, 0x07, 0x18, 0x10, 0x10, 0x10, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 48 - 0x04, 0x04, 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, // 49 - 0x18, 0x04, 0x04, 0x02, 0x84, 0x6C, 0x10, 0x10, 0x18, 0x14, 0x13, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 50 - 0x18, 0x04, 0x84, 0x82, 0x84, 0xC4, 0x38, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 51 - 0x00, 0x80, 0x60, 0x10, 0x0C, 0xFC, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x02, 0x1F, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 52 - 0xC0, 0xBC, 0x44, 0x44, 0x44, 0x44, 0x84, 0x04, 0x18, 0x10, 0x10, 0x10, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 53 - 0xF0, 0x4C, 0x44, 0x24, 0x42, 0x44, 0x80, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 54 - 0x04, 0x04, 0x04, 0xC4, 0x24, 0x1C, 0x04, 0x00, 0x00, 0x1E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 55 - 0x38, 0xC4, 0x84, 0x82, 0x84, 0xC4, 0x38, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 56 - 0xF8, 0x04, 0x04, 0x02, 0x04, 0x8C, 0xF0, 0x00, 0x11, 0x11, 0x12, 0x11, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 57 - 0x20, 0x10, 0x00, // 58 - 0x00, 0x20, 0x40, 0x70, 0x00, 0x00, // 59 - 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 60 - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 61 - 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 62 - 0x0C, 0x04, 0x02, 0x84, 0x6C, 0x10, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 63 - 0xC0, 0x30, 0x08, 0x08, 0x84, 0x44, 0x24, 0x24, 0xC4, 0x04, 0x08, 0x30, 0xC0, 0x1F, 0x60, 0x80, 0x8F, 0x10, 0x10, 0x10, 0x08, 0x9F, 0x10, 0x10, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // 64 - 0x00, 0x00, 0x80, 0x70, 0x0C, 0x0C, 0x70, 0x80, 0x00, 0x00, 0x10, 0x0C, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 65 - 0xFC, 0x84, 0x84, 0x84, 0x84, 0xC4, 0xEC, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 66 - 0xF0, 0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x18, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 67 - 0xFC, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x18, 0xE0, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 68 - 0xFC, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x04, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 69 - 0xFC, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x04, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 70 - 0xF0, 0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x0C, 0x10, 0x03, 0x0C, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 71 - 0xFC, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 72 - 0xFC, 0x1F, 0x00, // 73 - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 74 - 0xFC, 0x80, 0x80, 0xC0, 0x20, 0x10, 0x08, 0x04, 0x04, 0x1F, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 75 - 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 76 - 0xFC, 0x04, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x18, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x07, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 77 - 0xFC, 0x04, 0x18, 0x20, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 78 - 0xF0, 0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x08, 0xF0, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 79 - 0xFC, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 80 - 0xF0, 0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x08, 0xF0, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x2C, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 81 - 0xFC, 0x84, 0x84, 0x84, 0x84, 0x84, 0x44, 0x38, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 82 - 0x38, 0x44, 0x44, 0x82, 0x82, 0x84, 0x04, 0x18, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 83 - 0x04, 0x04, 0x04, 0x04, 0xFC, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 84 - 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 85 - 0x04, 0x1C, 0xE0, 0x00, 0x00, 0x00, 0x80, 0x60, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x03, 0x1C, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 86 - 0x3C, 0xC0, 0x00, 0x00, 0xE0, 0x1C, 0x1C, 0xE0, 0x00, 0x00, 0x80, 0x78, 0x04, 0x00, 0x03, 0x1C, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x07, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 87 - 0x00, 0x04, 0x08, 0x30, 0xC0, 0xC0, 0x30, 0x08, 0x04, 0x10, 0x18, 0x0C, 0x02, 0x01, 0x01, 0x02, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 88 - 0x04, 0x0C, 0x30, 0x40, 0x80, 0x80, 0x60, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 89 - 0x04, 0x04, 0x04, 0x84, 0x64, 0x14, 0x0C, 0x04, 0x18, 0x14, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 90 - 0xFF, 0x01, 0x01, 0x7F, 0x40, 0x40, 0x00, 0x00, 0x00, // 91 - 0x04, 0x1C, 0x60, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 92 - 0x01, 0x01, 0xFF, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, // 93 - 0x60, 0x18, 0x0C, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 94 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 95 - 0x02, 0x0C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 96 - 0x40, 0x20, 0x10, 0x10, 0x20, 0xE0, 0x00, 0x1E, 0x12, 0x11, 0x11, 0x11, 0x1F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 97 - 0xFE, 0x20, 0x20, 0x10, 0x10, 0x20, 0xC0, 0x1F, 0x08, 0x10, 0x10, 0x10, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 98 - 0xC0, 0x20, 0x10, 0x10, 0x20, 0x60, 0x80, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 99 - 0xC0, 0x20, 0x10, 0x10, 0x20, 0x40, 0xFE, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 100 - 0xC0, 0x20, 0x10, 0x10, 0x20, 0x60, 0x80, 0x0F, 0x19, 0x11, 0x11, 0x11, 0x19, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 101 - 0x20, 0xFE, 0x22, 0x22, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 102 - 0xC0, 0x20, 0x10, 0x10, 0x20, 0x40, 0xE0, 0x0F, 0x90, 0x90, 0x90, 0x90, 0xC8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 103 - 0xFE, 0x20, 0x20, 0x10, 0x10, 0x20, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 104 - 0xE2, 0x1F, 0x00, // 105 - 0x00, 0xE2, 0x80, 0xFF, 0x00, 0x00, // 106 - 0xFE, 0x00, 0x00, 0x80, 0x60, 0x20, 0x00, 0x1F, 0x01, 0x01, 0x02, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 107 - 0xFE, 0x1F, 0x00, // 108 - 0xE0, 0x20, 0x20, 0x10, 0x10, 0x60, 0xC0, 0x20, 0x10, 0x10, 0x20, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 109 - 0xE0, 0x20, 0x20, 0x10, 0x10, 0x20, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 110 - 0xC0, 0x20, 0x20, 0x10, 0x20, 0x20, 0xC0, 0x0F, 0x18, 0x10, 0x10, 0x10, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 111 - 0xE0, 0x20, 0x20, 0x10, 0x10, 0x20, 0xC0, 0xFF, 0x08, 0x10, 0x10, 0x10, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 112 - 0xC0, 0x20, 0x10, 0x10, 0x20, 0x40, 0xE0, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 113 - 0xE0, 0x20, 0x20, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 114 - 0xE0, 0x20, 0x10, 0x10, 0x20, 0x60, 0x08, 0x11, 0x11, 0x11, 0x12, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 115 - 0x20, 0x20, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // 116 - 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x18, 0x10, 0x10, 0x10, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 117 - 0x20, 0xE0, 0x00, 0x00, 0x00, 0x80, 0x60, 0x20, 0x00, 0x00, 0x03, 0x1C, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 118 - 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x20, 0x00, 0x0F, 0x18, 0x07, 0x00, 0x00, 0x07, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 119 - 0x00, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x18, 0x0C, 0x03, 0x03, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 120 - 0x20, 0xE0, 0x00, 0x00, 0x00, 0x80, 0x60, 0x20, 0x00, 0x80, 0x83, 0x7C, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 121 - 0x20, 0x20, 0x20, 0xA0, 0x60, 0x20, 0x18, 0x14, 0x13, 0x11, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 122 - 0x00, 0xF8, 0x06, 0x02, 0x01, 0x3E, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, // 123 - 0xFC, 0x7F, 0x00, // 124 - 0x02, 0x02, 0xFC, 0x00, 0x00, 0x80, 0x80, 0x7E, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // 125 - 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 126 - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto32.h b/STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto32.h deleted file mode 100644 index 396469929..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto32.h +++ /dev/null @@ -1,165 +0,0 @@ - - -/* - * - * roboto32 - * - * created with FontCreator - * written by F. Maximilian Thiele - * - * http://www.apetech.de/fontCreator - * me@apetech.de - * - * File Name : roboto32.h - * Date : 18.09.2014 - * Font size in bytes : 40065 - * Font width : 10 - * Font height : 33 - * Font first char : 32 - * Font last char : 128 - * Font used chars : 96 - * - * The font data are defined as - * - * struct _FONT_ { - * uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; - * uint8_t font_Width_in_Pixel_for_fixed_drawing; - * uint8_t font_Height_in_Pixel_for_all_characters; - * unit8_t font_First_Char; - * uint8_t font_Char_Count; - * - * uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1]; - * // for each character the separate width in pixels, - * // characters < 128 have an implicit virtual right empty row - * - * uint8_t font_data[]; - * // bit field of all characters - */ - -#include -#include - -#ifndef ROBOTO32_H -#define ROBOTO32_H - -#define ROBOTO32_WIDTH 10 -#define ROBOTO32_HEIGHT 33 - -static const uint8_t roboto32[] PROGMEM = { - 0x9C, 0x81, // size - 0x0A, // width - 0x21, // height - 0x20, // first char - 0x60, // char count - - // char widths - 0x00, 0x03, 0x05, 0x11, 0x0E, 0x14, 0x12, 0x02, 0x08, 0x08, - 0x0D, 0x10, 0x03, 0x07, 0x02, 0x0C, 0x0E, 0x08, 0x0E, 0x0E, - 0x10, 0x0D, 0x0E, 0x0F, 0x0E, 0x0F, 0x02, 0x04, 0x0D, 0x0D, - 0x0D, 0x0C, 0x19, 0x13, 0x0F, 0x11, 0x10, 0x0E, 0x0F, 0x11, - 0x11, 0x02, 0x0E, 0x11, 0x0D, 0x16, 0x11, 0x12, 0x0F, 0x12, - 0x10, 0x11, 0x11, 0x10, 0x12, 0x1B, 0x12, 0x12, 0x11, 0x05, - 0x0B, 0x05, 0x0B, 0x0E, 0x06, 0x0D, 0x0E, 0x0D, 0x0D, 0x0E, - 0x0A, 0x0D, 0x0D, 0x02, 0x05, 0x0E, 0x02, 0x18, 0x0D, 0x0F, - 0x0E, 0x0D, 0x09, 0x0C, 0x08, 0x0D, 0x0E, 0x16, 0x0E, 0x0E, - 0x0E, 0x09, 0x01, 0x09, 0x12, 0x00, - - // font data - 0x00, 0xF8, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x87, 0x87, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, // 33 - 0xFC, 0x1C, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 34 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0xF4, 0x7F, 0x05, 0x04, 0x04, 0x04, 0xC4, 0xFE, 0x0F, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0xCC, 0xFE, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0xFC, 0x7F, 0x0D, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 35 - 0x00, 0xC0, 0xF0, 0x30, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x30, 0x70, 0xE0, 0x80, 0x00, 0x0F, 0x1E, 0x30, 0x30, 0x60, 0x60, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x03, 0x03, 0x78, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x83, 0xFF, 0x7C, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x1E, 0x1E, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 36 - 0xE0, 0x30, 0x18, 0x08, 0x08, 0x18, 0x10, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1C, 0x10, 0x30, 0x10, 0x10, 0x18, 0x0F, 0x03, 0x80, 0xE0, 0x38, 0x0C, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x38, 0x0C, 0x07, 0x01, 0x00, 0xF8, 0xFE, 0x03, 0x01, 0x01, 0x01, 0x03, 0xCE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x02, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 37 - 0x00, 0x00, 0x00, 0xE0, 0x70, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xDE, 0x78, 0x60, 0xF0, 0x98, 0x0C, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xFE, 0xC7, 0x81, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x1C, 0xB0, 0xE0, 0xF0, 0xBF, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x01, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 38 - 0xFC, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 39 - 0x00, 0x00, 0xC0, 0xF0, 0x38, 0x0C, 0x07, 0x02, 0xE0, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x1C, 0x70, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, // 40 - 0x03, 0x06, 0x0C, 0x38, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x1F, 0x00, 0x80, 0xC0, 0x70, 0x1C, 0x0F, 0x01, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 41 - 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x01, 0x81, 0xE3, 0x73, 0x1A, 0x0F, 0x0F, 0x3A, 0x63, 0xC3, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 42 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 43 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x20, 0x3F, 0x0F, 0x00, 0x00, 0x00, // 44 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 45 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, // 46 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0x3C, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0x3E, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 47 - 0x00, 0xC0, 0x70, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0xE0, 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0xFF, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x7F, 0x1F, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 48 - 0x20, 0x30, 0x30, 0x30, 0x10, 0x10, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 49 - 0xC0, 0xE0, 0x30, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0xE0, 0xC0, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x70, 0x3F, 0x0F, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x1C, 0x0E, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 50 - 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0xF0, 0xC0, 0x00, 0x01, 0x01, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x60, 0xE0, 0xB0, 0x9F, 0x0F, 0x00, 0x70, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xFF, 0x3C, 0x00, 0x01, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 51 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x38, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x70, 0x38, 0x0E, 0x07, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x08, 0x0E, 0x0B, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 52 - 0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0xFC, 0xFF, 0x20, 0x30, 0x10, 0x10, 0x18, 0x18, 0x30, 0x30, 0x60, 0xE0, 0x80, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x01, 0x01, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 53 - 0x00, 0x80, 0xE0, 0x70, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x00, 0x00, 0xFC, 0xFF, 0x61, 0x30, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0xE0, 0xC0, 0x0F, 0x7F, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF1, 0x7F, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 54 - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x98, 0xD8, 0x78, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 55 - 0x80, 0xE0, 0x70, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0xF0, 0xE0, 0x00, 0x07, 0x1F, 0xB8, 0xB0, 0xE0, 0x60, 0x40, 0x60, 0x60, 0xE0, 0xB0, 0x9C, 0x0F, 0x03, 0xFE, 0xE7, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xFF, 0x7E, 0x00, 0x01, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 56 - 0x00, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x70, 0xE0, 0xC0, 0x00, 0x1E, 0xFF, 0xE1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC1, 0xFF, 0xFC, 0x00, 0x00, 0x01, 0x03, 0x03, 0x06, 0x06, 0x06, 0x06, 0x02, 0x03, 0x81, 0xF0, 0x7F, 0x07, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 57 - 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, // 58 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, // 59 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x60, 0x60, 0x20, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x01, 0x01, 0x03, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 60 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 61 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x0C, 0x08, 0x18, 0x10, 0x30, 0x30, 0x60, 0x60, 0x40, 0xC0, 0x80, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x04, 0x06, 0x06, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 62 - 0xC0, 0xE0, 0x70, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0xF0, 0xC0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x1F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 63 - 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0x20, 0x60, 0x40, 0xC0, 0x80, 0x00, 0x00, 0xC0, 0xF8, 0x1C, 0x07, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x70, 0x30, 0x18, 0x08, 0x08, 0x08, 0x18, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0xF8, 0xFF, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x3F, 0x01, 0x07, 0x1C, 0x30, 0x60, 0xC0, 0xC0, 0x80, 0x83, 0x03, 0x02, 0x02, 0x02, 0x03, 0x81, 0x80, 0x81, 0x83, 0x02, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 64 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x78, 0x78, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x7C, 0x1F, 0x03, 0x00, 0x00, 0x01, 0x0F, 0x7C, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x7C, 0x1F, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0F, 0x0F, 0x7C, 0xE0, 0x80, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 65 - 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x30, 0x70, 0xE0, 0xC0, 0x00, 0xFF, 0xFF, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x9F, 0x0F, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC1, 0xFF, 0x7E, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 66 - 0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x30, 0xE0, 0xC0, 0x00, 0xFC, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0F, 0x3F, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x78, 0x18, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 67 - 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, 0x60, 0xC0, 0x80, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0x70, 0x3F, 0x0F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 68 - 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 69 - 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 70 - 0x00, 0x80, 0xC0, 0x60, 0x30, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x70, 0xE0, 0x80, 0xFC, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 0x07, 0x3F, 0x78, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 71 - 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 72 - 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x00, 0x00, // 73 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x30, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xFF, 0x3F, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 74 - 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x30, 0x18, 0x08, 0x00, 0xFF, 0xFF, 0x40, 0x40, 0x40, 0xE0, 0xF0, 0x98, 0x0C, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x0C, 0x38, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 75 - 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 76 - 0xF8, 0xF8, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x78, 0xF8, 0xF8, 0xFF, 0xFF, 0x00, 0x03, 0x1F, 0x78, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0x3C, 0x0F, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x3C, 0xF0, 0x80, 0xC0, 0xF8, 0x1E, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 77 - 0xF8, 0xF8, 0x70, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xFF, 0xFF, 0x00, 0x01, 0x03, 0x0E, 0x1C, 0x70, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x1C, 0x38, 0xE0, 0xC0, 0xFF, 0xFF, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 78 - 0x00, 0x80, 0xC0, 0x60, 0x30, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x30, 0xE0, 0xC0, 0x80, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x0F, 0x3F, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x78, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 79 - 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x30, 0x70, 0xE0, 0xC0, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0x60, 0x7F, 0x1F, 0xFF, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 80 - 0x00, 0x80, 0xC0, 0x60, 0x30, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x30, 0xE0, 0xC0, 0x80, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x0F, 0x3F, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x78, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x07, 0x0E, 0x1C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 81 - 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x30, 0x70, 0xE0, 0xC0, 0x00, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xB0, 0x3F, 0x0F, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0xFF, 0xFE, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 82 - 0x00, 0x80, 0xE0, 0x70, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x30, 0xE0, 0xC0, 0x00, 0x00, 0x07, 0x0F, 0x18, 0x30, 0x30, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x03, 0x03, 0x10, 0x70, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x81, 0xC3, 0xFE, 0x3C, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 83 - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 84 - 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0xF8, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x7F, 0x1F, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 85 - 0x38, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x18, 0x00, 0x00, 0x07, 0x3F, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3E, 0xF0, 0xC0, 0xC0, 0xF8, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 86 - 0x18, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0x78, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x78, 0x08, 0x00, 0x01, 0x1F, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0x1F, 0x01, 0x00, 0x03, 0x3F, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1F, 0xFC, 0xC0, 0xF0, 0x7F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1F, 0xFC, 0xC0, 0xF0, 0x7F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 87 - 0x08, 0x18, 0x78, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0x38, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x1E, 0xB8, 0xF0, 0xF0, 0xBC, 0x0E, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x78, 0x1C, 0x0F, 0x03, 0x00, 0x01, 0x03, 0x0E, 0x1C, 0x70, 0xE0, 0x80, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 88 - 0x18, 0x78, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x70, 0x38, 0x08, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x3C, 0x70, 0xC0, 0x00, 0xC0, 0xE0, 0x38, 0x1E, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 89 - 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x98, 0xF8, 0x78, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x38, 0x1C, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x70, 0x38, 0x0E, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 90 - 0xFF, 0x03, 0x03, 0x03, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, // 91 - 0x18, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1F, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1F, 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 92 - 0x03, 0x03, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x60, 0x60, 0x60, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, // 93 - 0x00, 0x00, 0x00, 0x80, 0xF0, 0x18, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x40, 0x78, 0x1E, 0x07, 0x00, 0x00, 0x00, 0x07, 0x1E, 0x78, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 94 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 95 - 0x08, 0x08, 0x18, 0x30, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 96 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x0C, 0x06, 0x06, 0x02, 0x02, 0x02, 0x06, 0x06, 0x1C, 0xF8, 0xE0, 0xF8, 0xDC, 0x06, 0x06, 0x02, 0x03, 0x03, 0x03, 0x03, 0x83, 0xC3, 0xFF, 0xFF, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 97 - 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x0C, 0x04, 0x06, 0x02, 0x02, 0x06, 0x06, 0x0E, 0x1C, 0xF8, 0xE0, 0xFF, 0xFF, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0x03, 0x03, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 98 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x1C, 0x06, 0x06, 0x02, 0x02, 0x02, 0x06, 0x06, 0x0C, 0x78, 0x70, 0x7F, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x60, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 99 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0xE0, 0xF8, 0x1C, 0x0E, 0x06, 0x06, 0x02, 0x02, 0x06, 0x04, 0x0C, 0xFF, 0xFF, 0x3F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 100 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x78, 0x1C, 0x0C, 0x06, 0x02, 0x02, 0x02, 0x06, 0x06, 0x0C, 0xF8, 0xF0, 0x07, 0x7F, 0xF3, 0xC3, 0x83, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x83, 0x03, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 101 - 0x00, 0x00, 0x00, 0xF0, 0xFC, 0x0C, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0xFF, 0xFF, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 102 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x1C, 0x0E, 0x06, 0x06, 0x02, 0x02, 0x06, 0x04, 0x0C, 0xF0, 0xFE, 0x3F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x00, 0x80, 0xC1, 0x83, 0x83, 0x82, 0x82, 0x82, 0x83, 0xC3, 0xE1, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, // 103 - 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x30, 0x08, 0x04, 0x06, 0x02, 0x02, 0x06, 0x06, 0x0E, 0x7C, 0xF8, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 104 - 0x0C, 0x0C, 0xFE, 0xFE, 0xFF, 0xFF, 0x03, 0x03, 0x00, 0x00, // 105 - 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x80, 0xE0, 0x7F, 0x1F, 0x80, 0x80, 0x00, 0x00, 0x00, // 106 - 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x07, 0x0E, 0x18, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 107 - 0xFC, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x00, 0x00, // 108 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x30, 0x0C, 0x04, 0x06, 0x02, 0x02, 0x06, 0x06, 0x0E, 0xFC, 0xF0, 0x38, 0x0C, 0x04, 0x06, 0x02, 0x02, 0x06, 0x06, 0x0C, 0xFC, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 109 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x30, 0x08, 0x04, 0x06, 0x02, 0x02, 0x06, 0x06, 0x0E, 0x7C, 0xF8, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 110 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x78, 0x1C, 0x0C, 0x06, 0x06, 0x02, 0x02, 0x06, 0x06, 0x0C, 0x1C, 0xF8, 0xE0, 0x07, 0x7F, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xFD, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 111 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x18, 0x0C, 0x06, 0x06, 0x02, 0x02, 0x06, 0x06, 0x0E, 0x1C, 0xF8, 0xE0, 0xFF, 0xFF, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xFF, 0x3F, 0xFF, 0xFF, 0x00, 0x01, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 112 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x1C, 0x0E, 0x06, 0x02, 0x02, 0x02, 0x06, 0x04, 0x0C, 0xFC, 0xFE, 0x3F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, // 113 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x30, 0x0C, 0x04, 0x06, 0x06, 0x06, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 114 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xFC, 0x8C, 0x06, 0x06, 0x02, 0x02, 0x06, 0x06, 0x0E, 0x3C, 0x38, 0xE0, 0xE0, 0x01, 0x01, 0x03, 0x03, 0x02, 0x06, 0x06, 0x0C, 0xDC, 0xF8, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 115 - 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0xFF, 0xFF, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 116 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x1F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0xFF, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 117 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3E, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0x1E, 0x06, 0x00, 0x00, 0x00, 0x07, 0x3E, 0xF0, 0x80, 0xC0, 0xF8, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 118 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3E, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF8, 0x1E, 0x1E, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF8, 0x3E, 0x06, 0x00, 0x00, 0x03, 0x1F, 0xFC, 0xC0, 0xE0, 0x7C, 0x0F, 0x01, 0x00, 0x00, 0x01, 0x0F, 0x7C, 0xE0, 0x80, 0xF8, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 119 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x1E, 0x38, 0xE0, 0xC0, 0x00, 0x80, 0xE0, 0x70, 0x3C, 0x0E, 0x06, 0x02, 0x00, 0x00, 0xC0, 0xE0, 0x38, 0x1D, 0x07, 0x0F, 0x1C, 0x70, 0xE0, 0x80, 0x00, 0x00, 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 120 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x3E, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x3E, 0x06, 0x00, 0x00, 0x01, 0x07, 0x3E, 0xF8, 0xC0, 0xC0, 0xF8, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0x78, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 121 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x86, 0xC6, 0x76, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x80, 0xC0, 0x70, 0x38, 0x1C, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 122 - 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF8, 0x0C, 0x04, 0x06, 0x00, 0x00, 0x80, 0xE0, 0x7F, 0x1F, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x0E, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 123 - 0xF8, 0xFF, 0xFF, 0x3F, 0x00, // 124 - 0x02, 0x06, 0x0C, 0x1C, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0x06, 0x03, 0x03, 0x80, 0xC0, 0xC0, 0x70, 0x3F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 125 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x40, 0x40, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x06, 0x06, 0x04, 0x04, 0x06, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 126 - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto70.h b/STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto70.h deleted file mode 100644 index 8cbda924f..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/examples/arcs/roboto70.h +++ /dev/null @@ -1,74 +0,0 @@ - - -/* - * - * roboto70 - * - * created with FontCreator - * written by F. Maximilian Thiele - * - * http://www.apetech.de/fontCreator - * me@apetech.de - * - * File Name : roboto70.h - * Date : 18.09.2014 - * Font size in bytes : 15623 - * Font width : 10 - * Font height : 51 - * Font first char : 48 - * Font last char : 59 - * Font used chars : 11 - * - * The font data are defined as - * - * struct _FONT_ { - * uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; - * uint8_t font_Width_in_Pixel_for_fixed_drawing; - * uint8_t font_Height_in_Pixel_for_all_characters; - * unit8_t font_First_Char; - * uint8_t font_Char_Count; - * - * uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1]; - * // for each character the separate width in pixels, - * // characters < 128 have an implicit virtual right empty row - * - * uint8_t font_data[]; - * // bit field of all characters - */ - -#include -#include - -#ifndef ROBOTO70_H -#define ROBOTO70_H - -#define ROBOTO70_WIDTH 10 -#define ROBOTO70_HEIGHT 51 - -static const uint8_t roboto70[] PROGMEM = { - 0x3D, 0x07, // size - 0x0A, // width - 0x33, // height - 0x30, // first char - 0x0B, // char count - - // char widths - 0x1F, 0x10, 0x20, 0x20, 0x24, 0x1D, 0x1F, 0x20, 0x20, 0x1F, - 0x04, - - // font data - 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF8, 0xFC, 0x3C, 0x1E, 0x1E, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x1E, 0x3E, 0x7C, 0xFC, 0xF8, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFC, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x01, 0x07, 0x1F, 0x3F, 0x7F, 0xFC, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0xFC, 0x7F, 0x3F, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 48 - 0x38, 0x38, 0x38, 0x38, 0x3C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1E, 0x1E, 0x1E, 0xFE, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, // 49 - 0x00, 0x80, 0xE0, 0xF0, 0xF8, 0x7C, 0x3C, 0x1E, 0x1E, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x1E, 0x3E, 0x7C, 0xFC, 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7F, 0x7F, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFE, 0x7F, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0x7E, 0x3F, 0x1F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0x7E, 0x3F, 0x1F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0xBF, 0x9F, 0x87, 0x83, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, // 50 - 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF8, 0xFC, 0x7C, 0x3E, 0x1E, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x1E, 0x1E, 0x3E, 0xFC, 0xF8, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x1C, 0x1F, 0x1F, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xF0, 0x78, 0x7C, 0x3F, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0E, 0x0E, 0x1E, 0x3C, 0x7C, 0xF8, 0xF0, 0xE0, 0x80, 0x00, 0x70, 0xF0, 0xF0, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xFF, 0x38, 0x00, 0x07, 0x0F, 0x3F, 0x7F, 0x7E, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0xFC, 0x7F, 0x3F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 51 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF8, 0xFE, 0x3F, 0x1F, 0x07, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0x7E, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF8, 0xFC, 0x7F, 0x1F, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 52 - 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0x70, 0x78, 0x78, 0x38, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x78, 0x78, 0xF8, 0xF0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1F, 0xFF, 0xFF, 0xFE, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x1F, 0x3F, 0x7F, 0xFC, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0xFC, 0x7F, 0x3F, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 53 - 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF8, 0xF8, 0x7C, 0x3E, 0x1E, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x1E, 0x1E, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF8, 0xFE, 0xFF, 0x7F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0xE0, 0x70, 0x78, 0x38, 0x3C, 0x1C, 0x1C, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1C, 0x3C, 0x7C, 0x78, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1F, 0xFF, 0xFF, 0xFE, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x07, 0x0F, 0x3F, 0x7F, 0x7C, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0xF8, 0x7E, 0x3F, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 54 - 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x8F, 0xCF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF8, 0xFC, 0x3F, 0x1F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFE, 0xFF, 0xFF, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 55 - 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xFC, 0x7C, 0x3E, 0x1E, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x1F, 0x1E, 0x3E, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1F, 0x3F, 0x3E, 0x78, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0x7C, 0x3F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0x3C, 0x1C, 0x1E, 0x0E, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0E, 0x1E, 0x3C, 0x7C, 0xF8, 0xF0, 0xE0, 0xC0, 0x00, 0x78, 0xFF, 0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x07, 0x1F, 0x3F, 0x7F, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0x7F, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 56 - 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF8, 0xFC, 0x7C, 0x3E, 0x1E, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x1E, 0x1E, 0x3C, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0xE0, 0xFE, 0xFF, 0xFF, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1F, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x07, 0x1F, 0x3F, 0x7F, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0x70, 0x78, 0x3E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0xFC, 0x7F, 0x3F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 57 - 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60 // 58 - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/gTextBigFont/gTextBigFont.ino b/STM32F1/libraries/ILI9341_due_STM/examples/gTextBigFont/gTextBigFont.ino deleted file mode 100644 index 66362ea78..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/examples/gTextBigFont/gTextBigFont.ino +++ /dev/null @@ -1,63 +0,0 @@ -#include //uncomment when using SPI_MODE_NORMAL or SPI_MODE_EXTENDED -#include -#include -#include -#include - -#include "fonts\jokerman_255.h" - -#define TFT_DC 10 -#define TFT_CS 8 -#define TFT_RST 9 - -ILI9341_due myTFT(TFT_CS, TFT_DC, TFT_RST); -ILI9341_due_gText t1(&myTFT); - -void setup() -{ - Serial.begin(9600); - - bool result = myTFT.begin(); - - Serial.print("TFT begin successful: "); - Serial.println(result ? "YES" : "NO"); - myTFT.fillScreen(ILI9341_BLACK); - - t1.defineArea(18, 32, 222, 287); - t1.selectFont(jokerman_255); - //t1.setFontMode(gTextFontMode_Transparent); -} - -void loop() -{ - t1.setFontColor(255,230,0,0,0,0); - t1.drawString("0", gTextAlignMiddleCenter, gTextEraseFullLine); - delay(750); - t1.setFontColor(232,157,12); - t1.drawString("1", gTextAlignMiddleCenter, gTextEraseFullLine); - delay(750); - t1.setFontColor(255,88,0); - t1.drawString("2", gTextAlignMiddleCenter, gTextEraseFullLine); - delay(750); - t1.setFontColor(232,12,15); - t1.drawString("3", gTextAlignMiddleCenter, gTextEraseFullLine); - delay(750); - t1.setFontColor(227,13,255); - t1.drawString("4", gTextAlignMiddleCenter, gTextEraseFullLine); - delay(750); - t1.setFontColor(57,0,255); - t1.drawString("5", gTextAlignMiddleCenter, gTextEraseFullLine); - delay(750); - t1.setFontColor(12,103,232); - t1.drawString("6", gTextAlignMiddleCenter, gTextEraseFullLine); - delay(750); - t1.setFontColor(0,255,243); - t1.drawString("7", gTextAlignMiddleCenter, gTextEraseFullLine); - delay(750); - t1.setFontColor(12,232,73); - t1.drawString("8", gTextAlignMiddleCenter, gTextEraseFullLine); - delay(750); - t1.setFontColor(132,255,13); - t1.drawString("9", gTextAlignMiddleCenter, gTextEraseFullLine); - delay(750); -} diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/gTextHelloWorld/gTextHelloWorld.ino b/STM32F1/libraries/ILI9341_due_STM/examples/gTextHelloWorld/gTextHelloWorld.ino deleted file mode 100644 index 7953374ef..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/examples/gTextHelloWorld/gTextHelloWorld.ino +++ /dev/null @@ -1,39 +0,0 @@ -//#include //uncomment when using SPI_MODE_NORMAL or SPI_MODE_EXTENDED -#include -#include -#include -#include - -#include "fonts\Arial_bold_14.h" - -#define TFT_CS 10 -#define TFT_DC 9 - -ILI9341_due myTFT(TFT_CS, TFT_DC); - -void setup() -{ - Serial.begin(9600); - - bool result = myTFT.begin(); - - Serial.print("TFT begin successful: "); - Serial.println(result ? "YES" : "NO"); - - myTFT.fillScreen(ILI9341_BLUE); - myTFT.setRotation(iliRotation270); - - ILI9341_due_gText t1(&myTFT); - t1.defineArea(100, 110, 220, 130); - t1.selectFont(Arial_bold_14); - t1.setFontLetterSpacing(5); - t1.setFontColor(ILI9341_WHITE, ILI9341_BLUE); - t1.drawString("Hello World", gTextAlignMiddleCenter); -} - -void loop() -{ - - /* add main program code here */ - -} diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/graphicstest/graphicstest.ino b/STM32F1/libraries/ILI9341_due_STM/examples/graphicstest/graphicstest.ino deleted file mode 100644 index 09bbeebe2..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/examples/graphicstest/graphicstest.ino +++ /dev/null @@ -1,410 +0,0 @@ -/*************************************************** - This is our GFX example for the Adafruit ILI9341 Breakout and Shield - ----> http://www.adafruit.com/products/1651 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required to - interface (RST is optional) - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - - -//#include - -#include -#include -#include -#include -#include - -// For the Adafruit shield, these are the default. - -// For the Adafruit shield, these are the default. -#define TFT_DC PA15 -#define TFT_CS PB4 -#define rst PB3 - -// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC -ILI9341_due tft = ILI9341_due(TFT_CS, TFT_DC, rst); - -void setup() { - delay (5000); - Serial.begin(115200); - while (!Serial) ; // wait for Arduino Serial Monitor - Serial.println("ILI9341 Test!"); - - tft.begin(); - - // read diagnostics (optional but can help debug problems) - uint8_t x = tft.readcommand8(ILI9341_RDMODE); - Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDMADCTL); - Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDPIXFMT); - Serial.print("Pixel Format: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDIMGFMT); - Serial.print("Image Format: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDSELFDIAG); - Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX); - - Serial.println(F("Benchmark Time (microseconds)")); - - Serial.print(F("Screen fill ")); - Serial.println(testFillScreen()); - delay(200); - - Serial.print(F("Text ")); - Serial.println(testText()); - delay(600); - - Serial.print(F("Lines ")); - Serial.println(testLines(ILI9341_CYAN)); - delay(200); - - Serial.print(F("Horiz/Vert Lines ")); - Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE)); - delay(200); - - Serial.print(F("Rectangles (outline) ")); - Serial.println(testRects(ILI9341_GREEN)); - delay(200); - - Serial.print(F("Rectangles (filled) ")); - Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA)); - delay(200); - - Serial.print(F("Circles (filled) ")); - Serial.println(testFilledCircles(10, ILI9341_MAGENTA)); - - Serial.print(F("Circles (outline) ")); - Serial.println(testCircles(10, ILI9341_WHITE)); - delay(200); - - Serial.print(F("Triangles (outline) ")); - Serial.println(testTriangles()); - delay(200); - - Serial.print(F("Triangles (filled) ")); - Serial.println(testFilledTriangles()); - delay(200); - - Serial.print(F("Rounded rects (outline) ")); - Serial.println(testRoundRects()); - delay(200); - - Serial.print(F("Rounded rects (filled) ")); - Serial.println(testFilledRoundRects()); - delay(200); - - Serial.println(F("Done!")); - -} - - -void loop(void) { - runTests(); - return; - for(uint8_t rotation=0; rotation<4; rotation++) { - tft.setRotation((iliRotation)rotation); - testText(); - delay(1000); - } -} - -void runTests() -{ - Serial.print(F("Screen fill ")); - Serial.println(testFillScreen()); -// delay(200); - - Serial.print(F("Text ")); - Serial.println(testText()); - // delay(600); - - Serial.print(F("Lines ")); - Serial.println(testLines(ILI9341_CYAN)); -// delay(200); - - Serial.print(F("Horiz/Vert Lines ")); - Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE)); -// delay(200); - - Serial.print(F("Rectangles (outline) ")); - Serial.println(testRects(ILI9341_GREEN)); - delay(200); - - Serial.print(F("Rectangles (filled) ")); - Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA)); -// delay(200); - - Serial.print(F("Circles (filled) ")); - Serial.println(testFilledCircles(10, ILI9341_MAGENTA)); - - Serial.print(F("Circles (outline) ")); - Serial.println(testCircles(10, ILI9341_WHITE)); -// delay(200); - - Serial.print(F("Triangles (outline) ")); - Serial.println(testTriangles()); -// delay(200); - - Serial.print(F("Triangles (filled) ")); - Serial.println(testFilledTriangles()); -// delay(200); - - Serial.print(F("Rounded rects (outline) ")); - Serial.println(testRoundRects()); -// delay(200); - - Serial.print(F("Rounded rects (filled) ")); - Serial.println(testFilledRoundRects()); -// delay(200); - - -} - -unsigned long testFillScreen() { - unsigned long start = micros(); -// tft.fillScreen(ILI9341_BLACK); - tft.fillScreen(ILI9341_RED); - tft.fillScreen(ILI9341_GREEN); - tft.fillScreen(ILI9341_BLUE); - tft.fillScreen(ILI9341_BLACK); - return micros() - start; -} - -unsigned long testText() { - tft.fillScreen(ILI9341_BLACK); - unsigned long start = micros(); - tft.setCursor(0, 0); - tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); - tft.println("Hello World!"); - tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2); - tft.println(1234.56); - tft.setTextColor(ILI9341_RED); tft.setTextSize(3); - tft.println(0xDEADBEEF, HEX); - tft.println(); - tft.setTextColor(ILI9341_GREEN); - tft.setTextSize(5); - tft.println("Groop"); - tft.setTextSize(2); - tft.println("I implore thee,"); - tft.setTextSize(1); - tft.println("my foonting turlingdromes."); - tft.println("And hooptiously drangle me"); - tft.println("with crinkly bindlewurdles,"); - tft.println("Or I will rend thee"); - tft.println("in the gobberwarts"); - tft.println("with my blurglecruncheon,"); - tft.println("see if I don't!"); - return micros() - start; -} - -unsigned long testLines(uint16_t color) { - unsigned long start, t; - int x1, y1, x2, y2, - w = tft.width(), - h = tft.height(); - - tft.fillScreen(ILI9341_BLACK); - - x1 = y1 = 0; - y2 = h - 1; - start = micros(); - for(x2=0; x20; i-=6) { - i2 = i / 2; - start = micros(); - tft.fillRect(cx-i2, cy-i2, i, i, color1); - t += micros() - start; - // Outlines are not included in timing results - tft.drawRect(cx-i2, cy-i2, i, i, color2); - } - - return t; -} - -unsigned long testFilledCircles(uint8_t radius, uint16_t color) { - unsigned long start; - int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; - - tft.fillScreen(ILI9341_BLACK); - start = micros(); - for(x=radius; x10; i-=5) { - start = micros(); - tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, - tft.color565(0, i, i)); - t += micros() - start; - tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, - tft.color565(i, i, 0)); - } - - return t; -} - -unsigned long testRoundRects() { - unsigned long start; - int w, i, i2, - cx = tft.width() / 2 - 1, - cy = tft.height() / 2 - 1; - - tft.fillScreen(ILI9341_BLACK); - w = min(tft.width(), tft.height()); - start = micros(); - for(i=0; i20; i-=6) { - i2 = i / 2; - tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0)); - } - - return micros() - start; -} diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/graphicstestWithStats/graphicstestWithStats.ino b/STM32F1/libraries/ILI9341_due_STM/examples/graphicstestWithStats/graphicstestWithStats.ino deleted file mode 100644 index 74f152879..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/examples/graphicstestWithStats/graphicstestWithStats.ino +++ /dev/null @@ -1,427 +0,0 @@ -/*************************************************** -This is our GFX example for the Adafruit ILI9341 Breakout and Shield -----> http://www.adafruit.com/products/1651 - -Check out the links above for our tutorials and wiring diagrams -These displays use SPI to communicate, 4 or 5 pins are required to -interface (RST is optional) -Adafruit invests time and resources providing this open source code, -please support Adafruit and open-source hardware by purchasing -products from Adafruit! - -Written by Limor Fried/Ladyada for Adafruit Industries. -MIT license, all text above must be included in any redistribution -****************************************************/ -#include -#include -#include -#include -#include -#include "fonts\Arial_bold_14.h" - - -#define TFT_DC 10 -#define TFT_CS 8 -#define TFT_RST 9 - -// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC -ILI9341_due tft = ILI9341_due(TFT_CS, TFT_DC, TFT_RST); - -ILI9341_due_gText t1(&tft); -long Screenfill, - Text, - Lines, - HorizVertLines, - Rectanglesoutline, - Rectanglesfilled, - Circlesfilled, - Circlesoutline, - Trianglesoutline, - Trianglesfilled, - Roundedrectsoutline, - Roundedrectsfilled; - -void setup() { - - - Serial.begin(9600); - while (!Serial) ; // wait for Arduino Serial Monitor - Serial.println("ILI9341 Test!"); - - tft.begin(); - tft.setRotation(iliRotation270); - tft.fillScreen(ILI9341_BLUE); - t1.defineArea(30, 30, 26, 12, Arial_bold_14); - t1.selectFont(Arial_bold_14); - t1.setFontLetterSpacing(2); - t1.setFontColor(ILI9341_WHITE, ILI9341_BLUE); - -#if SPI_MODE_NORMAL - char mode[] = "SPI_MODE_NORMAL"; -#elif SPI_MODE_EXTENDED - char mode[] = "SPI_MODE_EXTENDED"; -#elif SPI_MODE_DMA - char mode[] = "SPI_MODE_DMA"; - -#endif - t1.drawString(mode, tft.width()/2 - t1.stringWidth(mode) / 2 - 30, 80); - - delay(3000); - tft.setRotation(iliRotation0); - // read diagnostics (optional but can help debug problems) - uint8_t x = tft.readcommand8(ILI9341_RDMODE); - Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDMADCTL); - Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDPIXFMT); - Serial.print("Pixel Format: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDIMGFMT); - Serial.print("Image Format: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDSELFDIAG); - Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX); - - Serial.println(F("Benchmark Time (microseconds)")); - - Serial.print(F("Screen fill ")); - unsigned long start = micros(); - Serial.println(Screenfill = testFillScreen()); - // delay(200); - - Serial.print(F("Text ")); - Serial.println(Text = testText()); - // delay(200); - - Serial.print(F("Lines ")); - Serial.println(Lines = testLines(ILI9341_CYAN)); - // delay(200); - - Serial.print(F("Horiz/Vert Lines ")); - Serial.println(HorizVertLines = testFastLines(ILI9341_RED, ILI9341_BLUE)); - // delay(200); - - Serial.print(F("Rectangles (outline) ")); - Serial.println(Rectanglesoutline = testRects(ILI9341_GREEN)); - // delay(200); - - Serial.print(F("Rectangles (filled) ")); - Serial.println(Rectanglesfilled = testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA)); - // delay(200); - - Serial.print(F("Circles (filled) ")); - Serial.println(Circlesfilled = testFilledCircles(10, ILI9341_MAGENTA)); - - Serial.print(F("Circles (outline) ")); - Serial.println(Circlesoutline = testCircles(10, ILI9341_WHITE)); - // delay(200); - - Serial.print(F("Triangles (outline) ")); - Serial.println(Trianglesoutline = testTriangles()); - // delay(200); - - Serial.print(F("Triangles (filled) ")); - Serial.println(Trianglesfilled = testFilledTriangles()); - // delay(200); - - Serial.print(F("Rounded rects (outline) ")); - Serial.println(Roundedrectsoutline = testRoundRects()); - // delay(200); - - Serial.print(F("Rounded rects (filled) ")); - Serial.println(Roundedrectsfilled = testFilledRoundRects()); - // delay(200); - - - Serial.println(F("Done!")); - - tft.fillScreen(ILI9341_BLUE); - tft.setRotation(iliRotation270); - t1.cursorToXY(45, 80); - t1.print("Total time: "); - t1.print((micros() - start)/1000); - t1.print(" ms"); - - delay(2000); - printStats(); - -} - -void printStats() -{ - tft.setRotation(iliRotation270); - tft.fillScreen(ILI9341_BLUE); - t1.cursorTo(0, 0); - t1.print("Screen fill "); t1.cursorTo(18); t1.print(Screenfill); - t1.cursorTo(0, 1); - t1.print("Text "); t1.cursorTo(18); t1.print(Text); - t1.cursorTo(0, 2); - t1.print("Lines "); t1.cursorTo(18); t1.print(Lines); - t1.cursorTo(0, 3); - t1.print("Horiz/Vert Lines "); t1.cursorTo(18); t1.print(HorizVertLines); - t1.cursorTo(0, 4); - t1.print("Rectangles (outline) "); t1.cursorTo(18); t1.print(Rectanglesoutline); - t1.cursorTo(0, 5); - t1.print("Rectangles (filled) "); t1.cursorTo(18); t1.print(Rectanglesfilled); - t1.cursorTo(0, 6); - t1.print("Circles (filled) "); t1.cursorTo(18); t1.print(Circlesfilled); - t1.cursorTo(0, 7); - t1.print("Circles (outline) "); t1.cursorTo(18); t1.print(Circlesoutline); - t1.cursorTo(0, 8); - t1.print("Triangles (outline) "); t1.cursorTo(18); t1.print(Trianglesoutline); - t1.cursorTo(0, 9); - t1.print("Triangles (filled) "); t1.cursorTo(18); t1.print(Trianglesfilled); - t1.cursorTo(0, 10); - t1.print("Rounded rects (outline) "); t1.cursorTo(18); t1.print(Roundedrectsoutline); - t1.cursorTo(0, 11); - t1.print("Rounded rects (filled) "); t1.cursorTo(18); t1.print(Roundedrectsfilled); - -} - -void loop(void) { - /*for(uint8_t rotation=0; rotation<4; rotation++) { - tft.setRotation(rotation); - testText(); - delay(1000); - }*/ -} - -unsigned long testFillScreen() { - unsigned long start = micros(); - tft.fillScreen(ILI9341_BLACK); - tft.fillScreen(ILI9341_RED); - tft.fillScreen(ILI9341_GREEN); - tft.fillScreen(ILI9341_BLUE); - tft.fillScreen(ILI9341_BLACK); - return micros() - start; -} - -unsigned long testText() { - tft.fillScreen(ILI9341_BLACK); - unsigned long start = micros(); - tft.setCursor(0, 0); - tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); - tft.println("Hello World!"); - tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2); - tft.println(1234.56); - tft.setTextColor(ILI9341_RED); tft.setTextSize(3); - tft.println(0xDEADBEEF, HEX); - tft.println(); - tft.setTextColor(ILI9341_GREEN); - tft.setTextSize(5); - tft.println("Groop"); - tft.setTextSize(2); - tft.println("I implore thee,"); - tft.setTextSize(1); - tft.println("my foonting turlingdromes."); - tft.println("And hooptiously drangle me"); - tft.println("with crinkly bindlewurdles,"); - tft.println("Or I will rend thee"); - tft.println("in the gobberwarts"); - tft.println("with my blurglecruncheon,"); - tft.println("see if I don't!"); - return micros() - start; -} - -unsigned long testLines(uint16_t color) { - unsigned long start, t; - int x1, y1, x2, y2, - w = tft.width(), - h = tft.height(); - - tft.fillScreen(ILI9341_BLACK); - - x1 = y1 = 0; - y2 = h - 1; - start = micros(); - for(x2=0; x20; i-=6) { - i2 = i / 2; - start = micros(); - tft.fillRect(cx-i2, cy-i2, i, i, color1); - t += micros() - start; - // Outlines are not included in timing results - tft.drawRect(cx-i2, cy-i2, i, i, color2); - } - - return t; -} - -unsigned long testFilledCircles(uint8_t radius, uint16_t color) { - unsigned long start; - int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; - - tft.fillScreen(ILI9341_BLACK); - start = micros(); - for(x=radius; x10; i-=5) { - start = micros(); - tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, - tft.color565(0, i, i)); - t += micros() - start; - tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, - tft.color565(i, i, 0)); - } - - return t; -} - -unsigned long testRoundRects() { - unsigned long start; - int w, i, i2, - cx = tft.width() / 2 - 1, - cy = tft.height() / 2 - 1; - - tft.fillScreen(ILI9341_BLACK); - w = min(tft.width(), tft.height()); - start = micros(); - for(i=0; i20; i-=6) { - i2 = i / 2; - tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0)); - } - - return micros() - start; -} diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/blacklab.565 b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/blacklab.565 deleted file mode 100644 index 3fc8152b3c01f21d777feb7ad204b469e39f7eea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153654 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 Hp#uLOJJl~J diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/blacklab.bmp b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/blacklab.bmp deleted file mode 100644 index b54b5ccef40fca4e7e90c874402bbe341564f524..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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 b3>YwAz<>b*1`HT5V8DO@0|pEjFfa`S1axU5 diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/giraffe.565 b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/giraffe.565 deleted file mode 100644 index 5f99b1f8b603342187e7a72758cc017d9a8716be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153654 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≷c+(|TFK%V1lHobh+@Cb< zt)-uzw5IcU%}^)I_X6HzD=wN)=)antl6_BAV@-UqO#Iss^vP;Ex)QV%BHW2Cs+ZH2 zy{*Oc81k?6T+a4RtRH^`nz?Bsxsh^;`EHio%a|kxkA^=-VKfJ19;lP%yE*H-o0A`- z&8OAou5&quw8k_qpY4BJYmZkh+Wxg!Hv5Z4V8h?`tM|R~z%0XGFK-oo@etda8Z{~7 zZ>i!-xV$9cB_DHFP^((dcdPuPd1&nu@;K+;_VhPN*M(xZavbUw6yZ-Hq`Zz!Fc_!( zHR@ma025k63vpbH)1mUwxB7Q~OikmBzFloq)(zP6_lV1SmAa#|>C)yicv%~{xK{YP zeCLc2*-2Pl>GYA~Z)$?U(im)EJd9;MtPjs3LF*CxZQywb>`eoG^^$+3J^OAvHsh>~ zzU$7LF=rgB4-c0Me-pc|F2AzrpPGIzoWw}6-@YXFfuupG3p7go ze}>-PxO?sI@Mq`k?`7`9lhufZV1SprBp+ROz5IHRXpM)r;~+7Hyp-&A7Kh4s13(W)ia`kmm$Lt^s08~%Y;HI;4-Rd z6i$HDGWs@;Slu`CHSp&v(-94AvdFT#Svds)3a3a0md13m8mW|hMVFA~2gb0+DBLyH z@VB-6t%2r&=Kk-O`j@SoF>(9|bw4m^5MQGMIZjn|37ji8sz{0 diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/giraffe.bmp b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/giraffe.bmp deleted file mode 100644 index 92f8e5d82c01233de71905c488b6f03e8855cf92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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�@oHcr6s=ZMQcV9o;l!B*qrb;iPa z#>ICP*WZ?ozYC~8XPkb}zOWl!O%;4_G-Y@;`P6*&sfE%D%jILwTc+RDjXlX7xRrGH zY~rC||MFhPyjH)m!|^Rg%8!kdG_~&yjdt=35S5f=NVM`}ayVlwy`XE0HDVMLn>MC0$D2`{otWSXRw@EA}+nFc=^+XF9n%uM^jRnW>+ z5|Sd3E|M%pIYv7cr5SV?hX_Ct356aIVLS;85~mf3gZ9{%Iz#C!oPk@YXc+OS(OHHD zz%Q&?fCe@;zzs!w`&oDr^%n#eW6q0o2sa^~FmnNL2859d5_w*rL)-~a!mGgS0|rhf z+_stF4CpU812~iOxO_D92^3?cGzJzWkm`-;*pqccHK9uvS4=xzS@!;=-S9}YU`FY{33=B# zLDK@g#M3I#r&QxkNI(UMZH1s&u~J}%gcH8oML!b^fN9bF$JN8nD8erlJG1tWuE&3P41Ev3@GEi@=J{@gUtCMN`ZMy}r?iQ+(nUxWZB#tm z%DMGd`S{1yrLS4TOTkU&_BNaiXuTTIeJlCoLdp0a*_Yqso_|z3{)#dFwqg3O#_^XW zC+_6*UC!+uIZ)g0lGWs%SD)I_Tin*0URLe4H&|U;my4HgHyb-tZa~5p;AQ3HWas9A z{4X0D+s>UkcJJ7+>$l%Qd4b>GckJNgr*YC`IQT?Z*f`ku1i%rNP|?;l)Q<~r8qRi` zsl*g8Vz|vO{K)^&--iwE02f5A@C>RUkudn#qY49|1UkS3JzOLg&mgvxa1(9CZV8gu z24~IVN37>WW-(lbB%-N|NRocwDkaLKf9Mn7g`!Q&96`7kphIgJ%;`FKuL=T4`a$HW z8%fnAqKeIs*=>gxk6{o1OCG-l)d1QoLj5xxxP#yo7}7u}n9z_*LV*M47Y@)1MpqY8 zNR$ap(8k6DVG2fqCkioni30?z(Cr0a;V#rorfs}!HiI0a<&1mqks&mVAJI0(yU-XW zfoLX-WbzT{GML#Q;<$l_3%ZQ~ZMRw^8R%tB;;bpRpagsKX z(#{ET-udwAVLrWJb~#&K?O;*MG)2!+8K-PM-5^#eOAaYBPI)_Rzk)sKokrP5)xw+A zBU`NtNA@0?^y^vJ+xyVx;Jka!bIU`kmdz`62bb+y7R;)~Z7VOD(a%`cT-VAQQOq5+ zs=Z-VGHhRaDRA&f;PIC^<9|h-{;+T8RoKw$qziwA4Zk#PxZ~0L*rMa5S>I>-<6pJ& z?kEQL3tN}VI>XY?<$}gJNn*MzT)=#hUpLV zi4S$NpW0^L)?ZzqAG=!IeLAtO*Dt3oxTqn!u_L3rE-JIw!NXrxPJxGCfSsF{n_q}m zKnSwE>|7AGVuL{R@9^h0ME5`c`Om+A-hcml*UsHsf?}LP(kvW2yC9S$A|@)Qq^YeD z?qk`P<~~*7wOk8nBa|mfp@;;N*fNtuP)|yBVNc{0TjDYP{)sJ(85~5?8&>9l2ohl& zB^c1aJsyxf-U#sGjpSZ(z;tzyLFx-&SCn%~62X8l7{-*Vi=2}6D&c@cs+pK$hm>7S zgd002-I8cCK8tin4#=a)8KywP@d6#xmiWA=xe&r4Ral_Kh%FEb5={JGDU>qAWO(dKJS0T;}>0l~?P4EO%0b7DLa1BC9a!iOG*$9lplLf9Z zY=x#ZCW)||1B;&#VVt7`Ct+|vWhdRD+Y9k7*qrat9cIhyCW~#au4&<0=(>;oWSpHb`DHiu&_emo}TLgv-nE0*a|J5GzFXe(&qj$cHwgFxq=p{ z+`9XANLa%=b_EO~#jI1rtl+gNLG02NT;fK&G8Rgfp_U2F7DeYR%C2c7539rs80TN~ zY??AJAG0aHW!pIC)cU~p*gK!T=X;O5aOqg}KJv)*$g1y=71xeMlj=#MnsJBL`Jkh# z(dYiio>?!LT}!_CJ!b4j`pvcUiM6(0`kh_(Iq}hZ=xf;dweZo6eP_N$j{c0kx|TP+UNpB>e*b6n!g|5@ z`^u?54?q0gGXE*}+$#O{>%)(}w>-6=o$*qXlxMt=K+2Nz-->d!m?w>4kY*Y z-_hay&wr5HfBg$L;CB}b5Ae$?0yUOAA`%kvN=m9K@m^-bIj*ziUhw`bm}B_QVjU0b zpuCy*v$e=3OmIMan3~9h4tT`s4r1$~hQda?W`a3-pwONylm}x1k=kt@DWCVQg7q)r22$5auOoFV~j zY8C_aP?-MSb0jDrIPzVH&LGn^-=V$K(u zVTBc;8}!;~j^R2>hgTzE&E#yE{cMTD-D2zUV(Sy}roq`Cx`ttQY$}YO{JbZ#I z?A(xLWMO3oM+=7iojZ4e6)mk|Y`ibSBBDgiIa0|w2wuG{V;?2yoGWCV!KUiFL(Ga* z&YfE$kVi9+U&B{G#f?MSj91P~Lf4aD#T6F3vQ6!wg|{;bXwa#{;A96K{PkS=od) zAY@JcjGfpByR^Rl%6j0HpB^I{PG{CVj<4Gter}vMrndj6h-1BsYrV$4ZW)h8Zrwy_ z*G68`GC}=3slAdPAVphhz1QQW?rND_De>LNW@+ea_{E0JtPn^BAGD(3vrkn zd~MwR!R_c*@4+tt7uI}Ee2u)g6$DcVFK?#Y*~ppxSvm)6TdieY`BXIirEvVu%2_D5 z`qcI8d)KSA?l(}2wN*B^2FtmpT>qSQ^<%-!_l39KRZM^Ce)@gj!TZ*+`HG|GOWS&j z8xKXM=Y}O`_$6d|h9&8m*@{a_@$m7paf0Q{&Bnp8YsXHCSrA+x_jmX|r1#(d`PaYT z06sy17AG&1X+g~^pQNg;qL$u%Ho2r4{D%h1Edy9r!Z!PhAy#_w@*^2!X6PL zN(vkSeZVi)MZ+uMVbvvQG@y#K!d(a*SlWOjTFB%Kl8DTr zZX&$EEbakGVlbn}if=%}Ffu|)y%`PLBglv|2A{DLbb*1^#cIMY&iAJ%cAO=edyio^ z%dnef*xxO-x}I-#A;qjQz`)K>9Ts^A(vgU_kd>1XXJLmipB09E$X3934;~hb{w!cf z^9pI&1!#E0NEkTF7`Z9fgebYECA?)>Y#4!h-^fcTxgeh;YE|eYx;$kbxUq*J#@+srI`t#==C`bc^_s^U#jxbmz4fH2&5-L`epmkXzy53Q z#Z9ZjFXfUi$fsRWj616o+^-ZqBtX2rWD{S*Uw#eBN7QZLh7 z+l2R>RL;4joN`G%`3jFmkC@*OE$F0l{B;bWKC>Bd z3FQMmuB;Q=iyaVqB{a!Hnl`;LJWb#YZgP(Pe*V|seYqB?+;4KW(U-qAS7k}k* z%!QAUXWmAheH(xNb@}99_4hsvJpbNv_gVe<@ya8oiyPbWDr$ox6WsPiT6hK<*?UPU zstF5=aPsi7a`1rXyL0C*MD}0*{taj)f{VI9ASBHrL{rc;_I9*v ziLsufyDipxJVaXE0X^K1L|~aHBV1zQj0_S;sc;r}wIs^}XrMY{y~lPT7A2a{9(%wI z3MMHfCG}XL2s0Ez3mGVrxxttyR!ho6;$3lQE7WqUhz?EdX{h;#1Tu>;D0pl(l8QD4Q< zPsYSY#Xd~QHdx6mK_#d}%qfFQFN{rnAE#CruYQ!!o>*by2wu&-oYLkyd1Q9;NU#Vf zv56b;$l3{Lc}eT}%A1F1ht}!kU)L|bsatSGIq|Gi#DHY@QKRB(re#-jO2>4orj@fV zn=~$kUt3R{-pZNV$XeJce+KW7|JD9xtKrqJ?B&hm#s3#P{1AtSkThELcp|`*C0pA|ETD`Q&OSF zR8lWWgbZ?8R4ZoOQZJvE&Au&HIHy{-5wKe8EqX)EgL z&s10;cI;dJ-SxuRp9NEECHL1#SJ(6B)^n#mrQQ0FHU3xn*kAFN{)DADVlI6QJM%8` z{D;`{?+R~!Y+m{@^z`$gv4zUPk*xZ|8I0P9j9eS<08MjyRecK?B`skIY2X(_&1_t( zY@9oHvHa)XzfsKo`~Um@VEYGTz!wJA-E5q{?_$}>!on>iYT)J*5FW|cZ+$5r)-Ci{ z0Z1|IjPn7J&|2?@wdnQ|TFIUqgSLWojWdPuBe79Y&M2c7e*CDg*aP8u8)`~Aw@HV_ zD8#UbP6$)Pu_YhzBwQu2XqYsCW;r>Jdn|+|v;N7LKw83V3$)wGRSdMn2E2A zvk@^#L;y#zhTe$gu7dPq_zRzo?WrE9+Z%nr`K6-Gpu7-;20Za2VVTld#FmtEAiNcj zvOzILokeX0V3Btcsiv?+KNmF`t!PXb0j)%NN%$Hy6gI>h&y!Bj62@cT5u?)xDb{GA zQB79efsdfJ&<_?`FA#T_6lmed03ocIGN-9hhiSU~48!qmiTzlX#rZ^|-XOJ1dpUO< z1$8B580z_0c6qAONor@b#|TcbgS*{#?af1;dh%y{`l4UW-E6E^moI${e^hcaX!~Zv4}xo?@n&ZYF_(B zLHAA`n|eOGI+|;|xh>}h#z+4X10`8D^Uj{&FGU5~8=o!gAO@-zCJ0I{Ag@TR6z7>5I##h)78D3kve`@PS1P&dY9AHmG_2 z9qeatV88|5x$`%SU4j1#8=Qu!N;U{sK^qnhE+IK3d!K;JFt;-q_EY7q_kmWBNI()i zS@eHl0UWf7@gry)`FX=t_?;tDD9{81qM_J^x)(!LD8z6E8WS`K&Unm>EHOzZD^4Sl z6u;Ds6hzEuFsdq{n2ZV75^ZwG6tALO!W?`^JYk&`uK&ZN63t_RHd?}zk^Fz=3F3Fa z6flk(|1-`B)Oenl;%KqMUja}BgwcKm7ntOXz#T@BWlAtOzZA|O)5s}I$3wdsPFC3B zD}zyL(YGZq;-Yqd6;W`2ByLn{Tg|ykl z%-Cg}IF!8w)cyFB9fee#WL)zN3&-4#y!7gP>ectkvU%00_P%4s6WFvXX0*%iDwp2T zshPKGdlYi^eZ|6$;XnSK{P_3CyT7|$|D7#l%s~jH~*E*Np0y zC9@!X{L;MrjZyWgZtZiqk|&xC|F!7((`Deh|LHZK)9V3eHuqiFh`hR$bbB-N-g?pE zWx6hY9nW-{tMFK?c87p7=r4#b z{Ce-#`>o(FoEcjNHsP4S3v?r!kN+prM1_gk0+^&3;g`uc$R%!sS>Tr#%m6GNU?2;{ zktjHmbg+jJe9Y#6GU5{nkBB+p7oHAhfLUY{_N3O4%tFG!gc*!NsF8Fun}K2?-;`=I zpF;IUykinTL)c-UfV-%AEocUzDgc&1N{KIU3TNyfuS!%H^F#z#oTdbqNR2e`3)qsV zGN>?4Qus%aF%m^|8Rs=nT;oR!a6vN)aKMvXLaBv~Fbj4#YAe|T;8;ru;{cw44I%`jGd4G)2@CJsfxj2zQPwk+W>XKlP*z{Pxa$Y9mx@yG} z$=pSq`WJ>RZ|r(M`Hrjwp8T~&hC+_-u6dBhXh3tJ-Wm2g zcSBBqgO?^Msb^{w5RqQfI8c){RR!z1`z%y>!iz*#>-R1-1}!!P-3J6fh{1S<><`lt z#tFX=p`tdp3V;CDXa-Xf3}=8xpb}Tc1IAH&p$!JXh#`&a5LBU0ra)7a5t_&)w5W+E zOKzv)W0+q)C(%o&uy3!6gON04$-B8Y`G~H9VaPN5cVb*apV| z93LS4M12R;W&GOEErHY)#FrS-z$`kmlt)ak#mp}N4sr}7l)yEyjWHYzSBXr6Y7@5? zV^#!k;`~C&7|%nJh*D(SZ{rNj5J?hYMzJOVfg zM1$9CKT~QmmSsMCK%3zt=b$1e#tXj;PMD(4!NI{#6B7`XVd3P1sOG=_^&2?35NHOU z7j+haBj-aGvCHJu4P%va-bvGA5!Bqxr@|(v%qpnPDq_GUY00hVDxk5KUwfZ`h7V2M zP0TP@-X%@dugomtm{04h$H7_qn%nkuGZqbtRtHz?I$v5He&pEw)V1%0*Wlazr~le} zUjAj}*dbA$W?{E#K0CUgM!A4F zHi>{P3BMNk)GOi%SMiqS;?ni$0MV~h2;~1e9}rf zj^4`dk^VLPNrSiZFR!MZo{#RI$iMugaO_RX{U2?M9}~K+1XlL?=F}PcL@1d!N~s%( z$ZH6R%Zp0NOGqp73keH~h=_=a@$vHmzgW3}wlq8Zd%(X6{L|pS4O-Kf*W;H`P_lBe ziq6bGdF|w#rCU9<_Zq@sQOY@3QKvC%p)q2iIsASDEO6%m+V`jy38jKj#6m_G;pa_+ z7*M6aL|sNTM2!ZxfM3|7;38WS2mS<~JNL8&EN7#1@TkYH)!4Y9lNq1dk*A z)OjzI*+U8#N;u}xPTtmBWD|(SL=s#=(;6dGsKuC0LZ6p8g#pcMw6x(Wn89!rjb!2} zQz0zMeuncPtS|zgy-hS1eO`2XVUOC4_AoK0kzXRX7_b7_1&0@!VWb*{0;1Pg$U!6< z^!HAo#i?lRd>bh{c|JKo4j9W>ASDE`Wj1zBeo?T#*tmGWse*(e6i0nsY_nE=bX z*>-~jaB{PA^TCFTxA4-~I3YC3$;Bfiu4$nkoM#wU1+#+{e2Vx?4~RRb%LbM!@2gS| ztC#aBgLNah^~1PSJz1q}*rhDl#ZB164B12tSVi}+OIff>+wiD(2&s9|)O|$t{Y5n# z_!Vq;Rovl?+v0X9LVF_k_r%EiRO@Gs*wo*%YnV5zo;Ix4+i4h?DA>7tG5i!BiG> zYS1mbEfRc8D{o9a7eZ&Jw6f3Zl-)L|n{#M;s8u?v%9xkRxE7>`bDej(6C|*J#ag(#ySux)Td)N81a}Pt5-cP@a6*6> zaU+I?Sf|rI(mi|T?U_Ai&dlDQ&i{Uj^nOpS=c=hy^;E4j>HO+{+jG~IUyg75SIzFf zI^X|S^V2_v_TJPF&OIu@N8yCHv>g6sy^9BBs;? zFDY`n7g0>=Nk}q&v1NFY?848*6M&0WG1+CPQsjyocsNjg88bOA81^vP$!u_dlM75B zGa<%yk9NrLW)3n*HUi^Yt-d#k?CO0qY}NUwct@a5t2{tg2C ze{D4ubIjA^8dUWmAc_c0A0o_2twwl`15SEwH# zXB47hlc4PsC9UJZH;qto$x-tzkh4ovaY^NyM=HAKss~q_W)7GaUr>+hRq#Bm8riFp zHli8RtsB>m_8olBMupHm<(NUeylI`xafQ%MxuCQBuraytaY68)QuK&c>b!EowD$1@ z-JDs?#9`gyRqgz%x&>FQ8#WvoAGvfq)jB?f7a^h9yLQb3i?&_erftKPw>s^g47z^A zO9=xee+iraHTl;6d;I=Cv+w;o?+JCdDq7qQt~hTKS0-=lA&%Uuq|7lXS>Vf8Ru`xl z>3GN6W;G`DFBLDm$Y0nhy!xhf^G}z*`TN3m|Jm{6hqgN(tLHY;yDx`T4~3NWxFnZZ z1g07}ho~9bD{C65X&J~XDhUKaX}*9biwCAqN>(184AvDXs%dKI>Kj;CIR%82_YW_; z*xmorUk-lx`<1VM+5gKwU;p^atEskwzJ%@0i0xk3%*pRym%_2-;6ezi2mhXdBoe!n z+r=O@NlA%u;(`ojw$CoXG(f?OXBNTcbdaWT0?n*z1{6$jx)s}JJM89cCghtWp1fe% zp(g-~IdkgCWR#v8Y!2g*=D-YwmrdAm$04H_EPZ@vD&xY#OfmWOv}B18#uw2VNx0ki z*#s}UKivehQZTBO$|gBNQ9=pBn7P1|4klZgAl0cp<^m>5kdY0E!7NOC&K- zhF#6&f3fAxav(E=$u)-H!e9oZWMh*Y(|q!CnIglFCVq)lGNf6V7UP#}YIMHX3(_@(0tsU8<5m2Mz zRw!qiE@P2M!zh+#6f2<@#nX@C8AeL#2MbNY<;)@!tP`}H6IHFzY$sOB_k?ypp_*s5 ziqA7MiDjMa1>3p} z?W`Hq{59>04b7UzM$OxX4KFn+UKsa$Ytj3?*Z42NQ~!~${;zbbT)6-5jJy9`^!&dI zH@@+!7#8Z-i}7T|BxUh5JI0e0=gIN}N_+)X1p_F@v8{OPaDAOHC6-~Rdb z+aI4_Y})Qlc-a}X2jvB=@Njz~5Qu)=6S?0Nd(e%JSVR!LtbsYdz!v|u;p7s|Or427 z+F`0nz!H@dvtr6i%1HBZkV!Tp8Xp2S?D-mb{ z+1rd(^sfezwEW@FY-Z%rieM7xGf`}16FWtZ5mw;wIdTQ{r^SP$zclE1!qyRE8Zis~ zC4Rjam~e85Wh@F{JB(kVl?Dq_b5vr2}*gdR#Z zKBCz>$u|w=@RET|E-)-)N*RM+pbGZcM|KKlVO>LoX^<$l`9Ev$xO&p2%w1JOK-G{a zsDgdWLRMdZTnQQcJCs6hf~tCc8-z0bp+Z~YnsOEhVSOob?1;F`5fKDJC3!+Mb!%V! z;2h(KVm;qC9Fd;en2g{PdT_vJ*-nHq+2O$kmozVkGLosI4B=5APgQ- zPr6`Kw4#x=U{ihDx#O8f|BiL@6P=0;gUSu#(lx9p)~md$Rd!n`cU7n1g?iOP?b;pP z<~L4fJ_SzyDR>&ilYfm}`)BO+eZtLG~mlaZH@ zm4iPbZ{lbimg!#Bn>}$mf9hf7>VDnB-=Eq2TgS^^TVDM?-P?cbdj3n*%Ilb(HR}_D znn5MXu9-^CDQXTeI<7IAt`WMoATlWF zcvf{|=lt60>rY$1{B7~=@0Y&%)4N~)vHQ(WkLQOUoGp8HCV#I#<8^QHepm8-H@0zz zXuau)2GK0fOXe{NF$`3ql{)I+20RN>DaJGq$|)a&A8Y%!V5#96vC zE@8aGcxDkf>RSIlCNw=Oz%M;CxQY%=RRJT}%y4ySIS;I8GKM)7hR*J_d7?%OM_8De z0A!~)X1RT&VhK;S-k3y;g9I8o=yFL%$d=}cKz3SvHf!B4XPPJ5$ms}0B}7HQAv|2D>k*NoD7BT8 z5hA$x1%gPZ)kD(-3*uIX0X)<6ANxAMMm;|tx>PmG&h>DIk4ZF_Is_qFfnw+{UuT!+66nE6ZK z(m$fE{X2T?Um4f_lDquIDx*Qk%AK#KFVM4+RMM7F)RK}@m4yB(>!@0IYI?-F7j6Hj|o@rZe>*{CMZmts~>UPP0~v}Ry({Nf-%%0!v9 z;vtI~OAFsJW=TU?fd?%>fZ0rVVgel`@ns*GvrIlOI|6LkB_zkh{%4OkV5`mNMWe@h zu|rd!rjrJ|HK;HmRWOdfzyd+E2M3Sf8Ju!|0Pp8r`d_Y8{&!!B9ub4_jJjN&7_Ca; zNysP&wXN}1ZWU{Pfxe5nLyU2Fu~B%bj{iyB&s+5sYp_98+{ z5uw!)p_QnTv$(3Kh_b7Qio1k%fU;$jO=zy3cczj}q`YOAym>IX2FMzE^9_7t&BK%( z<8^$qP;PA)S!t5m=~_DOUN>u1Hf>R{;MsL2bojY*`-WNdnnC$0FSu9SsZ9_(!H>SA zdGdyF%|nl_mo{||QTD7?d{y)KigMIB)$l>(xCzzc^9B{S6*Cu1>z-OPzECfJVAgeD z-TT3`{jGWXp7Xh{jN9M2PyQUV^pB9$f5%+^@5rUUWUTyLu4((lpSJ(mZ9=y{<8Y+d>uO_b59iue`O1A1yc_dn?NONe-(3YHA{bW z>>Il&=-UgmEtT}Gt%Bl`ng+^7m%DD@WutGVu0Nc)bO|p-y53XqpgsR_N5-q}v>lku zo#Ag0D<*^qJ%9}|#)JH;Gln#nv_X3c)+C!E1J21S^0kkf7oe37rs6q7LI;N_4cc-e0NxxcxzG?|lc zCh=e#KZCQtIbCKG=swuNSyI(zUkny}rnR)RoR)lEE{a7_XuQjh9A2i#ScSxiHQ~$+ z;*?p}*upA4{D{QUZ+T%_y9Dv2q!JZj;{Gs|DNeNq=#K z`O6f7=E7WuIVOrxw*|o$eq7@+pKhFOCubmcOcDT7*7tWzhM}n9NH0Qff5VoEESvyu~Rb9b24!=dKHg6`rr7U+4VZJXI}Hrtmdw6!7Y>0+a|@= zbqZHBif(CF+%;|3luwya$XJrkzA2lwu2;Y9F!a&&+&5OeA1u%P;CSKJ(51hJE&m!Z z|Ci89AF~!egm*349wR3ciHJj!Hk)1^!zq|77umN9(OP=S%Jtf8CG z$W5T{*SD89a#pkPS21;0G;omBvJj{nVQ5;pJ4B?Xb&S?e z-{=^*d~WdU{80DWK;ym6f@fXHJ3UEnQMu6@cF-OAwk!NiSIhyD!W^(vNJ%jz49=*2 z*8_4xu*G~vI)H`b0YFS3NSW+{U#80>soV}}CDTM4f&a^(X7jm^G>z#XU_6Xmk@roa z`H{lcB$s4GlkH9JF!nK%2h|80n2_B{cIekTrf`I z4tSn04cQwUyp5W++;ljdf$K*vE0&ch|5vG5k~z9z>RHZydSux0Ic$n9lK zXi*o9ATym}!pf0L(PmJIEjhoG>Sb0mMV0XoK(vY?(oAO|uihxN!a9BEEUar68|H;3uCYe?`Q!C099Gny?@prn$BDE2wC84?Tw8g4T5 zSwu_%nP030#vHVGkd;#r$}369U|p&-E7nq$;44cC)umKT`P%kEBM$}ZP-UkCfpx5; zafG;Gn50Fb1lnY21%0XL{H4(D3u(h6k{U;3jgH9K9#wWdqT(g46Q=Hx;g;JLST`C_ ze<`$mDYkFft^AyS{e(?kk5|pbfR?$$p&RLAcXKA6WsPrEUjIIS^}F)hzf?c|wfW7z zPvOP)d;h9_@y~*dKWDE0!M1ZtKIfKF-W~g{1E2mk@l!vBj(zk#^Tv1Ry;Ij4)#F#u z&RwTuL#6PRX6a4UqE(H&b(Nw!3b}VQD_--FK248WeqH{DVDo$&{7gu5wzMQ!UiJtfvCBF)_1 z@DDvOp2-nrDPyYl;7n)|SuW*7az==;!R>I=Amc;t6lOHx2$NKN1!v_l9VCzsF=RF~ zrHu~fv*Yw#*dgReiy7VQy@#CClBo=$aR*j1eRv6XL-Kant!RhHWr_^Ixy&-+R|s2y zL;`jfxg?TZgq@k$-0H=AVdy4>p!Zs+a+2+{ep#*FtoJ)ADj~icr$8RjX?UqD?gYpA z(CsCJS)7V2YBH+PJ)^@H&>gnbYNfZX5WI(j^_0dwE$v6Z3iE+5!tN^iV=!E&Bs=nicsVK#c?w^)*DT6$Ub!7!o{L1X`t0 zp(`h^q^z!@tgfi2OcKn41S_Faw4|)6q=JErwu8Jmy0|B(dSQU{8qiQ~1D!BfRZ}Ek+!IwhoFBRO6sCXYy^FOK;s^XHHd1keA{(0&0PR)&v)f*p? zd8xYjp?LL8@!Ffp+ut-k{X@sgKlkqbwdKhlnz#Pm^yZ&cyJ)5UUyX0@HqU>R@BX{^ z;a^&}{+8sNX!ELXChu?*azj11N;nMxeylK<9YhR<{zCqnHvxXO1 zB^yfFS5)(_Yn9$t%(;&Evw8cLS>0o&{sWKE@2qvto)QrTxGQ_1X^aYT4q8$dpR>-O_w-_l(O{Zk@~LlZ4Hg1 z%~k7dg^xQkw!1-V^g(aLL3a$|S0EQM`u7eWloDb@ z6YNxT#Q{$Av2i$!K!$ZqUya-1ZU}r)?27@*?t`x*Z0Y{EA;&(cGdab0G$DQtF!!5( zGob-2)(?`xQeKIo&^SV_F?H8D^oUv48V+PS!fHH-cR-3r7XummQnVQ{XP}LJ07#}a z8)QYJY3*Kz7hB*@acQ;?3Gi|)^2pmofQxn6!c3~Vq-Zu5;5y6^!-VFlI9Mrl8_KjO z9E}Ti+WlU%c;2ga8BDcwwl(m{@jK={fiUyxF_;hP33J14387Z^mJ(he?D_b*ZLEtPdT zam+MbL_hwBM(F=i_Whlb#}|rjN0i-;Dtm|!zkWy51Eoz9Q#+SWU3+_KewSxc0ta`CZ!b58;zPMNjO}B1D%@Nww=%PYwp;zJ+)}K@7(*srT3**-y_$yb&tlC=&_fX z%kQ)1cM~r>h#I^eKXN;AXv3#-&8Bt=-LP#>b~+XHgtkm34ByRP`GB8Yy!I)y?_uot ze%#nj^tl&a^;gxS+ZDn()S@~RJPXwWE7U@36nsn6f~s{QYxJUPG<@^q;QQMIE83wx z%~NRNC9CJe*S1l%@Rc+7RIv6_F!vD{I`Q@GdFp1;8fJVwM>N^CPOJ<)*_>T;s;<0Z zq_$+O`NWg1tXJq+*A=zX9rn5hwH%OC{M&|O3tyF_mPjP~nfbG%rxe$sL@?tE_AUP9 z(>_YJ7|uix^ILJBLw^}h1L!zW$&fq*lbB_b8FAbLf#a89MbLpka$OH01(+Zj-^d;g z9Oj2?;?8uIV8@e(GnjFNz@%paF-xVAP-m`Sl72I%!koR$K7x9DDRJ5YX1yW72r>g$ zuCEj!%z;cS!%jxC8bFFlEkvQA(GXc$jzmXju;4RQP2&g`=^}gh^F9}G;^Y-lj+KMZ zP~RPx%ET#NAkHZ%CJ=*!IYqGud`x4ajQP|}8uL+9dFUN?QaL3+hJg)uaV^TUU;yCx z09*QQec*|VL<8p_p|Uy(I*=dwO^C7P1qB`mYN6O|I=WONy&_GlwY9A2jqP<_lgPr~ZNG4mV| zqvWFoiK6<^M>YLL)xAa3JVjJI(Yx}fx}UCpN!#sjJD&gP^ppQ6xbx?n)t^!qze%3` z5HY;v*1YCabIB~TRVVO-ibJ@JzJrXeoxs3eRM|*O(GbPeq6&se*5O8BMZvWfk54{2 zx%w$>`43SSzYjk5A!hV#)cD89i$D0E-FIx;G^)B|UVq=R{VuR4fm!Mul8%v6Wdv<-yFa4RmS{&($sdu z@T1V72f>36Ji4#BH_dqB{W49L6VGkrUwM1#*{`P_{E{%d8QSwWc62Xp_(jN>r>;%6 zbTiLuA0IKu9Z?Cb)9@}-4?C?M(V!L8s1;eK9a&=#S8o_qrQ((-XB(_w9U^1mrD)|R zqiHSBcTh6(5t@4nj6H;=Uh)sn<#3~HFRd#igqgZ=>EOc@47}2)v zRr3I*k<_i^gG6E^S z92P#HE=x+Fbd0Ykqo^a)ca^sYRCG>N^DR>eJgpVks1w_%8s4T6)vg-WD(z7t<5F|X zszAgfOVlDy+#>IoNrIS`-w{Py)JT7!;P|DQ2i~CMUvgpW?XM%B{?WGkx7y8Ls~-O) z_u6;PZC6!7t7XgsWwb1$4d?#6-2v z6)xt#Ji8ydHr>=O zTJr9HX;rt1UR!3Tt{Rn0>z^2Nt)F+Qp9?v2BdqUcaNlj%&ne5_r7VAww)`>T;%?-` zZt(E4z`+L*V~-<;@5PKf2tIo!;@rcM`+vexDOeHd7q+6#K2Mx@9X0USrTLas>s_Og z1)bzR&4fOs@OItUMy-fClkBsO)lYf=6iKmmZE2>YN7_Q8_+L-a6HF2vw zcDFn7peN!T3qFGsMll1K$s&mw2I(eoM1xtIFgWQr2HtVT6;3nCAgs6qcyjq-l3gaO zY=`6VP)VVKG?SuI1SxKXIiQbIaNxno%p{{7lW_@P$8TU0*bZl_)0RsLQ^1N8 zoSqw$J7y0Dj?ly7EG@;AVBr!DVLG+n?6u!a5=;prXe(5hOlablq?XdYR2_`~H3hYp zq#{*B`Clf-EXD=RB_XCkVQNl)xri2?3`h_Yw#@BC%_NLuT6#b(FcD3Pi6h(=$Cu`IHjNsC!(39c^Nhgpsmlw1ot|E;!=t+pWaoFqABVXocIfbF*6ftp;0jArAw zDh=OcSz|jM+CR%HL30tvf&^oW_72CSg(wc>@s*??xM+1KqX29rW#nj!H+aaaqxqqX zhJ~DokD_&$l6{h_O)}pmP1+_+!LyX_QY>&QRq#12@T}q4l}Op}IbUkrzyX)8g)UNirV+(ekSXD1M)~?#ruG%$Sv#eRPs9Z2CnzksP zH7%QQtXptyTK4N&k2-rNe(Y)NrQNiZACi$mTKW_@`8w+2>p}Ay0X4Lp*)Y$Wc zx%cTy-xS~bOEY?2-TJ;{>8pg1t@sOXy_)Z6XIwNaU$tz!W0*6c9o?#*F{G0=s2SB| zT5vJ6=Y~()if6-IOy7!c{bX3%tb5s@eL=5rN`t&xl7fAxz$O&fD%i%zJ0+?5pU{o1 zHBRf)h^W>Guh0xD(~GLJj&BZ0sVYBFbha%2N?qoo_T;V3xP7YGhN>Sw=n9zhO zdBMaTgOv6eYwQTbi`m9Zf59F3#f)o`Hk!sB0^|!5J~+auC(%S2M^6AYa8G8gbAaQE zm_^N8VB(a?B@AGaPIg;bg~VhO_oS~NjpnGN3+W(J?T^q_D$JljH10!oI4);5!SW@@ zF3m)ct)Ko+(IW!CiWvj=7Ff>ER=`U^X3|{H2Nhs}2{gr~ST2bKx&xPR_A}%aelaDInDdMI zkmEpfs^r4XbUD&SpHsj)twGzZpeuXq7;fhlb(u8hm9Vfv%05 zsfUb#yR@FGq_(SsUXYkxkc4rJlzEDTS(3D6I^Q}|(jr5`JdRzI#jy6eB4^4=sU-Td&;qA)iNf{8}FOe-7zefRFB0%k8X|FcAJX1 zxbqLvFFx~aSqSS|Nf_El8@`n`xSBAq8r(ADP;|y9rcyKbqyigT5C(IhO0_e>T@2nrabG2-|C3l?TOp(jydR}u=6{z zqJbE7;rP%UN#$51%~WGaUM*Z*&j0;v*1jVQQCi9HB>4sr*wSQjKN+yBxfaY__K_Xr z#FRZNIH*5gj+WGypst{u(O#_sAlg((qw-$ipRv7iR%A8Q2tm28_TBl1d*r zND*Nsg=MWdC`d&JV@p(0%@tL2AXG)G71$uzh1w!;jaLSfc?`KEW;tLvwIxfNE+GS( z6Io^_Q|6Zq!XJbZzt}-*XvRLi5kegBvc+es#do{Kf2S>Qqba%aRI6Qnw^?qVV{yN2 zevf^2dq_!lKtY>BM!iYkaXp7X6@6>uEchDcLR~vqZEL=ctw7IKO4CfJ>ma3R$wQ13 zky1lfDNQ>GWpi<5YcUmjF%9>l8onrU7B>i&G(wgnLBb?f!Z`YvK?K^oi>Y~vYk7-l zB7Wr{s_Kd%rs;D;Gf+%FM#>@$t+bpny33|t4WMl4(a#}+57i>8BsHBRla+Ms9Uo*y=Ga*#_83l3wu$c zFCvFGlP)~ToZrt``4~C%K5Fj!$m#cC7Y+i>Z+Z1UcImtoGxIKb{$t|RpORPqkg@vH z$@L#jE`3Oz*h`0jJ^0k4=Sj%uJMW$s8i{AsV$W(8Uol3HpzdcD<#T4a1NyNorpJd9 zN1tR&zRa9{8G7c1YvV%d$o>4;XW19;r;pxF9K06Mx!`eX%&TGAw+XLZo($?(@@$;< zXkLmQyqz}s@c87jqRGw5^XqMWD~kAvm^3C%xq)m1rfC__KhL7ua$@c(xvo(k z@IochL^6yCJDIcDjebX#@@`XX|8>07ujV(BVIG>#LYcxbQ?7UmO=oVQD) z(Q_cYYHp6szZ+3!&{ zi1zGG#b^ABdwfo`*d~=3`6cQ)1S$ep9Xq&Mie`Q)mH`T;$WeO88@tP!_{ti%^YtC1 z)XXJSO~e%qjwzXnD_Mvr+Z@)^8_*d5cIXRAo`eIq@G{7S!|<{=SiKA%HwBmSFC>>G4fbDv4yASC8?+{ z4xd*}i>GNPW#BDs9C%FEM^e{^r{{Z2+e1RzT|&!6*4Rfo@T5s*mwpCTHP&kSozxC2 zHi)jb&L1*8F=SUgX>;nbb?vfw-I`V14Wo)HhULq8Raf*Ym$gdf4eQoynl{WEZaH?~ ztuC9%m%oae*iM^$lQp-Owe&u1?rp^6yU5EQW2WB*4{rsZ#cLxr{Q4h6UVb07_(RO{ zAClJoaPsP>inVXjF6_pSzsA<5^R8vxHUBd&z5AXUmMsbco0VhF>z%q8GV&S~9quhR zO>@Wej}QB|ujenmsl4@F*^O^P2k*rVKgwHpjV1rtv)g%dTSW`6GB4au7`l~o{&wbt z2N@Ha>6c!nPCSbqxS4$JPTtsqiVL?}$FBCC9i8fJyWLy)yeDhF8|xP$-$7VORl}L_ z48bLA4|-xSu>ZC%9F{Q2CA|>|DA9_34qg!P*;;0tGNL(QW&Be7icMgyD}|MC2Xdu> zE$#GiJ};MLCdH)Z0GMSxb{M%FaU66U@}Q3_UZ$9I9JI2ppad=nD*;P95~n1)9HAt# zGyxWPPYiA8yKsuQrt%Nm6BnL|+@Y{DNieKv$ScE^(nb{5Vq2194ri7~B4d~`ztCA? zoB_);my1F(FPPjPUh$;BYh^CwoflR`E zm_K5HEF46r3a&1&ZAI~w|8A@Q4h?$Fz<$Qg7WK08xp^wAuc9EhxXV7T*SVn2xv~yd6_x)K4tD>+|-+- z+4pJlZ&GIul4svVT!hcN8-H;x^85>jrZu-8QBCz*?L+zTysWpejJFY!Xk&seL8IkvI(9fQ5>wS_i^)Ye!Q`pE})W{ZE)2Cj1 zS+V|2{lj01uYVVL?qU4MX4&dD1uGv;EFGL&ew#J3m34Uw0*#R{_9SZPe)iN>{Q3LA zZ7U%S)48n^-96_=TU!=dN^W-KJ?=Wb)swc@oAA0P28)k~Vl4jciFn-;^}0Lmbq`h{ z#ei98E-m1tax7TUpqR6+8B?6>GC8ADSgOFXNVp1}c0ec;oMen@s2I| zwkTQ#YYax((m^T$`E15BS_wu*C{&o{kWbB!Bt69?w4R8LGjA7LR#+7Qdz&dN&7`Nz z=lm~wRuI4F>G6)c57XjZ1eT${B(mrN4O7_%`vfno3qD+$1QkAXV;REmjt{s3OJbP? zrpRXISZ1P3ZZA8|tq5)h@4rn0o(xiIy$&8hD6Yj0)EOae*vzE42zDVB4We1tim+uV zU}6?TGdZT4P=N>8)l}Mn0dpERgh}wK*>AJaZ=)glY}JX#oYN)|QB@aFrozYc!l1%JhkSYG6AB*1Dn8}P-lg)+ zxp*(IVPu_7c$KBR@NS&frg?doEVQfq0$b;~Kn>K|*^6tq}ogiicild~><78}7rOackGCMWHYm|d3hct<03Lg3#j8`v%D(o4H}2hfJz?l^(!_4+{MQ*v-()O) zeSG0v^5kyH%$wNJmx28c{Cn@YG_AR|UH3opFl^!={1O!TL++Jtj!zxL4Q__@J@#t5 z=h=SOyyA*k*`iMNv~K>qQ~M)#^r#=$GCeV+mONlvb2VmcKlb9=xT%j>3!k!Q-uSnz zrHpTuT>HLsgJqk zXIv{Tgp>~!G!AyRw$8Rx+-c8w(w?~467#Gr@>N^pc6&6&ZddGHXY_toG&#aO(NtRn zREbt@RWE5M@FWTtk{p$o#<2hqS`xqy#?a5#vGzGD#};5WqAXp~=iW$MOWsB*00aX&O>X zX(!Q1S20Lz&G_hW#ARxYIrRGDdwtP_nx{pFY?i<EsmUqZe^(j;F#p;H9HJ>ugpc|QuXVwCO9sb>OwzjDGMZBI>uSnt zM_X#w+KZm`WbgJSlZD(J@wzMgbw}tyCyJkG{VzGZ6pp5>?wjstECeQVx-W($c|Y?D z8KoXs1TwQ-=_B?57tCg|u6yyOUD`5QSp=Jfq)2~RXIk<@4=q^GdWbpB9)d~Natspe zfDs5IN`?vV`?-74Ov0QEIK}vg+6?lk8Jp~K7N=s`jcI_C8Q!=p-I?*rK*qIXPIC_d z#GgHPSk1;>izg7?A#%M~L>eA32ImD+ktByORcK%i#ke4~$SX0wm{n)7I!po__A{*% zrtlZ(GDV^YPhyr*MWn^F&){YJG7lGXDE>?c;}kC8_94eW9{Nj)%(=j9OJOT2+hB$? zi7yQ44*#u|fF})+w_9^&d%6bt$2$iumbDIh#^*U;a^x2#G#|QX6l``%n3O?oX9wkDTJSp=SY2#2C zlRzm0KV|Pim5@rD(n;*FE*#ZP>#;dK6E<`|YV29W*o&a^FXN`ab~^J)yJS@<<_ym! z(;&WAC$h=EYASQ+UiSHWxg+=DI+yZB?iF0#D_{TV&GoK4HUxXWKBFa9BZ_6NVd7X}5hD$zX-<;xi}UuRwUDdNIA?}3*VHCMbk@5Wp} zp!-9_g*P6Z4=qn!H7}d7t(bMITfsxax@N|-c+8=C$}F?jDylLytGMlC=2TVMYF+aE z*5p@RiLjZ`XMC?ZOsFkA6JQ$yMo2j=SYUv2 zvQBX@q8l^8BW5yNnph@s-*aIrb{3p6o0)?Y_hI~!!A!0$#$oV^_@$3@w=)qGYG!e& zy;kt+K}A-qqYivq7M_9?O|~=#Ba2A0fHPG}V_*&qihVJUn3>rWzv9Ffg3I|>zX018ocyfwTa>_gb zRw$rUQl2NTCZ(z`(6yG+x0O*hl2$X8QZba(FqhFVg(J*2@|DzfKc?p|uHk_w^f4`8 zac!@oN)F;W0pbQxVw%398lJK?Swh!RRi7H6L$1(1TM3S^f2FE-iM&&`lGAZ@k34O^ zLIt-xt)N=i&kCNEaD-*;vNZ!MLYo%zXSQR{-?yrmHO#x95YeKQ*ryiLt`XTJbjmRZ ztI`TCHB9I*%^5U1IqFzF>(jRC)UX&evY9-ypNv$_<%95vy|A$Zm(C{!S?4q(nv{d8 zLfcnkx|S>Eo)=9&E}eXM>hgn%>3cat*9#{%%T_+&#VD0`{+z%1L(1iMzTNj7>sM@w zC*11iJR6sTyRKzT@6_J2=GpC4>BF^|VV`$EW4v$K<2Vshn8VtG=g} zy{wkIU{rM-Z#s^=_;up^Pf0W1d3SGGmS0hd9dN5(j~d%go&7rY;(OPg=laFSJ1@C3 z-|^_Y7udfUIPl!Db;Gdml6qXbZURa^nzX`e^kPrD9B+=zs;JFPohpmlsE>Hs8nxXW zchCzxjX=B?jw;YY|5#emi=AG||Gp#fjX>DyE#nlFai%gs2Vf6PXwqW#ky*b?bN_!t z6LhpdiMU`hIa+DU%vz?@3|`>IM3#UhhyWVASGG^cW3ZSucZAO3=|OYos>55+RRk{s zlb#ZgRA!>T=X_gu!DQ7Fy?;E@7ZDB)ntVoN#;bDF4R z1~a#%$TMY>up$XtE^v(yGzR8#oI;ez6=l&aW_5G>K$UbE@n`1G(m^&2!b*5DznB@) z_z1P-{8<>`>?61i+-*gM7t97AX0_KGu+zc~6iniUW&ZT$losDd^+6jo0XHiB=Zd|D zj{BX8^YC-E*D+^{is&yv>jV`vq?L7LHO(Yd3}rOU zK(V3`%Ixjsjono2LKGaL6r7Uy=Hb%j(K4ptVyaF@G`+>uosKBmOPj=s>4RS{F-=bi zvs789QaR_7e9J^xt9ZUul9JmARnH=UZK}X3QQkIH#U-0>oucS^LeaBS%KEsZVI0pm zTFxdz);`N1rs??bqx9+RkfEo}4eJh#t5!Ahh9}01Gx`it+fB3kEppEVHD7V5oAqhE z5`X@lf9Li1v6paN(-uC&PaYs+>(RIAUcVOGHk&`Nl+`<5IC`t{!tLheXQ!v{ogTkl z*f*WsJ(+iAv3%lo$?V?gyFWKP`nCAR&zTF~#EtFxcinb5H5b*jmNIlVXZoOI?Wc;h z-=|-E9o+lKpm0_@>!L>DFyFsNIc`Kg?xI5Um_qilZrxL?m@qxPp;5f5UwzA|`$hDn zkLmN@CCq#qKK91F;f`+VkX`v=-1vU%#5=#CegA>ysL@i-9953)G|9c--G1An>w#V4 zb<=_i+A;MSfrUCjCp@$3kC!*LRh3LtCf})xebEuM-G#t1@I-|qWr#>mv5c1sNimj5 z>{uZsR`}9!c93S0!HiQtm?mHv%_OoQxa>ZF6jDo)3dV^(2r+$RxDjjEr!@``{X>YD zXZjgBP8QkPC3Y3fr@`P9=das$2UCwy^oJ%5+B_A1fGQcF;nBrRG z0y7n6$s@)ui&1kSECx7$rB^JG3NsIy>}ML}O~W=Oi{Z!a=Nn~S2cuZKRxuctwwWE%e zgOa|fx`myRp_QVJu|P>3%NEei9dD*QCaZ8vpe(Ioz*D8wZGac+Vz9tm$v#TWIZ4?q zQ_VYHU=uH68X>9gE1~0yt*E@^G2OspCP@-TQSgGrwS1*)j`JOhWNb6BF8G*!sFYa@ zf?7&0xdOXXMaK*|yL5Sn41smL&^keAmo8x%f6OpUOxs7=G)BfOUSOS~=2aAYdbV)! zecJ5%@QK$>t+(AJHx_v$X*t((4Acjd84H&_NTpYiMs{i+x1^ba8g$lwu$%~TG} z77ud#VoRv9<3uh{BFvEnqQEur1zjUxiFd;4kRZYwa2-xyuz%)}T|&ajCa^hVlVgV| zENAyJ01072n?Z_O(F1`EXe$GgaKy_DLnybGGm{lnbTt24f+cgn5`US zoHkSCB#S~rdBHDJUQ$~yPW~(gTkOvwU1U77W?Ar#iEC=GLj_%oblM@t!7PV1*JFnq zUS?f$%rZNfOl3d~TDd{M;v;IL31L{&l>haCd&?|maE;?snneX3t^T{H)@Xt8j8*)B zTP-24nnPZ+1V3z!y49F4Tblbd~=BH=vqHSs?P}P%D){>N!laN*5 z$*V{Rm82lbYKHRqc0wa3RSOSwTYnAbP*smqt$+empFB066B_>IDt<*0CSg(*2na`s zt2&A*J4u=+NtmY`)pS3qY%66NBju1UZJ*DxNC1`MI{xDNp~nnDc&5>4OeeHS6{0*(>fkz?<%Fu|(oidOoBUdE_$M4!O3iSN-M6L3}*?^nuP(kfbs9D0^C zz8f<5(zJ5bykb>5d)l*QBW3b!#MnXD@Sa!4Lyh!tx!`WK#Pj-TW2V^?wl!-ujdv{S zZW>mu7!*#L7G1C@9=0zU_9#1-SlQN8Svp!@xYnG#*`Bi16}Q_Fv)vl@7H>NuY(W|1 z74~f?wydy40P>{Q5MLI9Iy}qZrF(*FB9uYOS-gPm5Mj{A z_&tnnkyrbktYxyU5AkO+Kbz>>L0rP&27Sa2!%eVo`12Eh{X&NPA;NSD*y27tWDm2C zxR5;}Kq$qmAjb@FW?gfS4vLD?N4D0f7x`b<%ovC#17waq;ujY3J}hTuOH&mGnbrh2 z*~!eVhN*n`)&>SObDYV&#c>wG0_>1i7}AViD(Zl|0%3}1QCym$SX9VCH)JIrbnuX0 zFv~(!XcvzVG*wYj&ImTa#@EoMYnua|1!Q+jHHgAv`wnOF_&i& zc~sdNiY#!-lX5sAW1EFQ^p^-qt2jyO1&W{xmbO0+9qo+5fvtpYAP!0y21}Vmh-)Ga z<}9h>D`5}}goRddJfkoveSZbhP%WnzlaT!2nv2=vPje@pXI^-bcHw#E`1AOI2Wc0# zbEbETuY4@O`d#_Tw?#`|pIZCA{_0n`=Wk~XET0^@e&YPKQ`3(d7hW_iy=c4frfq$< z`RZo-%4X~8%g$@B2JXD=UVquP_`G&$@6_u1y7l+&@h4;|sh&#UDuX%#G@Rdw9h9)#7nY*Dvh zUN!N8N^Flq^%eK7N5O-yVn+|0TJCEezpNNLD)eoUL2?bRp@|#R%AC;29@onlGRo|; z$~hBIFJ?6PKl%nKjO0#cV#q91k2wCl0d53wWgFnH;}_D((q>A-HS~XvNpj6W}*d#*d-+ z^XCc>96zL(rLM3~@KXI1BF`Mcq_cpRK@Da(qDg-#U`5N6aD>=|r%Z1RMz#p2sFnj) zkr&JmraFqlm=&=}gc6?A0e}qV&-OFugBi@Zz_fCK3~9EEm)00^ER$(Xic`zGqUMrt|+D_eOhnR_T%`zqN4D%*!^c&BRz7ifi*nkLp+WTNo0%eCUX zNA0A2$)IXrnMy#3oO=!mGgN#FW$hA`{7Y5+PRY8RkT3*~-a_X*IrmbY{Ykv6P(<7J zcM3KlsxAm>9Z~fb2g0gu$KW8Vdm`~9rr}Br?sSlcvX#_w5SWEa83ak_`pKAt9#!{} z(Ds$m^%0o(>AJ<5#}@ma9!cq5!rK26KC5ZEgq= zw0wM{c6qPq#@FpPzA78O8*pmUG@(l?tVKDZ3(=~;{+BKt&mG%0z1tt?aQE*O{*gu7v8LwGNhk5YLI=-ykNw!{6cWma9LCDWLw3Pj|@8)K}zUhhBYY%_j$y6BeE7;7$?{BGIt}7iKVKPlbFy$qvxkdWSLMG}DQT@y^ z!9)x2epX@j@$*$A)10IpDkg)P3|;6l$2;WmH}-KK*1wJdP)u{lFedt_ z5eJ?IWJ1FXCQixHhJ$|?XNHA*h&(3KG~5BruIZiK_(->9!Dq6rnMJ+VX` zEIh@On%UAMxLn$ZaK@XJ2wT!zt^^BLF$WoCR}|&~cG^Z`J6px(gYd(7^9|4>*3*oir{Yv`WbK6X!OZ6g)bV3U? zLkcy5PU=Thnn5oJ3OW&305USeu)V#*dgbqjR1rtBi2>Ljh}V&I;Dma`^t z6@d+xQuK7i?&OfZ1x!-p6S^L!&UAK1nZf-SPd0MlyU3K|s+x7P?w|}Zz-p}e^ zvpX@O7uTf~(Q15r#IfOK)bO5V<0GTGCl;q~X=F?Y!Up+1ZBmY$;m})mPQCCe>0V)Dq8WWnEOuxTKmgp^-PIQ?P1LeaoTsflJ#x zq>7BQhYe0lm=;XhlwESHz7)|k)z~+(*jDneC1JZe`VB<3JN%$K42|jDbcB=mcA=#P zq&DnzSI9wo@H@P`j4e1KtC$Hfx=Oz94Pn+YTMo>ESNO=SU*LA$bDbyqh)@O^i)-~! z?E27~X2|1h!VpI+f1orm(MRNR=n>%bk?4a217sX$>WR8&wl0`NmYxH|7jeoi>;ZR- zK~`?TNhiA}GYL3FrkoU$RJxXXdawrqQH=5r+zr8Y^2g~L@vOijf?Y_DDa`4O+HLV9 zRGXOz&6p*Nx|un@aD)k15?}P_fKg3re#v-7q81rp1~|QSlm^Q>`BD)h*JhSm>_EV> zmBLJy8LF(Q4ro2JmdU6F>0~+6K}rv?>PqB`Swxz+=IWn0>zX`Y$Sw;(V;j8N9o zEb{tnONK3r&e@cWdp6DmbzX@XycIpT5!JsD+IKy$??&R#ZI`N1@6%I3txHZ-7q#LW zJZq+WT357F`{ljL#EnBW0!vildNtyERU+Hai$g*`SX2#l(Y}%m3ysh%$IZ6s*Ltv_Z*URA_oks3Waz$v5;Dm`6(+M;z1i6jQPnlQWf4vC^;#a*iuA zjju{PzaDvJF8BNzs{Nz8R+9U!#r0o5e)d|<@QvKzYo(VqN-sSwx%i-Pc)fD+Ue&~n zveC7wnWs&QFPj#hHZQ{SeU1=x^VRLvtFP*oU!A^kP`S8Ywy@uF{Zs9gceQiR!y4zT z^G3D98#SYv9ZxNJw%-dqyJOo-v1P~hCwkeJq`jJDTu<|CPr`ndbnlQ4A5>2slMCyU zbf}SXYLp8-r<1#2T75%1cR@96S~qt}JLj@`*1T%clv2_KjpS*~)Jp~h3vO-qQM=`E z>WX9aoJ0APSJgyT+lBV-fwi7;a&^1H_qtGhfq$rQZviP;%gkox7Wq=->Mhl5gdV{8 z1xnCRXfZjt%)=#P_%qR@&Lq~%!zCif=p`?h1e7F|++oT?ai>VlNpmUcg$X3tpHadN zHxoO!{3GVTDj*x1(Ee?ZzOzvCJEq+n=3lX;4IKUybmF2<|HoByIWv`+&3tG!gMAQ+ z-vg25$|>_X-#_kmw8q=0vtePBOhY%_)3ZNd^BGNCCD%~;-PrX!p? zOgK|giMS?>hVk4+O?AkVJq%Tmx62KtzhIv%XHZWTGC99g0*wU@L@{St6TBSM&{nv~ zFsh-^1T{0Hkst=YV3`I5uP7tTQ4h@N=9vGv(;d=G!7n=^UbM$Q?asQ_UA}UzcYJbT zVEIAw@@C`ecKO_9=GdM1v)4W9rakK~`?fAR*UyFy-47pnka*!4O6a4`As;&D-+eP} zYAjiL^Hu%yet~D9Sw_1}`6bQl3&uqkmBL#2cE^wD z`W@2`MinLB@x(E+)FbMCU&xvtku^9X&_5zH7Ev%0l{XfZGd?P3byQ%CwfUkl>O55& z8G`^>;}A(rR}nc2F`=P^f{BcVjYY_D^Z2U3mdUvB>+$_pQ_o%xZJG=2xDwpH8d5)% z&~qi{-0jT%)%1ZI8E0=ocFQi@shYT6IJ|Ol;!gGKgWCD0H8YQESGMaGU$$I*-L$%2 zx%{ST=}p7cx8=*ceTzp!3;jVAhWecRJl6tI9jC$0sIyK(1Z@On*d*7h?j#u}l zMa7aJpheoggy&Ep<#I~ee?UI`oJz!iLP#Iqvsv1uLDr{NF?!tm)E%Sp8yZ=&s%ewj zIdd90v)Va}nz=J-=~KGdb2@o*&aL-ihWBF6K8oqTl{s|3X87vN+4g&#Ia{5vSOAE; zEe(`paOiRTl8hb>3M@l;QLurstFDOm6nQ3Jm~^%q>wpMM4k$Xv5=kt11gOKmf~0nl zs6az7`SfHu9?4C+QulOTd70*aVr*mC;>JNdkvW6L_@(R|#TxF*<{ zS$_DFKJOErpZD1*&a?)eWG54z6dybMIzpKAm&|E)oIcVVnnwGOV`Pz7klAae*?XH1 zX3C2l8l9;Sw$sWV7i37V@f2EsmzFm!m`Q@Du-ry zC06_les|l^?t?m8!fR#$XBHFtpA;}F@L(=5v#SxdV%5?AXLSb)L?eVnzHocUP8(d{ z$XD&rFWY0Dw?;qfN_^InyD{E1dwF4eVdLD@ryZ-?byxRFXP)I=d>qof9^7-wt8Lk@ z`+CB}tMu7}tc8P=OV0zkuG!WuBwX6hTKJeW@!YX;!mstJ{i$j1rp4ro&ypvexiv1S zC$yTMI2Y7?6RT(~POWHXjR<^BNth-`8pX(1r^^Ey56T{j=pvK-sF6wq`zxcy34=W0^lO4`8n6JvJ@CLfm1 zJgl60Trsy*zVQDsb>3Z7W!tv@_nwN!DlK!)Ip-Wej0i{&5ET^=1wnGoac^>xoO8}e z0YwqXn6=8v@zlBJ-Sgi40I&BkH`ZxwwcX~PYp%7iHGix3G3JMtM*SXeibg9|wjS8!}gDAQ5Z`arKT*)7IES&HxdlFT2zpOC-N%GAJIOKR>irldYHCi*_9G&$f&5Q@CYF`W|oPa*s~6ENt9X+V8~3tRUt5) zCqWYtmjR4?fvQ^Xz@Jto8Dof>4qlGev8g&qlT07uhj=%JtDw*1L()u2FDSAya%wQ2 z4;I{DR{a?&!j(_;d{DrOHzudD#!&uXrk$C2hOZ{$Q`H?p-0?BxpCb|NGV=_OslOCo zsq0uLF6hXAW9 zWvU2@jL9SFGR9DU|4M414Uq+;x|A1Zy2pGU(&pO?dg%lYvYsY|W#XxzpA4Da@= zsK%n)lFFv!nuneRy)JpZ4mtOXLX!KJ4({qX42SV%4WDZ)E zy|FHRc{r^8U_jNCqOq%Gqb_yNQL<~9aeuFG;py1s8~{ES$5m7&FTIqq`f|#w{Wm{ea^RyGSbe|cldo3)ZRV;^X0Q8r)|$V~T>H`NZP;V> zlNn1s`)bkWb60oYmOwa`y7QOAcK==#g&{QD&Xca51U% zYI>Jb+35BBr{>AMCp29KF|9`0w$qyS)7m!klpg!6KGVcD%aji1k|BqpA?MQ3>sb%& zavt3*eB@d(;8Qg0UiRF(_Dx{pd;j`3Aq|sW1%2kxbtntjaz(T4YWzWuJpJIx9qy$Y zZWeBKuiGEib1PIg9O z>SclnUMWcZ6?j#WS1Fnd)bh^glt%$3f3ayT{}R?k%lbi# z8H+^yGvSXg9aD>GPNa!Sxhpp#W3{nZsZpSrB-aScx-f1muan~v_rf!Ei^Evou)u@ zkDYT2ilY%1V}U=;o*B~`L5>F!ZuVwGHkB6Ume$1;GzR2#IHot5#Z(%ESDlP)IDfbA zRPw!JQ7uQpYPNY7ok{4uT=K@I^zE6H{`F2dXOkaaDt-Eqe!|2BQa z$FnwkJafZGU#{p(PuN}eKuq9XLB}uI%oT|1-qurS%cj+uw&jA z^Vd#aykq93Q@iZ6XT!^`rnEce^g3ks-6$Aztr)*qJaWBc!UD_jGWt(OG@cA=J`?xA zCiC%yxmPxUI`~pfU&Kdpa5gBEA3KC3~ z#U6_gUqI#ai+HP-T*819t||CMKgLta(O?^}6IG?fRAG`xes!V@u7x|$Cz8#PBB=^k zLZ=j#5UG){%ECMO<=r^)6*v7r4p|-oBo0?8*oAl8g!f@5{s6X_=K27su16BiI?`pZ zx{AZ7%PKW3Ld=H%Z)i?nBgyY5`DM158`(uN@&&nqHXvmi4AN|KIWU7|CCZ}L)MX{j z%up$W$vdsGVwOAbK*xbF-7-RE#ItAsbFj&SzIrO)m6Z-M55-f2T6b`bFb;Gg_+=G` zqFa}v=2yW$HHfzqg$eDYtd^&%}CyV!eym0qN zGdKL#oXwxi-u%(bb&v;OmiJEzTCH*Makuja1! zV!^sE7wwp~^5CK)S9dz6T}f%bmDA^tGvHh@>RS2iR@rm6ns+W06OQ=<)+t>VlJ6NN zJUoAQ*d(d%TKR*J`zl>>l8Q1nIqQP_EZ%sha_b#zrjfhlM)vv}1#2#) z&oKy|b4okgID4i^=87xDtF9KWuq)Z>-?b~G=RjDmesuqp+;Q9Nf%BR+6K&^>g0X-!uS9T#Zjz{g)xoaZ zGKCxLh`56w2&KrV6i(AclRmkS^Sr_!a@6cWo9QevtE3jT0SF_d%&R0`mXb@gnfw&# zl2udp;gdmukDG`<(~~3e9gE_e5kp{39^qAG$VlsEeqohmb)n>`n8-q?`ycTyV_`}# zHJYLGXM@PG9i(>=mEQS@+reO<&I2 zfSo6&&sl~ywtTtl(2UJS^NwCyZ?827DZiN5>|FHJwPeVcD~az zPk80`q2$9fs_x*O{Ovb#H#uZ)uuorqO|#;B@Jf@2l_sGpt&-O{l;X|8n`|?-UQJzV zlf2p@cK)g8g{EnXt`yC`TE5hwa-)0G9{=W3+P;%9wKqJb*K_RdQqUZXVfX~jk|N`^_)3kQB3=GkanyK{$e|t} z^0F1(FYk`nX|&d zLJsV4$89Ph(>R!mmRJ~KtIX}NCb*G1?uLk)ZwDTU#9mm~&K>I-&dKgQc+H9#UVZf_-oEc{ zaC?rnHa#ILGcPi;)Gxc*A)~=6uF5>FS}&0Eyn8*1jzzZ|)Ak&Ud9XdGWw~9>Qrolx z5#7g<`}b@5HhEUBvCCL$nXmxUo$mFkyz5rq$XR(QdG49eWmc(cZ{*A~44-}E_RO8O zAFnz)ZP&Fgcis2|b4jaAX6?K3`394}&D-(uj1`}Jx!{v8=78T%rZ4*Ft7V_eTK(zl z)t}BwY`pM znh2>Ka>;vmEAOFMY@0?RQGI+NE!>(JVUdj_n0j8ilPqAG_K%clEXWH5S@6 zCJ}3lBUc-Rtgwh*YnQj(r*Tinz1<<*$0F}r-yOJBIAWDDaN+KVP4>9M-9F#E?%3jc zSyf$CRgEpVN&T6DBT0^vw77uOf_@mdsRS}`j%OPwDQK|>E7TKHNIE0|IQT_B4yrb1 zitzsiZX30F%_qp}vAvUe2-&HBvVWXH^fuM}hQIRtj9ON70Q-fH0Bdo_KiK}5UjmCwTBR)5(H5pE@eWbDL z)81%K@M=y8uFgt`$SHBotaeDPwboV}Mb{h;t=u0}v&pq+y;H$@=fVw6xtqMIw};=` z6WP5dvTdPN`~s8MH8;!F`?qb6e6ZTPc7;RkSI2|ro2M?nUO4+i=$E^1Vx`h&YYdT* zo^?EM#$o>%2fV-B;rPY&t6y%v{?Uq4AAhy((^*SD`C{(p)8~Kw)#6WPt(d-e3lh=b z_tUTNx}~MFmTp#TyeU5h*Ho^vj;&hBoHTj_{z!%M%GZ~WT632py2 zq~oW+?%({HzVmPX!K>!AZ{usf=9i%z-+0wO^KN<`dGEWhuJ=JLFCtrBh1X3))r|*N z40;tmaz%ig-+wK+%SzK?7T0zpsD6i2&U%}~C58cW^<5X92wG|swcH|YrPbXPrtvGy zV%ONDuD_Ca$gh0AZ}p*|)^l+Wj1nJT%O3WvdgfU=?piqFQ9d47H=0!Qptz#8AwR7* zD`F(c`9-{qWSM}H9F$!MC19lBDlo~WE@GtwS2#Uuw=Y}*ELt3k$SW{F=55!nM zj=SEN9GH3cZcJ{SS8k_6-h-<-_so(yk4HA|4XV+PYCafTy(ge*wM)s`TLsH)Qx{t& zEq5y3t9iIj)4wI6XSHYjBAfKNrm0Kp%jaLtpLWFai=Ed#UvKisYQt%JZZ9xPo@*30 z`((tlqkhv5c}&~m^7*za*qw6vf(=0RlNk#>`(pMd(-(d^dktoeKAXLE+MJcs<}97R z{@Bc27uT2stuS)m?GV5FR_Y;Cn1t5ZBzIp=?{O_0aw!@2z}9dLuY;Sv4sQ86qV0V^ z^Sh9icad#xu`t1}Zak#(onOoAp!RS5o8NoaeC<^}9$q~ZQvTR0r`J8N*EPHEX6C&M zaUFKKL+7<^C&L?#co*+*Ox@*}y3R6cQTGPyH-D{<(#I= zD5mp5Y>R!?W3Td|2&{}~p3ttDub&yhyk!of?8aODv^wK8e7kk4ZK$fHy;1Wq?58B{YoHOuLI3sH20A4O}u|%B= zrP0ZmUy3!)iXX=P@i(B8nut5_Do{zaC3^Tu%2nJ{hxe2x2Emk1) zwV)U|D>!F>spA)%0%0MV)zPwx9rz`WG{%z7;wLqik*`F-vYRxu7|Ci_SxH#w_yxuM z%0&%?k-AJml@{v=WhXbDWr7RL5@A`e4=Ry=##g-l8wqFJ2mbjCH=*T1Lcvzbp^>oS zL8+zM(p1X}RusJGffi518jWZz$6}2qsM^NkvBsmZrca|U^k}a&r-v10WyKdXg%@_* z$?LO9=`z$d>4nwo_A1(RJ8PBQ-KDna>s-nFm?7v(CoM)DKyFE_U|ufEh>bEI8~ibCcfZ zvsO-0nJ|rHNOpPcoE$CI;`zYX!FbH&NqQ=Zz4K>2&jG; z-1xO`%_5vy0p5l)K%d#vtjh6psa)sk3P*7(y%GxlT;W``$U0|%VfdGayylz^pLsfFmT}_3tNHUUX3w*@JIf$! z{<-jlmND}$#mqHu|7!E8=}Wis^+vOoe>!6+Bp5Gxn6Y^Cmy0&xbqrsv+&6Ex)v|NJ zSbKZauke&_?g_s_gV1tQRCva>+NXCq7d*a^^T@ey$gN_`sbbuM+SmRKue_?Cg*3hlEr05f-Fqv&(=DgRyRg?YtMgWTwQG7SSiX_gU>;U> zHLlh&tn_Sf$q}zC1JCTEPH~3bnZ|+nXTuu|<9aQV`mNF*Ue0*nTKqJyW<0j_jke`= zeA9SB>x-y{$+XJOuB?dh_=}R8;wl3)#3zGaf=LW@uS)>7x~U>jUIf3gRDrmWbdg2; zZ)d2hbKOK+B$AzET=6SH3?4;Qq4X*R~?zz`LW7%yd(yrDQ`UFZss@s&C#YA%8( zvJSbVWu;!@5h19`FyR-~T+~EBN`b~mt~(&VJPTW^KvryGByT8_zrra1R2O3Khsh%< zwb*7nbCOv}BHmctK~xxn8AlLjU7C98;eZf$JW8KM8d&xVsU^sC&g0Q~Olqm6{TLt< z#4_#66@@P%Prkq_SFq)~OcEiam04hbNp~%oXNa=sGH4~IARUkbVFSK-5VX?Pl4#i` zi_FS_SF3Pd3AADWWfxE@v7Xu*>jlU~4^z-|+IR>E)WDPBtq3t*ghY+Tl3~2iL9|#m zql5tyh>-zroCT~kiN?Vlw4l*v$23@wXf%p|T6+#*HA=Z2#@VLk76n!e+$k7vES|Vl zG-8!Ed_J+;Ed9~3$nH~``+I$=H{34T>{^U9aZ4^_t+g*)?^(Orv3$01@?4YD#n%d! z+$>&vqj*zb{fZlfE3cQ#Gm2e`w~DyuZuHLFcs*+7PJ=mk>HMAxU#-^%wx7;ki9PhD zE#5I}L+d9!3Le;{b=oF(+(_+k z&g^oz+iDwAel@c2N=)g6$U^h*k_%DgrV(W(p(Vya1tx*TrXl5*G$_&RvCr&xDjvhG zS)Mg7gIeCj_k0)M^)9;QRb>5mRP(dQ=6B&W6Qzaa*qj+wnPSSr^cB*}#Fn%QzcO1y zmZ`j=ztm88W3<)5|LTNJ4nn7Ee`qMs6y`viUsdcZo*7z+%Q09am?>`DP}G*5S^A~8 zi^FgstS^@X01BWX3J8ekv}LlG##kM+&16#r&VPxckf=IwRxp=OrL9th#WXccI8_y5 zO@l3r^WnhpP){DrBx7$$>Z#IS41>IKfGk_!4b@g2sM(M;5z2v!7GwP{_TNzPFUX}3 z(@~=+nnqfb7b1(-A#s~ZewAz$dYFXoF;R#FdXW(ryoSwKulGb=g}|2~T` z;Cct7n$&3Lo&lqbC%NE}nJe9dud3((s`Sr%g9Er06^7HMe+Iwk zmqkpNFE&Ij3lqWIcNB`uO)S-cOPItS$MRurtA#a*cuNajaR`Ksx>EhB^RjZYbCU`h zg7Q0^^6y*4H=d7b&=0IU6V<%iqimf+_EO8lB^JqR9Sb*m)ol;!Ug6WS_-5r|`?3{x zYS;TVt#GedZ@P#LC&D?%&_Qu0=_F2z9V*mGLdp}>e zZRV=|Gq#zpIODSJoQt7fmVs~90oUXME|~{hvrh*Uo)0WIACh+>AbbCvv~6|?NBv67 zw2kKR&E|<+)@eQVc>^xR0|7O|epRD)N+;YZ-rg*J?p!$PRx;sV^(?q%%o$Ii%==f9 zIvrCw9n;#Zqsq?(6`F?@T1J)`1?Qd(Dm)!hc|4@bG^+YSScO@1on!uxTk()b*|Wgv zS5d9+wD*3D>;5UN_m`YUzs9w{4R3xE()OKy%lAGtZ=rem4P z%ZVX~GOe#H7b15k-iQakidp4s6}cZ=^c0Bsv+xs2g_*f}k;JK97}wWHMqIE@ z!_2`5vB4?+7y!ryg^%$pp(fY3gpd+>E)&)zr3soGWLDIfu9b(ZU*J_bgcZ@~mpkkD z#kK0TfQt(Qg;Sk~Cz-xVrWT7*6JGv=xM(y~KrNRLbHy)GWU?L#BbmQa`0EC9-6H;Y z%>NpUO7colRY+K&5SqDY%oCvmS~{89Vl5^35 z5+kEOR;e>;w9qN@zv89213cj6gfD6-p})YNpV)#@#1~qL=^>5>gQBy*6Fa@rIYU($ z7lT=;qefeKW~wmbXf8wo)Kp{v8SU|Cqfu<86l2CYCXfqAWd|NoOzO$+sLpIdmx=JC z7B4+C9*#91)LiV1zgd%^iO(*%ncirP_wqzFo``AR>Rq?Rw`IZQyw!F^I|A$WM|JIw z?A;pmV4H88vE66$hVZhXJ;C({!fJQ<)@=1GU+Z4J>{9ZwbD{GN*-hVUGJXB& zX>0Ts9JZae&*IC?rCf&;> zJt{_B^M~%_58TchbiUhrJ+aXyy4oMzJO5}!;48R5c3$I;eOK+#rei_b(O6fhHfd@}g`3tsl1pNg!q z(3D*TDU}rDswW2gHrWJsILpoMh^;&{1ZwG#X=R*3k8;Sskd_sn!ZiruZwV{{n&2j; zmskmC!ZoAmR~)7yYjr~oz`6qhi~Xok62?1Y3=&iPIsODgT^;Ng%m;|lWhKfm(s&)Y z`XS;^a^*mq4+@-OQcH5wstrliEnbL3*%dQavfv2%t3NJFgQ3VG%7~7YG$S{~q}CM0 z${tJZnt-1gMahR4X|d2uYDvCJf?T?2bgtYGusy~%* z&oaB;G`Z(YV&`tJ;yvEw=hFMHRy{uz(`=U9X_VM`B&-!%TWt5LTz?~Tfu76!BMx&9 zUZ1%OuNgi0*@`0z58JFd?Rd=Ru0de&so=uXzGJ3)aVeqIGQQ0&ZwLj_!F9ut zb&r$#e@-3xKRHkTnce?ude8gxdvD`gUxXtG*78l*y?^*M|K?TygHO}9QLS%t8Xonf z`90^F0+7p~Rme4Y38@u$i8BE-QAsV`r$oWfYo1Dk98Zmz+8Y-A>Y$Em87A`yKrM#& zVw#w338h7gX{51;iB%jztL_tiSXts%*jH9Z5Jg%1GXUpLL;GY0ORBk&W`L=XS6a!~ zlQTqAK(a}E2ru6ntYrPKG!zGL3JDJon)AQHVI-YiVHv(e*6f%2s4h1H>5BF`6xAiBvOm@gHT?{Fe_$dE|_?NTzy2o&|E3r zz**oa6(EpT4uBRbsl@=`$xX3vj8bIL5LyW=I7P}DF*1~q!7m7v(n{E4e3j%CVqr2X zS!jaH;^!&SiL;=}9G6V>N~&4Ou1aBnbeSpwyyHwVBT0pqok5^!o3YXm>dZEY=1Uv^ zFL$42I1Fa#pV?0@eGcyzrlUrHtU3QA&ZaTRuP`GiAtl3Glj9IuZ4pyzsjYFyyyuep z;8xCk$J~denpT7G>XY$pR@wIrH3~o)=?Fv;T4wgb>@+!MuA0U z;iWclmABGcZfA7ZCpMc!RawM0TPAf}Na{Hq)@U5va_#PbWn$l@%%SUaB0pq(|AHOVN{vh7sSQdmbf^yvqjzD;`DEK8max3@mx?jM5nn0RU>1Kl)63$e75+M%)xju8 za)9!~6j{nQ;9_hm3{t@Qc6Y|oWeqr-%;Ys zgcZ(`;%IORgpr{l$n@1XxRnPQ(9J2erAemc2B(tjLW8j_XNQsO;^Yw`W#EZ^uzVJq z%`yolMw-~_>@-M(+R8x}O~VXAX{v=^IV)4Zlvjz7u?ZeG=ixD-#d0USvH?~Z0WzJo z6nmfnR7vin1`-U4>7^;w8nmg!_#DxgJk^-@Yi;VH9RuB5Pult%b;~e|sy!c8X%$`X zn9*@7qthm}+q&S<_4;As#JaOFb%wDmM&T7_f{S+EPM?3ucm8R=RaWs!O{2HE=i?>U zhdlE3`sC{QW*>D+J?5Vq%+xw%shY%{sC3`rRj&(+4l6Ke>`MM- zipikrvEb^_po$?Bazr#t#x{+`w~R(NjYZT?1k^o`x&Lca_m2tpztyx&#0xiB$1`Q>MoRr03InIR0Xy=Z224zbIzZ@ z&ry+uKIO?(+Dg=u;V=LMr&B9};eHw3QfK8t4x_A7#}&f=A=zS;0qiSExh~O-uOh_w zUF!RUeAUvRF!saiItMXG>Pcdr7wmhQ0cnSD(w7I9H$g#x82${ht!(JVyXC(eb2+W6oYCqR< zrfC8KO+_|(5^YxGWod1Bb-iWuTF3m=*Rs}MN!fcl^Hf;1q2|8%-N#r;Y?sw_Ev3aW zzU5qa)nV`4H4b-|UryWXT(HfnenkDruv){YTJw~46HSADK-s3N@w;3S4|pUW zaL+v+RB|Sy@T5=X37@=^0fj~(CDyT3w(<3s6FcnE9@wSczn0K?QCoje+kjW0*=5|n zp4yGqqg+YrH;?bVoc8Ei#uMk_F{gr2zq+>p&Fv1 zUPU%eL^r;OY<-{H|7UW~4@sRbG%cgC4P)_5W61!yY1FTB>~_(ld+mF__TK{Ae)n(r zC8+hM(AFP<+kOh}{3ELChq&6oB8~r0j2W=S@eH3@o&HLCnIa3WKh#MAQqmo7B0D*o zyaCixwOHVknoG(^C@VdbuNIc6xf1zKq0K-T!zAEE1G>z~V$!G3Bj(_gvrZsLmz$E{ zm;RPu3WfqW^;)i#xEO7j*5MeDT5eR!OURwz_6j;nf}p}UrDKY}!UN9=YBAJSI2F35 zl$xTV0q!Qyr#Q7MRx*WA$yx~+v8e^dEpcwp0{qqOe1+WNyk(E*zX#gwx za)`B-q%>1loEpX~Fy$DZ7|e;_@mQpz!8LdU)W}X_3@}6w<6q>cDZ!%4RAHhG|I9<; zUz%h>%_(3QX(%;nMSwFH2fWN#ae(MAzOq1zvdb`5!Hc(^$-FScS1lqYuoPk*P+Mh^ zRnG^Ov4b>VEX=cs3)X;hQGci!26f)jqZ`T?b9gb@l z*EWts)eZVrj60Nl?bh-~Navqnoxg{6{v)*gx3Kmf!#jTp?ff+WZ}e{dF|cCD&)>V! z-C!j8?2CBgi8!N|T4U^0#j0jzq&f4eGFOaSC1~ZOk~EklCaV1UI!->7!ct7>kmV9( zgV_V=RIr0w3aCi4s4(+R0yrEpRa*?UPG?nAD~|=i7VvT!SLdaPyqIcLu1P;EEQ@gk z;NV3Nmb?>g&fiVKr?SM7E*60n041G8zHrD@Y!GKsPgJMW7Vyd`T!nt{EA`CytLU+X zZrooU3+fKkV)RQyEI2Dy&kC!EU~I2ErJo^3oJ*T?kC^#a9V? zfiP286R_6g6yY{yl!6P9WkU{YL|v(H!9Y-)UI%8T;bZdE2#BY zSnJ8iCiCQutC>Bw^ZV?xdoE_)=ld}eS}jsLtrI&=hBuvwY`&a|op9Q(Bq4yUKNC}n zQpvMnrRFg$M?CUR1(h2Fm7WSI*Y__#is^Dn_x05KX0h%1VJ#L3Jr0?Dcu%fZ>41Of zL*KH8ew9z$iype>KX$s?cPIa;SLu*%@t_A@q?^|rQSmUQZXmjPFuZCwsB$Q*ZZxQJ zFtTAZw&ht&<9K}YctX>Vrsh#(Wq)ktKvd=9h^j}vWy80s-ubluBdYgbp1UQRSamsRfn+I9?eHHYvv>6>1%<4)l$;f;GW&UmMq^t`?reFQc`a;u$%$ip)mdmNugEkrTD;Kk zIcJJl=J7nncsS~Ot+%n^`K!y#;@1G)J9QgeYF0VbFLi2O_Sun>MJfKHd-dPoQc>&Fz0o+TAB0yw39lOqsvQlicp6kY6x04ZspCaz`*>Xa zKzPkSaAki``Gc^s``ES8uejH%a@4!=C%=|I{M-K#c<BOnuJ*wW>#kU?iX=HtHV}|YVR$t=>;if||=bve?lcWXS68L9<(%oUi7nx!wSLa3OSZ8&049!m!c1;mvRtJrG3dd*Xm_g%jTLF%{D8XYn;8}a?u{&7QDjmXl(zv)X}SXqb>!HJ@R^O;;OL? z=851^gMhL#A?4?^l{RUuwkeI5QW~z`ZF9=%vd`~wsp&V5Yd}r%g^1Eiv6UtfC3Y#T zj#<5DG)-3N_skMItP)yp=JdE0J#flx@hHCMThpzLvI&1gjJP;A{m zT;t=&>c?Rf{SmdJp>^YM&Jnd^;Z5U-T`vgoAkvZ(aA@*wgOwmo^KB}bSMMpBvyD3M+KSC@hf36{j;brQqWxHAmWStV+B~Et%6*90zhn1$DkM_iiKuiE3-wCzNY3P;jBi| zLNk%YbQUpJ3zrZkBS8(isk2mSv~lPpTfQ>)#gJA>FvckHC8tDK0$U+kxE4`{<^o<0 z;8_(=>oQtk6P=J<8Ne}|OOj#2vLv!dv=%s@8;mqbyk)-QnEApJ!HcbPm)n)ExK+FS zX6<78s<~E$OYCaax;Gt-={u1$W}NlbEbEO;;cMH%$&0ByR@w&h$cl48B_@$oj+K2E zbDIpq3ojL{{AcC z(f`H_{BKPEzqJGZFXrLDgS&qV?fw(`i-};@iZ?cKo%<}@w;ZxEG`pj5_w0zU8;Z4_ zj607VU#E&B#WN=|$*en=a8^^s;-v|)GSv)VCGw>o2Dt#ApR5MKEES?xw81aV8WTEQ zN($(Sc~;VlyMb02uVBX|Oo)L9iXG!$Sq3N=>I4^m3~md$`2-MZgjPNc6tHYaTOcAw z900^XH%v0x1WhPrl8PxNYAb(Bha`1bW_3B3x8e;|PK>EAnIM+j6zNuJG1P%@0Qu#3 z9lx)WFr$5e>la|2>7T(YGgqK^6i`!$0V#!8veRs%p|i?U@vjIj356B|IKlUL%R)$9_8Q(sR#r$BRQ1J6q3Gon;g`=QHd z(Fsejhvc^YSZc{SRGM$t#@Iz=VqgOOLAV zz!P9J*09FQ=*)>z%MRNuI2X6*V&Ssur5ju;w+1w>xl^~oxnZSq;|AY*J0qT+N_%!X z<%MC!`_p&7J(2eMeCp7J_;#~UPVAlv%sc3peLOJ#xPO*~ru=$ZtzB9@w%W6dEVc5TM?qC1fweESU0)~Ody~-iET&;7sv2Q0Qd{?Z@;g0p z+q?=Ngf_j>-2chH;jK^Y*M5yZ2DbkZ-uG|KlmATsxexvo)%V{K_x|*2`_-rQH?QWO z-D-bus(j~IFm^tycKc<`{%dJ2?%{R8*9N04#^v~Qg2ZtlU zdMb9BGsxHxi@Gd&O;kB&1O&h`C#0}Vw6KXAQbR$9PK$LK4T^~##&b%V3Ml+C6Qx6v zw<1t{6sSFR=$RQuLw12YPZ2Bf^`8ggPz0w~>Wll}Md1)!8KyYJ1A&)tH%pnrC8Rpv zt72hLObO-~b#rCH<;g(r&D54IY6j7-Bu2)stBkbZFX=D&UG)UO{i(bW09LtZ?weCm+d zUNOwD#H4sC!Np9q%px&0E&iEN@YKRXCa)mA5KzEQn=OGY*8H;GlB*afxQuNaThF?dX4crWOzpY_SjM{O3L z4qa@<LpGdh#uY(J+dci_^@_dFX7qIs6KuF zQUi~4eYaFSpWM@-g+^h;X7N=Q6RR#nm0nB1uCR6I;|kA56(wL9(eJGY7NcaVe3SP#u0ySrv5DQaM;hecJP(ey9rjcer2q5KT zlLDNd;;!X#;grBCc-2Ed39$}s5pG7oB%Mg|QJ@Zmxq1RnsY$VpT#V->gi8rAxdtyf zk>wKrPXk%0gh#|*oPuAW9s|fDZ7`nzs@j=y%-wOpuUaN7_vcxu>%ibC(gkY%mh3Z0 z_l{?U+z@{Q5AsgkN9K7fQcnaI2vc)G>nQv)Sc^D07IBhjiwYxEr6!AoWpF)3F)Ot| zH@?#G{w1~4U&%{LL@eW(#C3~yncDXC0z z{YOJWV2Op%uPg9SIV;QxNs@}NOGHdsG0#ibb<;!QlY!wBztm#&6%F`v7HbKxQ?jc$ zMQll~q^2dKh3TZ>=(A<6rw$odE;{bB_v15so zCzGEaj(&15>fyogd&grQ9@P$F&nTm~-a~HLTQB(Tx)!eInQ|sL-z2v3xKHMuo7zJj z=_djTjJ2hV{AUX4#&s~@}McDQFY-cG5!lYw_0)w>n8JEnI#-0i$w@Ze5P zuTOrzH{PFubXH-vXYM_(qQ0OKyhvprymm;_IGob;BB}Fbe8-rkWgxy~Ag2BioU>1U zms3jJ^~Aa>35^zsz1Q+4ZWTYbFMNjGw5}Asx>ET1TFE>2rr-TK{uy@vUqBf7XV1nT z{ZU2P^ovK+&vzPr^r-*At@i!(%)u+sjovW@Sz-Ro5!d=-t)9kSKo$#$DeA1KFaT7^ zE27G^z)F!n0ImyoK{|m#DTvH2fnR`zP92XFXxd|)(ftqwgF6+*lKQE^0;BlYsc;yl zq!S1eF(^3Lqyz&lK@YzLeu)elpcT*w(Nj?^dMJ^cih?-GlR=FaUWsfIoy? zJ1F8@a!8ez`~PQXEU_@20Lo+I{_0vX3(WcVOx;=KxW>bePlO}ejI1(*82lpJ3>Yzs zg!*SBvTy)TiGS4?v@yE`(nXO;F2*BY&2SjX%LPho!#|47TJ*C1!|No&jumR+o7O;7C|;@`zPiszytw7p^fQ9DTOU z&%pS^iN*V`FER+3j~&h}^Oo3GEx%Q>&b?trVAtNrhljO8#}X#=;>J!Uj+{su(vN*~ zMDzG)%tMRRr$>Ss=N`Sbe6QJ7qnrD#gdVfJM2 zU9#JpGU`3D8eLP$ebUQs$Cuh`%daLjTF10lVNqd9@3qu>&Y3-K1&@47`vQu)J#*UK z3;O(vA7a~_sK(KZ?iU&N-k?Y$zIiaN@j-mk7)++xe$=`=9PD{|M>%pWyaC-0Hq}uKw1k>bu*uKip~j z(XH`EepbG8PHFei6vc)|7KC}UMP46>wVu$ReiET8b(ZECNJ;{kGMb2z4{RZ;WEZr8 zK9O3Y$6ON_r+=p4DybDb(aAivj2DnOcq(lrbymEbq%%4;7oQA#*rNkY@Wk^0%a^Fg z%xh6PWsHzZu~t+vJ1uI9%XRAu@Rf#EB4vfS5GUhtXHv=I70Q@#A681E6E!4|QC3&N z8#Cs`S9wGrdBtB>j|;32q?&{73o!G*7FWsh;e+hToq0L`!m$Xw(QwKxDmNGlLv10u zDtSd|#wo+@@~iMGR#^qSbj|>oF)RgIr?wPX>MvI%K!}<3(z$3f zl*lSkhRy;>C^G9LiSs!uJmh;zDc`(_*lAtyq>zruBl*hr5z~ziN1c8YVo>9(ckbZf z`5RBq*kC&6kkSjIxQyyRIp|7+H8J zy1*{6+&!iIc2d!$nEVS-WoP_LEVUh`QMG1~^)`uJx3V926g&WQql?^o2}l+osp-fp3(-|tnt%d_%$WVg-T zk&79F=E;w&bH;6pUfGwuxzqUb?fRc@*8O~^`H$OmKi#SO(WT})$BJ(qtFVFIx3}xQ z_ip~(tL|&(jE6U(E4;#z(xOA^V{Q*|&yz&JrA7+20s_e; zL`-ezz+^m2*`4>lW(;0)1-NMsX1_ z+APG9R5Ln3E0Cm8XKKI(SmAE&HswE)@ih~@dUsYmk<1oW!dbt*Wb5p-M;Bd_D@@(Kj)zP zBJ<28S4x-KS1od=TIhtBUXy0ORV_Kpi~d+npQJI1ducH4I~^ps27VY{%?Zn0;4lFhv0 zjyp%63&=U?Ut|zaWfp_E<94f9thm4DTRP-dIviCq99HqzJHOi_uf@0MegJAFo5o|C zN8;L_Xkijou=e0ytM?LMd@C&j)u2fQ~hXDE|w&iWvP{Z&^ocYI)TuEH(hRG>u z%cFn;=D_wuH@w zWD`t!Y+gcU$tF4huTUwaAi^)8CdC3W!Gw#(k_Xm5^B|pqZ}rw|>89b;sNix;ZSpVa4=jHgS~-ZBqu{bW|I+(@#eFE)z>XQw zO%n+n&!X@mLd+S}^f2vQ((Q||x}f!DZ0XTE*#~`V_W9Nx4rn+X-f}9cW1nB`zJSJK z(LE;;1}w8DovYrv)ctg&=<7>G-&`#E+Pd&-hpO*y)%@t$@@qi%fBSX(%dhPZ-`a2P z>lgMg- zPOlSjmf?LH8B`czOGzDB=%L68DICvB zXl2!XL_kGJnHm1TBLQa_Bu0K1j0zJ{M(7ltfLg6f;?4Pdpq|p7^Rd9$BA93XJ-A8+ za3Tqp^R+3Qw&wlCUGttw#K$9#O++4>L<*YAd*PFj%YxcU{Z+&XE@zCaocbIGo=iw|90X%xKLCV8hz$qwg2EFQd=*lCy8t3*&9;X zA5lLR)$}}~{)M*rSwziXc-?StWp7|ncL1chxLccB=HlYL+syNTbJjkuvRxjK$HH2SVG9XnKuOM(s;pyVZVgTm0^F@%w9K-&`#G=29{I^ADa4zxa3j)35Wt z{agR^Y53l!bSxmXCOb8)EyZsz;X3%mx_;~&EA(N;mQ)I@G9!$yLM}A=O&nrX()|HX zf(#5@n#BvmD0ITeOwG ziw3b}u#A5!2?ekWf$?YPLT3It5SG6X|74}Vx(HXm)WgcbVX(fUAs4g?(ZHW_%mnf%vQNx8Q>m$^QP@Za4SZExOWF$l zIg-U!T!*N0%Mf%(v$EEI8ENP;Q00^pinSQ$$}7L|?qK?79wNsAFVo1ZhXm$2oH;Q> z!z?U=Ts%FPyh8CLt0)=L(sC1RbZQ~Z6y>RYQallLb}Zt|(~uJt4!g~^FJ8N1)x5=f zrY}4+W7)wkR~XFPdu#gcJJa`h%sY2?zE#;0r{?8%T9!Js&$-&L(!K9M;+uU5Z}%p= zI+*b4SmJB_ly@gG-k;0+#U%gdOXa`W=D)Fyt~I$6yZ=`B-t#xk-U>JLh(BWQx9zm` z%58_|uiUV3)utsIcQ4qmcj;b}`TMV}F^gSls@dmTztgAcOn94RT(@ahiCb<Wgn0(Kd~R*Mj27u=>H!hC%9R2Wo`iNc8tIGv1t`xnwTK4tj()X9k zzq?lc{q35cd|Unq?)cNcziF;U>b8 zfKm+t%NUu}lF~!{)ircHazjfBcOq=IY{$Woppr0BK;-~vgbU;fzk)n_WFlC`=qf$_ zx`cxX9VLFMAX7#v1*G`W2@`y|Ga497o#htLAPCTr#19yfS+Tg7{Q-$`R<4yN0RI>c zW`NAAsKS5|m#`DX8~DV{U-2fQykwkD01lI%lWTE99vD9nsW%o*lMFmDRWuO+mjBvO zhZ9NQl+iKp6#b=t*6A;RMJ+UdMIuYA^@reBI>9FVw&aruzFK1_`%kj+Sp~(=R>r&x zY{9IgsR^d|XOvccP-pbeJmWclrAd@v7Gg0LmRV!5$E?wU$kIGBcTM61WD#G9k%=L& zl>_FPkdjIYF-{?21%4^q!ZJc;G0dDbmImaQb4d)J@sAn_KiMCsS8;uZ(au$imu{H8 zVCS@jhXL>3m+Ad|)#<;lHu`G6(|nV(`R0WSEDPpaWX&+lnQPmyF=%*i+?&HG-ycr; z=4j&UGZ|kSWq)@f{oT2oA1n)hxnBKGhtltYQybHwBOQIBww<&*a@p&GZ=%7i;2oy+ zz;^b+MROJ|UA$`Jl5IyeoxQQvBxsd&+A6EGy?zbwy=TIjjU$?k0t#&7N^9 z)0zVF+Jj5FLP~qXDjvl&j)qhZq4FxS2_=+|gR1Ta7qvxa7Bt2A4MdxySnk@qYW;RI zU;TjU-R>o8?J`%}rmwcUyV0d&yJyW7@0#ra9S5Txn52%HXO4kiyYg>tRDEk-`MrGw z=6_Mh@q1wFAAXHLdDOl4D4p=l>`07HZH)ICOmx7@7i2AigtyFMvCbKJW@N4;yp@LV zNa9HDlrAfZWjh@pDd1oLL6(spcqfmz5dA{*UpUi9;}n#g03sGv^vQHEGg@*`UTK)A zyx<5UbxA6MgM(VHV@;_rvglM&AWx7b)D^~g9}+5X;j!>C33)R*VVp(3a>b-u(B?hm zHK1_UXk$DtPr}22JA05~X36NWaf)Nq56Rt_)RG6wD2uO9zkyHDTu{vVE4?uUylk^5 z8o-W49i!kz09YBxFd6IjLAqp~Ie7%Ljjw863H-8NdTJ{kGyp8)V)QeMrA)P?uw-5d z=t&X#3#;T?Jy!@4g-TMie^Oz_{Aa9#44}F zJ+eTe7-mi-L$3*@PLX*E8ZD_UDeBO*!8mKN)YK9tj}Qxs>xN{FaR0PrCqG|t_LIeWpDsG`>B_SU_5BwaCCxY*`o&()Sq8E5FITPddbln6*)Hwd z1Igd%r@cR!{*6W6j~5GnHp=|kH1~&#MZefr{_b4z&E1r|*6^#PLC$yFd=J=opStRM z?1tZ7Tkj=1kIh-QX!e3di&k%0wbyXNX~zvF0ZUH#t+vqa^Qt)FUw^=(T+g@kuyf+I z_%iq07R(AoV?9DayK7pFM^1Ne&2UW1^WgdyA@whUYevCuRCSLgtEfQh`&eT)9AlVy zdB^q@%a&|Ad*FKf3IB4aFkXtf;!?`e%Nc7NOE%o8+Unb~Be3&u)PpmLgV&1RB4_2< z@Y|i*pPXxcy3_Eh7xGuFzXmq{;$HpkcJ82SVnb|Vc6n0pqXhdGh<};9k_;7g)PbZ* zPFQ4@b3kawmK`F>f-n~{NZpjkEBi44k>sl2mdNxsZSZ>X+Evj(cb6)SRd2)#;yER*ffyXtex2d_(|w#Lj~4@lm0b zLL3f?nZhEiJapC3w9SxOIAkH0HI~tODAR&-hAUR$%XpS@tjsgkEXWQX%vnJw>9HB@ zGUlbcvcUtVn9-6kOig1h7z!(U?;u?agmFlcnc?lJ=OWf*lct)4idzPTlw&!dzYJp$ z9aB=pNK5hx3w~t)17Qr%k*oNXU>Sl-enqvFMhm=>t&*u>=B#M2#eU;LykhA=kY1tP z;Zr+y%v!pC`ij$^Ez$dA!QoF9>VLe<@XM{XU+lW|*?Qa0x4X=*AlSihi`r|Nc_ZuUCtHb*}u)t>{%rY8p4qi?S?^aB&ZaIqMp8 z>}Hg{U-F7W=jJV6Id9RD*-JMs*l=v#meVVaUYoPUWXYM}ZI=^QTWB`gB=5hGdfZ9l zoK)^t+!jgH+OTiOdDjCs)Aza+ZgI|EW}UXoCTpEj`4;cyEk1a&`F(xOW7D(| z$C7t`O}_`U{_fZGi+AHMzKy>Hwf+*+@~eC0yW3eq9;uD7DS73oF?~t5CgQAKs`?F@ zVKL9pUxvUYueB<}%&an@lWenK$c;PHK3ez+mKFXS2FfISrm*rVxuL>P;$k2v{h*Tf z#3AvoE_{YY^DB3^19wayL+?N(DlI?otJIK;=mc7X7^qTq$+8SU8S)SmwA85u?pA4gkq=Er#jxRMJCui5|on8_aTyU@QF6 zTJwlGBQI`%Lxzq+ucuZzNP>&Ji^$?8OfpL+ZL`!_F;a$eR^D4@s?Wj$427NS2{5R> zdGyMWJquSKnzq#7Q^31G@3WQXKU;U{Z_5lnUS;z6E{{28xobRownh%^3Ln@V@$@v@ za{622wAa@8KiCxfcp>LoeA<=&exvLc*UF!6KjWKD7z7ZCqv5hLa zs43og!C~R*^-ET7nYU{HSE~-s-F9ZiCc}9?r9|ku)k7|7x-uNP<;kkd^WJKw``cyys(6czx=W%#%lySM; z&O<9^&6+uL#;iH>7Oq=oaC4t?&f%b%Ev}_YFJ-T}UAfV_d9zQ;?x6byF$0!qBhDqS z16zI$>-saW`DfVXfcl?;8h!|@{m#Agxl2}mKvqk9dM@<$q4xTO*77;uynqN-_|-9s zwoLbcSz;@isCJEJY8u?pBokP+WicQCPZS=Rz7`BA%2RGxVqRdvEVPI$#^6V#O`;{s zP24z!2NfJsNVo%5NWB%$OqK-`c}h?jC6%OrC04u;mw-ePH}%sbS_Z2go|2J*Jg;Jp zJb6f^0+aAE{#EcwppCY=ko+c}hnMEF0)G;-VNhWpOqTgiU_^kgrr>uR^&3-~%j7eo zUFi{oQ8OtAE3%{k6=u##v>3|E!6@h8DQ2sfua>DL3a)6b4q;j2uj;5FzB&ok%_S+i zx$TvdW6A0UL7oCF8jYA2qAV_2hc?sENJ+`=SVA=VDY&2>jKf6(Qiv?=E6KMD3KZBe!S4&^9>jOzWw&+>n?t|%YDwpl2x8vD?Qq`20q*w+;bvn!Z_oNN!m-R ztT(oW-`W*@Ym@ixV*a-d6+hps`T;KxbjTamWR`R#-Wu1KVh^s7SmXNen;sE~4oTI< zKC$Z#=r7;AckzCUMF;F=ZM!gc@3ndRou==&I`>q>TKl3^)=3+!qpxV|{7d^iiyyh< z_5@)WQN>_L+Y!7VP5d{C-e@6S{a@Lr4?Kl2SKLlXrsOgu0 zM!@@BVBOc=C6lh$Hz2z^BD*d#E2k;RZ$M)+iB*JrN}%$Jk_y?Cg$!htZ&XncF*=o) za{oyjMtF<2Y~P_%URm|P9kc{J2FL`E4+H{;PFo4j!1iBAAN1c(gAApWH^g9!A{ zjS~}m<$Xvcv{f83VI=j66nbXRD$fL+0&=O5!VtLOCW06#!<{8D#ml)A0yhDJEXfdr zl@+IgW6`mo%1Z=c=BBW)SB44K{3jqfmPY~8S-b;NSQsOB<8ua`;+z@M%Cr%M6+K8~ zG3I4MNi8?!;35UdLUSWosmP*RCh08dkhgw|k(O&gAGwA-=DW{Op&^TfnX^KtR8*2# z9+Jq?IcMFfLrS^yBWI9snN&mmBGyl%2%GUMo_lI-OIioz)aZ1Fd z)T&ZMEz#1_vZIxBGzrp08tDl=CV>FylkZDQAV47WBE5)B(IZNmjwGN}*16S;s`@+b z`@D01SmWL?*7(NWYp=b7WBBa%opa5#HmLHAhR|YnTAD#ygeprMvrEY_o>~1offjB# zQdmMYYAnGP_5qyWmq{h#EWjsd%V=a83yp~1svdj3_^pl^FHe1G#IVPI^B+TB|F?%m z{jZ0!9{6qPkH@Be@K*Vdf{sVmT^e3>?H46ypDX+Fwc4*IZ0XP1GB{=Xx3hNrarT}+ z&fEXp+ynnJ|D(SY9sm2P6MtEKTuT7@%6FeUv9z~MPcx-yxFK4wsQMhyX!hMhC)ju<{Y01{#Z_qNpLtk(B z=z7`yFN^o65c$f>t&+2xPgcI3 z`}C0if?xgo_<@I>dvg4`5p&vJD>?GQx(|Q7=GdE+zaL$FF{|Om)UADU_YAH(`Iq${ z|G9*X?Eb#~)ZaE7|I_-T_lghPUa{k1X~(Cjjt_V5X#1>bT~|Y)$W`W9m{96W@noKu zMRRSTsc{6ANcFmy!>0YPU@47;<4#O}F#=uSOb#HPst= zX^k=C+Bv62J5sXhL5^BlOl0j%d#;y{`h4YUb-B-vec^?lJ^tH&fB5Zxe=P5RKRbU& z-p-$9Z5xuk^}%^3eqM6*`Ks&Bm4EqS)y*-jeYsojX0`TD-T8-^yM^%GS-S^k@B71& zqkmg@>K|)P{#A;$VsFppJ)a!f+46P6oI9!Pe(gkEpLM0CplZpCSI6g#TeQAlUCp>f z8=fin;HiS@VWU2H`n|1BE!a6?!LAWY_CH^A;GL>dMI9HkV4-;5mF2rGy}#wm;`VbZ zIxei81TCZE>UhF(&p0!u5Gy6pxwu{Lg;;zytsFzz_dZ z5)EAyM{PQp-*|ai+s(P1_m&>|W68`D)5cWq5o#yh6vRG&Uv~D81R#hX6yy_At@xW-Lsp;pBnWZqqNHewM509d}w$?B%LQS;lIxMM#$vPk+Hptdi2evlP z%s1IN#{{vY8I3m7vdz>ydx8o4Cuo7j*PGt{Z22qodC!e~>BXT>j``u!(;j&C{U5x# z{$~Z959W6aopor~vM+|NI{!rJTPVS2~C!p=Vwb`HL` z=icJOe_ee1A1hA&ZG}MSyji*DmUYP!EQRi!`5Bz4;p;tdRK6b;&iPfhIYR=4VIyb-N^Qm>GrlwB5*LHrv zwhJqFUn$;yy=w2p16%5Dre+PWIaTi6RLrxoWc6M%bW97PI&IopA8xE)1Un3 z13&t~Pk;XK$lOQAEPuAJb;N=l&o12Y%Bs%EjlVD4d3#Rhz|w>FHXQ%1{M2_PM+O(~ zxxHxD_0mJV8$aycxc7X?wqtd>K5Xyo*x$18YqvuZSAf(7nIjCysCwsq#31{ z?G?Eq+H3QTBcr28bZv-031yh&WSf>Zb)yB z;LfrOfE>i0@Jt?sF2k?D(Ip#l)moTe@L^?vtS><;EeyFyr$|Fa+V{ev4gzYP34`W0 zIq=(q+nMn7Hxq?FI*aSp7~qwl121Y$2&`jHLEev2VTPDRPb)+&@Y2{nhvc&~*Eo~Q zV%saO$`~uieY>B*I=1-or4{KclSf{^AhgL)IsRo#}(lX?>AUvK#Pn0OlEfLwvvI z7udxtIV&XFu*0mH%yb|Satj_EBE&l@BOlN?};NF&0n^zy50EhKz)uRSmw5;F6(k-&el~^ zHx?}}DXT1QJ~+4Wbav&b(VGtERUOZ+I5}?PsW*#{j^6a~geq-U`*}glvGFCH+2u!O zZ@s#(^}^fmLpQlM%Z3jEPHny>@=JLvT=5h z>nK>ASm;b@+B3i6m+Z8@<{%_Fpjm3;Sn)4}x=w?_W=U{_y~0@}3Oz|Jo%Dxo)~{~i z*ax+`Yg`XDSm@!gCD5^uLHt6lfVCngYzDs=W1}iy6Kq{J$+lORWc`Nhdh%Dy5&|R5 z`s50gT1-D_^5|OS=rgNd-I(>r3yPhceeAwbohRi!Pbj5|o zH{O1#W^hDx-y2PLM>pOPztcOuD`>y_?$&{sJMT^F_-6Lr|5<$WpUaN_bKQ||ix1r> zJ9xfn|B;j1s=jV~zbifU4*b&eF*SXR=|*k#x$?Y^N~c$>T()dox~Tfl{M5(qZ#h4w z;Y>m8v58fO3o4Jzsy+U0#ooNq9j`5H&RV-?RsBcp>86kC)|{_faw|PUv`TH|neULf z(nha3&66D8ZOG|vnEF}m{K_>8MvZ#=kzYRj$naMle>q#T%ui;m`PJ0&XJ=JE|6cX0 z%eIUz-mi~$7dCydsO^hYyDqKlxU^W`5pFuReCw&=t;g!x_iWp~ZC7i}(YCUS&C745 zXY{A04A>sqKO?EJ7D=?y;|y~!E9kV$P=pf0W&jk1oML?wB$M?-D#s!(Z9xxjjA|1a zM_vn^1!tg+P3@8om7>>R>lCiOwG`Z$#6T6OCAE5KSOk+!08FAzVVhw#pi3Y{$AzK1 zfvP}xIfPrz{0ZA>KaDqlSdRBYK%J3Y^(S{>(LpsRcBUHq-Qr(DZI~67_50L6SB&be z7~54L=;)C&cPaQyG*>Q~S}c)kepxRJ;1p7#yzr}E<+8|b(dfrNQ>|ga6`LL-c)6s` zpi+41IV!Bu?2>LLyQQfjn`eO>v@&&@vD1bZgN=Vy{3fyszwSw(wry5E zS#m6eb$A;JF4$G}+~>_YdcsTjh-df6Z2;HRy751ek>BzX0C@gxLJWewKngcd6)eXVBF z$&$(Y*Sx#8c+T#M4V$Z5=9RU)U)EZd>L_p7TieuDUtLvJQdU+{v9)~Tnd*gK*S*_Y zKT#XH3R|RB&e>Zu->uIbtk3P27Hhk8U9F$2&mW&ktysHa;VYv?zcfDom5K95%`1Ox zUe$BcH$O9VJvFL7FR_6{Hek5l0neGEXEGw&TS=qs4A0Y$URXg5j4Gw979! z6@AiEK?;Vx9a|3F*5X)74AGQQ8{tfFZK+kKmo0cvFdsv-UOQ@zjVMEK%?<>SPy#v> z*$z3(031=S%sh^-Ca|Nn?6T!k&*6fqZj3M%--{d9FqvctE738{&w*&(43up+VWl^T z-UIoHo%PrKuJB?g-=e|#2UvgKgx?AkIV%JX!z_Lcb?7OjSv1AJ5eu{HtjnPT=LBAr zb10WZB1?qIge%$=u<8-HnneO?)K+*3QsQD3@?)yWS?L$3&9!(m`&M3F0`|=2SMXYz zG2v*dex1(J7{#`vqctnU23Z(sQq!yvrUZ+%4?57d8}5g|>SU`}-T-8!&|+*ew0ehF z`D7jAuHE3*n{QySW!i6+k3F#9<>_xc^NZmlhdh%tY`ng;ePG1u6Hl!^`RLM9Llyk4 zJol6Nryg8!{@JR&S5kd%H1_1Q-_2?1p1!?r=8oPeZ9TL0e7Er6pNmiZbHm9$l^y;-NZz@lQS@33jvIG}w1uy)npZt|W;8dP4 z|2j3}Q1$YnRYeo$Ey$U_dPYeqzqE1mveawyt4Ge<_-n04o?HF$qWW>`+NW&T@qSs$ z{L=d68|yaIG;L0|Ha9mO+*bG5mJOF17T-wCxT9|orlznqUo%8Z5Z)nwSMa*v*<~BfWic0w_$GFmijJg_!eVKX6j|x48w`h%>dg@vt43O^~Gbggz;S6#kHyi-4EpiXz7ui=9SgWF0P)qymI`? z^tcsuW0zJ>EN)#`x%Gq1)vMPPmlUr{S66IrN$qQ``J}z_>Xy~F8)o(@zpW6P*&hol zh?!r1mjQXrO#8x@)!F1C)8H1|1-~$rkQ@9$w|Xd~%v=I|-T;1xuDZa(sWAO5S8+(M zCx4q(OYjT^1%)UOI~tSF8V4fXnkzhszU_4dBM^C($MEtV5NP)y)f0$JE!lblptgD% z7!vSWb{Vg`q@MTr51GF>THcRvo6~p3ijK>J81FGU=0Pcy;{Ow`F5YobJd$M zZA3W-O$cXduBh=C)29MUv{l$jrp>huSdOH7osJgQHJWdVxL6}iw+7&l5nmF{{zR#h zTFO~z3W+(RgjQDckLzb^ca|nacDe`BQRm1}n_nmvp6XH7iyoV2$HmC8Cz3)*LD=p( z0^T56$4vO5ybSgVrU;E8U6;sK!9Fz}z>5mA5SaaQaM4ajcUNbhTK7)jsFAbDK+^cj1s59@?y4=RE-$O9s;sH0tf!T)*;G+f*|er2wXC#qX+>k@miE@R z)-Bbg%^O$msxCg>vf&dYoLgCN)ZI9lm{+I*X%0<+ZOEc1Mvh@w(@APZ(z?uG1ISt= zQ_pj3o-MlpuYS>G^cP9B)IzbHIb0*w)?a@TQS69)4MSe}|6e!SgyX{nCS-+&7ZEsf zDPu&ep}D|F;8{A!(1xMl5Y=R_9sN6Z|dzlM~L znzP*?nFvr3m*iB=ud=<_SW7Te4zwwd`~$Gqg0=}Gcel3MAq9W^DFmf*lP5?Sme6 z#Scwsdw9XIr%JE9Q1R7^WoL7mZs#}On%r`2M*FoHTP{p#IQw2ZpZHvLXt3%(1<}>BMKA4(7p32JW(};Pq2OF|1%J^zsl?2BaNpr7?MjEDkSv&K1)%yo)R_#lz z|FF6IK)R&0Zc}|@^Olyzw&uE2+qND1_8r-?{nO?(pVcos(XjS(TiN-xl8Y@XZ#B*C zmpzsxM(6>PU-6s5=&DJPal({v=u~heMw+XRWCewA)9-*mmO9%!yOIhI4Dw1w;e;jD z)N9#h!zrl3paoi3@hEFFTpJ4YAjfvdcyFM_SEHwyFw@A36eB5kiK98?fq=;^fJTp% z)J4=nQbm{<(lb{PO|4WSnal&-xXaSaqcT}651?vV88BWlFtLCY5?OKTcv;)rk$lz;@aQu2&+M+l zq>^bBu(}#?v6*E#gKMFKR`2(2w=5(z7*SS%BA%H>{0prS9h0q!x-8gq{3|`x2U*^+ z@n#~p2mh?a4*L9x&9*$VdYo!zX%YvduyD~9S)W3yGtb_O1Hm=jsI3e$|l;7k&832Pd*q z+Gp}|Ueo1S+pf;pex-2R<=JglXSZHlyYEK%;cE>?&hI*O^k_%Zh1Q~;`pE;eN;u<| z1#F-EZGDbvu|%KZUw%{iFq5{92V@NZcJx&JjA5TWfv;mxDSoZ9D6f)NVVLzEAeRN* z(SsZ-qeauCaHP5P0?E5wH~H&S;gyCZ7hBh!Z(4J-p}2Ev-Qo7s@%G9?ySE-ZwD07e zmakfiZl&M7(K!Ed+qy5eufNu^yt}EeUwhGrAo!Jm_f!!$2fTb;)O3gP245ho0peOz z3Ndb1$yNqE=7X@o)LSy)3yd`TYN;*ECa98^mNbiQ^6!8O+c*7+-^w(!`_IeWed z&81mf25c9IGA!s$lmT4w=*%8Z$FTpDwov(&g zkt^GrEHK0{dlg~goVBSA?wX>k8`YCfmCveKI&D(+gpqHI`qk^XkG?wNkul4joVaPk zoYogt?SF2`&R-Qay}s_l@l~huTQ23doG;vQb;-V)^R`|rZ24lr*3Z`OzfgVnZ2Q6E zr*}18X(3FMp&>A6kALk z6vH*MON78qb`jy)NQ<&SPtmkv-iVj2wlHqYGyH;WhF?o|B&(s4hs2ILVw^yjLJk3_ z=O^TfFC8PeNTiO9Fi&7X5c#M?8L89IX$YdZ6QtZC%7S0mWKB~TU_w_LU>Hmi)Y0Rp zmN!PwjsEJ-Dag%d9$Bv@H2S`p^AM}N^WF{G|5^J_BDh#(%^YdvZaZoGna&s)+ML5l(rh6#=}k< z-leKO^)aEbIdv55G&KP-#a%tD6c)nRX^ruIv+(Fs<*A&oirFPiFd@6r+_2LioRI4v zm+${32xqLaU9_NQ=M>G(e`iv`tCQx9%zpp*{I$=| zDjzYkdc=Fx!>4b4X-U(#($04_eWZ_Tzt{TtvW|3jt=bVw2a~8i{$~GqnXA$~lm$X>?BE%*aFP&toz*+Oc*yhk#^;1F# ziTsK|GFkwOg?7I)&#t%p7g6?j$~=^_5}`~jIgv$%nZ#GPXvfYj%?c{fVvYBlk(Vji zA?p@#EszO;9qno7A)pn02Dj zNoXwnrJtwWtjamLVRH4F_m?bLFn`I)+3y!kTe$A^`5Rv-EPLs_vfnJMoxHJg=EmLc zmUqr>J~pT6gf?(4+Hrbe%ds`>CpL5(Z`yNo->&T+x7S^5UesGZrC&PB_rc|XMJ|n0 z6#=jI&;wg=wr=X!YyvC-O0@euzl^j5`yfFZfZUzxop*R3p7p2j~TTI@NgH&U-+A z0(kYS{I=c(q0t%q^$^j@zeGK@-<-m}-y!}7H+lbOlFX7_ve2ZUtKRAo)J{G-spTxR z_TOL&4$&<(HO=H1VQ5u$3zm`BSjeF4mRBIsgD4Xk3tlzP0*7tJB)jQA*)2t~Itb64 zDW}9&>j}C#-rHI_1lEo^$;6W^^q78dRzG%HsVWPx6xODiq?X~uIm;*e*lDW>Y>9SB zLF-qFOwL&c{(3lxENDf(^)&c(&I*1b7d@aoqDg<*b=PEHttt4pa@LUzGxx5ayJhX1 ziq*^JtXQ94v~lvPiu}^nTg?<(4IxTx*$rj8?<+V+=i`>49(U`xk=eI4ze zwr>2gX>nINUy>RzuL4*#qFojsJMAp#6uC-()5)>CwB?wqcGSVIPz6a#He8EDfoyC! z#f^tX2cd$OF%Etunlyo&cUScu)MX*l+}n_&#(a=Xwbm1f?jTns8GPYa4EmehB$kb{ zu8PXLDS}_IY&QLCeiIA@IH!t{lQ|<%Y#t?`(J0VT50R`c$?h^BBhbQ`s|HqtB7&G? z7DvFQuYxU2n7Fc0MHQMA&crE z#e_t%!A@L?WVNpHD)38#e&?C>5Z)CD%fQR2($v^^B4yP%>n;t@v3{u~OD41QPh$V) zE<#{62{FHph$989qG)BLbsTd^k&b5mS240eV3%5%U!rC-*Eud}Zi20;bSx|hCdU=n zl9aZ!Ru5F_7j@>7XJMOlAfkn#__aDS5gZCD{GHA+q;}N86MkWh-(-(0a?#ZjSeGOW z1+uPMWRob^I*S0A=_EdMh}p(+D>dC! zn|-S`_gc-wFDvuE*fhDbbXL{crJFujwV|TCJl&E?H`UdrDx0=#YVE9T-?O8A%kI|H z?rmH5x3?bK-gLHg^^MfD9`OQP#@3-OY`V!yhZaj=gHzPDR;C)|)zUxnOTJp^ED5NL zw0=4802gT(!=xX1HJGx~piOoTLfkps>dv%r8?& zhEBJLae`%>u%b>2F2}+d9W=$bUtR(x2sSye=IR$({RV&$ozn030LNk~Hp5|zFGak} zqjc3|!JQN{^22_t5>1IozLykZ2x>ppJIxwu-DNe8xgm5}$QxA@-2D3G;D<}2d5yp? zQ1eFWsgTr0lZEyHRg^T%A{pL@c_p}D+f|VSxjObV6EnZI&~M*X)upvqk#BTLe{~?S zcJf()u<}=;HF8{tviAYdRjD(TmU@mIwJ4UO7Q)(>gIJjOmxR@L?@Ot53b8eo6e%g_;!hO}N_N7ZYD_0+^Ter8RX2+HWl_!1L zy!Kpr@x{iX3k{1dHy7PV&+N4<@+mY4t7TV3R%&pNIAQ6^2o z8RQ+?nl+xFk$SA2lWCUS#8j)3xY(&R_>a48*&|-i^krA{fY_zfzZu%a$YE_%FH4G3h`B>^Vp zS&hB0ysl6a!I)>7fQ>|!*aTkCmO3l(MTJH<=kNJd58HIWELU03B#OyGqrb>>lxZo` z=kv;$XEskeTUB@_weoax@!7`3 zU!`W=tS{)UpVCv8ce}ozuWpi~T4sX8DIyyb6YUc7;-wK&!5Dy(-69w52_{_%)mDJ4 zd^LVM^x7gD!LR6Zvp0@l8QD!VT9Cr8P)&x3Tq>f$Q`VXgIAgFAS{ZB=mPU(fLfUU3 zPMt2vfKzL<4je%f^QIiP+AV9^H{iu22derFehEu;ReRjUC6Va0OWXpU(qd^YXk&DB z5T_2G8DMp`+JdkeW318og-7CI!RP~V6#5H6YGJccSh40Fn_Ek*B-rUG32p?xED>TD zj@ML%lEz@68teOlYe{PG%SZ;3m`Yv|q1XJ;5MK$pFY!XKm*yX1!S%mC?&a@-b~E!w zT~%+0T%;D+4gY*!f(d>#1st=$1jXPCyv}Ix%k&f3ExiO}l34{T-tpL|u#B|i)u@Vk zB3$vSg-&eQ(H$W$nyUdg=N=}1ftrde28W|&wpaAYV8d_hu0zbL&RAwh$}2QF$vg{H z4Um`SKrLYR(n8o2#YR{j8->MPJ3WG<^)QKh5m0c#QcbN5n~*nrIj87HdLJ>1Z{ym4Aun ziyi+a2wP`eChZv6t{VYGVQHBI9JRIh{x3NzI^7Zy5m_3fXCh)pvW8dVZIz{TTI0a6 z2Ae)*txdP{T_B7W>yoc>ue~v{o3YloYv^Xe2zAyxuLe711ls5+!mTE2ii;M`VD9wP z{Q;&P<;8(3l7%J^OE$`o=BhseUOfatMqZHGOY3QYun=?ZOa1s~vRKLdkqA{D8`X{s zv$a*hGNePUn8Hh=!V*pXqJv+0G6^mhOCz!tYlp@d=3J+gH8GUURFRBygI)+C7fvOw z$#`m^#k*@c%&*YqDmrVZ{nHNYz-pxdrH83Q!|S_rOSw@*e)1tSu#SXilPribK# zWqM_g6~KzS;8g6poYGK>Ty)%yI>V-uZ${OEo=JHnQfq`W#z1c*%?=~MQ*JANg@y{l zH|(4h?INj=NIEOynW?|B3J1BKMbfaCV1j5b5H_TMEb(Q5A;1biPCX?=X%+{3c!e6R z5MmvZ@)D0^v7j}uWloA?*=f~6kG)fg;5vV$!bq}P4v-aA8&9^6hE3AZI-ps6vDrTG zRg%eJp|Q&0r4v)l!Uy+2y5@|0ELttE5@?#TSj-$%TYo(-EKWhyGfkqHN=rPp=p*aZ zt51vaO$U8olzC*-R^R@X(bZirZfzy8{QovkbrYLR9^sb%KQDd%E~lz^8^9e<4-o%i zk|nHeD6C>+IthdmOKcZSrw2Q=CG;RynK7VFf?UzZEnJF*G&?#*VYLqcFf!>J@p33H zxVc}a7VD_R(s(k`gt|d!`t<-Xm6LtpM_=|U>lcyz7s$~@3%`f?9=9t8< z_{!+4{*cVGi!Lm?I@O zdLkH3CAgAf5>}DL((&!@`4!Zzw~UIcqzcQKF0EqFC(o)i17%4iBdyYC%(g++sVHWr z9e+4UsVy?qTGK@4s+w(fB&1XceB`4m!*>%&Id}TFEUM`Hquaq`X|hL7Z!5 zJqHA~LRfa1jRL|vJAdW*TtSKiCkd-q%fM;)YJps>q!vN617RtwYB>}Uldy85IvNQE zSnqBpfljvHp2wT>9xA21+Az$nnN&rzmKG}EtQ`Otqg!mA z^(`c2t3*0I%0;`(!^;naWH(#R%9cB$Wv(&O#KPiN`KXw~jRdvqu{X$)dB#*rLkWio zelgfGx?<2SI!RkuZCURi^%UT)*&wNO|?%ACZ{lNX4TV|c28^{snvzR-#x>)BKTD)dyPU&wGIRT%I7DIe>S=tC7&{K-jzs z$>3C3EO}rJ*1b|IYbCFOD555v1zF$sD_yKHz{tc?D6e!}$86{-$^Kqy!HpbLut~@q zx+%WIJ8^5G#oT4{Z0YnvxYt=MYby-8>6Xw_{VnCP!gw2YGtP7LkH?lLL?Vhz=9!>4Xw@abYknOgJ36K(u=S~zEJ<^tC@a|KAu`Fb z*4l42Y_p`9ouvUB)z)~)s2CKsC^d@{CBgE>8ZY!z-N6=E#JntU5UOkfKo(jv#W-ye zS)AHMgFKEJW+P`6zPcBMh03H+tsyq~rJp$_HIGqe^aHr`m+vny($&$_VkN$sNhn)l zhT*80jS`rwI=oYx)0fFg`BVdZsaAVRL#zF>t+g{(N`e_-G#3(US+?I_%S;dsnebWt zfZvx!pn=!4+H42Bo-Ee9Qk_;2W*lTFRV?Gd8W*OJYbTDaQtgn#d zV~8Q6dQ@z}Lq1Ax37(A9iq_CgPIaSB-82sc=^A{$-?xBd9H7@Ae}AMCXoz?iZ&W+j zx9dj1`L`v1S5=w`&M0qGUWwugQHcVv{?iXuzO^(zT}Tj8)%)6R4S??`ZXV@Jd$np!OLD@X~G86XCo zh&G}0>mV9azy!jOj&QTCpG*3nuneSCg*jkGm{T+BFQbhYbb?eGEnqdTBqT$E-6`luSb@1QlqgG!CDQ{n;*LTN zHoVd)wB~?6HajlKOOKCDDK%2-lI*C(ujhR0a}j8BivB8RrG%AYVRFlodpqQR;g`FT z!6D7At0X%eb3+mH<_tD!CJO~BaWwKucDX{*)GL=oAe`~fJV&hQ4S=vxh-F14 zHx)BVzGUuzoxBz$9FU$g#Ftu4nAI$m02H}OYT>R!mqU(?Gg{1_Ys?)W^0f*ZdA?qX zMrW$LGV{6EY=P#fC~YncjG67T47Ik_QSzDmv(QHM5_vV$A%ac?tG{3Ck}$nS(!;E( zUT>&pHtXMmg~m2(dmM~0vG6y|xgow<1*v6Cj1i|&TRw-%3xWKbjC$rh-~-%(aMob8 F{|nNDnEn6& diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/gloomyTears.565 b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/gloomyTears.565 deleted file mode 100644 index cb7b693d815ff21d5e451226079313d80595dc58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153654 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 Ue{=7d5B~n6|M=)PAN}Tk0AP7W5C8xG diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/gloomyTears.bmp b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/gloomyTears.bmp deleted file mode 100644 index 1e5ca62c81703456d0fdeb2467f84d9498dc96dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 zcmd4acbrz|buW4sSzRDN^xk_Jm>J5z0K>q*49pC5VCcQ~A`lX&_hLz?TE&)&WW_ac z?D!^5oO0qgiIcd*-IgUcRfHtx|NC8g4X?Q_I{Mr=K8Mevt>=Abzq>qp{Z?OV*DR>K z@xAYgf0h0l=D!*5e%HIs`2V}#)y>vFe;+vJUB!R-#k<~h!G-7NxbUJ2-ez2M@rB04 zmt1sNyGt+c(7wwRow{}D+^a|TK?C{?A3AW%sG;M>jVv2GqI~@5i4|ifPa0P~VN^x= z=(2Ic%Ek>JH)inGhA3y2dwTscCYuDaAx)1Evci7;5Rg)*wOrJEnwrbwo z=}k>@7B8w_vZP_*!n%bE=hWBFsH>Y+TT?Zodh)cY%BsoblPk+7mXEJ2FUxKD_^}hp z##BrgS22F9dD)neAdQ$|;k|>^Z4&ywgpLlg6kRKQ2$|$m7R4odcGYPZ&3` zV*KQZw)R_^~5~4H?kC zZ|`2+dsxpaI(E3c-DQ_ucFCosap@)PF1z&d_U$@d-o9(+PQ7||v*1IA3>-Op(AZJK za=|MmjCDs&ZB&%UWw@BOHJLCr?xmtwuFCO~Cry}IHLaOeI(FpnQNxCe95!h9 zkO4yn_3PWKXYZapdUo$-^yt>r?RV+av7=jUcj;x98S(Gpi!Z(){+-`OnFR&5yX=yV z?b~(k*r8kJ&V73I?BBO9>KZa=;IJWsM-Ck_eDL5w{re3X(0@R`zWw_2Hk_qL_b%PK zT+yX-M=R_UvB;NPjF>OFxNVr{#|tmK(D`zE{`uz@XK(u$*Ky9j^Ugc(-Dm%u1=H{N zzg^z*p7*@(eeZM3i!QpzLCk$~?yhGK1FpaR_n!B>+g)F9@rCU>v>QIG-?An3Cr%zd zb^je7e(LeheD;%H{Ni7H=}TYwo4@%R;LXLka)s;2VCz?#3Rz79Yn97QgWn+en9zJOB zfIj{E^yu5Gd*9yOd-mwkuXm4u{d$cZHDt=fG4*xR7B|msUDmLswQ2MEmaQ9CY+k=C z#)hS9RyHqR*3jHo+c0m&yt?YSbEeLzt*V_lY4)tDxwETdUNdF(ETgIzlWS&7oKamd zeVS43N@gI`X%lA6m}tbuX%(|;rp&FK>NpMas^`~FZ)}*+Jin%S{;Z~kn&yVtP4%^n z^J@}tDWjlH8Up7nmM_4=9Jkpr_`Fv znAA9T=8~qmg$rsIHP)_fS+I6RQ;gQe6-(!>YH27wHm+Gdf9aySd2=ATqGJ4rQNsre z8PKP1?{2-icR^t7bE(^1+P>Xoh^Qzngd zcd_gY~;>}fIPR5#3jquP%9i=-Rxh&P+c&rF+P-Sf&eeN&uidwMT`|_~+_rMZ)|ETAuG+G3xnZ}BYnQBF zy~r@xvZ2K{+cvG(wSCRbZLQn4uGqP4m9c%(iVdq5x3)AiFQ~1bGkw;~iPNjft0t9I zO&&L~92XrnX5`=zLkA8W)OS$-UI?jw?;gFnb?(}wL#Iyd+g~1JR=_MEeDTErE_4{O zqkX$8I$YkZQ^!8tyAJBt8!H$Y3o_KQl#Ll)Q8sGggfSDwjWo(e4<9pP$f)6ih7ImN zxPR|~{d@KA*Rxm8uHC`@iVht+v}@P?lBDh22H9VFN$Fp4-s0R)cg{awm2mw|Ae`8= zXR-yqeeZkU`y2TEHE7S7z3+YJ#Vudnu1C*qb+e{kf9>ICo__4_|Mm;t{?D(y@ca*7 zdHI)T&YXVz%;~`Rh3Av4b}o&Cu#eU)=aw!fAdE|P@7lR{kFM6lx|NR`Ik{q7^^}U~ zRh4sUrp>OIHfu)JtQnK1O(BfNmY0phY=;iS5Bv1)*}YefZa87rE?4yK)y?-~Mh>Z( zSXNhCwQ#|#l}qQZThY9E%~E62+GShTw`^FmxMfMhqNdpk8fMO`LyEvVrEa!S}mo&23pUZ^e>^<%{cMvb15vlKR%A4Xc(dXk9wryk*hcWzBWV7S_eD=Ff7F zriPgfb=3`Z(+X%;JF>(2eo5nOKXj0lOB>d$Xxg}P(MHf%yLjX3g4+qqMR&cNHHBk&ID-($qk{-Z~b zyn`wyjGSCKrn+jvEUYZGZB@;T zN@H3TeP;B;^3iYy#lwd59Xz1GZ+B9-(-ocE{biUKO1t#3OOqxqz2qWdH}sH>mv_0M zLyxXk^bS>|&&Xi|$BiCVF@AJ;*{I2tW62R)i{s#x6GlU^zm6F(7>b7v=|6a2pFWsm zuP)uXb+W3Lw@1y>D|3~e(n8t-|*Q_f8?wG^rip& z);~Z0-1lC2>F2M#_R1S?o+;FZ(2d&`>a3`RR^O!9H8=4wAxwYnd_^Y;ABHx3_&}=B z#PYFKlO{}?QZZvHF*kX}v`IK^W%;OaV}?-k2KDblS)wC#?R*6_$@8Ip8@{yuQznju z%EtLM%NCJPjcZpd+_+}xnib7!DQ`(uCmFU0N*>MucCSa0>4SC%(Cl6&$*B?h%*}QJm!p-ZJ5^Y44fhkclmMxjLsCf?N zGkt0~kuhe}kf5$!JuM3nY!s{1v1^x(-Md{uYLHMPhYcWk5#;zWBPz?rOr1Dk#?(rZ zH|}@#R7*rXNWN6MBaFzsxRTW?n%1uZ(xuM6e)U3^M09Ri7awi6Zd`uuAY`{~Zr!nU z)sAhew{LCTy18}J`j+);m#$mAc*EKy8~tkSlKA1;rCT;E-?pjMt!)S4EvvR~UA1%j znmxPL@7uirgagG}R&H6p-0E4DrujAT9BZafkVs*C8|Vnl5yJ)y9@Mu_?;c4ZojY}O z@1f;hP7%2zB`=K^Tl2lYGBYg5fd0LQ4jBNLKstHiIOG?!H*FFjGIi1f0;O`on8dXm zkf?PVK6C(z?c107*STBQD;$cs;zW*&RX7FJJ=DvNWdCIdzF;760l<6y1@9x~Qk-3K z3ALNq`94zhe=A87zlqt>JU^Zb*mLK(n}a*=rR^?tzZ968ue{(L!+`3?0%Remi&Sgi7JpazQRF z1^eyazn6s~tq>&l!jy?+h`+k3VitpX`jom_e5^Wd{OoPIP8Z;sal&(Px{>r>vk+ii z4^BeqH81JF`F&jKrWHH4gu=WHkX`Va#YX&f-O?@VmzlUPySWz!36*=>YCG@VzGi;` z+kHFN9o)Ogy!g0o`=*sH!zEF27B;mRm;@1sTxcJF=r1b&lFl2i~I zQcRjmprILmvQPhhy@w3$55Lxg?3g~aqGmedr7G0FnNzJvI4&lR2WkUl+Q-t39W!j` z(EdY)^y}NFJ5NH7u3ZR}9M;?*_?;AalTfw>%7+fnFcK*_PnS_D!wJ0v-MKJ4ckZt# zdEb7wa}R|xoPR+m#&m(IN#(n?uD$#AlaD=o*T+Bh*k649lRy5!w@<(J%CG+GS0%CQ zQsbHn%?(Ggc;QR9?9#X?+C*WLwYN{fvIUC^?)0UubrV9t`pI+Nv#>VdAL z9w&-@3_4#PbiT5{rg@GvMCYo7#_Et<%`2BSwk}!FvasG*+B|pB{8|<+z`|+D@szpA z4II-5Ca|(O5s^qCi4c4eKm0Q4mn^Ca{8n=>jiD6}9^994VXdyf9y@m=Ab^*Y891QN zpn<)I4eL)-5m?kh@;VI`ggRqd<(yen6psakMZoBGRe1sHS1sPUVFfcJ(dz6bId@5h zZ}O6S3B^#ETYqx327vpM@8eI!UlYiANB$aSZ=o#%@7|s30M^7e`-tFT6pHk!&Ffm$ ztz3jRE@`gwnCj=uoXLAOm7lQ8O|hZyd0r8>Un~F}8KGT@_}ZxMa%ywvBvfnGE2MM! zjU8<@MpsQ7&v2`$o?JJpdTwnsITchJ*Ph(}k*6N|{&)W4_19j0>y0xhTV1CmDp1)Gi!(_T4({B9 zt#5K-o6;d~nQXQ498;iLxFf>U9o(O-+r38*wAjfacnaaVbHC@GXT0~k_oOP)v15CR z5G$Cq0>V5_EZq6^Gf?&X`kCY@FJ*^JE^5+~H-x*3b+&j!_{ zO>08#51EAeZ27bMGWxY>_%qmEw%Oxw^Ho@`abux&A-|byD53W7F0plN5JlT zK7$ALh59tv(t@CSBm)oTP&b{+ZcgD{q?J+9X7Q#@pX7`*mg0=VS#6>oR<(cM9=&^Y z?b)L%8H4O&bnZm44&Ayyu~Vbo#B5;#hagUM`n>m@2VaTV(&YDnw*=(h-r?=Pab$`# zLC+q?%*)G1%&nXD;Hf*l^^JdhfStSYsRMJdvA=eI-K0>H@ZsXR9xsQfD zbLYbO-?>NkD|&RZy!PQQ<$Sofef#iNyK#U`PL-bX3og6>eyxB%b?n#hDo?qKG8fFETm_Hke4T3n&8?K=g zhvq;8bt9SD%l*o70Jt4S4ON1w%S*Dm2&u`E5hcg7X@X33_J z!}{~{&}vBPNtI}y`1}_7-kkJsD`g3kepic1}hg!cp@$1?aHqNFhV9O#D(1aI_ z8x2i^*jSVeQ3*HRiF25==n$%`t+~;;b0~XuK*OU(46zgxV)&sKu_TmDe*3TQ@S8k{&{Mni7gbh{K6UE0Z+`t>PQUij8wGv=%~~<$AvEtI zEfF^*Tx*Lv^)~O;mC4YndpB`g!`yEEge!LGLbt&)FKOS7ACIf>q6n}RK7Y3yCIcV9 zMHjj2i!brv0!EEx>C~}3bunU^gZd5|+JD6GfrS^5v@HW$V^aB8VwXoEth`y`Af8kp zYstd8)yo@+7(N*$YEIUyXevfHoeW>1VFPA!B%DzZ4KrmZO?dHw*$W$H&7U`;Vea&L zF_$^v6Fb+ME;06oy6KIDHNCK*7Lb=U&&3CVf$&$i1ji^W<)#D$YR`e5QF2Np#2g~H zz%oR%E^lNH3Vuzh96N5zuwg?7Afzsx!{MCxMb%;-MPwvgtW}dZ0mdVHgWO^9)yZiB>zfW>@YmQm_)W zIr+7cTwpmNoRZhilMj@HuVn`)u;OhK;A6$RsWBsmx<{OfUZA!bXv z|uY|5!OR1egilzI}QQ>?dy9i&l(H zju`n=V%Q)M9y@y21Su9{Mot(r5_qS|>tNc{2+h*s-8p_wVgh-GToTY z%Z$RhQHWte>zh|Qb$;E9(Ayh?X6jhkD~e-^%Q!`xbZwh!$R#Cmku-YVvt!M!?W+^W zN#w47&B}$8_WHTgr%oAPF=5oGk%Ors788We;#YWX$b@lh-Z4S3RTBhXguIE8d9$YS z4^ZPHPSiYS$>M^CgwsB`St!pbG$GXFT>ScI_&zb~I$csRR_)%gI^w^DCY;xqa@IHd zcC9n^?_Pg!??%I9|DFwP^F15<$^LfB-@4_*FCX=~RV?4e7B)yz9dKE5*Y94YOdN+@ zyTMEh08bF^&Mn-zQyX~2zB^%Mow|3Iry*L@d(_B5@`CU&Mh9hV?(FGsx}c#3e%Uzi zYmyL7$!iP3PRbnP>W}bZ%~bIbvK#AYgYeJ+$XIlQH#Mxij+jP>{&4yf-ZO%RBqDSe zeeg@0g+yp7jNL$I3CrdQy3)kQ*yHRzzrAM(q;EfoL%i$V3{WvI0mu99x#1iC{*~8X zf9k_!BDdRybxVohrunnvexOO@#1$Yb1`Xqf){|fYUc^S=$`WDtG|rz% zWCH>Pz9nN`j0H|MN=QJmg|N#(Yc+CllDQ>pQ>0ob947fm`kf&0z+RACXM1@6W)9@i zr51OwA#cI<@PSRaHOYDY$^P~<^0_2_@r_lj&D;pq%Caw*H;ePi{fbaOux8ozw`4 zJdbN@8r1V;iH~537924n8k+_n;hXp^VKcy0{40F} zr@lx?w*9U6-+v3g?|!#aOFOBYFzU`*uld@){OxP6y!5MI{mNR&Dr4v};31CirAx@Q z=-*GiO0S`VBgMjP;#Wif^5#0AzyPvuYzrnfXvp9`Lx=VoIG}ew&!TTHX_5qY-`+i9 z+ovb}q<>#W^Vj&3L`ow*_U;b;VCy&zJ8q05O!9ZcBw2qI61pnMCW>zBlKC(QlBhA@ zuy@m;eL-Nnou~yI5DaQb9S<&2BHN->lA3}|i*^KtA^a|B7Kp5!S2taLBLfOL0G3S@ z_cCsTY!j2o<>RJQh|%El5nu&g+srFN18HF)iB#J}yBr^C;CGv3hRrK?ZEJJJ=A|Cq zA9Q}?;AZ3Sfwn7m&099DShH%;l0|c=l^8zlvJe=N%+_3u!ZxzWa8wz~* zk)W6eJ{Ogx`R~MUqWCwkeD0U;eD1tVPB4Mr|M=QJy!PtLZ~W>l3q?4Fd@Q_GAdG&j zn6QNqo3JBff;b*vq;oHVzk~aVeaJmPnVBjB zt#-f@AlKHx9U)x`6Us)$VBM6Lk$@CM?i~iER0?by$sx8Q2euwPwB0}|J{lQkG$~;j z^%{v{Bt+H}D317rqj7wB)(Aj+frNDz0Bd-ZMzW?!vF5=pd!uvKI*}oYJ@~7=vR&LtRvT{Wec}le- z=q)K{?9f3{!g~!0hx5RS@{t7-s}7T2WO>mo>zLB> z;64I0Sez3Xc1RQ_uFs-7IE+O*3(w7m_Tw#>%$6$;ZnMZnPV8WXZ6Wl^LtBiTK<=?4 z+k8yn>q}3>uycXmRRP}Cg;oa7q2gNbnbNJNRPelEjNs$x^8n-Fy?~bsrE^ExaztFu z=1z!uh%l1BSQ#^!y*%^mBfwGdw2;EHrU@H)BH&y?bSlpj_0qsP_)o+f3EvD2d*akc z)L3|-NtqrT;2?a3?92|>N1M+Xeu0+{hx|?af-oGVBuzP+_&pb)=gQx6;d$#pgUse71X zVu@nVqXiYJNaUJQgTWJW4J$Kra9{dK;xvzw05SJNBRPZPoBLCa%JE}`eFgI9mO?_j z$IK`~1Z_a>RafpnJSYt!4(vr*8>ps8cR%eEC7*Szply&Zp?Ll3#c~CuK}yHPsIhUf z6*;l8CCw80Q|BvnuRg_vm8KcH%d4`$vx)TvO8v0+o zvU$tKWi066S9=_-IAEx|F^3>HD%K<*W^(1B0ANbP5`>*J7socio2)OlfzSf8Rv2((vNy(dk3ZcAjQ=Ut}2z#*(z{{nE2}`@eE!|-8lyU443Es$~ zD16Rgcy8TI~=&IJmfMJ!8SP<2>WP6s#TGzhMRdPglx)RBG|+LYUsvq?Uow2NonqZ z7T6E{+=LblM-#`7shzHDX9j@CzF1vYzQ_-a9Xqo9>SH^TehNYjiGYN{xr+t7hT zVF!e54L~M^*S0oE{aw6pF8&OFp6N`fViPBTa1JCfy$U^)8wuXz^NHeQ_~xXrpL13( zQ0XvtCR0=lE1hG2%#pQrW#l+v9U$zo19TFJ3k_lSwza!9uiA#ZS1%THCRl;jNr@z^ zOnRgYXDdcmtf{UP-ELjFVAI+bnlOMIKf1#JA0zMGjT3z4`6tWLwlaqTfbg4A*x3O# zVQZ4$bv=eJjhtIvKMApWFqRZ@i)~o$0ndU-J=ddbDiJ@};x3Nw)xDL4Xv zMLtzBf8Qg^fN+t6M;3chp)v(#V}LESnOibbEA1}~H%2Mc;Qo$Gc~0;WSZqBha3BD{ z0>2qKDq=>Fw-8de$k|B!`L}UbQl$Tza`tx|Iox3HaSfMWeyO|r*oPke$&bE$=FDqv zz4a!h$EPH9BkBr@v_1N>JBsAekx>>O6`sG$lX@JZK+m$H9XEo)-sfgut?JSVT-bK>~!Yp&X5 zpj#9b%3DFn>3AUpkfMLvt~g~wfxKszv4FGi!L$@6T*ARyD$k??c74EU%6?`(siv10W&n` zx@rfUQaM(!4Ao`$kbX246Ov`#>}kAq>sKz>v1!%*T^nG^y}M=ii)AHtOmcv*@8R0_ zpcKxiJzT`WG{7?_kYydxE;eyJJGMmXV+q%O0`Er-gq@y%&21voiIP#c2J3I-lZWKR zI4NboQm5LZ%po2Ai<=_H8`D#y3BL>ks>RSja-X{QiBh1jc@-RyAZc}ybniVcyt^c*U;ek}fnSTGK8wxu`OiK3 zi=Y1Jjn`j&>%ZP&@G>+a&#FlHARE{4#ZSn-DX>L%L)R_3a^5EtZ zSM9p?n!Uz#C-xZ$VT6Qq6U)aAhiX?6QbErJmQnJq!YJObZrPeui&rdPuw9R`b)*n^ZBlP9t6}ZlT|gR2_1;~S^C;g7cCmF;dam#; zgKNtrIU4gEV<~t`Bv65HqS#pi!i9%9F`HX!XymHm5-ICJ7(XdN7=9Tqdv~mNz>vRd zm%=Y^A>|qOW2#K9L@KJVM|sdxR^?PZx+*miYLuWWN&gbkR(um!62E-BGHv0PXP60w zNa)GLM-pBN6j&xwp^}C?XI5}s{MI)0WG)mV&F!RE;>HiTMyUbp6qwDRvs2_mawg%+ z5fqSUe_4@d73F>b$@hS8Q9uOAXMM~6ZB+h_1H`$0``^2q{5(t4uTS^gJJ)mL7B<4hrY3E_4$hLpuJZ`}?*%CMmWF-$MIfy^P;Fh&ET?yQA{B%Q!+Myhy0yAb(VZQfg~z)Z7}>CXa>fc8p2u!VIFBb z2lO%ky}or36=KD*#@1y`LdNuMTDNF&^;GsCFG_%yGO4u9=ocvpgCjuw50Jjbb^};|3+ngsqclKKV z2kpc!F&*;vV4JJTiY1m|Gnhu)1g_@1@f0DXZiQ{HA~-f8{-0(Xl-T7m>{)F|)eDIvd1m zcqF3WI?Aqn!ys~^bX)o8`_v4b5go!l3Pg%X&LA>K8KF7?H({%~U(7D5`xO;-h{~PR zoTX~Cf%pFlsNaFQKipTPQjIq$sp$!Sz7e%;B#|NKv1RzG;=^lPV2pC*4n zIMYqj5v>n`_ywj!!BG9@enHX-ZO8Aq^Mvi~ zw;b~^;SA9?U4Q7t>kir{p>2N z7i@=?P7g2mPm~)+d2c39ViZdjU`O$%f+?B17(B{1@v9;&4XEKAgcHA1Uy4fDzlXTL z+Pq6gIcB9ro@D2YBkwn1c&uAaKqvs24VxAx8*Ysu<0Jo;SBzYO7Rp!$c}3BS;hgY#Bt(Rmz`) z->H);P#OY5lLUbY6q}@q$T?Fm%;+OQhY#?Qxka5$vXQiTX#zk5nk7vA;b8i9M=G7} z*OPZC2R>hll%$tO9=hwBU;pRVUiqcsg*V=K1AbFm2p>X`2u*t^ieI|+@88pE!x1tw z$$2gays5DW_9~m#TGb2q`4y0sAd^q_4>UF4mngUF~%lRjh z91RQTgD^&2Hg>2&QGq;p#UzEW2;mE)cin#V{qMj2p;I?MaNmum?!CeM{db)-64AHa zd=#SX2FOG+DV&z0EqWtLGR`7>h{V~yJ0dLdqY5)Hyk1eqx~VmKfUH}#ekC9;BA4mL z;90Z?m{wO*97AGwv19`lZj(a(269sbLy)2;u!5T9@`C2iZmgf>hte=aKP8A(l&LO{ z>?85VzL9?$43ju;`}Dd|+8RtMb2|B=nQJY0L=RcIxG2G^pTVfKEc|;ZbVP^6XckDM zlo-~iykd@uZ#9@MJ1@yWOoY#1oIf9gp)B*S+_Dv*Ik$z43hkSHZ7>eNqp8Q7Om}zFg2e ztG#=7BYgQ1-7Ge~vbBjTel5jm)glwcCIM$f+(q(aajtkMH8Un7vm{HTTa0MXAq^>= zs|c)buddi8IpqSxj3h5{SW!^v%xUM^(peKhZwI#jvA_Kqyv2-lp*zd+rHy~~nP-0d zga3T})tBBp^ZHxAdW+~KeEIF&K+KCoEOk`_`g380FBB@>JCMm)skU_n> zDGZT1B44huVoYt#ren{-G!C{m|p@f8qmoJ^tvOk3Mvp zFTwe~d#(fIJ8r!SgvsL6uAw+J>U8piHh5su(Zk_rHHhZ4;|dua83+ZUBQ1nzW_l}r zNBLYaFe0Ud(3*`8v9d|! z<0PALqzJT$r1b2mp1PZI7$SJkz`nBdWjI)_TI)Hp%IeY8!JoL7gH%0LxmL8Unl`m! zT2(oFSw)`Y-r5ssMAy5&%JF)nKJRY%ww9Q!*` z_@>>F%L2KHR@;(Ql5iFdFu1G_?%A|&=LY&SX^t(Z-6%xx{6&hm1?=WwebXe&FsAVB z!p*KEE}EeUR%#Fw7%nPpg<0h%(xNYp@|Mdj#puyPr&o)k)uPAX7Ip%F;RxuzqeFLRhr052M^6oqze|-?&XLd z2xRHg-f<8A{695;1ZW9O|6_Q4y929p!duwvS06j@cYpJRpTF?qS6=$%nb%Lh^{Y1( z`f?xe-s3;4;K)ht-r1c3EO8+hkG}larRak_d|Vb9jt}GMTY7PpQsC0L?AR8w=#Jx!ft_W+K+Ih4m@gSemr) zv^V32dhs>RA)pCsm`anG2aI==cO~d~^iXx>a$N=t=*9l!JVduliJ@GG!v|~PBzl5j zN+7i6gb1naK`?DByOF${ws09r-N4fGKCkaMQetL50p zw1HVJGL>9{%P2}uMX@2vXfcDRisWkQ4Zz|UbWS5vg>9Wbqp14iKrYzkKbZXu@Ft4i z4r%`be{)jTBOa|Y)ngC8|C|5u)t7$p!b>my;-!~ggkKG^F0*n)|B#}1;R?D93x!m* z$dnMCfBi|UjFqPzr~d3uR>?l;+ebXSTaI5}hqgl)F~=xr(YYlGbJ{Z4xpu`|=Fg2H z&FHEzMK`lDMy?DH)W}`N`>Mu7Nf-RuDi2{S6E_X@)9FiWG5RwlnY4x9k39LnM?d)B zhd+4V2Oq!3H?(MfB6)!~m1n~D#8qvPrldyO97&C(Iik&Pf<%w*B8(Ek0#WP}1Zq}x-WlL7dNWhBjuRX%>? z*s;S9YShAL@KS&`LX$-bt8Kp`!JtnsWnW$N$WnNY!BV_Iz#|BCh|h5RXfiz`CXyu_ z*(r)@i#EqNADU>C3){M0?$)Y3+uQQ5NY4Vl;qJ2_7R_oHAe=l6P7|>BXHLjybA!hl zmkTpw*G7>ko@c_BWo@mJaj7|?!!Mj)wYw6%}e!k0lN=UJ^p(7$pz#uk`yeOoaUOxzhXri3W2U$;uO1E~uzLZeo^Il7p(u z)P+`Tfx{;PE=47~kGKccQB>uh^)?q32j^n(|DgP3P_QNx7wp)&?*IARC!hb}cVBt& zXD`3>%hyi7`sQ12xOj^f{IBEXxYK}sz4a!AO-sF5TQp~Ksmu2GY4w> z@jcfZ+jI3%M7Zntl{>FGvg6p{$b3lO>9tqyF>XA0;KmdC(P|*Qkj{bVW4qC_9NIlAQ1Euv-0GW?yspO*Q^5JH6{NP?zPvlPF7v4FNDM$a0}Z5_SSNbk{U~8RJ+end?U6X7Ab>QD6!N9(7g?4h9GZBdl|6e=_m*Z^b-p(e52I$y!hWd#rePL=gCQK~jr!&r*3Eczmy zzF!|1`^0&!mF0p~#Ej;3c}nDlpDJ8c(K9D7TNu2|?y$V+rbSB)vNs)8kXsVIiQ+## ze)9s-^{j`Ugt2??zWHCi^5vgC_rsTe`LkDFdFka>Uedo#wuX}4tm@TAR}MW|np!oU z)YIAp!{qm?pEupMp`HpPA&oOiL*^;$uPKw{RchUgY@(kkvJuv#Gkb#QHVC-j#-bQL zG6wNv_8>AwTI^z;NeUkQ2Z}w`Nfko;W7vb9juAXWYV`O>j+!~G!mor=uRO5r+N<}1 zFlqbX{Wm{!|ILs~qXu4TGn*ITrNRunAx8H{8d6(Y(Sa?J12comJ~y1$chkuOH=jIk z!-@UZpT#c%wu34IJ}%_Sr%K7B7TWIIwpv#=RLX2r8V{!%S4W9rOj72q*DcClSCVdG zzP7uzhU_-y(#Z-w`TW}QkWk8nNOS%u9vIw7LZGC+(W8dR6-@mZgi+(5L45`f0pwoj zoQn@^X-B`dZpu_AiO!ENCHAKqO^(@e-sYktxnL>srNhsh3UkJZt~}TlB?nL71y%Qs zi6wHaPs-o)7^G2b&k}O^5X>zdJV*iFk^5}bu zP=apWEel$-QEiEoA&gzCiUsp)!YNTJZXU?x`HY<<121Y2F%g2<62&;$#YBfR`1MSI zIym#P#^vHE#VGQiYNCha9PK5iaL!asDVtb1x`JL*rWO1s(qAq#wGfK{c_tMREUyn~ zF>j%mz&$sFREXVBn5lV8GnO6qGP|tsGjD+6OrN$x;P;w+H(s;v<`es&*tqVR&>PV( ziba{|(?FbicC>Y4D;(5qx5D0SZB^~Xm*Img_FV5HG3V#58Fn(#nz<7` zZq++(L(AILi>xY*8dYl@#^pkwq{)Wr$X^;Y{0#9;%O!#Ep{1dT=3rIoS% zL>qJ%h38>zYY`^`CEBv5;B=+o@_^1#5WcAcyV=x9+d$T#<8nGDjm(Y0`JBkb)oJpE%ahYC-GU=JoGRmoj~zF3*s#o_D2i_bte4UQ!4|G; zbK+b2ZeizzxHKRRvJGDvzzE%fCLwm)D*dC-sZRO{7=q8ACSi){riTKSN`o^fBr|``}WUYc;S^7Up)Qt zOX5fW^ zl%Xh^q@kEX4!=DklfS5{D9Vlq@yIdG9Eqr3*b!+?dpXDWx3{cZw`K{q3>a!Gsak}P zRZZTnH?^?$5N%0@4Hz+E(9mH6sG6fj4B{xL7#}fBDkv0K9852up*M(R>;_LwZ)eqo zZB0lDWxg#*!!^K~Q>W03d2zw+#r;~(5=c!F%a#Ictrd0$<38Hv#6EG$MV6)oad*@V z_zhzLt1sf_@N1+qJiT^;i8vK+$@p=@%gTn28Z}tWDX~btz@PzH$_KLjRBjW(TCUsa zEa)y5tSw}5NMssvhTiDm8g;U%Ij^GLO~6P(zAo|lC=M2$B%sCFqd+0fQkcE)8zNZ0 zr=mh%OREIt+rzW8&pSur|BpTMEV9A5l$R}@|G~#jeeJ7%|HJQn=Vvdx@aju}-!reh zO8#;QT2e!%w~iB1`*3eAmn_-Cw>@`p0d`a3QDAh_`lY%&t!jxR0d}sIahgE^wJeKB zfmj<5^TUiIWE-f+0@4s;&5}X{`(eUqvfmalrb4FEt`o5SWTZUGc~;KmUw!X5zQ<3{IaiM>IkI16 zP^bY%4sF@LZxaaPikO%N?0VgEL^I<0sK4&hOHfIuj_YQ8*~szZ+p4W~81QZy^q+Bd zK~=aA9?}9x@+ZfFN_k5p;FXF!{KAxH5v;5T@?vEP;Y6`5EyV?wq-wEHTXU5x5ymKI z)g%|k9pxI@Ay(<&Hb--0+#p;8h1VUMMHph=lz|k!)B~Ecw2BBI7JVSg#txHcC%D5* z$Pxx&B>DGxk0=<_`LLTeo^%(Q)%KxNH~lxlgBL#e7;1&M2nr{FR4#rzt^nI$cSHN* zcq4~L;ytI9L093lcOqI18;2Bra|xPb%0Y#X~MI;b-nkv%^NzqCdc_Hms^5gj710)SCO13sXa zA|sVUbZA1L5ZquZpq%+yKBCDSege7q^Q3JD%;PwIPI8-MY@R!qbiF4PHeKPU zu^Y*LWX^J+}Mgu{|e_?z;A>y(Y&FZbuvF&FQ#*kpvDy(0EITLZL{gBXO3^XGNk?M0ny@ z2v&HMPMN5LQ^S`=0=9(Tl)t%uDcKTDqGaHL-@<>TG+<5WnFX9vNFmxh2s%%dvV_W{ zd`C9PeQfj8&Yn!eHg_n9e-pD2Lqp`8{7hPLaKeSD>kUEG(C{EY9WST7m7& z*B&%XZn@#GRZ4c}7TlNJ>>s*B5d!w49Nb9@M|61U`Mp;xUcmnhzxs^LDLSi5&*Nip zr`fYz=R<7|4M2w3l(2m7CiH6GP=+PpPxkV)BIDE#GlFRgp5mCcIijAo0B`g{96A7g zizu@q!EourFV9svuhQ}bTdu1diC-1I@;CCIK=A)j{JvWpx?}sxxRGzU>G+@j*~kCo zt6%=!cfRqH=Y9aZ{8w)hzHgin|FzB*oXjokMD35zDxSPKT(yUJVz<~9Y9VD(SsBX? zpb9Tdh|41O7b;m6(XZEgAG$GN#}q>$qviQfxqUQtZjF3n1|Zp5kkEQGj0|o#d4LgW z+sL8X%pz>Zv;~1Yh0~RWFB8ai@LLF?fzT`F z&#jR?#j0hv8Ill`CP^BU|G)4#96Y>aRaksu@ZA7B{j_VD9K4 zS*dMu+!>9++FHTi$kDNMu_}gWJ1L7y-?_-LDBjH>`orxk{~36RVE6)C(cTE06|wIW z#OYS$vNjkFhE?MJN+TlYupF{@>~JxuAw^^7A~GILp1qlc8!(h-T^7$aJx;e(_?^$b z5=i+I7giJ;740=Z_-*h@vrQ5FJGJZo=9k5hUIOi~H}s?!LRP zvo%0Z7#F7OaMj`MkiL1taxv4!1vN@^#fu}4S~Jzj5}@*n^qhO;k)5*wK*110Y>lemKJrS;}LP z`zLKue*m%a)FLzj=aKrE?|q7g0StaHy$B^Z|3VOq;NvmPpnwd#?dHzV0T1N*h#5pG%ntc z*5wPbXM$RxnMKS|#*SCY!l_OXJW+{X%5#K5imos4+fOA+zp!mBh{&3p+Z5bT%=RaX z>EW^wY*B)5KsZo5IvV29VOYcx32+0JFHe4eHyYzd{1=K7ziIOp5$AX*h~!D#H6WMR z%`B|nCx8E&2z~pXCw>Xvp4~bN0zPu;_AhUQ9cOtNl~;-hMZLGPev+`2)n2@ZL1K+!wdEv&6E(lQG62# z?FaVcH(-uA>J_k8HF`=5IJ)KgE~|M;VK z7YUZPfVNYJ6yq4BOs#~l+r*{}7fJr|fVtqTYd8==s0atU@l-XfOlfftd}6t@Ed*28 z*U1@75)^jGQ{aJ)Bk;tiXSZqwE2`pN2ocT}iXZ%XsgqJBbwex;oDc>Bq=m~4a#Je? z5EI|$@YmcYF`E!J_r2Y6fUt>vSuP+Sap|(HK;BDUHqV~*G*X4W6^aX4%pAV1uuA+8 zevcgqs<0Z4hCF_@T2vK{@RY6)7KXK}Dc$%J0(3|-Fk+!OB-=jUx z3sgbIFo9MS9xCyUP@Yj5$|=AbElKTPJXw#JdBrN+RcNsEv4gkVcsOIY1a6`3Mgh@n zH(zz*by0WV)KE|TmJp&0P4>IykTfDKZ8cfNx(D`+*S~t19ltA;^6uMIox|!q1fq8q@9~T( zZvh@1v{y6@Ga+ugVpuhzK+MK9-Zd8OB8|w$j*wiq6hNc!8Agx}LKD2uYUMqGA~qd` zMKLda3-$Kojxe#C8_bKe)MDS3u5F^i>xRRjqTFy8cv&>$Z%Gi-s81HkLl8!hvIW1M zudQWC@P@Bo|K>cebMa1S;RV0E(86RY;JiG2^oU{od-uxl4OppUVD)QUKw<{s7{Yyf z623~b;8b4jyg4)HXh5fX^E4gFxU!?JO+}l^L^}XDMVe_GuR`-e;X!>E*Cg*i+<@mw zp#pbR@$NHcG%p;{UhZ=_5gc_!MUh|t=j{7X62EURDF284>M}04=pr?Nb+yxPy!MdX z{%1b&=(Eo}@z;O(x$k`IKc4&15BaZNdGQx-y!OiL1%BZR9hMZKd@i)3RFF{J$z!}p zyRW;ttq||(0@PO?+6K7@n+;{+VR3w+ljQbjsepDkMlb}=_v)iNZ#;QWrqfNTcM-;o zXydR6*(Y5YiX&;6HG1u#lUMC$QXv3`;-KchoLe(hV45!iQ^l5xaD%=L?Rs?SEQlZj zR&x9DCG(^h9Xq`9=IalW=8BR&_TdLU{?SMOmNyC0PFZvAPfh$akb|Dn!tC`6xsIV?(^I|`qHpIvWXH?UV{K zt0OyiQ1}U9S!!b97aj}UHDX4kNrE&#{>GR8bNHpq%V!=la@e}nOOGDhaq{^7yKXz7 zZ15ZZ{?9-8(GOpE{>Lx<;%BdU|L^I@pG1L3F=@|J@GMYTz_##U*j|72UgPG%=fjRW zSya?=YH@IRUWII0w_|JD%QcegA`gj4DXkp&T1EHQ?7QW0!;Ok&9@q6%o^j9Y}bU;P< zXuW78SjsiJ>hR9nZ@%)u`)~N*Q6uUk)_qOQf|6-zpHX3$g)J4xgbfRiCJ48^ZQ&nD`x-XRQabog75QV?q-|s zDF7k?bS*xFjb==%V7MWik`pnzK0AU`t`(u)x@^p+9xjKOhO3Aw@u zwHa7!6T;vl#l`77T&Avv!Un-K(ywSwESDzWBFS9ri-a{mn1&3+Y4fJpoA`z6$TBVL z`g~*{oE*tna%BB}G7vn(#Pwi1;`mD!%>z1jDo;Lcc1W10(L$$NWK5Bj8*iQQ6cV;54c5#(R!;|nJzV^j%2Y7q zh{)i*9$(Pvp>4s{3xjLNR;e1Hl_8A$#)R9Js+mW=hVVVHKYYu#TxEOvO-CSwq`S7D z0q45%;1=9l6j*7@s^!hz2I7Smvahw8kBq|JUe)T2Y0)mpfZ_}bvTFuM9(#Y0L{uS7 zOQr{pH(ic<>eRhAvV5QU$ituf_~W1b#8bfgxlcd+nP;E+laD?2kqEJ1RSv09C6b4cBa~53iS5GH}wSa=lb9V_zvNerdTd)mjTU2)7y6_9v82HJ; z*_g0(v!(lWgKo`;cdr!IldX$!n@9qFqeuP1x#HA?+5Rf*K0N#!NJ8%v)!qnn1kdHRxX;NEP!G)#RR%NmFlyC315eW-;pB*k-WegNozy! zi0)T(jyNwp8HD9VGrIY>Qr{MqqUzA7*}Nc=0Q`M8{e9p60b%hM;_L01eq2a#$; zQ)1W1SP%=)gF;6v^>p34$BX9-W^Y)eB!CkeDcGe{=|nr`6nNGHt>6j2xbdEaNkYvO9XRG7w#-Erf^LQlw_>r zTnCg@ayv!>HjxX6Xh#limG_l@B^I$t*PPFtlZvV=HWU(;6@2wx6OReMHO#SY-n8Wahfx~ZPZj2NK9_WpD*t_FO&B!^Y}r>jh_HN2=HHQSOaqJJB+0U>|S6uAW-vWuRL(FLxrIZKm!= zo_c`!|Ln(~un13o^wFn2c#3t*9nH;^?&vIEf@0pYLKa_>lPr#aXp0l7NDP5GK z-@--jUXp-)1H~kft#5qHZ!DLQ0#Tegl2Ny=7GK*Q1v^VLk(gaOW!hB9SBh8%0WVuv zgoU$RTUuGE8)(Q|R>_wRfA~)C7hAb~%W~PF+cvkD6n1X-#`6@;lIL|*F47{j!R>Hl zeBmK^VeuzV=lE_lhAt02Xg#o~M4_(n(HB=d=89W{82GOaCC;<#g%!7S)LDFY^+^URpB^=sjp~ zpAjQsw|)b9ckbFr=Cj_CrGLL61kV-9B{TVV?(+x#GV$A|R~M1f&wlEo|NgbFeD~X5 z|IrV>_xw+O{384J#TWH&KlA46=#%@1&|wBLg{~K`l+2&VO$cATS00^IiWJjHtMKb# zQE7;S5DL+^T+0;ikX?kp(2^&6yhv>D&<#}NxhMRQR-tZ%D^=c?+-Y5u>t;v*?6OwT7L1q2p>$X zLo(;H+45otA`5a|Y7Rg%j%Lxl zJgdXoc-lQvQZ)w%o22k98NZ=)6_MZEM>>u5%qJKR_iVkeD{(spqZ?)u!m!2{u|eyh zl?w@9$s75CiSfF7D{}&>41ZknjV)ECq%z z`O7V@Ba^hQhI!SqW>rSbT1D|5VO>lM2xm>Aw^4V9myzY`tuKe)?zFg~>9n^EidH&Red!^X6mxIsC(hhlm4TTU7d>ihN!=3_~9!Fq0&O zGd8YXwq@ONX781UP}i1x(C8d^$*&UM_H!hM-oTtYg-#f??ThO*>gS~-I-446lrFM> zG+?Zg?pr%W&PKd6GdOL9Ew1ZLd=mcaYO7|>(9t(KcqrZ}8yhcHn^-Xyy>Q zolq)@dL^FuYpx7ICZg?Jgqm@jV7fBA%{kmJlU(2oh;ng+(hRG_BHpxq83`5kzTBh= zZy_8m?ODq&^-HD?+*{8P@IxPfw1f?VAV&)c{4RZsyEV!K`DkRez?qFZ- z)!}Wf7I@>isGTHUuRC}<5A#jjcUP8>OXeEse1>9AAGF)$gXJ`0B z3YoiHWi)0^P!?9I)`gRlI8e}4vvoqHrc)Bh~G9VxCE<02)4DfEq(dNnYb#~t_1JSTTlG$mp;e&{KM~m z`^P`}zWC8gMf~@TGpA3#{@SAt-v00dw=o9!a~`<&<_GV)<^FqalnQkZug>jP-+60b z*^@;=g&5uGd3ji>^Ryt|ydjzlW4RcwTuOS59%w0TQBGJ)SJA`w-W<^xIq>_a<(@ct z_QXRK43}wJc0DK9j%}^mwzO>CxOBt1C~p_{XI3-);M(AZ)vZD@uq~ZaS0&#_-pKdi z>glRIh;BTJ*{4sLFbhAgtHv32ZC@h;^Sa}EZ@>QV-M1Wj|Ls>pF;PqGf^C5G!8<F?0fDwk)E7ed27YIG^*u{J+aTNG3VXd^}2buWvBrS zu6qKSj>^nDwhL;6m9IGl+7#OGNTYoCwGQ$q5WIV29ts%gYT{)~T&X;(tu6C+Y*~Kv zz-A^4kKbLl91W-6HIcEI^3+P^#1l!$>wpH7CAYjTl&G+MZUEuqd$1a;z!o0yv`nL- zaiw078RPg8PenkU(L_3PWa$A|1QT%sr*m*yr^Y4nQL=+@A%688TUX&lOjpezl|k`2 zi;mUKoTPt?=1crb>>y@umo8Der?Ccn@vp*~&JuJgT~@r?NP)w=T5S(&n;P0)&nh`z z=P^Dj4S2NxC8qU`m^EDsXxiE&z56nSQUHB|_;1mJ$jdGXcW2?70%4gOY;Eeg`d_7k z-a{?VDv_H={7ulFgU`gT{Y^^$&iVWQ$TakMZ~Hy(ya9cB?%cZe6VE*P)qni!Z-4V^ zKm6Xeo`c`#e*(X!l@OkO_4PBSAAR5s&e$hE@P0#V)D|&6bm|s#OMxVm@4odozcD^6 zuyW$Kz)F~Y1gNLBb6YE~1rv-r+S5FF^<-f@=@w{xqbShexP`Uj)FA`>j3)4pMO@8UY zu>}lFSeTxbO6*d`6o+ED$}5Bq8W+rBnNF{+(6@>!l33(8B6GWT^{QG0_m`4_QYxsi z#Ib-5-HBg|Aq9vwP#kmL-E?+|+AU8} ze0;Z8wzR+WVmEvL`)~S-KmX)E{jV>}pZvjhzw!K!$={!-UpW0z^xuHr#~!-tBOi?P zBvF+QKY7X!c6ssxLAue=@%=ZvpHdCKo^p7iB0P%rJVaXx8^ocg^wz=!Ul3768>g@O z6(TRux#$dmm2S+mA`wjf@a7xj#vhW7W$P3{vz4xid@3$02d(we{NsX-*tDji6){ zdHiG-9=$K&mwn2~Y+Xf)8{ABosr&`QNvPXu2fH!&?L=V8> za$p=y6~E3o4i3MCmflkqR)0CwQoee1m)ex_v;>^DnZOkAzReDQ*gqw6Ab&5s@O;6D z!w0v0=2IWmF!rCn^7r5TkAM08cjQlg@2Af{rv&))D=+b1y>{lcCmy{UW~DkLen0g1 zy-z-N54{o5(i^1{-*em5kXY!?lCo5mg%iUQX9fbo9k(7+8j!A@!g9Qw9{z!c?hw0q z@ZOv5yX(Z=w_Qbc+s3m zax7WRLa3WJEkAf*6ItU#jNgxZ=>BJ)e)Ln%KKY5KANNkTkACnWTLVMO)u4^Qxchqe z)NSPTeJY#oJbCwR$LZmW3-^9&q<|hxa0NOFO(UH4Y|n7rQ>uM=Fu|MO7wYI9HZl=L za^XCU^JeI#NWC?3H(&u^TP^nJQZ#kO8GDZ1;g<|!VyzH_|w0(povHP*!KRa$%`FQX6 z7$d=h#pm59I53-nTE$hxC3A@hPT~kO zE+`{v8$yKL5pO&x)YlWx z`r!SADSC<%n7`-_OoPxbPJNA2@Th1mhjbA?q7{<9>Ikh{5JalLD()|X0x$I|=?997 zc$T+C&y-QAP7Npb1_z@+u{V-TCe+y76o$KQzv{6^Z-4qD4+8I>fA;Cmefndc`ID!L z9Lq;P_SD0;nc*(dB9=|f7FN(i7P}GG&pB|dIveUUkHFw*OtXhTL~F$0y<)$^gdj zEfhH?wkc}KRxS$=##)W=P{oiS8eyQq6XjQ-OUrfxUdT-pljbSJOIv?UZ9H+E^4B~? zFayd;{@USOBzK9=Qh{JiQ{2i5)j&F^_l?FiJ)wQ1ow8iMGNP&ENS4#5}GXD&^k{ZCXa`jN^UOT6*KaDsoVw>%gPufzBr&S zfi6Q5Y=M`G9xklQ+jo^K(xa;ny0ptq{3Az#-XXeEeOME-K;l37*j*B&i`1--f$--) z^GxPgVn=ePZK>8De&T)xg?7`f4To{HZlSn~Xg3WhOaQP-s4@_s!`1o*pvXQWk!2fZ za*?}o4HcUIiu~Qu+S;-}hLuj9=uirZ%#Ep2%9`fST)U#_z^--VtRq+iI!tOZd2q*1 z6z8c+48&g{UDUv{15DDHBT)n)ke)#zicYCj>bp$XU)us+BLf)yf z^hGRMHZ9(?VVRynyLPPI5&}IM5v=!)C*63K)H^aqy;6uezJe*030w9u@Me>ZbUQnd z$gl8F`meIX#%1j;x#*IM@_l5`lt_7pu=-=|7CtLO3xPoc`gl*}L-*hMxzBv`um9@L z{^4)`@}Ix*cl77)ef#UrKllA#{G9*!r-9#BU*vxdTjt2Ny}Q@$k{tvQ+go=QrE^>p zMSbWNfe(IT`5UD0UAG)Rb@%m;J$#3v9y;fzpMC1jKJ~FLeD>MD`uwN=`ir0an=k(9 zU;g>0%)j`#PkjEfB`iEjB0u$H(0>@z;TF68-n+GXz1lXjCP;kf_9vQZs_s4-4?l48 zgY@dVPom))c~ehBmC*4kBNd?_9x;nZ`elM;NxNY5q6O+)=vQSK7xrXBs0A(tjT@$xmdHB@FpZw&*^T%6KW(_5}P2ucuSU^@oTk-x6r_krI+Mw=YxsoS%D`=;ey z?Zn#Uq?HupYH5RnmkyuaO-BA+ePlbgHoKeu0XEI^2)IO{lkb*;N|Mr!e9YnC;VUb2 zV?YDO@FxQ@-*TiehwQdbC{#sijXj~&7I?97erZ4PL&Nu}HkWn?hH!GfKS8&rps|=# zYLQ=taArwyGYa@B_MACAa+2lYh!CmEkg5T{L@-#fOb7Lk8VxqG*ElMF<^=E@kL=rg zTsMG&TfJ#fI~OlaE_&iE+oWw;^rUSfnx$fDB_s_1eu391Y^|HT7fLelhVbnk^+qJG zQE2R!c(Fnj=KtR*d6PxpDqd3RH8R2|H(h^}1o_-&pZ?+(KKXZF{(t`UtN-xrZ~og4 zzWdGRe)yfA(w~3%)7M`9#hKGDpML#S3x(+|UF<#S)8@?b67wnXqKc;3|1Wdz9aYtu zWqo(uWVq&>1Bzlm%z`MWAd-UwL2?GkNf1Ou1tdoSNs53ds3@pN5DAJo=j=7y;7wKC zJ-WZ@@BQQZJ^S&}_wA~#TRpm}#^>1MjKkq@JRJ7iYpuEFnhVD{E~<0~xHwZ@pxX&Xkr;ZYi861##DL(?E3-EzV z0r`36b{SA8A<5FYC9fu&kvvP}76RV<#G<_2`B@?gXM+L}Rz#-CsSC9$nliMa&=duU z=?QNSJDL}ClNJ1~Ab$o0jH;2BE?Y8p$)dT++IQ9Y^JZu-pRYjJl2ITsOcIHj%0gxw zPM@d&zh_S!J>6J)vc4L{OT+Q%lgBD~|8+HDf{EiubqQELbg-bRBA>#6OO42=b9RY$ z2&bJIFM6g)G0+91C_Ivru`Me#j^C7k2!sJLxCVgy3KGA8J`S*O#_Lw1zoLsx!AL2G zf(85{WAO8^4-0VRHJ3%S4l7l`1S763J zW1|>#5x)Ac?iBuL2}De1^Qp59B5FCugg>gXEk#T!0by=|Fau54xib;LR4Iu%*9VYG z+ZXT-8Z@YXf1EY2hovF&vFrsYzZq5kn&TbJu{_OddhL+PuPoEHVB~w4l z?vaI-?n^H&*t3`Tn;tK-N*N1!b3z^@U;zgJt{m}v$&r&9mzlB!AOHux6iryN!5z$^ z2E-~V2ztk8Ceec-+n_aUZn_$Aj!=3i2P`xRDxQbnchRC*_)1~r!Bva1ni`g%UtO{H zch^!{MPlg6$E88)wMPIKrv}Q34ckE zP7S$A@;HykCITT? z@wykXO!6620TeYL5f%}fG9)x;+{po?xVn>uO25-8~zA-U1hUCOnTIV`%6 zyqb*iTx3|(9vMzs*^RV{IO1$)zQNiQD|n@$tc65}oLO|56x$6kwlHftugNQOiJ)yn zh?kKUs)~R8`jI(*fsRV#r+?i)p!5%>oq;gv{kT!1aS5a3Iar>9XrFWM{JB%z=bLX{ zy?F2Lb@FH8@0+ilf5h*P-~I5@2bzqeC2$T}_z$b8vJ;Rlo2{h*E7T){J-G5?8Qj?HB1OSL^8S++6$H}nX_!^T-}um zO^tOt-PRMcxH=UVr0}az3-If7wV&zfZsRJ{-Ep>~{d8N)3668EC)-;a&bORwYdZe1 z%&)Hk@+3Lc2lujri9rbtmbn0D!B>;{E3!-i^xm9ZMY)Lu*}L{qI4gua@Zpyw1cP5M z7b{yUgLP|{vnh4aeD*-iSh8>qqB5c|Ly_httE|lRq*w(d!v-4`Eg7?W#m_k?V}8 z>#;RRji=*Jx&?m8w?V7&QxS|7@}Ly+aPcG-6NO`y5HAvGr5y}}C4M2DtjzR@mEc!{ zxPa_R;1>s1(a=$uI*D*e(o2E_AH_T8%F|nJQ8N|J^6QgO*>Yp}xt_IVWp7X&%7>+q#bSQ$6s{*LsA1&V$=8o<4Z<)wA!ueMkQM z{fDoA`1u1@IS)5Gm_51QbM*>MR@HdAS@TEXT1}UP^RR4RdgcCH^30=$%j)Y6G>}yu zt0E*dHPoJMs6E5&nPV+Y^{r>?n@-n}e>R>x+<4*;Q+w3NRLU$Gqa6c&QACs!q!rV6 z_5oNcT-bK(eD_lctwM-P`Ct}f!JsVoo;xRR^`rCEe#5^Sz}z*)$x(S1?i=O=P4 z;_5^Q=E6nx>*Ho^ZMjx|%`$B*jrr=TvS63A8#zD8|8gyjmD&qdET6whcL{n?4&idY zdKm%j07ZxbM@>QncsU5Z zN=HBhUlNAwG+KTnIa@_VuTWm%N0cdk0bW`UifM^ty5#kN3kAqk7-rn83E`- zZ3W~{Lwz;J$>UYW>kib`lpHx+a^z5P&B207*q%ah4kHK=sV36Iq6`EQH84U4@(-5f zlozF;NiNP$-j}nxATuE!m2&njVsv?NdRbAbIQC`GTH>dKNUS*fKxr-{5>yhtBD`Q( zaT;tGsVP+_Nw^5&2o$4yVj{evLftoqc~D7(2eCuYo>1%RWC>ZsXoHyvme(xF)i%`E zvNBsu)lA~Y6@U)W;p%;-8xFNLAMfsH0=$06pqyN&RP;cYau^CaJkZs{$pW^S{8?)mJj^t8 z(L!Q+S7))rufbYvGEXi?rpCH9Rt8+1Jlw4LH6w!E zVk5ob2cVak(A>U7bgbw!K|dmgBY;xsk~0%?3AmCxQ|alz2_s?@;GH>@8iAPbinV`ffXX%1@h+BxfP<$NR;ZWouV*5F?6~!+c zHzAnXSK^lvSnOLF@Z}Izl(8FBkx>D(e{gvH@1V`w5O3z6{^_$%en(>*qLnQtnQ7Zg zi?gaKi;f>Xc&gz@dt1ZBu9j<;Mg5C@QsDRXi*Mh*{T>PQk3W3);R7^mY>YpjKQs8k zRms)X+ubHOz=^UqBQ>tLaL@kIY@+9(%0l8V6(52n1RlUjD3=c8A3j)EOY;|to~q)* zl|@IY5I^J|AdQ4cCg^0t9`6vPU;1{qDaayNEc|=~9aKXJS$d?Z_y|AFWudCL8Ua{& z-l2*D4!%_l#%aPTQYhI_W?N|0{sI6}Q&m`5k;fzvBoZ`Np+bmd>=CvepjaVSgD5Zw za2%jGERaP-ENft5f(2WaP8(z*N{)vg%SvuNT-QTrC+*%0%Bm0MAFC}VNp5dxAcekq z={&I*{9eD@0i5~rGL?Qub7$)*P<)OW`BWXm7lD}AP2&uXi(iU2$?Nd;%Jv~oP3L9F zs~MdjoglTyN!yA7GcL+Ez}wz+Bm0jqmRY!D(X3fBCacd zP-=~g6tP?t01|e4VJm3EteqrUlkHAKl@y0-8!DtaK zC6OhIUq5f;G-BLdG~#WHNDtUh$=-y~qlD!G6c(Kk3IyiMSe3}Mk%x;Nj+)FPgIq~y zGrWv+R*Vhe%LJ_*;D&UTX?J`$vrg)>uq_M9qJbKmT`F`};l48$qE-%D^hR@KA3|k4uWPY7Ujw zAFD*X(bjxYISD)O+`K~l`|{bNuU%~WhLw*uP#ifD9Jonnq9#j&wZH(uz4)p1HDX@ zmz5funM$5U>m)KYDJnBHE;n;KftA;ho;IgX9y)XC$eG3?r%xU}-EjEq={oL1m~)W! zQ@NjNIDCQ{^JoPUi(i61U>9v!(o~5K5rT_SN(z!WsEeV+NXVhNBuykcDU_LrC8Y2p z(9a>z*FMmjtzI_nPB_wt{VzmhX9qJXM-pi$ojmNb_NCPv+)HBIeEMit2kJEe;ak@) z$lIIOy07<~2f~o;9W4#5XO3}*-cvm#L#60C9Tsm`Tx7(h3}tl|83_30*XK?04&l;w z#s$WNd%-{3tzWCZYBAw;@dC9uGpA7ek}Z=?TbQhN-Dp8YAH2yiBG@%N*flH&Gd(9- z#?%F&xaw_krUL~99ZTd2_lSw`+_r_VD*!7ntJrx7N+CX&a$6oL=%|&AZy&L_Czel) zLYPY{nB^AmQZ8`|y1}@ZVc8Q$2&&lD9}}K7y~{$9|bffiV^v>s;;d z)#Oq`{mVr5Slp+E52AC#p)z#>16E8&T3Hw{T1a^t8R9|Y1-yLt9QZlFW-I)&VU)NvN(`rEb!^H(S>$*!*4ceM5Z`Lkq}u3r}YU-IYYPaZHr`1UIy zfyM>;`yW1(7NzHBCXif_afJuE1o=9IY;xjC&Y3_sE6Clwe_zJI(wxe&-2JTCRl2d9 zf$+e2>GAvWn8-^iEl7c%;h<2>&0qpCCN(K?&+hP)#0YMac82mL>@jhN=Tt$g)g7SO zdhTpJ7ZyrOj>|o5mwV2UuU_nKxzKg?Vs|rXf9LtrkmqeJ_06a2&Yr48B?XmD?3R3y zT-!}*N`?Uat5lkFbCQU001%-gXC@R`;tpnl=#UD%L|n9QT$EQ_q*rvPD@TYwD_2OZ zF-5oacC+SollKNB6V#-Xij=4%_LKmP^;PXHCoWxVxqh|d){XAlH!s||*>mUGg{v3N zUFvMP*wNJ4)(EKuekHF3?Es1){|{G*5KI;=J53@47o_k3^3hS_Cv6X<0p#alYh!`< z8584qix!X&s%kEoE5K{4>%P$sEhDk&ONa_tp4uuy6-kQE1kz$3txTaYUc0#^IS^1erYda#=F4%AoxB z3$lOu%Dw+1?_}_h0Sgz*X66pUfxkjYadu6030^ToG4Lz$=S!W;56b%Y^{c1v-oF0+ z+xLRM`tbvW>cO%sm?D_o?QsEHqP(NoyBF$C6-lE3Dx&)vCmSV$=srM(#H1w)VSj336hO|&*qWOuVj`~(-E^Qh<49!@B{QdbXKN$r zC_(M+txLCWT)cCm=l1m;!5Up^2hJB26!%;ZaPB&Hs-v|5fPf1MOz;cMs~}fQSa1;C zM2W2|@+Klf`N~K~8bAW@G5YMH?-{%;)-N^+4{AacW5`_jy@if3#4W@hdlnmaM{_4T zyhIFKHVOuSGm1o!SF1Z*eD=)Y_H!pX&!6JjA}ZpG?cn#yg|?nf@%GxAPtYvm;P)a5 zHwYd;G?FBOiL;$1;xAvw!V$l9}o_)GK*^x3%HY|Scd#2cs)*ta#4%o&}h zy|v*c_YE9q4p0?>%%oqm>xvz; z(mxXZU<6-~3yR65Nu&v#c*slqBBZo5(`RfD6Xr2vgzk!j7G!Z3Hz&G#-tM;1Q3$O= z=`#0T2k0ipMB-N*Bn-QV!a*Ls9vcLHg~iZ98b-YhUkP43z^Sa+aVDzVL1IpyLvU8g zG9w9L`6c1_^DjQbr%r6>{`7b9An-{n%iBMN*gxPAQT%@PDanJr-U=LCQ+GudFEH!vVVjG>;1b|P*||g-~aIKsfL=PwWXB@atd=3`784m=RAoD zb>lpN4x-(VmyuAiH)a36baG?Pz5GleCG&wDTQ?=d2khJy7#FRa|C{}U4$8;g zd84Vd1yXsf)hidRTCs4=>Lu3J2EN`K7=y}6i6cutRGELQuI$vw>T}KY9j%QQ&YuRn zS1z<(>2B#!qA=Yhk_wSXABWC52MS^67IP>K2X6g+Ot53R>84vCN_D2R{lUz+R7c7Fmnrp zC2S=dz^&}Z@%N(o=1QB9x=m16$wD5+x463Iq;JcI3Jf0dT{oavJ%jiDzybl6}J#JZBvBZgp>iy;gM z-KID~@U!xDL=b1(ax)$yfv7=Hb20VFbpUB4f-87zG*@Vz1&|lbh3Wyq*r37LBBchl zU{*pHz)I$s77{TR4KxS$3CFm#v*ed!z`%Y(@Wm2p?Ed_qR7C%SQT*}J@lO=LpHWuW z+nKR|fR7sd;uV9}({UUZ8;+cBJ4H|S(gh;jrAPN~DI>s77-9GZ3G|1rzx(iQcSmze zb3GL()Nw^=PGL?Wmt4*YF7jJ9`$Fe3@tR3bCoMKRU6e~8l!^(E0_utq$mA>_Lrf%B z6sn|>tje;Ss`6Ys;wS)Xs)~-*?yoyiP8rK2)XDlPXlke)I3FNMh74LSUu>hm1js}* zgdZFi&Y$6saGTLXEkyLWsX zd5|HPTcMELvPq(q`;xWeOF}Jx{WWqWc=^NeIiLqiPurT2wiW!QB@1mQ6|vN^f>xPA z(^sMvCP0fCnNnBr|g%0;+PXyq__?L+cR6sZyk>4`P zM_menfXn0wWB6?m_p+}?xNjv017Yb*5*r;r+D!5+!Hb*{DivcE)YJ?tFinQo5 z-Vu_Kyg4sxTS4wFCY4GH)2sLIg-WVDR7|X)NIV5FVV{lzPjpI^^pZ}YCTmfnLU^Bfy}6Wi3RCQ)d{#kaw0LJ9=geOS6pz`9;G_2*o(sa zT=Q|7?3a4lZd~iSezo&rSL^w<(=AQM8tN;UAK`t%+jC*z9g^F_6~M+*cO-2ONr(+V zzhP&!cGXJO2QY0hb=HhY8tT(%1k>1ZaWIVxawSZQAdAs1!btWW;sBuV>R^^qS0qTv ztc0u)xDQ%MqIwTvu8goil?P!FGsvAXn4J13SfyvgEQy@r6moR3Yh_{-*uq?Ka53iq zvm6LHgd7V$B}F5xK=0%D5-U7#*zfGHLvjNfRba7zf0d1DZK~ z>Ka{b2RjQkG*L3+AcPs0V4f8p0I|g*=sy>)fM2{Q>5&QJ*(Dm3R0lk@Kx5sZY^76M85HJKG!2pKItkPv5zT3YUw6AZ)L8Uc1bH z(cIqLfaFqnazkhPNBja?evkw3%61G{D6r*a!7TT=1;2bLQA{A_5`mb6el(pLVjKs_ zDz^+X(j68VH63T_Vo?hxk;#i>UMb$mBKGX2CAw*Is9TVagR`x%vHptXOV#JhVx88| z;X}Ac_o05`a?UNCh=Kk34(R{I&_VsijUJ*pb^KzDSr&%6-mccs;qEDkQDys5$&(vT zRFg|w={a}(N*B{!moJ|0Y(L$4_86D4dQ9VM_frUSaBU%7LA$ayYkOvL)b98ohMMiI z4Ro~U16ws!*1=4I#X??UZK?0?WgEZQ7flP}!&EWAM{(>COCmUAl1!WxL<9ozBmrB{ zDsKt3@}R)sL4q$yvaEm8$V1ZO(o+#k#)=kFh8V$M7EB?ZcacbgStOJY&Xm23ek=d4 zP+@T(#sk7cVVb`(?2?n<?+!L$NP$v`gnmBp{vYNYsPNS;b5GZh=FPd@>_BZdyZR~$kNT_+8v zPe1#p%lZodL{9lPS5$&ut~xlhGbR}m?z=laBqt@dAZvGdarWWrlH+v;iND|%)Lg#E z2;n903xx%Kzk2;#;urq8<;>C6CK2Ok=nzcH3RB^%054UckK1||dlP3nV~8Dpggv2d z#4K2;;{2qV1AFU_l%Hv+Ip2EX>czGjmpZOr>JTUJ)sAad&ZA!?MT=w-Tv^Ii;b&6B9z>xA;VcIQzI;+uIoG>n^6>%A&@x zqbP~`4H?{j;DA2EhYcJ)+<3ZWNFQ(j&*l7U+jY562B%%H6n15jV2V-^#{pPj@6b{RpeHbV;#SnG=67%z~*3A zCwmj!6$|F8PY1uVXHI5eH=0RrcWVM}R?3!=e1vD>&BNXcNGeE_QI%9VD^=vcz%wU< zHc&k1lMn{2AeZO!rGTw+%Qcz)FFk$5?0Sn-Tah+{VjkfjI*V#oc#MdhDdhRYVo*%x z%mF7)fDpa}%7$fbiMcd-0H833blYHWD{@`jY=>YoCtEMQ&6yT5P9Vma`I;jwE5agmTN9#ELzTVGpCQ& zJ<9~auRH{bf59)b)hB;qDJhdxmV=VRV1-ySjoyBwh3uXNm z!2X-x;?;N#tCz-%8nJq%mY2(hm~bDu_W2pxit~~Wmgdz|79XvxINeYy`@ht`H;_Op zBZM!WKYsP{>6F}^^wgN6rD?nWC!N;A3}*5>+l>kZI6 zp!DNgyS4|DMI)?gI9kzm_Sl7v)17xS ztt(x(uXe%NUg>VV1UJ=nmUFvX!LQ7pL9qzjZH@BaLB0gh60ogJTw#vNF4DQP$Iqii zZa&TR|8Wd<`XN+MW3spH2YvF0!tKJDa72oER6V=?<0Z;Lywqn_fUTa zcSmeUbyuS=n6IibWz_hwLq-lCFk$S7X;a6mOc_JvJ8LFu?8Z$PJ8~4{$IyYphf}_h zkM)H|1;{iQM~@n!I(^)Vlk@s?=V*n%3c&5-RGFbY9;reBc^D=Pq&>t4*y2F zg2qy6q;oR2B_)K!MtHe8ny+5DaJCvNFDGcsosN&LgRN1Zufxu*f!QfrigI@Clf60W z)100Bec=!Hf=woZ1@#omm%tOkA3hnZkL-XKXP&~2dC(TaINGbfKHMqj0q1L z7Q_~E$MteG3^w&PmPV{VA|b~omf{z)ccM8Z^@w3Zpl#7S0|BK7788RoRFKTShT%tS zvdjL9&qod$%4$N=gRoHV-8*BpYz|_V^xy$~d(&bGtKUT5-{c8+)Uo`K_hV$Rin-}6 zQNH9<{MGj5Cs&r`AFe7Pb0dESzrFkw@fQj7Q(C~__ZJEaoxh8{1p;^*VUoWB%T|3H zn3v4a(VVw(nTEk?E#tM?mZqzrcf_ad=eRY-7dRX!Nvp3dJA0b>2;#dCDG_aNUhlqs z1$j~ntgPf_ul3MmX(d2&@VE%L-OY4`=n&ENmGPIdmpfn<6my4M8We+HNjoc@-$UdE zO$~>+ZZV`db zf!=oBE*2YY*O?e-X)jf$tQzZ8d}Oj_0H$x-o}eOw&OmM>+_UEmiA+E8EH-rC5|({4++S3+DM zK^6f_dNQqBF;k3cD@k}*g^^b$ZVTCy5SskaC_t2`B)4D?oN~y7nIGq@pgQJfInZN( zR@vKy`h#j_iCcEY4iF0Vc?I}S6fEd8Ag@4oua<+KB3?sB!(37Jk~YIN5q1fk;FtLq z7K-7{tulGSgo)$k&7BF{upPte1{8D46d1QGO#tcG>>!v7*yP0Qc0{N<`=%vfCGuzC zpn{>9NSi%fYNLX5u&EP9&6qM)U2V!@jTxE?XRlegglm+Up^k-#u8rkdPiG6{#AMMq>2WAA8tSXg zw>6;fCqJjWy?&+R@`cumolV{6Pj|GQ>^%1|o`O&w1fjqa6*0B&&1+raxJslZC=2F_ zLjoV9U!Z4n{!I6|(``-1WU5T^2}sFNxdVPX&ozK<@Xm7}dzrMVuE~ zs%Hy2jc`x8VBx_|L4Nk47T929W4_AVaJjxNOy*olPB1%n78{~f7HY8aUR6hX!CF1m zQ!drhU4$me)Q}~WOV{aZB4XrNyJnezzNY3fb+s9j=voXL)NfF~zF+qFV#uI=!-w>n ztv1=ja3#tp48G8l)YX=?x7J_iJagmn`Ktutt`~y&;S=ypa|q>SceBVM+UjXgnLFu zc;PHWW=nw#UtIgkHP4zcjXv;iL+)?-4C?JZpM5%I!Z;Q^V@*I3!WIA=%urC^NmW*q zi4`0DU-DA05bv?+X&fU zv$O3KEH0sz|AOT6%*h(C+|+oO7ZknMF8;@6W`$sYYpaXUPjcSU?TQS>;|`Ibt*nAtjYN^GQATr{|btkGSvPEVVmTH|#q4Eek0Ei*S=*=4|2T zVZ%k0?lAo$kW29G#V?Gs48AyckdUCJ1CnC>gwk}QD~-+I-kikzYyxot%$4-ck{S=t z&C}?43H(wfW89azRVuHx#fGr$9p{Z;KR578KNqPLKtN=SZ90`HWEK4#>~okqaNb~n zk{K}-Kb5#$)X^CEvJ65FEXbJ!LNGo^a8@{eqiE%z@+I;z^~n$fHmZzS5yWAP+5SxA zMKdXPH;9d^Q^(V#B9W$B#MrKq0}Djb=Y^hTP;uGf`PlO^gowOkdu%Wb*6K?1{6*}L zjSTT!vS1zo`frNP-+nRh%UBc(aq$9jbGD&^paI7u0#{D{Kn&_KZ+on^f}NqwXO7bX zmiR@&LHq^3@1=7dw@5 zxTQfR)m#TIw4d&1YosmJaH5)ViQ@d-=<|_%x;dHyI@5K_4fU28>1pY&T)djeyJhn< z7tJOmUZdjP7f;dsTV6DYdN>2Q@6C8z9;K$2}?s!QvN{CT8QVuucLB-rKjVDmjY8=OoTBwnU}qr`WNsjO<{@-+WkVN zg&36_n>&m!=cR9_DxsGojCZz$A-E!jvNDp{OgwFLS7>7KOdm%W$Bh`yyud6~m9?u^ zxI1sy5{b@4Y>(Zu3mv9#24EzL_AzHH2hAhq7dU~zFZC})v0TT)1hJX%DhxURFMCvt z#HvBf*=o~?yh8^M#GM^OX^1Ro*e+FGG=C*?McAdhnKWrEyOuEXWH}3T8Ktzp&qf9+ z;q$StkB<%%MjsKrRu+cj-k@Io`)%y~FP_1FA%7Yz7#kQV2iQ;H>1v1JIUfkuMy{N4 z#s|L(@@L{N{a@m5Pgfi9SK{}{W060DU-IV<@89@(*)jv`y3y3x!NlFg!q3~z-`g(8 z&%xi*&eO$$5N5lcLF{D<)Thm#qcU&SlqCyhFg8nphG3qOiiRdF8`9dAv&TuK5is{$ zK+>!LnP95usQ@+E^{pEh@87xd=ssh}Hy+-*e*f;}ySFdhy?N=uovSaN-h1~3Rrd3D zUp;^Q{LzyKw@?~i=^>z>y(A8iS`(wW6-9B&32I^5&7{*LqHwBIksi(#26~zc=g&}` zK0#&j7^o*zm9eu_$MbGiYHE-?Fek__VsE?7(QciKz0pP+gY{;sEKLLk%}sP|E!S+c zSqrJ<>tXHdzTU^xBG`9Bkgt8P|3+q)!h#$*qQYE>?4bcp!M^tX9yY#iR-gvCILy4u zMzi(iLWZF+OJ$bIL^YLhl+R|yD;ZjZ@niD>ohHcSy&2moiqmQ;at<@bRl+DVIYTsk zC@T})WsB5iOlN>~@TlQ~hYkL6)UbiHtENvKOE{(m*O)tP?(8X4>uNJ5kn=BEFoTxU z+SN zAGV|rE2)daLc9{Tg(+R;gsk-KTp6(I*%2R#Cp-gR4E!>?+o+X3@^Xy=0%eDoh z)#fI8j44@|tYt7(M`tlp2+ZX(*E?$Du*s9hGFi;FP*qi-!h&9;4fMNDkRyIJbjXk? zlP9v$apA(*SdT7Ws=;nqOvYHF92CGxoj}05J3fq0DK#Y~B-jJ*cX~s;;QC(x^tXSM z|Aj$h`Wm#J#iA~2V>aGmJpmsG^T3~A-`*5lZjfQf{*lygT)uD~3msZWOaVWBcvn); z7-4<==2c{nb9kUr*rttvz8gXUI8mJq~HkvrvoMC7g|rAYpTZ+gKWH`t$|#+ z=~Ru>MUa9LP&i#d5WrlzL~WYN=!xTp&YsDHn#z3jX&Q5@rm2) z6&vZv;KSw+m)Hn#hv#e#ag7P{@b$EDv}Z;2iY4=BQprxAGD>=?#+zfo4GAFZA(US6rZ89y~&!DB;?aori>mxdf1o|gC~t2 zPDyTRq$6eq?TlR*m2$*`ah2ETCN#9!AAm=t>W)Q4bW> z!w0vXJ!27)ps?P(ei0Yxxnqmp)+n#|&A9)0#YB3*OYa^g%54|ELOR@f);(#@iInfG@2O}`#(iNo{XB%q>kvFe0>vWk2`}E;$K>Fa$H9Eht z7ySImop-OFzJ2xV_4CIso<3w5F>w9iyZ3+i>BGPL{`((4y#M;`vqulEK~1B|K32D% zw37=FR|X;II(pz3eWJ2#I@Cn2{H*Or`U8CIDQuT4nlXL)=mi=ohWeVk$v|%hNyoYr}dyKlkE?dGq`1N;e@!h)FYj-?r zRswf!_27n8ZL^bDp`8j)#*)I1^rB?tJV!w(x@9zOGib=BrHC zY0->cxoqANjTwv7RZZ8f@Itp4=!%dPj59(=G5`@rYD5AM5$F`M$$=|vY?QYm(T0xrmfrxM2axK)dOQ05M*TFPDyOs#RJ=Tc7ymiXmcJV7|^Gjo&_ zgVS|hW&)uTTvHuO8-Hwbh^LIXf!|R2jP5pUTc9mFb<%kJ*=d$DCcycLvT?263RaJS zQ+Zm#m~jo^)zEJ7vqavA5Jm;X9!BLpttdBzf3_k@iVfYSYw(1zvo_%Xzl;)NtIO>F zn2}uHhL0UJjMg6i3(X^%@)CW-wSN8jQ1gOc{PHM}k$JEu6sZ;58u)c_vS#Rsg*)aZ zs}0t&vvm>CdD_%TD7ApUyaIegnevLi9Zmm-&)`)_4=@;@Dn~_TY@mw+5(^0U5XhhT zps0TZeoJy#BEbA0J~rT2u$SLn%J>$!XD+M|beo<6<*;>9D3?B2b8o|Y7qokrgf z?t-pgB;$U&w##WXQ0xJs2^o75!qOl%lVTtrcEkm6?ge_|3TRGtO^zMlvjM%w-t6ti zkCb$_o}m9rlKkSyy{}$8CYU~da!=&U4{tnvfPuiBcV9i>c>eg#qx<-Q+@+oE}#AG%l@CE@8Ubq2u5qQV8i@8ZAlFL+|~yw z^|hyqrJbdoHEnnEHGXc^k-=hqFk=t8i)aL&{K{NiN#nVq@}Bwa#LOU9nC&bR3}DPK zDM9ehgk28dJH+?~!VkK}0>T15oF0Ib;0u148x?j&h3Vwa!dFnS-R5cXAXsz2rGRL` zQR8&Y6d|fSl$={IZ1D~bbXT^en1C`?uG2GOnF3WOD8Oz?g=tnZeOC9frG% zgYKI4lZ?Co76vRTT-##L>9x)t?Em4V&9VHeaO`?(#+um2}XyOy);%rS?zIKhaP?aoF zSDUHAJ~fQvK-RC3D=!HDLv;T3(|K9eh2t|%@MR){Uk&{FdTyYIAb+O*Rj!ta^pC(V zQv;1BYefEh4nsB^oM_Qrx_{>;^)L8+`SS5sufgw&;)2~p`8$gX5)lOz=IzYQ+?JJw zXf~2*9Znkt0MQ>FEXg=@Ag8XnuzG(EWDyXE33K!Juy(XHaIjhH=4eW2fIO)v%{*OS zdF|4<=TC3HfBWp4w=cea`{LE}`$(|v-Xa8d-@4v)_cki5wvM)wXg|Kv_mwa%6Zgo*S0LT(Z{ujIB8cmiCD8WF*kYxl*R#sl${|-O4udlBKA&CWM5$vP|Zr&%t5FHzYHCu?g~#&q)&>ZP=x0AXfaJpOe7nj z%CIoeS);p>C|g?WHzxCqyc#(};tU;(JLiwkz`+e>DPCsj0(j~#LTJL1@eCXfqe6SgwN z5XeQC-v|{Y&K@+;xZ(+05+tL0|Fc!ZeaR<7VJY(zNYrw$Lm>(SXYk8+Ib?NAfh_ZF z>SFNA1`XJ0Y9(@Je|Ek&i?JYN7}iz>xX-a_kX=Pwvjz?vz$r>LyJ*pDR~MTdTf_J% z3109^a!3c6n#kZf59(Sepm*v zS_OYad^W@;Znhat8V6@3p@-~>)LjJweZqVTQK2^H0Hu$;p)Fw3~A1qGjkgB z8fHEtklA5z$A$It-o}%}uDJbeK>pRw;MFM33BIg>K!U;`29B>#>k5ADsUsBrIf@G` z?EtKzaCyaq9E&+d2HIOsUFd4Lav2F_&x1R+sDGb4xu?WmQd#0}WI+xAF0s6r0ds+6 zf#M7<;M+@ha9;{p>#5@vbUjX=IC%6>QE`4^3ZX639RkPJaN%?YVuktLuDYQ)5lzv4baT55U15sw|+xMW2fVFPCmt&JGTcm605c z@e5>5Oa!CH?f@z~bxT3^4q6^n`|}Q0796fBsI4kEj44e?I`54TOeFI0AfGpK+h`mf zu#w1ES(b_9mU&}V&UQsTt)=_j9kisfM6 zY17ARE}LU&qz!Mj$;%ey+lKY}u8u}gVJ=)}3iA@=A0;P)L3_yLIQ}%;A!QP-2&pk# z%^<;eBqL=r-zrkZHql!GUe?nv+KH@%fXji88Qdlw0)P~F5`W3lNS?(8)gsYR0>w;N z@HF)8d5JP{Na*vFWD2xb%gC#8fUg$trLTAb5Zl;qk#UlO^ zp2(c7Ee(m7W~OU6=qA$)0+N6iD;`EofGrq;b|!OHHaiF{G?_fNkXlR!LsMh3!^jeg z;HON)NN40^1|LR`gk+=TM4TQoX3Vf*!~Wj*R@8idJo-tHZu@yA@eD{PE|v8S_{kE>abk1e5` zvXlxGUWiz>J;n#594Jn$JydwQp&I2OTBZvO0(Uiacbx9-Xl!dfR)4g-xG)(dGykc} z1_NI=i-D zY+=LvJ+1sati0VUoE_HLTdyH4f#S9?)3r8RWxP()#7KL^^0^ReqegIcgWyk)*K@SDhV@!Nh&O*3Qj{OAd=^z3|dH-1WI>7%*{l0 zEePs8`Psr&1tE0Gu9%1*52z}X!=pzI!AeSf?sO)De7qgl9*dp|oio#dLkA5+R)k+1 zD?SO+X-RSDInm{ES`vRT{U8KW<#DbOf;sS+Wc(pK$jjHm0ofIrD<5}z4_8~F5{sT$ zD}yG}!gQ_edXc3Y8S3b)SiE5VY!*5IVR}hp#*CoJ3pBtlT4HQCMleb^Vi-a!mZR}q z)*fLUPmhTmrgP`aKy^v`356Jjv+_lT4I9KpBs?m44H0pF6?1=m|E~M@MU#EOuw&1U-%NtosbW*gCu%N_6 z77CgY`2O7+4Dx^Ua)0?W9>!){AYlcyEdi7+|Gqr2kcin;4n}5_!QMPBFkB`r!8Kj zs=Gqn#zM!_$ry@kTeJ_wDSi}G*|}+PCHVy0?8f62?X4%6h9KX5c>n6-2iKlFy8iIq z)u)edKDc*XzD{om zZS=+SF=QMybP%EAv%a5yhBvW5@#mj0<%X7i)bK%z7pghg8)F@L=sf9~fhX z>&c(lGx%ly{_Glp(em|jNZuJ;hzOGvw2J(am!kd!zmQtAedX9b4)77d-Y6@8FbCuR z?k+Yq>(^PBt-;3t{E|Q0SQ%TIuf;WY!2&flgi_K@Q<*eVb?TV0Bl>?S*abd7fJ`PV zC-?beIrwr2jy)5{s;jHbQ&$7Ls4JOE;&IT;Nb*O$w3tW|e*y{8Ka0WtJ%0HwNCsxB z;Ve3x2@bLKX_Xeg8YW=a=d$GlT7b?PSqkzJuB(;hdyiC=o;qHG%X(`QCGgpcT~N@X zh4fLy@#rqQ7+yVpye-C?q>*wjFOx?9PV~dfxK&r=5pa(jDm;3mr0#GDNiXLH{ThZ7 z_h#?N%MzM-cqHU@5T4kkVM-Gf&LG%^06#k)Pb)81Ge=u}V|^|9#iK`H;Q9IJkpsqz z8o;E$4ArrkOJ`Y{=@6<2yIeO&o{RH#?Jr6tSRbj{+ivzweJi6K5aA$VPE#|L;l7Y$TaBiAp=%uX$1K@V)hQ1 z(9wK?2_{Uo8O;XB*y16-l+HZhmp=;EBJT9!7vu_@B8<%10SgV8ApU9$Q7Vhb;iiBR zw=%-Y-N#%Rgc(9%20*43t|-T$H=iz~LS!W*Yzz1Gbktv^4OujBVBd-3MlDcRGuGF^ zr!JNl8s!(@<78)LqQ#&f0<5W1*m5*{$iT%5X8U+L&}_;{r5G2~83(}^3X6jj8t}r{ zaMFV1P2P?)j0o<;U-DqZ=9Of6OO$ekEoB)>j6BQM@!Q&B9Dvt|MC7(9`#PbwKcQD&~hx@%imJjk}?}L9C z$bT05^2NDUEM3BYx$wMY(FubXnENqnNu@wP3*(^eSnDhOU(y~fp;)HZR+oX_vki49 z=eyd8zwO|c_{+e)9Av;t7CTBt4omVAD@(JER2Ckq0rHsJ973kpd>S{%>T@l}IaolQWK79b2{qC!0AHHGp%NwwKy{G+Hb#X>gG{lkCQnh)rCoND%ULy3&RGo8Y zPM$Vp%;X8fS7^>fNfi_2m7BS>sv_&?VR7{vPXn-L3pRkz^aLUA-8xYwYMDLk9K1Jpf53Zn4{A z1Ic?Ek5!z-jgysXwH0^=(L_VIb*#3GIYcf&GA{zW#A1nGS?59~!#EY>CXh=|H7lzg zcT&&7M+qib!LO`#`B_3O67a)^P;~31=SAYh%XqYm)hhBoPMct@AcLrS# zWdCeCqJIQ=Wx5Ux@4~risxzid!D@rCATB{TJi9qtV;v7`jTJm$SD9T3qr@Z1fM3C5 zD^ZwQ7y*N=my@nb5kzOgg!Xb|Msmju{BL|Uh9pI(9&NW^<-*ojt``sIevaa2~eeK?@ zt9Nc(2EyEbbnhl8{^lK;?Kkh=Jb!ri8uNq2dy~V1-AoLZ&zv@9^0=XDs^ezOoWLx` ztQiv~jUPH^)nJH5?0khB%HOq zC^unW{w_}b%v5|AMW0ue7%+n?(ulw(?xZ6w`D~yXjAFZ*D}$0SjFG)#Vklzf0(0xrk}$kJ~I##QRCkX^yykU2YTu-IT_ zjMfpr5_26lSRz{H5es8IBLf|#h8HiIH)Zk!z^E`(L%F3-L{T|nI9((mpb}UVa1`+r zITqXD+y zm(SRJ_7L6F{o7XnHRA(J@Nr;0LA&-~c@}AK;*P-R2)E!(cr0%qt=(X~cJ(T9hNnw1!H`^AyDK~Yipr@(}$d+pk=AW$F--gfL*%Md0+wNcQd4B))>n9IhJh}h) z{w-zF;VQ^|$nuDXciz4x{=Pxx@!i*7y?ObV@uf43)o6P8-AOoY%vY}$;%6-bYVD=7 z*6J)kb`|35khm=r%L}T26UQn@9+-FFzLG!FIuQf@*bxBXk^*cxcGE1|&uLtm1#nPz zmlW*INsA$!rlO|`Vqne;;oxKIY8^?P$yu^Bhle5 z6e+aBNW!@kkdyNzUE}Cb7atc3-Xz0Nj8ULU_4l-a*eCl1p2rTCaCzCYJA!KqCh!o6 zfR~S2e5)37q!KQhL|&q>tc3+6;hh+ZP(;g0_PZ1INrqakS43M5o(6tpES9tqX)SFF zo)6W`6#zC2-*18=-BQiP^CpfPiRm0;s!UL>U8A|)axDvstt|AlG?9xE-XVI=K96sBE6Q#k|^s1n!F=#d1mi-dE~$QCtv5!epmiDw_Gdc%vPgk^l^EF zy4sQjb9J&e6WOaZW;3*8iGy+e!kYUeF+=K^#0nCjfP*2w{2K{4t_Zc$P(a(|(?gj6n*GBINW}5_? z5DY?*V{MHR_~jtl@;G-uE3W`}C4S+wX&jSm!`+cZJJ=YQ8m-`(!>mMjkQ48}rZT_r z#6cWr@zdB6;e`^CWlzWJN&&A-{<$N7e7G10i$tO#k3&g@MW0BBsR}*@Wx}p-1H(pM z8C&3%ClF^j_!dAW&eGQ5K>4gRFB0=}6XLf92KYIl?xW0Pv=+_8vITQZ*6D&=8b<5% zwQ;Y(s08i^M`iL%PEkCj20*}l*`FTSf_XC-NZ%e8g5HA`p?rO4D_QdbTLLjwlR`Gh zo;9&HbQ22~V4f|F^^EmbTAAphoV2$!b9H2!q^Xmg1#XsRCTr;165@X`+`yM^7%1i) z!X%3k!ij7*9L35q%ocbLTu693g9i`l(-)TTi%;MQ`+h<0+zZ}6i%^OBKa0md`{1wf z+k2m^n->TFTqgSU?}zoY8kzH)85(oN@(9=i@@M!xG75U!6d>%K0l$1WBL1e+FikEM z{8c{u75F_}f4JpTy}<8zCUaTn(*cATBovLLd$%4xxWkM9!?x&_Q7zuQ-UV7omBoC) zt!qpiu=?lH1*Uh;^v>tP{VGGgXS(pY5H5oo}vZ5!mIPRvfqRMQ2pu$-|p4RBv8ArKR;=0V%fd(} z)5o`7JcDq12&lh)`w|orf)Pu9|Ls@kLonyLdZ7(pj;52WJ1mEB#aNzJZ$(KuAZ0C}F=_F1&+mla!K? zvL{UOi0cDE&Cp+HkVmSxAke0dm?!8CsXFS3n5UuTwdySv&V0?}Kg zsk>q^OOeQ*9c)c0hcVLead+5gYt9_vB<$*j4rPzw3{{mG)2FIVpNv97MP(ui$yu{h zw6qpjTN@!PiH-``vwLd@>4T#+D_4dL?2mB@EfbEF==z`Ov5b`>`C;G}myAwzc_M zstoo;^0APU&_BYCjE){eBK5Cm0V_LgTTU~C%PODd3!N>>HZH+p2^Jds-oMREJ)Sl= zEld19ynpTeo2T!;dj9@3(y2!v>;4_Ujz2RtbO4_r;tO|fT_iMjcb*Y*^yg1g3xnbl zN6Tvt=0b(xp@;Dr8vuP=*Kf4ex3yT!u!EP2IU-&*s?=5&UT8mcQy5cpV75bLO=gZ# z>)ZFQB`Ue4$feYUwi1!|!40XdRaR$220&d%S<)yVZK4GtpV;db>x5xNPP9sJcV@ zNSFa5jo^KS$&B^E)nndEV^{cc7o-TY>m1Z6Y2`)fJSZ}Xvh12lVd^W{Eg7Q;#DrZL ze7U1!%Zapg80^LBiXws|BRLjV92`vt4d}-i$o3+Zslgqw{g8=8hVr0%VR;1AL+DkA zAYd%+e1_Qji$xl^*Kx@OdU0fbtnT!4_IzUM``h5 zbu$w^z*|$b4|QMbnK~|IaZ!OAZ7uArO*i>C+gY2=n64sri6UhcM(&?c?f#mf0(TO6 z+)6C>25b4HgsS}RpTf5HyW&;w#_890$s*RrFQnl+OHF0=>}j}RgI~z!r3=+{wHKQj zF!i>MMKgi^PJ9%y{v`#X{6W9L#xYinAmKoQ#RxDic1+-+;$W2TY7dl@nB^yhW*nH) zm|hGiG#0Pe+B|)9>-%rM`sss6P(krm$fRFBe)Zzf>lY8uD!+M6_gE=z;yljv+FaZ%6>auG`P+8HQlSj+D&o`1Y z1FNSGZjuIn^Y$f^gOZyP_FMh>qrIDGde2lYE@>f3l(D=n}` zXs6-UcmlJ-kM7;Lef=W6Ctm#V!|NzHUp}MRO}$UaaP9Vuo?9#H)qth(3NmVTL*zjwY-2%^YebL}Ju>z%;*MKgky};_jm#covMiP+BoyX~ZOD}E z@KmU<_UuAx5=#>hEYtIqIWrKJm9LDs?52byA?(WUf?`n-=j^7gVNw{i`L6gdu!EBT z%SKSzGvG6Su2}guYvz>Eqlcn!7D*Y7>JqE=P+4z>rLXK0vKOn z0)lB`h8;LFd)a1$zA{&oxir(bVL_fS&-959Y1l$uSr|x3Qh1}f6|`-BfCqae3cD&yY)Ug;}KtOR=eQon{XkAOk>NH0_sT#9|mh%E{AFIO}80WNo<{>?)PnMEU@ zrgGo0x&ye#;-Z6u<9wS~#DF_7EHqv^62JHF+<-u)LqU6@>2xgvypKfueMU4?!26h4 zzn4$%17X1R{fBoy|M)Faen0>4{{7phB(#qo-F))s_E)cwQa^n4^8SlwcOKq{-D<}l zqwP#xLtQEDAvhl-A}AOmLdX+bIr)h!kicE%Pu;zJ@zryxTE?KB(Hka{OmD+75h)0;s3)H#aB-`!0*fF4<6pXPP2&vq(6Oh@70Tk zFP`1wASWl~=6!NeVupg^{T^3?+dZ<(zkd1rotqbd`5m#+NF*3Hu5}Qg$+StT(R*hk zZDv3TKt+bSW@f}^ro}QrKrS5-FF%8wbT#t-9V#R^qK=U z2K(A0gQ3r!o3$O}qUheWJrGu$D~WP!5xX#Oq)(#Tg%`9~GDu$@Py>09KUd__7y`@e zP!l^T=y6l?vS*OBR?1cvLNF|};xj2m4%zvOGlQ#>6+U1ih7X!DY3z*Y6Cqw`4>2|X zWH>!VarX&%=4W3H=r<9_%u<~(LxpJqbctws{k$BR&=*EV*nsR7@mH)NR$4_6&O~0w zXTe2p_TR$VwNR#zyy0*dVzRa{GB?%(zfO+kVx3~BH&gAzUy@8iJ#7QMl`FKDETm6` ziPfZWlg5pjGKneg378L}d4@y7@0Sgs0?EUNkY{tv(OR-#1>2-%s)8WRCF+>jih2N3 z?*aW~U(z*KoNpjwZ_1&sDFvSi`7@@EJYN`d^8&*@bm9~_`~nN|HID=@Y39Q`r!8E z%b2mBJ9)OD8ci~~`si@}78Z;WqiSH}jTph8K~HxRs;bv7*=l<4#Z!!J@4kKWge$|_ zS5KJYC;mb^6M{jjxO#jGw7=%+ArIyaxg$mn-@Rn4NkKOR^;0tH-~af{&p*EBQovQ{ z>$k7oycAUc(@!+NL?V5o`_8p);n>r2PSEVvx=64e+`c5gB_4p4*$v5qNGy28+j)7x7Kr5lR5%Ad-?)lSNY$QyMEfBD0vgM2$@D z%^4z_O+;P}%3&e7q!3Pu7F*sn`vWMQ6^q1bxnhFHH15d z-g4d;JIOx#-KQkQBL)u{KV}R)=;yztKbGNWM+h`qK~Z z|KtDpm;d*V|Neje_{Tr~+rRw&$8VV&ymh6syX|Dti7IFolv=Dgz(NX1Ki*TcIGr~b zbJl^5BUJ@Wrx-Ul&ZvF|&0pN@uAB#AcW+$*zfe`;_SI9_HsY24^$$P%+rRwuAOHT( z|L2eY%JJ|2`t!g3;YVhNLH7^ez2&{}-9PeX{^MW&{oj87(~sYN{q7ZH7X>o)HFL+$ z9&tsw&UhnzZAxH#cwpT{kNZ-)jL7(IK?Pj7&~mB!EYj=Zy@^cJniyy<)R=}})c%|bUQGN4Km3e0i~aG-!_LcwMqEXxoZkaNT;D8S3D0_~*IBHC5E z#8`cL91w>1g0&{vx;vZye{8)6T#o(!{{Oq(i~F`Wkx?lXQdEkBG(-_84ehBVN%qK2 z_DDvdR9cjX$liPJ>>^a!gU|2(e4i)%eZIeM_xZT)%hjcFb{^+z9mny~8`M`*jf+!b zl#%W@3uBWJqMxJETcN+EG8HJ4MRUABtwv6Dw8HhyW9kG)TMGwU3w9z06DkV{-99D`!OE5=65e>X0}>IeK{zXKPSCNpAN zp>Z2Bh^4echYlQXHHv8tvxAinZbVoR%E9vJ#nRqG z_C#<)U`EfVh_*9taDn!54h!{}<~w!rcncyF{>(7G z+P7}mlD#L*{%ZEu@0iz-8(?C&X~Xj6OXmU&f+!L~-XiTT`&Uq-*{Yz}1&6_I-8v2E z-*?bpO%)YHzHm4GZqf2zhQe5g${$2h>VRKi2%>4nkpTbtV&n5hfH%I<_(X<0kIc&P zQUSb#;Jy^UQVLD~nc^4lLVgzbHP$EP5aeeUTk7A&{uMH9cNpd5aL^^WrG>HclNuZ=}LreA;!=2-qtWmgl{uupduK8Cl9ueAv zR=0qP`O>M}Og3((ChvqRb@$f!moM(4;U!b0*ThVg-Vyt|;SwW9#Q_qzy4grQ-GOSb zq103q4E6hsGsgta)X#GgE&-6G(U$JrwIOZ)4x~f)Xr0SHa_!RTm(L%Pzym#+%(R+C zZWCLLa-{6-6Ak$hG9k~-({3~|Gtb&o^Y&UvP zzn*|srFTch%D8p_6DV8sl=ko0Oa~an#NJ(N_X|SEdM37n-8du?sD5@t@dQvaz$Kpq z)cmbo+gBm!;zhCYk6ofHR$Cg%m?_lX0k<&>FeSPRey5_53zvz-TzDlh*M#E>%MyZg z&+eTx`}Stv%FrSGF`mUcdi+>pjC%Yr*bjsv;st%WqqG4~+HrbdQZws8%D=$TL{ zxWl7m;1>jbIesYjH$<*k9wF^yVRGbXX=X(Kik6YCc7MYmTDB9-5ZXtx2zY7u>@c5c z-i~-)G4xqHCwO5*0I?EH3Yf*ilnIc!i28!v{QGZMH8%a@cOpNMYPCK+X?CrP zjzrIne~Yh=TeGHrF~wpo%%Ze`S{la2dLu^~=;-v5)e1OubnV)K!Wo^f(0%>c1TF`2 zE)r+J2zaSy8{?^rK_E}u_kPX;Y@NuC@bg^$ohSO-z|cI1qB-Oiu9B?sIy114j@Fri}J*= ztkWma^01&2cX9lw&ddpegzv@dV;zeX2pl`srYG;jS}HANXWD@s2Q%XHau1xz7joU> z_^9)E~unmdPOhagVoj#dGXPa)-hxY{lw*1S-%CgVISzs$? z%cRXB3Rjkb-|r3e4Rv)54fWr?aWs7Y*6^SIeCPQ7{aaO4d2#XkqM}zHiV8@i%RU!Y zef?7Q=>wfH5_JR-Ov(gQ^K-x~&2Z9Y@Jk9Uhi0-1+R^lHmn{m0fPqA#mwjlU zGu`#QvC#~hj$|bsK9~TN6d)f=-F5K5E~d%J30puh(nSy|PR_2i96SNe5=#?l7fE9ApTGZ~Ccn{9;cEGfD@j}@KUM?qViVd#T*)jl zz;{}?S7%uK+!D=351C*+!fA@7hs*c?)~^RrKe`|jMrBD~i_?oUKSr`k7fpwx2W$zu zja_IA!zr0@VBluUOlOMi7tY`0IK_$>gx{Kv z+hp7!=(7mBR}VCTZOCK6Z>yGKex$CUMxRYIpJk@>@4pj#iL-JoEQ9e^NJ?j2 zp!5IzR3m18eImb&re4>sok*Vh^yvvzn}gz)u-ka(>hyp8~3`Sej&FUQ|IjAa}^l9Eki zTszm1R&mg)BvOFu?VFaMjz|2$AOq$=%DyeseH&KKSu)p;_S9^N0E{Zf%LSp0-slkn zkQbq$v$rvEwlha6=;353T&KLL=_Uqw+meEY2RZwD*m${)3-Y%k3KPFhpUAv$F8B7$ z3zXgn|I15@>#9kWYrZwq)z?*5SAP9k_PMm=V_8XYWku zAa^rzcw}NrsEhfsv0EaSFASU+=;&fURztPdKLnef<&}`d{Spi0D~d<uk_n*?b^0sOW^Qfx}@%YK8_0)gmC|%n@7WZU;LIcr;gmd zbv`uI9{~vSR(6=_4;p|{3E|<;A%itFR8cy#LFff@qv>Cy*N6yUMAJfN^O@Xy2E0I+ z(D^@_&;Ktle|_bDea;WePz@SMFS=?fKfue@7}{0@Umhvp<^D5TEjj+ePN4vi@k^r* zW;k3I5C`rkbC?=1J77g18%8LB*@Xmzse;L(MIkJDStQbVkdA;YvwNel+4(3d*3K)cSKN`27Ua<1LA_ zoQl(e1I2F(a1y$5^YSUcD?DkXr7cX;fG~U&*ky!Qyz*!Z5Nb~zV?R`4RwkC7iASMt zf#2+8R30249q`JUf|Mi(QKTYb$q^?O2*+<B?9s5BVD3gy=`m$SAgoTBMgEk@%NF4XElim4fL*pYe8Jq1h?)M3 zFs9hc+lvNakWOEh_&!)$(_yj|{upG=iZg~NJp6r0fwQC)`P5RhqP8mxv z1Yxl+^eQNkvaN(X0tVDLOv1}T=L<2z&ua>9u0j4&X);p?LxINd*>nV}llrx5)k?l= zAw3v8NDI#mngDcr5Hw-)j^z$XIBw@i7nd%YxoXAih*{ILwA5QQ|EEu{9&DEzVKkVn zucR@pTm4J?g{K8zg|@5N-(=1#Sm6mTB2D7Ea7sD7Fi$wojVD>$IDY&R1XATc{`!h| z^}j#(#qhNhyLA~1AzYctw}(2uTWU&7j>w-0zCalKQv7lt9yA|iWHZ);!5Jrn{xkUr zXNmX=e&Mom8acPj`$%h1hq1HcVCufC%p~k&e`e8#Fonh!3lt}i;F0WYTd{BFnv5j$ zuv;J_5nP17P3{3MOPIIN2B?nt6pEM=xv4m8kV~J;I|!ZW^ofIchm#H+*qH)P4*?5= zy|}e0iJQ~m_$6#h7hI<8hf;SR%}NmV9SK`EubB@gA<$>CldXxRiSBqy!%5?fyxb>n ze`bkr{)vOovEICTR95=2fe71B|6RhQ1YwXW@?=n4S^l-6ysW;q=3Bk^5O4Y3AdYV$ z_=*HtyiiY!uB@cJB?uujvRF1z@~MaxdR2J|$A|YXpWMHG?a~QCFyIw?hw-V-%VHk{ z)$!F!Cn2b?9fp4}@1*s=UH z$k!=|WkbGBemLLyO!4-zcX1j&&eF)(SVw!H8lxG$2;CyQVEbz-A)@#7av(`wziMub zP=!a)SHYbFS~U{{%4#xd5H0gSxa5c(#79y=np9kq98|tMCqI-%NWS>Ai#5UCjsmtb zyy$2NBb@*@JQzJ(C$s8EO-b~l_{Vnc+Nr;0U+y7f^19mU#=~?bSedYABq+d@+8NUT zUoSgKZ~i$mLcDNc)z#6MXg$Vsq#^bohC>D_NbXoH`0l5v*1K0vA|s&|@&;?px+``Q zlEc6MmdaVdl$IM-K$utzPI-loM!@m}X!DBvOKE)l=Pyb8pBK3w3^f>xiLk1aIm5Z) zz~L6;%AIHMOG}VLZ!m_&hA_R6OnST9%l&6g1*r@8r9mO%cl#EE+ibnxmb!lzLWb;& zBtmdwBF#7nQU}&p1PC(WZP=ZyTLAMA6=7~x(v@?^?%h0p`}!Fw-<(4UaPa6PLrpwR z+&Q$L?bU41&OMTP@%+)t=h?IhlfycswVCMPnzArXR~r&dESSk(7s0 zDJ?D`ZXI?#L4J0QcB4&43>;xNz=q9AV!?q~XwcL(DmzSS9^Hk9>YBeAbH1`89cMopb!xq5fFE5>o|yJT}r)!7q!f8!sK!iPFtR@&Mm}>kZ^Gy9B(%5s1xns7RhU z0BI18+0&fn%<`qR1+@7T6)|}=&jB^hJ>4dHx=)(sHFcY?WE4 zIz)HCFhgycT@!80=-Fb>!GUs?;S2LqiCZ-Wy@R{UWT=~?M(EKVCsSo74Os-kCc42L z+qZAssuiaTwuzKZqaWlSDn2;jjURGE{vR*O@cb36jn5nZB2SPp8e*BGrUYk0E`Gr; zimk@v8T`r+9%`V?Dh=k^;Ftat_~k~&so?zl8h;_Ni!N5&<^zd{S)lmtqmczwg9W={ zt;x|$8nCC19YUvujF;gcH4*XpP}*LgM;nK!DE%C`k=Y0Lv2OyEXhQtvq&-{Ww?}VU z!^W$5xJad?Y(JF2PNF?*24PF@30Cx;%s!39dS3Pw?0Vo%pFNg$B>f0BK8KPrQg%@o zu38>8XOH`M(HJbtUMtoT}1`njs| zYkfoQPpJNcDGBsXPzz{F_!Zb~AUIc+d@iDAUiAJ2!vEqAB6+5f{^sQ)hSU{h42PfG zyK(W#`4jLbS)vN-^624Y662#eDaVec!Q!}i{S3*#{o9ux-MM=I<|W?D3PoU!r4MRH zy7Wh~_hn`5O5C#{b$<-`2KJljLN^pk(n3a!$q$eFVI32Zr6Pq21)>yAbS!WrZKev| zxOOg_5H}|)C`D9o@`rqRa20_-WCCd7S-7Cw3v-LM02zZ0l0z2S_vqfakFp}W_^6th z(hkwn?61*_Wex0OA|eyY`3gi4{?DZ4)PD{tu9i5gEa7fQ~5s zR+Haa{YxWAcmAAU7CA9~!r1^KV#+>Y> zrDw&omzYaT;b2KOn3cQG6v86=742xzu8|{kcqjqdKfvFWAu@?Zn>N$}tb!u*ROyTL zoEDw50VX319qh+rIKv_{b}?9(4>uV()ZW$_hZn*wiXNJ}m_=KR9yZb14A%}UG0jE~ zqmWls>aNzO7q=!j9^B=6_fq(`Dd&Md(u8JNAt$Mc5dHpC4)QDDJ}Ky+f3ofy9Yj-J zX$0*5`h+*2Qy4TzOIKG*Sy@qzytvA92#0xf6*+~L^Jm0^IOmv*&>L?#l1)$UQzucp za5n?LFk7fTXkl?PaX=R6%`D5ON%SYOKPgi>uTjdOfLPSDz2}u6A%{BnQ%n zyK(8%gIkv#-no45#s&IaS1vGMV%2ySefZSmm>t`ek`iM8h$0emKXQ!28GCXlnX?lK z%JlkZBkb75I3S7^){hc+!xD07LHSrWAG@vjvwd6~#`WmhUTQTXK^NDExTya8lV}K= zh|OpgrUnzNNAgP_K16HeQ0mcWUuazEm?`s51HW8sB+qoW2*D(Q^sD{6X{-K#FcF#O z@+As>*OAomUwMCdMNW&LBT=_*{ zuAtCWUA+(8D!?nZon;{N;}L(kJ@Uwn2nP;+1_{4I=+qH^nSlFyJ8(~vThJ>aXR^69 z8oPVp)V*8^!B{I00(Klo+({$rVCr7U$svJ_V8mh`NfZe*w{M=icjqFU4K8f-M-VC5 zI*n7D5GEk5Kaz6h1mRiQYRbCOqgg4mk!eq%+JoDfhEhIm zBi+2zq#bN5r4?`{pEWdxxTl>uagcvIEod^9Ws7Fu9E;}_+{Im6mnHApAS#PJn-6F1 z$v@7$ku*D=TLBC=B!S8MHpj)%+-bfJ95k;;oeE_PhQi0KUUwAh)BIbPe=EfqTR)AEE(BiPIRBjm-@3x6{P zXK*Xd6DULTgb^hUbqWd{X}TE?9Wu-SUF`_7(LB{2JXpijbePdFJ#EY<2WesauB_Bk zMY-2toq^bQkfrl=xs_3Ci!UgB@HKxt`}sd^d(Am#%|sNIKN^9|AGz7`S8&sU8HOD# z;3ejgKg+=vIBQD5m-tKY9iU17N<&{)3-Y9?iJ_I{NIRP`bo21uq?{*(W@s*^1Ir@d z-XI<2e#ogN1XHsl#BWXB7t3ne)TCVpQ}-}Y!i*(5Lxf{mG`DV?eTs1 z_peAM&uD~?UOIh@Jp2_3BRJLXUcPxHnAJt^UO}sP@#GFvsPp;RnFn^T8z{uz5vxWB z{1e6*`np>)m1dxf#t^rwit=jEd5kOoy&VZes}{-npgPNpt$UF(Z|AqcW)jeZ6HG^czOqOJbn@wS?pRm zfBNvnb1Xm2IDBv)C9T|9rJpP-ZK*HtffPffO-mxeJh0drqTScbSO*Vw?BW;A@m+-l z+3I=w_iQAW&dJ=v-6@%|__kHN62Ef|JuB*8Oq+27KxViw!Z$p~)z;cnsb^Pk)OcaY zPpHMn>o6qm-npHXxe-f_yj&-;KLzB%^uRTU6=^JES}@xmw$=Kmxj6sCK>gaZ49hq! z0N7R}w=DdHbU|-$@%+#w^TWbIynVeKg9AKPt(Z4|b_lH<$RYA&Nw(dpMN@`Hk&D8R zpzhzZl@Gd6lHQS%Af&eM*p8yb=p(m%lC+GGZLzbvSMx;*aSiLMyy2t z3hoDN&u=Y)Aej6{osG#L2?T85~l zVT{bs{^Pg9&Io^4D~h^Ej5<2~Fg0b=6AL8nObJet2`&P{j_4<3dPV)D$ zcbYQB+hY>21-wMwh)_>#^WioTi6dN!a%?4$CjK%I;my2_+X&Xdj&@_`gim7(B$d6W_+7ZS zu!m^G@WFV(TUZz~3_^fUd}IQ|834jET4n6WCyD2rA215r8Il^!WeQowKq4|rNiTgo z4qg;fq9#ocClkl1P)IYtWAhfxsUtuuUzzvw!51VA=0kq|%Xj$=zDJ9e!k51BgU|Au zcha*$PXTOkWAhdvAX5TZX(~b9! zTo?lVbEF#6_8ty^RMAX$}ffAg)lIb4p5eHAPy|&W~CfIl8*WY6#!DciqenY z>b}z9k*LCFuADy!Pl*lklz~?+9=~xl|K`>FOXrT}9ZNr&lgyA5snIRmIc{CNjHl~? z_}DE`$@^mRb2BcVIez=fSvLIgI-F|!B(Gk|yL}z^fIQeuN3v5g55(=<78Sj64v`D; z57rzUaNXxJcbLxVCC6|)qe5Mv2X7H}m-8bRhRzQ4!by@(1^U{Bhq^6YzWa@OEI63|elC9h(b>ygepk80+ip zY-%!W;&@B?SI7;1LQC4|D}jffRHV)vY)kp4nYy|fWo!$O-n=>OWy*Ly129o0;HyJu z2D~)x055?Ub~MXY&`dG>RaQ}M-KI6~r#%IVfjB^hj>Rtm2=iP5{g13#a@_f^yjp%g zO)k{=Fq}0sRd^)eVkto6mB}06S4|ZeMKAcz91?${uQdGCLc9Q#-O6GF!e`iM%+A0s zOU$JfbnvQ1{32Uhw+QCI&KS&6uom0^Ba3ns6q6c}6s07@q$X~MI!NC*C;PzJ(?{>! zzVzzFz1Iaob0^t9-g*1-so?)3|0#M?Qw8g(qPDVx+3Cl^R}c|deS#f2BtYR&lN_6s zCT!@gUp|RO@7aT!&slPG@5ZyIcV4}G^z7Naw{H;%K78@$HtHlAK~$ZDZ!xktnFSXD zE)&7@Ktc>NENC7JS*aH8fx{b77~@BFbdDOXW2mb>W#TArH!B475i>pL;-)2S=R1OR^lyZlXo79~RRN5i=N}da`L{4sxD(fy7^| zvlmAA&6|larZ?&Ie8hTTw0x2LxIk_sXTVRA?&Yx~X{X_qUq&W*{`k?1&|ok6z0{8w zo{P!n@4r!$tz15fM3-U~v{Ju-R#*fw9Y{9eA^0LzV))CVB_aj4Us#k&<^|8jL2*t1 z{wl22^Ihl>JlS^e{KT=nf6k z956tGjvTaSwjTWT_4p`#L;kZT$0hiPzo)1YLk`Jey-w4eI!UvNeW|Z7l z#b{&imK%~>_fY!24tt4A`@TK@|RpsZeUq4n=eE#;WvcA5ePRM_1 z8tSSM5ujX1JFuO_1d%inXL_%SoJE%s2++bRe228~WogO#nwoNiNp44mq|3+(cYcJ=rA zn%b%_7!$mD_WtdY&&96@zBm#fki=sIv6X1w-N#nwDsp3P1#ezGMsfV$-u2rzFESKH zTR}A;Qul)iaIrGd;<@MGSCE^9l~yd&mjnB@9nRc~n^11{euR_R8S$8nPzYxv#e(S6 z1nh32@#LXO-MM8sdOf_e*kkDDF|l3S|4Prq65Bt2r&42Q5?xl5tqgXx`>T#I9Xe{5 zj_JrDj`riGI$FECO!RUW-OE5npwK3H;h6|2Wo`}CL*;z`W~69yR^B)}kA4!&a4 z8--tiSS?4m7rVUYVc!?bW{rijF%I(Q32R0f4GSxtXch|3CbeF)P&mgDUpT-oc{PH1 z_QErIcC;lAF?Dld0jo80D@41HpCN!b*x8UOaQ{D+ogTenF>3d)V87Wj*y1sFpjJOl z4t&TC9ojJq1Hv?>R58_2>8&+D1N{+gA~f=CTK?0vO>-z%z?q7egdF~)ii(QdXNDL9 zW=YQFEc#c>0#80AC(=CO<5&FhI{6Cj(?;wS)==%&SGkXpqB_A>Nm$AwJEETkctsbQ zN97)J@Rj+`Or>FXqUsuLY&d?52|LQ2?XA#pKtBr&5+gPw9+7mh7Kd_sLCDF-?-RO*l+PaV(5%Sp;Pv=`PNy&7m&*RJHheEtB<-Pe+$%Ch3J zFNLL_3(HChzkGUI^66c{vj5?hk&Y!~_u<2L@8`C*Qq!^5!K*c?GbnQA6;`o0m_XKD>>;$DNz_`vK(ZsQ$Sd zP&l(s{Kn=1Oesi;77@L!MvL+Z^p?EThl4=r0b8G?g@~|TcQ+KciWnbJ@oE&npQ+CI$ z5A=689zKLPMS}?MiZ1AOI<{}c&XKk)Ek+wbbX*^e#fQKzeJbw!L}3Zk!akZxmdO!? zHkt@H)nUPIU>0)b%wQaJJpnI1TC!G=H_%v%To6Jz91-rjd?{Q_;n~hr$|E-xSEup8 z{;sHfg-GAp1kW5i;8`>V4U#@NulD~Vb*Yt6D* zyV?%Lio9)fJ^R zRbT6CE9>j%3ss}wBg!%S-5I-j>z1V`5G%f-6=MEVjt&T?j(6`1J`}y7Zw!wSO)<6r zFrx^F2<;j8lBhp@eEZVHyyLm4DT!O*_M_nQcD1&%F`jHQVw#UF4qEUquZ!0AQCJoy zj%CtAW+7?e>*sIr`FVQx`Qw`}9^EPyv*Xf+hH98wa44Zn!-TG`s(^KgM!AR$#E)-t zuVDQIiskS1)wPwSIKw}Cc<0)svoO=L4kn!u_8=GWBB0@hJqY74xL7p$;B}lmeVE}d z4ol3HkSU3vd>G0{I!${Fh%n_laXdZmcq%OdWSF>`96q#P-kSi|g}ddkBS{RJ_erEI ze04(n9Jz;+Jd={i7mt`oO8A9iAlGiBf9>0}#KaXH&Ac!49LZon2} zWYmdlEaKwlUV+0Zg&>*;_=;X0_B66qFQ3H}1N@?Bqg-9Rd=Bf(h{eQH#vCkPMizmt zVe#A`z>6*^dc_=OA5cCBz6<9D`gp?Zbs;ANt?)YJDH7ByX2E;~bcOJK@tDPDV~p7_ zbF-m_L;53g*4NV}<24&SYLJeOFr*a?B>^b;gF2NN5|uANld;Ab;|ZS?e`Kfx>E-v| znK|K$rKZw@eWMJ8jSThrsrRAFgiRJXcH1_sBuhW>3y;MI12j@-(ZyPU^{(hivbP8bbKt#zg9?pAxvrr<85a{p7dJC`=aI~W zE9Y_#rN?dGx@=F}IvBj?PG>#2fAwv_gV)dQ)4yU;Ox{Rl3o|e`CrMf*b`+H^qW=1t zYC&lv#5UB{)*>t@L&HnxWZ`DY-mT=KpNn5(u!9H)E)``dArQQmmkJ*qyfO&E$a_B& zzN8eTroMOQGAahVUX%B2S+gu0|8x8$Hyu`v3eyk#o= zq434~w~wDZynf^ADS~WP#vYu~VL0Epb^i6shy489j#%S@{GZ4Bcdz8<9fCp$aw*J40WUMw)@@p}!FQ%DU7S`#E@GM3hA2?bgpOAG zwk?eewU;jrhiXOhneBw@U~6nzwrPDNFr*m;O=#8fS<$Q64LT1Y64E5Lv~1rZ4!8%K z*Dqnz3r;~j;3aeB2@ocE=0%#-lExvBwSz&vu46~z+F=_J9>iuhIAGe^0~n{W>p?z1 zB|D4gEH$2oUlSENelpCY#fywwv`_WpBG@2bNA}ghd0Uk=+fk$$b_(QFr95X+p{wFG7N(FA#K#%khpK#sr;<_ zcP>7Acpa=URQ*z1SY1i8mu6Ab^MZ%3UOgcrJ%1`U*w?|?)?(YbfmffB7uaXKeJ?Q+(~xDLBcQDZ96CSh{pR_7vW%7i7<%qwubo zv}*B;th7Chm9fnF{DC{bN4^|KT}^ep_%WbpeSP!#@u~bn=g#Kf&%-~EN*r4)`fq6b zA!`Y~RzoeN{e#;V8DXD4opT~L4Y*}zV3*CtibRyiC>b9=yv8j8@Zx&+@Gj}}9UzQ0 z8II_o)Vybw`&P$mOjS->S2r|e^8 za+kV$Piz$N%g8_*)u43Mi5&qlaw*W{+djz~*Ama$qciF#hzBCc_uH?g^C1 z%o90e{sxb{fdI`bL|Bl^)kp>o-hnWkXQsV$q1|03(7%E(iE#%uBYtiU*t2V>_J&gd za-ocZ6Cx~yzZ6&bSJH>)0|3!;W`Tm388Pamz1&@)iv~?z#qKJ-dy%WaA_Iesp%W4t zrwM`v^WQEVJHQ7a^3q(wQL}ruPH-tXd;A?9`R7YRC6=&=^UpWqob#pl0J)-dCVJY< zF!%ztST}=Tz{>$E1LT5V(5j@=ok!qI|MSKoTf2r>V4 zp5X0a3tcVHA5DiFDf9wLV9B~fu7c@e(QRNX*a%_DVR^H2EPbsl%i%u|w%)&fMx45Q zKL7TO3ol>XgMxMW!tuP^R2C9(H9{}EdE*p5u5g@cs>fD zW2AHG;wfAaFjprCLVmt*`WVoJ`uMTv74hyv(W_4%-@}3AD18441HC&pE>ZT9%oaR- zc>nfQxR(rhxs%+#1zGX@1*jd#u?$iXA!5=P9_-43FkzEE$CnkoG`LQkIP~G|3k3e? zjA)J_J`#N@9vW(1y?lHyGjV^yc3?=8?bAn?8%4EMU%vxz@s@^?&mWnErS9Ldb;IJQ z$ndCTVv8;c=(v~_Npb5BXT-6#`2O8XxKC3`-@JPM#?`YlscedoQC$y=^g}AfXqmj1A2ypV$3%pfGVMu zN1%!@feRAk0%ZP(NC6g>=tT#+N3Wdc>p8{BVmK=PKyPQ#21_#&h!#K(n0DyUo|+Tz z0vzEz@<$V_E!ppYsDT2LO@g{Q;VT`7+3=MrT7iaAK;9; z1u+z_D#~G6(^QoIX+ZslzON4UV|8_TgODBoF-gYTP}9&*gGEMp>E|z>il~CYptvJE zfB53*9o*V)T|0xnx{xv*O2i2{Zu{!Q-O;cOH=vvqtB7cIdgHybVD_}_n^v4Up3NNq zMZbWh^g*ktrlz9gb0LFWI&U>qWp&jQ>B1}v{UAK9mj#c~(&NL!yiG^)n^)J>V%f@| z2^NOVlT8D>?I2*Y<~S#7&-E)O2)CBZmNE zB9ebpA>_{}m9YO}KqhkOyC7l|~i=~HF05^XbymIq|@JxTE17f6>&6!B@DLzQ+^auCHHY&*9l{O}gAdF~$v#JU$ zlpg9Dz5Dl5!n!IVe44BCBt0Fxq&g^cX-`X*wFM}0Fi^&lg8W%bRsIqZ#UXlH>!X(- zeuS_s3x45jAUJ|i$#N*lF%0e^7fxr!1Z+uzK`xzYVzHc5LpcE8Oo2(W3BDY>hlZ7_ zvo*;xBWcLJ>!KFT4DlW_dZ>@99qK3UT}}=*{ngb-O}Upaf+2aJ%vVrgZGk8rm3np~ ziqTT$kSK`ivYb{P$ADiB;-IDZDE#zLH=y)aSL+355?4xwzw(J91Ml6tS6@|SHZ>4K z0lrvBq~3>90XD@_^`?LIR_fK2KKwtzos#n}=hC=Z3X58Wj)rJ4OQK6J<+ zz9|rcmY{IIq1V&An3fu*E-_(J)I=(7d}jSVS+IbLmXphj*{= z(4)`&Q$ENysb-4A5A&Ujy0-jlX;I1NckkamV^SQmZS_dw!L7wgx+Zv)wQbX^k5bn` z{gwOl?5NzM(}-a@GlJc=ZH^@AWseL_)byfnUB7ta>Upq?RVK)#X@+t1>HNcVze%TQ zWMO#+La$vqdH4ExcwC|zpPNZhOv@Uc4AXXEG+Jq?5M~oo91~ zdEEKMBR|(qB41rZ-AGLx?W{INFO-;OOV>)Vl}wl% z7{Er8HZKdO=ZvcrXl1TMwhX!n#5{+L0bPWmc-fLrC>dnP{6%81hpUa;a2Cm7D4vsy z^6fErXVow6F%zv#XU>=gI$HkwH_T)lGXNAVT#z+TOA~}*bxzNgi(e`sMHd%D^GDz# zPh@295{ri#=&(^2Y2FAUJ?#N%`uYHkW#9dXt(-1CxI1x+K-~qh&M;MJU9mx{aq53*#o%oTs18~y-l8y2AN6xI) zTgER~Mvful7YGxD`LV&T-e65EzeM~cf3_w5j`MI8@i)+4#NSyz@r%teb5i6jLTxJH zmk>-Z3kU<=9|w8$ngs+DHktv?^JkB-W`$-m%tPA6bu|@G4H3*zqSjV1VJT!bN-4*7 zQF6t*H_jElc?{(7f#hw~l_e0IEVKi)<#iZB)>a|~1YBgfRaKRe zbeEBA-J91h?%ck{8brF#w3vvbqEqzbHg@aCps=H)>wELs>0^hJc2ZugU(Awmwg|C= z7lI|rN9KijtY10%aApEqU8tj}YGwQ~v4T2z_SA8zV`|=t^3P8m-GUlg`L!tLVB$El zp=!Ol3?8UzGhw8^zx{&w!Mj=Z@`3hB07d#(|5Y&Oi++HDHUbA9fQM>C~w`@fYOsHPO})^HJq2 zo*RM-F6Hfp^-I>Qo`*dS;3b$6XJO=W{m>L$I9E8m$h;0}UZ9PXp7amHI>@CA_{f&Y zlYuZoLJm1n^G9~f;rSdED3HrR+l@!SE0>eN2WapLZvfOh2OW64)1v2ZkxTdN*%j3@UshF31*=KUCuffU zPt^=mY5n1IzMA&hn|E%q zJmm`DrF#Rfn5Hq0Scf5dCpm=G18eK*<8JijGdS+$p`CE93hkt4m{uZ;#KGvD#|`S zdvtT@f{+=34vXjdtynxAA6LY=5V_gWQ2gQfjq4{jZ(K4&Po0IuJ-T%W4RXsnl6>XD z3F-*uM~t?wT|NVlkLPA4iml(9_V3=zawQB3mduAMI3p!tJ7m-|d0D6P4q_iolL7ul zE?wxOX&{-aC6dvWKN`lwPXwGq71 zK5BvpMOo99EzlLVg6&{uWA5udd7AeWSLX@1DC7GCR82=3sVepE(y1fYDu&4e2lPb< zuZu5^W*;V@6USSOFdBk}4%c&74Qw(3zgV8q#~M9qDBUOQK$k8Fi&`aOF2f+1^Gv9f z`BbFPSm6O)X2HBj=1eWjL6N(1SvZp>21BIKuqbIklRT3)6Rf4qjFSmk({@ty5#N4M{N8=%5?GU@pET#PhzNb>L@E7E?+o7X-rQH zDPKkTm#2^KvSN%_Omrrp1)xH%3!$-&J`&PDQL!Tb`%?U&wz?X+MNM@THENAOan*wd zxA^N1@7ySOe6Qf~T{f-IWTQMM7fnlyN#3(D1{ToLur2E_M2$ium722S<%_%3Ri)T< z@Rg)N6%?!r5`ePOPux`?jR3}3(;-g#uU#1iOBq`X{OIU16^JwN;_-u<5G{fOos@ca zLduT$3`5V{oc$;(i{BUE*YWPvbGAjW^pO7Ey<6vT7ddh;5%OnVPIBInl(Q$YP9M)= zVJm`S!Y=S+DaiprB;JvonLvz2Fhb@mChu%Z+z<&-87y!|g*83R)6Udb4{io!D94Wo zAk9Z)2+NZZ!X)y#J}TW1r%xPjO519BfU75artHR!9W#Qy3jQr-ql^?4Izt=mp{M|6 zA=PVY3Z}sTE!BSgls(<;Ek+NAuR-2O+@bAEw}z)Gy%as%?3am9yAZAgF&F$&^AdUG zo-<*T(GOi{#*X~_#ATXS;GH5D@B(4lQ*^7C5D{wmEN>cNpTY+=%Y4p#px{MQ%RIz}mtX{xjCuUhYVcCZk4~8RCW^ zKeYKp9J75P%wx-s!#^hBc*A0whHXoOZ%;+YkaK`p=f(5% ztd2iBSftCEMt8HPj*ed^#N3Zvyu2d;9mr(3`z{0cZFNK$~*=!QERQi{8C^^O6u>R`P+-FfC$g@X{~u zUcY)&R9H||SyGQldjn7|$36b>gIi?O%$r~)Gs`%bx{FQRSXMF-!|NCmfB-+c@Gv*j zj|j2p#H&%rv#!~2oc znVA@|G?0rD_eEXZfyiOVqI>n|CMjk3e7_O^{-}svv8B~sQGB4RmQh1b{7{VkI{vDsW~H#y^Bwo*36#Nug)Y&J2J6 zru;gP=d*?ex*(lonDUk zSxGE9QC99nrcLWmp=)P-UG4GX#12zj1+bA9wpv5=fH3&QeU9@?@TK@A{>u5Y3|MwW zfnN^5E8~~-5Iwt#Juie{AS^0(?Y_eewZ{;D(f>}gp#KbhQI<^)a7L2?ez`scglGHW zMT2+;{Ia+f2s0m%@JlQfK;}Rr6TK`9Q$!f=wl*dXlg!D7-@bZ`o{meAbt=)T=Myz> zn0fK|?u)1Q9zMKr;ruan8XiBI&P0_p2PD7*O?)0jTUiWma8$2?<^Qi`QtmbJ{3H~sQ@1jI?~j|@VD>XxVfX0XT^r$PfK$3s zgkbV#qOGXbe=Z8=6>y3~0tka&l4R_0U^Nq<$(DIe^2{N(u+YR&3q!S<=Hm>0r%bkX zakA|tvRn~!QP4vUrRoQI0w;=n8@lkp2Sd0USjUG?>~**nyuN9XQ}n6b02tSxbt z5X>8hwtBkSGE}(<@Hz5ZFaU)o%sRqPMQ@AV zqmzBZf-oFtS>y+MnIadCF=Jf(AVnv+x{AJXE$wBg0_8cmvD6TjsK>Zjp&qEKDl03# z!y3Wcmmji_=*|^PAVsH(Wkz2!DE{O4~ypm=PGe zBp4Roxp59-jcHz!9BfQ%EJygc+b)|IkhFU(dC1I=sq_Gc==Gx!3U�IM2)o@hdA~ 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

Rj9W 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 E7whRn$N&HU diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/health.565 b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/health.565 deleted file mode 100644 index b8865f5f4a946948458d7f2340aefba41fe72b05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153654 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

=BV{Z_bk6c&mF#?(U;{fu|)*RvQo3d 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 diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/health.bmp b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/health.bmp deleted file mode 100644 index a84717211f22de984d0736075d7c28849ed5351c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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

    Y+g`V{&_L6-vVc;aPI;xJKLH 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�FgQ}Q%8g6cts^!Z<+yT=S|Df^-9M@W%q7D>v~Fs4U;c%h1Cwi76T<1?J?<))##8xFB9e}K|4$> z871Aa3Zw2j3JX;jK(;49m7yI2e?@9HK0ygC9!=3r3e9`jrdej$C@AR6a(ikSjtBeD zs6#uA{+TW({1|FFlpdK?Q<-|`pY1%uu$dCts%Z!|`uSx;OggI9&Vk zKs5(3u`?>bsZlUf7R(TarpQB53POo~qmah0V#ykl1r18mm{d2w6x90Aiv6hyuELrv zw^DLz-9mHeg0`Fzdr8xVv2(AT+3BoQ%>uoYqvdGAknMQ+^0=fCdV{_WuIuLlVHz4~lo_s2C% z&8Khi8}a@4PGZUa(Vx5b{;_}W&z(Dez}pI~`0U|}(alH5=ElAl)qi05E6m`Kju`t- zv2n&MNn|8*pBsBlv$a!M@*!#MYL;@8%5S6Pn*69mRIVu{-x8IkiAqs3@@fSoLz0RS zLCGLrJD4T!VCL7S3!5{=mfWH~p=wZCZr9c?*LR~^KJ2hVw+X+^uN|xR?M~FwZye5V z?apsTR=yirzCW^t2jb`Zh&sY!TX`_D{tzxYBdZU`)*no4{y4h+5Lg~?q82|uoXXVR zbCM`}>9zCXE4)GI@De7DORwh+U&0DtYVV0-^WoU;gHhxsE`M7;d{5oDAD-SA$8D$c z+P$I*JwkXM!D(*ZN$fgE@6DtP9DmgJF9h zrz$YZ;LkP$vtWB=^k-H2LDh^65nMRZ%fq-OAAb7j?{9xTJ-Hl|BKJzxoM))qleKP1 z8n>hpw?wULqQW&v<(i~+PgJ=kqAO6i(3CDzIeGvWN`Xs4;RTvJELAu(K7oINb9FVh zK+DLIgRrV!x(fc;vI73<8VWJCzy!bcOUmwjf?u2n5fd95y@Xu$5i#T$ha9gaEiO%M z!~6@_!n6t{7;`S9&iFh|H57*`Ts%s4xLOqGQG7o(zbL_ga7N{vpka+uGYkHiS&njS zPt#&e+zYdJ(mxlTjlfFS$=b0gW}WSSvnp(Sqg`R_E2-`<)^*gk^w$BuQVk5BeTexL zhF>nOeM1@2Af_-FfK8KxrHRAR3nIv)2+I&hvGDggq~5|;L+6*L84zzNG0 zY1*M}gGOGujLQ3Z=`!Zu zm!OeXATU0CyLR=>=8c~bF29Xd8I|wkxh>l`UsxzpOA1g;C=VbA6qwnTR#iqn*_*1y3aQp3oN%;HHw>6D^wEwjjxQP`7^Qy-aH&XTt<1lG8;qQJQPcvd;9 zpeaYunN`@#Q*`p=?fL4yENQDy(<{;dydxEji%kP3ebaYFmOi&**}d`OG^`-EVe0<< z_{M{Y^&iI8e;nKR(YE@-V@aV|5&6jW1qWe{wH zaO;TiED5G3R?@*)RiSLS$kqmCRt04lktFB~+q#U(fXpf!8Aat)9GzUc|K&#x$4nq3 z84QgVv($@O;>9R&OD6awC{8YQPu6%OX+7y`*TiC1s@jFBbfv0*VmGS7iz<&uDQxWT zyK(jE-tKn3Qk%#YnVqK%L_c}Mine*>PQCLwfZV)zLucPF?%o%-Z>5zJ6DqXObmRsC zq@*z>^b~o{nCAr4T+mY*;1u8m+kD1iy`!+sX5K^%NUe8tG%3C`wIfZpAZS=c{biKF zAr|-@N!QwviU&zX5@aEAVnR#9ib{n|(*($8j$w*ZZWkKth5CLR52AmrZyBhubmfTD zzH#jHBz7UokHQT|%s)F76o;pYLsO(->9VLa1zMe`OjRsf9h0R=5!bVe+R_VKN}8u~ zi<@(byF-{-_h3$rvV)^+PZ3!z#0b4&WK>=gQ`#k|nyqMEZ*`n>&D=IcL42w93esJ(|@CX-nj7_`e!_A*M32hiENSS z!)N5S$Z@xG=JSTpJKb}imbYKV;UT14w)O8?#_m~1?`Ekd1UeiAtmTwWWXk(#JWFgg z4v6~F1od>TJ}#q#EosbA;A+EBYH?Or=gS&qD_b{BeHTq#`z=FEwu z-28qH7MDlQ=MSFDZab{g*U{A7JwleqB+8lT_|W8uz4PH+qp9N-#wM2)j{=T&PlaiV`Pv#-{e0 z*KZyjU6QFQ6EegtE4S*GuA>S!LjSyS)4F^cDriWc4Wmcu?xTYCEoKF&zey#%D8Z<| zD7B=jo(;2vumY(COJ^;qyuc}i@XU5XY7xQ;j22;`@g;meXlIn>v-)e#sGLCm%&wZk zk$ws`yk(BmQW#$KL32gwuY8cE=sgo#j^ffG)3BITh5fHh4E!2<%WB%I8oJCaeYKX> z9I*=KbzX6BZqI>XY;Yn!G({GkDhW*~2uqVjr%S^!B+;3&D3&yuC5z|kGUZl|vXxn2 z*0s!K%Ug1ax}vfx+{1HnirOfw^5_(ef1<)IfE|%pL*-dh3v9CLxr+9!x*^!9;SlNe z(8^~M+uuyVUS13hC!hY~ZQMjU!>=%6J^AdPC!ZtI=wCZ`U0Y^P1uUjdy zZ1Hu|9MuT!7gB_+_ya<+n4D{(vi14e?&8|%lKN>w=T3e9rG|my?&*8olQ+93Zx6ui zdgbfc-R~yxN85S0aPSb|T|0icu>WFi|IzZ{8YX)int{jx$w{)Bb8gy7AJ0r5w}K(QED5K`Nq`TVr1C^k5T+a zfcLEa!W63s;z^)5BoFvC2j`el#kDexnXhbsbrnf8<2Awwha#v=71mIAP&ukoM77xk z#>6~b0DNM(4ai|R^MpsW)%j%^gIW3jc6BhT${+nRif^XQ2j;OT#2I>OuA$i2R#Mx^ z`E_oOH{kkid|_%ZnR>6*Oh`2j9$7RBvq-b zuDfyl+O;dE<@$O`n$Y6B)v|P_5iGRxdV>?ly=h$|{Bt?@=l(r$+h%h4C^3|Sxg2hI zH8z4rLM)%L&7>=KP~NSLG{_coP=Q}HfQ)OwQLxY$fvNbaW`w47pnraceZW6cKgX?K zW>-x!OTb^*(#jpUV!-7u#2ZxQ0PU>)Qj{deA+=&0;w!kjLm!Z$Vpo^=RMfk_=`fe5B3EJcP>h0wIZ&~#Y@OB$J39LZ8evsDznKC`fiqwLHq zY%Z=D%`R-@7Io5c^{&C$OdPPllQ2c)70PxAVENI@&NPQ%E@3rEkuHedP(5dQPZ=l?`D z+1}khFC*jc^Z&Z><^R0)C9;G6wSDWC>HWvpc&=T0yL|i#b@}qg|Ge_~zYzrvQ%8)$ zV6nha&tD|V-?7c_JElGpRjxD)-Kpp}gt1#;-F8j?4Y;*W?EZkLV%$gMl+J6LceSm1 z^6JIh5<631Wh;8Ji@Vch9W<_<#xZadZ52&REsm2ma$J0h%fz19k8I8_hZesWTl*Tx zM}X?w{*TLtk5*4!ZJoYcx%_hJ5a|!k5sicv7nvzo{Qz!@Xn>Dip=cr^5K)8EAdvAT z0CVs8!of?#k^;rk`vl7)YxuE)9vgAM1nj^m8tLf+{NQ>ycl3H1|ENoE@Y|;kUQF!$ zG_paCxw>aQRaK8B0%+wo zg$vF~aK0rB#g`A9HiqPwlEkJQX(c@$>Segw!Pl-il-EEP)?vLE$5lb0kt(X?6d028 z5RzgHK1(YL%B~CG;HmZJRQa;20@$VimeH40<&#MWG$=ZP5DChvpa~2-RXwMuCL~4W zPA&ETU{QRTS~rFom?h0K>Tidlg6H5kZ;Hfb761JI0 zGHBWnw9};KYDW^apsE~n&DdG}JzEu>Rcd?{5Tp(hRJLwdWEfFab(P`x7xlNbzuMfH znP2P^lMUw_Y<`LOIguaE5QH!>`AQ>FB~fXGsJxMBis%eQ3|q?(*QLptczfLkArb*LtRJ4lI1sH~+~9=G?6x!8pzCJ)Yfrx_t53 z!r>D{m>t~uW$)(e_2ZYTV2qF7ASZO`==B_|voF2^c=5UjsR@SJ-RBF3FGzcQ_!35x zPNa@re1#1WwnA9-A|0>7x- z04hH`%RrH|ClqwX2%E#W^%1;=SaCWfzPVz#Go9AbEi@p_pQQ0(Xx$lVLSZGBcqF1>E_MZTMb~=LRBklXUpy)oirgh0$SnqcbuM1!NtdP; zlr66~$0lcsN=)#Uu{d$CfU0#sWX{vZYX}vVy{08jw z{+(aZKLeFm5&@WKl5hY0f1iH!Z;ZE7`%i~fzeioe=g15_{rul2h$a2xUud4!NJQ^T zShLRWJ!u=ihhTyX<#hT>NR} z@)Hp0SZ^VYaQpPl#_5}#Yi|&+xN(Bj&x?gifH2{Z5k3gdcEo*R`-8>w>{$s$km%C! zThbNd!=u-zuqellHLzF@hgKgBuKZ}*egcqA>|q3cMY`yN7x?YKGLUZDcr-$$=^y*& zK5H4jE7H&Bmd>V2`ch>!LFq&aPVCc5&qwitu!!-+8dUI}3+=D(M|lLYJi_tqSL@da)1r2bk_L*W)1D`|}qwM9$YqQq_BqA8-r3UmMP$XNf#G`F}pI?qhzU!Em| z*Bp{-4dGeC$g3riSDz#>GWn&{-0}o|BXpSId=e0xlwXy|D~rm6IfgDF-z(B%BEWHGMwBbbHZps>NIJSq-;>E8!j{sNhRD=o$RB#P5SD8|hG#IxD@GcY zT9KG<6;#gKH@?DO`?2+Jff|~igDLLA75~=hlg-m7OBa9QYiyb7dCTa%$?f}VSDx=wDYq`>(@$f5O*s;nJIt)gK%i z4`4RcY`dei?B{8h3TsyjO`Gt+;8)DbYIhuKKlaal*)jP!4*xYx8w~?Trv4*c+m5PX zF|V{wR)qtE{#;y*vC85zE3yijicPb%Jv+@K#~l;M(!JLU{H}iESie89j*0%s!oeeg z-z%?nZ@t~R{$}$U(oq3b$U9$cT*VKQH;76Bv{#Pbtl`6xH|T*Eu*t>N`}7xxRWPlC zlLsmRVf596l-_>k(JmNsz*}YPZb&|x!SOdvcUA}_*`SUpfoYJ z+%H4#ONLyNAFIZPRprMr`edSiHiB*TVO9F48{p2NtnM_LyPy(`&ya>O3nEe#xXpK` zDcutbJsE1Rlv2E&)n6@UUQkuQEO|gX6XXK3#lY{mSjD+$xl63_T#Vve9Jn3G1r>Z* zIg76eq2-$wZ$kVG3C9`vdF_k$&W`sPhoznNc=OM>0{#Kw{YdU`t|92+vG- zDm?EhED#E#Dsra)T!U>^+2h_3Rs^t6XAxZoV2gvkIwnSc)cNEJlAPFpJFh!m&ZsVv% zd*(jbyYp)A4zTvMST`G$QC(`?o7wqc?aK4b(-+w|_Q~rrbX{6HdbD{Bwdo1Az(~E{ zy7@cG@#c+Rpm6S4{Az6TA@GZt7sD_5XK>M|Uz7XKVb|kW{|R?J)jf9v<(O*c3k<93 z#$7J140Owi+AZW|cTRq8aX|lky}V`1*nME^CPvd*t5a&6P}WZ6Y6e9W6Cre20=q1` zuw7k0Q{R8sISv=iyZ!SY4KKrs@0;0OH1J@XA1xd`bY6O~arN~!RAg7);&lg_&y$xM zS0TE1y?p#;3-?yXZxFuluBl$V_A8{G059Uqpd7UX2`!5^$l7=5rgi1iiskRhwT6|OFxAo74vKn! z-<9MtTVhE+(gV*t)p46JOjf|!F){@cVa6EB@tHznoK`YM>arI2{qN=(XeE>K*$9m3 zm?%2V@SCom%&T8x8K)qbPAefL81)y*E9fUFihkTTof%g`PH9gj_?^l@{jId;8*N3^ zy%0~0b%a>sI-81ZaAGELd)|ffuXs9n24#_!8H7o&J9m3 z%#gRpjkekUhWX~>c=g1np;v{h#BZX(;m-Lo3FZsoYT*LY2V+xb ze({Aq2?eoPHT<&CeDz=;bgjM=_rPS&P%cN&$ySauj(>3U@jq{T_3w$D2lciawA{u_ zxnpSYqm@e!*N>kv1WieWlhxgqS8(ib<;6Ps((6!E{=RwRH|&Y#kKYWfeUD3oO(6Q- zKdyfE@8ge2^E?Yl;npME^^b2nuJ6C0wp`0ATjiI}^0W(T>$Xrg%Tn4vK|9ueY#sXm z;z{$+4PEP2DJ0EZ`?UiH<*lm<)1<0l2|5jF)kshrkCs)DTimZ|oJaCP`}j3DS`RIK zY+Lyfwp|n3_h)v0nB0E2aQGOUGx~P){AiLluacPWwJUFcUnKLQH{L*Q)Cr{8zieIm zWs7_XUG%HfGYGF;{dxZ21%_XA(eIw2%@+XX)E?-mm-u{g=P8Kjp>>3;JsH_}=-7UY zuL9;M#N^q+HW^aPFB(T~NcHm){d9`3D@$SHmpZsbJ%X~{D26gBDgS+sSa-jS_dMd? z4=jAoJI%$P`@TOnkS>qq)>8PbaXk2Gw1(xIqps=UHv!6xVxMG9cxGt~M+cK< zcaT@4c?OWrupFnv?`7tySYkbeqxDKs)h*trTfSP4E_&r=!z$SyHLcxgTDV?rgZ_Ds zch)~Am5e5q4kwllL5V@Ys2!ufn|#lzDjABgKf)A@uaav)Qeh$0fI#}4V1ra`h&sS@ zogFVwRgP5SbY9(ZX4On0e4a~3)8PV*s3VY9@A_xu02TMY*#8!fq?FCDYUVhw;HVrD zRoRP-{Wu=1Y3yw79IR<*OXP@PUgw9)g{TbANc6YK?!n0c(P?3jP$uv$gr#^#r1?S` z9hDYH$7|c;JO1SNm8;Luc0yZ)`Zc(A9~$P>(>LIs zk3aqg24OU!GyBhnS0MX;gyS7U+ZA!;2DfBdUb7<9J4>6l3XRinZq#*L9^3p0jvvOp z8))FGy7pD|OC{D-eaBX1$GX&D*IMUU@(xLb%_D#rpHYfNy4>nC4<2?+T_0Th2u8T} z)vsYG0CF3m$Js+LSC1DiKE|lKdga;L)tB#1DwZxjcV2!CwhCM^{+rR*Z$PAt)*7!@ z->wp+_uK6o(1reffFxqk@wXHoGTz%NT`qS_xDa1o- z&~g*z8P5!1z_2`mpzGVF(c3VAm*}P;49iybXRC&V+FtODiJY>i#C(Xa+yhyEJr{q@ zE8RUz>lv+Z@yiZMDho+7`cTU*P|6_BI15A|``KSO3}q_LDyckxDGx}-gMwJ-n=J85mig0!J_&sHD2{7nj%#F=8&wdUrD6yx;<9BC zsq(ONRd5E7UKvVWbs-!>P~pbA)CY&d&gwKzs@(B;~Adf7L zCf{u``M#dqe+sFUW9^4#+Xp2rC)q{gBEu5K-jb$m@KAUl%z`EBf>}qdYEWD@3TZk{6`~VGt{37wgVW#lNq6z# zc!U>wM`_>p%MYMe_)?7*X!QY!#@L*evu2pMO(qmHCA`}r30fog_`ErSk2md6c`eaA zD@9;N9yha~KCz%SQQSb|*D%BezNS&CZxU$D>4FNsqyo3dJl80`M_j%)gQeJc!j+NZ$GIyH9ohosoDZP@kh$D>T>BFSvho6+_lfQ ztTMr0mDrMyrd=`!g~UK;!rG}32x4TP#f2}TViM-5=D zL2aGYU({l@ej&GRE7Lelau&!6X_Nse2rd_j`r;J;?=VF{Or$AABPrmoNdG(m^XCGi zqo}ISP}^Q(>22;9Fx0nEGKIbfFN@)#g?1zOO#*UV{i*K$6c4`y&p>(zCD%VD6Si#L zVaeR$rpmT?D4$ac8b#&(#`Yz)5+a8>YPOLfXrSfR<`i{^D~6MKCeIj2JkLt!H$}3o zpo|i+Sx7DpNY=%1s%56-qMD_g;vvuQOcx)zM_^(=ypU4_Z{!8IP@aDA?;BtKV`$+c z85Um3e%$XM_#0;IaJEd7+Yr_{v;Xkw=l{C-_y2|cFXTq>KX>dtY#zIVx_0HWfA8M< z4YKE%gJ+X_&v4q)Klc^v9Mz4Nm<7Y?#w}jSIE=8Q##yOhL7<HCI`jRND0*f6W8nbWm6#g+Yv>PaEuY|><2fy{&qEnm}H-sH3lA9YUN#PB<`guJ9r zZEJw=cayshruQFWA3b*f(&@?4(Q}*_FJFF*ZW*oe=Cz+UumAe4@?zAT+<(@)^xgRG z^RvqP7GH9nK^r6d>a|~hWqc1bC-avG!G-dQ=6P)Q*%T)Fv;FS`5KUAZFCCjtW)8^Z z(fAI0;D4IfeS-f%x@SJA?%XSYSA(iIU(=8MHCABhq6U_zI*uv65R&BXM?L4meBU$C zHALi}ROJ#};1Zl4kWwF&-4vWw7tS$7q-#;&qO)Z zXpPBhNEFsn^AQtVLSTgeL6$x^tCW^ko-8&b@?rO?#VLeKJhrZ|!ch6AYJJknebTBf zWK?=*=q_X!{L?Fa$W!Ibs_|wUeKYEOvrNA1YX7W;0IoTR(-y>O3dim^zb#VO5iaZq z6SRj5K!yXbaKOMRp92vjbU=piz=RZvL)VI$2y+ZsFGbpsB(pH3jqvh{Vr=k=zQ8}Nc|oWHIeIxOzFm~U|= zm%!)Q#wZ&~EJ26tAf=Wx&!nD`U!E0K@(Nyy6kiZrW9XmX6<<_d6kO6dYaDTB^%wuC z_>gU!&V^FfIF+awNzvF+fMN~I@!(I}kL!rAgY0&0D=oUqLO25`6XZe?odOvT@(B`2YgujqAT)^2KxvILuuH zco7%fTRZRXsvsQD4N?G zn$;PSS`8zM^YLQOIIcHE$mj&H$k*PGKA$T5?>63ny(9btGC_5_Q%BE?;y!oEmxcbKFr zte`urpf^I)A1NLRmkdS~42R2lA`5I0B!Y981ojo%qKfS?#r8NbMJh*9={Qw4g{vI! zy|gorRy4HOv%ITuXlS8SeD_clwpdvgjI7DF3xzuyo;>9N>1F3rG#-#ir<8l98!luv zG_Jri=d{Ur*9sve^pnoJ*#9=pT`wJmf9!sqc`+50w-owG8x1TpxdgNUkMExUF2o?5 z$p}0~*Fc*AX(d@6;T0CLw4$?~nfzBlR0;n{vKPi1b~X5CXNF-4Q9Rco&`nWz%{e7grER-{(vdi}!H-^=klPF=Rek#ol9Gbs zg+7s)UO~)|Xl_b=BVRjIJ8-;q_1Ud&ej8c&NZ&XoE+2<*t7YW6zG+UTpORHC!{>bZ z;34#rr(gar)Tx0*SkHalxAY~9J9cmWynXXm91NloAz-L!1orRuj9tfk^@OtCsj71} z3|uW~*{^I_6IIOUyZ2iix7)@)Ds9=T9lBZ8yrpfN$w!ifazLh=lUF;SlN6N=3(AK7 z^1ioUB!ikJ7nSrGnl~)As~uA}duKmF=+f}=$4Fs=75wDRgNZHR_c4~XOGhujFoSJg zz5Heis671zEirzopf}jL@hiAB6k-TI(JG^P-o58(LV#ufG~awE|BQ!{ zM&!7~bI()q-6=v>iqI#yD1==eoLw85YYaoiC@d%oTB!0)rlKQR*-4joQVRRyWxcUd zSekdo6b{A|_QfcALS+L{ihf`aKIaIdheuaA`*8rrg$V) zVT)Feq1!}z38-RCLoJ=a^((b(f>t(>SU#DgpJi4orWj`F6;pKe7(`0(1zm{+oiu3& zUEWPAME&ZcEA4cwU5c=WwI>vjWBKU9!6b=wJz0zwu zvdmU!Hk>yst2bI#ZncmghMTRccPtAxN(K*$x(|5fMOs-uy#yh=!}Jn6SS&QjWXMJ3 zMZv|t1+M_?S@AvNsqh};GvS~AUkOGz#uXus4T-fZtfAG8^r~e+!wS1{5}V~jfEQ5? zs$N<#Z1H+x6a)C*Fcu|PF@zsbsk#Z4X%_pVY`sll7|~P@g1^G?Z(H{eg2xJkDrZ}g#LvC`&YaEh_QI5PxX0S8GR*7zy zA!tm5fg!hsA!_7mdbpadAcmTnTQ91b5mt<+D+hrQutUkYRTQo0YR`9x*_#j(tyY(=lEY8Eo-t!oJO`o7J6MXDPtG*0MRcWS$~jU8(;{Yc%w$<)?^ zg-g$Ht*~|d?dZn0aEXUA9+s*r$K-(tI7 z*1Qd3S)`wC?7s|0sm9Sey7t4G{^N?~jpEv=?Bf0uakEh8$kPs>yWndFsOhr*e9zn6 zCn1?t#8-D4+g7Z$ldkF8J#!!Q%zZlS{1U!ENOKt5xIex7bnfDh3x_`~Vyk=U&B~RZ z@#BR|yC}hc>WyD7-u+|$&L0Q2f4}_EKk;D6b#V8Ocf;?Qy6pFr6G%ATV9gCIqa367 zVwZ#kG0}CL{ET0s{yM>WUH^6M)^B(Z{EqHC9o~3o-+6}DVO$U|;}-HW{4q<+i_+50 zY)NfafrTY$$&xj*#U@6!HXdjAQEWFKs*4}fD;gYcQ9OUxHCPy)-JT?KgtAOQtlA(# z1R=kk9QJyrsC_eZK`5XFeKAO*E*y#_28=LGg_DdO))1+sV=zc0HpOSFlLRsY5)E)P zdPr!1Ni&Hrfv|PNmrhX2Clb*2qI8yx$CpjSl~3Xg9Z&frwRD`Oo1*C!5-X<}l~YOJ z&np+x49iU8T83dQRll58wUS=F&Z>2$8W&Kr;v{{s`Hk_ymRMm^ywFN5Xh-r3P1;T? z=me-~vTkZYKV3!|QQQJV7Y@Y~+M?wn(S^2%g28a~0D`swuEg8i9?;-HZK=CCbFz`Dg1N#k z&vcTcRmRVdGr|hr^MC6vL|OLCDkrzzi7SRg^)Q;}WCRYvEtU+w_=(pWTZj`RO!p*$ zf#|PlW`N%uy3?iR2JURS(tFqGrI-Q+z5ElLdU!K z#-SXe1iM^_bM=X)WT}el#^lxGVjWUET6mfsrl?L_HXY1u=DQ9;E>rlcXBQZQJVCt5+aB!ujxvVdpoELsv)E zzJeFW($N#pzc|*z1wsA5Rb(sRDj$E7wT%l^9eY+Jnhlzg_SQq*78PLQNZb>{k1guE|?H zGxy*?h0YlecHjtc>)ZMLhd6XvIDAg1=F4x06Ua5PAwqd2QQi0cJo)IKmp=IO(ue;z zAw2m%A=1Xp#lZ*v1X}S4$SeCgXsD-vJXkmsS!~2mi#Ki(EU(}Ab>-SGv&bt%TaFry z>*gE3EuH={b@&|D%|mN2?R+q>4D+k6Amldnov3OSgsQGgfhjqwG=*P-BXw>;9g|y< zz?6i>=bR5tb@8S9#7M$Zjs8idNKR8=8qzs?BYFMtQd^w3H(J~oCGNuD87b(EmJTFn z?R4EFqkJMsH;Hv5T{p$3oMh@J8Tu(E9uyJ%RH|W$X`D$hOr=y#CgZF4ejUDND&@bw zVGeIn^z--zhG9C{u*d{X4bEhvlf3F@8TzHv>eUn|KdaU=s@7OF+Zm>n%(^XB{W_~* zg;l?iS+~z=T;nwEWEhqajUAiUh~q@au+hoKAhZP{69glQn&Jc&s7-KN5uM)@%_qvS z$h_9*yw)f(M|Z~vyU9Q;?hBW+M;7#lOZ&n_JuNHOF#K9qt|Rt{M5v(tuA_gxS~75? z=-SU|m`90ZY6p|y!f|G!L4m><)fU|{ngk+vK9e_}EqS58f`sE8e$gkR{sO#lXPq;^ zi*qFO&*Ve(D5q)({*#%N6Sz!7JU5aTV7`Hr2Ph{AatrZFgjj%odgTPCW`<=L%hlV& zRU<`Jz2tbmWuUFcrmJZUPZoGVc@@V7emz4O?tzK!{=jd7oB#hS!RVr6QG#83;@z;# zts0fqj7bePwyY&X+LV-AEi;anHqNGqo47??)ZCg>akD_%mnyWdi+VH-3%LJPm=?;~ zcWVZY;YgXMY+@I-fN;()9WnN7Ya3?i-0~QP6vo=I3=uQWkgpjiu`IPYuFdU#H!yck zVYExjdsHU7v1Prwd#kQ*&(OZ!GyU=65%h{rhgQBprc%@Bm4T&C=XQTsJVN{W6v@Ja z%U?DPpEQo#Hg#Vtsu`{B+%om-VQz(=Jjgd$)fik@HI@xi?@?9HCG+q#UFT6z?UJfy zB1L3Qm9(Tttl5Q4rHym!!q&h1E$qE>fo@*Wu}n#>+*;N+Zyh@79KYT@gZ(e?`;~3= z?^qs9Y(JRVeK5QGc;?_a=q3oL*3RlL00>~>_2}N8#{|FsxcbSz@E%1L{R3co`6HnC zcYNvMy+46>s4L+-fE5_T-grYGOs=8-faDCDGI#+wq13{342}z%rmMf8ug3kt;L7*y zQ{T2secn0!Dc0GBt^-x=5?|S#%CCt}Ev99avxMeMk%^I`re_w%F~sKslYL{dgW~ef zM~Kc-^rS2Jq2@tSVh%&1;VGp%OSue0m-vKrR18+W*t^&Imq4@w)$R&LV)ul0!6v@dAh z&uKYKF|1&4#>o=wE8$EF8$IYVp&kj(u7=_|D7!I;Qyau?2xis#XVm&;R{Lbs`=-@; zr|U1I*LbCyytAy{xz->+ThI}a-y1G$YhFd*0+zqmnw%uOtaa@y#cb|c$pG|M7qjc; zlgfZ!@KTT}n}ZB0`iD{qco;v7pvvgA@gUd}_rkr)q{x@N1V=+f_Ba z#=1@@WIB3>D{8F4%xte%9RKF{V1E?K^a`S41O_MU9zgf-2a3T(qXZ|o`o+2X#k>2) z$D}I@YsU)=4z{8t6Vf<-jYKz6+%N;>Mvkh3o^MX(TZQF)g3>;&dZ@g4#WH+R-@Xl9 zQ`_XNj)_|Zr9HyZK9;;wST?LS&sBGBa|)Z2v$e^{X3f>6^D98Plr}EZ^&O6`;I!wX z%I3v9H0tHu>e|K1mi5NL!>Tr?W#j~^Cs4k<3!j>YPa1}g+b8ciHohHS{}v3A9a-M? ztDRFH8@sMlw(V6kjG1~bp>|trN2abFg~3+ZFkjieEjCUWI}VIJM{Q%*%bT~whDmA0u-5J?f&T6 zJ4ZhFQ$3wO!g2i@=NWiGVZoIPMk07UggpDhe*mYapa0j@PydZWW)xp^(Kv^ESBT*h z1laD~`W-4V96!Q>01Y-!jQ5z4H?IGN`nz!a23<7jFDmcy=`VPlKYj~d8tnAI%Jbuk5{m+oWC2M9fed*-nuaFtV%N=cE!%lbo7vViu62WL-pIDD=2*9L znl^KqR`E$r(^j5!JI}hyZQkUXSGnd*cKsr|eml$T=_u)40kp@3YOTtj0}_ zWt(l@&1&3Y<1ufhH|%DZx7e25Y|D0zb%)n_k>7Hd*SgDZxg==a7qlH0v>!@4FBf(m zNfEx>dYoE06UsIFr{l~}AH=PKgGT_z5Xdq5v2_>H4Cm7fUa93CsTCd!y$6G+JKo*( zlNB%o9*H{llq%0Gi+4_|Kd;%B*A&QW1KW(A8Q{g)e#;7pFl$-8RWo~{?LSm@?d8wxwqr)D}6?rM66wA!Jq z>8-5mY-}Iw=&_YoH-#tXc_DTId}B1rGdvZ{)%l+4HcHKtY6(QC9j>JlYNq~tPoGEQ+anVotzlbPLV$7 z(2bY>0y0IU>ZHgy*WaxXsdEIfA2f9#%r~kO6r|-AVKDN$$YMp&- znY(YBdu*AxYoC8+ntN)VePEt>&^C9^I`_1F?!IU7dB?)@!15FS^09a2sb}T6Z|%8% z?NucII+TAI%D-|gJyfNR5Vk{CXRsa2wv5#kLU^!vNYnRK=`s{eU!|(QLfKcQ>@An2 z%Vf!dc_UHU+Edz^ER|(SwbPZBMQYnhm36tQZMo7m3$+TEg@m$54CpK(PL_4Ad} zo{cBiKQfM9fqzn&*pa7jbek+MyrWvc7HvKrk{L_*m%#a5{Y-M&DWdq>3`R798KWcLC0Aa`lu}rbu*5(vl_{=dN~-7r&~X)= zUkXtRLt&O&XzB6vZnyVr=mLux@0=yJ=diG||?47RZ z8-v*glbcVW`D|VPa%}CRNN=`tcqcw`F*SXJaZGgRz!4qu#wWe8@%G4Mpl7~o?8^Ac z-Q~UG-5X!$j!t_<_uQQe!QRb4-(LUX-QM{d$yxX-9^=B%M0!xChjzEI~+)(%8dHCgjKK--*#9{@g_Vh=8c=gTi z-u&bb@1E12`~gc}_aq)biWv_<*pD+8k?a-)?T-p_{i^)-9@GyGXr$Ua@>$x>%-} zkf#p3%MZfqPyFjoeQQs=D^G%J&wMLSd~3(S)o0$7=icQ{11nDgS$y)od*zXH;jwl8 z)3!N0A3GKvwa-0u%-?q{f>Iwk7M?m6AL9!g3lG7qcuz=n;h7y@Hvgn!>6vfwg@5T~ zVEw5-_bjx29L${tvd6*f>&V7Qc=IH(c^cV%?Ol4IOdg^_X6Vz^#y*yH7{NP8<*KtH zzGI+Phk^1iRXs#e^;RnS|9d02w?vX6G zUJ>&K$oK8+oiFEZe=&0PxI6zey7tgAdRba1p0Qt#tSV8mK)7AI7!}E&)V*_Fb)%?0 zgop=FlSGb!cm?nh{Jt|k|4Ggw!IfmF6a#*5Iwo#vGKZ+2aW+MPd_06dNAoQZ2?IGn zU|kr@i-H9H&=YWc(A0Yo;dQ~`z4&k*;a4+Dq<-${pJGa^v}PnZ^ovZH5jyaZRX#{ezTY!(DLk|v>0QT3 z2yfSHw0F%Bp6Z=G>YIIkY41_?=y>tq#n{S+;mnGsd(E5L=$X9IGyXwj;HY!rR%ZTj zdg*@u>ix*r2iQhT&Z3_^9?#)&->spwrx~o_4`1sV*-y>iNz7c2k6i15H*(@iX8K}! z_O=r}U3eujc0JI4B{6q5*ndf4pTG%nwi4Fd0l9tDlgvA!6Gat`Mdh60s-|LEYXwu) ztO`l2{oSLNQqwo4w_fJ1eSP%FUm}$L@&lZ8_{F6Mh@}4KYcNR`if6R00OOM{3Hne8 z1HZ4pyjWiT@gLs)^p9sh`R?;?|M2-wzdQTMAI`{UzQgCi!pJB<*vO-=e)II}-y*mV zO)la`ko|?~8ba3XvtQkKjiE4dasL%>@QM*Iisv1y3FGz?A>X$HE4avT-;Z%aB&+o< z7~G@H8YJ%_@^M^gN!bFU%}Te}&{@qhm(Wzy1}8%^!L=^8bmX|s14i2x%bkDEv3uTe zID?J}7Cmw?MB3myb8_&a=FZ`Q$^CFmg8p=Nf(0uDpe7R>pnLqp7n|4|gsiFfsdYw3w=`KfE^S;xwW zFN@y^&qBGEk@Z&qY-AH`dlJbL=8fdfqT8?Wbnl*dm!Bz97ui@7#?3*~P`z!0X&q*g zoOx^z57Zja?P8?cPgM?9sC&y4Nj#;}bg8@-ER5p0R5nni9w{?UmKhg|O|xaDrE=38 z_!r4J^S8S0L zDRzFz=ZQ}eb#g(iBIc_WY$4&a3RWJ-Tny4Z4zG}v|F)5v_VL?DkwvVutaAtV9SY{> zoG`L32;_zSEkO|dFF9GLLGl&yH+m1O{fEAhz3$;G_;+S`3-xnn-xOV9t`V4O1s2>t zs%TJxb1RswD44;yKyf9VpqK*i*0q*1C738xvE@vW9b@0{5N=|wE8Vk((3G-$!X8^p zO&tXX_dUJ4n4)&{-AT`U z;LB{KCJtl0%hB|5_h8Ny9qk#;jV-=EwsLD`^ZxAiLt@PsKPK2nBewdiO2}DQwkFX~dAG_}BJM2guc+wZT zM|WZaTfxB#*7zpQpu|Q$Z1347e}^L%T5Z!UIP-x^xR!op$7p=?fY)k2U&g?ww1kEU zxV*Gh(I^i}t^L+WHa2#7bp65F(U&{7h=20(qkjPT!Xb$VajQb+`sbD2bx}c(E;LKJI3Q##n-%WuReFLJ@v1@46dI{gjES&cG{P_#=!YnV zp&HF#rDmW)Jy4zj`}%<#pG_BjisSM=rzs4DwYcFh7C>O_Ff_U%^aJOp0gH`I3qneQ|uRxp4Ui zYlApd2K>G&p|RHhI5$UknhW@~jNEWcTt|vK7LF8gJUbF>?nkq5J~s!~F+gttenZ$l z+SBx2v{cqPueqelMdUYH6b38Lq*J`EmZB&5+`wLXIoWc-+bMXMSgo{Zz z-CD&W{%1TWrzvbXL)~v3DRCP>G8{azUvj&5=87daKeTu$)}IH-_D<|1Mz@`j zsiFBR>50pk=}V(4x4OqKhccV7-c?`cOt^R3m)Ys)TC>Hn{@%->!E64$D{bBT&g4OO z=(@M}N@(D6sQ*f6=mU4^LPu)T9$RuJcWtqpHMZ8#z3oq}`O@3=&MixPL+_sr3|+Lw z^X|-Hdrwa1!-ic9{jbv8 z()74SomX9ZuVdS< zqFb*3r3hX(PyY05oe*~3d==dQs9*WB#{gpou(|rgn*}ew^k#uv;PjcF0QQv!wRiTZ zclD(Q;9Yx;H{P`u?v)e&`l%1hn?DV2yngpn@Pkk@hw!s@UU%=DcI};YADs2;i1a={Mi*6pNF$~lhCu_6=RLyXeYOq|HtdtFw$x%52#iY#Rqn#FV*a-I;wuBK7 z@xFEBo_*qmGIaqv3$pm8BEE_6Ng**$uJirt{LqFVh(*FJbjsTPOQ@gCsGkS+0z(I# zqxpfUrMb1Oh4tNNdazEUuN63|Nq(J)iun;8Y>S$i=vP%tXjzI%rVJ>Ck+Qs207kBE zQZo^^qUlum7f8rVctKj2TmO5v^-v^Z@217@^~%he&8Ng_k@@gytQ3`woL+ z$lSoqk=tFvo38j`=g3|#y=L^!49s8a9Lk3KR->7fzL^7OWI8>u-!r`J>|7d{y_y)m z=uNI9Msn`hbTGZr9$)R~&bEaYvCZd6?_EImpgjWrB}%ddD!VW#|*n zRq)Q2^UCVPuy3-+gy zlQ;dn2M`uIy4Tu*lZv*CHN32{XC%6)#@5M~xmco(k{VsLI7)BrVHxK69sBaoVS{y@ zVaPJ|y%b5Lw9!(^G1sYjaG(d^P3*sk?Go_D3UzFB`&A6cBF{;5>jge6!0jbC6cF~3 zO88|UdlDqilVJXZFM9$k2SCAVCq$1bfZDfCP~5SGSA6Cfx?M1D2wcB)7TZ4U+&;z6 zif^9*yotTDp8d1r{u{ia?^Yy_kg$gwE$lL2RSE&rcDKp5t$KpypTYX~O`G5`Gl$B)c?M>zhA z`Z+P0?H^xV$nL=Z97+z>ip)rUu5E4u|56$hG-gW`OGfl(ma>wrtg2I1u~aCYF-xkf z;a5P8ZcuY&UId8o9V6`tT*=HyU6VY0l7oPK*9g`LlT%kc$z0diWvzEIIIwRFEZIAA z?(~)=yaod#e2l4?YeNfH9g*q8*kxnKV0&y4BcAlwj<;(8_#K!&>Kfj0Mkaek_Oy;M zZ#v&Ie#w_y%Z%-YQ(0GN!qvH8kF6N}v#RzHEC+#(+mSWbF|7|STjLw*j#+!xwmY?l z?HiL9nM-3@_oU1*X^So4(44}WvILgZ-UVY|Mdg`ybmf%J325e?)Rw@|$HxsmLq=rk z^>ohFHJXa4E$1sZn0nXpG~Cv<8Xhj2`}OW=zPiWkpXnSy35_6*mk_cp-1!OgE6j}U zy!q9=&;J7@G}Zv26(hX*J`5Y*|1GNM$A#h1^RIpb3G4Hp{qc*Re)s&(fA{9wKb(F0 z-Puq7h$258uYlk+1Kly=T+WvyNIQK61(3g@5WvlLyb3%$(#&9L*AIvocI=uvBn@ zJasQ!h7I}!dGvxRc7ds%uG24J5x8F4T_<<2T6A2k$1#32x&ONB;4FS{7TtZ_wSU&R zOTg8Mns)mX5JqJi-zOz*IR843dmhNX@~%BYQH}RLAb0&Zw2s$j{`FU$_2&f9xfky2 zD_{17fA!RxeSt36yZ*|bI}5MB3T+g~9kAUy?b$iScgD}^-aAVlzD-|vn>c!#y6_g* zS0*oD> z<$ZWcG(+c&bLUO-=Z!0KcTTaeKM(!t_L~Ltzjr^IyYqJB(#u%(QF!%%X5dJX#QX^T zFIm(TqXovys6fGxlp$LY*pk?s!b7IRuz-@WQA-3X3?#pubiM@3I1`M+g}dl~LDu$> zTegWisx+<^0=(PcUrBVm;J?~v3ZjGtem9zN!YqcQj`!P!u9|u;*!%YbL%WGl61xHO zBp@8@8Nzygji9YYi20GOvOz&%La32Z7#b=a{jZurM@6l`Is+!Zm30CNy@kqAvt%7S zeGd|Y5z^ik%j$x2d}E?s5fz#TOrZsDIv48S@gz5N-dRWYs@gMc4le`gvW^L3Bo`jJ z);V@HGjj#Z3qWjOsm80?Uv$vnOdAz)`kFO?RU{x;kmBZwH_g?NQ2 z(lbcVU;XEU&;J8de*4X@Z@s}qC*s_I{(SK1-ya~IgKX~q9S#vrY@H-#KkXX7otnGp zKvR?4^!026(p%}7OWtHY)U#~$k7%7~vD(XQ)Yi9HSi%nEm9^L>*{WWq97jA?44F?= z;oWNOLPOh%GL)B~A?g@zaSls^Q{Jif6Z>b03vYm56tRG65^Q)tsIYtYG`@S~RTi)}&d6Os8ZUNJv< zCuH?pKrf6&nCQ>A2u!+N+~6+ASV2++Xwao!~4mR+`z=z!usC)+K#7dfG#38yJ-Rwt1r(zoF2zZ4xg@}~B$bnthX)#>R(s5@Q>_#DXg_;q6}3xNz2FM1nkO z-<;k*Beo8yT%$_IxXLvpG!Cdev*y4gd!EO79vr z2WJeyWnX4{B71-7!pq$czuLL^1Dq8`DjllacatMP7#%C#6FnK(@?ZVtHLBtte}~vE zRLJi%tG8%!zahESpZ)ZYc)-Qazd^B$nCss?{IlOYAguix+4T%D`F^m-R&4MQ8+pN~$+QNz^wyBM8s^VEqPfnlQ^eo;* z*V%LU2AqgGwtN4K0P29ec?U64*&e)#?Et@L-u&wz>g4rf@NX~=2tN-1%Xz}N!L^s} z_2+^0Q~x?XgzAOoB$z+(uAckmUqpBVZt!nUCz z{JSSj!mt7T3J@-=Er4@TFc%tOTo{CwMO3VU&$$5Mz2@+4ON7+GcrY`aUy$I zdo+)H*gkawmlq2C?>3f?fM3+lVkA#u0i>`(2>2tSM>}xM4*zrJqJ3}=^P{fO^}(s^ z;`-jg+P0^&pDwi3G+U@G*6Jp0ZG();l2MtmD!LlrtzxLE=&H&(d1Wos8*xQl3+iVo zSIv-gu(Ula^8nYmq6%-Q{c|esEKi^2s3Xeu5s9VO976H~0##N;_F4B7GwuGDI7yd zt)iR>*;!n}mbWOJW=~%vy%0#RdODZ%?fo!LtED4sw2*?-|dc-PAx{Q>I? z7#w44g!=j8&;Re8&;Ku>;Mf0t>CrDgJo#5_E+7=^;0{SGNY8e{hIv(D~y zb7;}z9}i{LlT!y6okx3DB-#i^+%8o6nx)7$^E61}w&)61m1fD4Nc1(NKX46w(A>UJ zty@(Fx7293y0^8RTe{SqsqYBa_t5+TvmoEjz0+L!K7paTv+eLdl6X; zCLuY(81i$-=I^`Cx6u5OW1}!{w1hD`-ZzcjXrDkbEz+@|U%|hzBa7ywQCP6@uw9Y- z$q>N41!tFb;HqutiaC9ueef_id;vnx@Kkm=x4*cyI1XrJ;nB6nPUuRl92i?w@-W0d+C`gdf&LgGpcnCDcX`Px;R~6vj!(@ zp;1?4GC8snOfI;(7L49;rENfL=;BJfSe&u>rabYPX#aY9cno_493=MOq>C!XQ$+ZN zgh1bge032~pGI2r8KEKFq>6B)zGhuY>m00a^}++p5V`sKq}bXQ=-)GXhj}U-^hvps z8xnI$?ixe?&ex|JWP#E;Svk`{ZP3;>Vj3>3WJs%7GM>1tMefkFb-TM}`=>92k}HOe zaa&~0o7m`IxSqZE^5E7Fu6+74rQC@2_HA;9*X zuzdFIA2IfYivzR^@_qBuKfeC<4=;ZBd%zqhM)OMwY3SHUp)ZVmp^ts|ifj~O{}*Xj z*(+be7n+>8o0#~})xDwjEf~CWM&G>3IR+1#uWKnay4O9JZ;y<(D7`$1vyP`}5ZN0f zUKH3y4|<9Lp>>$=Sc z!g&9hd?x=YkUxWt{f>O!{UGw2Vebs>Hhv5i-^($!gvU5iG+pi#dmN1WWGXCU6}uhdoCb6$2M_OmBe1~CN__h@lAji zBP4{^ktMG`nJ0JfJ<47A)T*m<$?O}~dq+h2xYXPuHFgSBVX>~$|HK!H}a4;YuA%Vrv~o#uFKMLNilfZc&DGj)7o$ zBam1Qrk7DRU=TK)yO+OwcIlHJU;gB0S3dnq?Dr9)1p;tz{qX7khNy+Dd?;ElLPMAW zHX$_wtw;-jas~bQ&wfsd=hJWhcm_Csi|3DkF#2EM7o%j@v2FmiuZZ~>^QjM!`t|T1 za##O+a^oc~S-`Afk1V=6*A#8T8uw(YDT!jk=o@o{Cz4~E;q;=y+|5QNq0rVWcM4Qd zdvw;|8yD!(BHRvB4a#Ge2J*+P?hTeLFA42Pf;+nI9eH>`8P6NiyOzFv_w4Pi?N{$w zQ6LLI27XCd`%cK(Jw>70d2kxv!5|4`FoY=#gI( zDV}{88Ry;r*P!Ddu~(sZK7$}eekb6!1R82GFnUAC{leSK(P#aazW{_&7e5QEo+wg> z+z#aFjggRQA9D7l1fE&GXRgtMc%L~W-(uU5i7;v_qNInAOj`vOR*z9MLzU{mDkZAu zfl^hvOfx_=P1Ux|)mi4JZ=KFx$IkC(M1{Wd77{ePltYKdvFzjE;>X&|5edgY{fzLs zOe+q0Tax~_@*yTq%9Kk~6mG-fZ z>=Pd-5(fY;Azz#=i*8AAITYcsWO$SlhIWx6+ZsPac#dW0ilO(=HFOXhfjYE4G_$_G zc`&!OV-F>3ai_c4TGQOd5SW>bN;*eYfGvz1sGki~hLS>uex*SGMHNE~Qx=V9Xpp%Z z5Fln9M~VW|xhlh!v1_5lHpSCta36;$j|t7GdPN*VVY2OON{K9eEvB?NG_P{c#D@;M z#}2ffagnh{sOu7_!+ac)Yckaf?V9#9Pv$my2LTGbd)Vw9)42NU1rDCn#}V0Nrf{=5 zqIVCe9sO#Av{({6i5H89wS24(Tj@fCpa#{>u?AU)Ee~_#!8*RHzSYf@1!+w-nI+XE z^&;S_Mc1izkL%pyOtD`8V{ltPg3V=Z{nTbZTh>XJ3>8z`8`LRkQ%7~9z976SP(Rl; zXi90#oEAf4tBJ-CRyU}mrid##AI#)3qZ|FRSJRXG3p48j{gO(*wcrch4B!?XSBU2r!gAFsP~JX|JPUl^Z$dR1G)5&pfUdi zy7850qRBUT^>4V%{rKwi5?a5;iTWm>5%sqUWn=5vS zbf}h{f#h;(bW_*f%a^s&*a`+$Ro7^&7YC8Tfi_>^7^)V<8QRg%?32#Lj~mQcdGxT^ znKdR3)Lk3$@S-ZdZp`c>Hr$8PC~RTGOOwN!)C00v>X%C(CuOHaXX%zO`ngidp(t`fj!|+5~k=hS_4YNe?bg ziY>ijOP|a(W(_R{`?sS5drEshN9N&cLg;)M0_1C%5M)=^WEL4>sPwF!Axvpiu3@FU zw?z}6H|luU4wiehwgmb(iJ=>m&6Rm-@p+l2hHIj5QSRz$1x{I8FHaR=iG3hn8V|ph z?6^n{bhqlFVq=skbPM%xGR&YJXx4SY1=^$vYrGQ_KK}8&^p;E|r>}_Hi~A9L?H~d< z%b04OJXnd-?RBk;CbdB2goLZGL=4V!v(hg$gx#G>!OTi#d}nC(Xma(++~!AHS6}bm z`SIfylGg?=_%-joA z3dIJ!$z01b3ROX#%xm@yhEfO@?W%?*$(AztMi`#8?jgPgxr==?u9G6_mWKBy4!^Xa zzl$BU`t#!8cKh%(a|#gN)b{L{diSgY`|g>W@r@V2Z@gfFA{0y@e1g|P{rswX_f^;7 zYgn^@P}2XdzwmE7_vfF3c0+JdZNDzm&lnyZNAhpqQ82hTm^%w?K(oRd{3*C4KZEl8 zu6}+u?R{6MgMX73-hh8WzUY5ZKSSbHr}vw^IH@+$*gk=Ty%zth*t6J-v}*4x2RDnI zlMRkVj%}f?4G^BJF;3MQ#;ah;f`p|VsZU-=`pCC*PnX_TVR@fCd&nptTYkB#s{;duLbH zd7$fizis%cweNy+=rBCGmmJFu&Ez+?59hOc7JnC2Xr_s*$i`ucjI3r&EeC|Fr?KQ! z4Cv1qB->QhA%7BzmXJypV!8zU;=niJzu0YKZ08#A%X4O%Tx$Z?Jl`@(m*Zf4H(E

    @UtZVj;*@MREFOb^~!pQr&;A{ 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 JA|h@{{|EmjYHt7l diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/motivation.bmp b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/motivation.bmp deleted file mode 100644 index 3dcd7037988fa6bae6a215118367ba933490c7ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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 diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/origP.565 b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/origP.565 deleted file mode 100644 index 4f0fdc969de5abcc5b10ea47da90ed6689e7a2c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153654 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℞SdToFTc2iZ>+cqgAcxG^99HK_a);m07Bf&V_ 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 diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/radioP.565 b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/radioP.565 deleted file mode 100644 index 56dc97e4a0c54863ff93755301fab4590414bde8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153654 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 Oky!8sTjK#U!~QRC|H<$G diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/radioP.bmp b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/radioP.bmp deleted file mode 100644 index dfb1ca635c5f418c10c76431dbaf403ea3811333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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

    (vS6x@^A2r)!O3R%IV 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

    8l}0$ssv;vGMVg_7SquLD$;J>Q#bynPga`H4IX_ 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 z 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 YT}G(6A3 z>Q_I{4VG{K6doK_c!Wibh&FDa>sn)~F@%-W_UP2U3nV~%i?9uzFG2a2emerNFC%F41m zneaL2eMnUR%(f!b6Hk)W*}g+~D0d7^{t-Z=z4k;XDFL$>anK#&V{;c9ShQ{SS-_<_XOW#OtX) z$JzQS{`2JZOp%(k^qq6Czx{M>n5)CjFo6RHbRM=3 za|!t5;w$5kB4z)oR5gEN>&~U5)TC{Xj;$VBY0i0_?&gH_8^FSt!a$>lt!CKY1ha2n zi$jg&p{o&LvtH~#u+xnuC;E46EM>1G`;(OYVsU4vtG9vo9wDQ++JqJqN~J_->5nl9 zGz%i_4Arr9;Iwvfko8`phuEzg4_h4*H-Nf*4AiEDnY|WX3#?WwDyBik(T#!Arg;>Q zbTiaRN4G4RN2T{P*vW*;4q~Hr0J=f8$bAO=Rw9!@pln0w#mOueq&W2*2+)&Vs1rnsufg$_&K_6 zB8~MlOizWX^RloY%~!-DQaTmeI$j#fwJYC~c%WX`eN%LfhTy<7P{F7chgBhD0b z97U%VY6~f^{-1b3bXQ;h3#w7=A-{G{*&8it)@r}Q>#u)-vM_UCs1Bmqh8ERb#bv3X zvJK!4bH_)RJ)-i|OeywP1hPkc5$8$3#efMmnvUi2EMb(!OPTpg7*zx36qnc$H4IXG zg6xLV$Qeb?Uh2U-nS51!CR;y3ObLNn9WeTH_x*F4NYlG;?p1`QYXf6d zGwDJL#j=ABmVnbIw$m20Egow2r~ihsg67rAD*d(|K4+u`Me7OJ2`~hyEqHS1ZB0cM zo#-WTtqw8fgd?MOUN-$MPyZC^=`h53?+2#QyOyrJcV8eE1*Wpt4l-u&$!MOi1$1pycLveS1D}~wAG#=f95fh@3cLI+u(H zV9)|vK-=s~Z{i0p!H3pX*e|4Fj&dSeh@O2?)I(*pWz!iUGTPZx6&L2=JW~EcZB3<< zv&?yho(!BbdR7f|T+j_-3O>QMiq+0NSYQGh9h52)h(j%TKR(8PyfNi9$;4swp-qcs zH5(4lsIj$A%k7G-VtN(to*6aJ2?NZl-CJ$fAFwGni|=!XsUpqC^ah^CPI+J{a>w!m zQgBY7HO&+ox!BR>v+Of`Lpq-*e4aza9vxlb*YxAqihxEbjF(M^nOQ!ou3=c68!xo=!O(KVk4;ifps+<=M+BZ;70zSo zV?#9G826{cyw;1qC%c59j%5*v>AmB-Rq>jWVeYu1j%MD7zt7lK0MZ!uQ}3lPnS zTKxLJ2EUL>AG)DmI#A8QTVj16f^WY5XYT(N*OxG?ub~=+ic+Xn9d;(~_gNiGvkj`^ zNcQq~$DKzT?=W>poeT?YJerU4%Cf3E)V+sQ|KcC|sPfV%kJ@43)|!by1TTVeSYBX)NFH8Lj9dfX(wXLHbb@-)V&7QRjKkwt8@VRE_z- z8Ag+wX?p_uF}5~?)>Nga>X=DJ;q);2RUc_Pf>G^V8ri3L<*KW6$zU4mU5MTC zqK~JU>)? zyQ2%D`XB_$P1{SbZTY+%u;Ym)Mw;_XB#~WGe{_;#axOW&%%|Aa1($&PTS*msf12!8_VHlG`k6lP8qEe|3iD-uSa!VaNtI z#mT*nNe2?$rXQ&$X8$&^jEoArM6=t>AyD}yr?7t*Lv$CYf#Fh}pr1QDy~@j`Bgbmk zca8q>s#Iv``9GN_oY$znQCu%)&jgyq=-hfx)4f>q1ay$%Iquo~ywxKCjvr!?=t^}%K)Fp44?ZoCAyn_)CoaK>y>Y~W|iATV@ zJTHU-rt}?l;4Wzd$JKTP*LCJhd}ghu2>mozP)yWMVuPFv(2_?@TS1Z^jXqKaMPz;) zc|;DeTgqVUI{}LUw+$QPc!>?zRnp_b7x?Hnj==dFk(Zx-g~|o%VponlUW7>ADQra= zq1faKER)W#C#)$i*}Z5l)a!Kdz!Ygb^Dt_(3Ry$Z(-&w&8C|B*y`9CUk5S>CqUgp)Q7>$ z%t7p8smb)HvPm`}zQi5|RItH*P;PhZZOv>(CA0Y)s5}@4Xv-SB!8vWktX{&`u5mBb zE>mGNn@@9Zd~CDzu}Nx)YUBVrT+ERW&x3r9?YivdW0qF7XZyUZ)k_M{+}1V;?G|Mh z-F7xooU6JkRRiJH-omQWjcD4V;e1aV9rcY(^!>;r>cw|K^MpPuwS=xBm8yfU;Qa_ij#h+Mpu^c9e1=S=5-Y^}XsX7r@So&xU?pg+ONkQ| zTf7}UPc^RaZmgfLK7~!NSpxiGxd%;QSsAaLPvs2`h!Q>6m8aWzEW|z@!va_Apzq8p zh))CFfW64tl=)F{Z$#x2o5sFR$$zqm!2q9L5HnKxQe=1e@k>ONE1c-ls4A3j#+SHe zne7jgkw3s^tHIzYHkM&;-^BlYfhsqqlFoRm-v2m$P|2&in@ku7tL*L-qcPn_oAx{|9cXZ6zr8lR_8Pv!Ttc&kACt!~MhvO^b{VEql`%Jo_mRZ&>1(<>=Jsc=;WLwf28N& zVb>)-kLy5t+()I!2OCf_VPp+P5}pEVs#v+8&Xu;wU|+}Wtuklf@WVy6{h!@kfMb7w z91s2;T|Rn*_SUT<>f}?I!mKAdFsLV)Pcb{V6LdqVKBl7Ylldjhuh23E?*muc=`Q9y zPY2gwKRcBv20NYC!}(H8q+*O{MhON*L~)bTsooq}Ald`$?N!W;9RMX5Cga0927Bq~ zQNPKb*&5zEv6=&9lCvH&)Jt@B6LsBDDmgyT4NahTrzvu2ChG1`ZIvkT7M zE!BTuQ@vz+pfq$B>2}iVc&c|mKN*e-_K2P+&&rLO-oyT}5AXG#?`OV*jwux~8+fzK zi`MfQ6nNNV&`F)NlM}^vGnfCA=cc*P1u|YV$DH@2b|C8$79;ypm4UDOt*Ve0)|c^J z^1yF=<8>+5Q$w;7N4XS{@G6@pwraNyv;RJL0`$A-F(2fe9h}|>(_#!C$6XHgdegyP z-80op@u%d-r{LGn6~Zs((4U+NT?CVYv0|U8Q|x;gF^AP>Xdbh7v4MT4x8Jme+Ort; z%hjf1^p}|7P%nh1I>o7c@kHpXif@E{N3G|ISmaAdvJEg_wmNjM(+Gry{&9n90-nf9 zVnH7qJy1&KHVkmirKl%36@^`A>9sL)LsZ3|X&OWPe|UpbRJOuR2MpqN&VDJmK!WP; z#K4?46GRj~MP$KmsS5(adqC_^ML_F$bbY9gj@LZdApT6fU!Lv=wHB3UJnEmP7sAFJ zn~^*yg+1oE_P5?Xinm9dVfYCxwnuOGf$s6bMcu z&*YIdTZS&i=&rJvW(9qsY4#RIXWk9&$F{*g@E#x#AYDUnb^63rhU2#YGGj9s=o8-? zxB-vqzId)itB`4LmF9TFLXgU4#9dqBh4OVA6p$d)gAO*h(tO-SCK<4(e4r

    DRnE%*^U(&m|37VaR8^dN! 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 diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/soldHouse.bmp b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/soldHouse.bmp deleted file mode 100644 index 5c14038c8ad444e637e34639b7a3be35ee0a0f8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 zcmXWCcX*rUc{iH0P1?qp&TJCfu^n$q*50H@iF@xo!3h!|0RkZQp2XgJ@4W$n7~Fe{ z+OjRrq)nUl`+Cl~&fn)rzk^Gls24BD7q6cCetzq|SAUK5_uu*3;~IFr51u98{mys( zH~9Oz-}w#r3LfC~pTF{*|9SqO1K;_M#+ioWS)ui3`p`yh`$;%=n%{Zs&K&dXSrpey zFmD)EzhL!7c| zj9H3xNfFp4$bI)ar!Q6wpDXUHnzMBA)72SdMx0>@s?H(o zdk~(ZYJ_sTZRSSH)SV{i^}4ZJbt5WeKV6QKc!&5E{8+6J#32Tu@M0 za4Saa%&hP&4!MPjv?$!@qE^WF}(tN3?y0W8xm>@#P;t-Cj38RIoGZP%& z^%_Vw$=!r^^t1hgoG{zFIZ84ixbEgb)Zm<8imHK9we6EEtRl>Htc{cORqgOzI7eWK zkIu`R2WR0-9Yq_%Fq9*3>Ksv2*E;s`<UG;|$4Bwx46oAQtp> z1IXGDbaCrQdEe}$EHy0)_2Tu-2+B zcGI+Q#y!vx(d$J2urP4oRY$2Ko;$oFq>jj2FtQ|HZ!Gyxb^gwv$3 ziU?Wk?j6HIVDwR%*|hQkAq$OC4M>`<4bDT$qYO|p7S$#y8 zyVbs&%ATSrecq*0g?CNr%u@L_9N(<6#iARJmv)|M{h8(CPt)rUyzxy><}AJORN-3I zxUwXki70RpxP}2JaS%@DsN7_MHClK`m)fzOr?K9N@I88UtGvP#btk5L0B-F+zo~49QL>(hD?|gje zXRrS9M?e1A@85XmqszB``}!Z>c>Ci|F5kUc)bP$n*M9%z`)_}6yW!A@u4&%#0$9Fs)9B<3j}Ph$I1#WTA#NjAaupi;ppl?bGzDC2f~)SHJn* zl@G7n8ANd@%0M%OIL*+)NZPw~!?*7@-L3EIh7ziKrut`SXqL9R8KSer6NM8`Vl$B5 z#xvv;fzj#D$_xRODQpaFz$uDp9FHW>GgVQ2a%Y^V2ycEG-hRAv^tB{$LRW+`N1rd) zp#3)Rtx2{&xuOgMn5j9dG}&* zJ4OLhrKa@DO%!iC&0X9}X(#Gyr};e$PwOnV0zw>S+oyH;5vCQZjEz&YU1(7?gjm&2 zXv3NAjdBJT{1qdNl73VdPT!8vR6;0M>ZeNk$z51o6;#~M^0tvIT_jT%#ZuHmXvJx- zRrEGM@E=^StQo|$PmtQ6bO=>DEp+1@Yh&VQGfX@{vzHH38{mALE>$y(x?a^)+&p^e zcE#K8ee}uo;{|W%DduN0vJ3dS^#S7C6^I z(J#T6PJ(U2y!za+^_eQPS2%d_@Z0~|dG>GV-N)v{mS_FR(&?A(rA>t^-99;2+BtE% zcH~|=s$qyY#dEW)1)Mg86xw@`bSOn}uVu7;1V1lwf%05=^ym2D*GqfP*-D=~d$?d- zBFLjizK>>F8o)@$NE#GV2brR5Kl#(<*;l6E%G%NAW>>} zQI%MxMs7~{6RQ}S3{DhXE2+9!)-=adXoCd|Lp_e+OLgHf40~vX(gwkxSh{WqZk8+~ zaEu5dx2g+zuXVhvb+oi;^v2!B?orePnuQ=sMrNr*wvsEcTLZaN{%CRiRO`*s)&34R ztqaB`iEOPQ#k{L zW3_vkC3g#Sewy4j$1n{ecpPnTj;=B~5+a=!d{fpqQBpU2;dbS#zxeelKl;g!fAZ=p zKl~B+=H2r*>-tdlJCL_4y6!hY%IXIzx@JoohHjL#*N@TL;L56DdiT7#8?T*HCC23u zgl-9`UPM_pi0%WDbB~vNG{JK96IHFl*pDuiH1*Bit?I7n7-1{@a}32eUN}xx*Y?i5 z`N7RUzJKZ0zk92+5z-7H&vQ-Q^qwxT!4R7}hGrmW&e$w%f*@@fKo;Mt7ipbrsY{^s zInvu)wGYWPcO!W)mSq5?6529UrJpRZ5oCVaf&|Yu&e9~~cs^6+XP6c{QQ}dCp>Z5_ zyS}fnbE{g`kW;3jAg4qmZ z+#jY^&nc^B)pc{428{YnH*S#UZ<$lJqI9(wQw>60Hq0z)pT6HdeWiM=WPm#JhmQgB2nWict!#KG;z9$W?+4GOIi5<3mHM#RV zy!;@&^E9;a*t7Z|wf!``|J;^2KyZv7Uavl1++IIS2XDlPLo)l4BziP}6`i|T@w>M^ zx>?av+D~mnDtigK8A*l~IT2+ZYU118!kKgFB)tEXG`s^P^QHEzHnwZapN3Z+29_V> zcAtImU;pouZ~klN>}!8=cYXhb&Xcu8*IdyRdtzH;juJTfDXLCn&#Hadj=|X;B>#33 zpcpW;$Th<>KxT;;rd;D%1b`9CQezkFM2TDH-(bs~G@%L2RM&M+-74>Fn56fh#SEpV z6VB>{bA-lZc>kHewnIkH5|%bhk+~2w4JgAoimDgR#Hu5g z@3-8o?`;{FMTuNcytHkIRMQTvZXKJat9iyG)xM(h zkvSpI_-H~a=(?3nLk)e?Wp(}YLw70F+s9FC6S&(W z^IU?!N>X{{_S}rXK1jBp-NzHU)e*xA+H*KANmh@s`^cutmA!yL{Ob2_et5IKmuRS* z6nAr?ZCGpB0O9rbuf6fk`Ex}bEiis@>uhl+@@n;9#VEOn;OOVaYUk7ypaRON znN~nViB6Wkev(%+#+eicYGJZ_V}f=#k06UGLR%tdP8B~;B#$scdq12zgx8od4^+Wb zhRRb^QD0uyRoB%0?uS>-UA}R@x@v41V{~Q4rtkwJ@IU?YuiZU=qx7x! z&QGDZOM9P3)}N%do-S=a-Fo`xz~(a;MS_#~mXBU8?LF4{@_>WDcqW!UN>O+a0@E~( z-7rFJ7~^*$ zN~^J@=yJczmL-Ti0NdC0Of^qZz{O8fwZjxMOyI5SoCG@~U+E4e*2QYSGqU7OY>*es zz2i8gHDwR4NHif=Vl%yb45%wnXtN~upj1V3KccA@);C2SgwwjmsZCwu0GV^;HUdX3 zvc~6$?BvyU;%NqM?x+Y5N2jBbn+E0G=%U}NLcb{Cp*F8bKUf%ZprJ{4!E3teB z&zK+z%%dpU^gN3w(36zjS)zz0_nkkVgyY*N0E$7lctc2vc?g%+|%4Qb+5MP zosX}*_2IQEWu2egY8pl_Opw$hZBp%Bp2YB5`q6d$II%5>SH(K#Bs1##C^yi9*NxMy z9Z2Z}!#u@x)10eh%L>!A!E|o&>}yK*iY9shXPQATx>Gaw(UlT_$*ZOmP5UZkE(lGxTZhE6hoJLlvQTL9zxVNlOSj4{TrGxUS>^QuQjMRd z&@zR8gVR$qS!4J3?fcDlD_X~9*kXW81je3e8bhR~2@Pb9il+c<=LnR@5IHx_ zK3_S0E;G6P@okaH+SEQ=QQ1;l*3MIV_zJHnx>-1Qn%aGK`25ed=(;O+63m~(H=e}` z`^TUEDZcgCk=T=XHwSP^mL&^cur-e}rdf_jhIMwqrwFccEa_2}{eH{zINNu7VBtrCz|yTLZ$_m?A?-Ji)v62FY5QWw~vNJc1Ws1bTuZOjAd}dXrjHt0!Ntoqe5L z+bk_+B%FG zp5@^9)@g=i94~Jl!Vf~pWRZ=j@M9RNlIk|5$h3d@g-{D2%I|3_z7>*~=#DLe7*7sg3ZEWnGYV1W7SGN7`jd$OC z@BICSKAPNKJ1~ExYUoZ2T=+Iht7~1_beei|Em1gK%<7jpx z1l2r%F0bwD8=WVzR6=!xEixMIF${H~Z(?o|y8wYRP%I6WYk(4j?ZdFHaoqLt)(dxP zhH1JDJkoTMs__^qc>cDD3;Q2bRz>Xv-9?+#Orh zITIFt0m!C9Flrx+HA_`Mrt!Bc+Ur|J-O+78xODCuf@d0-<15TjAiRk6Aq-2^+%r~G z(NxvY-`Wo=tLyGX(1wYcF`BlU?&@H8s^HQpgz{D^vSySuO%MVM*~|7Kty@(8E=-+9 zDic*B%+@(|-Q>cp7G%``qoRjc+Dj_!qty%$8)g+Vs$4C?*o4uvpw&H`P@f<@reCd{ zmX1jhT<;#)oFiD)>A^!~bf>WQB(d|tpV^cnFql0|uAC;9_vPmJ z;`Sq7YJ*{26lI>!Lx)`FGG6E+$$bjXiqe(_EZZ1dSK5+u43*x!Bs2t2EF)Rw6oXw@ zmxi;=m<1bKAL3h6RGE(cWCwJC;~f?tr?g^Rk!wG=|a#1 zxhm@%$AIVB5iH|8-^Nn=&|=pRQ3b_``zDDpYl^FM_Kr+Z*h;-S<%_S#&0(`Q53qMr zKjv~t^X0pZ_v#0K{_EfW;@7{ub+?wUa>3Dz{)zd%2|`0Z;^M6e1eRA^*3vOF*VsFa zpev_YwuFxQOC&Y zSaUzTxU8wDys2dn4JRzH1lAcWpT*Z(eQBCN+tLlGY3Y0S!^@2wqqXfr@1MI~UekW3 zq_(84`)*Bp$2hvV7e0xg0s&;4?{9<}LOZVgIE$vW(~JP*jcD87b_(*nId^{ODV{ zv!HNot{i-}boPxozKNlWVR-(6CM-AmdPe8_M$uqBS9in8N7#J=;2HU$Koh1LA-wRs z(sAWp*S!hhpddNOb9Yk=&C~3vF-F@Arw6CI-HxajW;Tp-i`(Yvk%oS{trMj~C>Fa2 z)*869xMRMb<{IS(!KOSQh~OQY^5m&1xi3qeNh4cWMbMGlN$orhX7{b(HEVPO@YA)& z-$s^?l4~bYqYr#Qi)YCdTf=db7^)OUlWJXApd_mtDU&Zxmsl;qoW_#`@6!9SQiGGk zGa9@pu+GKS#MxK>we#?6tuvM1e7g7Wo3k(e^XU24;rtQU`}Q7vy><37y7FN6(YLw% zm%**iVtZejQ>RL2fuZn_RbhATIoGpKi#?tTKQ(TC<2d?uA^(yRdOT}6V5MIePW~dy zzmRxWor~Kn-vP?8OExaiOgVY%(7pQ1x_E{cT9)=-W)HtyK6vJeZ`xvO>;;Y1xyVw7 z)XtoLaWA#{U~T)M$rZNy3t<0M0pJ~2TL|q6A_unIsXnqHv?lq+#2j6UWlCWLKG&3- z5l0s+NroykM^o~YZdY=Xr;jnEZo1goI)s^H8%aF9#1@sBBPgMpDe*8QPQKdf%k0W5 zNttbtr;nq>z6pY&2TJWn@W2KEL9?gGvhFclMayv4B$+97O%W7mu9>)?=P6wZbA&F? z>rG)`Gtqcvl`EsLBuQcql&tNTpjNg`bdQs+6;-|Q$B#-Y+ZX~PY@S!%*pK3v#|Sdu zKU^to0;1pD>h6JQDg-C$oDtLw;hK7<>)R(AyP-{eGgy(QA7^YrDB(=Y;54Co1UWF0 z>UiA{8A4DEA(RN#7y92m?B2+l0arf(UfCI=DoW9R^S$qBxTJL z03N*i{>2Z^-}u#Ue*ejp;@jn&=dKiea`E;j*NS^5urQ9Ldro|-roX0R92_jEX!-ST ze|NXCb)L$X>w}I^I+)s6+CE#_I*aCyJ@K`0`e14E@%q`9i`!?B%;C=IR|=g=ZHox? z{_!~moT!Kw9>{C~JX;}m=YngGGy9(>HXp2yaYR_lg@v?zYX|8=}{a zv!(_9cDS$yt(q1_IJOm-IM6||0}HqhXOJdN(E26S;!~I=kN0lz9IL_gCyK<8GXoTZ zq%pjyj}}_`M=INg#XxM2Y#T#)bEu$kC(Zt>(VyFY`lq$yPh-oc$^33Se*j!gnJIu< zP#eRmMsJS7mk&?iVucf{KR+|iCv$YRNMUj9SY`+rJQ0gGlUO-jJ$!!j`0LGwFVDXG z>+;Fd{YPJ?S0Ak$eY(8=G`acM5L#1vmf8Bm9M8zm$3d?ir5mRhM!cy&4V>bVp9LQL zW&i8{%e?h9J@En`dCtl{S8jgA&pZ^E6BL^ntEVh3&sj8 z5I7A(5hrqo!Ni8f9+{`BOpdg{wS;FW6gr>A9CQHjTy9NnJg~bW8f%ioHDS5Ndv)EF z4c!&>Jzc{{5?wM1$M-|AVq;_&$-dWyxLna++&I!V%V~mOdXchr_(I(X8F*Y1I8pNu zrn+Txnr46r!U%bCnr)pxvU)~QAj2?3H{WZ9e0=c^keA7GyC#0p<{K7tpDY2UcX)4J&5FLEm2=|Ik~*Y5L+P# zDo~QaL7?sTK=IuZwB|v~&u?0&v8t+s2EkI>4pA@zw|LoxgRX zc3_6@8NrG~=45$A)5R+{i|;k^h2pa6_9?0Y$I&|i`QXxlCwIEEeHuut1A!utTz&Ax zeB^~Z&S&s>Q$e`Z^t2~6X~iS>s7PzqK4wTFM&e)N^um*L7RCU0J5jRrHv z6qz}+bYOJH2^^))nc=A&EM)*_zbr!(DT_+ID|0*x*Rzfh*hz{I)4W3V9tb4b zI3*0zgAWvrqp$`sl9+B1WF*3{0Q{`TrcS&jr0Wut3K2=zg(e$R#7NttPp47J9vFM8}N0ttvg<~8`)j3H+ zFId^;MT#mkN|uk26l8$|juYWI#tEzhA@&n=8J&L>2qr*{Aqp*2u{D@Ka>v&|R0Fgr zw%o4Jx&wv@^KEmf0lcq{J9@hF47XsKv9WF^9Nv2bOOg z25!{wOwZ_CUE5Gg_cWTwE3NJnC|tm~1{s+82~KeftbLZ(GK_58fJ zWF1i%LvXDK&ElLk3*|Tlu&P;cpqFYP>a&1%KruXEUf6sYP&*P^Y6v4NZ5?YGMAvmq z*LK6(MsejW(Eb_r-I|_?&haZn4JD1E_nXHr-Kjl)v;5NSx}ur^kU%J|8@y58`O)=? z`%R-D+b}0|Rd>$Zs~f;mRCJ-KZx~wH+|$%CcI#ew*TD4PED=VP*S2&6CMD8`K=x*i zp!FoTB|48akk9XbcJ%z4mA%i7KmE7--gCJrYzeI<*B;n>Ip5-81aPtShpW4fa=TBJ zP9U3XaO7rBbS<&6WA>-vSe{txWyxKjb$BvB0azjf=YnTsX`CSLg%-FB@k3MYOq6+q z^B=;MDV{Zp7r2Fv+#K67Ixhjz-z>-8jgU|^X&<;7ksWbhk7QY2@NUVX$I9fPCG$WY zKXPq;kv{syy|fovd63+B;$1u<3T)uA$&~s3L^*r6ei#}j@ao*Z3R+Wt9y^t zwxrV=V~cG{TP(Hqc>BRuh26)o!qL*&X)Jeg^71dMr=M>;{Ki)}oaH!RJl8N$KfwtM zVpZzEc5L-&_V9B<^vJRH(t7mg$jLY9-Dlg+{%!N~|1DqtiWNTQhWBOBBhTh%sr@gW ze*52>kH6l2{O#(|^Yzm&Pe1+B!SjFj=Z?MEJ&;p!Mc1f&{mzp=J^lKxI}e^~Jd26d zhyMIwpm5~P9j!h3D!hE?&m1UhaYLXWw=lfb^alxA60J)f@ z6q=$!eNbr)#`8PjrNf;EFF-tCj;=7f;-GRxh5(kWWvRVnk$r;elGql>BGbSOwFS!P z#Yt%TM9(by#=VxiwSDaql&)#|B!)wkdeBUb#1v^AfZZ%>t?GpKPLc*^*+jm18ZYFi zy$q#;DzSie3Ze)ku0pKx5Cl$|%!_B6NNg>JESZ=h*0qiZ)jpLq=I|!rSb^5RF}4us zBN}k>*fd^^AcD17m}45rx)k5Gf>LED>Ij^!t zF5-fvx^3caRr|RscQ4+oxlmL;1SbnM?sf2o~{ z>j>4UEn|2qoIMa5 z<6=vQZb(B}Rv6#c4<)w%zl~>}CTnk%chqztCJBnVp4sYdc*hv2yk)F;09Dh2yk6DU zGrLgLIzEn(HV@%1-KuSbV6f6q!w4B9f4X2Cz&BNnLUQvMiXu0*bc#jh`o@M2KD>PM zUQ_G9)b%^%_iH-(5#%ek@7^q~Xd9TIOWkCy(qK=*P$aqDZx5~b7B|wH4^wMrv6Vv* zNCRq#BUlJ$Hq`c*(jM1(mO{&i-o-tYHK_G38UnddB-0Vyv?jI}w;r29t2{$g;Y?Tc zz(2TBj$Cj6_nB)5@N6kre0L$ZOLwjl)DeL;=uPh0QoAfwaE@ctN7kFhIa2Q?VZn%G zD5$y&Q56^aHjSB6YxaT2w`oi7$^5IqBcM;!ApW!k^x-#tPB(lTdzl`_VUBr!Qmc53&c(0*hOVn`f!D zZWk3S2p zJeDt>^8LFsOI{XU*M!%6`4ejhfc!5NkaeOW5Ymkl4z}8Ejcy zQ~xM}DYiQjJ6L6yY{=-6$M)nNXhiP#3ZOr^gHNTloIJ9#V2CcLgHseGQ4yTx`-UjS zCMba1u!=rR4^l8mR?M^12#WO9z2@`Rt18-|l|5*-&_olc-SO3f<3~qF59j9Dz4OW* zjJzA8gpf@jGd#W!03u}F2yJ4X*E|3p!7A@Ij*n3FZF7dzd(h>Bs9pkWk0PEk)0l|2aI5Kh@T!E6}D z&kLLwrU6M+$*rl55$x-4y?60;<>jKfi??e2@ZKk7bv^A6^fW~|!*vi%88S~li6K_E z^pDLF<|#r9RREi#Oits9ORCR*a`Vl%-><449Gt-1ukLB@n?aGaj`X29khjIRgV`N- zVtaY_d4B)-;>IJ8ozCw)S=##)h&JwE-oLc(2yT4-?O(tqsC4JNsU5vLPUZnAQjMg_ z)V46V+X7Hv`!6K+rG|0R2e;e0=cGU!2J*-(QRdAa)0AF{F23N%YXd8$*sj1B7F%LC zp=+9|9K|a|wg_3I>42a{DcV`4W|AlYAs>5ci=y!|WCpg{8_n&=EFKUd)p+vY_ZXrZ z_SiP)gptA#R~Mv8JZfiLVU0RNOVdayk*DFPydVJFGl}ej<64JjKx$fK4AMmwwKpp^ z#liA6d6rC`MUf?~^DQ|;%Ymiiz|w)-5)LhG`O*M#FRE>cSZ*`4beP?JY>lmi@`wK1 z;e$`V3@xqkO&(2fb(YMSCGx7_UIc!z_KMZD?)~%|{EJEPZ^6Bmvjzfe_kY-jxdrUNM&^gn*Y(4wZIJn47`1s|?%j{Cm9h{sj5p+{G6v%Nk?T{NKRTr+_y;4#O zq>1}2-L-x2I~5>Q)rTb0rwOcHIB^`!pa?YxGJl4+&^|oVJdCdGN0qk@|K_!~-aK~$ zn9(4w4*FhY`vhI)5^9{OwTA{@N}zIspc-9fU(onk`-bl~_1!M1tZC^jZyxR*g(HbV zxh*)2=hn6Me{}I$RV!Hd3$@L?w@WK3+s7_mz47Kd@7}H&I)9_&4{yKw(YdPw6KIY= zp|`k6EC~}tb2+LTH*df4qaXkJw{LuW<6dRw#D~|4e(~#n0TJ9c-hAixe|YQd_dhy! z<<`|Z_j`w?2dA)8C{{=BX!{@x$562Z`e_Vn|HZ!nnId=a<;J6bJ^b`v0dohPGr#*3 zwAsb&XZk?e;9UfJ8CPZoVpMGTB$C~7CRTU~8*-jD3CC5}wPMI(r8(+KZ|a?Kk=7?P zN5{|$mrI++iAs=AYVMl`*sQv3q^P2~sJv|gy8vnsq;NHk6h#>_gqF>oJWCw}2@?(C9B&)Qll`FOKl{PeyHAfZnjiCmR?0%fGZHo2A+aKP(S3e9RPm*M1 zov4~oHkogF>)nsuKY#Pwg&XJ2-zckWn#Xgr2A|OpkLC8{mUuLGnA&`#3$0}Ko&){g z=tzpR-onP;O@q%0_O?xZ7{ z7wJ6aP}UX6`{Envm6QD5GleYz!uCM804}rMy{K^|)b2dVknScL(bBj+y5~!-0bK1$ zZ84;FwL9%d9fW}C6JKMz8%8kILSq~{&qGsy)}%p^Bshw=XBbvp-+lGwz4MoDUA=j~tg@xCeP{@ZZylT| zsU0Y7hP?LH`@eea{kJdN|Ko+yi+7veyihtxH5mLkjeXIbD1fF$7OCs|M%zY^wOvyj znPr}>0nV=}ysGo9sf_`RD=GIaFSyq)miPbey<2x%X1Rvo-HL`^|I6<`xqkl#ul(?P z-~aw=?_T=l@80~UfBpf;dDZtqJNw5$Td8g824CBI$38fB@zr1c=6m1&$6x*S^&kHD z)gS-t)$e`pdw=(LfA_ubeILB{M?d-LtH1cw+wXmR`Fin%D>v_yR@OETHg-V3$H%hd z=0M@Izx>~4U;T$Ex^ec+Uyq;tdHwM7-G^U4`tm<^&b~Z&`pwSi%k=6IUuDtRlhLKU zXyM4>TpWiXFI~P~*VISl>*mOUu2D?Oz)TxtrVC1$r7MB=2Mn5Nih?P1&eCN=C?0Tv zdLW3`UVm$BmIyXYlF$mU3Yw$BN?dr34rDo`_9RPUMNws46NHbimJCeeP!#Dff^okM zTHlWW;oPk1dH+&r^9ZSF zh)~gq0jgBv2&J+UUeN^~B%4vZXB zs3`eB=-W1?AA`BPeu4(2h$5vywqt!-o0(eh*0hZSMeJ^ECruTmt6~J9J(xdLyVp3z zSakV;Hn?GM=YdnNv8I5Zeet5QpluX0+#IWTFp zdi+@=x9^NCZ=AhU*+YD}MXqt$A}fyAicIg1=l86>MFw9-;u{^2RcACuUeK7rh1BMQ zz~ZVz7Ybyyz?p_XHn{N+PFF8@)`2j~wC6qPz0B5QZ6Is$=kdPBE zOC+g3xcL+>vuOewy6{GH$_rq)T#ceZ1 z9dn;ljMYK~D6Vl}20M--mR2_W5p0|1E`4&P2t%d6_tE1%yjW%Nt4?`(OR}FYgqWoxgPZ5AR+0>Cb+C?rO>Xn$|ma z%U*xujqm@{KmPM8ue|-o55VzPe)!|>e)qe7|M!3YPyh7K|8w|<-~GG414lp=|Lx#E z{{TP_@Ix-&C~au!yAI%HKWq|3N8s4KgA)p)7f?%($=wj~Qt#9ZI9D0|g96U5KSO9ig05XT{uHG*^W}BV6t>C$mPeqg2WCI*Fsy8YYbw!`oU?M%oK4&)|A!+kg35)Z+h?f>Eq8`q19AwpC`4V8De{A z4MCCsTSxDRl39w8DZ(sOsxU+rRH0dczY}MuLuu~xGFs6Fk}eZid+N`gxKq0#gWu>~ z^rbcpo<)|#ncjE=Y(D?e9t=a}N;OP@fvWRt{SkU-MTnzv}AQyom3!VNYmeA}HwsPXn>}%a=qS!c&5^DVGqi7!Ayr}fAf@xDO$N>B;+MPzTR7i@%6W=fg z3&7rruAc&lRc?;*7@%7|L*Vqp$l~k_$%E-Fp2VQ@WFCI;pQ_|RAKPCwtDP3dB+eX>YgE}Yb8OwOfBRZ{=V<>JvKEZ< zR5jhKXuWi&?4SPeA3;@q|9>7o06X+6Km3P(_ytLoq@+;Wo#IJ4&1vMI0_$nLHl zexBWa2t+Ml)M{)%d^=d#f8C9lcy51>j%OI+xwu{Q* z*EDrq0jb9USj8ZE04p2ENv0`kyv)bbhi^BId~mZCP`Q%o_NF#SX<2jo6b-^~jdA^x zECY_Ev7m;tOGrPlN#E852!#>ss+ZQUqmh-$#=v$ezc zVTz)D05yeSAtjCxqIQ&^8YJr)Cg_L-$KV{FZdt?%eWPS`CxXi`C22su2CUYQ8No>_ z+NO%?2OB}t=$dOABa&oZwmfL`IcIV7wOH#S|5h#W& z)^n8}p2AP#n`DL{hA0A=H(Q_(N*@Yb1>i6uRjH17!^lF2s!dvg%ihIpkSzojpjhX^ zF+}mgQF`OVySQ%hWR4$yvwe7m!87M5?Dn4Fv1vR{31GHEUMUSJ9= z46&9eG0YRVD4=3^(^^Lu5H5dWJ-K|WvPJBHEU^5*z+GnhQE2TfvGzFs;M>sh$?1zf z9e?(3kG}dZuzlor9u@va6Eg%Bd#5PC$>LdZ7>==R0HO6S1ME7>RH;2Vy+04c7LL;G zTROIeR?LAFp&^(7;3~C|UVj9_7CgDr4L($Oc|qegfr)tUQgrz!yLsk{E^j>eBE4~{ z^%U?T&-Dh_?T-1P4sImn6#Hw*5GP_TshcCg@*tjSz53DIbE%-AkXHsrY^^VOJ->)vOt^eSo z3qSwWFMs>`J8yk_^(R05*^hqsBk<=HFrW6LpS=3>U%m3f|G$JmUH_kL_a{I3>05t% z|Bvr{^rIjB7@YEp-@N|rh0@pF{GjN5&E^Zq9vU%1^3nJKI5Xdg!p&hwk6 zxE)X?U1W17Hf@m&nJp!EWeF?|PXTDiywRPGWVTG+OnQ0887+XD9Lj8mk{h86*yeWA zh2v0a8^A43VjDq{wvQ4fF#OS3DuybiiwyPcV`DS)!5JEoD3$Ag-J|3y9N^9~HNn1V zYR3@hPQ#_;EhDqcx_uJHzRn)&1upiHR-HgR64+)1GjK$_MPG5Z!!AQbp|9N21sfIe1D6o>JYr3{#@2 za|+ZTfDP?a?Al>MML)g|Z!7D@)b!!1A=HWI3jMP@_bl56gklKQ(t!|k z&n{H-%oNu`CMbF|%Ph2}f&LR%JY3oTJRHq?!&!fHC0RHIb6z0gqSSeZX9)TAV>psZ zX3H!-Anob^nbkVe5}lVVv7o79B?uwyzVH{$+=Zvs|Bt5k3~s~B(lu*mrrYkB4$e`s zC0Uka$+B_|q$r9xM=+CM1S1HLAVDHBfyg=MoO1?9FlUOSvTWJiZFjuWcY1Em-P*fV z`)7~t)~fWwF3CY8zVAEdJ@5OR&@MrloVF~@>XOFj?)>)m$?fl4p>--b3=+Lt<4(e>t#T#A=4f!~dFXX4{rS$*KSWn{cfR}U&Wk_J zZ+^S7|NY97A0>t;YG@Lu2rN?qJEI4In5PRxx4&m9+~(MhHL^Y>G*#61P4g_q(7M*U zVhb!!3iKqd24>ANTg;U@F#1yPuB0+3euEN=SaDe4^6%$ z5Ebz(ooC@8*A$iiX_ds|YRIGxg?n9q_{?R9g-g^7(_uqa0op;~;=%d4D zuG~3t^u)0fUw!oPp`*vX{P4q%-g)=EU;pMezxe-uy!pnPZ~Xk{P&og~&wiGXU3l@* z&BLJed~*|^B}Y$PeCK@#IDU2IX8P&#H*e=PKr{)QNJAWV2S3b=zT_rf+UFj5*S=fW z`|aG$tJLmq;i;-@>MyPBE~;&9?i^HF12lnVghZnWlxmCL=$iATc31abdFR%Ywun8r z1cCxj9bhV4Q#=EXB4i3oJei3nwGNX-Fw*7d$p&KC6qS1C*-TWXsW+Z(z@JJA$K z5}}4cmnIdpj1;%v%UcO)Ma?&}YY=!1&>phOQCDt(R926p@HyrMu3y=(=_()|h!+k` zD)3x8)4nmtwYO4KgVS0hdUiw+rNRK3=kFrwN|2PSn!&89_KH3xMHT8E6IZp9K+974 zmS6~I@h{Da%}^xU0!xYcEuA&Y66l&b`$q|MkZ^fQA3O(aksgJn*a9nDu^AK?g*m2m zEx1E#qa;3gn(qm(CRSgBS6}$IesCvtx%NesZ&M%L@vlDfrXD%so4&-BP+^8iE`zTc zCcL&@h)sS_X`rPAQ0in07#K2S&k-2NhqQdhL)wbm5rB;DpG8A+w-^1K&GoR?XLV1FO#h3y)Ox zgwz~>p4|~yhYB28LcKF(2`!2BKD8stQ`k-ZRfliR=m5E3byjKbp&47K+Kveg-M$V1 zf1-BI9^Zl2`QZCM{`OCQU3>VnduZ%V#=W%r1-X?iM5er-z~vjF_WAu$wq9hPAE7JR z?ll-rbqzDcfjv#^Kx$72)qauAbMtFr)EqI9k`Jevj-S^(l%q~LIww*bD z>-6Q!+zM2FS>p+i%8!42{(A21B4h(zAabwsT&t$FAJ~zDNz=S0_Sm@o{fx|^4{j*o z7L9DBp8lC{j=|`BY?9yEH=bLJD1w#%HH@1QW2pi(iQhIzLZYeQwNN?djoxK2m-^=( zDolQf-Ur6`-4}oM#Wv-Zh%LAdt&PeYc12d9gq7&rI?o~nJQ&&#WVqUT$9nP89XKXr z2yzj94ZV~3H9cpq-miv?B&65-r&@Zb_j7Ad7%))JJLdO|@dK_pAkqegi43~fKxIl9 zTm{&=*b?nDSIHFV2@?VwnWZ$k60^V zhml>F&Ot&iZn|q|0yR9?ChY&rK5s?=s3l+AJ&_Z9wH1y`=-1?Ei2Hf4kmfR+C ze)|*x&8)x(a+(PFZIpY}=m*t<)gxjQSy|jYRfXm^QA{Yht!_+)7DehtWPP*d5sqb$ zWk<6e?NmeGq_MJt0OqK)^7dAud`uSVp3tBs4WN%@m$d^YhpvObSA2|ZALH81!8Nmc zVT4QoL7sX^sw2IA&+8tplwx2mP@P3Qevyh4uD?-m|Q8 z$0ym^qS{_~Jl1w!tseYtY5TiC>Y>CL?;W90I53*GN=+eXE+pol+~C1cnBXS_b`X$) zCRj?DIRd_Gi+jZ#SsI%Z43n4xc(&OSn-LmS&KQZIVhW9u3?T;30IL9jbYDl~vsXGt=C1)QrGLoECTEIgm658vyw28A`v>F$Yhu+Pk22C*d6d zGo;iIGI>&^{;;eP43&kbol7wTj|B1B!71J$cZmcz5l^S zzy8hJ|N5`LdIOZKpTBYJ|)cKpO=M~@vjdhC;r4?zq3<%u&jO!B^YMy87ajb#q3fvVZsj~~EKlV`XZTM*ehdM~H+Ze~GdVdb^72PKUI zm+zKA#Ng`P!kalYH?nIB+6j4$Sg13PeECfpJjdOXRvZ)D(Om>?JB9{=c6Cb+_&Q(! zhb3~r?VPe&6fv)&^UA%V+gX(- z&j4`a;+Ll{A35=LMovW;qUGe73jpHy;>76_XRbi_u8l0MLXn~5%|Y~JBKiy3h+{<%Fa9nB`hRHM6USOmU63!0o$T6ytyPI@i^7%77!HsAD6A4&4Ek}EBL(4lsnPY}Cx@Voee=yXKmF|JFMs(fcvati_ubEr9KCqy{zo4j zx_tH4r-wfK#V`I9bgDOg@vrbZ|K*?l`S6ir(CL1C>B_}xnK0@tt*oi6X-v<^c>jYB zK-xNf@=R7i#j(?uZxyxP%&Ys&yB~aV)(=;;SqtO zpJmG^sDly7v}LiCC_?f5WXBc~JCjk-b~77+z%n7Ch!%UV-Yd&R;s^LH;*_+alhD{T zT3FF|BO^b%r2f*KteaVt_wx}sW%Y$MUD-v|5JxSnL6$Z4z|p>T=RtAZ0F*|VW$o9q zY5?j|SltRD)wT4JE9u48(~Iw9*A%ym+|6qQL+_z4z6P%y#QUm|!>t$wTNP}>umB-- zF}>*Wot#_QHGNbuxVGpLJ0zRH@7GJov+SNT=S>IVu(Q@l<-XMj~RyYf5dWsr{ zOWP;TUd_3fR`#G8Q`R||T|W*H?EGdz9hO%&BI)Bf@w#QAV~6bAAA1dLi!_qVg{YZw zj0gfpH0RE^X$>t7LH?+ujog4?-7RguQ{0(TH+1!0`Kb$c&)+I)9~E>Es%4Km9zPFM1^0dUSMG#;}zF}J)Mh;FEDQL!e7!t-ZDHV_-t zreN>z^ej&sUwLc^uE4AZtjjPJ3Z|aIfSw_?wWFu_nqW;+JKX1uZG&W%tc%1yeWN(D zx(_?S=W5(4TSQ>+Obc{;g`82J6p#@2$<5IjscVF7=pN&+6&}K@6ibmAd~1Lm z&<59Mqz*EiL5`)RhmccRk0G#Wd>u$GAeDdRkjd zBU|mJ@eO#k9?V)d3p>wdwA^c*?q^s8jwQKcUZ4+5N!k;rf@4WZP;X_xhr-LiwUPj@^pB(<+gAZWN`>Wr)4F?%c`p^Cas_Zw;-nyHS zhsY}_|MK*i%h&E^KFImztFv%^;T`|v@aJG`xOlJZ%7gkdHw&*6b>_E|+a@(#G#$~k zGiKZ3#~%|E!LC_j%P4;NOSf~bJ*XIx1{k)* z)-l25v^`i<9qv^yypgd~o!uOSf~Ya}e!!v#V}rmQ{9)-OVb` zuk5Hoj`UDO%>#Jw)~4StYQu5L`&j)X5lv{sk%cv_!?$y4?-jRZS9Issp}_)j;ZDh! zYq{s{6laySVu)OwE$NAD^7P@l{@FXZjWCqSLtr}w>EJD~`WI7cPx+wR1DmmJ>{>=i zT?hVVCgN63Q$}&u#anrYj+_FI%{SMx!Q*l6dhW5WF1-7}r*FUe(Y3qz84y-#8v+$# zaE#SH%Da3guW4YatY!FSMhT(|lDx$iZWkQ?=EgVIb8;H-2#lZ%MQfrOh{|~^*PUOF zt{Ip1h~td#(;?#q!MNVX4%7`xYlg)w)0S?gvxgVzVAy)-mg-?a-7pvIj%RNbpSxRh z{$~EQ`;`~cO7B(lmZK)JD!X%P24A0gez=2fuj?QQUN;Cnwk`^>EVkUM_in%q4|7a# zhe|Yo+xd+=6GTx$d~GZ`zweH$8f-Cm7$n*NP)QfIp9f;wkimx;lhP8MqAQHXfWk@(;(+uB8V`~ha1Vd(*IudM^lMID1U8!))112%Fbimbl+{wM@ z>ONl|YQ?jLi9ChLt#!|j(Y0#l9DD#EKmorQE-p~6bfI;Ve+4Ec-q&eg@Q=k{(9BeL z)K+&W1wqKi;ne=d)1T%b%xeh-Q+td1uQc{KmddLPuHS2#NN?j6^h>Dv6iFV!FpW5# zvlEaJlRBIx)yfIB2FfBh1Eh$G*{kMPn{Ierp965gW?B#P8?f|LyVcM#~3es)IPKuP-;K@pnu@3+lb+DKryWkT4ko8u;X_IUA^SdojUNsQXIrUH*z z$*M{WC!?(E?A>z2F!y!Bj_v4}RJG$7JY$rmi6g0+bGM5QpSXPD(*4_|-Jc#klaD|# zc$$u(sUZTVq!KwwVqplZinfu4DXl%Ef;fM0L1_-z zyz?+H>KdloLu(~f-JMt(kzu}@Rek1S2JnHe-z&e9RekAB;n5QpKnj3t-ObFhV#vtn zR^QF303ZxNFE8IM>YY}=um-quSJH}4Uc7gwp!Lj!w6vo3vOZQx*K975+7BqFma!7l zBs`$iIPs7)j?>PMJ9ef6PdXW%F1Dj=P*gc2=o9#$w5}XrbW&9Cg{|nGC`1xZUds6V z)TQg$%_q;_%d8rJxX`&<`8P8w(+Zl4dS@FajVQVaOV>$lDTdfdVrnejRgelr2A|oP zg0bEF(xxqTP=XPW)Jd5sU=5^VsZEnTW^={dpwao}oWZ$3V$0%5GUZmaB_L3`jP`l9 zP(MDaENQ?}sN&v{2{KIxW(ktiKfsUnaKkiRbcmtDPRo0V9AHP3G~x=Hu;uOJb?Di_ z851BbhnNPsB`J2K?6EB>Lq%bTYFqpIh&=E`PO?>SY?%rRl-6>ipQp5eF-T<%&#-mD zrH3Me7rtvIa3edT60J|5bMrM0IKna`yzDWUHA6`cs^hH0MN|1Dwusgq=F07WW70U2 z;3Wf)7gHAn*9Z8pZL!S};PORxBJ0l}5UTZWqR8CxR?NNpGH7-T-UXQ@I5($2N-!4D=t=+q%aV;DDs}uTp#FPi9I~?o0IkIU9 zt&7~tmE)R%ZW_SHM)j*h&PN^cWt?*#)LldBKpfr&at@$WzybumXaTU}!khB>Xa42q zQd^{;y5(j@4iwDqLBV|Zv%`lD-%88=7^2p9?oE-V(r#zmx|NQ>Pv6PN{^+AmKK}IZ z=SNPx|MB5>Kltdxsc%kybM1P1NoHYVZ}0e5z(~4Z2tRX+s%~7n4V5+=;rHMF5Kj8( z8--`@mR`wgzFF4u*{SpJtdtKh#x%)}N%ftI?)DiwBvSFlHIieCV&5{)J<%+EE0}vJ zTmBv3`&uW|*RpD$0jwv=(TY^REIuR-0-~p87)If=&RO&QIxzQgGi$MBgS?A(N;`*W z@Lo)?wV-FJjUn(^5@$uYNjZV8GKbc{8>ujdxu%dewPy}213Df9=_4bFl%N8HPFG>$9K9D7AS>plW~HLC$ipmXU} zUtY|*U5v`C?#)49vnmF%YWnj5)-j=;acnTm3*&T^E4CvthCFjyz&Ze}4<0yobX9Fn zh&1kLscY7@D)nwk%n;OF5h&~iXT%a%vHDX&rA766(36BX7ogP^I%R@Yg%q?*#I}Mlhr~{plPPQ z2?;~t09UX*wxJ8I${i^ZN5|9pp+Bwf9O}kVYFhj2JJHq6T{*?&b?t*qs3G{u^Arw8 ze8U>vP&($F@okHD2?o%Sg#$p3svL1&a#Lao!n^DYtN=cBkj$GFTC{HX+eM9I-WuJU z5tvxYpvJQV`jW&D&;^$D?nED%2M`SC%IQLIg)K~}{1~eA^~lu>BESZ4&JFIESnG8~ zHo>doo`V>aCos1U-k$ZRzqLmnCrr{=;MzMgLw79$45?nedExfFGhy(g9BqSq26r|C=|M3BC{1W z($qbA`14c0_{G1y@y0LS|M=+jjEcJ6$*N9bV>fwdj8#$73RU#YJ87SOb{Nj@+wXv> zMK5uCvrC7l=2%dh4%W;GGIWr-d^0IQs2d1@PQ5T~n14_=0(3+u7l+Lot(*V=5Q=+PML1o454*CT1BE3;5+c5)SbG}Lbh^wf zcg*QruOCFY!3#KaFtEwYVTmC)1}s^DPN=kFNGy0JAkGgLD>$ZTVmrhWvH;GUR}FdF z3e+S`pPW(0ASmPvZ`%AzsnsVi@HM!S69O$v?PWSIUuo4i;-gcdX`XgyoDF%m_CZp4 zT?f4J;6%NaR&eod(ao~1o29)uty2X}qX6#AuN(RL()}y<$}@_Q*RyJ?d!|4uJ9Xi9 zMp;K*1NurvX<-8f-2NF=eRqnx(n>n6-mge6?zx;%kzR%>XeQK;Dhg2yNCLKuN;7Il z8poArVW^d?LyMwA@_6ltBo|4_Z6;mKZOyD7L6QMUXKW#<8^DFtOukb#a5Wp5SwDIo zF$|@6|D*<(a;-z0`W`CCsuK#oVg3ofh$VO>9@bzt}| zwWr*Rj{vx2^(7^0=PXY}o@PP<7rs95#ZhRz5QsK9<8X>iuDP|Hr@^^R!h{&yBV7Yi zYEw+8ae}Z623NW=(1e|Wd^ZTN5OQIgVl};#jIx$$6s3)3?c%ulX0)g=I+S1z%scle zwf6%=gJn7ZeJmJ!35$D9q4&CD8==&u&Yo}vmLRPFoF0uWAqFF;drs?HH2daF{$;RX z`oKvnNv;Hn(pvjTP6;F$-#7uqFrXwd>bG3O#|85n|~xN{EXyfEEPu0Mk)if`ee zEw~t7+J~J5i#soXmI-uGb( zC?q`_38F?E8@fVP{N+^OG10cv$22gV>l5Z>rfaL4@2ek|ly^{vd5(TX46f@+EI+NX zr=kuEnS~EO{`lzUN4`FD=Kc3Ryp`R|RL4$zef^vB7shZSO-(45*E2cI>>eW2qsE{L zJ^IDh-&{`n@~aEb;@!+?E&vtjkQ}2~8rCg>hoqJ19ndUc4Qm7HMV5D8=H1Yzo=@6$`bB=KZ*S7| za7ev~S0`Dq7qrk5l6!x~xzRdhgaQNjp9q2mEC*G66Jv^KJ&p&ah1=QXnR(@x?>xvX ztiP32e)h`U{Mw#dIn~Hs($$R897GqasOTYbsB-&+)ILI!5?RX55mq&dnw|#dezswl6xKp5H*L4ilHDhuS-MLlm-(0>4 zlkT^`@AC1H4-cO>^u@W;*NbjfVD7ifWc7$@hD3m`xtdjf{#NmgteRWd4e;t!_S1lY zb2GcTw2hcu*#j~-j$x?oogADs-Y)1kb0w>^gIWYr$Sgz_V(>u?wx91W>X>0-I6#-xZbd0{Ujr)8q3pP$`KZ5Wjfa9nizDoO0?CMh7o59K#vM1`Un z9w3IQ(Y#^04vAw=ax7(y0MC}Q3}M^SQ}^871WS|L{y||+%}A}x*FO1(!ZqJSGV+`& z&iF%vDU`x$Lcia_NhP4sn6FfYX zKgLi0RkI2V{N24Du#qzL@`(3kWDq|A&$`aPikvXEOlmd0b&?{OhoV1dq~y1b!|eV}Aqp@%T%}W> zazSQRYz;Bh9vCl93H9Lo1Ra<-D`P8d5c3(N3dNQXfvqHR)tz`+`_N4501l=HFzQA2 zj*x}c&QWGJj#|^+-`YC@hDnJj#8L;LYaSpnkk|=4Lqic+N9k%<0uot$WQ(s`!^^JZ zmNmRGNT7kC&Jtj zcgkBTTSt!^Kk;jLB|kfI{OHlsr!U^kX(^~1%*rpldi7>^Pk#@3M97y)<;EF_vvZ6C zTRD!MxNz)C=$Btlfxo(NYiL?q-!TFs80>_=H@D3Y8R#rQTG|8fXaQ0D%{O5f^{b4^ z?t2JqW*fD*d%B>PUOlEAF>G{-Vp#KLuPQa-d`NIT9?&dvd^`5J$I|GdK5-Hw46>rn zaprYK=;^3tVKVf1*t&_ctaZ*<>*>BGR;X9ISvz66l7&dG=q>J~WVaB`rInq$nsw}( z8%IxHyL2CM@?zQtpBz1X>CWLVzbUHeIe(}4v*X{KICuMYe%+Z%x6j|sy_H=Hz{Z+> z+SSa;udiihS9PPQGN6*a#*n%fUi;6zi^;WT@s$HlWH~Umo7i~fncJg_%)R4$7`tR6 z(C6<|Tu7_@`g-1%=hHtt^yOFA@-JjJfjjP6=}korj5xn_GQVrK6gAUHcb&amcq_l@UP)&OnhnOt{Fd=+4-o13$n+9qNhh_Pq|B-t z?W8-;->*BDSyRx>>=DO+0gF||(dwl(rmv2uZ<#a|p_nLs2pDVN%fbuXGln@3$t#e= z+Ch5zq!}@$MNR9FBSNTM1=b{yXLZCjhKZt@t}*PCtPRh?PATfTiNiEmZP&;*SJEz~ z7gzRBS_vW)+tG-f?Zi+(_K}#vU`LFvJ~DzM#R*f71z%)YqIOACHh6QnVgs2bql?WT z2#{!EXrjj^gajJ+Q(k*rK;1==_}L9OmOe4WvUknefEwBfpg$~ofM;)|S-UChNtqw7 zj)MPaOcunlO&}vEopVBnGpK#T6T;VVRHch;@Z*G5s(C>kT;aUk0VD|{WB(jdx)J2 z9HoOIG!77Xy)){4Y?+L1KPKPIZ8T-(BHYndT# zOz!e+3sahybLFvf<)wb{#k4LiiS7$LE0gx+K9+TuYZuuTbnzXUE)IA%S#Vbv+R?=y zIoH08JpOOO;I`Peo>^8~R*(Mt=ocS<@X3X5E}T32&5_TK96J0(Mh>F3y0NCJ0*4zR zV&GL6F_YT#*KB`XOwJE%PrO?h58wOf$OoSuJ9_E@ zD9m~F*!0p~_;%bWMV&a84i9L0X(te0`-yyx$|Lox$eeQ;X9W6OcYFijKhDq^03U#{ z13~N&s<5e#)X+DbS=CqGF?A)o`NV|>-=tUEuNlp0o6c&5JBm|1rW@34jN13QMDYfS z=5~JD#q{#@^1jSQd?U@)IOS-WH1>;vIO|pknwQl${Q6=k>p=|CD^W8ISZ+H}4kqLp zoT#E7@Z-voZf05)HlrGo-AZbnaZP)lkZl{i(nRf~s|>5?VEO7MEIn-h&GMm}g zZ{@dK&Z^1nqL=ou%CMZAjw#q*P&Op48Wuwf3<|Bv8d8HT!9DK^FDI7{Y~IxJ`XgY& z%1sf%loX5#N^7jTv8%lwPnwlYa^zr<63Fa)jgJc!XjPEF)3pqcvC~SJtCrXIz#yh; zXl9sg8JG~WK~8im!5#sLXO(43F;ypq z58%})ym1{Z3HOL1fTyD>Lp*Z?DhHv)A6h=Jg_l@D6H{vK80Ypd?Qr*+f{W0}LQMr| z2)Q**5ts;EQy)p#PvUgq*{DfnW#3fSj4roh`aYujL1}w0RhC)NR?7^(GXvG{4b~(kjKnDYRyxIw(bW-n{gMpXavj`Jj z-_i@2J>gz_{PcH!gQY?m7;|sD0*jHrxeRRfSyQUAmvRkYxt-&;OPlYPx6t)rS$J>O z{ZN~FY+QO_T>0L%{rkCBfAj4ADDZ$5v5{6(RbJN#;QoS~V%{vBFgkkj#Hrl8VmyAF zOrRQ+mbgFscy}ihiiD%7&OZFr%!YGU@_+ubH@`e}qkWK@RaggEhW9`Ge>a>u5?6EGAO)Tjk#Oe{qd30phbW2P5P%_oWGpYm|i(_`d0b1f{q(`ZRgV~E~J;< zF6zFNQFAr7J*{#uqjIpgmz&WrcB>41yR5$mHQUAU-mmV17Xj#4Kumhg9r7-EVxUU| zAr7;!`<;Jo4~#tnqcq(3>>!ba=p@`P>p~ILRekL1xybBBYH7cqc1%-8(AA8{YN@7S z!|I56V?Yus?wZbSBs{3Wj!3DtUHQ_FP(<-l-y?a^s!@FzhL4sn z)KA*7+v>dT!(+Yq9KURcvTRSA&xe0q}}uo{)IP=_Z(9O3X2u#5q2zz*5CceUoV= zsC%^|d9CDZB<1Xl{LfEay;q0N?P3;#l2(g<&^~jk9NR^QiC&WF-ULhpR}<_Xo^EPK z3)FVKJ)*HkwHE&b9q6)Q$XnS0^ZvvJ$hm`fT64!BmMDO^=g^e4dlpb9&VHJSCi9H( zZLo}NbVfMEw}`DV(0gaB3#!l>OW~GTpz&NzZa#l~QMea?Q*q^P-rd5c93-i0Qi+TVZ*(NiyG*!ZSK0WhuPgg-2jt_rn^L2__L<>I+l8HUJ|W!aQ^0yhR*?qoZcB|ygttODFgWL*N~ zT#*Cq*;RcRK*?o|M9Y68o~*e=()V2o_fXcOk}Cg8cT#9z)vUdd{@p4*aDivy7U-O9o1C4Gla-AJ#&m-dT_ zx)~QU8uOaS@X2hYTDvApeY_w}w?cLtpcPAS&?t_Fv%x2wRQ;Wzj+)+S3`Ihik;7^~ zzYi#GlJrg+&|FW~j2Xjr*N=)v zHK|UHw_g;g7#5ZfiJAy{2ud-(ytTX7&96xgyR9x7lo5L}nr7oj!=7R`hz(8YGcXvQ1g1`eSG!ooTanQs`T zNg8|cSp`)k4Lt?*y?qo>#~7oiX|TM5fM(laScz9e(L(>2$Vrg8M-;w3jvglTupqz| zSq&{e1#YBsZWl&iuSfsE6+>`SU`vu^Zk{d%_I0ffyn>pp2}LuGg`!BHlZ9lE$hXJ= zF2Mfx0Nev;09WM#kO`0~`LvuDoc z=jAumHaLwghtVFgIbS|`7IAp~@!$XBfBuhu{LlaRKf?>V0LKOi@pgJHfZcb7kgv~Ka`o1u$@ruN*ZE2D&L00vtdo_ zu}sPCSsPXw8{qjNa@DU)4e6E;6PEm5X3?;$j%v>BV1pc8h8Ct*VM_ZsX^7#p@`2p; znG2aM50En*EPoS0TYwVWt{AzVkGh8#!EoG#$cb*6n;rR9ko>kAmOM(51jB-A`TNoy z_La<3j~Fs`n}iHPc?X70(Pc21UjN%QO&Hhy4-pJDkS*qAV;j;j`4 zFh%jXz!E{K!>w^ zL|D26xT)c>kvJA~(Ouw$s(>N6aKM%5xaz1munwMKgEIxw761Z-7I(CEz#st0XA^88 z*6=nMj5&@~ZG7Ll@JJNgCK?tQwq=?=Bm(<1D&&$|ItH4$2K&jvX7prsRVP8@f>w&u%Fy| z8eM<1`|7WOCx5i9zkL3?KR5@= z@4}D&GDPKoyXog|yaBc=XjhLN{USZ>27PjRbuP9uzY>Juo6q;B-~Hjg{{D}@|M$Ob zZ0^H4Nbsd|RiV71+D|?_eE8$f$_o+WxC!!<{C-wJ+THtYt^F9>IF&k$sIJS*E{8A? zINn#bo`LB1__u#sI{5v<{tw`gfq7hL{h8RcW{th(7$_qTAr1_{G+W}a!kY9hzu*NQ z@ocGnhDl^uq{_UI0O{vA5jb%%iiVtZV)cvN;#f7&SU4ak8ex8PHAr)Ue-X-ixSUB zx)fG5-$2rKFnqPcvf43iHBQ<=v-Hs&9W)ye)}XeKAIZm~bQciB>@Z zYuK8ytkD!cqS&8SPeQXj0_#%SgsC0JsqAOK^$1ojXdmuW<4RCdsA)sh01Y`NI)AVF z{LMTN6~MBBAqyM(DBa`SF}AvEi~;#Ca5MpU4Kf8vOTwAlu>?~Rtp|27_~JXjz?olv zW(y>VvjPZOs~nLDj+miz0)^Nf-Ez$BDWi`}iHDZNLyafpS$r&W#9@=2%DG?)z}ADs zDY>HsI|i<>dSbc@up#?VEi_9PLu1@WzH zjYs61=UbCCJ>y*?)6GMZ70u}OLCPRqOVdUP5_cQh3&>Ll7=jU0?@EFzOyS$m$MZS?4nB{)=rs4=gu=oAm%fCK;`Qz@( zKRUuo+t2>={4f7ld-h#kbsLyBz-Vz4GD4@%od4!rX4<`E*c)(~Vh-2-?!*1Qmn_^z+l&1ju@j zkS*_+1O^e2Wr#lccWvs`Fw>b;GjR1@^*6VQFQ->s&8R$gtEi}l(TG=Mcd&}k${K>9 zcu@GDnF4)c176-jkY^$=HG^DuXGyY94OUb$EXnJb&h4CT9M=NV1|HlD1hx?`Lkuz} z4T~LgTdz1cD4XjShEeQ5Ek$2}5h1CjcAA}J+rr8dg6QMY9@eyTeO$jj<$lO;Y}MiA zsy(PH=Mnhex~k(>xhy3(iL z?$xaKD3&nF#Xf$hYLJg0>gs1*jgzoZn$ZRABX|RR1e_AW{tn%%167Tw~+(i^Pq}GHj z48`Ood}u?dN05ww%|Vd+c7f^IoglK*uctp!hd#Wa4=%B#Mi>oS!Yd#(TYxR>o_k%; z`jRBBUTla|g4jajLz~}EW{uIM*eMY#CuM7c;5GpcDh#u@#yG{fCJb(Xf0brk7*#~c z5)Vlg>zL63=B|tDt{Rn(%K`xS;^<=<|EkcvjDufgSaW*Vcy(-$WAB(X_0!EmOkLNM z8q0T~7&e@0p?}se!n4uz^8<7P63=d%)*(i?%|vxG&E7k!@1Y1fN9mXeg*tj*U3_MW zK9q;H46$8l?11iAv%-WfvMCH~iGmLqo;_LgG0VB!J8OibA%>wfEIe{=|8`;T_m95+ z_s!=&E$@8)!yo_a`H%np;tzi>L9`wE{1_wvVe)(AvtyUfUwV*!zpJgoVlr$ju01|@ zwDaiE%6#l#eNn>ZRFzj3SF}~ubj&KefT(@?@-Kh+>wj+SJQqndJegW3*9>&`RTdRr zJb(Vf_dl2w=%7%i>t8P(lIS9T{`>y|FZwt`J}tJWeRFbK3jU;(y$ndBSM_sxS>8^D zb4|kBTE>Tw6iYa2aa+esym%n%Oog1*RNi{VIl~J;E?@!qhw_ zY8{s&x+aM{hd8i5#0$Yh45%slWpqv=9n#OwB-a&a1Er@h5JXmqGVZxwa|NWHb z(TEw=(`>Q)k0z{ZWa|cZ?$x+`mtx$&s2027ACbf{nq}yJVOMoAMuIi1_iNXh>Aun- zVXu6#f#EG1(G~ZwAvS)edbpaPs~T6|M~uRLKm=Y@J!wOX>mGD)YbLBX^X{N&r$@d# zY}g*Q>{0#CX2Q=q__4xXHvA|0Wr>;*0Rk_|Zl#o9q<1TOt01~4j5SlVy<9J>ZmAh! zHQ@LS5Z((1ccJqv3n$(G&kb{_D3U5M$-x=S6)v*F|jN@JED=<&}#J$(E6&C24k*19H# z-k6Ffj4pS2+Rbxk&RslvDL*$~%;Tk}<=jmx$ZeR+uj*2H5|M?qiRoE9nN6FVWm0LF z?%vvJ#Nk7qzW3e-F!;77Hz_>WwT&_OSO4~p{|lDCKoAci^N1e8w0(U@JwN7tj4`f{ zTeo`nfeyB3RJ+_s=vH3!?Si^{c@^LdhO4`3R@6*{7<)Zg z2W`}pJT%C#7QyNtjPRTEn#{H-V7L|Zin2PHrTvn&86U&3WS=7+dnm<3IinU3`D_fN>X`VLwFBz z^!Lj9TL@|#%SCrQ#3~nfiEjn*m-OJH3G))yxq%p9wv8)#CzK6??D_#l->jh?>?Jr= zejm35o~JOGL`+t)ekZX%f= z12`m!k}T_Z{VK)1IU(f_uMi#xdsDC0lp81p%7>apSa=?s*$AM!9oR)o}c&9L4Ni^m5vg)b&@*!E{w5x??Z>KryiH3HD535^kqWc=?A(V6x zW7#8mo{YJlOoU!ec%RTBPuP*Cum}?NjrQ^VZFGBa*GvVLpIJBDE{H*H5geFkj%%20 z2d*-Vu;2OcvrCzXx?xe5AUvd9W&|G2+O`??4XS3IWLzB8rYZ+HVAX)VQT=p7>zJ^# z6`xs&8eo|ECgpj^@m{J{A6gY_{npr)J-!Lf2k2)d`T#V-2H%Rt3JdH^ChxL$VaFU? zcEq6hT8Ct}!V&?EOr)`KbUx4gmf98vha}LpVJVm^v7_@XfJVn~teT^n;B2Hx9e~sT z+KGGncaz3>swzm9_@|V9SQ{ zZb`ih6hn%riO5{bn)m@x=$uu##{@QYcv~OewJtu6tUUp7FTVD|x%^B!|HPJjG_LgH z%xie_rq;g>C{7T^u$ zSDyW0arfo7fBMg0V#^*`29EvO-m5@zcWLii$S2w(i)YT=08;GRZ@+W$#K|@!a)L&5 z=$-4!>!3Lg4Ub>AaQRMp*11b}@1*DFb zZiMAZuy8i~lofu`1y!Fo2rKZqCv@W~Kn$rRr@NRndc+PZ;RoO-ci*4{?e zi^C7wC`z(CG_8u~G*7gU4QV9#x{aSakTznLJ26`NKioIV_3ue4x+oLg!2O?6p!1 zIAwCkw9bQsk#>~;4{qp*DzvYef5!Cg;hlSA?*Yz!KncAN$6qjU(@Jt|@*pz1wG<;7X!ew#fGNaiL?3Ylf|PqfA2|k=r}YYsbx2cMkOt*zm7n>f@jj0$!eF z2*Q5$5w>oOZG*+l1gRG%aP&;5df+PH*sEc!>M(m0#%Cfo*sUv2R3uq}1{r~60=b(c zb3xG#B{A$B0JQIz#Dn2Erlc;WI!ILnA&m<|C_K-KBq@fKVYDRDBZ&fnet>18Xu^}G z6cJ!bst88AR7X@pTC;SJ0n3uwCe-!AymqQ;MjP%X%v2zU2#Sa(_E@|00zz}0k~qnG z&?8P@r3nz`?#}AE6;Ymt?m^6$>wY0T0 zv{V)sA3OH>yYIeVQ`NP&@#4|9zlD6EMCSYU$N&7t|N4I(zxor9x|@c1!^%i*$HeV| z=6f}mHcp^}6ObmJ+E%_>eD?3bjqfGSRqx8P@Y+j}B>^NB@J`TVt{#G@lcZ{!vLFTp z&Eq;e&j#Cka12w!YwNyxR2Xa@=9cs_2iYDFkTdJ451JT*f;o|I56yN0J*JJK7e<~4 z>}%o8?_H@Uuut4G_skGGn1A@aEB@aQ6Pj863P-tpqz8g z0Z>LDat@WKXt&)CZM*F5yKCmIS?7GaEEbl5S_tuf|L=bHexBzy$hO%R9}3(XEmR|# z=TUhV=u#io5GSf;8|n5uq&T^LG_{$Q-b4oF!|NYje(|-B{&egTU=(gtW6Ox9i~)Hr z(N=`f_A)Fib(E!yRQGWTnurzs+Mrrrpm3U{osm1{)&6CQ zd0|xlJO_qmm;*0!H9-z*tr{c9Y@rr`E)>M21zo8XLpQ2XXEUoy2RT`-)Vv;UA48T| z(cVSX!u)YW?iu0P2ZhegNp~#}Z6+P{BeDjnp-VCiml-Uv8!#ZN7%Uo?OlugaM2ip; zZnA9=rww<5%3U7pX6uJxc5ICI3Ef>>2)Fk)(G58rG`Q!ZR3WT+iR9VDn-XnfcA{x+ z+`BsNTZi9*=HBX4L|dW8=6M>K=7v#CHN~7yJj^-bH4|qtV$&*kdyo3}%yD757dxRaIxDr@r^z zdvCt^&Y?p`Ynun3JpJpzlP}x*kf%@H49(yB;@f9``R3X7-KTPEunaA(WY|+0X&;=+ zO0Gb+@u$efMXh@dtQ-J8Qn?qP*w({vVO)V{X+=sWa5RAO%#yl#D9UQIxPCyGQ8$v) z3~0`3nDd@YYX-36*^I{551oU#Pih_MVj1?6l(tKyxVAATdcu*>LhE80VOQdq=ExGi z0T>)}JAsvZu;-crtIpU)Z21o8QCXJ7o^c0+)DblCl0G4rWoYWqAk8o$^bJnhM2>|? z+Y(V0kUE#7_NCI+VNhK*;Z=2Xds?SB7o|<<6y_tvM=uxs;m_yZyI2BpuX7pAnaz~O zaTgo|+Z6Ln6FxZFlT|^Q+~0&3w+?ZdhXh#h6j9)M>z?gZFqK!}u@h*ttx_@#4X8M=e@Vjp7p3 zkr91D;9et$JVJY{f6Ua!brkiB;FMj1mX)Ga4RkXcOWQfV8jP|Er)i~Gau5^MSY>)M z8Bk5Vf@!XAtD=|1FwPHhojq`_XM>j2QjB0Y!;LzN2c8msO3rk=N9O zo@`+{Gy23gnpw3}R}0HdGA6qDzIvv$7RjyZrjM(`z!~J(6I|PK`8v(ELeWHspxID) zNxB%r^1P)?H$Dn`P%=fusjQz^9>t@ONp$$)Bh zP!ebzvqJsZ!E;rQYDaXjHkPfPs3`1ZU$5*d8BwwBz{-FeowY|pxXMJGkYLgeJWab$eh~6X<}f$&gvGxVFx3hX_^c`a|5f4 zOuCi;%EmJV#Nl1Gd!1oj;`!DvwpF}iojSEoFfDeAK>QHLIo43Foi@$lpk)JXTknxf zSD}R!?SwWEsEh2_2?J)*EOE>cW!|bzLPlX#Wr7Lz_|DU>zS9`ZufO)TSYrR|FW-Lm!;iP0e!F}BFShAK zGe+1ZobKUyTCu`jmIW#B3SAJqzr~YUAfpd*SH=_`sQ)J*2TbQ<3G{s3j4QT5=2=Jr zXAeV561lKkGpK?;O|Ce4KJQZTP%aXT>g==Gh?EA(jY`6~yzXOHsQTsaswFXy!7|ZTpbWhmX_EmsOHj#AI z!?KzYHGo&jyT>8Ou7_q&O>cAUi~TGUT_1DJ-DSwU&3JJONuAe7%5SF?bkM=%m{x`Y z<~R^btI^WlN$6Hk4kI+ng=(KY3>fBPztPZ zxqpSO4Yrcytpq_URl_jG;3C(~tciSU0{=GMwlv{cA2ltt(ClqoPZPyZ)F&uGLW_^n z!gj#TpD2$gLwlpz;D~vF;ol+{=CJm4glK9=5$Tmpbxt~pvBE~Un=vhwM0FeAgVxQX zO$mZ!h2!60S(or)S0#Epy%AVWblCearbUu{31?Xzb*ylL`;(Eo2$2s$in=D%$ZGC%Oj3;a`?7*<8$-vFWA95^r;W=21ew!nf>+Y|7npO!c(Nv&?g^>Vq2-zAZ)kKGwQ4EDJT$%!86}mvFj697ITC zAQJ9V#Y=}one|x6_fD(BP?UlGaa(Q^u?o$Djx>TKtm)_Ex6%sQM(as>lr{mI4&3VN z2>eUwWfkqihmW3m?X_3WpF5M2a!8f-b zejQHiAi-O~HY3?a3|BY8x6=*5egeA(h1Z&9B8fd`U`gj+00#$TtlKvFk9(9L(wFWwx=d z*Nj$RRr!dqW}2m$W`o2(B+rYNgnC(yNyFTvIWBcBYMy&lrXU6fg7=xG7)>>W5&Q65 zLqAbC$~RGEKKz7ffT~2%A-vQH35sIfjLJ3*BgIj%mjG~Bss*D-wDN*=9B(z%TEm&n zLrTx*BR{@geKw~P4u){t!ZcDT3KB%+Kv$HBrrI@ib8r1!Phu z+tEnWXEaeO2Y9Fn4_53~2RGe`JBi)T$P)LMHs%4`WN>qY@91Y3;k@6+u?2Y|B_cvpJGp(ebnk7=qO z5|66GNS=#rSzsB%*7)|2$lEaHl!SK8kzHZ*Hp98B3~uNHn==0<^nqcQZ{avWl4 z&7d+mYFh*%{HQj-)&(Kw6UIg$1m-t|W_n@Theyzm;|2+)aVl{`m8+zW)B%U%&rh_s#(di+SUXH&30o9*pe4&ijwQ|Kr(D zKRx~G`>lI_O)T%R_!gM?3QeJ&QON*VVhXI>dGf`RC!hcA+wTqz9)A1Hw}1QY*~->E z027qdA~N!8I|gWNy`+{tatD5rubUPF-dEupmwRQ7IQSe3dnazTj9sc2xl~2GT1h;W z+jG7U`Dt2bQq}17y3t#moIzQv0;4>At0kvjUW`((phX|tHAiOQDloj#K3KOcwVFL7$(~N=_?6bmO@r69#~WsGalUy5P*pBfcdLS(K;= zJ5J&wNI{ey>||IViwq3cY(q#B+*U;Pspf=uYKx`|@*MMA$3h)yd{iIedDh_kh*pJr zX!23vbHx$R$E<-3>&&vjx1{$i*&`d)=nnK(;WX!+-2S<0j4&-m`>ZACvqv)1#Pz{mgEuX=FzgK!E4Zs*JGj{}3QB+qqOnU5>4JoRj=!*f zqMoR(AsT4TZS3>3;lzMx8Ir>*23f!Q)$jiO-+u`K8o&I-uiks-gRIodoUGjZg0jJ$ zJ~X1AIYOH9PKzay;X&l}3zzCEYVJPz{QDn&`u>M!8+Y!HO^UBwzxm<|FTDBcA*n9< z#n<2c{U3k->F@e>bGtXILJNm$e z%C{u3MuAUcnqHd_ncMp)H*ZxRJ9Ql*UUN&^!D*FQ)H*V*;^_hqH^fxKMHrJiq7eMc zGls}A-;ltk5ABQnyL|6DS~f+sBsi`$qB4k8#41Rp>;XBr_AXY8+-zrqzo2x)NVhN3 z6hV|=3U6GPT6-*ZuZnE*y3md#x?_mk9+mna+K4E0Xgtf7*uKy{*G?2eSFK@)*NPF4 zl@Y8WT!~Yn&xD60-%@00yCU#Pq&-OK4L$wPp^kz+c}oy`*u+t>JZ3WSgjoAz-#B z3G@6L(`!#0^LK6WyRNzI`1(O$>0Wg8t}C(?NZgIB+zlpnjgaqWi2?A`9^H0?)~4t8 z*6)A0a`%hK>cLEWb8+k8(*EaOh@2HUdN_9I*g*FHB@76n_o&|8wuwLmMpf7=g5yam z-3G?_e)(K2(?!rE1|$(t{9r&4g)f2q7O7vxxp%RA``hn+@IU|Qp8=8r9^T*l`qxK3 z_~81*q|$<-qO9D?lHzMOl1d5+E}cI0%1eKI;n%;ZsH}BP2e3q1@{RQ0|L&!K``3T} z@Pl(>BG2bvegD%>uy+6c!+-t^T3d)Z37snk5)aPN0OS||7=o{H^Hg>mT|7jXMAL-~$W>FgddTulni?sbZsj-& z&`RiBrM0q)P~uv;{aWkfg@VD$WtbAY9)fo=5JC`N4O`YL2Y|pXlerV_mHU?Hwt8xX zt8_~2QNAh6lDj7j(`1niPWogaux}iFBYcnq4AK>No(&`isSuiRDI46l(DZAjn+9b; zDC%_Ky>Vj{Ic~;DJvgzuo30{jf=JbTiy+iE8K|JzZ#FVYN0emmwkUpI;aSqp-Uf9I z+}_6xQ8)?O;yXIuGS3oYs%IcJ8Lny+T?g2mF+-#lHBME|&;)jdVv1*-le$;>xOS2{ z#MVuZDt&bOiY9hX=HIZ)-w{r2@~3uG(;JY|uXMzDYQM=l4`}a}!SP8=@M1oqY>*F4 zZ>-4US$y#1^RHyaFp2Le?c=gEQ#v?4uV~bWM(y@5#TW&06LPj zi=}I%YETj{h-tdmMnH;#g{lLQPB}1|S<8r?uHmF}5ajuixTjSyTP}TSA61~dVx^Y*BG~6VO)^j}l(jYjA z=y05w&_lKcO=^McKE64|P*1b9J_xEJ@{I6WaZO<;9-u-{c^2WX26BBmG$i#=*W8|e z3DEXyw%D#Uutc1cS2T44^#jEGbeWrLjKdwiZ_-mvF}6-PyErzsV^I;=^)5g1F5j0s z=cT{_H%7_YXg9-HIUt~$6Bum_^gM9DAF-`+r}l&DuGf& zo5%cpaGBBF?Ob1a8>5{cW=-w4^QW5$B8aj-ec~)+v;WgS{SQE={QPG>d*Qb)!dia$ zrQiSRm%sc4y!}7F_?Q3de}RASUw{6uue|c=Z+`PzkZrv5+gECXqkoB*39G%*MUfN1YgCk<$dL^-nw$6khM4jN5x2ptr7 zpeDbNhqzD(X#*H=n&0XZ=5|jsQ%rdSl2b*)*V@K0nt6yYvLx=?;(MNrhl8@f)oOfk z-{dV&g_ZTg)jn)oB09D}mjXS^E@=$GpBi_qaop>$<6yZ4t~CZ@EF#}5^(=8Te#lsW zJmj+GA@rDK!Z51>AccPkDt4YBf`_vP-y}2yKo39_IZ)#kwk{0eUCz*kz_n_O?TX#Y zAVJ}~R!}^LIkF+ML?A63g54-0Yd=LRu+Dc8WkVCLDvSgr@Q`(JsL6-MO`tlc>S4f) z3^!pKQ_a-&0rAJoF+_Ss_@mk=yaF9eV+YJxO!G8jLbGsyQACD>z9xdSmusWi*J7KG zzx?j|?|=O9uYY^?&ELM?+`YfG|8RNp0QMStY}>zl&l}&Ha4$>Uvs$xrk}E(+;yv;> zQn!pU&et=Ybqq_7a2iH4?c6D>ZM|Q&OrF{wFeX5AGNg}}4-4z?@~lQoT0I6N0j0n+ zuNr9+1_w0@)ii7QsI{8uEXFIVsHRekq+dOYv#t%<)(6b1-RfEB>q2%eQWhOBE5hBBvXiYd~dfV%adNQ2&^os+s{PRX0U3$hD4$9Sqgfq%o|X zUh>Dc7?XN?V4g0ufLzKPT$5NsKv?i5_Geb^+X71fM20p<7gIlKO0fOg6f;!yTb%G6 zR_H#(w+n7}uqd`t^c^hourk8+ZjJ@+kxlDkzWq_l24XVMBa35AtE2X{&WXUNZF5K- zZDYEc*=}h26rk0j>Fp|tu?8)`FytoJtbckL*@HX%$+=(u@;Cqd&;JXeWq4c71TB@FBL z?>~L@&G*ys%~o(%)%SN`Sis*TaP55GnshGFZ5!3Y z%2tXAW~_AAW-ZCst6gOH_a?k+w#cqy=|N!q01|TK-enBW(K4#&qG^Y;@m{XIo}fUC zSzx}|BaU@RXUWbDlzxF`T@v}Xz_Z-Kc2(0HEborOzae!m!A*E-;Wh}~aJmF^NMMHo z2DZRHKMu9@%+9!HW7N1fVp)S1nF8#U(6(#wHYDvU9dkCQ-mL&~3aE@h$|T@9Bm(^u z6aYHMETpx70^Al@mfL5?v@_oD3P2pdABP{;!)3!W1fiZc`jC=ct`Tw9Q!g;9mNRjH5lk{;tSeoEo5~C zil0)8Pi`QjH;|xHU5=5qj63=iv5D~hsBNQ17AZl?Alfv0Kv+4V(j@NjTys3{vSs73 zXXokST5KZ+AD?&WeHR&C7 zZVcI$`ql9gqAIza27eKlzvOhYZq^dvqNUB;AD!CA*j6CTuTc;f_1{KYHzFn&nD4@=SUy+=L+s|Io>_ zlUbd4{UW#(*NpqK(Z;kcNij-VIwb6&sdDQEOS&kRGAawZ$ICJD+!pW*vJgydRz0=~ zF7IAuYBd(HQ&)0oZ#Cj?mJfn}vkD9>eXN3ZLUL*EkUUH_Es00U$h$f^~Xx&=5 zyM6m^FrHXk*^0+krl(gI*B-;l{r=gH|G8A3Z@bSQ{pbGspDXwuu%coA9TTWdB;^9o z{Mg0pQ&$U4-FTjeb@^6J3x-#Wpf?PTL&$?j7wjkTSqi7b0vGBEB#;1>Vrp(jpbIl( zE?s!T9NP!4s6Dd90fQJ^!75Zl9sg#-260n~ol_`%HDlkmo)(8|5|#>3#+foAruIesU+a^D0Xs=$UZ zw515{!p%f6wJDl{rsxJ&KWz=H`WA14epL#Cczuu|pTe*-JXn3!xuFRwQ|Tj%-QbQN zV5;!~TN{SkMOXEVSui61&2nTxC;4)E^|_R?(>DvxXH+IvbQQJ{)2jxH`Z;N}gAmqH z)5mV;V-GNtWSJkwb2XwEKy$m8R$1LePP$cF3bFYNZ4*x1MV7Y_<#cthdsLTFi)$gs z^4e%w?NqodO9m!!rd6DA0i#RMeOs_MQ9Roy^J1?egf=WdRR(+kj9dlJU^~8- zVeD?}j2U~zCw~d}kY{(@MJ!zjyY?k&CS0eb`*^u**aq3>jDG zkpo8P0PEa_&@-yJEI8;NQnMwuh{%w7_1!a%RLZ zD~#V~hxYpni5`GM5j7=vby^3#04c#ccc@caC|v{q=%93>&g>K1+wHROuyq6H+!}Ii z;=Eg3vMGeX+b0dcE|0UUVJyo~7xk;>ONjbPn!Svu&mEGUNU1$`xvX?pT|ef#T0^?^ z9L8z|CkRrz(jr@E6)*N{5(s`^KpN^6hY*74N{q6+mzCE_9@NbD$%0J`b9(1E$Nv9=o@o&hHop)s3KmYGvA1vDyUyys|BeIAzSR@|YLcF)ThLsAjqT9nIq7N#7pF zv(5Ky@tiAE^AdvN)&{q>?>^bS`*>~l;PY>wLG{xQ&whl?@L#|EVe9sR*&g7FO=^wH z1){lTrLp^c}( zrMqBeoCWsW#y!~3Z8cYfh)EdS$$v+EGyg#au=kQ zB{YEzO>h%39L7~1k~-3WljU_WTd0;sf);{OuNL>FRAJjFhU+E0@145&_R)*LOesZj z%aLP+?ISrIya~;E!g`i$8?JFay(waw5(A%*tVVzq@O`>VS+bRhY z^z(E>tPCXu`9~MbSe3IiV~$FS88|-W6l)d3(ZUNr7D{fnu!$Fd<($?&RyM31kk9ui z7l^LC@yJ7XO5>4xw5dJF9BZIEdsRyq`xeu`frf#;Y`&Wp7}74n>EK2^2~KS=zPwU~ z23jl3*3ag&9Xgc)afO*RL%9$~)!I_yNVe z+pnA(wyfc8+a03tsC!EixsT*cO-^sJ4RLLF*BDp>B@FzPxt1km^sY2~n+jreSyVE! z$9Jv4z=dL5qUdK`3;RM#1VTS>T%#$t{?*^U|L+z0Ut8+`|BtYEfB5l7t!1VGtALS5 z^{}Y4fAT^uBDaHHhm}_i@cY@0nqhI}fbdjm!^!08*WNq(0YJao7=v67Rvu-U7T_PI zS7T2lLw0d{PAe<9h6wcAj3&nU+>R^x-A7K{g4osUHf9ISM3Mz0?nRYjc2YfMjqHTh zpHO8UEY}Dbzk2UVaOHkv<=*1X`z462y+c!;t1uO#nB6E1%4kHX>Kt8i!i0uss z{MP7hc;#MfY2P@#BGgU0=k_dfx7lJdG#GvHeU*0uZjy@W9lm2p71)LfSv$2N_aw%Z zQzh*r0H(APWD?hc-aQ8)uDv++08@jK1`%{)SwFiS%dhEX5+}^fSYdHD=fey6M=oSH zj5`|{=0>cz9xKUjA%Z-$0?8>Hn1qE~jTV())M=d)g#=?6GldX_jn9;&6!>O-SjwaWVj$SE)dEzHG8;@PBKYF$5!^_nHAH_ zDvo1r>Zd_pv5I0ldZTej5rPtWYU}gp&Xd)GSRK-KW=E;#rn>Q!H{Lz;>D7x_t$<$v2uoTu>eRKOL&q+>edOe^ zvo}v%%ge4oLgYK}iBR}4V8OTJWngO^)r19++idT~SYV$OI_MS$MUgvlkSuD$ENzf$ zUq;Jk_?~r^eGMWK5At zGu_Jh7D*VoxLvYXHN{#(w*eRe^$P!ofH*d_?IPWbDYzG^bK z{w?*~8OR~5XSnKVo<_DC!SgrJoV_An*@!uJP~OZ7;q^)9TtF1m!iUfv8*6=yqEr9KehL{Y% zBevzA1H$jR*_*J3pGV+MT9?Kwvue+hJ+$tKZSYKCwkBW*?Nkj*xpVzYK=BJ}ZEo|ib!suZd`COI z2A)c+dai+HFX-Xa5p_hVe?;I=dRJh0G`I7_KYx2fV27|Ws>H6a$04*|<4&;EK~HSQ z9^8PwnaRJXu+6Gn@yO~Oc;?gbU3X;D8(lYh=75C(V1-IFuay_5X8X{J7${T&uvte| zVhbQh*wNaefYt&Wp4m4CL<5;62oq8SL*D}_`b0TS1knM`5(MLVVP8tcU}_!qVs1xL zQCC4H6R^$&{k)tG_R$OZSBkoex*6bdD(#(ss=fxN%4?&;a3{Ny(J*Sv?HbSP=78lN zB@RJ2SXmEeh-2!esp}aQs4dHhI;3U+ZC)AFC2*$2aum0u1Apb_t+Q7%o*!3xcpz76 zhM@+_HmHn%fC?hH%3xB1mY%p$SXj|vHT(Yh<(FUn_3OyOHkGTnaI*y1aNYg*^wcx} zw7+@y_y?zwkDN?~2fu#t)sIh|zIChk_kVot(<^D!-B>DD(22wsSGA;PCVaId`MKOim@83D%Tu>M-}>v{cE0+0{_)q& ztpm1Uri-cV=lKzn@NJq-juWO={JDEn-xf&`R!8s1;`hbD9lB!!ysIz}99G0psu)&3 zi!(3uYvw0IyRa~+jtwRpqIC;+Kr^cn80$99vePS#b#VMGY$pV=)e;T$RBK+Jq?6-s zV!HAN71cCbHO&ooh9;K3mg4GGE|(C@MFd+p(K>8cMXM6S+NFvSQ#nS9Gq3gQR-n5M zE?`iTGHuH+)3k;b0Wz+4#WbE-NHfp`RsoX@`8m$$mew89c|jSnrSmU4=k~N@wH9K;dCYoZv?uWa@@E<^i@IMU^jY-uwEyAD(>u z!xw-1@#`Ocdhq3UfBF8|v%mlJ!;e4x@YCNv|L(^xpFR7p1^&gC-$WPpwa&Odu@hR_ zcZOG>!9JbXvxe4e!F69`9VUiWpu;RTL8VTH@2bluJO!s5E}xyVX(x2{3y~* zY21szkhKSwHJ$|%q!61UB!Q=wX%$)KSgL6}-zIj0*5iYd6In_A>r*J{~Q^65=T8%S(EfQSQIWXB64nFQSE zZqIK$0zE@``Su7+`{|{-Wyzk*WWY0ho7{8U#WlGQ8^?j?B=vm%|r5d-LMp9okM)@0M}XD&n{`Bl=V$y z15FIUuEHw&VAGC`H<^Xz(Us=iU7TE`Ijp>5~VKE$%qL3Lz#4K@jHG4>TbtVv*wNm6R9% z@Wxw*KK|fD%D?^lum1U;|L@n|cQV{IZS#Jhg8S+uJ{M`D$uvZhptW7@Dca zj_b+L^5R;004pHzfhrPUxX4lE2-irMFd=CguwqSUo$Z*(F1DKtGn#R0A63yyEqqwX1vVL zcCCtnn`8FH7P4kU9bws@%ZwXGlpq&Js}mH<+8E3@9BW8%uuBl^6h^ybbM;h5 z)-@^xGjcnYLx7P4Q`LZ?V#l>&L#V2k+JS?k6S1E#*@tC82A3_c;)-s-ur<20Z<$$f zgtr}YyO2y3T)F38xb2Q_&cOfLLLytt8(x*0Al%Q*(MBZt5RRpvRQmxZp>xk~-TVBr zZ-033)%TCT`u>aWegOUCx6ht^`2&3X5envS|Mvab&O?}kL|5-QgKMG0eq`lNU~v~F zK}u`b9oq~o>_-;%biO6nnrGLZuN_}>-4Wfe_!ppHmfPbh=N#ZorN$`;WPtD!gKype zi`VoV=PJ~Ah2ZHhMmgHBDYW_=@9tX_+vhay`N-m(`K>3B<^Ax|ZglNYV)x0y-Ou4O zv)fN2Tc1bvzYJ|XHH5Yo_CMQt^!3hX-vsu)&@Dc7EZvW7JzBZiw1dM>`L`TH1S@*nQ+r?D1U71LEmXeN^gP(9GVM*?Oe+ zEttGZ&?jUmyn1`I0j~%y-LVH(w9YyG)KWLc-NTzki(JKn!jd6TULCdo!ED0{(PL_m zl44j&Wb7}7d9nQe>; zl(-tj?;xvNaFS1NRAqLILpT69p1|JQDGb%qtaSv=dS`_og=!n|7i zq^oyS+Jobb@N7KJNml`T zt{K91x{0ZU&46mI=_Dbr6RiYsIf7i!ge&f5<->0Z>IR2Dg3ge+xx}ljY zYr*mxP-9r04FRxqESE0S)A`26c61#G>G-e zu6j&v)VV??cT8XbW!k*d8q#|g0T*KP&HBRYw(v$`{XprA8>iPKwy55}A~FL{WEEB= zREb9StTVbXxAWlc6BzA2gW=J$AAkDl*|R6#e80H=#2eX;tlWhSE11~xMK-7B_M;mQ zVr%yzYX|o5sxP)~1;GZOmhDl1l}{&jKx;~pdH{A`JtP3{s?3>Cdw}P-XquXvp5KQp z7^1Pli_e{p-q_Z{=Hsc^E${rUab|UD@wPjRYiDHK?f}qTe(*vG-Y*+!6Gf{19&$R5;=ezlvz)x9u{OZ z5+F*boo0q53FYPW1`7BD;q=$V52V#mlB;k9J&;X3mRd(Vex>NOcRu>fuYddMtFOLy z_RF5$^ zA09jV`nyM7dgZNO{_3~cIVDBK6@>*Q7%cAK;Nbgjzx(OgkF)U=xz=(cqwH2mQ*{TX zx@D-Q3sZ-{Rksh9)%R7j_O}f&+XqJn=#u)b(Ta9VNiC|XeFR3UH}YE`gRZV~->N!yCF@E?>DBa-%W0*h?Zo^hVqqh? zunn70ihwxH(yr0`7Hmlutq|BcRj4|gq5>msq-v{2R5;@z(YDzo40rNFEo@KmkfMA9 zjw;b1XmGhV`#A=6aNV=<$h~rRfNSd=ca&rG7}HA4sHqaK8<0ivJLt!+ zwqC4I>jiU=JGA7QUa(Css7*7ZF$oe!qfDrPiOi80ypa`8Yz^S!26s?y4w!tiT1Uv} zio-Yiqg$Y=@p&-Sovb%>I~2;~;az)Ct)Do-v4L_70I6J5UwPgOzoi#SOzXh>_yzwt|ZG zjG~70yxR1cXROG$NBf!V(fGT-vw&AIHmC++JKvgiyHHH)>A5Y=LjPf9tdqQjy$N^-jwtMFRf;Ix#r>Gb?c=@RMeu zVhX8V?4aoz``KuYIjtI3h~OkwV6qxWbtGMWC#!Rq+cY%MNRoGOTo`2(36_7BwT^56 zY^V=gwkH7uy;lrmOZ*QWgcjCD`epJ`Qu#Kqasz%M_ zL}TudriSK*k!AZtkZ4`+WVwJ|ou5+JR1E9ph2E?iH}Z%HX_`}o4m4*(vLR+5rmb0f2=u(s=FcGbm{;sz8axx6c- zxE%<0IW;}0C7tb~>QTuQLFgNjKqOAEmE~%nng^A0P)OG>AW$?&Ff4bAV_4%d$F~8I zzf8|I$YzTBIk_!hz#N52_*BxZ^!)0y{F;=k(#po(tdiQx$(a|fX9GpCy1BQesqf6C zWVmRvN*XSv*a+?dw>vIY#;j2Yu zH3fyGmv5$KzdqbiTR=KVH;H z1@IyS0IDs3DSr-^6e#WOJvahGEYSJ1&X{#(0YnSF_;z67b^!L`*)8Af_RRdABfM^O zMfKi@$lw9M9DP#RLtsHHe_m}zR$1H4jH2rqrAgN_uH4MOk(Ph@{Ix4LGS6SUdE(ra zk3Kqm?Bnwv9XtK@;iDfMJ#{WA^Yq1xQx}tyl1t89%RHNO>q1iMwbZ1E7KXLlfkz;3Gd-I*cM?Qus^7!dXe|-71S6=_qA76R( z!(+#f9X|t61{W?QC1>OvKXK;tnF|nked6@_>nYH=$-bJBU0u_D?M7;Obz^E~K}tq; zLvwp|RYP-YXIp3A@GxNzN5>EuV;lj7$U-1-m=PM8ErkU>F4h73Zgf&RshgrmtYcCe zjwXaSCblsSl>?clA0SIxA!wZ_t?TD>;w9Z9(msj|Kdzw)to>vuRW^+TnVB-sj8&BP zj#UqGf$Z0YlVnu(ox4$T@kV}C%kYWIxyO^MA@#0~VyYT7<_$>eSgstTumBBXJ5>vW z;S9@fHIAm#jR2Pc6a|?bbWm{|yOjI-J4auB<(1c7dG)n7A@(>cxe|G^a=2uGH>8Nd z*|~Y#*DZGT3cOzaPUwqRj^oG z^bmo|;l^VLv(8rCj6Qcg`%F^Ci8EKvUCX+jU4H!R)syFwKTXO!b0zEarCaAx3NNRY z9J_GiB#=Z~M{g7(&RxmAcq9A0W9Ral2M--NaroHjBcGf;b|&d^TH%$nqSS)A(nfT7 z4+qQEX*^M}LO(9ifq1^Y8+|#m^7N(jPtV`HkX&%~O3uk^1*fk8$u2Xq7IUqz`NQMq zFJ(8MxSXF{R0lk}W9L(0?*=f+$)wCz-+J%0cRu*wlhZG~`qtqi#}9pY^6b_0QE&(L^V^^&-$hk}+_a>Z3wo8xAz{~;s|2H} zCfh)~0eSw=u`KMO<VqHj!N=!6J(G0u%;hr|uYPp$`Q7PMQpQK8uY7R) z?77Ryr!S|UI(PY<_l{jkN;`V&90Xgvd*tKay!gj!=>=`Qqav*}J*zCIs46?ZqP43( z?N(u3Q)gXUPf2A{RbzWw9~Ma*Z|p>Mp-8Z`A@R&E6pcU?jxa=cx`@CM5t(8fLqz5( zhA6zD5iW(V2ha>@LO04$5m^!(Q$n6pa}`#$)B-SNAl3nFQKa(-^=`4&#Z_2F#zcKM zW*2g#wjEhs+m>5YcP%;R{H2t0S5q%tNxhbmdHH(ErK>4dZl+}wHe5)$aqW7_xr;Z> zUAmTZE#=T*SXgJ?K6K>wzkm66zkm7U*`&ko9ed}{ks}|Uf9p?wKKAL=*Z*|*(Bb2U zkDh()&3DssE7G!xQZq{nN*lBDt5dRya&jsF&2;`+c1mW^#gxL#+_Kd4+z*ePxpF<@ zPw&2e_|Q>E9eLq}7hnACi!Z+L;;XN`_PZB<_gfHj|L%|Q1kRqm`0>$?Po6xJd^0mI zue7+LmdjU~jV_7YOdzq!%NtWtb5b&L-+uSdn?US7lT=(@TUb<|Jk9CjAddboOssuM-?HLh)ZmOb_SlK*W(ugW;#T7RVmpAq`b>mV> zdkfo1X;sMFRw|eUV0clAR}~BhT7lEr&W7||n5`sN4gos`GC!{tcVEnD1EOeZ1My;Z z+tIV>Fc^CM)i-|*4XGDj`okOVy!xj@aDm;-u7HiBeaz7>4))7qV03CE8OwXdOF9VI z&Dc|)p8e$1#rKb%K%s{4I6MwR8t6w!L^7}2=WqwOoXNia;oO3<(@EKfm?gzhr z`Hgqq|K#Y23-5n)=JchM^Ve=2{q*AD4^N%Cbn9YjNl6>_T6R@t74r0zTgOgag4J{~ zDfQH)v_F4%;*GcdeE0)cN{8UDefG+&Ta`VTwF4J#RVQVYox7BLJ}J4l0edO4G_S7b z+@%|@yz$mAe)Zy8Z-4l~$LBu!^ipbJE9|E?3+gfoD&PP3!tu+wpIo~2yFa}4$JgFD za^lJ-7t-GO@c6&}`+vOk?ooJ#FaGY8w+|gXe&))Fb2s5fA3k>B)b$Fut$cF!>Y<~j z&s@(wnUtGV3#e#(UIQk*0+OQ9*Rv{$>yaOxxp670>h$&eq+1QQD!TLPaU}>+X*>SY zi|OxwdO54E?~}9F-}>{B%>1&{?ELqRo_OQ!!*9Iv{(B#u`1tfSctJioe)i3G-~aez z(yzjFC%T6SJVabrC-!s>+O|0> z=73pL3>XkW3@8dH2#A0r11cyAm=zUs&N=6tTf1#Lr+aQU-iy= z-t+S?45zhi<$3B`Ri98bzS=vn+&lm=J5tv^TBYqPscKc!w&loGBB?4x5C)2~R@j;QX&R!67E&;(9FCUbXi-&`=yP1Wxfw3thJES+t&cPL7=j86`Yie#~ zWn*V*v*51*|8iBBLgyY@G1!-<+>+azLe_coSF4Sz7uUys9Gd3|b zGchrD^bD}DhA+1BLPgmioZ`tG0*Rg_l=DSJdBx?z{F3^{o@(uos>a z#L~*%#oe1gNDK;zL^!$I*t;Se+&%q6Ev*q|mUi}zZgzHVa4CHQ!aV%Lo!$H~*w`cr zJ1iqJ0uW;w|DV%@(S}t6YP;e z*3SO$SGNWq;J2lga{G`=^x?Z;jeFE?SMq1qe(vK zXmlhApPn5{5elSAdR`qWEDp+bxJ5mEL%jn+Ao;?XgY<$R#YYoUNU0o-xKvWwASlsf z2;>Z25$rw85)@~NOTwZOLL=f!->@q$o$dR;K&$vp8$7wCmq}!oZJx( zZZ-%v31ZlG`e+L7j6a{J0}F4!l zMy7gthI)7I-nen|=B?Xz^^I=cx}|SmY-8(WW@!s+(C!+Vn3!3)x_X6#6T%{5gFZ`NiJB#m>>gD>xSZ^Yrq=5a=)`GnFZZ9Uri?QK4=WNaXp&^{`Mf zzfh@A*Qsi|is}bD`sZ5*XRB*kk{OctBqo+XrNa_frkIk!Cqax-nPdu`mc~e-q){mu z6iPak#!5-aAg9n1;wj1G^!Dztfzg@KiN)dZh1SlYe7Q=gtgq5^sA^g(HEm6;Jyo?W zrOH|^KUb1hl))CzIU;6O4wbhvqWW(WW_}_P?NJbA`*p@r*7dC)TgkED6B$9xV>Z2{ldstT5d!l zF9;S}N6{iFMeYGH5QbhMNnYV(|0p`_Xby}O!JO?FMoDnI5EUy7qZXqRMImuQkKja) zFdCL#9Gob@fM$kWfoGQy*cG_UiU>-PcSO2-P>iQH+SAj^#LU9P0uf2ckEBS`vx<}| zjjT|yFuUBMZBv)2Tl=OPTl%B1_)C{AWe8>Rs%{3qq_nLZNZ6+s@Vr zi3*E{wLVDS;J}E)Bz9qNbPAjUp8l8s42has328SrO@hXeQv{_@yFv^?Tk7l?h;Vd+ zyXCgdU9TW~JUNrX5DVpv;-XqXQ8iOsk)v+s7t}NiZ3@d;6Vjy-iL5l9JX=kY3b-;<%l#icYu6-{g%#GUtPKco5ODD z+_GJjKI{L;o9xi@SSFYc>V`zR$=k9G?19Mv_+@hf4K)3{l#HOWW$)l5)#H2J^ zXRm)3EV$r^gs|u&5=|JF%FV6l$||g83QL)S!Xjl;K}CB;Zl$oarJ`j-UfHE;9Mbg7 zH}x&Rig``XEX<$-uS(0%V%z9)^T=}B>;e2)-(-iTZT1_J^f>gV^hm*!>iyX9-BWJ1%K1RmQbo@3gsj+n=dTMQ8Y=U`ogm5O()3UO-;{3wWa+OA1R@dCr)7LjKIkWQc(TgX~zde8Y&HYEOPS0K+pFZ8( zy0>?9zQ6Ziad~%ebiTEHsII9)Ro)=UEtbm4<%+ueLX}jm&Xra2gas^qE{C5l$SY-L z!PUgBw=k)MVB`wH7ZFGk|-oF%HBsYMHZD-j7cqurYm571f`%evuZMk zz_fSqxutU_g+lM>oq>8jj$T9)s$rHImY6EdFJf~GxWZCwOuV6yF_D}Vn<@arB`k{Q z;N%9Az$3_-9J1yDk&nC8WEqKCQ=86L_y_m zX^DW!*3{evZeF;DFJAoWmX4l-yZ;v#FMssmN5%-x!1&CImo9sv@z-wNfi3N>{@A;Q zW{{5Ty`qV!Jalvlg_V~;W>_Gc14Hn>sHjYdGN+_Ls&4F<*lwBLY#HC_UpyIIJ01cM zX?9mTzR@+iqZyb3shqO0r>Lrsdlsh5)j#5KqoXPU8|t zX#^4_JURgzM+%9EK?O&`!`aQ##=+If#@^c2(Zs|8>IXwZC`T=B>p;93n3`Cam|EV} z(KR!-FfcTRoxj(w->|iHfFJwvwHqep)>m)b{_66zk1u?3^Y)$VH*eq6(YtZ;_KoW| zZr##>uO|``Gt$x{q6h?H3X{oqbaJ(GfDv~t@bK{tfR57F7v=Z9utW!;LIMIq`~%RA z&aN)b$dHh594-zj%fQg6h!_$oC<4xt$e3gXOTZFHa|){{3{e7=OCVCw(PS$p|2RrE znJ!AE^6sOlm6N^W zmq3&4Jb2qZx|pYKlalm0GnOvHjS%Wa#*f?C(k>Afds_n)4fzdV2R^6cUB`)4ms?mvET_Tu>7 z)04C3hxg78Paf?YJXl!WnOoe1{q-9gN2_ZGa|_$ki#x-UOLOz<3(LDpE89a8%l#ws z17mZ212bH4aXKe2gO^)Y-3D{~3d>u|H9f+Da&C^CoUH@|)y~ByIF=2-tg{aWlfZHI zj(`Q_?m=pP6e%?1D{#$8<8HG$c>2Sp`y~lQ*%4PA|&J8AqBLi`e5$iiC+z4~t2OP06xz@xtK~JbVJ&0;62KF|lbm zutzLCry?wo?SMo%BLfLZnTfy<(S=wd6`#rr!;=w??gmEYo&iztSrCt1y?#^A(9GV= z7i#G*zP$MHM;8n%++c_4=bwFn^bQ5y+#{5zXJm0hNAJq@I|#4H$auP62q85i*FPlE z(#}mPuh;fX!$gR-(N&nD(>}ceV`PRF4!fsTwZrq(Z38*VT9Hge$rL4!=}_3%0OoJ+ z3_)jVZf$66aqY%!GfOKA3u|K|Qv|}^!O_Ls+{(z<pck0^pFE3ua_~lnR zI=T?2u({j7&@?{@WOu7@1ib8k-uMTEGTjI0c~hF3gt^Vu*z$<(k?icMmUb z?|@)*NN8w86c!hX4)yc#i;9Sjgfk^BIToJ~5r)A<5du)?jVGn2q;ujD zDFC&xITEp0%FE8pEl`%#_obz0Qz)6xKKlekr7;8yiBeQQl|~ zyska~Uh<)EjY!CH@r!Zv!}^A$y7)wSV^YwuJX^Pb#B>QazpA=>uB>^AoLv<_l*pKWJks6*RB?+qHGnMc&(B$g^aPYKu zZ~};4l3OS(D6Va6Ywew^Xc{Uit_NTSa3NiNqq~NthDIhvfU6?h%xxSEO)W28yacOe z^^Gjd5U!AF&23$cED+{4NFpmgD2C~arMP$p+q(EglCz1-0ywWCX}RHv+&Feo2$4q- zsL}Xzs5Am1$=)FZ*sYCtDDXj&KdMfgjJ!-^LXMeX1n_ z7>szpoL#*Gi~x&q^n}tLA4f@JN|IS(gsaE3TY4XU_|d1IePLwfX73ST?dav|8)kFeJ$0CT;$1uP%4v$jN7TiKYHnBKXg2T1B& zeSIC>JCIFbz2McWS3mpgbBNtfKK=BIFTaG>5TsBoeEH@3fd1l(FMo?}I2GY>Q|HcY z_zs4~P#7B-nwXhd8XK9J!_fe#+S%0xVejPR?(BxVaqBjW$+7?(&Dqt?(cRhA)6v=8 z(HUutaMCt3F3-#+CZx2t_V#r4hJ}QqgE6s0GL=fFrKTqlNv!ltK3Bl!2)J2%COtEq zO6PI}BzPk@;s#A?b$tswY8$j|odXpWjrH2zS_qlOj`r3;b(J=gpDPy03Go!@s@Pc) zMO{DaI*BGGb9e$lL0wFeFg%W-89tcbIp04y-+%DU*uuu(r(|e=qXPXbdK79sup|1~4pDeB&!5z44i~p|RzGv6aq&xsIN3D2cUg zLmk~C>gr~|>m+$fpq|@1hAL{Bn_C8&S_UTOH%3Mll&boI0%dF*sl97-V02E?+*4KG zR#~fUZ0)6{(P4c>P)L}Ai<=d~-pNCVjwyd3&*O;f7X5==cWS3&e z!Vm(>CzyaCWjc8T*gAUo1}E4$dOCVx-25X^nB)LVB8JF9p(8@ViG(z15RMiSP4R_4 zOy&|fWmvK_0LO};NW)1&ELG|gmI7=}D3JqpMXsU)97ev86tEhF#qlAW!7jnC9!rC< z6}(C?t;b~)bL5SA6CIr}1mV~}WED4rdk zRe?!hqi_@`s=d*8Pc%`_(A?eyg>d$XWypL&68v##$iP^ikT`qS0CY@dcHIn-tHLDl z(8MeXh*a~Mf(SH2bA)$ryt`jGA%U5ktx6TBQv~Hn>>@Hx7DeGfoP6}r1qhVecg<~_ z{jJ>sbq&nCgNXc50H0uA-+++di0}v^R70PC{sl0kkr6Rb zkvLp5F+4IRJOT?P@yNi){r!D`K+@dYF*`ZS7l@cl4v(FcLL$>rX&5v{Ay+iiH#ax5 zv})VB+d8`2yM~9y>Z!{WCR5f%JtLh5m6-8xrfI=4(m&=PQ^73TjoWk1r_QHY^IRNr`h3Oet zLQw%LOH8Bl00!p>^8EwDfF?^!qEXT_GkJON9a=j_v>k)(J!4&c)BQs;qth#6Gpobn zi=#7Jur9n>+ut!fr)ucUE~*u&Izj%L&MizAmPtxlvrD^q@XY%N)@L_J0wjD zP%ZE^GceCTziqX61}rc%AApna#Kqz!kUgK&^l!*JSEP+o$l!=CzPxnprv6=1 zgsGjcZ$yf%djK2}mUbS%CFuZs<%%*ev%00H9~3X33ro1g5Vowq@FZ?gYgTa^C$E-~ zQ%lM$@eCoFSR(X{%z(Z96w>AAUjXx!mXV#F!Gn&HN@G%zscbf%N?}lwVc|(~JRuI^ z2or&Wjw2{AI4n5C*UR7A%Ln4i$=NLs9SR*NbgwsV>fFAg4=?T-7((B1TUQTIAbn$V zcTbd~qdVvspeDDmbFi>R*xADg;qK=b1Z0YjkH3ef5AZ3J)bvz9Xz7eJ8pGSm4;G)1 z6UfwLnph}h&{*sYz9c)Bnv%9KH4lYjXIr;Ol;76UUs|G)7b#2fizEVZI*lF{8ksLC zl*vl-B>DL{QWh(d#mq`bOv2;i0?;8b(S%Sm1{D|r%!|F9i=(p}c4i1hN=a-bF6>&szG%g-cO1?xc%7tIOuA;VCQKczUHSq05;86`1{B0=>SOb|*d>Za$n7lCcRcbh5e6ID+zk0qWnK>WO1n>ms|f7j`+Z%lcq!J5SvwsU6NJ)Mm)qllaQ+{uxX} z1Ufu9Qw+t(Ol#ll(9}9mkQ1|;EBg=I2gX5qWNB-E{e~_8(f*i($hZswDU$@795JyL z)($@5NoF=q&^rX-QoKWxjVx`UPXyrF-rXmJ$c^U|L4#~!hQL$vL^YGS+9i4ScKyUX zdH03}223qHgmLsRjG?4!b$Ivdn$ey1`4brbRoF7-9S{LS#YK{m!R7PGt#g<*27}0= zX`I`4jIEt~uHMkq)wh7m>+TnMTkr1szSzj}j)B=7eN(`zO)c$B%q)ZO=|CuF@MPHq z)ui;is*yvOuM5l0q%}j5%HgO)4jPkaW9#zS7oY#`cfb4OlTR(Iomd=+NSG(hEtE+L ziu2`#lA>Hmfsii|@kNqs5ie69$mB;y#m3?jGc%a!DYTSia$GD4g9(SE9f`pLg=%Vn zFf<0Ok-debot2FfRKE@`5D#G#GJ{AY;fV>+xY$@iQgn1|Y-|E0g_0u@3wgYZbXFpf z#AOM}N>s9f5)j2zS5;?bu%NGJ(wQoGnM$ExrZLl!(^6AXlS!1}{^6I89x0V-JU$*6 z84O^NgrxkO-15?LZYD1|kq(t25HRB-Q}a^`H5IjLg}NRp=9;Dob(Nw}nG9mPj7)AO zKL#I*@(T?MjV8vWGU!|yjR|ZlUo2*i>E-5`Yh7OzpG-W0>E;n!Kkf@o|4Dr*K z-vVSbxwxlLw$NBoE?*(Y1^BnARNd0rJ5!qkoJ z`V=*t1)_%4HRIGE4fv9RPxAN!?6(K|3`^!-7$A z@-DKZk&>(BRgNSJY7?_-QpFlp2}Ji8U)4jC!b(t0Ji7#&BA|$B@w7Z_au$x71B&9B z%Fa6N;MB^IQVUa78lm8H_CSFQ&c!>(3xtc_C`UIhT|kBGkdAJi(5hF|cSF|<3qT7M z)oE-=b^9zj66c8ucXA6XYv}h2i6XPJ9bA2dC9V1D9-+JjXem109woNR#d7+p*X+crN*y2Ig_(oIT zd_h?aFu)&t_#rfypM3hcnYG*1>$-t4Z-)C}A?AANkm#SN98TP&BCsg>pG zVpWx@wp>|RTvSq~P?gAw<-xXwkShS7+Bu23wphEGd%LR@SyRwKUZ?!eeJ+-W7TG|Kuh9Ff5vc(zcY%G=-9)`=4 z6v^^ShWm$PMWx}9cpxLNI11=?eEiWM3$eBLFtcp zF-d}4^`ob6o<4q~uIWmkW((D=Vp$znA&&3Ac>L^b-^i+_Wk8{7=^7X>YwD@(n3d#} z3yPZBhCw6-3(7ll@>N(|;%A?J_85?4N5{K|o6GCHT|>JYd*frXtxa732#k+T zcXW;x18qODFh0K2(>FcXKT%uVTvyX3S2Y)wYI91Od14iTm`bK+^8|{N42ig)LQ+t} z;1(xR;oQq&@{2jyg~@3=(3!wlk(A29;u8o7WRAFm%#l%Y8_9y|M0RPaq&`Jb&nRqV z6gH>jHDoG!sd-H);`(Gs6G>D@%v2IN<#bthlCTb!E)P%1iRGwaomqIYC@xDGpQR2a z&;zmbz$hA&wJ_=jI00k;p;|jYrlkc0W1(Y(?gqpR1d7PR591va0iL3(H*T6*BJLOg zIq4ghE^Z&&p4&Me-FUEk?=8&9@0r}KZ662hD3-z%$!bgM+I#~;J^g|h*$Pg9CN4wD z&ad@FW325xh)e}6uxMX;B5j=_Wy)n!%f+LpoIf$@RS z@!^S%<_?ug+1u4KH9WpDJ-@!Vwzs}BIXrrFuzRox(CX3o$-Rx`)w${E$+6+(`2`TG zcXf1CSJr77n^h&s_2t!*{lk&|k=3R3!T!;X=B{Q$_%t`P1JYKYVU(>*VBz1A|_ssx!N) z&%wpp2a^yGO*gl7(Kj+PGBP(Xu>iGUWJ2ck+j>x-g_HR10nzWZVP+Q4uKX6i@cdi+ z!X<$C{rJMCG1PifOB5?J7YsPh9>1EIUV8iX`*+{{^y2Z$gWZ#N-~IUP>C3YRj}CT^ zrY2_(_K!z~CniRx>#OT1WGWQjv{d@a(gu^21r12w;6$UgGd_XrhV+WS#sIsD#St=? zTp}@1Q`e$a)$s-S8LTWmm!DrC6N(EIWg10UjiR&?gecwJ!<%cno9lbCOS{Jh54LvB zrssFG?R~S0JFV>lv-4ZibDLw6E86yv#>TFW&OvR*NLSZbclY4n@KmL`cCc@7aA2&u zwnbCl5*D588%f47N?=n%STa96RfK2AV5A0)mKU2Y4NDSX$U-8s7)LL{r4?dng(P8J zQg&rjiUj8Bz*i=4%iRL-{t-#UjN-63R#-x2QdTJnpN>h+4vb;C`{TNLmvah>fxosv zxcdfS!6yJka+*L*&u_$#*x+EgrE6qtWp9dbvp@h>6B`hoD1$BAqdPe@qijV-vOsBR z@0ZGz^Oc>%bTJy6n8?bBA@c|fNrp@dU3o+-8BNHDWymW>j;e+ZVi`H1Nm=-GX+ma! z1qf=B*jCynX!&*v;*=wWZmqmHEY)@rm`Nm9>TC(czJ7 zVP0WT$zabQ_&j-8*?HpJiZb===*0Zg%)PzCg_-&JsrlViP`0UV zjF2#FSR@YAFhCLl$)3f|%4BjaED=e-GG+-&RW;jdJDV$On!3jIrPc9~S+1lc8B|SK zxn13(fBD;o`#b!rao-`1JV5doot!{ybT)6>U5aPRD#w6_m$ZSI|)J-v5uyu5liHM6!4 zp}nyS;k>zhyuWucHM6?3xVpNuvAeOew6N0EInY$E1%%Dg9_i#6hHyt4TRQ_jI9kA&LUbPHn?j22Wt;;0yo)DA=#vyyXvW6aq6tT9a9*v3C#9y=w#o4_s*Q z5r6sBWk_wnXk(MPjvfIfRtP;)OOQf=5)bfX7yn4l;K*Pi&Cb<7D2D9j6B5Gky zr>18zvI_#kBEJ0MOX!i{Vngu46~A!d!lf%f@aUUcyM6KHS9L0}nU7I$PT+6h!qYPMS5K2<)r>=O`Ama> z!=|$tbY@CYN_HkM90Pr8D)gMeXmoIJh?A2?u1E^?TyIihzT3AUFOpk(c6Z8_T8 z+g@FVfSnwl=?5*+$fTl7-QV3mF**jha&mHfab~JXqv>vKgVt+eXyj;T>u7uTyEk7$ zp8e*2S$SULq-o9$=TBZfK6`w+e-EnSmHDNyk*VgU zwwlTsgS!R{Cj0*B1FS^kI$ZWb`CW( z_d=5os7P<$=+e^G&c(cyMI!wpVE{5PSyh^zj7$M2FfU!Y8W4<+Pv;|C+`+U2 zh9HKl+0i=~-tvz>`uO7u7eI4xOV{A~P0)ZCg0;ZZ%3jaN^zyZ97e4vK+TP9H*~8Yw z%O^Ml2oy7*O6{Fp{UVU)CI!(LOjovUmixYi-YzrfsCT zcSh4T3WhI1o|2cN%$C-A`3HiyNRlrD%^%R97cPAA5%j1RKKbCokKk;-d>Q0s#uqPL zg*OEBFkri|2JZ|AdJRmX2vi`9eF7uhd;&7L1Gq1&O4ut@C(ye`=n1Uv~&2B5a#)B~vqP|W@T!QlA2_|;|Lu=EW~ z`+G*VS2vG$559i-?3-7wUO#`nx3#&o4mJGj=+M~Mz=%>&no5I?yYD~${?EDPeV<5n zWU3I>oikNKnd&*1btbMGhq*}&t1l|2PSJ7PK#D@qzYoJXS6}^Y`Q=~us;;jtT?R(% zwywU7t(~48?18%R?}iATKKT9beh+G#3!i)uN7p#IlN_AAJ6e0rAHO&`yuS^Da?W4P zO)Y@wW`1t5r*}wM0mwl;^bW6IzS-M3tgF)0HMI7%_ubVuW--`L;2b-D@yoA&{rjK( z_Wid2l|TRC-H$Nx;`rd+&i29g-@NV3Ljf?U75z5Dg+Z)>WXathTw10dmA-P=BHZtff(otc_jnH-xP8=09Hn;#jOo}FH< zD6bjn8v~1dZH-o0R$f_NBQGjtvUto4uDz|3g_Yg4Te?s&!tML%=bvA`c3sE7)X35v z;p%T;?{4Sj?}mzU^^0;vVS$kK$AQt0;NTVF>Jti|f<$R)@8;$o5s|?142rh2ch@sE zwRUtzxCL1|diZ0&XA!L^s!67$fqKZ@BhV)>n3i4ai4L=N_J~Me0xj$86>Mbg0DvL9 z$sd36seuvbm^`lCzJ2SCzO9?D&RxU1<`y7@G6qR#KnQ5JAbo%G$tO^lfm;63wOcoI z^dWdb*lcF$T-h?#J+%P~>-%Q+N0#o5EFDg)p3ZMQoL<}?UpiJaj&{x*!Zx~|nO)FF zMa2?>L-7SNg_)HlBz^d$-|xOQw73mI=$pF#j%ZLyT!b?m#Lq_Nwjk32zpA5~k1dF? z4b1(5Fs3&4F+^ICQX^M4Bqe1;#>AW1*h1*P@0~%N574>0UwpQra$>u%d$LeF+&{et zXmFrkU`!O=&E1ofkU)rxP9vv!d3XV3Yh!JPi;AJs=yIvFrB*XNGPpcF*Hqhdx_>Y; zGO{>1Jux~`5Bj0z)+{zRAt|-BsYz9)mKByL3QMW9G$CJ<#o=S4@!-KpBqqiskYi%v z$jRyCcuGo28Z>Je3|4DX>)g!j>E6-K%I3kw&h*&CSpO&_@$sSIsnOBqhUV4zC8oC`6mba=l4!QsC576C>9?Z8j9s-i`(0}lqD+QnDX)!-JJuy zJ$HOzE|Lf7yuRVe(I)G{+kg@D?l5CROxY)Asa`D+OL-*cw zZM}v8$o}~J!uHL+qwkmB{C)NHUzvp+P&~tpVPtF#$pR!Ra77_6zyb1G{S1N}0H5P1 zb#7h^TYF?(edDtiuTDW9`Qq#SgNH9)fBly~{|#0szWw^`{iFM@p1-(%a(eIh9=w3Y zzoo5xYGe!qGwJE9XU|_gdG`ACt8ZUCeYL%Lc({A-(fRYqiMiIczTu&%`~v0l#G+Q) zo5{^7R@N-9tS`>3^>+_LFLJzpZ*FF#t*w7$VSR6N|LLO_BLm~j?Y(FBA3i;Q{NVVk zzNV$OW01}kr_%Y**k*FYnH&j&#ho0RKG;53o?lv7Sl(LOoS$7BADI~F9d2*#tWsCI zxcNZ^3*z-JFJ1cTD(Knu?iiTp85n_*Q0LBF2q&NLcxRt56B{RMXKy!DB=9v5q7KLa z&@a`b6X0HkB=pRCf6?nI6m7@961u7 zgm6PT`h|H$#KT{QuY^Ji(%-E+2CxBM_x(R@Y6*V9&84wss04Iexbj4mM8y9y%3ZqzAJ2JUaRoMvODxMH~*T4WIQUGFq_W9>mAr%># zxCBLzghc^ik$H*+HW2^W`7IjYSyb~A)7#6-+lvdMJ>AtRfS{G_%}piJJh@C>UsZqq z_@KA5Q>7@YR4A%dmF)D4_NKO`x~9?5(XMtFt}(JWHPh44-P6%CJuy)QhV$C`-qxP! z;W5zrK7|e3&z^q!;^p_>eEsa*(p~=$;rJ&CAOtlWCZ6ET1PS$d`%*xqxhUv~`k_Qi#N4MMlfmN^bHCM^YlW6g+)e0Mu&%EgF~ZG0imfB zIt7H?yh2u{gp>^B2iDQm2aAoPQZwl=!GM`PJTU(D&9`sf{K3XG+{nh++yUhqmxaq} zkhE+ztvnmP_tX57UuPcvF`irQ8U)KZce@VWO+Wj~)cMcM!sct&b>FMFZ`=e?+MPT4 z`uZkt#uxhr zr&>A(Ya3c&(_~{ym$ax1gdb9=yuWW0a{Bhx0pMV>a|;LiN5}goTkAV}TYK;?wzPDf z9G{*&czC#bw6?T5JuwFwFQKSVA+JcIFw$eP~w?c+k+qqyui2h4Bb%} z5FZ*_+JTM5#W%#l-qjryYHICp@$waDRH5QEw{_6dH-<3K(Yp)sJX-|#$gIM{iJ{T4 zU_yl905CZrikKRTO$dukau1Gl$Hdur_H1O$fp2BIO{U~Rpzna$PfI&h)?U&r)Y z{KB7r$l=DVJNAxXs0n}p2UfN&04ak{0TmXB3c*!WHFXY5_76hlMHf!=#~boBJ$*-vlZ9`9~HI6kgYSHRYUMorVw%);2n$WY(VJV4W< zkVnVHhsFoHdzu@YfClPnYwhdkY^bSiYih1mRw`sAg$1&z@|u!D0Ix<1@{0IOD1zp|oXbYNBn!vY$*HaE5b3o6JfqEJ||@#%tWDL{L<`3g{7VsQzvgj9I9 ziE(6V8hd$e;n9OfwaPk?PzokWFmi&s7FaoFCr>Js4HLfp@b$Z&|M;u1oj)Lo;2F8D zXMy8(w5+}yIr(wv`Cpb_{B`!>FOYeR&oFUvS8r+rjtoKc^ySxYzWMIgpZ@a4AAb7w+wb1} z@Z)#y-hKV`+w=3s_aU}UAA^45?EZuC@fn4pyuYUp5;}!Se{lcN(&|x1&tz3yD*%3q za;;QW6_-p`D{Dcim6FPiji*x5xgG6&J>7!?{bRY3B2{HwTl;&RT363NWp#aVsj9lR zsk&BMS*a;1Dh7d9Mh1tT&ID>tqv@z9uglFVYHR5MVy;46Ba^FITDx1d-Sl)89v27q zDxQ$w<$(%9hsEFs5Mto1_74n>iYA}}LO@do(FYG*y}Ney4nTJ58=JxHdi|yj#G?sl z@f@6N99&$z0#G5*1}0{K;jsuOH$5X`q_;m9rh-GT{(+c4G{z4V9Et%ScN7>3ZrsrE z2@DMk4L7m2HFtI~ada|uaJF*xjH0k$1PnBlaJK_q1OW`*KXW2w{y4wVqlO6np^1@8p2cxdso*l;4K-+uy zI{Ki|F>x%hJS>`M1daexYmoK2dZMy~GHusr=in@dFY*ltgL}3T3&>_{9ym!&66k3A3nIZyZ`L|>HhjEIBM#v>L7AKTChC3aq|2;!@d0t_1fmfmX;=MvsMd%3?x*pq%eb- z#bIWH=&`i8Tve*BEw2Kc8GtOQw6LMFk;&j>!N9TtMT@3+Yjxw{@xAX}y?OimxsWdu z3GxAzZPj)?J%9ew_t5%neDm__|M~BK{q0YGUSC-s9iHy*A5*I}>WXR-i5?b)$Ari7 z1+o}if(^nIijPat<*dkF8mBvX-O3xMM{PM?N|LdRsWnqnk zTIkD*moHtp6+$WO-1%nu@z0yD|F--6KPJw8%2f9Srj|EOKVN?Jm({obIrsd}6lp7r zHHH!wz#L}>cMqf=NWtH83jhB2zy0rp&x2#~-2CaBto-4@sq+UQ-Gtr$SK+ z-AQL#e^XPBP$XBEHG`v-rx$mh zJ^#at=WoZx=NFeZN2V56*AEAVmn!Pobx_ zwsv+7PF6Oy@EI_a#gWo65qKCXf(easc5w>^$(&!1yDJh4Lsb$}0pEa$PWYI3KVQ_B z7r%1w4KPL6=@}c_xO=!o;KRuDU{YFYb}lxa>W2;mZPG^{eFO*Rm*A|qqi^r-2Zip#@Ra{5%#XZv7|^E*CQMkPNY`Xw9ZYhNu(-| zK(wI^!UYv%WMdl^9!ZQ(xC2Ia8-%WriDy_eJ*Oy@nlUvxF3idSF%O7nhq`(Py1FUJ z$zr~!vP{XMv)dcA(<5X1Tbny;YkON;+pBBmFvj=Z$-SMu*|E{>^{tAEYABe~sPv}B zmeqxovBB}~t}d_#j13L0udF@1ck<>v5_NpMe{g>P^!2kB&mKQMKY8%x$@dVRvJDVG>LYBp7@#JUTl!y|}e`@aXLE(eB~nCr_U}dvkt%zPGbCHMLw- z-7?rWIyt>CGCa4mu+iSu+tD@H&^ENUd2(<6cw_T$VR7T+^!)XUSBLv2NBbw;tvyrY z^Hmj^%q$VeLVo?_&;RqU|FLrn{P2ShE?>E6YVRMMC|Y{{%h9`k?7jWR$-95-fBTQ3 zj@8Ia?ZD9=cfS9}$)Enu>YKmAO5f|Z450tJbxYUE)&a^vsGlMK!gc)Z9RBcwj{v_4 zj1V9Lm^mWZ)cD-XS8sp(;g7%k{MY5xefULB??Xwv@%Y*6d-vcMIT8w`UG4n```{Mb z9~>C1QdNTuGbM%k@EqR47cbv@yRm%&{-d?+lj)h&(UIBt>9r)`0>=;ZJ19TI>F3k(90 zt~bc=P6M9zB>96dI9gX=DFe!2TAzzdgf62PDeY-W7Bg;6Qc&CrDtJlPl83#)--m zr{~H7a5ywR0m{y;jX{YN&54%9j`A%Vx)?wpKP9>gr1sN_nAta(H5PVtQy`sJnY$c5G^VbaHNL z5{RUUk+J!ysi9ujt35qEHQUwM)7RD4T(4c2U)Wk*zkhV{=>FLm05yAidt1BXLlZ~4 z`)^;o{O0)^_%YyLgxI{dd+_?{^Y7li{r2^%?_R#FF0bVAa-W|+eRlp7SdU+S{NvB> ze*E>PpWnXu`Wv9D9-Qs&9?VQF&dx4$b`I9nYtz{|@{;nBlIoV${_%Kj|cInn}Yu~1aBJh%Mqx8MKkU;pD3K!TR)!h2#7T9DfXl|37; z|8n~CKkxtYUkBg)qkHKAnpWPv|8DF1|6KjUU+3TaRjggUejE0WgGEN)-pns9yJ$M1#Dd@-56Ap(iGbaHax+wXt**MI-_|Nig){_`LI=O2In=hMe8A3l8i z`0=anzI*rQKmYmX9|5QT;qBM&K+!QhJzrK@4rVY=k3W0%>h(82{qW<@FJJ%R_~a?< zOg%YztkJag^^cz(Kbn|XSzFtkU08i|{7YWs%D@adb)<&yM~~s-rj)1X=7?) z3JBaMXOCA_Hh^XVO&9z;tsVWl+Xw5bTT>HDqa)J|b=uaJ?xls*t<|l*&e4J*Wdey7 zi6ulu#rg+?27!>t%O7IV*FU(dpg@tAlatBffHRYlLW_$l&JiVGqhcc?{5_D~Zf+JP zCJ>Bv*48G5hUTWGPB8Ar(E%PFF3u3M?r?+K+d11IoDjC~fEN(wZcdKQcD8N~_PTdq zZi4}U#xT{v)Y=y2o53)gfDlY54v!_q!}z54iS?_?@CE-yeJ@gxOykd?dKSPkq z$QJSo6q2HHG9xn_Pl~58f+9h4o0eNzrKoJ==Sxk@Ek677i;%E5xI^Ij{=fVSFW>_> zB{=+HQq!&5cicS#qheDb{1LW}I6~^=;xh z`g;Un{KMamZeuX$a9VnJp{lAH_*vPNDkTEp5EK{!_S-=JpzJJO0)Z6u|MB$|U~#5v zme0=2-rIe<)9JXoyFdg85(pA3SO_5`5Zv9}-QBftDBRtxpwPnI-8H0lPmw#lJ$H7u zp6cqqs!07M-}}9G&UtzH9zA#rA|XBFYcDt7q}cfE)b#4o;)0xk!c|~bqS$1Y_L|9}>VoF4KB>J;S z38~qsnMv`93GsZ z@85rU^_rWNQ$*LumX}}r?D?wzkAwUT+!~~EP`bZx=_b_Az!gP@j^_ER+jo%Hyn*b7 zpr|+>|0gs_d-_MdecJ~hAAQ6ZFQLmJMDvoFhLJ0kJX15V(Yd(Ywy<5=F(IHI6I?zR zj(Iw{JyG?Oj+vcT?$Dh=4fNW5Ha7m7x6v}VjTJ?0>QhtT|M;JO`^VpZ`h}5GnUl|0 zTirA{DQ9qKA}OOdI4T)pojS&LAe8WnNSfKYcC>X34h&~x7uDA`!R{i%{(>!_o^5rX9TE=J3;CAV0Xy|C3 zzIujw77g8#C$MF@r;lGfe?~|9gn{NM9qm(Qx|is}phXDrut!g6!Bo9`^(Nz+w@mEZ zG%ue+t_Be@(q6>RRF3(j%hVDB+}^Lh(n104S$b_R!Ha3kV3ot`#1ITBxtDm!F@HpO>qLtCNeiwt=#O zhK`QDww4}}O`sM70z&B-SbjV78|@1w_zG09c5G zw2F&^3pcMINzv-^)$2g`4I7Z4*# zdq*3IJce2hJnYcm_|V{BcXv-mM?a;j5@o59iiYYMLR55Acr2>2AU-ImXd`uvi%t#; z2#bu2@o@FFwet)Ni779y#Vc!RnM%uQN=V~WW{RqY5?|H0cqO1!D66Cs8cGNZ3Xh0N zOH9hMvG-EfFowew6qe%Q|4h%w0oV>qzPzYnbYd3cTqIOoQR&AI^oCQ2mYL`J9h$hR z!Q!6Tl!k%c^{uASxevxMeue$We2Lw2`NNBmbwjUsbm=C#^H(n4hO5CQOtszv z@H5sJgbiM@N%IL=YinCZN2T=jkNF2BTH5-^$mwZl*_fImw6IiBH_|t;#cu5F8R+8X zt*T+5XJ~C~YM&IB2ErHMHWW$^#>#AO@4#y>udL53tgb9?jE~PuOwJ4d&@wjBNFomn z3^$Ql^Ycq9t4RfbcL6Sy2YgFWYHCJiMs6&%Wk*a*LG3Zq+cQ8$R!v1!8{ewFzJ;fU zpRaciG7c99S8EFg8*^JnJGYpaB%xK}&uCx1 zW_&I1mQOB>+2e* zsGIBR+M1YXs3=?M8Jp{aF=%3AWZ`1#@Ro}ktoHL4u0n0|=br%A`6p53hc7;iUfPLM zpqo8?#;mGt%<)zb2|g_iU5Iy3E?{uUNoldMB{|v7j;?CzCZE122M5NkEw8RFFE7u} zFV4)25B0@|M|ZY$%uP;Jm*!<9rzOY6_A74)w4{tO(z5R7HbnUGjwY3cL(z9#I zDogT(~n(?*7;va-qnf7+y)!C8NiZBeO2hB^iItzOiwS=)VB_dOp@9M zP{^vRY^bRtXXcb4NG7J`BQGJhP#Wt=h{=JW%E>As)wh+xnk#^$YpSVgtgCIUuO<~2 zmgi*`c>9Fq=ND#X=E0n^vWn_z>d7Q>X-QRpUwC3dMsRRcW?D{ZNkv#_oU@Bhcv!5v zo3Fl(A-YJy!s1erN|KTa{jGH~eO;rS&GiMjeN8pPZKUyzmcGU+N_A0t1-x($xg?uh zoL!%r>SSWT$Hv0V%FNHsD!}oEm+dtl2OAF?3lHmScE(p6OboB-U$8UMb1^gWu(Gl< zGQ!4xJ9Oyikt0Ws9J_w?4rIT4fEso43G(y{^70LE_p#8|6yf8&f9LkO(`Qalbzn|k zICtUZwHt!m5=|8~4OLa91{%H|z5p16`-i8eB==JW=JDOlOcm#5&W(;WmKKloQ?yj% zIoRJSNGsWHRbD{au}1&7{%ZzR8jPFP}tT zykx|-j9nVW3;&Bll)KS-Kp7K@=L*!fKq7p>CL^c8_4XY*+gmaIFFWg)?zOYOPaXEP zzrW?<;iaOYjap@FOy>9foqas@ZF~RQ?#|Zw+UgSZ&%W*Tb+ymW%>pXne9-R!qVo(=EmxpQt)V^ zE411! zzSb)`P1G%=Lt+J*mIW;RPE;%$JHZUaG!P&#a!dBPFOj$$M+cyMh`^5{F0bFcv z?HI(+nTfep%0N>~Z+UGCoGgG<`FUkgi5bZ8BO;Tksv7Gn8w(4|vodmL#-}Dn#=ATE z+nT$&I{Vt&dVt*MYU}Lo>Zz@+FE6W#i%rT#tuH<~JUH6X(JeGA#>>Os*~!=6FVxDy zSzbX+MD&xIx*jjDFgrUR65a>*pFofSjf}JBEXPv{C>pJ&}CtCXrixweQs)QWMF!bVxleo z;LeQ`$BrW(dz}(NJE{Uf;UAwH+1e%*OJ@%G~4ocZ}Zp_I>}`_kUjYzhji%{@x!4b_7%Uj_dy3 zx4oUc?PYZpNfANO%a^ZQxOf5NQ>a8iX$luep`HQh=*AtE*SrrNKL7MtNl-`}oO2#t z!J@RnozYG*$5d72~?{YQXS-$W_Fq957*St z6d5#N8|}@l{S*q3m?8638LU`E1)V_uP<3?9bWJ0}V)XP(P-JeZZJZn)o*W+S>*}2z z8=D-$@yNu`@KARjy0qb;aiKxc21a()maZ7kk{F-tVCTxii@BS+pXKzv%4&QNll?5I z$|octB>aVgUz}H1ij7lDPtRUg--Zve{Gzh2-UvN<%nUfry~nSv-FkBA`h8l2X3X5o zY=Yc;pBWgrE?;|a=KS^ZSD_yCN=i|$uBHLtjiu!c5XvA#e*FRTi@3g6#yh5Wna9;S zB$Et$Q*5CQ5nC;!5g_ZC6;amj6yInWQ)5i1QgTgy&MFM_k*=xL>sK7tuH6Ox>OcMO zza#nm+fTndrGxCfmztVMbW}3>K6!=pMiw4QYNonI4pD@3Bm#wnm9W90qKdqnBJlgn z%^Z9{^YM#_2qQodUP@XC<>KM-`K8tMxy9Aqe!yf#CMITwhsS28=gX@|#H^z7iaJs= zWuSKuxU9O`rt#77$1}Qp>1ypJ)pV0;2ilr@$)wJvy4JdCQdM~_F%`CX_Uw5$-=efUN;5RS%E!9N8Sz1! ztn?SooI88^^!3ZvUeG+}V&XE=GE|XQtthD5*<9b*#QWKW#jP#Rl^3LH%1YN4H=tAq z*G6@J-}eT48hjmnH&#|*&*g>jA4Ehgj9jV4O?8WV_$>QBtQb?d_IGiG&F=4EOxM;P zt~(g=vSMt2Avz`>#l>#jy#skh==LLd0v_bzg)7gV(Q~~Odd1AnBZvx_KF6E4%uH;` z(%KtyGrOA$d)sTfTTAeB0X` z?Cn5&R$o~X9~EO_U~X<`s-vzh$Sd^l;ZwnPB2dd=e8sFNtIWeAB=J$g!O}K5EId9k z0@T`sh$u^A6JV=st!y;a)Sz?$5RL~@P>%p~V3Xrg!^7k9a*Dk?e7{I4NPd!h_fA+@ zQ4`3*VN~5E%z|siCEhvSnlh0TL5A897m5 zguLv$;^Ok+f})1H20MFabuB|pZ4;0IjSS6QoxGA_lgkRr%}p%O>Nhs9fuuZyteII+ zhWx_F%EA1a_cgm9gf$F|?al3wHkz86J9+y?adUro_z3E{7y{H+R}~T)mwJn zkIGusyu!%mv=~_4aqxY7{FLFz3nu)lo=(d2%+kW*+9xH`BN$Ul!-Sz=!kWP`4U;wr zjo$ekN-oiE*EZthGN~v&^NT{J`@tg`h#aEK z&dI@#j{N-G)b_^4?)J{!&L)f)GuknVoqGFYu=97=^7i-rt?#>=a4vgW%e(6O^z;2jx0@#EKLpLcw(Tpxuyz=h^J1SzIORWsAmYJp~})w z;mU;zh?Ws2!*ZWLrg_7}X{Ke-TG_O=G&essRFIasFf;dUXMJ~bX?t~UcYV33DqTrJ za%pm6XLEIJX?AOEX>VtJYN*M@)OmAt>D&HZTVv5@v5$J{Cg1jccwTs6>XmB3KRhpP zsRuu-7%c->*@~T|fvJ(@ix*EH+`kW(3*FS?$4=Y@iIJA>H9Ic@BMbB{_yi>+zQ|&P z1}11!=T+@(&wu~6{>S&tKlV5O_+#&nKlam;V*Grn^2f$1gS(wno|pit-9Vm?kBoWNK!coSL4Ql^YkEhzhfpmmfsS--}A9D{I9P;>wGP zP{JZ6C#NJ30a}Ko12LPDl=A+)L{c33%jok~M}$P^8<>HAlupd7E~`Qcj3^qRcndPO z7BblKCMMQ0((2ke#yI1f7tD6vM^O65_uW6R^0(IaHrIC7mbaG|HWz1M!dpx8t1}bJQ{yYs<115R z%hc-#?oN*kj`mV+UcGkuc zvI<+r{{GJVaO>HyPz6^tpwj^XbOgvgY&1e%fMaBa7QC3`z zHZEYgAR=|PwAEEt*OpZ$CuelEL0KYRMh22~CK`H{vT{1crVe)YUY?!-$i6xp)#=YFuW0X|3$^v$|o@;CpIqSy@V16|7TG#g|EuS z-a+X1=ENrDyL%!=NKSyfn~Sf#y*Fee?3{h;>q+5}soU$D$DE4VF}iy8ndya-Q*$k33aD3@Qs3V@h{_uw zAuS*vyuWv7uz$F&wmCDaFgP?Jzo-h>s(3;wfW@LBAIZ(_Gt(>6vy0;sGgbASRdwy- zV{_x9Gaxb5HFTmdRaj7g;9N>ZM@~`C!O0r~4x?kz8XMXZV$(u`qP@MtT%G-`?A>Dt z#Dw?^LR5;WslB_qzv#!WLLw5}+=9?Bv9@yjAR>mY%1c^WULL-TwETw3W+w-b#r?r6 z3=E1)h$n(G;_n-VwQ6Q+wYLWk3(ti`{{6=SJTTsag->P0q>hu^qFV%8qCRb)A;f^;K=hqfy7AHn%pU@sVdh{H$#IIdHa`+HR zx{n_`IDO*ey_>hyzUowiVjdZ>y1dcZP>T?knzrumj`lX=gKcjue%oEz-J0EA8c~t_ zy0^D6)Y-JQI5R(m9Ie;ER4X+ms;Zy@esy%PMMVxs4jH_uf4*Dl{|+{s?|999%$7g6 z!hScu?{C0|?tfd42y#@AmZy916w|J5+`M_?`n8+aZ=#~b$<259@|DY%Z+sM!5qKxW z%KVyzo+T-|fVvI*R};nknzHicIxZd>i^QDJu*gujNDt({exN_NI(vi%MSw<>nwWqFuBW>XTEl87oyvoonMku(o{zR%pfu%mOw~ONlq^*DG&0G z$jK=P3yb{l{tKVrCs|cA!R+MZ^}k3dzTp(0dBH+M$MTGx6Q1@Jr-;}W5Eq?Y-2%`7 zQBt*d|5@*ooE`+M5Gpggen-zLpsHahrJye&E)Vr`Y+X;DvplEcpkw6Ye=ohcx=wEG zN6rJ;tW=6sIwJjC3&53Zqj$RttX7b9qGRk^J<_-XtqS1-XmekxbGruys zusSxeSW(wrPwr`H?rI`+!V{CpJ;lX!C1q84`6X&1$Hv2k^E@HEsn^Y#t^pUchF=l0Dz=!YEr?N?S7 zMo4V{ajK%K>*W!sscFc^`~LH1Sw&gMYMaX|XzJ)1z<#kZ5pVvvK5=jmJR|wV6@env zm3`Y@-`iN(+gPR^An0FR+E|#`g!7%9SezJM7$1hUB5Yoro>-lkT%Mg=nVsC2pT2VW z>ZJ?Rsc_)PV;lVC*I(`fit&Ip%)>v#%YzW)ofw|9x3w|W-#I-tO*LO+;M*Gm-K4ab zn3ehQ?bVr$g;4{Q&*S|=d%LSUaQ!=*JDYR%#=3nSZKxX}Xqgk+F_qQb(1{euJjf;>Dt4D|F=l~lrl zBZ!H_)P!VD4=+nIyRh&GZ9Ov^I~QMXkO+fgqvP{33jmc53+(fRgt^;$eyQ6Ecr*F7-U~+V{pVB=# zJhD2sI5{@fSlzTZv#_zevbL}S2o|ZXsi(aI>qkw?tR4d9;N0~N`}>6}D;tQ3f7UlN zkBCf`lG8LZ_lS!nrezeO2-n)&UR^^DiAneHiS>_8adZv#@QAT=4us%pR2!z-1&a%s5~cx40Ln`V25rZO{g-MoGmx)49?7lOdl{P)+R zH|{d3>LqAuTc@PtLbfC&tuns=b$4=cO-E#Wfs0?rp9jAw~YXy|Re-d24xoV`+YEes*bcd~tGQ zZft0Ne0X7Ud|_gAX=;2K;q>%4SQ}JT@rxHv96yc<0)m*cr_O21YZZdR804eyMJzfX za(1MrzqLLmIeB)ZZx?Mi{I|WezB-*65k5CPv@lHZbkMCTX@dR0M}OPhE=~_71jl{b z->k{c|F*NWwmht-sv^uUJk~#bV7!PNs1ElasK7^~nl06$53UG+4_xzpHZhQgn->K% zOy7D=j~PDCY3XRNU7kC49{S2OU@0)M&@(VHzhV&+m0Dk3#aHp;%lXqVaks0j4)JZE zdvI!e7P9Yu`GY_I5(m^^J1y!Rudw7NV4ihZnOW#x(DT0KdGY)i&68(9y=rJ1>lz@h z0d>z#SzZ7AM@b}==r?5~rxfSrlob_uBmeOSttA>r3^`e46FsAt=r|yjJ4h|Xx%uHi zVLl!nnp!%MA>n9aWTxe!f?8Hs*+HhDLPdy)504-KKksPo85$amCPhS8Tu4Y{WMo`? zd|E)&o>3AK zLkx;c+Su4!T3pUbEAa7)vT=f9P-K2?MO1Xg7iry!(yFG$wvDYF87XB*|GnZ7JA3Jt zfNFqEMt4lZL~vj$OU|Qo}Ii-Xn&ns3Ziy06-R1w=}l)c61IDmp8O`4>UHn zEibJO4US^+0;opaT?3Rh3Na%W8hz)^o);1k12YVHZdnyMC#T%jEx5LsGC4Y{t!rs% z=aG|NmX}*zR#xNb9VEynaO36;gzijCtX}>>9j#scl);*+`Y+N_lJqxOwd+_^XG1{e|@nOMXEKF*U>9(FbbtP$^MV#>~@C zU%x8q!G7O~xVfTiOI>(B*504D2M@p+_V&>P*W*(;zjgic^^2GqdHu#O_(BgIGSM`)HrDgBvjlk5 z-CifuGk9{S9i{1%sNk8=QFvJRU=)g17pK>k7byTCRTYGKS(oM2!hT@|s|zD&L(fl6 zb(0&GXXoJ+w>PGp0D+KK?CTgk_!9)o2%i7>p?-X#znT&r+1uTSk8q}^$LQEg_+6g8 zc=kc!y~rm~I)+!LPM?B$!%e6)J$`ck?tS_f4913bn;UD`0siHsaCdHcoS2Z3mzf(M zld`k*uLk~KPx`&Nu|!+VP((n))7hDg`So2u4Ia_FqGx1fZs23&9X^fU~tjLe{QQ(07s>an7-ri{EY3k!$1guGv1H~{o5bq#r0Iqoj*f+FI= z!lHu0;-AE2)m8LWR5X1&1A&JuE-a0YC7|~d8Xj$7ZLgrDjv?B-m}@B@{)R^wQ?@_L zsHy0fsp**On%e7N{Fa?7pna5fV0o(HsVmEC270jG#(;kw>Y*^Ru&ZjDE-xj?=Th`COYcqT zm2t_zHjk-e7S?9|VDj0aEF?CYnUUk_)jQyR z9t6+S^7GF>LpAH<!Bnrs0v-4vkV@=>t z4~*1Q*3{HA)&h50-_D1w(g#B61gw0um<#^plD)sEg2J+2!ynh)I6wd zL_{P;L?!TW@?W`5^}nxPv3U9hwV^IOG}=WOP}A0#90gixu$@e)Dr?NjEG{UlDlf0g z&ML~!FDomm&dVze4TyYv{}F(R7tWq$XJ^YyFR-yLuWkM%|^J|kSFwpn+-qwTW0N$quRQZrwatq?ZvpmMb^i-I#O7an$T zaulXIH#R~w-qGQik-_QVfw|E^>fQ07d$(>KKYHxKx$_V2Jv@E-G$@+xR?bxgX~O(m z$q_Mxpb&R!llGc&WYFkAmu9AHEKKihZ*FZYb<~%yE-s?t1ZrB8zdh6^QQ-QvhiX}W zc5GU9V&wG5*zVTGfm2>~vNUwEwd-u^gH7QAGso>;&F8-yfB$1^eLf{N;0^#-U@+Z( z@bcwLF$oD}O?3fb{wGhs6TJJF2B>bZGM+tp@Cd31vs0ssvy%u%{`xv7(J#ymClUzW z?*4jO#vAMZfBXGosHaUsQOC!{&Cbm7ljw&pA3rO6m6iDL;r^XREU%gF+`Nu%_|+>H z@7}q6{MeDpmo7i znG2*J1XYZTtTBEX>QY6y#kN*18L3&VO(b$t3%RZdh)Rgnm>ODP`aFsrTAJGL-n~~; z(*7ha^+ig7mq$cYR03+ore^j*!BKTpO@!#gkf508u$Ta!;PS$X#JD6E7tc2sH7Bd) z>l^Ln;%jVbtD|iqC#Nd#PVC)#+0QB_YR2vc4t}PtVV0gTj=r&haapmcMX_n+gp|^d zp=)4^4D;49F=e4E7I^ zNtFD83g`eJ(nhI5#ez=j33`&nZfXNdY!BjzEkh zq~@mQg4GDfM{Zg{LR3<0O!R^M{-1?;U;ya6>`?6&O<1&sx7WXIZ|!bwP|MCMC_B%s z&(EO3jD&Z7bZ}<4fBK)-fvKVX$$=hRXNCu;4-WOcctVRAJtt3|M8gO!763@o zt^q~=goTCm^H(XcPZ9z`g3K5Q%*jE=z=&_2miGC}=L|I!730ILsR>aKO8x7$faBGb zNo1ye?tuo{rfbVve|`2}&JSasof^{B&i67c&JwkQWsAke^%J+R}om)KE_^gd?0CT;#zJl~Ik4ii09C7=Ta>I(_E!u@lG6 zoI3|%=vS%FpFWB5@$<5Br+-q93^PBbTpG|Yiq;8V%~{-R@5>J ziy)?F3!R+*1)Ol?hbNkMgTQZCkWYfHPmgO{U&r;3(C|H!O^qX*_DaEQu1 ze#XJ8;BA{h$)L={w@g<|t(T0fMb%AyG9~aswBIdR(>cf}D91Fsf`(cAm58yJafXRq z$g`((m=X22zx{NeyzxIlKKl6|hkyR%_fr?{E12boeKyF>Egl}7hN;5&Zf|cdK+I}# z4r)66gHz?z%}|s^NgVw*TNgiH%y04z4G)RJh!B2Wk(&CJvB~A8*1j&vprX8l%1(L z@5~z2`A#5go*fyS8tR)I=$+{A9`B=!ba#w&w~zI7kM%;urSrv;r{~X{0jKEH@e?m; zXn+03Kahur^1b)4x8P-Gk$f-N(^BedZ=)h5S)H3T(%DRm49iUn&x%jlUSB}Pdwp%D zn^d{JJnw9#J~aa1(^^(S45hhtxNC52dFjV{Mq*o0m=f&c-CRfc7pwX2cTt7{x?^W| ztEC|eCQ9?O%G zFZQ~>eo$Cr30Wjx-(W`@M|6IR@(SUUvodptNolSwkYx|kH?nkh56A?E_p{`=3+K7m z+3(-IbMnLqnkP@8GChg#abm*7!Sv~qXBB1j!+rg86VvF%F3!#j^z;w+_Ck9H>}U0v0P9Iyoyq0zC~sj1S^Dpb*f!sC|LwtT#!fTVi% zii_o~)Cc`Y+nj-vwztemouiG}p+s_dNd6k<_XO;cWR zOrsF zY__0bw4lexJl7Ev>8o8Tzp-vBv&+`TlKxcMCWoto8k!?WrNW%U+o6)YNj>iF7^ZZ}NW907iiYonb5yj|-CMUXFz*AO zIHkTM%)|cCo!gAh=^V{XgI#T$&21(JI!e1cl!6^Mfn=hLe-$9j~I2LT_j5@Id$IAZ2QFU}=6Dr~C1O zcqzp8#Ka_5XIDaW!s;?W9skd>`c(m<;NhW!Oe&4E0Q_$73Zarw zR#04CSd^Zeo|&Enf`36Su+aG!AXp69(!5efCvdU+veL3YNy=Qha+#iv4yy|nthBaf z3iX};@kgMKJ+cY(RuC|g8=5JtUG2>s6=l^qS^0T+1uiZgOf1}{)_yfrO_c6|w)U>V z{Id4;p1h(m^thPVxENT(u3mq7@d~JD%nYwN&Rx1JCNBGwmgB*LS7$HYzIub^@l$3C z2Y*Xj56pCX$1ka(s;{MMCMT~k&@+&m1sO3v6x@hug+SYch9pDX?lBz;luN{o0^N(o zQoH9XX4i8DR$@Em;~Pf!G($u+9KYx|@<{65e9FKqD0lkeZTffGZ{(P^^ud175DXCh4s5?3~53cd@@*1hNr?8|3$tko2!lF_^B8iMm zZ)~O@6OShr28PDFy8BvNID#(shW%}2dBf7;`twf2*mI!a6GD$5&7OKJ1)P(4sGcYh=raZ&F`w#f|h2F5TL)K}1ZF#7-WpucIX?_;_2EZ79z7znSsqqAB z3^OveS)8MGul~AM{Ph@5A^P`mb2Bk9SCLT`;ujVb7FCf~vNpAn{3wHL_UE7e4r_w_ z3i9#e06*Wu`%j?p?&k&ouD`#BFX)hfKRMbuev$b4PUwpV%2TNsmF1OH<<)JCZ5^a` z0I1qp+PYd>M+b+Yu3g6|a3V;PHPp7^ z?O_iO3-P>j`wmd|wSe{4HTAZ24^Vo+@gM93{JzD>$>qsIS{IMtsnMy9mac-VB4Tm@ z>f7BNy%i0O3~xATUVc1s?BdyrkSOEe;Nm-V?!prq)>CKhoH%(MW5bUeyKwsKZDULK zfRK1Y3s-wbUmFJ>PtS0F-)Mk}DP29?UEPpjOiwFBogv6K?9AzlP-gq8A@B6fKVc-t=i5mt_V z4lpi{pc{AY9XWmkJs=<-pw?VfRbOA-SXEIkCH)m~3%RkqvaG(Qy1u%y5faeEbO)kb3bXBPYaZ+%_qUNosU8-V z+cwZare53eU^DgF-qP1j8fb6oBR7rq_g5AWU(?fGyL9RFsZ+?x@7+d4>nPJp211|@ z#6vq9NF~IWr~v=Px$(qMcPTNU>cZOOXrGF_>fNnPw0BV<#OlHuD@YBp)YpmiiwB$; z&SGzmiq?RQVC!jZD2xgUA=h;t6ypBhMs(1}0e-Tpt>gtQ4L2X}%jeJKr4@AajF^~N zK(2rA;K7}HcNv+OZ``;E?L-AxoyEEN_2s$vX#Y4u^_QqMx|LrRZskr9I{#+9V0JS-@pLxJ2$SKICd0W zHa@Pm&@ec4{21#iR-n@zZS3WwrN2ta`g{2q=;+HxNprIEAYSnB49d(Ytg9k*wsf>L zcMNp*0mTam9k8yT9o^B=+TKK}E3eAQ%tsXq`lW@rRDx1uNHo-6Z`{6l?b>xjXfWaH z*Kb2Xy_Z4(8_>)|A49;iGxNb~$j>Tlu5W2?B13+>zN$Vqr^wLA^aVYOxr0Ytb@R~h zcvpL0Lmg>&aE#R0($zP_%P;iuwfymu*PwKG@8K(;s!pD{jG^Z++g}f%YZw(vl(Z(bCe?0qyj)we?PNPaCPNrLhg)aClVWtw*dk9<$zj&dwpE z%r2s<;+A6_MY0HKP;*MfenUq8#zyq4xu3ehnS1Xt+r zZ@+_5hWr=BDK|cY z=dEYzs;y_GZD4cj=DpvK!hZh;BuU?k%Vgx0RaG??7FNF#62_>7va*JP;@bG6obd2u zAO8p+|Hz=w*s#d>pdbQ#y{@j=<%^dPIUrJf`0!y+aAZhuq?dPyo4YRt)7WFem6M0H zrIV?#wT`xtn5g(yNtx;CiS11)_?b#xz!KfvLF&1KiVW3wk?l?wXJ$+f_e~A<^|q3b z)sCYA4xiiEcHnc#FxWvj+>QgE3%A>bE7g8`nj4zRYFeAB#CTbsJ$Z8L8kXoWNVVR* zaqHCaQ^c4UOyz8vE3hkObpe3 z5fPmoM=OVVfh)u<3{herOo-)ug zyyfIkREBbzED$d!Se-d@=F!8)ubJP_K79(XO=tjNb8Qj$79!qUh)-Hd3N_dGPbUle z1v3JDY|I{Wb@m?UAN})m|NQ`G-`!pD^Kut^FNxx$s)Dxg2WdeB?4KZ~W)vO~dHnbh zxQZi3e*Y@*>Fx#d&2WrZ)E;A@{ux z$v!MFjQY;ZEI|!qXKOQ&5OV4A<;3_@fIadv3&5tYD1tgiIk+=0VFLq$7j$d@@eTBj zt*?LsvW;H+?$*xk=1$MRn9xTFS_X-uC$5}5|M2?FmmfbXAI0dmo0uJQ{_v5rhmV{) za`fWylQ&E(+-ho@i;K|lEC}=u!}t=E%Ua28o$X!iZJnT|q4$bbeSB(>l1YN5ORl<0 z!e<%7r!U@qRCbipbN{5_g;ZC;$XiIkPSP;q)&nL6K}A<$lZ9_8BNN994kdo2pm$`{5&}Wp$HOG@R1YiYKNPojqb28@eE+K0Y-^=^aVW zDMP^Q84#16Tb`L;nUI#}<{e>dM%F5K}(DK|g8b+{RH+cQN|v@xv!fEU#ZNGJ@;T-rSFW2!m~FtL^h@Y3|9|w{kXHJ|}Qc#tbRgMXdg7%K4in@ZVqL}E% zw_HNZEN^XWoUP35@^T^FUk|DOVrbxG=OrhnqSyk_jQGg7q`2htlq~e7K_&u7va+=u~&_u;2&L2T%ErpSX7Z679vS zPv3u(`Tgk0OV@56K71DAPJTUf^0&ihj-9w_WacnFG}=^4LglKdy0N~xzO10Eo!r?* zZbheNac*&Dauz?RS75TSdqQYwk4<W{n#01el6Db);t0tRJRM~3mc}o-=F^W(?8HZLJRoN;o}l2p>isA z*;yr&o{_m(07+KC4r^#?CuWz1#bs31kaLTxBM9llwBn4c60i^SP3^7iT`NnfPMtXQ z;u&2GA+?Fz*U;P@m6#n)KpDO~89@<#JS;6-W#u#xJivY- zW&wPlp|O>TnT?K)g`y%=no?F)1u}I|#pLBhe#fDxqy+jNC&$~-p`L-x_W7w%Kp&?D z1^}$uT$lrrd3>O^wWcN`p5W`^G~U;Zme4Sz1ICLA)j|B+KG@kd(AEM@0bFx;OB48m z6jD8+v989Nj)t1W$zfj?lbn=7CoA{u>{xRg_RfU2SV~okAvUZv4}Jk+=7C z*N6E9LX*T+C08;SrqThn=ESP*;)VI= zK!WN+`JrEQR%0qJOBX>mzf5@bugSy)(*=HI@3^9lx) zU%!cv3?cx9IXPbL_7^Um_j30KFDWi65lxEh%)FBPvhutV$Z_cFoAbUC_wtL(%`NR{ zr(n(|s3fgO0z0}<{NWc8d`|!2^x6C8EA~ox6PJ#zRKS$STXIQpoo*@o2x-Onl2HinJFs zE6|R9{s~U-SKxLJl$nkmK72~>i>s`nX&SKZ!!&>ex&t&oJ-c1Y5TNui!)l z4NC zkyZ}g=C&T@Hm-U`n96Obs%i2`LJlogZ02|caQ7e|Atj^o@zYm9p-;T;L@=`knsp2e zY!FO)LC2`3rW6$za{1B~GZW*H{x(?a+T1isRlTj`goucN&Q_pq-0kfj-M`03M?2b! zgtr4O7;bl{s~uK6(9zo0)&k4zAvYadN!`tjU8DvIsjjQ3zO$*mzO<;fgJf=C>hEUf zcwll}sfV+ZyNh2{NyCo^|8&8) zyK@jE;9z}q5t2Ajk%ZXDgvg-C?9?=j6!i7*^l)*7JbOxV>ecI);WZ8&`t=P9>+xep z@zWnZ^t+jfoxF^^j;0PD4nvAr}h=>?{J!4E;Ks^eQS^hr$>>R96KRalz{5t|>NIhg` zri6zET9|5|KY!N3+zwScz`F9X^7<%LEv&8(hh6|RSk>UDx|%m{XHX#P@e1? z3Gt7lbPe(fyu1I135wch&flbG77!MbJN)}`%(Oc6+tGjgtDJ-L2gn z?VUZHy_8PM;?%e}`?zMiF}88BJr+S)qtizg+OaEa;*D7mr-DRKyDKX}QFgbN52 z6E#gk4Q&m16`Geke3DiduiU#YEcsO@omet9KAT%iYUvuRs3v9RR|JPA281N|1jnRjm&T>$ z78KV*DhD*lC_-{*cwBOPDpDH^Cw21(C@O6%Dy{bnPQbWrXCH#GwTGI%t(=DGXL&7g zSsh(t2VH&ZD_3uT@`NAp(4j*R9=CP%arOu?v2mq+$zbQ=?}(nYm8*`aqqd=qvbNb5 zSy-s*CrL%fGK+nYf6FfdVT~&oDgza4dL{wEkC;0HxpI02Hri+Ok7-^)iX7sx_Z~dC zefPe+ymWO@@s*309zJ+nQjnvqq8S|#7#kY(mW_jr`IViS+4HBg_wL-iee)LWlShz{ z_`%JGsiIccMXK*;tiu%tUCq?Hu-wk3TIz!hH64vOsEzgy?rra`F3j7xe^?%lq9TXwC3ox5l{J2by zk3{%caWS*^wU2?Ij~X)2S$G`Ag5!l*im#hH*zR`b?w|<|bsjWC4nkb~4Fm`}Nu{wN zky{(fD2PprH?y%YUWLHuwd)rzoCiJX{Q2_$a@@LgJd}3m( z4|tDph=6pE!OH&8E5`!ENpWhtcxOv(L|`D~&MJ!Psqg1MHx3-*uhv$Ot$#zf`5ikjR3Z!jkNw^u!eCzP2?qV*>BJJ2y_B!~~z;*jZlRyLJ8Kv7?86{ms_W z-pb4tDtQ(rW~PQlQj*edSh+db_+HYp8XMZ8DT(nqq=x3goML+$$FI_=7UuSLHf~LI zjc~#B)eUuJ)xcsU#wB2k0w_h)5j<(Retv$e9BeetULxJb1p(e$eu1C=@yp@EN00pe z`^nQM)zu9#lCQX^ys8``i4C^XU>74!tzC04Wr+#-MoA9)RjYrPaHb@zsY(F=qT@PZG7GDp3_5H zS||=7#6#ROnPlSbZWB)??(XjHK5=(SS64SdI*lI(Y%L+XXzrit?3;!?Rc>WtQ_omJ zdZ~+Vw5>~snWMjjqqn_#sIHOS-Mci;Rh+#+8Rp~>@(hae2~G0!iR9uF_6do1^A3Tm z$=u%C#KO_Y+|j_;1_p`R`evFsWK}IAc@M$B! zot?m*2rU?BGv?%@tu>VD&hk8RT(+0yx0mL?p4wTQ-C3O5TA1FNpW2+CcDA$bZf?g# zZlJDcp=XvB7X+thO*K`n`)s&eMEC_Ii9};fvv)7vym@xEy)rw}+rP6uD?=37S~~7) zZN?T0g@6yhYPqRC@j=Ot4i5hI2P8%RIy(lNf>tni`t`$EYFv!Fle43x$H(`-?X9nU zmE7X_uYbU=T_6_zQA#aWgYAfieNAIWNp%h4?r*Ifx=+ zYC5_G#wK9t|MA-|FP=X9?bi>VKE8YW@Bqz}R=8ho8vlOYS)FXEt&5LIAMTn!ss8Wg zixW4P!#E=!9UP#_UY@^(y%bCp26{$1nz}%-m>L7-5fomLL)GE>+71{=io&^Nlh(6HoAuf$0nxWaW{)_ z*aMg>ZNg7-3pBssfnnGw7iN{@WabnUmbcVHaEavSmZ;byIaviB9zOJ6+JFaHtBDoF zt*GTcfAi-%bho`d{OhWk26~2v0B|ExV0dh}XRyDsKPV_lNyWg#%5`dL;oX~`KfHeb z;_UgO<0sFbzIgobv9-ND55L-to9yuL=HihhTR?ztot}{$CYd3{o^AvXlIX(ALDrV^u^o$p@mCVZr;7abnWU*+y+>A zq(LDt)YeXpj7$lM3UqarA`;-2cKO;JehJO!n#qL5MHXHOQ3Y#Ns~Af=H=KNFYa`kb z7=8D9Akc{T00e#U`)g*-Wmc4!_ST^XkHMdO4FhL5);@djc4%U0erX%aBj}WIfX$~i zM#QGuIe0-?V_=pb$*{p3hLQEwtvk^1!RYDMt=oXPFkr)_6FeN0 z^qt$cS(uqfVq%86dKM<84lv?zaz?aAZd&rj!W3XOOch38R_nn5W(fij*IiBOF!Z`EJu^q6=@gzm zI(+};moH4`e|`S_HP9S?4__;?^_v%PLwJdly$|nS&X3J}?Un6K74SpvXswNn3bC`) zBay_}S=m56x_uLWWmfD{z;~9BfhR73AR-KGEiOFmIk%=eTRSk^Yia8%=z!J z`F|JbgZ<^6_STfdyq?z4FO~i8U;O`2x%j`%9vp4XZ=N1J#(yr%P8a7_HG?5gS%*~F z=9Za<_8idRW3i08hyKvzzaK7i~<3VNN!_Pe^*gq^HDAe0GfMRX$uDE>Y=Tbt%I%I zxVU6E_6Ugx1KGiE0k>@n3(A+@?LRgj`460t}JUhd2r_7;lU-SapgMet-HLp>3K8_Y!PU}#)*&% zL}^?{{i2Fdznc2wzQOU)p^2514dnMhu(L3|wzqo>@M?N|ZfSlK#;Wi?g7x)%Htu_O znQz`iZZ;b~LF4AN8*(J6Xn+5Nkgy;x4^y%YJ3q-Kvn_jQzhLYnu4Ro|OqrEOLEa$D z&cPFtGv;SxhT?(ZMdd=jkAv{V@2}`u=a8*~s;ay9j?PkZs*9@!a;P0GJ(I0H6Y**J zwGDkiVTqafwGd1rL_I6Nidx>1lV3VLHh<}dOQ1y=TR0?Sl_q3VgeT{P#%H+)!*4v! z%E8CN&dUT=X=F!jV;dOQ@(YOp>ABB=og{&sgNGogB&|ZLR+OroiXKT$T|!osAfbSV zh`2l#uP{6}5OIK{4<3FIJeZhSRW#*n(#3kGd^~(Cuo;EYjE|evk$JfE^>heg!eYWA-EGt8 zp17Y3c6aV>Y_8-zAFwe0sW%y!*^_YEx~`|NmFtzJ7tAguRV@9Lzs| z{gCZNSRvZ{`a`HeF z(eCmc!otbG66d~hX4BafAshEbMT09@=0^?NwRQAaEWOC^y6jRSA!wK!BWl6 z*38(1UqUshbvdnXzi|98p=(V@MxUOAsOMVl>K=r*4sRy#EBvKsRs79g@NcY;F8t*? zWs^h$6VDQA8>km^i#taUDIAl@t%+=k@*woe0$r4s>Mn=l= z@(MDtWMhN+iqeD4RmczyH`kvWA3~UL{@@7p3)l*P)zKymYTiTft}SnWX}$nBP`?`s zvzutawBn_;;I-LFnBi>Cube+QZLiIN9i^3#QCm%kx`H&OXrO`gckW0L#re5-uv%ha zV0LqGN{I@pqgIFeQkJHcvJw-ljg4nVu|oPsbdW_%P!2?eug;%5I@u{N$j4~9x4MCI zD5?e(oDks~<`?Qhaok-wd2q6j9G}N+SgW10oxYjAIDsg@ z&o3h-D=Z`|DI+ZoDwrU@p^1)=0G}L5X>a`zZVP|=nK;82|bgrh;GK4Ajxq{o>hM9D!kQvbVd`(>DTHT2o^S z{6d2RBem7_q2jA3trZp)!X<~c0V^MNHkPjq5gIWwGb?X*Ukg(kTWbeRRc!}r2PsLM zUP&sd+F{Z0i7B~t&D|~S{pmS{-u~ekIYp~WTRWROu-TX#o1GY)D9JB_k7Zh7YDhqM zM^neb^c<-83d+hHoZQmV@IX{CF)&coRAWXe95=VDlsMhp+Yl(>IN#FPj`U1~0?)z1 zeR^T2f55`Z(a|%)%+9N{v~G22XKZ}IFDN!4HLrl$u(f$$VQojxBKqUy+n`!qzr~?$ zK!KC@9R`-~zDFkVPiVg1etQWhw3M7GCg;6vq?)dc4^K5VbRcm)IVlqnU=zcW{iBPc zQ!DR&`K_(FT~u1%ET~h}JXS`_m6?@*cv}`GCVLBOUwDRlxftskar29ZlnzH!&QV7W z$f3DBL`6h882D7$P<&{W3j~^0zu)}%Pw2uIP{rR~xQHoQ$tYf4)h0K$YIbQGBBPTB z&wl>!>Fv8;p1=5c@Az@&z;x%pY)#8RR&h18qNRUuIxe{&GoM;p+pex>p`>A;qG70O zWUFapC9R;Pq+_n4V=k?vCoZijLPUki@*~h%OJ9&6!3PBgti1%pxcEdQW#q-AO3=B-z`4Yv5z);C1W@J-yUvFPu zPcLszZ+B-mto%X(0v+t^eY|}P4Ge58t##nZYhUU*_cK%)5M)O@>*Z?mFl}jt$>D8IZmFWpQ z-n}|Y2@NPn&zKo*3-NKJMLTP%<)x%*DoWkMIC6&$>`E?n_8Zr(p&i4cgNNfj8w0Z_ zKYwCGcyIgQgM%e=U7PoBpX#ehPL6KTq)Bj?pC0}2=5a|^$Icz3iz+uqWC@t^-Z+TW#>*1!JM+f$;hs)4(iyeudsLNd~FFvyXS zlj0TNk(HIv*VmPklBq6e$8!0%-##K!@8$F7@Fsix4E&bQ;5gtr{J-Y=&wsso`LK>! zH8(yH5fYaan}TB<$YS^ceA(as{>R$FTwmuF-%R#ek5HghyIbBayM?dut>sA%>LOO;mC>F%3Y-8wY0vb{~u31hSCx7cpnV9_+R z0oV%-!quyHQMR-V&R@R2@Ry6y(#qplN%ano4UA2Wj?YZZZme$&_m6`}wm!G)=@Swe zlk(>0Pc`+;m=$Tcu2*kz3(APf7~uE`7Z+ngBTWdjWE7;tNLR02xA07M4$G(b=h%hj z6P3suLaL65n6KPWwjf`9?YXF8blxwY`36-isTp#Yp2y826by>l)qQB8%IdmO3L2u) z%0Zy=42ah^w$X+_-rg^xpsKpQtF>bwHM3}TVnJL=nO{^A>MD}FIuT8lB#&*ll&l)R zh!h962oo#UJ*NA}e9_f2;YLO_rvM`x$L+feSFYW_t&(4ez{tW*e~+1tp7G)jm*8T7 zI%Q&HVr6Bck%*L4^mTQeo!snfD1m+f2zB-L@CpwJ5AqN4@d=2Hj<-W-oU^+H+1%CH z#nr*t#=;sGgNB;Awx$+1{3LO4X-P>r@K+S&9vp5xKYj2FGQdXJtIBW-qt~cDC6Z5UQh^^ z*~Yfcq0zB9Sh7GoXkcJ!Y3&#hl?0bLaS3@-GR4O$*xA7izH>F@P4K^pjY+MoZ!$76 z1N;wl+t;z#k>U)x5=KsF?rz_?4SpuVl4>jK>uc(94s5JxZm4dkuc}v6(+-NwwsQ+Z z+GamC!UJ=jp$TSozU{qZFj+MJa5iXT z^S9UngM9Vvw?BNXVl-k&jli39oM92EFcX@X-zli*>mFXL?HH|uLs;)*4z;$kZ>FVd zYiVTT}j)*KND8|-4A~d2f zx7gF&Ga)Vk5>X2a>xi&uM|($a*!Ttp8ygw>c=;$PDLFg4Dk~}5+fh^$m36gru*p%9 zmq)Wk3|@F(5Ro9--P-u#43+x`?vZ##{XRQAdG_$+@ey1V_8uUo9JVP4T3bQSU8K1n z(O_qc%?oRwV*gLiU78&ITD*%Bqi@dMz%&xw`N>1b2{-3PhBlTbl%$EOa&oCLNdZ0% zLVSE*iuVeV8t87{z6ssPm8;D3_pV<43Er~?>K0q86MP(Oj+Oy``~3Ok`RV-FAi{bk zhkJY4y1^QHc(nKI>FdA#^+SA!2W0KI3rP?qtjX54=61E^HN%6$YfF$GJY1f^dG^1a zovp}FZg#Bzmc425lw6nXnfuSYb~~6UR~2DI6B?J9>Htj zokPFNzMDB#a@^en#i zlwdb|3mxr9|3Cs!hLxEmz=5J=;*s6C-L&wmW#wh*=n0pQ46>R937SrB!I+c3%*?bZ zhH?-YrD{ha7u|otKC$BI7B}8KbIKVOXKDWR%U`p4n!#w;RBX+iIT-*ZiR~He3 zJrYS$M$VLMMxodz#DhPX=JVDB6p9Fmini##k(ckir>Y*cG_ zNQA#%pslrSR79+)p{cu*o356wiIEWmYpTl1veL5X*IJrdoE-Owq68y-U20)LZ)qVM%t5p0@f(Z|BJlSXFyZj*p(fjrze6+U_aBM|P1#0__Cs*_Y9IHy3H=Tr^zT zs5~=`2Wl407tbi$#fdRQAC_l&5FK`w{Xkc0Jw7Gue3iL`Bv3>vXQeAnoB8e};FB9(VKfif_q5a+Kr*mWQ zAm~3kImK>hZ+-RE`NN9*3`;V?ACxeP1FRQ>fJjA6Pg8?zV4$X=gyWKrhnK0oHbFpC zL`aM%E&)?#6?KqUr14G*iwX;f2#XO3Y|Jbhb8}Bmfowm0`|8o`XlHk0^+;D^We|Nq{9<@HmgE(c7FXnE=47N~hlWS0s~cFFQ}7x_l-*6; zBf}%3LxUFPHtsH7*#COCdYhY?sjI4K>llhjNFj$Emk%FYTltCd>LyM;u)QgTvkk)T zP0Z}{^vT}7p*e*Wnb`%FmJW{g9ynzqJxWPl&C}Bd5oszKTHk&D-B-miD%Z%s90(7L z8j(H0%FGPcKFrvCt-Xl3Y^-gmpw{MP7p0_RktF3QUg6qgr{oN3_sC3PO;>S6M?i4g z*wo^}!j_#a<=RcgAAY!j(=OEBG78#2N$Kvf{OQZ_6C7mlC~!*_5|Lfq$*%-niDwWgq~zO1ITsI(y| zqXhOi2*3oSOwY*7!Uo=ifRG4*pHE0qQW^wQ71;e77#bNGnVFh<;S3NM8XXy%mYjhQ zJ?QzJ9o_u>gTq53EG@0G(z8>O(tW*s@^kW25>lH3cc4lS)9sz$B zJ9x?yh52q?zlL2B{p~xbUsN<$WI+6}V`8GGONuB(PXvktUH=o@Ush(HoNRB-&Y^zi zC)>^Rb)!Q9!2CBc(1C;pYin?;aFpib;T94Ulpu*~si~qWmX(xI%W4{{8*8d+3F6Y~`ZmVaZXE+NI8|3Rc85o$R#wAYZ31q|mR1h8 z=$N3f19PRV+PI!%wsQn>B6)UM&bVX0?HS4%_*oSt!Nz@lQucC zKDn@c_~6--^EZP-vp5bnv<=p`^w%}_7L?YHL(;#tJ2JYkyt5!BV9vA=}Tzh@3kE?rMSKIRR)Qd-t z&QDJt?(Kpm@%ZrY!QRf{7DCK=Cjq;3w#|$V(Lk!%8GPm9B=OEh=UX1;ea4e!6I1hU^y!( zDTQ0Ewzj5|t6O+T*y8kXq<5Ccy6BV5l9+?~v z7-M7W0ZU>3pqS*eeDKoUyaK=taP{=l(KF%U6*4w;L<(wQad}K^LTo~2b#oWBw$a7I zQxJWYiw}}Cumbo52=}@9a7kafeC7L#KjMldf(uQy_wo%135n4+GL=!%^a%(<;-sCO zv!0(LwscD)@$g2GC!;c(XTzA3aVPcXL7nhTkAreHeprNOy z=jRv7&MoTi=|RL&YkliL&tO|adudTAfk={4(l4p$MCI0Yjm4$qfdhsu^YFyN%)*+L zts96I@MuMk!;w==LIL!N8@F$NsoyV5FWOG$Pi*X*S-B;BJ;Sr(b4Y^NT;AGR+u7aN zou68qnV#QVLB7}Vs}G;HH+EQ<*ipj3o-l(MX{h--Q|_}d!_o~0+FRGI+mnrTO`W;< zW#|zz$1Vg9GY(EcbZR;}M#SdAx&6x#m}YxLI|b9=Xy94j`~~^6-(9+MhY=WdTl>h! zXD65Rw5+g@XtJrLlY>iaR2(h_WHi7|Fg-QfoNO5vlUQ6-=HcR%n3PgmRp;jF z32dsUpfvhR$pc%~)X=oHvX+&Rb#`!qBbgJ$F(Nb!gO-(SyRx&d-j0gz|^7Ez^u6}QBAcSOK0iHu_VD53qoeJW zrALQQac^#|EVtCv%#MyOPL8i(a;DYqEb4b*a(rQOY~f4&&W;S?fy$l4W1x4eue-h^ zw>&r1#g=SqY3||ZjIcWVkJW_*>x)x4sgVj&BcUKcrTS;kUuxq4cRh86{siZ0?t1cl;TMlAZ zXk41Gxk zXkX7@FAsk!M|UR|FD`5@?lEErXJBRl4UdJL8!Q&u3WJ?jMph*;Ijgq1rMj{ia&qX$ z>naKOJhm{uJU6wpy0~$CaQfl5 zzin;pF)(o4y>k!Al}Pdx;^$FUl;>e*mzE%L-oMX$j{$*aqO!US48Y-dm|3`mMJ3J5 zUE<>M;!;Z-T>>w{?dk$<{6B(x1@H=M-|xTw@#-}?T56Cebk%AmHXdb_?T?VR4jndOKOiDG&(GhGb z5U^bwD5i#bN{WiAs>)&nLRe@(dQzf}hFWVwT~l@Wvxg4=Lq!G!PLB?r9RqDXK|F3y|mDPGdxBgq#lfotieKM7J${v($vJ#^u+wc7@9Ad^7QZkJaEScdd9F|=;<8o z?Ji7@3-|YMvNcVOO&IKIb+WMx@(oCi4lggt>1wUfQI$70A={W5kiA1{QleT?$OcbCnt5*74!D;rNWHDxFiZr!|d=k{HED*--&s)D+v zj)AI&t; zC*)({G0CA}iH`Pu2qT6Avz0wyF(+XWaee_Y_{e#kZvQx8 zA#$TQr=Y%~9449Bso6G`w$d{4{vmPRJ|W&-p)rxEZeC#l{^9N(ernn#sC`M?XXMqi zjV$C)E$E-r5?t?7(U&Wnmpi-<_AtL=$P27j_!%U z!RhhIRh*Lw%NiC|PkP4ItQ|aWT)WG{#wS8hkW<#zGj#Cujf;rS$)k4E)pr$9n+FGH z8k;*>+xns7TUk3edGO@mf9Via+vI@YK{k;4Pbo9eQBh*w>&B^94dqJbo)zaqU;Zajo7U1K@ zvMj*cJ1Zr*t+`&9PY@(YElo9mJQk*=?k>)X@^aReW~f}8d})SaT`kC78td)dTA7D@ zZ+Uj&(ZMdj9MCX28ymo)tS>8`8tzBgqIg%Pr&bV@I5~mg8PZ)47^X2c!wzYnABS87 zTVv85?d=-r?gH@xgpHWcz`TsK!i>bsl=$YFiteTw`1kFuuY~&Ar$%L;98Aed5Ue2} zC%7z7stKZx3Nn?UeZNOiWe_JPIcwdm7K)5`N8h(se#8wTQkG$OOu@v z!a~)B`CWCTtMkhzJ1e!NY16|U>WU;Z?x?_+o#k~mN1e-;E+GlxGBo7$%vx$DNa9vk zHxwa=34n?uA|j`(U}#AuN{XYpp=G#z8#Q|SE&?MN7zG3bSy|y7!g&2U-oNWOl7rNG z>Cz>HC9$xu;kGYMl7ar$)5F`?(8`Q#MqHa7)6?=tgIsF7Ib&-!4e)x zRdPz&ntE26nq+NVGhIVleIr|AbJz6Ts@9H)>*@)y0K_sG2pn;y53E9@mFCsW1 z-q|Y*2H|R2Myi@dU;`?t8yS%8(laaa3!A8w9oF`qxM}!?CdDQdRn&GhG!LfcR0&JS z;Z4KF1U_#+T)NE4!T;lrKrybP@uB_EsL1HQ-&{bPSxH4>Lql&vV^?SAPzBY;L2WWz5bc2wo@`pAZKZAI5uFWCVvq*jU+;$!5M@0oInbBynj2Lt_A0K0bbF zDH(2V9-7)Z$ZiGtJpI z*KZiax!P*;b93O_OEEQVDKC8g^4!N!_dYm|jEuLgU#BgYu3banK$E&RKH6Er!^JAZOPCo#m{{4t;#hli+1yy8m!mxk6TN}1{(V*i3nF5e9t&T{^O+b} zwA8dDNU}ttq?Ck=xTLs-t~N;;M?*O&St*?U(4=qQxdqA^!##QtF%iV6VDZRtpB=x1 z(uOFT_JWQMwG2~S1demv=gv*b2@Va>MzF8G5j$jw^b9Pl9D)J_d3jBE8b^dj0Qy3D zyRa}xQB5CQo#;eFhoqX@d4tNXtZrgT@q`hpjsfUB#wyxm>~?katv$RWJpCi!(IG3R z3gnYSlHuVK#kk<&7GP=Rz?yn-rwXTQqIHtebj3#f%96%{4a;=JORm>3r)4>@^d zBXf$rxg8`(UcSNJ-l1N;k)B?mb`0oIFomU#-#!G<`IyPQPdHUP)yD!LLN$0 zO?P=kT}XJmhi9OvnXL@`tmSal*5%^k2V8rH?(TJ*T(B9uc^ed?jDkx1G0LhMTe^mj z!hlO=Y+!C2@aM$R@aX*J#vvj&UcY(Y(LKGocDS;6a&Y_vT*s|FkSyQq>^?j@d;R#y zD>zmj9zQvJaK5><^VdJ%4E|rAe*1j>>ci>z+ryKm*k@u-^76&o-+%wxFCRa@ee>(9 z*T24a@e#HE;Plnf`pNd;FF9UGckj0B`+tdAS(D=ze&yRGB^)$tW`R1l1)s$v)u`Zd&oM0 z=I)0dA;Az66edA@Ajr$Z!9kA;<{I4luH3*7eC@`iA1|@8un|Ov$V%bk7eV|V4y_~! zS$MOv!odMXIxjr>a{ArXd%@cU#_RADO9d8Lnv_DJ*ZxEpH1-DTqujCR;eGYME#oTN;`< z;8-8%9|lrETx2}FF=HZPlT)(`%3F)dTH@3536jd9QVO!l;OV>FqGOCoDK05%>**bB z@0lpCY)i*?1FPRF*e@_9Er*&{P?K9wmsebuk%8=w7%Mw3Rc+IxjACR27ge<6mDJ=@ zn=|vP)3d0RHJz;;L#^%oFroVN`H!F9|1!UJ@Zibwqem~Fz5Mv%^@raOBY*&(Pk;UG z(;x5Nq8>k-p1xRI*_&G4+c^U4giNtd??3+a^_yQleEj3pn@{IY-#vc%=JC^?H+Rmq z56^ZFo*X}TesXdSo#4#e))e@kGwc1M3&Ru34Q-Iw`X>JT5CR zBGuDB#@O0JT2TwRvJ!G?qT({#{35sR&_hd%)j2FO{`be%&)^v!?Ckf00z%2gWZcuE zBBMRreL#J5uya7c!uUi%PC-RQ9iuW<#Ac>sNfJp#Sy@I>%Ff0HE+2*lI_pad$W?#& z^vR>+qm{YY_J%rOEZ%Nz=pgt2$=TZ-=Vhzjjy9ycJU%&|8X1WW4@PKvHMIn)pQh^C z_{gxDvXX(WP84zuhJfV6s^X%d&WHu(FbPq=&ra8Bic>S1`RPRiJst2RmY23FYnu|%a`Or*t7eZ zD7KbbI%Y{3)S3C!_U?h;@Z|WojPU5xikjy3-qFRS-KCY?#kIr5BZuTL%lun<}ci3F1=sxdmBSI7EpgBU3Aqv_e)+RcbbzlE-=m z=6VMf+Il9MyT)o;`pc@jQVZ$=!_xzzQe%@rNU4vD&kYSvb#(Ue4vI|3D9S3V&V_Xw zwXv|Ix}dbKwx*}Cxx2ctYj}L|=Z~NMK&HvZ-#>r;+nb+%JwFGZ?fK5Z>62&g9-h59 ze(>z<{LSmvA2;?M4Uf&i3i8#PU!OdC|KRcKmF-8U)5DWz`zOz~vGzQAytVUietCCd zZfkUE9Zqb+Q!9hxi%6BJZ0N6Q>aS_+EvxM+sccQjrbfhO`GzGSw#nHi(#|~?`dkZp z4;>SVlBO{@8$bMb8HWOF%>P1*BBf=4e+zW%#~<+;CH%E!|NRW_6toXNA3qOwPjfSi z(2!6WDH$SBf?|iugCCBk$_h$Y3F!c;;^I+MR2IfkT!O^G!GR`0M|W3EU3sj(@AP2* zWPg8SX{oiL0oFpO%K6C&Fn;Oo(m`&M6c??fuDUQizP+~kU~dnL$h@@7s*>XFwx-SH zMQ;~Z%*^%WP;(N$r8Brhccr2~vRFha}8$ihPd z>N4QNkO87QGu~qnB$tE;lSng%drQ%krKH8u56sWlntC28435%C!yWraki z#>8huCFUe$mB(Zh1V^R>MWy(KBC0F|Gip>!dUhTarbae)J|ST#fsv^`fiX#Gd5LL7 zm9=dyZr=D)O3SJk8rYhcIfCD-tZ7P+P%EX^$JkmUknOvF97 zxqF8Og*Me;3h#v3Y*lq5Y}}}I-3=XME?&V1G&j&UwlFt0Gq-VZ4Y0BIEv{%zPNz0> z^wzcYmpAp7Hx3t-BXAHwepNw{sSe&T0TEd~LGfT0C#P4$r53?$CONY_DZMBzqckq1 zAThHfHG`U%RhE`lk)4YLdUZ$F*!I!0H}8L2+c||S_tE3msMf;=&oKkPc=Peuvv+$( zPv)ST**;!cJ1np5*gZKvJbnfZ(eA<7(#FZ$^1;OXX8-64SdqP>3w52NCG~xkjlD3& zsc#v?X&ra1)PkDGw3393@{suah~xsFuv9m{SbMin9aB4bC0$f28<*gH9uemIe5~+! z;ug4bhaNjDz%KyOzZNNoY8a9s4#Lswi@51eAn((x8GpLMz`y{&1nIpxnwoZ2wj#o! zpesX(Kp=>L;vy*yGJ*uQLZDIU>*z^{OMn7>;lj6oMj=9HWn;s^O^hhq+uq*U)P(v% zTIBlDB8v26AMD4SqMY2TKV4yDWU#Tc@Nsw9-CRB1+kLpdf3&l;wX{Sc5ItNR(Sn!2 z&{$epUszb3o%;eZPYrc-1Fb?i&yNGG8k+%NH4LI*I%A&?#vGiG!?d1maR?>ynS*2%jo6l9$yzL4_nudZy$er`^d#g z!^y%-NPvf#kwH>a7z z%goYB-#}MWU3+nSpr$0Jp}tVhP!stJiYjtxNipR`=`a#mn;XUCV`OY?OtvsFv$ZmH zB%4?{+Ijo?g@=d5M@A%<6&L$>ceU+;(GQU4aqT9^@ZW!T5ow#Kwfc&>#_AeG1SZ6$CMTr$ z`vf4^6eL?}et8(;yjwf!%Ia6==6YJ&kv_aUHM6s}1_icAvhz!u!;=a#@@fhy znu@Brb1QmMit2)5a=b!PZQa969sKOvA}rm4JVH}pK;aji6CR%(8kZFwpA{OL5fq&f zm6#iylpmj*pO{*dkyDwPNiDDG*f=;lfBq3*GF}{gMs% z>cRZV-oVIwO+)|G(th9QO8ej(M(_HLaquC_8+#E;RMpUzR?rZgUKWyA5S~~Xo=_AN zpX(o;5fGW>9h~Ce8EInYrElS;s%J%%ROJ;UaqtmfcYFQTy(?F)-#}<4E7S+~aPk6* zNhFexqb(sS_U{gh7ihA8Rd3y-L3Y<@*e1Y`+l(|x0;{5&g1U;j1d-(A26IX`Od$3}@b1K>wq|K$}s&v>hI7PzL%(X!CQ=AX;!o2Yje|TU)!D zP{NI8yQ{Cy_s2V{OVUF;?5zXb9MfaMY6^1>A?fdL+gup4H`5OD_bJRu3-NI_)z^_B z5pjeSMU%bHE<=(a3Jap)YAC27=w)KC6JGLi(XqF^Cp9h!dSToqNO(6yNU}1D6g$_5@YtY$u-N$2 zK))a)jRM3-PfRH|xy5{~an$zse*i?UK_fXFO*hE=a_9C69eF&+z z$?1hr;c-?L_PTmz?jHUiW7|1+m{_|7Mx;3UCjyQOiYo|-$@PoQ^oz-{_l!2D_<>St z;}PoM6Jzfa=js>b;uB-z7G~k#Yvmkh;pj*42yyZbck_#L_mA@qPQr6gRJwmyT6{Wn zWDc~b7lWhAd&e*KkDu=yJzZKmf)VEG#?jc!THok$+u%GD2QYyzZR)RT8L90U!Eqpq z+8mQn7LZWn8J_MDp5`B!PVopgbqG)~u$R{|Q_{7TQZtZMHNg3u3yv17@R$+eK7a^6P$(D^F13kT3P6e$jd7C&n>Fqh_%} zni?7a)Qp<_Qn>?Tef^`oy(4|S!`)qjU7h_MZT%fEBW~+%25R3p-`h6STv3=3l@Jy* z&{DlJ){+w+*;ZBd;%p<*$NSCs`Qg^6j*@&T$ioH63ewUZ_HI?BX=(~``kE@#tTa`~ z`=rIy6t!MHdG(KfAiVUnI3;Cya=_oyHOR}`g<@r9V5qI4{$+~mN6-Hpd5yORSA8w+zE-=4mI^Za;s5#0Opr;p&OIyXL6TULNp zCnG6M6clf$DxIE~86WDlwzVNjNMIrYT^8&x5U02W1jXg$1w={Q{K7;jMHw}1qLdsL zub>XuUeCf=2TbX(_+n~vb1MvS=0}D`)l@Y@LSy*(p}Y|Vy!q3ms~!&a;G2BKOi;hL zZ{r!4l(dvod`cELd#Xw*f`SAMNd943s;Li3o~Ks;+0raC)$x7Id|fKt)fTU%YxxTF`@XW8#=1$S!$U&s~b|Z4Jhbz z#x|Zd9%1-Z3x@zB8!v0O5NrEj6I(9>OIH&sFAIvVvv0JEZgI!a@RL_| z$7i?ur`KBsr`rZ*DsilC?4vgK7gV(+Dqc}nY&4< z8;Kj%!B0?}Dn_HV(!Ok}#ECMV?vYCa8lM856 z9v)uywiF(29vf?0C3yv9B~_53`FLq!RSgw&O;xp|*qHFZV4z9<-oCJW@$>PfZPxzu zpYCps(=f%JoN%K!5=4b2h6d4jLBvgrj=^r|2-xz$K~hv~ZbsVd__&dd9(-DGW3jij zEy~UJcJ-v#SXGo1>~5^>tgUY0u?iFa<+VkqisqIPFg!&gNw(J4VOcymG%zuM_3jsj zMsM#>cjs_-_h4t|AhL%$+xt7(``Ykm>uG82Zf-#f&WQ`DE=V74tB&yTSe@u?qNdkC z{TmVdcz?AhC3?EQbEK=r-OdauV4{!^NldgPGkrvO6OS+H{1ke@T9R9W{G%ek3b7#>UE|p}K0U zr@k;Zt+BfJ7sQnR`Ucv?zLxSJFQ>}F%%aTnzabO(tB~+t|6G{t3=QyARa6oaA}r0U zeE#&VJiqi{eYQ9^`HQNTQ%OS)HVcRq0XbPpS)C-Kh)o0_Tv=re4n6@8u@tq9WYx6X zf};{LN^9#odwNDO*=lKNrluET`(SKjfn)ylt2ctZJV}z0UvW=dR9`>P3vigy)Y8w* z%q}l3b9ZvJvamAHHHZ$0^z!k8V8Pctz{bW!AI4}3s^P&A;2sngm9{lCRZuIaMby5| zp8D$Aic+kM>&l9;getD7sA;NiNy@IMY8fr4ZVQjhD64G9EvQUN&J75PbaM3ta;2hX z05=H+c0M?`vT$NYts|>uil3N|{6ZHm{(w*5^EkA^{tH9SeKrm>!LL+LEI4q%U_66zinhYI zeuI~r7o#0!;F!qh)P!WjuSZ8l>+9*ODysrmCYz7}Kv8V$^|bVGj&rnkru7^t8D&K! zNQ7|d>S^o9$;e=_8y_2kl&*>4L4=ROKZKiyJ1i&&VOkYR zI5m+H8;6ElTTvDk5SSDjJKEnjH!*>)Da|hcuNZ%RP=Y;OoSJH@R%WMg{>A2(R=F$7 zcx)^$;o!V7KevoIx1$xUyt1@tnzrg4o*W#)w&)8(gI2!-9kj9??Cj`kZ|OyXOKS@% zx4WgOvjxfSjkURn3&Wj*&84B9P7gOG7sq-FQ$kGiw5NJo`9xqs56vU^;5b(kY4A8wdp_ZV0?d0;Upsi9{gM3mwaCJ0N&DCwHoxq&JflayXuUfni0 zHid*U0JedCVe0BS7|!YG7{WsQ!OZz@6a^WhU#?FOoL~kk$R}7|Sp`*vE7bcwAtU{L z3v)0s*jSpH#ekHPndRc>5f>ic)7nv9R7^Io=xql)RRb-XuZMqnT4sGsZCh#pQb}Km_CgmEth~CZvW}I4Hd#sA zTu#M+q@XLMVkoC>ETe8Lt^R+BdJCwy(zaW0X5E?lfA-(@q&poCF2UWs(8Ar_-QC^Y z-QC?CLV)1z1VW6s_Fc12(KD0vu3CqpiX^~3kL_n~bwv#m=g_3w>aOUNlCY#=x9~KV zkW|N@L>+5i6(eU|OAlzY3d?D*@`{Pb>2L|j!{PyrreCh##JUrfoc{ZVpa0hnkeep@ z!>CLVF#%y<6U+fnF`%uly*w;UO%h|H^0G5xBEn)LB6Bj*jr8@cEzF$l?Gb(P&#<&GnjS^k z)ibyZ#sqWS%qm6JFY%0kr&x#50w$o9SYbr0P&5L)pvCfL~ zcd|5evb2uy_t4cQTNqg`&Gs8;shSz+2yt^8>8kPbaFR)~)dl76Uq4@-?pT_cfhXej zN>6-v_~pg34{x788mS|b6ioD04RlPp8p`xF$aWU?zOHsAIvSiTjA%jMym1p|7Wnbq zxp$udV_h1iKe1ST`#uu`v#5ad()9S`P<=sqC^ox#nk(Asi-ExCu#mmwnHT3ra7=rC zvU`5Gy0`wgqqcl`X0WrVw5FtJvZwL#`O~Xiej*S9u7CY?`Fz{n%3Mc9ZK7u!PkjDx zG1*fiB_Rj}BkaZ?;B)YaJfOqm3ZQ@hcdq~oGb?5WMkEyhUT%7t+P_@;13fGJLDK|zHF}}w06=>M?Ie&=&P@*Y^;MOZHP$z@HZ|6jSCto*RFsv&wXmrc z-mS&?d4bqL#J1riHAAg(O*5LP1AVL0d}2P)J6Fg;SV;g%>+hbj&=AYyzCZ ziXw7)GAbsBq`uMFaXHm7nbl#5d4@KgMpo|XCQboSIR-Y~dPJq{rKWE$t)wSKHelfu zyGI3}{rsOFe)`8h{)O+uPrpFc?gm!mv3L91^&8kQ`q#hzgZtZ6e;7+OC&5g_ig+OB3!ZH39B79^&_-68 z1d4Ff8iM|1J9qX!! z(XGlz0%hHOXMJsbX$d}sfbG=C(A?AnAc^S`6AhiAu6lNAsPxZ@w^zU{`}qD1IA)N2{_C$V8;f1avLsVYqnGEeKEHqc;oXamZ_b9> z%g`;y*d3xb%$&UR;86*RA|hjx^xl115lMNHik^g`GCPm3xHOVnV|{Z+uh7J->|!Hh zV`DSqM=tixUf_J8TjF8o0EFJBWw?Kj2Ay`WS@4UBP{Q_*9l3;sg{{A@KQG)Qgr&4K zwH)o;?ChKZeM8*cJWNe2v^4ac9K3r86}z_f#^&~>w$6r@j;7|8`j*0+f}AWYg6AYA zrY6KB*3~pZuGZYtibq72T}VbuT3J=oOjb!3q)kX!&GQINvvdwo(yW|{)Y;S34aqR#DHe#piS=}KH!?KDHody4x*$Klo12HHyQiUnAs)Rw zeT)qZvF%G%P~zg?1olZ%((Ei)B1bNTK?yIo8fnQ1n9w)YRKGeugY+Q|oYD{zgM7VP z8|xtsnU$Ihn=Slnk=2uAWel`*vF<7=Brq}D|7cOVC)8shI~Yh}JTGqpG~0~A9^16xIt!^35Hc_q17j#k!5F_Fzx6_ilh z(uaXBRtSj_xU-)K!I&JifEj}1xvd@rFM@A1iqN|9(%SNp8pu4Alqg9{MtR#+WT(G> z`SjbjH+6;ag{cvqj+QRgMpcE`PbRvp4YlS+dsO8V>dSHp)6yF&)07qDjdXS9#wOkE zbWHVh__*23bj;se9PB(94fS-~oO^V#wRo~QWo<$>Gcd_Yiu7@}!K%K$tF;iH(E0Ih zxUYr2hQaFG*!lirF@APvYTd+E0?b0_7_R?z4ee;~8wo)_>et zVQA{>T$mis&B4yZ$PgXmH__LGUfHX&gPo!YELH?Ln3 zftQj+fBF16GbY$TT{Xr(`rBWBy*}T2eZKSjbobrsr`but;ELS3bsMd3u!r;uipRb?R09w~S z{`qfAX#NMKXeHKm{|kZgKiHJN{>M$o@L*sHMm#j<@!zM^t^Wfo&D(eG{m=jU2N8NH zSj7V-vuIsnw93lPhQ$GNmdwp8$RIAtE7;jMnj4#-tt2EQ?BVWdZf35epzMLony6Te z!`0O^kRE$FyXx!cLy9WUKgi6)Oi5nR!qiMl4H}OUnriCmDk_4I(H8-CUJ^U?SQkPg zOI}9C&dLfp^BO9uTIy=Sem?NlLBxR=)3;9_-@bZzc6f*(EMzePyuDy%XJ%joVG#Tb zZ^JS1*6oD2C}(>+xJ9PLCwRFy73bviw6|hBwEkof&1d*@pq`x?9*PT%Kr^Q(FBR$Z zXsRl;)>gGtR&;}>(bm!rbC`BY=eeT; zd36`0OOZl1Q&Q-9&^Cyf5%3FV`C4d&!zsL|NJ^OBTu-mNt{hImUp`+RtWPzSq+^6s zTM#cPBvh1^Sezd1WNj7>E1$XoESx@>YIC%-&{mPvSJ%=~RZvlqS0G7hDXA}w4Sf0d z{LS-&ftHG{+KR54EENUG;;g(6Z_ayKGgRcHLj8P{WEA(-W<6aDEKQ8kVo_Pkz)0w) zAAds4i!LxV70sVFZo#As$|m=2-N#M%A>G5eqS}w|o}KM3PY$&0Z$D0o@YK=J@OCl5 z?a|rJ%-7YSwk#hmFq=z{j<#0bU!K2v_3XpD^X%l1gz&&8)BP_lo_@GI`SS7d`}eQC zO@-D5=JrOG`)j+<%KP;8#oSnTRA|`#=E~{*nze}*bXVwTi8Vb|PRRVSVvQG$!#o0l zqT(b46$1e=62F*~yt<*Rf|jbTxwB`ulDsT_Q7J!P0;Kr;$DK_@Q67EKt8fNTT*VrY zUO>zSZ<~smmY+vZQjDapWdLEWl-Q*Ftemvuw49WTl7iCC#`dnJwx;U(s**}LE=7k& zd3pI{rKja&=VYa4B*!H?J9{ZBsRw%bP7aR;`vyYj05cRU!s8F%1C}o#ZuB$OvVVeX zI4lOx)!wKmc*20j$-i4gb z_1}>MA&+1p$Pz@~iRsoon&1Dpb^9(25ix)G>DnK+{`oIh7opWk^q_!KK3>7=*Kgn% ze1!YK)xC@O4*VbgC(2y_AFuz4e4sG^(#2z3s&cIL*W*b_G~Fb(t#02|iI!qV0nPnxMIsbD5+ZEmTG#SbNA zRkA7$hC$e}cXn_9uhu`x+;abZD0sBV`HFRi1G{l`ty&NaiEt4L{E;6RFxDfkVv?7LD#M>F_TkGj$#H5}c@Ar1Jg!u+|IlGvf7~-}c6%vw_j9xS| zv|*ucp{lB>YhY^c#5JAyIa=F7onZRTYiG!m{MJ6kO=( znu>@@flq`r4YX=;)A+A{{1-9F`tiqqLkS(-*&lxbmjM4B1UtL{eOt7KfHh)Y?7xXc zEdU>HqQt|iEnw^hBYqNc7}k(~bQCL4ICaON){I-Vd)|1H4F{!K^6G%}t7nMVI(^ZwH0#c5`y{^YCbGY(NhgbJ(hqBGkMS!$UA1Xm6^Y93H|~P?l4mp?Of8moqUuFgrR{ zSyI$kU6~vkQ(ab)o0_DjrRnNmTaupz3MH~-#M!>Kt30_Gu*Ct8LA3%k8grr!Y=2=| zgq|}R&ec%xD6cImtt=|6C@8EbEW`zV2{U8EU2QGKI-7PDCeLuN@CBCoeBI0x@Js;vxcBF7n`igW8W@c3xSvzCXw1}9tsWAGVPj_QW@B!lr=g`R&&$C|mQ&Qz)c6gy8IXng;|~b%UWY%yjT=xaxcSFT2Wz{G zMEv+L*w=A(azJ#@)icsi)nZ3k#>uUxWtaeZQ+8%aK}8u9$xA9B(FJvgn8=v$sF=v$ zNOun(Cp-7h&D(Z4FvRFq&=T<^Q9Fq}FPOke{#{A(2V3W9Y z+`SJeOW5lYz5xIH7p9rGM$aD+^Xj&PI}a|dQUyE$!gwPZ!gv8F#1JCDZ~&;hOSI@2 zL8$oc`YnX|fBy$x{~v$n7?dxBOdg3mG68I^fK9={!KtC8>*48}7?0=|Z)*ujd|6dR z1qW-}AiqF9h@A2A!O@L)UP_vgkpWb9EC`^1psYkT)HAfRwA0tt#njJ0&lmw02<7MH zgM648Sq*e$w2|RLVyL4N9u!nx1w+;8=TA@Hy?O;Oq7Qs}us<_C*3$-~>c^GECGCw( z+39Kh-O&1L^>TOXX>ZwCU#+buZ>g(WdOZ8~<%>^m-+X*?dHMVToVTiy5`@U1-frwB z;3j}cD=ifj?tA#-?&1W%VvEc`M;n0~!MD4ub&QxRO+cLl>KW)BCxnLy^9j<^Q&*Q_ zcPy*FtAi+4%gT^uVN`^{Q*L@P9*4n=gimB=C$S6&z_wynlb~l1qh3fD1GWtSFLLG@ zL|(8Z5qTRb%Mg4~^CELbn3``bw5gGlU!1RNDv&o9hIPmi3Nm6OaS>h)_J<6# z4D_^)W=7g7inBvqBkdJEjalYqHhs+*)YMc64N%@-U}R!pVdmlDW};{0;o{NJHQ?pt zxp(XCPe1;Q&ti6lB?t`Sb5bDV)9&tUi|y{I(QY#%14SiyVPQdeIg+ln3Q0!N*2)+j zpY07*pq|!O6tq;AyoJN%(@k`qKYx6KHh5iOw74L@iH25ja?bn9cW7Zz`q1CM!9?x( z@rTRPm#1r4@nOj^LAYm%35wzdE+;F8KBuUdG)Ntw1l+lOj~^B|D(ZrwQs`w-(=+ji zND4?OV1phDL7MuOcFuu8L6Nax5wW3RuGS{(4_O3xc_c)HND`8`+Y9mYSt92%)OWG7 zLS4tmz%0NoqNJdnk&+o35&=3^WJp+mpTDh@y^WbQxRgQu{&CT9(UCDxkueFesS&~9 zo-W>Yw$7n}F(E-=MLD_9fADm2^6~ObNz2U4%uB%{dRkg+WR$hJwXuOQy0TCUH`LRS z5EGLW6X9fIg9?N?Ss4}{{Jgwkux^x)hOUdIiW&%nAgCkN`Sq7y2>cQx2+ALnwEyoP zd<-oAh#u4p$jsike&glmVvO@elfZy=^THdeMSu4pbn$iiMuRuNmAsBm4KJ+UcIBFSQj&&nJXm8qVtp&Us; zjwGibCx^)nKfj=oqLPl5HWa@l#U-`WHRWYx)yOLD&MsN0X#-tdo6CzYo}MDz#R2q? z{l0ts^8M>qhdW#IGqb>NT0%U+D<-W7xBwbLB+8}S%=Df0mDd;NCwsd)8>L2 z=jHhsLhxu`UvGQ6g|UgJt7~LvD46`95z^DpA}ax>OO_;yND9tXRap@xN=$_-Jn%sId8CgZ&uw4s}7i z8+C36(q_;j35Eu78lZngbgOEs+v^Fcb8~GKc#_!h$H1r#R?q}~3oD=yln?yo#ryk> zw$;T2x?AX~>8g;^q9gnqO!U+>hMEiGLjCHC)9VUTx*N-kv>>@5*i+Z{=5il)uowGd zWC_W|@fJO@@#l}1qun`D!b0q@Eu^NxIxsegMmp-8EYJYj=x~s@af}4drk5C*H2Bfl~rVw>dQ)+D|0b;($iFd z4mm7b$?BT?!cqo?CSW+DDUN^L&6{^_+=A>k(?b>>Ss651H2DR@GMx70Qb^$^P=2=oyFfmH>0A>N*j)>fWQj=EY}DA{y1bt1yT{6N*PveD7h3iJy~ zjZaETNJ&FiH8w6LG}6k-E;t}GHZleZPUxMwIeGPUbtfkz;D%snYFdSRaA{3$L1lSW zeNk~4R#NI4TG~7No0>Wb3rg^NT2@w`kE}Z;uB5me4Uf92rtF-;%*-rkE&BTfs3}+S#Hr1f4$gF?>9I3=E9TOe~#U-Qh>z=Ikm0HGWPm zF;Q_a712r7)zZ_2aDlR#jFb$h%W|@^yu7@Ks%pwA*t*4(7Wh?HQA5l%($jZwbVx~v zZ*PLj-rUoJ{g-D?0W_RfXHQ?8oxV6bd3pX6FuX!BfP4xkp83a*r>05^@>}ZbUYtGc zY-v8+-oYvX_!St`W~ZiQrKTKgZ$3Rd0P2BUgkZe!`N=VePnE@po7tHu$u4&GJ{};b zd&803*TW4oEj2P3>Zyn?;BNVQd$u(;)Pa$ol3ZC_1m|@ZJ3BdPDPK<)u%=mn-?3q& z(^sL^$IS&b;7A|FyPXv!MQBV>;%^6<%mgvAwFTT}RKY|DCgLwa)c|;jnzxRKyvUr< zw!*ZxuB;q0qpIS9as=OkTnwIYfA6ZSxj1|jslobLLH&AFkv zqKs!pyU$OTbd@DKYCAUO2H(AY_vzh%kvb_OIxxT~1VQa^b69|jori;!oBbgasc7%f zEsRbrPt}v8M7tW=<3b#<*o&4d>Mb-)sO~)g??pmV5}LVcnyP9VYLb$YaC$<%cjNaP zpkq)c0tT6XGk1^7FE@I_j(DrYAx}ycJ~RAjQ*AQ-*n*gOhztRr&nvWOIE@ zVNRNhvqN%hq_?|MZ(BVqya|VeZSy?z)+x7H}^bdh5J3P=g)ZWqE-rf}#n*^Mure~HGRSpdd4Gs@C*R>WGm*-~Y zdwKc<280?JnuY~OhC`DtI=&Q+16w9kVZi|*k>QcBX+xHtlAMm&7Wlx>jp60y z*3s02nV^)Y2tPNsfPjz&CQ`;GPz&_+@k>j~$^;24Jqt9FsL*h5C%oOg{QZJ+vkH(T zWBdw2l)JNANI(dlM-Le^Cku1y*ysd^vSOg4jk*=<1F{NAh}I-o^ok`##8j1m3}ujP z1$nU>DyXJR_I7tK$q8 zt2r<7=PSb16?ln;b4?{d*r)(o17jm1c}C|7nKO0|%kpzDfs&Vy%u9&qswyf>j?Rem zSCf|(<>xcj(MSyQo9ODfe2V?#zKi`$cn`K!#ail_Esu_T`}F1e_xCaW=2C)!O%?55 zzr2IqGv`B4s`w$51LdjTul?Rp*Zuk3k++MX5HBAJK+HL=Lqi+#R5$*7aQhB7JBO4Q z2^C;lb4PZ16bmaGZvPJ`lMi(1@87+Pekt2SE_Bm}2HOUDyL;N(4tIBIs`6YN94Cgx z&{}A$DspwUNr{h}7#esyJscY7)z#L#vo?Qru<`lBYnU0qBjxSoo}rqewz6t}a}O~4 z_aBOR%8S$0S=7lT8I=VoOtg#}OIvV1`}*bm*~$9z^W(g%NM3#cbXrjXtLqvvF*6H` zN(za=a+$=zC#s}t#4jq%4t+dML1fmc>BaKOnqGdf=~+bqL6KoGDY1!ZHRYA<&5dLI z18GSKXpN#`b#rt}j!!MfEvl=iOo@$0#;B~Mj2%g`yb_XLcUO1l31T&(2MZjRX70)6G3T zG8VIyq{O6vfS{m&proYq`dTDkmHGKaZZ00azQHlk@!2^A=^1$yRSnV6@t$5jPL594 zUPq0I126K#xcJDhh^Vk|e;;3W7guKom(Y+1*vE75@kB>Q=jRrtCZ{+fvU+&MM#tx5 z<;F$F*gIfGVQph=hi!KdasXaEJwx<|-JD%4O)b=5A*G~*9G;ttOIuA_O-&6l7t*lj zR906ZD+9;SKlgF>01BD=T9Lpg%}?f6%GYvyce(q z_MbmJ##cVw-(8rR21v6~lJYV$A)tX7L40`VaBmN6@)SrivlF9}BSYmyg+Se|=%KwJwX9jtXHHHSYs>Y7m=-4}}GU zgm_^n1L140%~kjbkJ(w7a&dB_H;MZjjAqb|rnygj=f+Jw4*u=+{rQ>k`pRM$2-cM3 zIN3Q=6l4bYdf*n<)m)pE8aLS6j(v^Viu|0^#AiqQ+siXY+fU#HOo_4odv|RR0Zd<2 zeW<1P>(`IibOwa4+>zeBJX(7+fq7ZDue~sr(8bA9*dZao#!wiesI4ax&W`5nT%1s} zghjKux`vp%tc;R^s04{eND500Fu>vykrX1yLmSpBFv`Z>S(dErEIO@mYA5H zk&y@0=$87%=DHd;2PZpAD{p5nFK0J@Z$E8avzX|_y7J1pii)hH^n{ogsQNqFyVzRW zdwF_$Vb*DEiW1Mk&LPM@1TB!5@ZcaHujF`my5vHny|TO(m@O-W|=BAeHjO^H$1V=|_$fzbIrWO~LVw(x>59a2UK0ZF- zq2aiVK++AGs6qaL7_WdljKto-*4En68cT?Q0fF8?sk;Xf`{0lu;MdC9#@*Q+?1=QV z^pN0Ceb`PIn>yJ$V}&XzEXvc<%gDe0G%7@41qDU2lA@lTk+zmLFE@{vDB)ryEh!D1 zRmj0%hU@O+0tyrE%-d@#2z)P30m-9hM@P>N56%x^EJB!!oFCwN|BQI%fB^O3J~H03 zgM+g}VEGULCms)pgVzAp1hkKiE{+ZnsqrKrj01zAt>s1NH=gY6yg<}G2Cruc*4W3} zTjz%m`oR|@+)Q9d1Z5j61VK3pIkUH$8yd*y7hzp@xVH<{G+9pW(d0-2I>~Xdi80Z^ zzCJwMTq=r6kZGcYD;2TxYhZ0|rmdz9@d^tw1F$c`1A??v$z%OJAZ6vIrBK#;2MLlS zcJn*Yb8hWv!D0gF&4iLwM^hcv^U-a_h62)Nz!umC+X^>dP_1f8iqX)lECP7*0N%3v zTm;{e+-wG#`_SBe$Uv{7qGWBPogNz=;p3K<7*(E;`0{lB@kC3gyWg8vXP`e#4s=X) zmGN4_!U6)2ql9)94340wi;KH|-h6Q9Hj?o1p|L_x z_H)ua++EQUtgj?^ZZl(j2{93nKKT0i!_m&h$9HdEoE^M>eKFA4Fy7Pp>|pcn&4s_d z^fu+G%PU&y>7O5*!vXQj$G4OaOxTxw`GN-Z5>RZZuMEZWZ{I$g9c*44@4bEX^u_Vs zcwcj6VV0Jzt{{kJva*hDZsvAQu%;B0l%j&+D=R0DkOT_{1Y0C|Ma4kZN=eG#7nCrw zaKKi+fw8q;V0fT^1V%q~mGFfxQ&v>qX5&zjB^m4KBPoRpNRU?m^t~13l^{nP;^&(f zn-Cin6%`VR@Tae(mzk2f`Q%AacCNm*j-{zlR7eDDU;4TSd%JsE8e6k6!NN*TPDppK zam>uj&C4ySscy{7$c&DN#$JP{u%NHEUqo1Vct|J`-IVmK^wg}(^bBuLKk!4KZ;2a- zFW5;CHSqBd3JQvkiH(Vh1(va7;jwEAfWawyTPt2e_+)a(qJ2Yfr zWApP5h>eP|w{_6g*0r^B!q)`z#7N&zQBF}n09zUYAUmP|jJXd;CPMu9kV8^T93%=I zZ5wx-6-4aK7y?cEyQjN5P+NuXIP8Hi$^rC_ z3EQt-oTvNySGHex5*A=5`+Jlp_b6|{yYLpcgZ*s~hQNJs47~3iZ*OiaEx@ny*}*Oa zt#A$7I@#Vl+TJ|aTth6z*3mZP+PBEgHj}{Qlv!1 znd#_xIk@Gd6@A@OsKz%q-b7d?z7Y5@xiY1xW+sF3^zTcqn_3=GrDe13o-@bqR`08k5x=V=IsLH&2arWwb z7lQMzFAiUy;n!xZsiv^3AcLf!2=<1k42=Es99=wk`Jmgw0Rvci7B>2aY{DdYSv9?T z_o!7=^juus70KFyVk8w!J#Bq6%#ITw1D97=U0MZB0;uxzv~&=vhDw;MluUehTtQ|Y zibuHZ=<6988=8`pRABKC8y*gD<))^W<`u++g*n;Tl@`Gzv!t}VIy@o@Mm()e9q3ke zcJ$=s6<1eOC&b66BqRs<2Sr6i+gRHN2L$u+@}?%G;RlPb8y6c7PY_QxPe+*fdHI40 zg6-FkfZ(XGNQ6$zuPjZ?1APM_BLGjmkbpq&|HFeq)X8LQnMq4ap^>enrHS&~)7{6@ z(<3-ANFQr>dirn+La!JGB05@H8tR%X4_T-lJb-uw=ugH*Mn?Ju7&$?<0!uwcx_Uu= zzU9S*Q{%(vDFLu3Hm};nSM4S|qFhC7`|{}tf+@gwg)EAt7ZDBN4TM7&<8H1&5o++01_SizIPGNL&iVVMWD)syWF z0=YYQFnkg=(^5hM0%)kHU_%cMGu8}IIHL>?4+=0f&8+g1-V)7-?{B4ufsvV>_U_G_c&`XIzYsS&m{geYL$D6`MGxwa->!kr$H~gU%gxKf z#wjHxNtRcysi<+cH&;_uSC&&`qGxb$bWkD7iwg^2uJi{u4LAP0hXvrf4>-95**Unt zu4-$kj0lMy9qbt!8rfcl4BSFfRj#jxb5Tyx=ED5K%qY}Lj<%kp#|3xRSC4fyEsXbl z{Q|c0hi`wq`|$S2(OBC+U8Am`2DXM@KVN+R>-(D*C%F3j@%-bv(@*bDiqk?gWmR52 zJ^%3T;%H+Ldxc1$zkYs;T>5nXNq%~Abaa4-lnf`Y05_kYp0T;5rM-rM5%eOZ<<-Px zlr>H4#7Ig|c!r>ep}viyt0xbi7&_9hH_|pR@x``$avEgS)l}5bzJs8FJV{<%MO9r{ z4V|L+m^d&uFgywi40dyL7Ka?9giLx;YEn$Bx2wCUzFt&BcxeeLt+L_a$*KxuPi63W ztF5d}PtEl3@Q#XzazJ;~7aChJndzB@Ir$|;mATpZ7{fu+2|I~S_O7@g1o;EM?vY`U z2=Qn%p?hX$V+TiRbbviv+`%6X3J3)1(bWVSDCDa`aLTt(aY5t9bbG4P0J2#{_9vxLGq!s7lq0W|1M zAwHs{-NT2(Yu5I0Hi*yeuLIp!U|GQn{(c!=xrzguu*IE~CwnVT_ScsQoBNG5INejO zm*I53OEKHsUS8N#;BO+ZKs)#^1Y6V%Dny`S0{gBz(+@vHgYq+PYskR!u zUvqpb?5&D(K%Pt0R8@sVC;~M4Q3#Y4MkbP?!Vsm&O-~^UbCr2f`dv)^iWcBgrz|v%= zo0WN2T`|W)dI;tqgdx=4fOh&H(7C#fw3!wr0rd2csTbzQ>9^(!LjSMV`D ze|)>XFcskGVq6S@(fbf)RrVEE2(HAh4%If4hx9{$yroL1pEs4C!(*;%)sPeL-^x(IK!jQ%23w` z-S~%0tXRy$s6|m$Mqg7sCnK+;y}POcKe6KQ;IQO)IHkv=rlg03M#jg)W8RdOngb1n z;)0^Av`jB|AB=C{$z^0<%*OH%p%!Z9VWHt>=9aiiz!lEP-X4=y8%ry6!`$865sqUb zpjaFc5rV|ZD=at|7tvvn;4!A9reC}ED|E@Kt1H{Ox(0_v+}zxtRRkp{n1evx6Bb=k zs9{CH5)qY>kOZ;D*2)r@p`$fIxffDg#7agwI*eRjoj-l~^ceQc#3RlrddMd)P>`bC zbbR#ugmTcELMIA^>d_JWfM6+dxJ8)p5l95|aMqTuKHOhlfl0wtlmx>Lki<2ff%6yT z`UyfOaR?YLY&@9<9=D&&!^ocEW&a3X_HeY{d;(os;+bvYmBhv7;$wX3Z>Rg2$+^*y z`3We%HPn zuNzUdxuzP7Z4Bd*;v-!h95PdrAYcWO#xPJ!tQ56js@P9RuVXh5Y)N805Io7wX7n-$ z{1R;|0>U-OpV4_H#zs}do>5&{Ni|`%QB+-ASXub@>3P3?XF=^|C$K-ud+Y)wgdSHx?)MRu?uN4?CD@Qo)w!+BFP( zq2dmaNz}P$QZZ1`(A=jIfbpu3h@rM|fTx#|v=Z(NBw?k~qc>l_eg2N@^{?;2zDBC5 z3Km%@d=7U-0RLgFs2DZMHo{;2j0ZkMo-T~Mqb6z#>Eu! zdCnk&$YVzXI=OVzw0yi69Fw5dWoHGtg#q|l=;!eB3Mk4cVKj`zE^{NJqT+HGAi|y! zP{n{1{oWFcmMf~d+q-kKu)JT4(Qrs`ICLj1Ei8S#{1W3+F<{Ef$ny8{#dOBa)jc9K z42}cNb`CJ21r6BR!rIvZMLfc>KNgA;V&lC%JmR8aVj`n~+3?WF;K0C;pkPNkr_i8K z5Er%7)$uM_8ChWgK@v$$UQQk=Gz_$KSfQ1Xk_PK3$j1jt^yvH}4qhDXAFeNp3ki6+ zxt$;E9c`_%GBb}3^j(}BpreSUE}Bs|&xoE9po;Q#{{&Fo+k1*S^l*j{!P>ac%w)tTxvd9^q^(JYJihU3>g!?eQ$k zb64l4iHk?mE5yYN4)NrpX_#WK5T7N^%A+Z~3>V9U)9&Qb^u*)Iv4zPI2)ClBL|Yhb zrGl)??3Cn~&=54Mk^1Imrn@@Y`+9n0B*jx;Re=y06%wc@D+lLe6nDTTge8N0y`{y) z@B*}~Vebt=4?K@t8onn(gqRf|Oe_WxBuPhle*|yt&mS&dUtGMqJS)Z6l$z?^t($jm-hy~6INs2lg!B^=9X%fxw}>F< zK0-cjeyfWc-@ku}@VBI+dSIsO`u+QN3|}#dJwM&CFx62YLs$|!wqo)MkmzLL=H}*u zHxf7UGHxDT0aF842zq?^_y)onvzWVgH5I1Cs42?Dh6EmMt=5-kH0 z94t@0e!B7X(~EE4UVr&=(o_ z`$AV%Mp$rRd<@G?-_U&i3w#eE_yWjC!q;a8UYu+ku1|h?_pGHlPh3WZnT?a3lNYNE z3ToQYvdYqms_KSjirP9XY+N^P!a4@tMBsfe($F*ULcfEgK)7uvs~Z_xii(P37lW3D z7KBI4xMAC*0^*;ZzOIIj4M<9{(Vz(>Mn@WGsbT1ebg938xCS}+lAt!>SX&B4jX_8bUHz%@wSkn-?FN7&5+ zGaun2%RIyyKQ8ybRQf$u#ZH@B381cb^Z zMMNb!aP9BqiRb|MTpaGcINpDGa`@^L=ja7AkXII17$Mcm1{?uvP&I6-sXE!& zz(&mJ9#Ltc-aOsG1yRo)@1UezKiXOY(vce2}eiFB0)@2o8oHuTGj8Q)?5A{uC2u#E+Oi@ft8w9>U@v<(J9f1+KuR40 z9bb1h7-Y*xiGvz#YN!YCE9gVIIXG086(V5dgEZ_5mh`Hl9q3_H;!D1-v@H`10}P-pX8UX`ZUA1RL{1RwgDU zS~^Brx`*@(94xH-oZP$|T%rOZN;0zY(j*oJ25CXn7th`T5HFr>D@urvr8Lfu3HsBw zuWy4rtfRt0;qk=B%PohpkR&4|CBpKMm6MZ4MjjQFvZSPpq=?e{H}5g4g6u|pX+d<5 zcU@_oCRr*rBxGl0F37{aqo!zWW@!DFDN z59Y_ZYhImh?yb!qZ!DheEQIV#g;CG~sY_3p*(DLgm;A3U|)V4)zYl z`skh+VloRZEB;B?2!N6dNlHpjODinUx1um_erkAsZRr?r+gN?JzkRl|alW^8j*H#R zr#l;0k6R0~JnV$dHVkU#$A@UC9|Ze&ug}lyJXrvocb4XNRu*g!%UOFCd{lU2G%n}eUFCwX9jy` zV9YnrgEQ6NJ<;1aiO0U~sezv9fnGdL_H|A45l`av(}Ug9cph&V?0W=LUF`6V4$h4M z^25XzhX~aWJa+qm*@=Okv0g0Ew-2$D7vLGX^GCwywz|Yh`AI*A_ zlq8t3;GA%>vs#;()Rq_HWldGp?v4)7YDSWbz>0j>!P*j#@9%8G6c}0b-}r?XJ0a|R zHS>kG6{QMpz@9=?3-DVDwpAI0Fj)%DBoTj!6uJ=GIv640=K}r)LNLb71{%=xhgGLE zBQlQtKZjy9e^lmk1c-p=+SJlxQE=72}SLl#y>s8F)u z2Z!D=H#?W2jGPu$w-i;BNovR8`~xrkRfO{?^%GPgR&t z+}q1@b0bB}7led`#ic~~1bLYuvcSrrtg0;}A|fCvfJMUi@Z_zfxu^T4K0Y;)!qLVSo_}+( z{`upx^Udjj`htbQrml)?T@^WcDrzSy+q4+(-p0C#?)uDx2!B_H2w$Jmz145u-d`Lo z&h$5}&-Aa(^!7DZ4YxN!jYm~UmXYZpdRY?iu+q>`(bjYH4Z?O3f~|mv1T6y-sL?lX z--TW8Pe1)~_dd0pj3N)eFrTnE!$Vdq5nz!4q!jEC{P^P!SasId)V4B3D^J-#OCu~G zAU7x1#nZ>y)jGW4{YG_ZE6qZJYhI_bsfJ+$^5bOsdAAf&WCr1-QV^~L+ znV5oi;p*rL7im!DcK$98CFmh(Jn;ae8^mKHc?7`l$fnvFrhnKUHlcT+Z zriKR4ipeZL4=+eiI+_|$;bEnP`IE!_==l&$+MV^&t+msw^%Fd9uj27&efeMt@pw8EDW;=sK}O2z?9>`E*g4`;%QNFEvy-cj zrijNmV2REWQdhe89QBp?hMdcwoHzk95=bELC% zw6hhD<2@Z?-R+~@?IWEn!yPTe^IdH?BVBDn?ahO2O@r-?L+wpCxS+g%_$-i)1AxQD z9=^K79iYEwqQ8gm@`Y*kSnc6Ia8k{hAmq_5`> z7ef~pR|k9a0)D^t8~7m@AvIK$0dCNA=xqZqn^Dptk@j(O?rv>H94D-3Ize?tIskiMGL1-{kYNvlr)^{f(tjenD<_w!9F1rh}p@Ej=|gFFO|~`q0yW zDFPP@J0BKgxp|<4rA$)b=i-7okT}0+XdlN1;77kWU zeomh3`07s|KV~HRL(qU9!z-4DqWB{$rlhK+rm1!B-hH?#P(8TMCm_(@(K9zZh>`u} z#m>dSMs~c} zE#49c{oyCL_JY|jB`GT)3>_X3@P}dTgxw#=X;R&P0EK@?J3Cn^2?rbNc&sVJCAzqJ zqg91^3-V17p;0Nx88((S#>S?>!C@dxfj?|-2PitDZ)|H}joz1?rL~`@4|>Q+aq+1M zNzjnN7#CX%em*{azJ55m+PdZ@ruMdWcnkV29xkqsn8r?l3RwmERAj)pJLdGEO&GDaBXRSb#Zs;F)+LHWNvdF2%TI*@i;TKGBdV5 zH@P`KyS4auYjJi1(0eqsJ~suZ7G|c^mEfsB@$hvuTw-4i#Uj+mpI6Er-9kY#p%hbbQe)_W_SQWb8?^;5FYMq8Ek7D0349V zw$u-_HV(8l474@$Hr4eu)pj@3^flM_HP>Bz3QzXq8ZT&V=x=TSr~z#topRb>fjtD^ z1GycoIJh|g#e?uGX@yNmZEHo1_V>^>b+eYVf~3v8xtA~CRk&2#T9aqGeet>a6%#U z>j=U#oX+qTKp327be@6Yy0T(4uTcCVldmeuNBk`>1o;Xlx1u1gG%puK3j|8|o}iMw z^C#-rn~?6|W9OC<6rqRt&;u%JNM7H$OZR|^lZAzklUEiZiNuk_-n6PB8H>I6jcTiH z^l~x)1q&H9z{rFk{eTJpp}u#Yk(LJUVy1bR5S7r`RIROv$-XQdH61S-7j_n~6pGsU z!GrrEVxs)~{19d*YiU5b9iB%Rg@{XuONz-LRT%APUYUJ#x-nmt5z|{&D!|FJ{djDw ztz@LV;bM37{j;4f?@vCx-f1dKL?VdXfRBy6rK5HpIi(vaTfO z;&A!Rv%`|IEFCLzRP54ZO-(>p%RtA>MoK{$DKrfoAsg~1aZ9*^y?BU)Lr{y3kyTtu zj*Wv4N)*?A{S8~X5M{!O9M4$XHOJ@MN%mfP=lgv7Qn7PN4z8m`Mftz$nwv z*3uFi3RuSjiGl#EtsOYJ;0G?v&4PD?wlGFK&ri_)CC;;BSSf(GxJwL4QLAoYin_eN zvbenn*iNkjv$JE%(<4ih!wchsi{nFAk4sY{t1}a;vlA;blgra%t9YE5SVDmb#kL`& zxX5e~>^czj5GcpH+n`?E*IWxg0d&9-0w}^C^4r;wLF}GP4t)m`;9T@6(|jRb^y8td>W02z-x z_*6qxS3`AoeRXGDWlvKzfKNo{wx<5p#z91C${Ffx1#;o>*MlV>h&^KQr>d;EqO_tQ zr=hI43cvxI9iCWu*_9x(f(x6Oo}HW!>g(g~WS^UsoC6+DLVQ|6thSmeVsTq75qz<| z?uF#J1M3M$lIsytF|_S$M60=$z-+_c;B9Nbo?uODeRXS16^dUppOHLY#oxNpBDBH5 zqNl{)eEiiE3RZ4O4*1X6D)Nf5;^3+C^1%Oqlaq^;$c+Wzj>!w5c24vnu+PiR%q%G^ zLY9`(RnyXjKDe5iwTZc-xuutb%ly>rA!Hw0TNh`$xLMes*)GT{ASWp)CM3+vM6aYE zFC!)_Eh+wxo}P~CJ|`!KygUi=_2MEDh43#&Q?ZV_D)k>6|OeM{SDPG4;C-B=AQt531MP9 zT=#C?!rg|Afu*CaR8~|7w;%>;Y7Dbz@873|YT=zb%=C2X-SVxpr(IscG>f#%-5TQ_dVh>6KdONYbgIX81_Wg#akR#ZYlL`q6c z-`vR7$;{RsqhY`n+8x-?xlcudcJy^<{zHiE_ZxR1aLmeuPa&zkd;2ysGph<&%|Khr zNL$m}!_(h46jWs36uQs>*yuqkI5-@WNK^)!4$2ek%8$!l%MURoy|By zZNN)oe{*eDU1fW9DVBU%D@!|TD|;GhdK+s8+Zupw1Xh?}j`tB3^W!j@@97-t?jX>L zB)JEG?LcHixEyS2MxX?EDWGfVZ>|SgL09Ogsc5GhU>QILe(^l6JL?EU6ButGt|4*= z2wwpl=pF!si6BnI?(W9gUYK%Xj#F3NR$b9lSqk*kmK4+$<<%7BmE~qtB5}>lEC-Jw zC$l6w1M=gzK(QYl;8R;th)|0_iO6VcZqis@+6YN*EbONx>uRVX52r*}N|42bx26&v zMiinMJ4i2FtnQTE~<0xkz2yfQNX z@%8!ELOmjD+l7YnO_mQiAKn1{2yE;NP|6^-;YG*uO(MFp{T$_39( zZfu5R8;KFty@q8rJ^DH2c@KCWMt)B9Xv7;g0Zhk1761;zcaJ2K)nI0 zNuG92nK2RG_L|XtVNW+E+saaBd)wxRnzG|U1UU&0QQ#DfZg97L{rP7A88;J*r}?=! z_YxPY)WF&nMG6t!(Ucx+3@r5=&GscYw2KVJux;VH6=4XHmS6r4BTe$fMf&Y*?|=rBlZ}I|wXLg@ zi#bMa#5lHyO2`l^na^0umy*7CxZ()=boRsh8%ZB?bX0Q9=+ zYkHe%23nEdwhXlao~=MAl3U`mw-DC1ZOsGi&HY%MM^tS>ctspOUx@w>vNit41o@uBdqH{e3x!^k$=2jQv zQ~<3x8KqfiI3<~QOfSwz!70MYOe@Yx2Z|FT!^-orFlnvCTZ-~?l9NJwJSn&<#D|eV z0f@`>WkpSuWzCdS92ZE)aSetQfZPr^*Af>vuq11$DnsVnP+o%9AbBQczJP5}0oIO) z$Xk#{XcuSh_MKC(g^vKrg_-H#0E({>_{2w%Wm- zHqhQ4P4q?uJCmd(MTCW9;5$H8G}O|DiIDyp|8cp%7R4?c*a2+K$x3dMMkkICoL(=SD7SD_uw84vUF-1HbzEj_^(h= z(cHgBPff+m$|f!#V4|&Rsb{o4JG8erIMP^>9p!~Y8hJi;EFg^mdNvNsz~QY%eV+h6 zBQ34A3VE`p_3>znxvq{l*i?LiYt!8;Gd)YweP{d2A6}o%^wmNJO+-Y5pI?BNmyex| z6DBOQbkHPtc=ztTUw-`!6f(%l;cLTYLQqh^!NwMxb^#t(hc7lVn znG$yQ3FHzqW2DOKM2C5Eji5PE1~=#u6BGzy@VY<@ThUW`G!1wHr$h~lUT%NaR39MR z37jGd6BX|0ATgks7MB(JV8yRImwzBsR` ztbjP>g^k2TQDa#l;xaZ;04_l63TQ->Y$X!iD+u?tGyuGap+MyoFo}Rm3AKo-c&4?g zw7H_BrIL7r>{4TSQCoEx;xFa1m7SDi`wH4u=*A=71uWyqma4Lb(t@h|?2^n>D6AHy zCE*mLCg!IkQXUiXQxXbN67%s)YEl7SkdX>#ml1(DqZ|PmJGt2z$x-1Ic{xb75wauv zeUShI&Q*nZfHO`_aXy}@D@D960!XjmeD#PA5%B@u+R|cN)D#nU07}`5$cxSu0bWY; zDwp6=<`MgYQbIypEXbK3a$$V)@Sy-Fr;LcGf~1s|qN;_yk%zUdvza+c=8}x$&mX^n zNC7Y4rRh*cf6M?>GgeSvezr%!L4&6I(9W_pIU>aN4h<)(`2&!0cM_*zSoEbI5bo^O5KcV>EKdio~m4t4ApVrHh8nQfU-%*@Qp%*@Qp%xroIRwj<|67ih~D_>}0?B#k1kTLChm8&NH1oeB(772Mn)9C*R4Hw{HURtg3|5FhxTrxC3kG!UIs50=eqsutseJO&7jn&&&-YT z&W`dQX(he|}i9 z6yX`o>@%lN-MMx1{Haq|m|Hp6+uK-KVZ>x>X``m1hWEI&g%wpMEye-V zaCyQWiOD;y+qZ7(X+o@blpn}5ILY|coomY%7O4X+-T0B&DDKQnN6B`rC z#^ohOL$csBG1Q+n3@0woCqCF$!f!bD)1t!I>Yfw^qC*H)QzAnFa$0nF1_T`slg8#J z3-p0p%1Ur0ESW={N21!y*r-gB&4d_G&*y`L#CW3LjF_nO7(Ng}c@yvpJb4v|3%>gq z-7yjT6odpkrbS2abNT79%n0~#XNGL<{(dZCrcBkIW{B!fOAKpY##ykU;*~uK~0n{gLx7< zD;aFVf_Xx0Xb=q}m|cpTMdewBU-(ycv5q#-nzb0v-MVz?>`{6^7w%oYsw=PLY3Ed5 zT0PX$K07jsq@k`Pez5B?x~cw_=GU)g`dVsAvJwZ|>c;w7-oJZ;MKcx1%Dl+k#K)`G z%3oIu^K}XF33=SxUYeCK+}CNUt35qD{$g(G&8wHQV~-Z*pL8^pUO01n$Br$>P9BA% zFz7w-^Pz*sjw&fDW+z6(g!nbr3eeS;XDB_qwR_hN{5t+q*xk{7`8Ny@D4R3+$e_m> zcG+CL5)%|M+S@YRQReSxR*@D)d0hGSy@k0EI!ckAP9NS(Kk90J{bIPiEG;KGX#R26 z``4qdpZ6Q8-f^}tZ7a*_t;zPVHdK3XCoa%4J2oWD!}j8-6EowzGsCs}w{JPTXJ1OF zAFZm#J@wtSg}l}LM3;%iJzQaNtDpytXEn7ks(_TOFjxF>$&xE9O+0?$rrcFa69WXr zEZI4DDy;d-aMUoJvY5LGqEr|_G0q!i>a}NnTeOuL0s{C zY7C*pv&k{4%JUPCnWB|+P(lp_a>ZN^sje8n89+yYl1fr73RSRxte)1yNGZ?wN>l%GeW zuV+kvcU+KfVrW28SWsG2sDN!)P_hJG8Gd<;3-%{=g$lV3zCc`dVr(v)o0>$l3{Jr; zbP4)oCo?W0BPJ41^Ryg53ZDw7#_-6^+@yFe#7T$|C1nBF@YJX<;$)8WqeJ3JZv*_I z{Cpr^coyXPIop%Ncstlo=j74L-rB>~lH+D=?rLe`VQb-OZ^aXMrU0_f=b)M}TLx7p zD~k|scZe9+5^wVaPOwDWQur+*a588P&k+&01X$SxcRqh90a=TH~{h` z5k9ha-@)BGPaQgV>EtP;yLUD2DW!%-&Oe#|<>N=tigWU>=pBD~_iAx6BPt&KFpY*+ zFP}V}8mTWz8fb5R)Inhcf9CfuW``3)-S_X<%Jjhz>#t5uASHno;i5<;OVnx&Rt`%QD}E_WmQ2k!B|sSRzjFh zequyRW%|v_XLfDd^gZsUU;XXB|LZ^5cfg`QBWnrPOZ+ztFv1`|E zYO1MWOQ)fvV#O36o_$yl z$bI*07KVK_JFze`{(NHe>DZ&$k-nLs-no(fxzRyvu*Df4;c;$k7_Ehvm=iNNVx$f! z)a+w1ItSrOv^$6b3jESS8toIRV-j94%js|DGz$dLTZhAA!7k^&CR zpytZbW}$tm5E2XG=dvQ==ZZXXRk)IzG%`IpEIB*~&W#Q7i3OFx{s|!g2_ZcCvoI?u zJP7UsM0A~GBuMTFcsXRC(E&c77?c4ws==U7q_hH$0>Xfo`@AY8lAJmsJvLGbnr;;PtY%a<{Pntu7WO40!N? z?`&b>Xl7_{V&GtE=wN2xWNz$kV+pi*KCcRJcjo26o^FKJZZ=jDY&}46kOwzifjPz4 zKsRUc=;6YbA`~Y|7df?8qy+rP03TUqE#aDhL4VK+ocS^`z%PO$`+VTbApaxm89(^* zol6&7%q)VPJu7mH2HNZ9r=LqoLPF!k4{zVhj`ci$G9MSiMfTi%&m(cr)5p zmk}A%RacZ7AHybv?z$|E`?qn0U9}uV)=!7`9emW)(brVk+fd0=)%&;akhTKek8fY* zrUrW0TLpPq39;nH4VN!mrlQ44xXs%)Gb(ClV^x?MTT_%q>O{*mF4Vg$H>oT${QS|w z3U}mIu2_nPgPnz4bW~>hJ6kK?yBX+eH{M;D6Bick>+EWw?_{bQ;9y>m6fxOX zl@#a{l z(mI}X8#Z9_PqF&y*>i~4*{cY3s;a8WBW}F^fKfXXj1M2kGtaT-zyWnNRi==f?Ce|| z935c`1;d_#SiaZetf(5;q}W8ub#hOeD;1}{vEVC zH~kWB9Uq#1JoIFwe{!H}qOW7Tw_~EOYYH#xM?z~ML>C;Xo=izu(qq83(l{QpJN$@2 zJUEx>0NIh|dc-V%O#9T2a8W|80I#Gp?nWw13M@&XL|X^h1Nm=>Bx))z;tmZUsey|w zu@Y$$9UlNrkCi?wa1*($2$DmSBZHw`8F=HtFV~?w27(|sS3sD@@L;a_7Jvf35OG3S zAWxP(2Y3SEEU6qMqhLVIO(2;ZAzmonL^|LaMDs0R%i)5PD)BWa=I{hQF{Gcx`v>rY zL~Y8)gWwrTr3WA*Uw2z`-1Z&Ki~uaK<=7eP%Z}`hgQ*cHcC$8vnmz5T(4+e}vvipN z+r`I8Fu0F{Edcj%u<_=RFCA?GJ5TU)bqa8E67=l>wA}>8C3co&)_^*~UvRVxurkW# zkt1VmmiDUOxo>A=#1AUZEqe800RjK(S99HUjij`netkdIS67*pKHA&-Y;v-#KFw5J zW32b_$9JzG;`eXn`WlO;9yO&#`1ICSCIz|Nx^Q&cx()lcZP!_L-i4FEG&xlsK zeG!>uc~(MaRc>BFu-w_>r1N)33-<5xaSPsFGH`Srs;e_1rA4X&>wDL@PBp&@(BufoS7W zo0n!1~tI)(69gwVjV z3E^UKKIHpb_m=p%Qik8Qnkt#x0*JXathxrJn!$M`cXSKH5%pbiqF7s zZx!x#%a6wPl#6<49}u`*+Ol_tfUahPs*Fzaht5KjnhH#>(7y-?$(*++3YawR`JJ zg5As%Z(g}``TWBhS7QU+sZeQQ*LwYGMRvk?cWqU6gyOA>XO12`ee~dMxpRtluidzG z(%Z&lX0Ykg$GMO1raDTKYKzj@BlFYppRS#|Fw#-`>dD}zU*>=Pb@7)EbIvxpyZ7zE zmS00j0oz!niHMwWp9>FUQr#!ywxcg535*A4hx;b`I!8O3 z2Aga7*WnB_*ABGS4|3WYhC5rwdfUhPyO1u+4oWJ(E2~h^Awq{No0c8!?WV9Nh6SWE zC~1!eyV@aNklWMR)YID1-3)#k#Ri{-2I6Nx3e}>o5CUVOXhFe3YeD`?0J<0Tb^3i<2>r=Tw_>T~u=xrr~qI8R82Pvb;lD{4xVYNfnbpjbMv zBnP-j5jCF%BJh@=EpGn)92s~e%H|`244Q}#$3BW-}crd+TM<~zAg?jECXZ?#_vcs;bnqt@Czd& za^pN|9LExwDFcCBVa>=_pXSD!Yx4`5%Th0%I_zO*^WpuImotyU-Su{E+%(eF@pPQS?)w!(&0Ki#@? z_2KR7ins5V=BCF6xFY*`JW#c1?TTeTE@hJuk1QrQcKq;(6UU1(vgSrx#|N6qv+-Q> ze>#pJne=eMeTFTtx zww~&o=JKqP^yt|~4HTnFl0r1(Z){wH0DquZSR_0x0C zlgak0=TBf{eTpq%hYyN{zG_<7N#P&m=IY95ypN}6X<=SRYg1)$Ze4kyu7<`O9oU(f z_J-QmFJHWSz0guy`FQBj|NN85N|5{dpUgwOU;O3GO99?zvv238UOgFqH9HA%=f?)0 z4EM2~e7vuHw6l4jxu&PPRD;BE7`bClE4oL_B_Ln)%p9(%O_AP; z$6hfkARH$k+-@;D0CIsX*8`AmM=QvcXjjbpAY$Z?+E!oFQX^txzzbTTT{7HClodt! z0>YAj3giM|p3o$w4A3g0!9aA8jYgsrJ-^UM2(88EA~1>zYQi*OQz#23<|ZfR(O?o6 z2?(FEM3pJ}bBIgNB`o+eKT`1VqZKQ4Z329Vu4RWznVYhFnPLA&;3JElgUL@N3Z~BN?MRV|&{veO#D#-3NwKV! zZRjRTmVrl_uZ6d~WZi{qGkE;d-(oeO^2rYAjB#&ri#X59z8-*tv1t zsRKu8&=0m$zJ2v<0xf%K4q}_`#tKhI^P87WGpQ6G5>%8DSCSU@^2u0ZY4nyYn>MUl z_bn~nufP85fB%J@0=VmsKN@=fYWBn1xxvn|{KUv-ll`xs&wYIVbb6?xxh#gUCS6sn z7vn9_KIEr;FK2uE8p^P=9qFj)tjs!jcu#L*6$3}Ve0u)rm*=D1wF~ooRysK1Ub=t% zyq3~kBQ*tI2V-r8`^OI-EKUjzbTSEWv@}$CfK95gx?&aU8GNmknT|Mhyr&|gJS8M8 z(vOeUmeQ<_>g@Dzx7PCf;hw77SI#oKp>q5F?8v~!H`9zr{uABw;J^7v72dP1bWmUeztR%?9~ORwI)Ug&LaW-JuHwZ?7n96Q`iP zvZ%ARyjQ~SPEck|{Bys#L4!>UIgJN=FRX4t8-mWp@TT#o$k0TWe2C zQy1B86I=7@1afPu8Y_hYxt_V6vSKkoP=FLFi!lK%Q2z6+=1MA870s0u62ME?g&~aw zlpuOUK*flGkUQpN&;a7l$)y=2I=RUB(^F)R`Dw`<%F8?gYU)neh#Y7Gp#c^U4uW>6 zWs#yvZCTNf#{|;WkzaoSdH7;?} zf+b~!MAx>4xpN zyW7FeWY&V0fpCbo;Ns@evf0Pu(Vk8-!=s-lIWxNc9xtfg_pj$?hgy?^-KPdy6N79o z9^JcY*)mqsEzS&md^hu`AvxOHS^mzol*pi(+<2wimyjuH+*X}^-12mCczm!cBQ`W4 z#62m@zosCkC^N>-)#2ct?dOgkSATfFBt3;0zw}tw&0986wpy`#8T`9z*WMFHj~zR7 zg!(pKmyGg_c9!-vmCp{hHkM?J_tp-!R8(XKY~Ql^?D3-!-p;m0TCqW1O=UU59hK>k zzEwGikv=wic5Tgxk9a;c@bTS~kMCz5cT_wdYj-u(JbGa7#nZ>_jI=CuRno)#)F0lu zaOQ}ep>~9aZ5D1LHik|X+CaM`B`n6@Md8NzP!Ie3q?o>@+~WuL8fvI`+nN+4#g6q= zA?5w}_W9&+(>=M1$9~?6##>8K2`$h_PiuwotuP5f|Z4k6evAv}vx1l(vsU)`r2v?PK)|E>`1a-{x zF}OE` z!I)2$Y)k;XaVbaas!qqAPj(6=sj!6NM7S7L5{INXg?3MPaJ(o@`~9Yg@`?!%Acbe+ z2%f=sNPq-n0bv;(%LtlRAw)z+0g!nsNkKuURooF83HUuYFg8$NKirQrQ+!0A(+C45 z6ph_QBUmJ-&JGl{WOZq&PG#jzBrJu&5`@W)O{rypJ4Z8P9>JiMz7~&Q9AdRL)TR7l zsHUW^qM)n%Ku7VOzOsUWs*-`4A~!jF7erg=3M`vTkMOcB@TXiRYTcqrMkwy-VC&=J zNRAxf?oyDF^JZ~Az+Trx#qj+bX4pT1op%e9HF5DM($9T4HS%oi(UalciQe|d zoy~x^zqz`*uB=TUH?KZFqc%5&we)%Zh7gEtP=f!YUNb zAX*0J0{q-SaVBsU69nR?2&Vp>mxX>9VUiomuqh7Da#wGDFS3OZ8ZyBE#3`M7WFYRV<$^fQfw+ZjWzc{rpH%VCdWVE9wB{U;4@X5qrb78!t&O@b}m$z+L zv-Gp<|(|bmz)xQ(d)sF{IypWZ$M$D=@U&ZDyc;lWB?zXdN?p>+|~?iq0PUIVH@m zwKTc0AZ31}t*bhtw_HN&>XZtp)OfkOLfNJO~-}QGe z_Hi_;Ophr~izrJ8;6rk_si40p*Tur1Iy)LE2*J-}Z$p5yO@Nz2T|uh3jtbo+_B}Cs z)z?^IqN8~C(v`C8%$&4X>=#rX$}8M^fS03_m1RMCy0?>^i>fdOL+yLRlr>sw7h zQCD5X&z)|d7lUBPzf4I)7UJ?mcXp;L!Hkaw^Qv#s}v{dMEok9(T74wbk`C zRCU&rwwC8L6lB)qq*i1ml%>a2W+v6-rZtx2{Epw=raGo>`&*m(1!jexjMTstt}>wb zv;T}hYYUi_2={ZsD-1508#g?Z(S z-17Orc!C6B@t7k6%4rz zEM0;h#VXbje)BcU>ejF0$*Xl0)EDPQfBEpFzbU`HBE{B7-PO|2Twjx1@5N-tk$o&r z-^3kPYvY&zx@L|P*4{iHvDQ~mzH_Uirs&P{M~hE-hFePNb7HEq5_h}Od!j;4AszD{}Z{tOpSca}x_Ivzc+ zFE2Jw@h)Yzo98SEnG9d2*vYpCd~E+*BjFUY9NODRo_DNczgNsBE{PpHgJ zsV~ZDDlKRea|Gqx4ORUu49?e!nZBl4+ICDINGNXT7dCEfMA3q3+n`!1%yfvTR*8a@ z0B>V$Ykf6{ll6e4dA$N=e`KjE@$KhyH6s}vV^L;0SuMN_nX*{`c!JaB>Pob8QXpL; zz9a&t>IMH&)T$`QLb zKY{^6cNbq5M@rBj4l)I~G<1llNo-Mla8s5G8>uUi5kuKl`Z^p_Ep;<3b)snEa6SQC zY%H9pR73RUCakTuCo%`i1nTA{v0e@)ni^SAZr}Xv%i{+R_}N?b)Ry)))E4+E3%`0-mw}8@7%rx+xgf)pSrxb@{Fh}XAd0x`Q(e)@z>A# zO4EXBa&iJ)4KAKNzG2-;#e27|UO4ArYjkkmo_ja0=qTPlad^*vVAKESKZ~8P3{8Cb z#d;Q+ty|5U!p0379^AOYkoaV8-B26C4HwLI%rxcGA_Iq-i}&r=c>C(L{1~4oZ#y>| zJx@Ecy24aF)d%vot|tY1jP^FZc``K7Rq5wwmKNq8;%+lH(%x2))m)U49p!0fpy6h1 zc<$t}{kyjZI2tJ3x^i^i_PV^J#@v|rKqs{aw+iEeJj}E(;xkZF@^`jrFG-0DbSKEs zRaUrjuQWxqDr%zq_j>H-!m4 ze|PuM!9KEJ7Kjh^wv`uTx!Ma4Lq-v=UbsL8+TYf~v@8nU$|wRTi|B=QS2(R%a)dr9~GdM&>6(6eY(LC&!efC)DO= zibS}qpuM_`2|kcZAl*^RKp(zO7(G=B6t~o4Y5|0CT$K60fmz8^s-A$klMWF(sYSI) zLL6LKCaOgMXRlEiGan13i1tMqY4nFi6dfZA)u1UGelDC;y}BHLbQjiHJK@BCFGX07D5iq1z&QL z&=)+4B9(zIum%2Tv?xGP-=-XGr6)?zP_31L4j3mvhMl?KOII69vRyAHdyxX08}m`X zPZ516a%xM{7#}BZ8v}Q9z5Uzq!CDgN;6OJuD>?u_ih{)Gk(Sa(PuuRwJP%W4%?EN@ zH*T!TMz3MO?7-O*r;Z)keMe5t(@NXMNGr_8V*UCJHHAeV7RL&c{W~l3D*!dUs_ADo(#9QlqFw0eGL0q@@EXh6z<&6Qc5EmX?Ra*37Zf3Z@dun176Wn);^D!a* zPS%$AeaYXujTdNcN^%OqLSfoq!|dbnBS$dWK=jTpOnXfkO(OPb4Y$<|G*(H~s)Cl% z+?w2!iu8oy#Hhl=aPXTO7oHy>*}?gxtc7%94YxlaMR(NZ&Sqp#!Oh z3*uzO>Tnp=TM#Q~g?Y(yxqyhpHOS>#P_1|Z5Jn&&SXcno(=CuA$XDWDcV}N0L9%cw z8L_Xk17%@yVJ;{RL(nq(iVu*GAcRtc;=F^KjU|<2U{2@P$-+cDN9y5{Ry$jo@hxtW z;nF-JWhQY3>44WvN5f24lR%n;SJHu4(vYH&ZnpiH(4aWyM&QDU5%|wYoh9Z8)kT@?HFmTxynF3peQC+t=d**I%`;;IaKtUSD;Lh3u`n`r zw6rwV(ZwT_NuOs=*bu=Y_-=;#a8e2j@Vj~S%HCZ&$%t8r#Rs6fgI!l+werI|tlcTe zPHCzr=x?bV>qdjo_PA4MtNNR(h@1g$ZC+YsW@1TdY*A8VZfsaiOlVeANM>YEVPaHi zT0%v3N>y%pT~W3$YGcH{G>^%GCIRPiY-&0i38V%84pOa>?5AK}@GI*R3H}w`qK5y) zZzWA$3Qb~s9`cpZB2XoSCXSU*EC$|X*PvJwwcujxX!5ebGLAGd)`p#BceqJ}ObJ>T zOcjbpz7(-BO(k|%XQtsK16oD3nYNKQVosKn_H$J^$Pd7ZaMxSZgoVaf#)Cp%AtnoC z5iD^j?8dL0y@|e)nGumKA+D$ugD){RBnrrsMfrpjP!&NkF|!0-E+kTx#nRzEq`gGc z0>3!tfHJ@fS3MC@RAmWQB zk6Gv_Yuvwac+U<7Vy~S&9p-Lx?erl(d)wy|JpoRJr71CQ7skp{y!Y?i9OPuBqj-Ds z`gQwuZ9}@hY}r!$qwd_03-chJbU1Z*$Jbwel^!0brF6eMD`T{+(%WA5(BA#33b!8I zlG9ec7v}30>g|MY&Cvt9u3SF9e*H$s_iumu3hT-(+qPc2a?Mgt`^KfS*yrxq#om(r z2M+zr@F2X*bH4kQ?X+L6M?SHA+kyS~xgI3o^tZEU$cK!A8uJrJTS{j8>k8vTQi5F1 z9Q|2K@oq(WSWQ+`Q$b=;d_YxtxWBzYUW{K(gh!Z*Wpa?~fByO3P8~YrZlzBRnMD5k z@4h*6ii5nbp`ob zw`+zF|Lb6stocNT>MsE&Ln`5CAK93w!*1~tp-wr9EYqCo~7GM(kiOK zFcgX-PwGXE=oqONdD?J3#p24r1;903{BsxckF^FazY=JG2ElMhQ zQ_?~ka6w0ys2I)#vmC%1CqbAyd=$W&@UI|NeOkSGc18vyzr@L+q)Z>#+Ja-wJ{zTn zI*JbfIG-4v_O>uDxtl0t8R(Mv@by80iO!Gq*|T*m)$j|)f4+a?x`&&TgDD&bBtT z=EnFu@7}rd`qe9VOR^?oa%2$I;%IM2h>sT*!Td#CJbzwSL*2>NdU|xAvAn?B*@55l zvAzyQGFz*QCkHy`M*HdZQnMQAY~ttk)Rj@QYAMTaEY7LPO)XE4C*jSH4FkN1L0$=g zo+%-|*)buUtmu&Z#3=M{jDA$*XENL;tS~;~w+8TXdYV7OwzIh&*oxC6?nA!RoQa}2 zq`17yEJCtKjzzQ8 zoNMa6qS-1zLlaPN0j78ku;opDr(iB*vjcE3HRND-rgzC!1bzh(O98VCwq&MK!YjgN z1j%qN$Q4>>2U{79!jH%^C<4kgj`-i~&3 ze?(Uok%p1@6SDG(ev=hKEF*nFW%c{FRqosX)Q~KW(~vk0JU|t|Lcw^CQn~Vy!gX09 zeB<27TNlroY2047a`_j3{mY;J_{X&?R|A3E=)jVsAX_~ZH!DMmTKbCD&!0NBe8sZ$ zYgZvxruDgR_jY`5cJJJNRqnE%o6A6bfrFv)-@p12Uf!@}-O1xe<<6fxd2sKYYv=H0 zXSLwv3umreI?Wov>ijgtTNjk&?|lE=cVB+>6&dh`OgONT zFO0Q6A8sD1&(4kZEQk-RNspTDteEbuemUAaKTz9SmNwQ>+E<=(;s#@}0f zm_O-^CeOQi@!pLaAwF(aCVDq6T~v|3w`tRQita%^-o9?mwWWp7R$p7o{NyO^!ECT% z&ya?SGOJ(WM9WvSIcl)<3LkQcWr5VML~0M zwg{fHk_33;BeJ4`k^(*Bd|cvu-I9ZS(!%`GA_CH*g0th8#)>V?O2)MY@@=gy6~S|D zWoP|o{1QToBO#XyRu4e9V3wv2+Gg2xdxK~IQG#y%%)+IgyF9Wg77jMqf>nu`B`%gU zRB6oQ3bb;Ffl*J1$0RXtn-w367?NR9!L#_bF~BQ5EgKzULQDn&ePRwboZOZUte73} zbd#~IyS164sgbRbt_3-umMUEp=~0;y2k@kpYimSnRUZ{18VT-j-&B(luDYxP%OkNg zI3@EX3kJm!g9{BLNARzh`Vl2%LUB>561w8g0^`rqK+>!qnI@q!_!aam&Hoap%k&t4 z*UrSyTA%)oF4W00gT*8u1u-%Ii_t5-b0U5gUKwIy7c9f_g~Yj^D4b>_k`r#-sO4#YZC!e3U1s!fZQjCI>r7Y0g1~Rp zbX##zY(Q^W>cdON{`F6PVks3)swP^>J~sLl$swUG)`f9C*UlUZbG4=R-dK=Uo)L%D z$cw3=qKx?K7cY$Ux7QS96{f_VJ$YpR-rcw4~<+SY2C`L*=Tas)YO(7RFW%cv8Y5ik1!YN_0#_T`Rkfu$k|EJ`DLv zr=_+U7H+5_kS_g=g@r>hxiA4RTr8twgw2RL3NWGit+a*KLX0Y)VMcC&KZeXG15Y+d z`;;op&dcTwq*_G#9gXUmZc${i;FafZ$aL?cbxjBc!tsc$<&;RR+BTCJH7qy1S zi{WCvBn1Z7vOy$@%z}I!ZDkOK)`1?34~I(P3L^j&ikFTwi60dd$doRag@XB&j%N!U zER1!AWXb`+sd|z5$`W>hYBuF@Qx;t_!T_#KwbgZ$9>DB@Zi3B0F%>Xgg)W*DSiD3e z@1ERLxhdyjq!#DvP@Wv>W2wIOrzLD4l9$7BZvXic$1k2f!G6HCYgTRFv|dY99@&(x zx;z;ub9_+h{X24-wrn7pRk(g>FMB|@ZCSr=HP){N>Pp^rcHNa}1@ZnNZYBt<@H#fq zP(e%;=IPQ>oPJmC3@avyjn{A7aQ*Jh`^xtZ9zTTPrKY-SU0LBXjPdFViqqoz>6`Ft z+*;~ru5swlzFj-EsVdw>ab27e>0+sEYpmvMroL zj~q17)5Z{(Yg$6*&z__h&VT#&?k7_)Gt{T#ivz}lG>VHe#?$ekmowutBmL7ueRUsT(Mmn1(`#UEY8tQ5uWgd{4b4yK6eR)S!L1RgFbxw+u_QvGI1gC}iCiuBW zde}$0+sAl0$NIW~;&3kO zD4J>&AgvX3Y2m6-Ep*E~%7DzBw)#3)nAUA$b%nG_z8JaGZ@nbIigLAjCqiV(=EBMQkL16$NBzs+VD2S~+xfq64Y@dSFE3>uBd`XF$##_CFjstRCMABBU;1MsV-`~c08+PzzZnp*OA#kW)xXr2l2*wHyd*=2Qh#Ectbo~DM5?iHaGxibErQPHj9W|;!UViI%38)(w9cCRE3u2 z>%npW)n<|WigFqFh2I5%+FAl_!e(9wLL~@`<=PDQad4>u&N67z4yGCg^w2;$n47?! za4~m)HV%`#kZD0~Qk9~xY(Xc*)Q~Tsbr}o$ySwl$>5foN%J}!<@uQZSsvRX6`LTia z25NY~E&E~F>n2ojQ8`^4YwEu)9}JUO9Di_qHt;&Yd;URtfTSd3g60>o(S|TIXhN ze(%}|++Q)F`ugu*;l23H-~aZHAHKs2&fUUhaiT3b&^0I8aSy7lW=wZQ%boHq`iIDF>(Sra3@+QRI2i;JIr{qXwv)Cb0I#=2(5SfDV| zSe{I~gkiwGnw&^)2etb*n8%;#uj#5t)sdHDd-#&?zQL02>o32+o#W4>;j7o^DL(8i z&zx#4ecoR;-%~x_RFL3f$ENb-OP9)DyV_lvJl$SC*;*RxXl$yX6z5}?7wz9$ohVBZBj$4SWYI&un3}-Wrn|Yey{-~(#@6uUBf0>YhAbs$iGM|$4EgfN0j=Pg zN71qUeWeJZ$J%Ncc!l($y1b#H3<{w*~n4GgM_k_q})g+Elml7K_W^d3AXZJmSd*LqqRSEPk! zhq+p7--mB6oIG;zoUny?c>5-yGHYMAIW^qF!^ZIN;RCzbhPCIw!2|o)E=s@n$jQ^UA3i*Kl1*Rd zu3Wq7?(EQ7nKRnm`SI-wmXYCf!AilGlf9olK4Xsl`Dj~5MOJxggulJMzN%7hP0`|H z_v_j2h0&(UG~r0+Xry%Z$gWjOm+&!yvE+_TTYD?>=6h?N^;VBJ=BEWZ9on^p#V(gm z9Vtr)A8X3biSp?xO?5I*^S3oEP4FMAPV2AADv0x$>Z))u*4VvstG>E2>G=HPo{w*y ze){m@?TeZG)Y!Y%FRLji*qG>{Hd(iJ?d1#SFoC=!cUAt*ExAi)n8!GM{Dixsy}zfc zwwe;vp2muzaDRW$K@pg>cTDoWm>ywvDL%{(Gm4>(Mn(c91C6$kj)q6AwSso5iu+b~Z*LyvZl4h7ogEvNpA-d( z@s6v^O|Q<+!UTg}5~fvT!L3#0GI}M7=78Vd$rt=`AZVCZmi&rgKmpzg5kh0;Tv;aY z%XXo%BKk^%(;Q^Xf|SLC(PwouNij{OoFrk~3iAs53a1P38;l?s@J9I2U`2~a1nUy) z?o5{!F2lLPNfeEBjWv}FR29$=>MP3wVFMKbSR;h}nyMxY>`0OZu*?%=5Y~ElmuWJt zkr3-D-q%xp2nB;&Vp^I^UubB+IP%{B7MJFO>oT-Gr9C(!a zzp_`!zzfmikVEsAk9XdR`WW98OO9fqlGreaTV1HIcjmh^o#`@zdQpNlHxW8aOH-P{ zs3@H*=q^$F()Y2_*s*a91F%=loyMu+`|rMHSr2RC`Be#Y!PrG!^`6|ZgZp-E-^!cZ zzJ8J4>b0v^vA^jsJGeHiSGaYBPOGbx@vhCQ|H>BNzkacQ#|~F({dFsse*e|Cxsjn0 zUDYoq+oFAJem<~|{bbvB@7%L*|JLnW5lmwCeD3m<^Ovt4KY8NliQ~2wrs3W`&!;*| zl44%W3@tukALx_!uSW-Jau%n%pFeJyA8Z(?$;^-O%Z>CfR#k2<&72!-c+yuh+gCf= zS3lNX`f9S{#ZY5=QCygd;p$~e2@G)5G*(lz(owr{{?x`*%m4Bpe`ePdK5+>F9_>ZR z`tsN9^^_Il&YG$|jCQwc&5!RZOHc84$d3!)LrL|%T%eP6Uw!Gb(Y_Chv!8x>@#+0D z{JyZ{(p6LTa&}}R(v~e7j~qO3`TSW8C3#wk;ekHLL@B>hs$wgrslFDiUN1*`{@sbk zs*CgHCq~~&BfU>X2dWCPP$^4}Rf98+x+nV?>22(9lnTz31x>}-jRlz%>2cYS0cjyV z3I1-eB2Kmqus08MFbBfHPF8{T=DxPZUX})acIF{2wz2*msSyF0F`;=0kr+RgWhK){ zf`S``#auBE#-$2>sx~-R=#$BIKL^i%T5JcCrgwQ1QM4#tF?}H6m%)4_k&=>%ikuKI zqo)#*Dj|SGQY99eh|NKCm(mesQHYlCD^365kILLoWC#jIw8zMtgj=Hz7Ip|Hn9-wD z<=|~^B?`GzV#Rols%#j?Se-~1oiI_figclDuB}dm%1lSyOq*Jk2(5uOXcdvRmKvzn zQMgM8P4FyhCoyp!=<3MN0*_?eAT&QcIfr_98smzh!zJozsmWr|i4b=Q?`6_+*+df5 z%yfgKsm9P1S!N`wIRO`B9VhJL{Gmt^UW!@}C`3s~Qy^Mu2b0XoAdJ_mgkn*)5>!q^ z?dt_#`Aq=AyaQn88hZ^cqJjc&duHJROBQ$)uSNgEO`gf*K0nKyeAx~k071maIV|+F zjWkq^)m7VyQ(R3n9$dR*q^WTJL7jf zyBpW8+qPx%{abR&R{V&VSx4pGjf-c?G7}4ud^fE93GBoy|gYfa7C|JE1ZhZcz&dX8*ee$6_d#P8i`)TEW{QLj&rMm%{kE&;p2T>Q7X>%wY+^c{>vLSFwVc2 z8g8!0NBm47J=lw-PV$>KtlPP5s{zGmdcNDY9@x9rf?-b+eHR<6#PGngCyyh9#$CT4 zJ&9^FzH{%Mi>Y1=tN`!KP%k!CPsMm(@07rA6W!jvhDr*~b@^%4S&5}7(OD6`#LQ8i z4unEM4(15aeXI?6^t90TFf;J9Fz~T9p)Vim3L`rv26?B31L2U|#HgaQcs?TPOY`um zA`2EyGHM^jV|6vmwVA3@7x>lHgjOM_>zC z14a^Ca80mHWKQhOw?MjhbLwE2=>-SKidQ1rmBd}d%(DJ3{bE~VLo;11W0m_(Cc2Rx z4n^_7HU>&+cduP$7a_y;OISAYcl3?arIs!I$6x;IzfeOR-oFP@`~G{@742NNZYA1B zRr!Z~HJRob4>cd$*u3t?fBBa`Tsw3A=7r9*{nVwfu?Jp-<=}?cf7B}R_&GgkZWJS&mG|(z~G1B~UxQT*u zq?=85RYIVnX+fO7k@`c@KJ79pAKWHBIerzy90F zL;F`Q{Q+t8y~}6ovlH8jl13Vf2_Y6H``98;oi-I`}e9TD)1{^l#x`Hi!ve3#m3a#!J0|RC!<5Jo=jo-`u@4Fj>I&w ztG<$Tew?X6CX6~6GQv`W!F((=x@$||-`d<1M!m8l1LM4%Bi-$Soh*H=joplOoDH>{ zjkFvM)Ex~pT+Q@6t&9R3EQ1_@ux*TwYeIk*5N7^5KRLEMHw}MRj_{f*&a1@$1jk5b zg`^#t&@p2L!Y-roGd0UXXeI$==;l7v@_OJeJ%>*KNe(SmoJe}eJh8`wLYA}vLCB%S z${~VhTw8@96=^RBjS;l#9^&EbkKD-40s}W9XFSp|fTf%j?1{8V7%V%R8`%m!3T<{<&kR+Shmnnw=tkqq%E8)P(kQv0cwCOjoL8?FUrm!S6Eb87*nkh_{HlI z3y#Q8QS_Eb|8f8+Yzvd}e9#IiK`Wfg(}a}E&6!Y{aGLM3v=PAa zU7ifa0XxqJ(Xckp=g5lWd{Bronj70VTF-}SIFI(O>e!2^5#`j`Ls z!@vCD!qG!4_Wt7^|1U1J=+N2h&AYZd|{3MefQ?Ioyw1N|MLA>s9Za zUB}*E-0N1Yj1BN#nCW0m$v{(XxSQp>=h!fgznR1Cxc|*;@4`ge%ZW~|-@hDqJKy`b zt#r7h6kdKY+E|yL@Orv)qOGXECVO$LWnrY@*+6YwPE2iH(p-Oyq0${MTZ{VKq>iG* z2p6-nNA?~6dG}_v7cX0eX$Ix24XanKU%m45(Vq#e*|eg3>q>}&L71yWRchGd`rMI* zq9;A|FNQl8C;DGa4=zj%KN;z&FU}@ZXf7}Gbg;O2<@}zVJM1ism^O8{x8S1^m^|)n z!$fYdy|Jyf6x;KclcS4I#xdh~{{p*pZ0M$6J(<8La;&HA$w;3d-@zX6OYvFE8DXqZ zTi#NdC)65gad|NzX`x=xo^}CtrtYS?P6irwx++$h3f5YRTsVPcV;xURLvO*t)?se; z(LSy$r$`C+&rOJ`%*|kl30uQz3fV)H$r7=e!tA<|Jel>Jv# z+>n|QH6J>#pqM-M#$sR=z)BpdB8!Km99C0!R!GJ&TnK0zXz>U_c?sG`-h{VuFwy5) z5_O21QqF6ND2qN6Wii5anL7uw`OG2#VFrYGWK0RINCtLx()tpi*i2xcN%(R=$7$?0 zVRxt4d=w_WlvX5wbTQK;oAj5!3rj+&qP-jB572-Z|MUWkl2H{Gz!}6L0ue}*I>NF* zT09CfSRtz9$&ff;B-LfACDcbm%e)oXS^*3xWR()`7=eCWksQy3y=l^{7-FJ*4eEH=U;P;Ea{&nTjr6&#_ zX0qn!v7vd~ZMYwy6b(Bu@)J_dFROcpq z{5bLP!^DSIBOhK5zh4}D`>f~flipXeo%5ruFUMP0hVpv4Yhk>lzb1XEx9-hM*W!5F zldjU%qSVF7j)GY4^f0gP@-)@ka(QtfPkYLy+e%8~e1aWK-OV)9{9U^WVqJ`sw{2X# z9Pj2O|JbrYSaHdnIUea^74L0hsC2h6BYdbT^HEjSU}Y8+?Ah*``N5Wj$32UagHwGi zZB<2&yP9eXva;|EaI(H|_82vJ?4FoTVq}2XJ@6=bGWTE<`C@AH-813a{6QRnUtzsI zH#zrs;Kk(V^YI~kn-Oe`cefBf4}ssNs?MsS_VNM-^HE!sBu5s+hb0Ai1lpUqo9fu> zsRCY04S61|G!?Bh6m50Y91JyFP4zr13}NAL562iEx1?Zvv!g3>(kn0r$V{fAL{qpt zC#||LM?e_sNNIZlTd;+7b5$8tXi>QmL3M?YP%?rf&EqpJgw>S{zcSC9YK9ar&|pOo zTR2&~TaW{O37c7eARMbCG9u=+V$E1(m#(s+5pWq6D_F@N*JgtdzgVc|Gkd zd>n=O8+UNL5d~*yLXf;0{3e71C9>~8ATAL0c~(+YZ+{1vF>kpBq|o|Ay7;r3?wNpQ*lBDDFZbs>lj*QV&_5-8Lljk z2G<1GGMeVKNUb2^hyWj6LXXMM)rCJNNpUg|rokk(ABM3D7)>S|jZo9q)u|#WEWyXV zt28b@+PAeJ)=po+)<~n2e+F0UXm8txH!oi}d-Ups)7LJX=9ipV-Glpgty#VN8w$+~ z{(bii-I!IYS5e?%EAXHG^rt`k;SWo(q+9h9iwXGh-~aXBB%0f>f9FnGd$qZ7Bkg7J z!S2DHb_#c|TBhA0|J%A&MS+zc}=6 zzW3Ec2M``os(VKNsJo)CEIHZNQD5P@r|m8J}obJB;Zv&WiBr#ot%4Yn?f_00~nP4qNR_O&xv&{UR(ULx4r(Z$BB zsvwU&eXPM{XDto2ih;};w^)L0J{Ax~GX{v!jr3hc1$_W`Ach!{o{G&55H8&!l3(yErUE%WqP>fh znphg42yY%I$r^!%42k?u5ke!h_^sM3V_r}UDd(mp6KQh+1#^c3*yGuQ5E2Cca(-u3 zk-(DhQj#KOmgE+s!!W7n6FJ%idVBC)3R55v{K|4(S*VOYlOSBYL}GA02Y3^IcV`=8 z15gZE^AfsCNzoB3GQ;x$?DHp#4-19F3!=P~ZeF1mGhCbXsHr3=z%C`&qaq_JF~GSz zB{am%+R8v#K};Xq#O`(Xj?LJs+8e2@T)}4G?^ph`a`}oCBBK6*MZVwul{Mu5{TKEV z{a@DI{`X%PI^Zr_zQVoiD>I_!CfZxeQU{s~n30e4b#S!MX8PXKPL(3rzyIsM{^y_n z-BQc2ASq`9 z6=-WzofH^gt?zE4eRAK<+ZT^tI&tvf)pIw_oJjI@=**ArDoE%mi0>{+>@H5|DM{)t zOB<@nnrJC~(%bxWux+HR=IL`S?gbYNHYGqv z&i?WHe4pXX`|kOkXPn4^yJ2$mFGmfj|!g${-(?dP2jOvfI)pb|9 zo84yCn_7#rv{~`;l<54}(Cnz-jIe;TutTXK0o2cPVnXF9aq5hCLq0R1ss^`}gY8dC zg^QJcoUXb`_K1yjwEZ847mmqIe~7u|J|F+XcCzRV2+X5I+mII()0z zoBLZEdZ`65bA(_+s##I6LI#N|JG&KFl?536oLiicl#3W6IxHtHA}2m7FDa%dEkT)` zT9TK6VM1X#fidZAG?dEHlVLIF)G~nOdrPC}AlFn%MzUUt+mc+9p~Y%pCRyet#l{PZ zNSGLyO-VRN`xRVnYQILUAJj-SfUr|9Pz-(nFNe`!bR(h>EYyt5_lX#otEg6CgoP6| zb!I8^g?#x%#MOY8E95KUYH7cigdOlJf@h&^=C>2vTKv0>#N09WqEsbWuM-UWN!d~& z<_eK;_{+;Kvq==VB)N!`*b1W_@LrUiA+a{Dv-!CxiRm$sg<0t)G-Ld6bGg`S1_g6d zN56@s-Y$Dg;O-3{yrs`eLv%FT*L3w*f3;2RHOgoDn!ft%$f@zR#gXQiko}mfuUPRM zI^?jxy*oC4{L)L$zx?tG!1E7}Jbd4MEZ+R>z4zVo#1l{a>h53NhXk5^UMMu)e0}GZ zPa^gQ{cz{pskufn(CeorZk(HDWIj16aQ!DA3i(Q2+%ta?`YG0kuYKo(T5D-dY4QAE zJ4LD=ZlC<&&dI;sKK1>r6W?85`u@h^U#~5Gd-XUX=dUl$RvWUE>G7W(A0Dc8UOhfW z&6x?o+1`e)&L6ol+q3rV*Svb=o#pY{r^j!f7``#zfAvWFSe?0ACu_9H>&-^)2dhYD;BkVMx$xEs$0Q(i>D}nb8D8|Y8 z<_}+7|6Ve4{`#{^k}=&0z$@|ZEcgYyr;dyW@dh&sVqlOIxU#3l+u|v$x9b_!cF1!q z1(}qvfN*BSp|r4ol*9W|Lj$s-zk4y~@%83gvOiPf+H${<|LYB%V0-C=bqzg_W+fwKom%RDu zsoBYi=@HC2B;T#Uf#IG`zsd_}!}y>W%%aIe{e@yg3`#KC&u-9$8c{AoYz$RNX74~4 zBKF76TzLt2{a#pp7DiO*Km2wns7A}-sB+kdkU=gaD*#LVTxt{ZX9UjWkU0O7f~(yw z_}UL)KV~6K77_aC*#CqwvcR%bTPB%Bj>SEqN|(iCmwHL0z?7;=={yP>0R#7xuNh>3 zd8sYOhaE=koXxOOYEll)T4WYESyDAj!{%;&5saS`7pBUHmZd~jTeatp4&FL9G2ZN% z?yO@#o=N;KFU|}%`>HMZp#eKmA`fiYur?twup~cu+orV#_H2Il&A+UE*Qp&_lt}3pDm3vxecz8EO}FHih%Yw`P=$G^L=KzjS_XA9q4 zIri1XnQt!6+&MFS`{dZE!D?GkDwT5x_vA>+SflO6iHU{52Eyk3o7YUXQ~}=4j}P8j z=)ZiV{nBJReA@0%HI>S14SBk(_>zp+xPYDeH?2(z4`{ZjysGq^*u!3B)>xel{2uEl zpXYRPt(@5+rFOA7S4sq&N<0_lwKfYieW(n1dsMd!yy zs56uFx#>1}9uVdbNc)T>H4bxgnX{|59R3BTz?Lo&(#oSu2UA||>yqlytmN(z;1xl2 zw_si>S6w*7HnGNNs9mf<5oo1GDH`kfr>gTh{5WOOUus>6O`v{K z_ERu$<^v#_>a?)wkgNazg3Blzbujdhpz0L(m5vlJi`G)D_b1m%(FpdsC{V-NoN~zo zk8g0BMGuGrNU3N6VU8cpV3T_w%v*>$${lu~?XO=6cGjp!c%{m-iS(JO6i`i#L3x1) zVZSiHN=eL&k4Xv-i3>UuabRCWz<%bfNU>3O__T$zMDr5ETRg^|YWs=NuCH&L`R3MV z-`%e)#h2kKdg8_Vb0QuG$}exc2$-#6)`;uILl( z-t8OTW8>)RzpQ-YwUvsjESnf({_Z=U@AbI!tdHwc(H3zV0?x;P8Besz8d@G__H z#p3X_nI1!KV%YBW)NM`-w{{?4PK{ueYP89-cjL#CO=UNa4}QMTcW$)#{8;Oy$&Rbj z9cPECyIdv3$q^aoFE@P5w8E$Ftq$G2`S7kS*-?SXApxy+)oiP8uFW&oRyN;JHrHN0 z+g5(8v+Be^-STMb*@>=mligILm&dx!Omv?=GH`xo^fDXVPS4-Dbo!gm&Jq>>@Wr*i zeR&oEl!HciwVg@n;IUN7aLlb7)d!= zla)+Ii747A%d`|`+f@Z+rV?1VyRHH`7TEMNuNdv87d*%&BZyc;)bxn`_!Wqz<}8X- zjXjNw5tXx(mlfMhWlphi3>A~tiMEPrm5;pAM6@h3$@3Li$)FV_swz7b&W#S(lNJ%I z$;&D$H2`zq4^e`+dTE~mKVIv$k|smqNI_WCa{lzGD=Z_vc=76m3)e4Sx^m(CnWcr( z3&(M?Mf!!%YjTigRzI#Cea#JgVH@L16=fvFgwSFjvAMprTGYMiSaEHp4CMjH7J*a0 z+m+b9Ee>!dcP797iJ)O>io@Vbu%xlVF6F`=!LuUmt*NB*D|SE-u9ta8f&CgS$Qttf zzlXFGiI;@je_pwfs#W4+yi39he!(^TO8|^cgLi?mO{Zm4&0o9rw~e6V;+)Ks=!oFG zyMS=;-kqWQF*x0i(kv?QKtPqc@KYT$}0o ze7^7cOy_4uIxkN)&$oN}%5;fAJJ)~k){b=_ee&+>AH1G1xN)F^dY^mwgpro}ze z;yKdn=FGHtX5r$_s^dL1Cx=_kjCYsZnb9$tGVW8nyU){0(#*?ERXD0iu9G|AH zh27j&SI>R@*##We|9bQ4_X4d~$abZe`7;6Do1Y2tm6G3E7f+M?-dJ9^cKZ0$lXDCV z;&Zh;GlqUcj2(?&xFH69v6qx)e!cBwwk8Jl?RvCW=qD|O8QQEwMXG2g$>PEb;=>CQ zqluqY=?Nv7NouJat;WWhbu zwM4V2tA+A1xh;E(ng}C3cD8dOhOD%k*uG6F-Q7?PFewvN*-b9J%B5A9<@wtDOj&ZQ zQJ$;FOw5i8hl|TCy2disSZ@dVE+N{So)B)*!pM%+^8nc{RWha*Pai)HelIMahJU$& z->cyF#Nsjw#Fv(U@R1?mBaOc_6ij=aUEbupz!Ru4hsb;raX2Zkq_VaGVF|WBsjMMi zzj{PUhXr!Eq3Xqz<2GQzBdT8FfMQYOG809ER%%v$2#Yo`BN(h-5iR3#(a?c*rQ(%f zRY{d0xb-LX1r;qujYO$gMAz8W`X!O#lcM=s>4v^(I{zeRj!<5xkux1;*La%^OvuJp>{8jNTi1Tn=r(Inq)w-`lu2)UiB0cxi6(+KJg) zXO{r-t#c=Co?W_i{^S=IPT#(Ch8h>=OKvWmA#C>F-#oK)O&UAG+xh(b)UqVLBL77K zEhv}}y0b~R)nS-Z?IyEmc9|QU##+YqO+dKFF3&|gsY;Irt%TF^RC>X2e*CI366h$= z6sCyBj1s2Y9aY|*`U)CJ_;R4AlxoiX^W#HvV}pzt@{)*}LY5!ALmhOT>bvTynpii6 z$lqBCc>7yL&1#^fVYsuorNUFHEMNeEIl*SJ#)uuhHndd~pGl3OW|$G;M*D$304p9& zAD=t7v~=MlTZT`Zn41$45xn(|Or1VHe`aa%{OObDPMrk8;Fl}s^0~7-IeX&7`I9Hk zE-jp#pIbPJLp5>rEDk>?v4Jq20L0ItjayMx>#`vffnGr|-6FsUPW?P9gx1XYmWY8t zuKvSc9u6qBNo6hpWC~vr3k#=8sWwH-?3YOsNE0yEA>_t-y0W4cIi*(&_VO|CD0)Cr z8%RJ{+RV#yf8;D6Y!|H}f3E7Y(JZ!jt)hQaiNuQB$LU!Qlt@o;y1B&Gn^kF3m4bwGPy}XZsp293A@Z z))};mKYsri`2F#3*Kl*?{P5MeudmLys1-&XjtkxU$fJ+kbI(0@-+edRPab{rF~kEw zdv_q=&rA;8vwh>5_ur9;N=3*!ufM@&!1W)0z!q#QTi;u~a{sm+y5j6D$gMZ7W69Z{ z|MVm-vXA`!q0MVHe0^n+B$s~}W|zLYG$X`R=LndmL>c+y*v(^o*JgXpjx-t>JmnVk5SR4SqFz=1I-fKrYsXt%Di({n9K9sqj3=R1;$ISB285e^j;@-r z0p^lAT2OS*If8a)N9Y_0{w0>?39Y5!j%L#2US!MynC=?8h1k2=ZU!K&Ri3H-9wrcR zqoq>K0&Z%~P&tc`=q0sPl>^@H`YQO5ez7Qs4fK%1vgPoSw5XIV4{S+0e`0ar$We0M zp^jFjoCJ7JoxHSs8o*vYckbeuGu&J{dxrQ~Q1Ak~nHB;5^3vi7X)(l!nc3N~(XpN` z`c^D(!TJEN0E$}w%yvOBD~7#h!MWh~|E1cW2v;gc^X@+nD3*{eW`3D05Mef3R73(R znoWRF_*hC44I&E`PI?rw#H538)j)+sRBSf7j7G{+G;=|;zdeNFLc+LT{4A7{KJsos z(`Kp3YpN?Nt1I);7^1xkr~9j6Ae}}M(ky=m83@D0VhTx?%MJKtKv)uP72)VEOHcm% z^vqvxE?t`MS{Q9VJJEV+cIdOEF`SnFdVT4~Z!Z4*#~VL1c^x_+Dto-<0mhY`%DwhAn#`y!gw+uGd7Ns8AxMt(uzP((W z6&|`T@b;ytq_DjXjVe7Vpw3x(e!6S4*}e9?zdZiv!=QNOOE30TSABhH=9^1LnYbt0 zy}djM?cP2)ers{?#$5krN4hUhcApzK8xjxe)z&qZ2VYK<|Q2p{i^{Kw9rJl;;o#n^cJu}VD$vW$i zMrWlacev8hVOI~987CX;M;cvI4ep~YUee*&j>_fHHY!&aj}D(6ZJX(+oNRKBH@Zh_ zog+1lksAA8wY|U6Hd^l;Z!SO5)vz?ub8@Wr)a1Z2k??rm!cgaYf7^UNHkhq*{hYRA zL!FBwJtxNdPEHIgjrE;i0oh0|u$>#|INH;Ew72DGU+d9cX7(E=1b8b3>M_i*!@uo5 zTfI$>9JO!Y7pJOY|u@+?;a?`X~pg2~U8mCT=*JUT`bJI$Tav2S-F4eKD z8ATTRr}`Ufu(_M;>pV&oOVqOHCH26_WXFsw^)=OWRF@HN*EuOE>nd%=-lm%N8ednP zfHP1<;IVLI5)%Ld?2*p4LB|SQQ-VG|&5-gmzCCy#K)CE!5&CLG z%VK|b1&K2XYRX~^L4Y`0iJUoNa$Yur13F@Rl52hi*hHL(y5lie0enlb-eo1x3p9pEv&}Kj?X%V0{8Js2^@+!bfFPPpj z)|8+XYKE6lJ|lZ(5Q!rJ9Is2|U$37*-89?lTAW0V*mGrWkl^`m-&{mEf%fSiKi>Gq z->-jpe)7aXZBbH0dSr-OlljckPu~B#`yYJhA@~;+M_f2NMmFOYhrM%jNWhMbYgiaG z*;RS%^khuX*4J08To~_Nnr>Y8!H0+U?%%rZ<2P6S<-IrFx;j64b7`bhkzJA<`Sg=d zJb3^8_x|R$(FcORBL6)%dFKqRpUFGRNH0ddSQ-JmSEsu!PPCsLX*@kpH`V0cyK(KN zk3ZJrWXyI{eQ|u?%2Y?>zHOs*j1RxS~K2OGu2T)-Py==<5Xw;L|e^7d+k(b!%S~0*O6u_ z&z|l|ClbnbueH@v+UTSNt&>VvD57N^@T&m7GKV7HrQ({W%T58gYLNmbf?qmKyjy81 z!BnuxV{7zS*$>rMUp3Lye1sHO)UPOBiLjZm>p_$lK(*Qjaw{x4uR$#gJ*s`8z}4T~ z*Hqh4TS5Pq2`1W46TMw+Rb}J7UGw83OcY9zX(7BMkk%LEkn>Q z(^=*>(z>EB&IgFnIYjRO5X7MsL8w{dv;xcus|hgLC1V_P9muyBL;{-x)$C;u8c4f^ z0SYD>XzY?K`|H&JobRco)+DOLKUvs8m;PAVPma8#NyOnHQ8c_+&k|Cfk9t&@-3Bm) zFcP%d86BdWWiEHX(R`sugu%7w{1QS-`e(|{{v+5{fqc3MZUwNS3SDaAEkA^br72DG z8;R0+0v!WhQe(Qqyv4`POb>nk#bUchck|Nxm**$$piaED_~Tz$(tYvA?=SrQhf9C| z{^E_(y?F_Nq5BvqTC-)tCojGH!qb0#=J6*Uzvs8VdE$?cvv`-)e(W^Zy?H%G>yZJw z`448SwQP2{@zBn9!*=hcf<4Vk}jVCrwoEw2CY!y_G) zw1;lYb!`9m-Q1Y)`F1z8rs+m2V81cfb8)=s>~O=SiI!9SRi}FEjyAbYbXP8QR~&CI zn``yVQlVP9tmB!I3<8Y;Uw8lD7XCJS#P1M_GTFVyt>KK4JGubO@R=xE{ z+sY>!pk4cDopZRxHdtjHs4VR-xAc{p`zlHYs~rPXwxL?rXrphkt#Z7ja%lg|m# z3Cqc&`SD@K{M(x$UvBEXc86A8X*1DRG8E+!ig(mhl&T78NCDfURI8X?93BAIl&Z|d zc}|^D;J39Ak>@c|V7|5&6&Z0jJD6JeayET~aTa__0+K=(!ehM}6!ZNYss{RApB56kRj8sD^h~dSd_J`2W zE;p36N;PWyX{A6qmnhng;v2-xUgO+w=MT5fe0S~Gh3THJFE9M?<(VJ9L3k{kZ!aK% zI)Ah&H#R6G>flpPJ;vU#6{t5}V&MrUa?icF>M!d)djBxKc>xDo+@%bIbd=l9&kTHf zb!Pp$qO|+PMcSkD*B1uP9O?S%+T3uH7f$)^=JJ;pCI{+0n7+mwTn`05{>UTmzPkFh z5I~OJJ~ejx#ORlcLpP5N5;k8PYwd6R3m`bdwkMJU`Mf+u|9kF~hk_-Id4b3bjGI?wKankp{<9 zgLAybI#z8SE;kOB8-^=QKp6fV1I6{uIT1OxFOPPd9Bf_eYn-8G)$ARugLdsh)ulsK z*1<{}k?Q*WAU#P??Q5xu?nQ3A+t1|vf*O)QkW!4n3(R*f!fSDl(HgVfk#l;xi#D*6n#Uvj- zm>C`FP!~H&is0Y2DzDdAk`)~qbzoOoL=YkkP+aFKwU@{pShlK)NToY!Dq%_BMjZ^) zQ{onJtVO5G&(!2*uoIHc@LS+wKERKd$O7~#N@SG8fiS9)3GCmygd~hV2)#`WeN93V z#ta3~J4I;D`;hCk?AJ_X$n@Ln8OWKEPpzTC9MA?SE6VUEi;l(Y8Ez_0;*yW z!%sHvq{gDX`x6DbvB!}{cZD~OB&7hJ7Rl)y7dt9ZAQ8}^r6g2#3q%WDC9o9_B`qa? zB6thCXuy7n*xfdYoYP@_R4XO zDoaQ#Zir$pK8?3dO@9A5V?JlaxpVf1ug-k`<;h!T#;zXg*5^hFH`nK%$Moin)o-j@ zw`SwIj}GqH{Qg^SMFs7~yz%g!ZR8tUc80|Pa)yvR*;^EDIdi*hVvOM0JLYv=ck&`JmGM%BxV~%jD&UUoXG1uarYjq!Ka!%FTCu?n^m8L$guGgdK_h|{C z2g{8^oJ!+Jm1VNtb*#H?vA>bxGqii8wPK>dBNE83i%FH*%5XN ze zB~1=}qeI`~GB?=tjdp`{K)RvXWo+Q5Z2AV9uG*vqyadlo^h3dQR$X_ci_&z9$J*+( zRv1;#F+C>Y?IxF{p4oqkmQ%;Kp{S&aRqe%Ha|kUo6G?3i!>#pw4OI*~v{!g2aMe34 zXt(G(QM*=WCYPJF^JByKy|Xo#tK`}-3aI6&@klpQLJp>dqTvjT+P6I^ct1DUF=2(t zv6kZe%*ey(;lV}8v4u&|1<5gXb&*X~SdbiRmgm8VCAn#e%w$t>zD-?BAPun+Bm+`q zW-_1AAVE-Xb=og%F#JHlQ{zAHm6oh-~-q=Tz z1$&S^OI;xmNK3J_75pj+38xuwV9dcN&lk}(Htg~O;%#t^wVf1ri@p-hSAG|0#so0T zDOD**HYLS{U`#&@!I!8NW81F6SXdlhl9}r9t7LwmxIiZj0#msn3x>N%gwZxLqyW-^ zJaICCx(CH69}xL6Gy6_YsRafnsOH;5{+pX60Gpjb*epv=NsD2rN)*WDIi{C!VL{Z0 zIy|Po-9Gcf7iYe|b^4pDv&;p2C*)73f4Ft>htE%ZcjM%@*N%OAdG^M_VCcS2F*;{( z0gcs`jqAgM_I~i*TWddjn>}SuKk>)6{<3Pv#!tl>qo<$x@U1u3y#01^NMK6%&cL19 z7KXcSUzq*wb23PKO{sdc$yINI9n_NV>qKn8*2n(vhx_lvy6S%vDd}i4ZXWOd{Mg{N zncmBj9p^?G34mXH_Hh>9-~G#9Jo3BW6(@$i`uy{$5kc{R`%d=OTpVk>G}d}BLI?5M1eaG6|^Q|tC>NYu!HaUUtbc1!WwiMbOt+s&N9=E2`q3UsI z`aHURpMIbW7AA_eO*XiWwpL8H_~6{hM)!Dwd!!oL6@=UCGj)3nTsb{n?u}Gq2diuY z)vm!>cV86|a%q>>)ZsRC`plg^3#ZL(tTD-J&8ixcqC!{TRpZDFlR zRb?oy)XS@kifWUh)<}`6xI)Kh7%$Z|7EO&=MdgZjD-8-BdZ|Av1 z7E@V5Yw=-=7Vu*2jyp6S?~rc|*msyYjZU+0imno9?Wrxt^D+TO;Ad5V|%veHRj9`Yh5M86&B%O&1*bR`A4gt;x0;wl_f^QxeZ=B5i*9nd2K)6DXkwA85(gQ3Kxo<=-?ID|Br>EkgNxud0{wu<@UYSsh`krg&{ zOfiURvlL4gVcrgS8AE0{AUBeG00sitj5q;g;Wx|v8bQ_yV9rVf%%&KF!g84>_*DWc zqFF!+xR}`|52Y*&8~W?Rs2>?P;s9Zui_n*!GU;g#(FG=nriulAQD~4LGmKC{f())j zzX{KrQc`1B*sM`8Si~2CT(p$nRLtqeMxp443k?Rs*w6ASfN)-F;+->-y7btuE-#{z z`rGYgApFA@C%*^3AQ#ml9oP#vS{%J|c51Sz^r;M&sg1T>SMb@6EbTvx?> zPaUG`o(l86&1*4^W{TmiU;Of^Km5_BR$M*O``Jv-<%zC|MrToCWZ2%FkN*ClkKTFb ziANr((iNZRsqA(sCtJ$Sk2akjZa6<$&-Kh;!*YKOrDL}ubFr)JSes|Q&3mlPH{arg zaA#XwfR~sV7M`lNPSlu3iJ2>molX_t?Q*KSU8+8hzSmPSSZ)|BH;+_X$7>xEbq;_` zpGc&-mDc`pb8i`d)pvRHJzfK_?e^+BT$&E2w#Q@WE4L6r57l}Gs+?VAmM)*E&7o^` z8C&eyR;RAsEU(ncDm3}_!Ze#K)taAd$xkkor8tVxYz65qMV3#U=TYT4<(Xb}Ub(ga zM0-^EUR6FLjb3%WPg78)EiBg-!MVKjisF^bPT84>V~SLYJaLpVOex)}0&oqeiJw6< z_-%3mTN5beo>ObplM#!GG<58>H#jYzy9^CRNs&#FZ!XBP6l9?QK@)@q^u61h{OWmF%W z`a3(=+VIj3XaCrs^npSRHt+04VZyOQNnR`&$vUuurd~~%i=11_?(&Mj8-C1)c0SU zA@jxL3H&lLFZ9OeXKpV~pBk!ns|vv>LS-DD*;Vw`8*dnkat9l{;Q?FTT(vSjG$b@& z&$EAe;>BnGj8)bvFTJ?()t6s>amAYVKajJ|AUb5vmUXJ!EdH&v_)OVxVSUx!>x(1v zU6nK4^#gV8=mVer+rRznXaDwZcm4doe|`5||M?&P`TSE)zw-QZuRQnc|NP>Ycm4N& zZ~A22w)Gp|cx6RKMA+&6nlnQUXNT%2DW4mzlkNp_PxaL;bywHuWPlguoo{m;YxB-D zyJnzW`awj?b%f9$*E%k$RfgdT(@?p-$6eB4Q-WWnllpxI_;;v+6u5M#vQ%6v%v7X- zGjDZ!^j$7Zw_D%gP`5j@?RIsCL(^tcH(S+h4sEML+wG-t@ zO5-00BiGvu1k!lV){7#T37V$;RL-QosD`QVu>|}0Sej&+NVZBcl9(w@2f2q2BnIsV zl?j1+fpA86U`|vpLQR02a`*t4B}hi}C5w;X#2nZev1e<@j!l3!aNGJrn?F6gePi_g zozQf|-tA$#x5ftSjy<>wAcyYS5_f2C=*}(id~HZTV(@{OfIV>mdlCZo0pav;#vvo* zX>kRKQQ)_;u7X_>Q+;C20?}8E(^6$KQR5gK0L)YPy{2*I!5_enVq7JGFubfS$X8}(V$#l* zK(S~nFI%0Ti}3}!#<fA+6G1Hn%|^3a3#{`Tkp^-HDpgiE7J4jb*I5l(3n!cd*Pb;L{Cw^?e=<$=1RQi!9BMo2@LLtzS5-jY2_~XS|y{2 zOzj$5Eom$woUAtC&>o02YTphCS$lyVfK3fKh+_cA%8Loji8_q#nwNQT;aQQvu?KdN z1xx(9E^ynrLtEAX;X_+E>w>p$6fd`|3*=_oh69_{?%ycR!7ZN#ZCelIA?w88{n=3= z{`8rBAMmm+H_fV$5p@rVu5@i{rMJDRywU3{H|wZ-*ElRB!g%B&DWMxhAWgf9c2b{I zBqtrFK1LQyS~W}KfAH~1AUwQMPpuKs;1lDUU4`e5q;N4WGPuz@88wEBZ;t{@#; z3v{O?3GEZRchgfSB0;<06azYfVT#Q7ToL_3rW{ID)US*xg;6qKr|{)(0h0&=TjFG2 zsnB%@)MKVW@mY<-6=8XiNu>aoB)o7dAO*R^%+bMzVnc#p-t@R=Ak17LSSBM@7v!yY z`sqL5qH)h}e#7YB|NM66C!5?QtmH6P8Z`R+%-tK;;){OYuYdi*(@+2TDg1Jt#3lCr z`|ro@-fdJbPjoTwqs>c>II!)Lci(vQ;fFqa=S}|4-?{!HpvzR?gAYEiVa@xmzW7{H z$ie7?`&c5@<~Cei92=}HjSCJq+FdtN?{X?L_io?z$iu(;)i3YvA+Pil?cezJ%I6-x z?>Bef^FO~@^VX^gec^?%Hl`1*Om&_cX{ooBsIw9?qk=l!`sD$XR5d4i=?YaYc9kD# zatxN~7nu74zpXCRQy_P$&OT9VrNhe^A+fDA50~kN$^ogapURb6P1xLrY|^6>Ps$9W z!vMBJ1l5{$hqBG4Xtyf?Z)>Td*-{K<8%zbY`ht36A=f%XVS}---cZzHQ@7gG9WDXk z?y^$Ai=S9;r5!FN3vPAjfN*1}s==c4D6(C}>9DY)FqJ^sPsgV0cu;K4PJofM>8Ls* z)u{kER+kwIY&pj4WaOQij5sDAd8;Ii`vhZ75-``K$E#9eiW4K0DKWTXX)}{JI=oYI zQ$evsmSHP`tn&%2NtvNq$_@g>BCa-(DYJnEDHnojW+L=CsYOYV*m^KooD#e*X5WtR z-CM(UZ3*4EDQwp!u*rQ4lo}pbm>5-<5XlT99|P2c*)jWfgzwtSCxf?b2;R0nXxj#X z-_4&M-1JG{)^$7tzxy|=*|*{2eH+$t4)WIKPr`R^Az7yIML|rHoywH}TfqcVd?bc2 zC{LKbaHxwK@ynt=g-^2EM#qYb*k>wn=@g)tSh}6E6|(>&x%v|7U`#@x|Mgd z)gL?qUKo(3556~c%-#`TP?8c7N>W-Y{l+$QsO22m9v}a$yo``auvn zR;7F=5je3oSAGj=^^^f#23>17pWWkT3NZC=_3 zt6zKS@yA|%;kg&sw(#cbkNn}`Rj;l1<71D0{Qi4SKlQ|>wQKfoS(g(VhBe|?QyD5~ zmJJQnyJ(<9?A!c@2mcTf5WHv0=DE)5i{ovVCR#6yH=pROSm>@iC*tIWi{mYqC)zGg zv|JpmpKbNF*pxJ3&kWX|?ng{jExNirmGkZ1exDIl2FRUn^BrkGgW;H@ja!R61K1iy ztITjN$Q=?Pu@S%m+g@>WM9~7aZs1HNs}&KlUDZ-5Z#Dzi!q!rGqp47^t)ZY!mtU*R ztI_Az>hc;41)L@`#99a`gYH(l2DAcR_;;Y%Ia258Ei-rfjJ@UfB$(Qr+NM%Pl}=Wz zFDzH*RcP{{<1%$F$6cI3{#&Nb^N|71G2HWn0-7!_0~BK_;?XNx%H8m9WvLOEGbU-GyG@@kr0;yUD7QAk^mOwr3^(cxXL98Q`}1e z%Tkc*FIgkT;P~@pU<>)e)O3{mnAI!Tpd?zul(;S060=&3sDobtoQcLMY8jPsWqwY6 zdNSb6h>s=_&J91fJld(xj_Ry14AdCQwAuQc$d~`jhJu|gb+%QW-CyTAHPNz+(ovak z{{#0?CC2gQoz<^}9^8XfQCe*9x{u#mz3SCHTQ?rwyZOU+RzLdi!_=Z#?)l!kZ$10W zpFVi^%~w{eNDSS-@|BlZEpll4Hu{^RO=WBro9*%Wv{{cmbpJiS{`Eb-{*4KFXKt!j zQ%DMVYOwL@bmxWfwu_T(m&RKpP`6ziYd$y9;F710)Y?w>lleBD5MguWVrRudr2XoH63K6uv!wGUwpF#z zcrq8aSc)5s1sp-U=E6oJ5H76N-Dl)y{t}OSZ^$DFv}Z^@wvtNt;v0lP0UW-mGZh#-^z=D=M_IN{tLB zTM=w4v#kZ`4tb`%D1&s^PA)70MgNJAp*hTGBY9&e}MGR zgGoXA;|}gh2-p>OaA(4y-ARFafo)+zM0)rkLTkVqvV9{2ofQ!Tgb#1u;ICrAx&8=Q z!tYw}OSDW14DAZM@7dh$5~_pefj~2d-o0o7~MoZ7KKNhl^q+*!mqo2 z`ODwk`@mF__hesff0b$PmJJ2T@fdJz{NUY6gA&~`b><5rP3K1%&kxt5kX-1lB63DZ zd7`(Pu=#kqZvioLn-59VYzyF}PXvA)q`G5OLXUwk1LO{Pb^UG;C-+0R4t0-H)$LSM zx$3YhIz(=(Y_};|Epo0crNymQ__PQVL%xL2yad!h7{V37Gx*iz*Xaa`YxRXSFtSco zXDDg}l@4u(OV{DlK)B?>!*wXET!6ZTl9$Wm525Q##q|~?c`?;3U<>Mru3H>>%3O73 zWvxkBZ743M*rk!Vl{r6Eu8Om$PSb3n{Zws~SLg~UQ&aCMm1O{7KyAzh#mOR;PK{Be z#Hvy`F&sroG&VtkuQL*aqEdv@*%YoFSVk*yiJXb3!LNWYv9v)+E^Jp|G@Z>SfxO`2 zfZr{j5=Db( zuuK&za_?5kS>ojm@eqRM3W`aYDO_hp1d&1eVM{~G-kAMWA=~QA}fx6;|XE=_if)8 zdSKVCjh}?<+p%}^r`y(lwEFdxZ0O5QmfAGqS z&;G~1|NGmotdum3&Lj1XxC5I%diSHWgm_JE8pbupyQ&GHIcJ9Ih?$oM>Q47np6;zC z=k=GWK<<3IZyrfx6Ou@$h@25t)%n9_%Wwq&GvL*t(*VNIE-`bLQw4-!UYbXpc5wy2 zZC1dmq#O;L8D!vLn@tW2w^|9Li-@JAfLTTeU9HIjwspEZ5ld@j;1?{{84Bu6au^wq zQjYF$8#_J5E{_T1HdE{Zn+65-=Sod}xhj`NQnkLQMqdQ;g4QZsVXf%)7FKF0Qx|xZ z*>393@+_+?-Iz^XD}h3mOP)*1m@peqdsKPg7eu=hIc`-B51n#)Pq}=Is+TS!UY8jU zX64CI)U}AE_1Pkj7B%XkY|7Mtml`!FrdaJ~VZv!<5@|HkenNO@%uCm2Cu^7^PK#Fx z$i$$jR%axT9T&z&Fl$UBiSGyC02Y9Y5c=S*=)K$G59~|{-cNK5sDU;#4Lc_U>`n~a zLn_UIb2-3PqF`}DaL#`pq|fw`;}21V-b>w^S{dI%2MYZ9xmdb}`LT@C2sLUD&6Pef zjBN}m^h8y5Id*MdVSTX|SMC<&)gXtk9La*2%AA?DPifbx>QSOZIs3$s7|Bqa8!Ab zTVsY<1&Z0oqmvgGbx!@4oAE&;z?QsXN)Fbxx%^r%Ih&rpT&PXV+?StF<}Rnq10R;JTJH*-#|z zMa{WLyfhY98w$&mSzbk!yC}n!pXA6F#Vb->k37>^kjg`jo&Hf?iZwsQlABEOYm;%4 zL<+3Sq-;gN91Sojb6N9KoyD2(GH~`ciz~FyvCN|sp!TX{Zbhz3o=wRbO1b!-?tCd$-_fqUZ*?&co72k7Sb zOWZsMyyD&egJNVMob2dOno96;PIL(PmB1Sga?yKmpk|1>C^b%*o~X=9R$$JPk%Whj zEHNgZ)HN=GgQhDxE)u7A!e(Jt%ft96ma`Blv#3R)UBR}T_>iE)Pyt)9fj2CeE8t~V zo=N$*!-0Sl-V|C#ri7%mCM3V)rz|unqB53~34Y;aWX}vN2%9^6n^|-ySzVQie3m-1 z0(k~#rCu%YYr+W22*ZL_i$=|35?bU1Eex04)G=o`k{lPo0 zKlj`-`?hUt$EGAd#idMRO-Z}Q5`Abh9<#KH_@Dpp-~at*Kl|B#{pWxF>X*O#)i3Ts zo0$?BOkH<*u#UMu`n+d`>WP^_?x}vl=Bi^IWq|h>{uoTzw^Fw99BBl(_DQ-$6r5@D z0$x$A5@~OrS3}s0Jfp{<>i1|VSP?vTJIQ}FT@FHMI9Hr@s}xAvRn6u?n77$1uh)wr zRUKEOtVWYtq0B5-WcZ5HxN=`6Pp?pAiW^lX@GMhgR;qK$m6<+pU6Na=$q}an!p$jD zWqIWpK(#a{-jW?}&Wtx^##(X`IJA(!tR(74HD$${X&dDx(p@rS#OkO;Cr2m}!<9)9 z#qptvq;N{pScR0NMAA6MNYg17ono&_P;;3kzsi7oONspmLN5eefV5m!%=(5(gPevD zipsiD9SRV%m*l@5R<4wQUwO5ugm=+l)?0O;*sCeB7H3nzR;9(mtq`s}F_Ot*KbE0m zxESA_+^AsEZ366K;6ntP8cU&!4mCwEej{IEA_C7zRV3rnMPW^hBolil2a51p;2n@c z&_Vk+gwPUr_d&Zfnt2J3#aj{!bEO$AVr>2zNciPScFaql%?)A?Vrg`n92x(>DRHtS zkr!vhgk`Whn2m(&9+g%ZLL8~m52}&pMx#nKSZUH` zL=M$?mwKxQE6hxc-Z?q(OI@H0z_x$P?zx>c8Y1p;P`MKA-8QRIs$5A_D^;!<3^H=wI;q-RrOv8U zui}?ufTZ=h>w%Ca+KtYyCMiiX_a&gvDrNt63Gn@!7)0Wcb zq;Mr!W`KgPrGm}qN~6QXd1nm<~Fw%s+CC=pvW>Jao0m5lXWqpXe7_tAd2>>=sY&K-Sp@3~zus_v>aQ&PMc>RZ$ zyoJ*RFO$PV$c58mv8{&0V_C7ClN1M>!7uGvh#34*P%6ks0jHFwXz$YM#fPWLCp!d)e$dF9ySyqU|+AOC2!7Q>3n_f%ri8z@^o5&e02S7F`Ri+X(`7ii&m}x5$ zQKJSSq4q+@=(P~+~zh*QTN318GeB$}% z{=DMF7hZnp1@Xk9U`%7|?7*Pq@v+1GVKlrO({32k>hUkMk!}ssl zw`J34t^H(g^{IY1w~+&Wmk0c5Z!KkKGGg#6As3fOTD@gN&Nx=h5j;0Lk2Ybc!AQQ1 z;?+nM3Q496X!QbKv{kx6QGeFcBm%YqxlSRzqC(YPD&@J9txAiVj51PPf2pdGRsK9Ts;9_-ZByD0KEJT=cp{cIaBbhGtkR7Y@T#EcMb%9fn;|I70T_s&$ zbs-V8Tge9sVM#yvwzw>=rKdV05ZK}Ec6M$ zCcBzZ@(eXq_tlkmS9>L`rjgl3eh^I;#WD0D+?evxA?SkmFt`}!c_^5m8t3XnG*=SI z`jMMX%}PQmH=q>=6P%|WKFC7?X)0PGBMv>3A%)X)jXCKNBD6*chCY+~%&5bl*biQy z4Sq4xOX3$DJ{TKxARZwEh4kP9T-iM;;EY5+LKLa|#VdaanwK!LzjDQM+DZP^rChTU zFl$Z9O^WBCztcpUDL*xlax{G<>~1Iv)9xY62ETZ8u-I3kOFJV-6q6}@A-YiJ3Rev@ z8+L=(KL|Wo6AW6Vay04=8+B$XT40&5*{Y*!tfREWq4>;)8FK)?VrbFjJlSt%EzatpE7kkKbLref>v&`2B;A{(-je zLs(57+Pz(!ljNopqe%VppB{hqPftJg@WUyg!Q(B}9UdKMg?9bmJwMtaAWY4QZ3vh^ zLc!=HC0k|;G;mo5zryRaofOy$co8|%_7yD5Y*CeElqtUo13(_CG$D)x!u?)tuUG4r zJ^L$Hl&#vVWWEZ3EUHzdf`utq5jNKwWKzPLQ>n@l%qthj1*(F73sWH9pYDqx-xOCt zinlo3r^xUY3ycd!E=+UCl1l}06N#2#UNEamjnt<_fnsB33~1FNxJn7vq(Ze3+GN-^ zOpy?(N(h5?i{nFzVuR#yq2RYLHn<=*Se_WF;xk0l;$tDoWa8>@Wn!2*86d~#GEsCS zS_{&MsO`usixFRCBc*mKvQ4?kj$#U8xxm&}B11vVayRfu{!8Kvgn=zn#-O;#Vf0gQ z4O55GtTCS8z7_l@DxuH@G&k`p~SPssDqY1ECGs^C7BIl4p2?D=h_CO4qz7Oq> z3fL!Y4HjH16`v0iPW#)w{&uh*uo6NextA0jbb)cP#*sdb?l2Ojj2M=gqSuPWu2~A6 zGgy}ZF#QE;I!8@a70uPvEj2au<>k<&x71?OmXs9AkSN2z1 zj1}G%I!f>?;04PLqmk@b*gi`(cW|!Hj;)8i%IyZli#;{8(OKTdz$yP`q1{^x!=E1; z{^G>MtrO#)FN`n*bYZMDZ0Gy;{^mEEKKO)(SB|u^Rb-~kRi@3G>8!;g?&?g}bd$Z= zDp#aL2JPIibJK_0H>_Q`;`yL`yWE<5mpVV@(C(+6_#?j1FFyY)!F5=`?rNg~>x^r2 zU2b{&$8WuiaFX@GS&`Vg2cj0u!QiJOAxK;Ggr zfV!B-IYH1dfaM9GCXgm0R&Y%W6+v}Uq>8*aJ03MAs!MwjlId((PHt7UtssMnmP0(r zaw+nNkO{5*;DxdYwi!`m44MB1THO{BVG>vdjTt>AqOP~|C24?4BR)nd)jDs4FLsW^5V5F5>DApPetEL`GbVk_7g* z6lM~NlSIp6!?NL7;3;*cxcb2he!(@tHYZ&WE@UlgSwNL^Smet=`?)7g_RF)mNeJ2x z$qFDJJ_r|Q$Ax3m<|kjkOYjV4LGJ&H-&kVl&>)gx5XuHpP$`Kgg&YgP1_fuZ3|jp{ z4mdYIIgu_fH$v1QWR`+?(Ne;>w2;V!F=S?57?LG^2EQ%Um8~`4w^|g9%gb0@MA?c( z4CJ=rpq5m#!$?IX3LqO8QPgRzI?B#)v0f5%v5`>Jr9rnvQ$n%~M}upM(hdmPS_*{K zsj)jgeq+}sYdbw=WKNhqU7qT}-SH}0cPBd-oX1gWxKjVb!w>%MzWY_FX=1Ye6!Z0? zXNH?$vTb!O_qR1@oTd&&%mavQD1Behmp(&23zKET*H_HaMg3U}EO=*Id;-71z{-h}hA`8pwMh^b zqrM26`$RcQ*W(hJ4Qf{4w-dpYO_ZG_+Ra0=QK!$Na#fGoN)(*4D^;1*B{>wPDkxG3 zv2LG_O*?*)eqEHc2&Be<7Saxn<#6SWF#u7FU5uBM2hw?!86QDQA=dO zWW)r|QfQ4GJ^f{B*9bxcge4+Q4rZQ06uX#opk&R7Ik-EPn?rl3X7iH!gx~|IVSzM= z4YDlej@vBb}TEwZ%b`mb4^V{WksdO%{VZr zE>&eWqrOHXv}@6b;+1qtxDr>JHDZ^U1@T6S%Ai!}73io{6s{>^OR==hCRMs1Xymx& z{P_1?d#*GuhXQYI_};T49Uu$TEDttNI6Bc)d0^vv_uq5RA0BvUw!Qhw6C)(ZH|Be; z&UClCN^UF+-C7(v(O*AO>%iyDB1;-?@_@&BOA#|i@2!44HfWC~JE760?khL?R4Gw` zyUO)NN18lZD2Zwu?Am$wAsrIg)D&Vhp>Mz9}4Cm zvy@uEbde}TYtU~<$_)fpMUZd3J|C&1&^a6Zm1iNC1iUp`kpcr`3R!}G{h4n;vNJ!? zRgh@Ui?e3O0$Zro3V8Dp?70c0*?>33NLCB&rbGZ+4bg8xh?1z?$GGExo8N;1=#lBMf1=q4u;X*2lXloLxA@c&!-M?}tD(0ROUHe4?!$3O+W{hyC!vX#ea$$5dAnp0|sm z1II`Er@C4uI+}2vr@+OWBPA^A&$NbP_H9S(!Ige7SDw&&5Yh&UB#o zDPDqf-l8JyCtM`ch`8t)|8%5#o&e{VfZa5ks9Z6sj01p0kwQ~gG4#TNKRt09?(4psLu8 z>`H9x)iLAm$1f!;O3;+8&~Mb2`*yOX#vDaJ_$NgvHGLKf=@8zJ;7Sx;D&vUzlM zisk(=is!sX`d|E43oRj9n{Rv`Bx~IidTWxL~pCWJ6Km_R16E} z0#eZ0TYep=_Ep^MtGwA$ejP0H2F&(>*|KZhW!E}OuCy0jZ7aIcUVOQ$>>5~xmj~-g zEgkiUT3!Qw%MR8b*lCidv%$*ZLuUi~O}H+#8k?yxnOgL}3sWwDN!?3s&-QGDfE3bu zawGtFEW85eCBl4&`kC?aWHR45RJf5q8VSH^)wR-C{u z50aNQM5c zJr-RTp2_y=3dCm(ym%=!BeeLU743pt9)(kR1-WW}pA~++Wl$#vO#4`3;v6biW(CQB zg@fi4dnATuYG&+JjDYbsV#gx=hA}ZNtaK!t{mgnHZY!7DWggK~XvgR%NQ7tMT*_vJ zUmJBbMKwbuXqU>_Wf|iQSROZ-tV2Y60BR6D$`|m=U-{!VzxUE< zK5@kMdNRO&;a~pKFXC?`F7{hr{rb=DZT|Y%4uO#1_t$Uj5p(g$>Bh%*H-7$T=hsgU zK0KUT^jkkZU8ns1^x5{k#o*hUv->Ik&+c#VM?QVJMW*^MAFluCDEIN5<)54^|Kk4Y z({(09Sz!CqyDOjES^M~8^+!ibgwA>N)nERzKV*OK3%~RElw%Bpo@4`FL)+}chyt$+ zj~*?@82$p-2a8dK;xMnL5b=EQlrDH4AWyM?PYaBAB?}9pJhQW4lYtQ?4P~`j^p32E zVFTM0lixA+c@eKvBMh8jWM0Ki$v7AYXPiS~z8dStvk@L)Y(%Tu5g2Tp9BB6Hgnzxd zCYoGlSM5Yst-Ghr$%Lq*#@1Fj-c|vGt*w;JQaMAx>Y;cpgMY#Aa6`#(Jx{R_2-g-5 z)d~>{3oFhAwt`%!w(J_O0^W+7ou$`1ORsg6UGFHq+Fo>}tq=%b<+Y>uT36}Kf!Y#7 zeL3|GV`BCV$GaL?YeKaiW%q#rE>;i<`~D6Ob+w^KQa+q!l6kZ)m{h&ZWN0lmy%Grk zSh{1nU?80F5x_M;ISn?~6EpDd?d8nr#v)0Zr|S#%*B8mWJzZM>zl$NEZ)VC!-0UU~ zx76V1U>icSc|g7zek-w1UVei|5%DGQVO~2AiYcUF+uv}pl+a4ff`w%zS$Vnuta!J? znRyWivlUeb{}x`Q3vRC{qU~iBk$5iWkdDxg!1&0N%}k`;xW0R|w*&J=Kih)p)-aAN z){!ts52=C~;aX zU-W09GX^@^7$<>ZzKm5e=AT4#f_!=9W(r>*RfB!NzSidP;o&jk;3$9Lun}MaUc17k zm^#LVXPFnPvRRFZEfx*kARYcC(|c?{@=IuST4Am4}Em9^vfqO^8P3HmfzjY zkh1>EM_a)Br}x)>@o@9~y);)3e*M*v&m%i#l~pFMQ*#f9pT~$G`ZKKb@bn-&=?fbFsn=(9vF!F3_p&=OZ#U z%Cjn{`8TvYSeYe>iZvfZzoPS1^CQY;2Q@Q$3N*REQ}w(UHpY|${Tu%VDi(?svtZG( z_@?${Tv!maS{@V&B^1m=Nh#93%z3Ags)*4TXoG@5v4`<4uw^`?bY`iX8S%7M0^YIa zGILWY$Q@~X{yNfFBK31!3HUYDDe;O{xB8Z`w#Xp8aM1w$Z?%-ux+;a=a=~wR*>zys zReF_2Xt(rQTj8aaTNhgjFSXvf#QTooD_x~GbX7&5*w|1u!t}Ns*w$hN;T0d(IGc&s zp?jLBrCs_Cnq?H}n2quA@SGP{wuI@y!j#Q90W3o$+TroE2Y~b5G3&NcVDF?Ow^z~- z@jhuK!uit55EG{wNVNqm)}Q)y-oyjvibYFRO_Y$&Teh|9=X%#}JSiyHVQ^>$4uyGz(9 zS$5zaBCAPW^DrSi99jF#<`G_KXczpl*FS-|!pQk=Jqy3w7KeGwx*m;xS>$((nkbU7 z4NsWG`3zc#)1h*9nK>e6qU{BwvL%G1JSq`be2u1fq@RfrS+9B)2}#I7Or~;XM;MPZ zk~MiaE!7p^cd)BV*WQK*25SRhn3uj7cait`HkE8IPgi=Bt1B`@j43zxmrg_|ISXXfw~szXYl*! zTf4Nbq^Un$k5f*6`iw4k3x;Lm@6%_y(j)VQN9#cHm#EWsmp`RV<{{PU!PYMU_=DA7 z+~+3I%Fj;M+3F>tnOB-_P9#veBRI3$yO;FL`%JHY=O2LZAAI3=%P(IxHrFos9q7q) zrjapShUEg^$YGLHI(8PO*%=i6U6A@2@#-iw$=HZ}{H?HfHZW|g;+FKYvml16<;hX> zXPRHoN(n9FV6}pzt^Epe6~=+N(zq##%Yucc4Q>8`7OH3; zW~yGi8H|T&oD7LNs%>pmXBb67QWtD22KaW{+kCZorK?V0#H8`2gy?QId}g`H8Y2Rhn&n;Z2VZFskcymOdYA#{Lr z;_M)6G_HV)Yr?D|`l86!UN6wbBh4!+G@nN-11aZ#t-E@>v-$pF3`afTPCxkPzoY&9 z&!77o{+7mDuU|cTo(A^A-P8}h^^d=ND*7`J{skTDz4cEx&3Ur&tH&F^db0WHvn{S0 zaP05X$6KF1-jr(j(Ym^0vduu5%9&F{q|%Y+EH_Q=tV+20$FxrJ-f%tu{#<6tvCMtKm8xSg-4qI`|_Xtg|V?F=NVg{wr_`Q2MJm41+6R` z0b#^vdfua1(X93ecLlr{u6UUFvZ1eVitG$*QLX?coi7OGJuASgQ;e2WUo3kK7(8q% zQ{$jpeP^5%2C-(*9ec&vq2X5?9VQv|!n}aj-`^zlbGOvb_V!9BnBsZ7trE;yM6(j{ zim{Pm;j*!o^0DSpge)M;GhAQ9>5|m^bwUSYbC9k6gyHlKyFuECABolGinv#b%2*FXkOjsVW(+uxTlj=7c7%pH-qgN zC$n14#h$@K*$f_epkVL|PI(2+Kvk=#0Wzl?Y(oYut7@>j1He)?3v4?Du-q9m59rN< z{rIxR4E+q1pl09+a+&SUMk47*R9jGr1_FEtiUSOh5uas>Bm?4m`S{)W=tjh=tGQKw z>&CUSKlr`ReeQq%t>5~iKluGOUwrZ5V$|GL`0aoA){|9&(DR+8XJ*V}XwIKL;f~n$ zuO9CF>ft8-WC7+Qf#;78GrxSe`RNmi6gg(~vc_G~F>C4@enYGiCz6Y1?4j(igW-KZ{!u z3Jwgk1@Kv+KO;B`|JErWyci^feu`pyCmn@MQ3A6i%M@%t z5I$gNtkBn%c9j=&GV?9Ij(F8@Qxs|Gf7vKhEDV0DF24z8d9>UBTng+IYdeW75o^B% zoY^2&)~q7D(BknZyQTJpyI3WjvYO&vXUJiVdYt>q3*30(z5_=V(lZheJz+A)Y`2Bj z4cXjBe5TcP3=b0R&O@lX!(lO%;jA7IRMkHmAWyCRpjrloL0WW2s7S}ZVi`kN}JI^VQ#`pgHe}3i5U;gty`O07X`M>_t*D9`D_{x|5 z=nKE|JAeN-e>F2=!0hxeKl$aq_~MKI{I8o4Z)mi=aZ3+#uCw3$_Fw+Ve_`L@Z~yz3zVt_bXzy*z zdxn|kg1gnp5nE4P)S};0Ay*)m+&M8%KHuEumx5eAlvgzc2EWkpR@g=66?oUCOB+Ea zf16@nY|`Siq}WFFl8uH5S?U*e$G9E{Yg-JcSXiK^jUB3rZgvw)*Ihr+UFYhqrwg{V z*IJRV6l_5*`yTSj6u6nEa-^w@QhB(Jg1HD57UWhJNZVU^bD$FB-Wsea?w1jg43c>I zDWNM0I!mqsUdXqrgx71Ww=ROyCRE%T=Nnn#yLqAE>ba&H7kCe%+l!E?>6dSGm)`8J zF6ytLqNX**&{b}1D2I;42LcNd+yR7pTRj6ZDTamNV$2?FDH4Opq&RLLA-0+YhnQn% z&T9vuJV@5dVc%vlxH}g)&d(k%rV+KMq7lKelMd{f7_+C@dm8B{dCxu2<<<=PmZn%q(^Z$xRw(e6lD%{OwOg;hbc?*Kvo90kL97Re*0MYB zSd!$!3epIBj$O@UcK}|Ov2Qlu3fj%gk4U6nOoU0a>J=9> z(1w5USy5W6LRuDnk-S(_0>#QU$^L>xRlgin5x1l~oL}*H*fWwWJHoOirFaImIlLdK zB;JpZkgs>j)-`JVVRV69_?5rk3w~^B*`x#KK5^a_rrW~M z^uo)3`Db6e{@U5cOB@f1KU*WRCQjtzyhE0G1y!1XiVXNErB)2MGOC)ed?_f~#! zZ|&#zR)2oF{Ik2#%_-IeOULxQCYZZZ>#4>xWD!hG|sm3(kM{pT5ywTVU_3{Kvof@_+y0pHTL5ag1j- z>f$>Xo>|zJ%#ApZ2f0jp36@l`8ZH@cZ00by9US~}n6 zGLWlSSmwWDP0|HZGb`pTR{bxYja!D=B3;Fe!RkVN#ZAZ;ISV5P6D1(b(@XIz^)s-& z(phvF2t&S|rB{J)bHT-i>tObL!?kk_*UvY8M#ogqO6I!WS#qPR^m=b)L4OS>7Ih1a zdH}{37Oom@raMO6V!9*_E`X*+#@&pW7##DURI`}~pHdQMe0JbDPn5LZ34T$o_Oh|P zOpHSM(ay@lttHMT@?p+D5wnl*L%^l)B21varlhB`up5?Sy{PC~Tk$pIDUjP#a0Lj% zzgqpQp%@^;wk0YD57^#1`-6hlf54mHJS7)jN5!JW1HY{Ek9IZ6A(HM@uVxxcoV zOYJV^D4U74gL!#9SXtU$$nj)C*wWjEyW6}L6B$|PSH#wlS%-@QKcp(8jWhI^ie6ii*s0|kR$a&KT~ zuq>I+fyrbj1UvyL@3|`~-EKhK&NRH>msKN8tj1x*$T%I2#HOc1ULUqA#>7mH7$;%Y zLfYDh`cD_4q@kY9%Q^sNhVOpso9*Q{PjeA)`pyQMwk!)wT|fIBPK;Gux$@Rp;@u5C z7c24y+jAf8q{Cynm6=gfOZB70DQADnLBe{PkNpzxA}rrs{wcY0$N7(s7eu5wn&K*W)!d`)6-L9HY|Hu`ak~i~r+%h#hW8l( zgWT4ltBP}W^J9Bpn+es>1x_xan_K^F+w-3pMzO%h?Z*PlSXs$CXM1#D}PWvgI3AN*PA*apA zr6kmjK@$AS1AdXM?8d=~k)eRi>Vr(_XQACerbrTc!(sx|Ox`=6@Jg&Sw^WFi^xLhV z7;A^2s{_D7)&Lg5eU4=rKaF6@nhi(hqR~tukqQfhX>4&jNBrVv2D50(Vx&|-9IPyX zXg*JcLWyvQ-(^|YW4AfU#Tp*AnuZx9<=mrb*XVAX&AZ_3x!{DZ@n8Pw8(T5|!$ne9 zBa-X56uF)D_f{3U2b;h4l`r`WefW^y-%7o^ISV^an>taMez==GN?MRXNNxSeVFsVW z&+o4M;#9!<$?g2dM~fdH|-rr_bA@knW9BxTj$zK(Fl^CmV zMJ}?H5LIK`8T2UBW>)-=Pfg7w|Mb-_6NETedn;}oV2!u0>e@H|?tktje8*TN*;$CY zxdgf!aczf0;{uz4*%>S08#|E+cov)r)dFGeCJ0AM$TL;6^uMxBD2eXk$np%UR~*qA zY{itNttL@F%R>?!oBQnfnsxXpd4jS_*f}-W#w!yg%4yb)e0|tC8kq|_SXF2($3+Q* zaZZ|8m_0R0T|L?+<0r5zu^xn8_O(pt+C8vye>gl+7qtr26#N6f;61se=dQ3L{4y;dpqlkea1zmRS;QFR)c_&QduO znWg36LB6+Mhk{?aapt9)um6C=9z2$W2@s7Hc8tvjeUqbueYIt5@z2;sxP|)k|M#*eLZg#Hz|^86I&mn7g90!KrL4%u!L)Ez5uocO~)^lOwX4c>{z&J;)7n z@+>%$iAS+RW2el-W7$L;Y*IXfVst7E&OWDY0?&q3934!Ngovkz0+wo)|zx%7d`nRwD{iRo5eEHx1<##{-`Ie$W%)|HQgAW$M>p{D3 zsGA_x-LSK*=Ev5^QE+nMtGXfOTY&g>6&=CTt#7=AuE$*)bBetftf z^3?HyVD@1CBM6raE0U~svmflF;oSGPQ}1qNNz!&n0hPx1y7~G_tgG?6AfB)ZiBV@44VsC5l`I?(owYy{caSu0)U|ysuAzV3c zB(YbT91W=XL^zk^Nz^KpKdDAYR(=!!Se|*e5y5KS4O-daAEM#SI0&+n2uj{FKjICs zvC7UdNE}DZtZf&vpu|Q)*UV7oG?5xcHVRu=Vespj3#;WpCN;RQ*j#9W!?4#{3x$PgctyD? zIM1t?Iw+pi!xuDnhkRHJkm-m~z?ef(kl#Y!0?xeeEXEdcUEY_0>s$S}uj|XuxPUMt zCu?UT5Qdb;h}9xuOQ~Lpl)E?>!67GVX(qzBu--n}d9by_ENLm^M$KjciVy&XS=7vJ zMc1gA0W3`}oU1`t)0{O&N9E<`zK$~L=ksT@&iCe-mjt}8y(rI_moQSAJDU-y$ef3K zIV7OU5#7wC z4+(qE&T>r&Q48@I^3~RkpkVUbk*&C&V(RH)=ZLihk|(_ov3Z0k5-7G04RRxiL*8uo z@?@eR9u|I4o}pbzYsN!bN;A3^6iftkd^$k19a(mnSR7#r6yvMR#A1qh>3<1%y zuRtTb8y4mzX9K80sfbjYQ`U8!fMq>kU6a5ZQKjSw$Si4b5{HJ^uAXC7(ylbBl`TRZ zpqiZ!^M=B&L4Z6#?4(iE&jT9&vJMP>Whr>Li_O6)nF|Ykr;MEeS!!tU_BApQcCg;d zk}rxDKo$v_0dbYo(v4KqVuv28gJ%nP(60unfUro=423DDS!4jk0%7{%s#~VW68M1*yutvRD0!Ty;rm=88+NlZ?h2 zUg>|KV47c87z)1n^7pR2`u*##exJ{^IGy3vdTzdi9cB(3b8879i=#_mbALJiV1MVW z)7w9M>&cJbdB*ARA3l4+bGo;kk4H$ST+62JAMNu?ZVk^zLtO55mon6J!+^N3db=T3uhl#`ZVA{W_6lt(Ipb$NAr}wNMS}3}d?HHP2Gupc1?NJ(+R+4* zD|U`ll9in`e6|JSfhk~%yqrt0mlT0{z2jCWby(MH>hC3RlJV}0$4iPGW=r^2126am z)YQyaD9wWdqXT*%e3A|v#NDpmhSk70|G~H4x_ImL7m1fyoV47T3!J3f$8vDQO(G2u zaHO=I`|dZ$SdNZ$Q6xWGi38jBD1BGsZ>>h3s$*fE{u-CABkwglTT6jlE)#vQ4M9V@ zbMLVjxH0?AdXn5%_WsCimgrZ(tgtPBB}qft-ld3gLZUnqW5p)EPckH#2hEJnxr~S{ z4va%xRfQMc;CH3Z4cm6Z6G2nkl~-Sq^9o2<@GlHIZJ~I^wjnvOTu9*|uug*MB%4kw zSW2N<^2z@1g7EC1*4xfWc`VC=%y}_Cv%kRq;|j>CY(~7Y@kX+sF=EjLOB|M2(mBww z1i!M8#3FDnt4YGbs-m9ML&1#`-L)c3_dvwej?Q|dY5HPqmr!emv2#GgU=#2fnDx{? z_is>017v(zfR_(3cnB$1-4Z(%MoNuLg@`Y8z_x`KfisWtSc+3i0T~EOAx#ObFiS5C z6<%pCgqJV35KARx?Pcm)DZELDExZgD%T6wyBL2 z1Lf9gYH2hsTHTaujM4DJ?Ug5cYj;+1%$1k|BYY8sXK1YKD!--3_e}w>f-t2rZ+HZ` z3bSSBU(@i*FNK0hji&A8WW$*kVd1NE`Wnq>k4r_)x!mjbjQ3Ge!ye2*A z(5Xq+YC8V-c%RDo!>5lvdHa?GU$?Z67R$oE$APww7+cJGuAcNZ73;ozi| zRL0KkhFbU+&j$Kcgw$3}Bv^%Zox?^y%Y8O3liF2+j?@qH%I{hv$c{IFS8Wsua>FJT zl<0-KR4QF3$vGIbpkUuX3mZvVFU%Xv9v<0oXjEgSTG6!_2dkzS|FeOp4UwJ2j-^*Z z7F>+31s97ux~>E|R?=1h6Jc$T)Lp76T33*!0X0(9XRs9(ZWn7b5*E#}XjyG63lv{# zxry;oj33PfyrKhNqBG?crWO?AV1$=h3xb7dmMd-nWM1i)`>Tr)qj*(saA{UpI~oYt zbM?c*!|SnWRIH~58;^F^59gEg#jG2TcQu)sYZyj@UutIQaB*KKzzR+kW=qe#${QZu z0AWT;h|-mp-;n0_?8_Pj%Rz^8uMts8?M;Xl*66YB77m^|2Ybz3@+RakbG3nUrMrvS zXQwA0Jbw7&x1T<}a}3F5!!ySlE01m;aPsW&?ZdYp+<*7cqo;Ro-`(BbU0%#Zf*kmE z42$!M$8Q}=ho%-&ae&E02`&z~oCsM|&MY7GG}S9#hio4CtYfSSW+GBTQ%i$oKuR13 zDwZ}NrlRHzUT9DccLQYKICCXA&0rle^tCj%*H?3!j8h9E`aWbU>3RLnLpD;O5Ct|s z{!IzZ$}q^~v6)PpoYJG1WDOQ?;pAA}HF*8i?;fZ8cUiuhoxBb6CIuaWUj*AJ%jNHX z>o5`E7Rg(y&~60geYPBZLIN|2aX$E9e)@rAr~41%&c3QEo#lm3R}$}SB;O^dc`5u< zoh5oOKSfZax-2F^>sY7m<>MzOFkAA)P%0CV}X#b{+WVR^7Gg|~up54-lIH@eDhvVf0vtxO;_oQ+^7 zkp+i?T;l28+SC1wJ1bdMA+St437c&!=g&4X=fz}o_00;3QaI&zyk+b6~$xzBaLD)Mhz}pL% zJKLN0_ji?MCFjC9bEcg$e)qvW-T?5&Cr1yC4vse0IRYN_xsjAoDg)~3eN;T2siKQmtlH{x^00$wt6(4wJH65W{`!NnRKYbOiG z@nQ`O;FjbDnR7&J9?X^SPeRuHim3;?J2*MY{0PAcIg8;Dm3BHBosC74;V^+Y@HOUV zWNHd&21#^|D-23JLrY#+fK7~a)Ly?xkn%~&cRS@hCIUU?K8QN@qs|@Xr!&@Dul?KN zr2XkqSZH@~=J8_iaen$?F7RM}=23q7ewH`Wr!4NJ`Qt8EPkDFwH3Uoo%pc~%54enw znZy!FXDzRD611*fr&-rk=^4bpB6o8u&<}(q{U$=_4N8=KHDF$u9AjMw69uXcX5HhI z_aNcq64_qVse~*i!>{I|^ViP2#8MT6E8Yxga%Dph8^)rSc#Yu&ZjH%$pg~^MhA+el zPGwsk+U1QyT}UCzQQ#@6vYHLC`O6kR5&@;Ms8y=f?fxuRN7jKQk;5oUNyK5%{|1M< zrwkIIGc!cwj@YCXv_;xt-$4W}70`jS1)}L++`Y}1J@8mEW*QZ1N13Uyn4uDK7N!oY z(OTy#E%5WESPWYI*qbYP)Phnul68?_ilSFpJAfW=YnRqo`d?l}yplHgvdGjo5WAjF zohY8AelEBKkfGg{!YlFxK`{_k^)`if@eS2YOGDjRc9YthZ-QvrX9iLf*my$BZ8hvP zVcA-X2JUU--#XYlUCnK!!pR8><}NC2rdN$OE+Sr4QY~LNQ?9Y?d1&`lkPBvcz-B#L zMc2-wKLcUy4J|M=bLsgrOrTi*$N0hgh=nFNg7iyMdjsJf6whhDYb%@DS(sal2SZK^ zw}!LfDJ}&+IM}(ny}rFLha!!fMLGTUy?akiZa=zx{OI=4y@OqDk8UpH=0XI<=*ILt zSg;o2(M&j)3{0kgq{oS2gGD41X~OFWqO2<_=%}qC3rkLms+lh*P9RxW6?Zfc=2~~u zFZp$uXgD(I0pQrA>5K7rK*WPx9YpBxeLg{{<_;-&&SQgmK4D3pJ{JlGznNGR3kMdg zh16_Dj2w|jATXsMEJkR%eT7*k0Z{Itg$YB>VVLN`7*ladctz4nD#q8t^n8-KZ}7Twt7{CO!YgEv5WdNr+Qe$ zu%LASRPs;^C&v0Dtxk=EsDWeTM@dd>pQcUmUZ{4MPr$W&$Qw5L*VPu+OBbu;!^rAuo-U3Wnyy_}tuMi6EkqPh3UV{G5fQc)l!!v|w2=uQbs&_#=vE`LQ66{6HuX_XS^T!g_I28s|<91gq-W zP+y9Pi&HO))2^e1^po8+#z|}=vU|wJv7w;?{-u7d;nJBRTn)3l{sz27XMaFxjX}Dt z_$umF@td!JVyb1P!1Th5iJ^NgoRZ_AudC>;Dq=g>H>~FtYI4$%o%V5*{Qln7qodt> zdz(A?Y&IO=cH!2-9A)#p-7Q>{bi|a?pS=J62ag}Wb$a*7o!d|E-r@E3_QuiX1`wW| z#$9QhnXtt;tL>hck45IfGl_tAdcqduB$;iD{e5DhwSYUquP{h+W0X>v?v-f~p*mn( ztpmfnlT_6CR4N?~&A28YWzBdANa=YAlBKSuoK{y?CRi_G5DdKrCghc&QYsW=z_gG~ zFJ-e!ne1XVI}e0oQB0tq7=V*^x8xbkPZ;x%5vRE914DJ!xvg^t`ol7T5h60N$4Oiq zN@zjcEC^V26&Gz?O>pj``KbrlNs!A$`@1yDDK{neX(j-lp3J&$rC#r;PJv&7ZXjQ&nWcEn&B*rs+%)_P`C`dXlOP9`Gm;w86DkwA zi{+QjaRZc5uPT-CHrqk>Dj8OuVY*r{4o=&OF1+@ge_`DK%Et5vVC8O+NK$%UNnEEe z2C96>K5ujs_k}o_foB9u^9ZTV8tsyngQTn?VTqlTM}|aH%itIA@}B(X@Gx715G!%A zJp}0hOsZw3z`Vzf1(5k1YL1K|aP`HwQ>Jytd<|(Dftmta#!TYc!s)@*Ke=|yg{h^P zD4|H3@Klg?RbL_%HKH^Uveft+b{_!UteE8nuM{nJ~^X&fJx9*(+;nV%y zt$c1}Ho2Tm#tB=VaKOK-+4Mp(Iv)?`VxgGNgM@``gE14)b{t4zuEc|Lk`%1&x|;GE z*P1Iz_3bS@Ii3AZGQ%)x;G{~ip<`oJ?orZkjWnhS55*HRtE(J4kG|eyK zGj|r45oh4vx%BdUZiy!ciZk=Gsaz^aQO)=Boa|v%;uy?2hv25plJir>Zgpf6+)eCq zurFwZcGuOx5wKuuFR8nB@!|Z;1L0f%=(|VQRLXlN#dU0IX3t^Fbp-Un4k}wl#uVPX z-ws+}AO6~yMTa=dZyiP_j^Sd3U(_mKdzuSTMKgE4ohCHHf0$%8B-eOZE<^h8v!RYXy$ipL>pvMZ{RV3`N;ImqR6`92tzsCEH3QdJZ_9mRjuqk^!y zrVMSo2@Hy01s6+EO-8gt-t|V!;?#<9#z-bjJu`rs^}z zfi%tTVQVGiI|6=LFqD8DP^?yyR5X_IReshcOS7!n zP%tI5bhS#MqCzgXgiH-`Rc$O2VT>H8Qc811a4sXX7GH;sC3^0J3Y$aXtSgF4O^q!s zO%b~g%|QK)esI@R$yzb9B$gTuiK$%9B0;Z2CW*Jj)LglCl8qdGY)=7O@UFQfBNBvKmXB>K6>|^_n$m|=ivi{ zthespe|UVfx4Lw&zH+#}vYF2=rxGif+5NSp-Q|2f9*uCM+h#?DrjW+zK^7(QGDk(p z#ZoikHtOo8^3s~3g3kJCDr&0e$fTFi(tJEV7l~k-MAWi#TVYU2Xc}H^x`f}-Wg$pb z&XxgQ!YUaGQ#k`+;E8g@8(!&x=ToW0%pCZIj#uV$`OKWKGl%vj26GPm+;~4v!?jnZ zjJ*oBHjpa^zqrunA6dl->;((Ppt0e~D=$9D&pgNm?xs8f+m!n#;W`A8u?gvvBaXeW zZ7;$EmVuO&+8g{HM4SiFiG$e0`qWs!(21>LKV}2P%y#is(eU1uUKrU~w*TaGf-DfZ zWbaQY#*17aBF)BW7;CL!iLdJNnKkwY#mvkP7U|zf&%oT6<-VA$Up5QO0IhehwqUfS znm+}}qDLjidXp9&ne~99sDOw7Sg_d@l;%{zGys~Cp4x?EO`Uv)VUWC+RbTlna4G~1 zw55LT5>zVZ73fx7Z99RnGB8r@ttMotzg7SX>UlyYu&)YovyPu>QgSn660=tOX2A$qV(>uG!gX20)-XP5p=RE* zcEtWKObRf89tAM3%G#l6S%PBK6w52WrNCPvcFMXkV?&7^Gj>%G>9uSO^;UvV>4jxu zQ4O2;Q2-brVi_M7O0P{7&7YML+SJc>!*M=+Z*Bf?A+Z|qPmkzu=&=F}-a$PQ77*6( z3vAg?z#dujx_a>`B{wAX}cyE-fgYOg!@OHs@kn+2qm6 z!qG~8dw%Zr#>$i9{g2*$@{@PpV)D!6=>Gop>F(B};{%#sQ2dkk-u?K4_dj~?-JiVo z-iObgJ-u_XyS%hHpE=%Kdw?`8iq<}g*74T*;l|2Vem>#%0n+h7Jr*pqEKFI@E=SF< zcCg(5DNl?H4|TS4kwM2nK#dLx(6BZ6gnMxblrP4NZchUtz z#~zjw-R$!^nG?ae7%Z79vCe?ttZB~7jv;7G&cgK}KvqTdVtQ_#g&L$+t1gXnW79WY zKjYJPu1}d|+7cMs3|QA0mHI}P$)K2!JjUp7`zzo6CQ>tPF9W8dxa$ZQ3UcjxA;)fT zd=J+#z@M^gv6nX`u0_t=(?0JAqG_V-OI}mbK8QJ)6$7^K>2oy}CUlPG7YIvSWDMDv zxJU=eGmAfjQ!zgxcaaiw!9Choa1O(>TH|FI-;DB>=SmUybr=}nVrxu7bF38%wUu8w zBXzPx#y!MHCdPVErIZFmZ>uh$3{ms~pBA`MsZW%?1Y1e4Gc*cXshPF)1jV+ptsrDg zfjy#?*3uoTul0&TH3a`kG0c1FXZ{}kHV_J;r-wR8cjrC-FGNOk;nBXJ&^LWCU{`pT z^(8_)T0NXp-~@wYS2kg}1jW|YY7{MV3lL_ACU_!n}!Oipmnec*K`31S_oWx zDDjodh}j_K3t$l1sw$G0yE0i}5CAF)7PpnwAeTzbOmj++%wEHA6B~u>GSoBGC7asW z+suS$fK15BTOgEDnV$myneVePAyxFPD?KP_{2S`a*@KwSwPC7c!GYn?>FWIbjr;~F zcH;(CjP*68w9i_jjfIlJxa6Fa&;S+|E@V!0=A~O_UMxKG642&{13QLj(R9S*nW9;- zR>NTz0`Zn3QyFv|L$BM=mkD@|$jV!pUrvN({cc--chF(Ey}9!KqkA7ddHC+VyAKcc z4p$dX_jexb?>@P6j0Nlc$B#hnNAJG-YIvZp}XtM-Ou*N@JZ^PTV%f@i?kg%Sl$$J#2A)8YeP_t@*g;k}-?v$2RiOkH5XnR=)rUjOzLg|9#X9C?Z zDwdEtg*T7~zv>@=3Qe)C$k+wB2FV1(#x$9+73?lA#8c zg-d9JB{i##;L1X*9SXC>Lk*<@Y84_4miZ8Ano5{JTKeVgaw()~nZ@udTZ)Caon@nt zzeN5BmJA}MtMNQ@mB}~I>FMuayvv6yI}jR=d4nPu7Y7>yEMYj?i|1S=stT5clWlR-MjPn_R-P$TEdSxuHM+yx|odauPy;|FitOg zdwXkVIlr}#r6ZmTPT{e{;DJpmKIvf=3=5+?!^nJ+n({}zZrSd)OVB#_g-_RVnS+gu zqphvOt&RQl^|kr=g;X*X8CKa*dfqOjc|As$d4Z;-yqaRV4G7 z%p876fz9!wWGDzn1L0gkOqg>vLwdY_*3zpWtRtqWtMoEWA_X(Fo0sa^IM37-%@+N~ z+Ltu%Ow7x;@=QK2{>6Ig)ED?r|!kv#&Y$(+^R z$9j<iA)x3Pl9tTyA2C4w+VNeo?LQ3kma2DB*> z*XemF4>H)LWFZL5_QlP8aBkAd8*tYxgexsA1+!2pH8Vh)9&DLHB_3#@T~&&cu&{z2 zwY1WmRQ*f~%pc*Tk>FP-oBH{)%2}1rKwE5+gF?X~UI`0J{|juz4sFEC!5h)2LqwpP zdiaS%z0LoYknbS>68X!i()lAkJ%M=C;T^vIHr~4>P^$q7MwBMJUBHW+)hPG{ZZI;s zmduD{9}vI-VF(voV~zsg6>u@994NxgY$8Zpe8q4>Ihd8rU+mV6Bys@NO3px7+Ul6$ zjx^W6p@Y=GkZ)JLcc4wy7WfBr)bULqjQ>jWT;Zt1OT+&Jza-W&W*foh93C6=8@maO zPrJui9we{h?n?H6rf$MadOQXX{uDnnL?y!uU35)K=<~0NY^9Vd-pKnmU#2ytW`>I? z&Pk7_VCHHAqBQNWm^Ut*AMZ@;Q0mHTg3kBO?w0r}_je%Q_4&+v zG@OZ`K}F_c;fUA8s={1w8X*gf8X=2qBW#uom@r}iO!gEgq?zFkcD6_S-o^Cn_R8|{ z&d%ZH=JxXP+I$X=C8~1J*hN7^sm6V1>USMuTyv{rS2_ux>uPlAT3J8<&K?de5hC4L4@fDJea3Fzpe!PxP5HR3Fxc(t zZ^J5?bc`gOBdiARXCwDF7IxE-m~GglYvWV|t}S}%p{8>F8>2SHF`}*NGYBp{Cq!Iu z=0$p8BrMpLp)i9g?lq9!!&N3KXNE`I3x;lI_(}Erq8ASWyeA7ABAvk z(BVSC9d*^U#kUNd?fh~s8eU4L*5`a$1T#XNLILTlcGUD8zwB|dYSb%I9NRIU+&D{_yD8_%A9@ljg zUs`m*xr2F^k)aaLtW`HRuFu%@RGV*n=UWp!&5VNVovnB9O@uGLd)I{?0c znH0~G$GGG%35q8n>2&?49)! zeIT^K)Kp<<=NMDHrHz=%8g)~Ni>1QLoLA!*F^@-2N#8!r#ZrFkpu8cZTaEm3YFNkT z@HN(S&p=zkLDZo!H)*4O-kpn{uI0e*Lcksz)p1&pqfTrYGh-TRs?@wyHCNsc73=kv zcqp5xpMh}Md8wRflj)mmJuPeT8A7K6BLh^+q{|{|abSf^T8^V_W#Uhc_uc`R59o8Z z?rg1WW|I+@b!u#A#%|7qgU{~V{t+t-Vxhdfzp}WQ%baYkKRP;KL5W?$#YAKym(E6J zl2cyj6&EysWr{@QyuGx5{=ArsvF`w=S%}!l&m&4N#3GO~jt*2TGAdblU`#ANjYuf! z^RNp{x7S)(&c4!&%MoHxaoWE)o1mOt&ZL(Z{lpU}Q6xoUzQVcD*-%FpOn5A(MNzlN zbq{)dG`!%KqFT}>ZR1Y!C~iq(Z;zp;d!)ag1qYzb7XW+G+z;)>M>_=tBVG7!XGz;E zzL2u?$xz9r&oD5x>M{bBzFBK;(d#dClwAj;D?ZZ-sZd^EJG|@}qDMyH%DW7_3V5k( z9fLW$e!(d}1o#Bm3Sch#cpVW$E5{}p6v)M4B|%kc<8PH~ycEVR@o8l2blk$NP#fhj zEiKwI|IVPH9p^CIrxnR@GxQ4K0w|$fr8vQ`?ea#bmN(F@yyt;rK`T)5_csHpNnPWl zjyI%7Hc#rBCi^L*C5#<7%Xjq6Ae}dSlYavhFMk#wgH}y~78IKSpeAL*s$iBU$!3nKXr;2St+=!JnIIjpG{PVnil?+zO|+EaCK09ivpkg0%!Lu6)z#5@ zc9+K6FnHj!6cn?5NNvnde0Aom47LT592d5Ci4TP1hTMaYp95m!Y=hjX-Z>E-9MR2; z_HobD%fza`jUrjy6z28{cZXZSHHnl2zq|Td14G?2qdF)xGzzN@r<`EZfW6J$-DGO2 z8t;~+V1UofV!q53)P#MQW5ls>W5#P)oS7hF76@-9rdds!b(=$DdVUD-XUVW-mc*hl zUTeHqqGI8^A{&QU65`t1VageC4yCQc zgUHU$P7WXLZy&EMK04ewT$xXCA9t|NqU%JA+$Z1J-WoR5by;b~9_JlAs>@XIU-I_8(Ox4hX|TG(EkU!9v>&7|pwbCDpjm8HLr zqevJwSURAqMO#Lmf?Kt;91tpNgHw}0I58D~c5|`VY$zD!?g{t1oi@bhA(G zLq-l1f>{Q^TnN>~XHCMATMSllOInAFtQ}c~2Ibg_3WAQA`hYFHA)0Lx{u=G(@%B{X z<%4z^$51)XTKcl%eRJcw@wT$dFTaqr>Cm#Mt6|9{mto#9n0F2;{7Su@b?9@>0XkD; zG5&^}V_?BKz;G67#t_Ah9;Ob0s$`GAW1>`+G&#wX8)q1V4MWX&hqLm>DUSz{jz1gP zigXNSk)Z@HVx@p#DLcEOrp_3m5Mv#XHQY{xzoAcN50|7ls{wMgKRuwgSh4Q07IkLoyCDK-pnmWl30se=mpVeHrjcY8TW$8e1 zi(DZ6&F$dl=YyO0`4FIpl^Pp#*8z4w8n=?LHyFm6GNzw(4yWwKq|J~R9}F?A<|nq* z5arS+`xiE2cx-?V6^(ZDAs~%f21E29mcf*R-_`-|DNROEPVX@6-x;dOdV1BTXmLt8^jX<==__4dk=p^oO^&L+QQ2(&`J~-OmWI{xF42p4BfoMMANd>2~{4|)EAxZMXQBDlq*rU>~_mwa&%(MjO8-HID`KbhdW|m!PJ!) z=>o+`bC05_@YDY*KOoU}H0*bY+wgd2@Rw+mVCAm)o z`NG2Porifx%6$!`sIfLX2v!`k4H zp8#s7sSg;&Edx@|(}M%Cv3_2IBYjvwAX7-zL;YavjE@auTq9Y}SblOm?KI`Q*5#QA zB1SVFbCT$}2@}7So8&{+TG+cd?Ibi9#>{yw@$o@GI`6acVa{*M5W~(5Zc|@mOdlH6 zLAw#O2-n!+v>R?+2srWqXTm-bG57lhI=lm&6S`Kvu?IMZ%zBu5J?h^~Of82zXwhWC zFU@!s0#42ydh~LJ3Ar0X2qeoOSmR&t%Ol9Wcm~e~)85{yqJ|q69J+Q68s6Vp;noA! zA83cU#=_=cL&0TJTZ3<8FyXPy`6qJI-bFI!LzCHQPr~EO&P*nKPLFATi=tc~xO(OX zBs|y$dMK*rBU3B0aZHuVsaV+M&~XHzv5rpGNC4{_W%VjAt&Q8NcfbSFgGY$9z#`riN>h_dOAFAF%+@PcdixRr$k@XIq{=Hi2e zZ;B$#e+jg8!yO5ZbD0FZ@lkn&g=eijDfWEFdS|WuG{t^hJp%}^%mZeDHc-tv;v&)Q0t7L6|_Rc6rya(gJ=!2(*rWKfm@${NC7<9 ziaf=m)GB%P_SLz21hbx=Ixx$tyQ|LI)4+;7$OSKoe}Os7E9*k&$rQulvY@U;H`X?M z(ZrrRxcG<3I9QafVNfhXB7TV+4W$a9EAr*1f%Y>Y0AnHqktL;T0ns8jlRYanHVcL@ zHJ`KzekDXpXcr2eF?NGo@`BU8$f8zW6rwFY1c^FIh-6Hj9CWo#`yWUG1QZC z3}ID;5c7V=^0aGZ#(9_t?azf)LY~zip>sA6x;q;>$V6Ae-lb{h;*?`~#yRh`0&T8c zLrVElI|Y!7Kd!rXn=D!vS||SHnOt>ME5n;o`30u>t|oBxpkdez}#ZUMT6^^S$bXs zYKrQ7BDy@ASe;8EQ0GLB4g%z*RAMn1pPiW^CW}QvpViFDKSL#YUKWnnMdH}XAeRce z+VyRm7VUv&ouekMczdj41W}sxvb6*Z!|*cx>X~WS7Ga93pctDep_v7PUxGNee}sNT z@k|$N8E!!xw8C!(5RN0yn%be@n5lz`TI4JYOXhAtq6Mh-i-ZMQnKTI_ z>v)q=!WW$~Uj}Q>$y$A%mU-5qOIrXkZ$!1G6sMmB#S3mDekw+{xTz(6DkO=KNLZkF zGvp!=L(CXX17$PQA81#Ob@CHN1Y}+gGL>3zL>Pr)kzX zGUplv$T5qaJ~!hwL!)_^G+q^>izkbzJ4>m%%jx5M^3L+yoyF8q zF18u-AIwD$vf;H5G(9%!7|Hs^ql|%E=AGH#@j`qvJ_Ur+6C+Wp9^^6?4h;ADs7&yW znRL_qe?2Cg3)oW=Bb#ym?re}B4%?~ewXknK;DD@G!|sfC+-K}z5g4(Htu$SAF&!@6 z4+-Dk77}Ug7tXMkL|+`T7|EXHAqJDhe`@B184oPH8k^z_B1ga*xu0_F0tvKmabVP# z@w-{!_YCzz$07S@U~G6f7Tn8c2;~@PuH#rz>7_S1tIOmxL&?qV+KRB-L2V5G()?Bx zT)X)4_j~FpO+D>)a-OZD2wBw9$W{P$DHY$!Wm)jwUs>8*$WmHs)@U4AX|=7-z?a(% zY#jn*2E=4kLcxidK-@n$<+KwvJKWO+3o}&G0;1`8WzC_rnLsT@PRSWel2dA=%Yoo& zY|m;j!HWbPLJf1vjZy7{ncNk{{l((&gp;pflji%#VI+6%trcVA8A12J*XxBW9ftWHQ zOfkA;wkrk?mE9`*OXy7$3YN>Ba5Nq&Az!l$Z2_!?S=G!cNs7^rLgjN}RgEe=Y+yj3 z0mm^CqBi#FfFTuf6T(zLBq^zi`GjABUtfQduUEn$6>=fs22T%Wi5dZ~?s*}tFfMg9 z-{+63znPy2!o@NGlC-)Gx>xoWq)^u;#ekQRK&=<4Supi;D})Pj<*q0XhyN7CL$&N2 z@pn=QXj_E*(9pgkSA+TY^fr-zM`_KEf~3tj@3AgV*;l3~Ak(#wYdK(Fo^q@Q-HTK9 ztapqM!jyeD>ozY1>{-v~oRG3<)-kl;8(V~Jr|gH>*t5Mgp8M;$qxslgI&!oSJp^LO zsguRzNj?ct?xjPAx%gf>ydL#!#sh0nF9k5c&b#T*8r|!pHDWPvV+E6jqpuZl3?inY zp7V}nyjJ-E;x;Fp!}%%ac5)iL?~~}hklaVVO3p~J4aEmN(Qza5CiE)?%~-;;Lkx&i z2wAwPTM93eG0R~!>TS-rkRi|Yhk^PE#zr$167U}2Wrcqo|R5#2FIy%_`(q!V>o zD4XLhE95(E9qDhZ;&@6nI0>8yr7S*w=IU!NRo}SUT~l6j^Gey}H){&6`piQyx3jOI zmW$rK4K-5^3!(1uNq5A$H0umezb_MwkZ6}-%PAV= z!2*ps4TJ^7J`aOnmXfemYC;yP{XA?3CxSDKfEgvns6~x!JgNom67Y_8#YbhFqyZK# zRtQxCV(3^XSiHnwT)sBe#n<8^s9rKYjt_T&U-<%9w)AO8Pg#0!Z6(cp>>uG3VPBpS zT03VT$#NyaCY~oXLa)m98$pTkq7~eLZx{4I|*j8(yW%mL%s| z?Ib9FO4Y!cJww`9Ma1A&@v;%u2S!Tu??gZrkqSGOxT?TrK;8BB_O$|ADW17^24K;L z8C|I_$Yg4?H(?#rHXSm=U3x~B{Nw9E=LWHv5zlsPavNBM+$+I})u3}_W@4SvGytew z`GA9RdL<++EqCbFBksjX>jKN6h`_VcxAV!9rP<^8#PNLc-pbsAjrpg$aPbOQzO$SL zWhaYs#|uet#~+`c9H%>`#zsSqNeMlQ^)X=TqrF9-_8Yr+gW&A!ZKUY1XAZLQ6aMmiVmBS$PR(q@1K@X#FOTX_svW(}q~Wnqh{+ivC37My z)>tcv>mfiMeSLdl10vXH-l98DvP;5_S} z80~6pD7@ZLQDo|9vi5e``{fWrZ(T*fo3EXF@jIoL&y`$yv-ra6LdR8Qx`tXrt-8V+ zoKPVVizzVsN=wOTYI>5+mla@=V=+eZ1}L*x_aha`cSL8RSQSf-{CmN@y;pwAEHMR+KXKWo@5|8k-iPmReg#u#CV%v>i87 zAXfBeAgtn`T_{?-r`w%&Yq9NgzU0cXtQ3yWvY`bT+akm5aBfrzX$%iSn!uI^kn#!4 zt4UjYuHLr;d?~r5ac2C~#e4OA`EqQeQ$Vc{Eq{Z?=HiJ0#XSs>$x=ptUXl7)a$GlN zBr8(3cX2xhENs@x4v~%2i=Nmh+Bn13E+i=>DMNFjF#Gk5;1t*bSWSjf2yH}I4)hCJ zfwO!rsxlM|5~WD?^im{)Spg#_J|{Y>AzU!)>XIwl0@9v3ifWelfU{t^r^(eVG3*+C zRi!OlthoNUWlJ1Zvi=~GVr8M^CyY#*lt@JnPW>#i8<-dD!@2k|055Rn-=@I(++YcE z>0vowxpKLEY+FW?NHGg|Pda@9w;@wZrAW1DvIe_y4 z0Eq{vfj1L@^@#5<6TY*UJj_N`L$0iA6o7BVC-3BwPj?m{tmPhV=H5Hr`sn`Qk4_JN zcz5q~CA%K;FZdk*mhLzout%)}OpzG-($e~n>`Z;AQlQn*(@b;i*0;I1ch=vktd$)B z#$h6D8K~X??`p)i5%ce7!nYS^PnOb{uORfDRFH0ZA>blK$3N7|A%?(kAMLHPuN6BM zm_@~6)Qeh0?iP$pSTrYBFm#P|HiGWbbFWojK454TaVj+Qbswmy@d6j{39 z=Avswn57G^8(XDRF1dJ?iz>#JIxaGVY$Gi754AT|T$O#&m%jat?|5bX;WnxAf@dEr0RVQ#tgO#>3P{1Y^ka!xq21b zgSNIp^Wx_(EDs^(BAKh30t3XY&DW5b6$*RJbH(Ip}Jc)88M9wa2 zdewlJXQB(tHn_TK;pK_0YQ8KtP-`H*3*bi0%a$kZY% zqflvX5NcyOStds!Nj*od$YOA=S~f(N(?PWhKFdbfy%lu>&$o7#KDfQ{!O89q@9zKT z?%s!YcYpEry^ro6eROZ{>CV!Vt^A#(gvs?mp=DkE_9HM z(&zG9l+bzq_(3-Iba&}T_YZ&h&cmNQJq5WR+}V4yl|NY&Qr=0;0AA!NX?wj^+IePA zG`5;&W1_DGv?8N9x*Ns9AyQT2L|?P5yB?bsAFAk-+E`xc+NcqOg zw8k{W_^(*<{o&)gPmi`!UWdonN9By2qpjp7F|!3+S9$Z5%dfm}_0<>kjg{WvKHSkk z+i2WvGk3RET)lYl2QR$#oo|2d8~i-t`htRX-amM9^t3V{$d0UKGwrD?Rg zr_VTZy5|p=&o|7R^UgbumzT#+H+Ab))vdhLzyAo#7Zb(Sf;@mJYJyHUBKv%IjYLID^#ALhmX%Z`b*4^+KiQ>Ox( zMy+^;k3cKAv!LG~v`YL4bXOJ{wMB>D>Z%kk3at4SxrKRm1tU~Z3E>Q{R%R`A^H`?NRjBr@M>0+aRp~4ssdPW+5$J$z?l(<1Z=?< z^0J`8U{-yLP+MP|4K^E!bM#7iJ(#7vffcHQ)@Ga=>_vs1e{OnZX(xP-b~N=pt{m%Tb8C%-GSky)N=q$B z=;ZsTRiZwn;Gky`P>bk{PR``Awgm7B{5C!!&mCy4LC~f;+)`c)qkgI>_98b!lbecH zJcCQZh6@iLw)$R=m&XgwNhD~hNNhAij>aGwQjPVru;@um^tMBXqH$^RGMXz&#``-z ztS@aZx<57LTq-*bz&|vzxkPI(#UXGOyo`K(RtYvn1C?-9;Q}taX$Z7%LS5dKE5Funy2qqjedH{Z@`I20FXAtOw6v;0&BhG~HLyHWWuS7`~hRnWB1Z13}yu24E zdD-u+X4o$&Z3zGbr#Ve5^i&Z{383In;M98nOoDG#ZD9tR#p)DUPrRV6E4t~$vVbix z=bAbC$Ks|OTpyl!Ct??}aFe&*1QmxHlUxgBTP#09qZa*L&}sTAhngPXKQM1?Umocd zWO&T__LY5i-ud1$`Q9_V=b89r&HdZkmHpSQw=*x+Cg91>w_J|hg{jS#quZ`=AbhaC z@L_rOV8gTLdFci3=&pNwd(OEz;~=E+3}je*4fU)|4K0samq#sRsh;P3E2CBt*a_3KaZ`&` zuLFa$a}aqcF}LIYQ(b1PDM!K*6xxelRII}qafeP+is|tnlv9kRNQB1Kq*37gUR99A z@Gsq%>}O%#5ZRf+E>d$ktr{^B;8~EIz_fnl?JU~5N^hpHw1s_z#8z2oAVpzTn-P@h zpX|{;d}-@laN6nCFx5Y*EXXNLO_YWOT?-3jDIt5!V9sE+y+%td$*mwbJ~1N^B7Cq+r3f&(s|Ihha^oS&N1sH<>V`y9%G4+7v3^j#6b8*L50VReu!+zC9Eo`}zn|(ATRzZfv zeR08`T2=1@)GF~Q$`uMWH+cXaPWh=v%fZir5{Xzu-U?NB1xV*#@Lf`1&7fX8+^EC% z1LM}`NG`2)PBO37I&RvYXf3rgeQEn^u()B2_kQm~y29@F>h6jE!u-2e>}BgNFE>zL zL2FXqZn|?z2+QP^>f0@Mfsz8YOw!7yjm5bl{+4h7igRJe4Kyhg<#N<1a_SWFxs)SQ@dB?XFF{Agpujd1l_uPW<$0jF<1sPxDVXuR4cTox`upT~j8*U~`=ps_Lir zi<|B#4V9%G5AL_KAh_xt_k*=BdAJTM^?S;m zno2{ZTCXl-xT!2B1OIkHE%@bv{tXoc9fo|CeLIc%VsipF?f*Vrd z=pGw^ot^%ks-wEnpewgMtM@pDm&RT!IEK4wALQSV$|RSwrLk!-5oP(=RfV_uo1cuE zdnPP>(*x!i`@p=zK5jPEsPD+HB_u^iQeq<0VxwdcVUa-rF_(jqA|=xBkgJl*x)Q~Z zv4alhIi~~uY-ww0dt3u;E|O;yW~P-D6>uo!H?xyuF(JW+`1L(;Jka-y|EW`fzGs8{ z&iS1@dE(n6N5A>o_kaI}@JoIa6lx$`xsVOh7 KsVJ{1E&VTYrDj6_ diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/stopP.565 b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/stopP.565 deleted file mode 100644 index d56a7896fa4846bdc1a37b44421f933452b756ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153654 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 z 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 diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/stopP.bmp b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/stopP.bmp deleted file mode 100644 index c4446e94e00305baf464dce31714e57fa4ff09e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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 z�e#L{gYiG+77tO zv>1I4dv+5Zu zj0eQQLNW@b#2Ki#f+Zj^2V-J)fsKbFJ;*F@3a*2Kr6$Xut2IG)uw%ZjO-Sx*yE4$u zKwutdpYN56+yMF9b9ta0u=y--o4mf{4F?S z8IV=SZ;LY-!&IQa8qAMy7yLQ@g1JwVdV)nQ5=L}JLqgt>@G zRuSNrB;zPd#V2c0EOr7uKYIehY6%9b-L*x^EX26?{9}5Sr?F-kTv_$03GxG8^5XG5 zQVd^6J+L%cF0rs~LKYcmjVp3d!K^{MaOJ@*d9CWTSMjV|Q45QtqCm+tr81iLfGZ7Y zj5HCC-@g$T{m-AiZ>gzbi?H(IP0ck`H!shz#%gkSaCUrnptF^2OwOM=IychaTwO8H z(Nur-ct%3>rj%GBLScd41zE|a97bkhnwOn|-$+S}@?`;yqxI^wt2h_Q+QRq|;ZtU; zpFZXnfae#FZ!;fcW+V~~(pnYSYh_j#Loy9bUho?t&S)J@^0nE(X~#D~6Y& z{5MCst`D@|8191Po9es3kW>t*X)6;`3nO-ZE6GZV3HHrMi0V3b3MNrtQVBG0WeL*d zk)E;6276nx+=R#%5AQ%Y=?`KTe=ra={^qyuz9up(hWVw)@`6u(_NgpYR@?otA{gyO zT2%#(T3r7~mSB)Qk@ZBtsg`+y-{%ixtsLlzVPG*ntCh87o@(6?zFNZ-G8YnRYVdl@ zbyX)U>oq8?3E;J*PjX1gcMXd_3_=8%2a>-?`%GQIwHt-Us*v+ zDC?`d*okq)8g|Ih%gs#AOif6PiwN|0x3Dnc$XZS*vavD4Kf|+3QSnP6(RWA(lhP%F zK*m8!AIR)pA&o45q$Wq=pB2&)G?>F($ZQK8mNGL%HG~KT@)a+}RhbHjthiy%(st7>gR6{_evV>=O6x%Ae-!KP3ZV|5mmARYj((v(%C$i{Xv{!8q!FCO* z-C`~0r;rAIchyP?s@B!Q2W_bZVJkQXUExzL|6yr{2C7yVOey;Ux369$wZW?Noq8Ur z4VJ1NS*!ufB-&t@M)pk`$Wl!flit7irSc@A(iFYG6^nzOK7!{TpW&rNrB5AV4};9& z?6f^)g{Kbgni(CK9v!T&K7Dm&;_mhNOPtNqQrl5qHPX}8UVARw&!g(do|L%A$PkVd zcU`h_)oLA`tkjL{lp7tvE_d!MXB_F`4QNXfey_lTxS-ERS>c56}E}AC}=f|#T6?7=P7kR28sD;7Z0zChr!RcUK<4C z&KrZB*9O{QJBTx$T^1)5`6gUaA-npu6*TA}9 z)zkuEwGIdrfm0(^TR1FhhgDPSBV?%swPzaJJf)#4S5%E9JvZ~GF_6ZOQ>!+pj(Ej0 zt2M7{Q8Gd(LN%LWeI%t^eETDtg7ouGe){s${o6_lvr=-B;3=8Q|LmAd+R1_oJaoUs-i7UJj0J|s34 zY$LgL-CCBke{^FOp7~iAcnL&fy{OVbqVHcvpMhD+CcKvDCrk!aVgi#%lj#x_n+jl! zYEfzO)QB4@CkYYt1^p_2hXO-|=(Bj*9x#J04LRHbu%XP5sksOST7zl^0IbnF-Pr)K zTH~T>04zLnajLyudrEti*1vvF_2b&FNsvT7O7hj9)ElJvm6VIXW-mAjFxCjy_~%tX zdxP(kA>IM2kBx7oN1~DIYXhzBZVv3dP5~#=H;RH5N`sK)AHEZSRUVlD1;Q(8Oaae# zUp={fwQ7Gkv4w^3uZk5fM2vCB*kg%N;E*4KF;g~z4{Qd78h%NC>0`(CY#;7wAL8KHnrgyygY6B&olTR2-G}yUPl^g|I(s}fIW~P`w4RaCYJ>F# zMn-IIvoSuL{R-GQ+1iHML_K{@-m^9#!c2tl2eBLvzoB-WS`M)sH?h#4W1*EeqtB97 zkW{bC3MC#ZenV7R!7S!kHKv3Dv)0gO<)39Hi1Cof1_2GQ8J4gE;!I#oh$5;iD!m|{ zu+3P*52_g``E8l&5xxBv!<`LqJKaHRprD9eJ^UBv+>Cm2|8$3-&YSSI^t>mHvAAnK zKG>UHWL7>_$Te5!wZ<=b9VO=>Js1ng`0y@}zBbT?IA6tP47A*UZG?KD_4;7jco$}= z1FMXwU^x;7gY-1TY`;-W@y%CwU=kmi6V}2MJVb{t4|hMfG$pAGmB`Qn!m<;Tq%af}?4|bctt%R+53jQJfy%~9kFKyLf{L1%`b1Ft zvQR=@zbb@lsB@i{s29$VQzOg;&x(Ipb0NzvctZhxmfgKn*`yRts-kyQ*}hN}%py%$ z-ARcT31tyyW|71baMV)AcoQ#8gh3N(5*!-XX!Xv``Ps?wlw`z*2WM`KJ+W_lc~Nfl ziNiION1Liox12wH;nczQnzN(bt)-hXi!&2jFH~eEvc+03OSzZp=<4dNBa;#z7akVk zPcp^A+DwmymBvOkHm30W^Yf?Z^LI}leM_jEi7;!ga6xyj(nv9AFcZQeFiR|p*euBi zO`;j7eAzhqEIbRz646p2Xkr}@KF9%&E5JXWT7#v^_m)M z0xNKKHKNQKx)W`+U_8-U3&yVpJf(nNxM%j2>kzh;sm7^Z?rEOy5sSi)Som?hEyR1T zfj5SPkVt>qH541XQD6eykl!ynp6FzNX8)P4hjCSNmESTe|mrV5M~W*%H-p&97T-Xp7ZdFuY9$@{F_nV-BjKXHGaWf8DF1=|5&PP0j11Y9pF*W6O z6MMIkPZ{oLA}x4eYeD0=<7_7x8tD7sq7UDBm(y>TuoY5NRA5A80A(Ax`Z}hTraJ4^ zT3Q*imIS}?Gpb_ z(i)mPgX_Rxqt9)1ylS?q5ts>!&2~1x_8fD`?&ixF8}T+R+8EU5x*D(awZQP@Ug7f! z%=5dU!^~Ct+OFb=dRwr{+;geBalV_I`E)dD4XXc!F=okzOy#7!hejcUF#N@*WI7~w zEcHAxr^8(^keHjgDBf6-8XuA1ApXEaPbO~c-tz!oAr2W${`lsC6JR+o^a8UWDsT$J z_byG|nH{?`H=+9RyO+lAT^eT>7wK8=z!Dz0!UCVEdjwbKC%8ebQ>(xguFHZT-i>0& zY57DjEs_rfp9tw?We~N#su)-+XeU!l9h%faDDMHxAPvt%dL`HkJj@N1{g6Kf0Zoz{vm!KJLyQ&h`;Oe(4EOF<}8LL(Wg%xU(qd@UG4Kw-(l%JUGx=8x`n% za{spK69-t)Nr)pQHas^u-juV+jCB3{UHt;x*P9xwTDyAPdVL*z-Sz9&KE5`MOaGqv zASw7K_gRDRyW8sSsPG7O6*Pqx;Mx6o?Fn=jIUdA#|; zWJ~Qt3s2Qewbh~6^g?obgX-(So1=-QJLC#T&viA-bv9fA^3KLfBHg0cbKMQI9rYkR z+gY!)7X?O#Tj)WZe!i=jhx1*$u;EhoLeHIyL3*yM{cybf?PA-B{nQCEpA6~PT8ik(+79eo<7Ek&I8*DkM1rD_4kYl@nv(--COe6jo;AJ(B03) z#nWDYz24&GOIPTuTCsK|E5G@zFwZo_^SzfJi8#N|{4={b@wrnKzcL?GW&>GPAr4hk zjEh$K4Aq)vmiR46v>BYnptNc68#J88EmDCBX0f0OW)<8JjJ1YJqn3;bvN1+Z#U~)G z*an<4NGm2MTWS=*g7H|>g|Wu-^y4jnO@Cpu>HJh{?L=$MOouQ$)mk&za&fjDcU{YM zp;{mp>7MDRo$ajCz@F)-LvQCg>wz4e;e5Wk3C;mq2HlMd#KLelH`EKv+PJgsQfK{a zN9|lEAD@eo>5!eK7DQP5g9;HVXw`ngB$S^#RGAKP#}6cWEW7uxJs>-;-s4OS*(g=E z^^*ah3_uiw5zNzFFm0oJ84Hrj=#5Cc%W})a!h$i4x8+)(OYY7XHK+#ouS^M zB}-PUS%pelni){@`4dqT29-GqX{e?EnDPc17{fC? zc{F97B`>U1M~FU842XYL`3OQ8#J>LBIcsJEdNpNc0K@nV#juLPX)t#+i7QqFitu8X z+iJ%&O>Vj{+IW7LC}l(SSn~yGO&1_pY4yeFHejw*@LxcLHL&TY5%AU;BpQZMcE_T#Gvc|Bcz~HJi z&;?h4R&7Kr$)%A3BVHr zfO>VT@5*Q&37RXzy;nwiWk3XJVu0)Fsa`gYyT+CAfoo%Z*GK^z4-n)a$B` z2JnM4m19zxPT1<-3VneYq)}{^)zj`?n%KUzC?+Z_Gj-$kvcl6x_SILNA~Z2Q&~a;a zj87uDLe^bko7Fr~EeN8NLUy~lT6O$Dd_+)?pSQyXE2UaGh;hz3s=Vt zo~{n@5rOO{Nid&H$znm-+s(_vInd8DCL++u*?}|8R?&2I*r0OR>Xj?l>1_EDOLHR@ z*8TMC6OjI%GCwICy$8?eGdydSL!um1ph>NcG?^GGy#FQCI4c#klfpATzswCOc%UKF zDn*D;YY|<78-Pt%Obd~zh?&f}UQ?~fGGG0uu}G*AXJlEFR$vyNJkfe_6p|aNX+w4A zhHB4_G|B*>9&bJ`0E_pyINo%g#{JMc(~kYPIN5qZcy2?e)x|dCx^||m78DU!ZeSo| zK<%iTZoM!gh{9^)EH0(34#Igj*IvgB+{Uw7_V1#8`sHY>s;SszifT|Iv-huSo{uJG0|==Em_AH^F#n802nD3|$o| z7Ggnnez<#~4Rr%EjfaFyt}vz_?zueFeT9Gak>0DsNcmqd+Q)unJiM$PE>KOzR>WM^ zP{>LO7FHn9q{&$C2Hsd2GG!QYvI34wV)J}Q7Z)cNXIFRJtiPwPS7>-> zXn06uRCsJmSay11I(y`9NU$ z&`_V1ZtS|o#v1F5jVvr#LZ#2)h8rAg?H%pco15qv8(OmqyQ||m1N~*ISFL8-4I{(l zt5+^rzKr(%qIZpr)?w^_{_-gy4kY@A&mN0JlM+RuiMQOnrX{{{9ccCER8*=A3j@Jh z)uCzSl(5aLkPrthT4sn+Q8~V#*ivyPTCE`s&rnU&R|3CeqW>*Sce%GstSpl?g|X%h zBqAqf7y|LemG zJ=Fr<7wJ)2+EmMVjZZbGnL)Qjx@*7{dMD+!S|A5n8h3J=_K@*pbG1BdIsfd@JvoVh zdWpyCd?I-$=WQvHqv83=MbbM1VzO8Z})a7bXUxhJYG|eHS$#*YJ-kKS|jYAfg z5o9qE*T(v3U<}OjL*17KyJiPE<_0=v``c%TNe*_>F46b3)8+@eF7W{BTC{Hukm=LLmko30{a!?2%Q$os+ zR8vSxIF|uYG9;R&{D#cY#5Rk~sGEi&_~}qcLlIOri=!B6I19t9R~@XW9IQPvTz_V) z0g0~CVAdGMO9>BEf5pABLzeX_t-=1Uru&v28Bx^{+uxPa` z?Hm?yo*g@Rbe}8d4ZFHzSmV@D3`-@W6&?j2M#dwaTBTbcX$dSqlK<>YX1eR^R*PDWZ{ zQGQMdhvgOIY$?evE!#4!@tv<9-=W8lfI4_T zV}oVoMxGLsrr1*2Ld~!stsY{qRb?iXX~S4(k`%9VZ8!L5R9Or%6qILNrb0uDGXS$h z9>n5`bCyXQA}I~4fJ6iBXydt_s^hy0(odAh04AaZ2cx_Xadbzxb8dUL;$wq0P z+-5gape3g)+A9;f+tOzwlm6z}ph5i>9*Mj>H}X$eZ)Vy-s{ z!vkQ9Pezs@8Gvb;otW-#1Lm2&Hn#ko>~5a!X$9cPuI9EoUHEZ0=U|+OP(L=5X2bVgW%-A9ZDEU&b4T}`KXH)I zcURq+%R`+{ug##?PuV+8EgEGYGe_b))Lt@K7KxTh2`q;cSTc|@PHKBpr6}G*A$_S^ zl^Asq1QYLpN(8}4G{OOu+a?;$f$;**idck~hZ7LnR6W&PHMPLAVz}WP7z^Z$ zRnyJqKe}}pXjPkk$nHrh-yy;)+AH+JEq++&B}Snd^E#LH@09WD0S^J2#+|QwE(*`!t<)Q;X-dF5 zL0a=37;Ft@O{F1OTf$sdUE%5p6P)(#l9Zmt$@F1S(UGxnafwNZDQOWgagnj{u^W@a zqhk_N(_<1gCZ?pOq^6aZZ_Uolar5-tURHASz`m^1)Z>Q^otKXfja{wn92_idZTSG&Ix?`a-as(L z+J-gZ*47*gZpjyeg++9DNM=$zjZ?v)-GcSCmKJu_W-aGWJ-RfC2v_Yct~s>r-eljC z`3XEj$LRwTtrxat#B9w;++CPP6!*?ppO|V@4^MdyLM@F1G<8QR>!E_fOu>jMU_XRs zOah`!d;>d;e>hZ}y(Kj+$koAU-P(+pK+qkkJB?u$Wk!b)SQJ$?4Ngr?5p5Aw4OC?q zgyF_2pdD{GEBCxoX{Fl=Y)HnCD18R$g_|4Cg7HNC*=ar$!t*)&^FmX`q|Hfa zOU>yfpjT61q7w@kPmgFAivmkHqW|hBrlRi(lQlK7Ly*ND4|c+^W+yZ z>c?8^V0gH>hVe*C?WlUl6&iStwbyIoajF88fb&8I+8DNJunpl*t?9FbJ}4w(wVDca zz%%>#^tRP{`-?*c7~F+#P*8eyPGV|Wa9BiqVruc0^6==mn1rOo1->cKF=6 zvp64DPY;forFZxA42z7kcXr<3-5`7mTropKmIDBCnum^VXD%tmO2p zO@$@&kf$F8^_(wH1ZG7WVe`b{p)R92}y8d;;C<%uNi| z>aMZ3G0R8@KYL_%VP@j4f{c_1|E@DfuJ*OaT93&AiGe7jZ{w>~^%^QIS!OEhx?41) zRo_IfE(+np_2-I{qeDC#4RqHyS{hgFDrq{ht8z!Fi?wOT=|j^hhKxDU;%q7?cM+r& z)zzpdJYyTCTQ4#ebd|@Tm+LJ;_!JQmOoeJdEBs?u>d%O^kil6nX24Ti9B()?T6cPe z_isKgxT=Qsz8*8sW^=-@1SkfT{Pr=Sn;-5`^opH8ffpus104X2sSq=a2rH`qa$+qM zhp*v;RTv&@yfD~sUi!uh3lFtH!}MTR|3vwVVtG}oPL^$0#-v115sXDi*JB5 zegmg5-rpV?8H(Z|%gp%j8-77S3CXD$IeAc>l$se96&oFs91xJ;<{snf9_{WC<;2O# zzR__T^F2KiJl%tLmhJR$3C&7MIlg~yT4H9PPbiD3wwG=`ck1}QZDrA+p$;~#wl*FX z=3ch8zGmw^Hdy=m2Zp)2`+ItXczFZ`_y)wqZVU;GOx&0f92gZA8jHV)ii}N7$w*Jj zDlgx0;>3xZoK1W7?B7h`v*R~zOiW6OkB^Uw zO$Z7KcXDyJvEzWGps1Ks8(Tsub{=FY-8=#VgF%|Tu=xO3S~yr(*;`tgmu*V5G&Az^ zbhg`IX<=#X>F&fH@9T8e0C`NXcXW_vc0%ZAa}~?-rX(hQi z4%Uu_s~s#YeOE7WU9;HJ%G`g=Qb&vRfsPL04p!mrj^w%{1AL-G{1cNm<|M>mw{r{f z3UjjZ;^UGwrtJ4PZlB?FO`C#c1BSU>E`m8KW*niB>K$l&J@{?oQt4~M(gsMF1|3R91 zW5u(EG&}>alIvDso5D_6-_&_~MAqxw!F!MNoZ4QL9UC0N(q9YX^308}t;lb>j9p_|K|uEv!)Ubx+{T+^-UsAjHdJ&1dXe1G+SB88XJo3V>9e{hDqVL*V_0Aop3m^A zaU45@*HunoS{l#6D)ed?D{gz{hZY*MIWQIx9uOxi-1fF=jnIS;)r}g9otQ*~m7_q1 zAsO4C^|1OHV_5Bl)!K7?byYws-7|WFU9h2%|JqePs}{K!82B5T1=!g|>#uV0c1(y2O4wlL784w~Z#(;Vkz;A^hytpBcqqgjB% z`XGDDSWo99ACE+Gl4;4==_z^Xsd@RiTeC6?l2bA^Zz(S>-JF(@Sx``nVwY`(+|5Uh z9NoKj?~$X2D^FMM*trwkE-5J~E-sCVi7(`6_ANUSlXHT?(u&ItgvV@(Nhpbl&reU! zFD@(&@DFfz_we@i^A8BJb8z(FyUD{9S!NGYOB?fuARo3^U$$lyb*h|PU}TGKEVt;SkN z1n;b9GU$pX<15ag(i);;wWmds>natxry+Tyred_F5~>+MHR7x|N3<(o_|hPO2y$}_ zx`0+@bNysGIvLZnIo&w<_nsDdTrmxi6rEJsiwNTfa0S3juek`(Th*W!V!>78Q;3CI zpjF&<)7PHkO7}(DneGdx7y9#+Jr^n=nbuWZ(S5#heyDeLu>0oB*bS)w8Rb_c&^_1R zIgLsa&7*!sxei=VdS+61bfkZ9kbg*UXjEiqWW<*8ZJP>L_~(sL zv9)K1e*jWBoFZ7X}%FNiBU$C`&$KKqWg5=aqMTOh)3(5-eiuUf_fAVC- z=F;ukx9@=G!-o$8v*3OBNMYfYqLQ+bvh58`tx0L6VUbypu?4|lIjLzyWm~p!muj z-7OP6Efd|%Kq~-uH6gqLunI>oe$6oS0y91If;7FR!}OxPicG;3P}NvKJzoi{oz)eL zM|uD5*0Ii(YZJqh-K|jFe(q$)xs&Z@PjptD;)OH)o%6%JPw(HpdwGW6nJ*D`#Kq@N zQ!T?XABj%4qTborY0mDhc;tRZ_Yc4}r@Ol+ zni>aKSw!2|#F?8%ty=10xHd#@t^bO5H|Vdlb1)4K^^Vw4vNg~>C@L(rnE78~%1C#6 zen$50va*8ov;a@v5C7Bn-8am27uoB*?`ZU)m(g1uW*>Untns$iaW!A&X{R4$vdmfk zZD*aoINPiYTK8vv-M2hl3?r>|Bm6uv-5e8RBXaz`QnJ#w26}G_kH{%3*qxJAx_igL zqN43(W#xws9o@2Z`|;x^wr<_NYv+Oe`wkvEda8W;UU#3+Bgan_l`^f|lV4Pxm0Nb~ z_^Hgytb+#+qU2k*ZiVN(O`D=(VmQN{38tUFzmtP~LPQX0dO14R*nrgpIFJ=P^GD{y^HlWer^`)^=!@8GZWmF z8J`m$(st$`#=Bx?S)8Azy@lzjHLKU?tV)UW+gF&@d}{B_VUWhLG|hKOSrIlv%T`N8 z9J%ZknIX=SA8e`yZxyDHi5@T`!f3LD;3Uu?lR*X|!a^^~Ec%Q%4_!Dx8@_OIysi>e zAFVkx-Mio-fcABRTS2#zxLE`JXj?r8waA=K83`FEDb~D%#xT7AtQvYNjsk8kobIBX zuUsJc!fD{t^p?ZdAQoKP&Ylq0(RktN_|WWN&x31MzW$Q(`Riky&D_v@`WSb1RG;KW zcU7N)d_EDF7QPyA)cjWHGf@r+-}Sa-5EFKC3xC0yE>)XSV!C1#hI7{uU{9k<^w0@N&2fpR=(w6xWdtRm0Or^#J0lC z5&oe`u_;>$ic(@W;x~@$*>iBmjxC#V5+cGEzh$xJ4bPQtI2teY(qH7a@;_}2-*+}$ z;_kdY$VNACgMRq>)sea@gPe>4-AtqP{_118B*<=Ei1G3u{Y7COc6>7zyBcTP>TJ^c zbDGJLB<~IR9K;deTO1R%Ju`D>V&e9q!ks&J?ccI>?}2^C4(vZhta{Jh!<;@86Q6eY z=utfO&Ru)AZ3F%?#QfOtW3(MRb|fbyadv<+u|!Uvb#wLd^8;)fEA!R5YnCiqvU0^T zJ>50$Eqec*_uiwxk25`Om@V3vhx)m1PK&cNr@(3*Gst~g3eFwe(Oh}3VoUDvZJStm z+IVdDsci*SyEX^8Ii`gAwwyYUpAg9b8gU`s;KYQHvLd$4T)S4sNPnI2`gI42(#RFw z8DnP*CYbHu+IVDV!;$TC?KPLFRqmpEuI7@;V)GQliasj?Ec#q`2C*e%F;ZLEedaLz zY#aB0x6sb)PpGa%qE8K;KaNDxG_d7U(A_*rKp1rCI~qpX>!rs7w@VvpsTpajBM7W9 zO#gZk2h5rvYX$>B*1#4!frU`uY4Y1qT|pByJ}+tvpKWK4E0T}3oIcWc>QGDNk*GdKG17pEz(}M{)7_ii+}* zErr?ng&CRIi3xB0$zt&vPD|f(TKkrp$y)(d%L2@o_}H%vwb6C=unsp~67OS`>0+GW zYa8cg7V2#k?`#<2VHRQXfsf7Nc%ye>bl-`vU7o7{Li`Pt-{u858F&T%u# zvp0-)HreK4QsVDg7T~_s!@3|LeAmH)XVNlCTbf&{&Ye3`Sy@?eivQ5$rluw)k0(!_ ztf{FvRZ+2puaBYw;sDEI9tE-cl>3S!ev$eUduFm4ci(qf%n$_>T z%emEy%}fp1v}x6<nNR{hPOwJzL$n+F9wZTN@eRet)tLgMD|r_s(cf-TrN693f$A z)>C!#Dr=*Nfl&D=wV*X3)GCxmw2ilwnIL(_+S9#fkJRqp+Ff~&VBl~~1#Sf0hI388 zVHlW)FP@|gR2?0vK0d_53nxZeYaw>Ht!{`xd;M^0-5`^=mYTuliwtDkybvP(cRTU_ znB><;Lp40pI?q?qFbo}4r(hU;RwSQN7z>syl}CZOsp3#`<>7{t2kK8A0PLp9BRzFh z3_8wNHlI0Ob97(L;XNSDzbZYg>D1xoiX*%&pOk^xv!et(SZmqeadiI#l zq9Wsx5|h(2@yvNeCA7rk?5vy;U%#~El>Y1skjhGg$1Q^PY#-hLC;Rc0~q8ZZL7*yeVhb=Ca1>vs;Twc9d*Rk55mDiQAl= z`PVnC-h0Dk?c0GLzUip{mbd<&UCiI}b2bRIH}Lh@5bb7?;%O1*W*Q#kl;C3K?`t3B zXb@_)G{9n6kk!&i)3@R`tVlCiywT{-VFv#hX7Hy7lf}u_%i?@&({J0t>xvgedzF^qeqWy zE#H=zo9pc#;Nj!zJ{;!{Eh>NmmL#$c6&Z%_-aoR(GP$mtkHhzAUCkj zq?MUbYsJCBs#$=Z*|k z9UZ-Ra;pD-_io*@34%MGH*m{lwZ7=jTUO=2{kM4(L z+Qq|rE*#oT-*Dn!b&t7`( z_!=+w)P2w0%D{VD5u59zy4dC{Z)8w53 z$8}|P%gTMN_Qd!c@wP3A4%kwff3)gs?XI1>w{F|k)Y4p0QGrTdxOgEaH)nHM*|C!+ zv-9#nIy5peI6REmvA3^}ub5|1u7k{|H(u|x*bV#6$g-Ofl!+q7qT2Jn$V2R+yozcG8)|z0BhqpBLbG2(Y zx{Cv1yj|>$ZYwNIibA5<^4ibcu4+%wW7f+|^xtE3Ir}&EG`3e98g4i{)^J*UHLF>> z8eZ9tT6iYCA}THMWT6_Z?yNXaf2jOuX$~Gklv%6@KDlz}!pXjKNBYkl={tM4Up3es zxp1Pt{yebt5`t)`?rS*Tivez^hUfmq^ZiX1q%~gP3ZO2)OpfCf^J=aqo>^vm3r)fl zBE@Q=C+4~4>`-g{>`>38k-lqFW1}6|^5%)2_SvD{(M~3t9djdtvqOEC#)jr6Mi_Gh z%GIecuC$%61nka>XIsynM5`|x-h*7jbIa*tye+>WQ%Hg^7fv7d@$*Sah?yAZ<^0wM zw{Pv;x1S*Mrh<};?EH;M8R1cBo?eO0&dK4SrFPcwI!pZ4Eb&|Qwx{9Zz}0X0t$8na z?R(xU-||@XuGg}^I_dl+NPpP|gC!2uhECbZsl_?D!Cn#8CL2m~bGH^2pFeeSUwL_u zceIVMUrKD!TW?w}`>X5X|L|D*j@Qz+oL$yOS*`YPw+!~Niq(HR+I)Gi<(gz)>+~SU z>|n=~5a$$kvuID#*bS>gjF$PEz87Woc97|xVy)iJF#1c}hUMAoKTKTrPU`A6V^;k~ z+=@5iR=$z3^o=CrMFqz1=dF1&Rqw4dn-B9$-pco~+!N})H^_OH`SMIJr~Klgy+@Co zC@v+!vAw9cn6SvfLx)bBI(4$5;$&q-OniJ$c$i;MU|3Y7hqo8CO+i8a{yuK3paI=r zZ)XabygVF>vl2O~2*uuDV_{%o#5~d6(Zd1#E4V7N{UiqD|Zza z#0Irj>?eE|=wg=}8+@sw?kZtG!#J6>#48mCf-|D4c?5o4mKFqenc3sl|vpS zZQa?(Sc|-YmS&h4Kr$v7n?VoWgRGA1Zk-+On;T}w!rNazf5y(qpFF((E_jKI3c4cO`uj$N* z_VblPtqm-oo*x~!HZj7dgQ_0BOr2d_LV^QhB0^)MB0qlocy4yKprkA@g+z8raA>l< zV~nYJu(ef`;kux8i~V$0`s=Ro*I5#<`fa~8?}n`Wi{H{exvluK_v-h&bU*N2^{%h} zDr>#>?cJ=rVnX7=0>V8Uf-Q_}OLDRgZZ99`Y#Zw8hzZWn`Ow+P%KN=HHY|SA_QN+U zSG?(LwA|BrwYR;lzo%7%>7sDs_aZGm3=MY7j&#p* z{b!cRn|WsMWLx|x&2ed|>HB$s4x3#Jiq^fCVQSaTKfh!5?h_TK3QJ2;)6+bBym#&1=^Nl585NP9lGspvdQWM=-m?4%U-#1N2oVyvlIwN7Wn>Xo{Bt0Mf} ziCP*OuHz88Ku@QbK#%5=`=}-j^>NkFU$OJnp$>y)Q^bq%kZ;FbTCeG(vLJ-8tAk(%4%7#pG}O>B46Wo zL#yYF;ZSsrM=BigUhRezhs(md-GsT+)Q($cnX-aHetv;|-W>XAZf=;F6jOKRMB|xLJ4;K#{51X)Gh~UGjn(>fx*xpzE{hbx0)74E z9Qh6VH*d1D<;Ye2HS5+|SeV2G`*HB}N}bh#zAhZ#TXSr0-SIs~IL9hG$yguHzB)TD zgu3WEBV9KJ*mI+WWDSZ9&+}b%JJMpdrpH~}zqR(jwox+aY%{*2h;ZD<{LjDt{U86}$U*k(f5w58Y!&|S&MnTYeERq?Ckx-Zc>@b^b!KXIZ20z-`GIbfT z$7A`Qy>#C3*ZDAD<=Z~X-}YF$IMnEaxHU@xmi^gx1y}y;YrG^_@BKid<$-%%%Hw9Sx6L(@hpV#(Hy z_L<{zAV?e;9qk<$sEo(K*9`{@Eg(G1aEw}*Y_o06@>tlr_RD!+P9FwY*xyvs5)Z;G znwZbglB@_gEf6i1ivZPbw=5y6j^Ey;LHxs4yS8ZHNRc zi_7Aba=1K>R#on>7@QU(l>D7$-K^fWpxxL}8?)<`9+S4Sw!&-DbS1;{`&*Vy>j5NR zKfDW2eeK{5VCEz17VlX)r#}%MZLY4eYv*;>FPYjtTvxGY*<46LU!I)B0aZ(={eiD_ zC%B$A0 z5d!i!&A`CJ6I2X@3@QzJ;3$#^Jkym zzyIln&j9A1fBXTM`OiQ8`0HQ)g7fPyzx?$1^ADdseSH7^!@GCyUcUw@^8E2**e?vg zhIz~IeERSqyu5q&PQ0$xWU~Q`ZEhz7@0IZ?a5hxMQ%R5+70JqYv&-GWC$}U@%JGo$ogQ7gwmiutIRs2YDOJIt@J%Xr)EyDC z^&P2HM{Uj7qX%aV4cj#lA;VviV+Fj*{8J&uwMp5Ad>5th{bDVJa^#$xxZcfkU<3=R+bLLmUN!wqEW?C$A=W`UsJ-QJWM z=xl(Yls~_D`QrBV16$S)b=1H5?glt5Pwd^n#O>tI_$RR|Uh@a-l| z*lm|d#UPTQ)mW8&_-{A8rmg=XBOC z>~GmJKD=zOee1&MXQ1C|`x+RA^WC`QNj>2=o$k@H{|rTfA!_|m4NEiC-?8V zeDa&~#|~XQe)PotU4ZJt+cq57v}WJ>6@X{Z)c{vGfZMd9fHRR6hUjejL``I}G6I4G z28bQsz4hqM&ByodxOMT|(+8lF@4tNd9|KY#u8 z_XMQ>{`+ru^V_e#{`?a_{`02~AKt%x^Wxdl7f+wQef8@7n>X*@ynXuQNqb+$^L#C!`r%PhbIak&;;zL`}N zA{PW1m?$>W%_<0RaZz%Sla6!8VnFZAXa=a94)`{I}zDdio+7)iQ%5RZ+ zl^mmj;!xlNmeOi5-pwoWo5eM(+!}I$M}(=@a@zTb1~w+%5FTI@fMQA2NBd~VNGYY0 zUYHVN6Eb{7b99JVlwfApO0ff0QOd#@72}2kn4WUpkPtJ%E$(3FSBSYuud8+H@XQ%w zv!~A*8yXpzF*Y_Z3`{-Z4ftJdceElpW5zTyv<}#eI56C4w6n3fDy)_YL4MC4?5U0T0yc{f zMqG0l$*_O^%xP7@K*Z+}2?aO;9`pu*9&92Ue>qq#`NUqM)=xC3r1b zGi3MJ^aaCR-)>!(^xD20=?2p&n3{SLVYg1&Sshw6Hrxu!sI=unjq#(KSDxLw*oxAlQxkq{~9cs+cyCf-@SSXA~iVAA3eBw`oyul+kv8ioYR>K zP!y||q-FN1F9E$!-Pp5w84&g4{XaxKnPG7==I^dwfxTuQ-@g6n(Uw=)@j6eSbTK?znzu~}T65H_n{rBI~T>Zlj|KaL40Oq%EKYaM`>eZ{M zGp5IDYrrzs(cJ~%eKM7rGk5Obv}sT}0gHYhoJiF4$Rw3)QU#Cbryv~kLMtxEO3XEr ziky^u3#HH|Bv(>OAWc_^FK}Zs9aMyaigeTS16;J5j?Ey@T~tO%k?UE4Gm{R2+;!P@>f`1NQPNtE{bDUr$3?5ZO!&5;mZ- zh$S>3MI@xCR2-{C=2i22T5g47hhi%Z_m zMkmmj9&&yhmsv~8Z=~d>svOf=lQVVY4V0WtMqZ5&)#{eFXz7hY^pJ@&i%;&t=e8iT zlI)UJm#RTRZ}7OFzCWwIyKnhdtLmGZM`z4{Q=3Y)x3&%qPEFJ#Owix}9b9JPlVJS$Fc*xgMSIeN&OnOb&>r$3WDkDMgW)n%oq7npwOpu6$ zr2?L~j1T%;t&pna5~V~)CKF65S!Zo*W@nRCEelxnBVEl?T57f}U$k}ELdeiA9UT<& zxbSAQt!}ub7QArjuDX*)FCN@;X7Bbx>sKAw^wqlY(S55H9Ne}6vS(M%oO}X*tlz$Q z_uA#}Z(h51?ee7)-+a9hz`S(Fip6Q%u2=-P1w2Dk`1JxOL;jqlX{fy#D;|J>VHI`maC!_~W-Hmc%Q1oAa{RJZAk6(ZL<)@$EfCzd2?(Ms`Z{NImGi$;8%0zXvD&~(yqOll& zxuK<{x4*x&qs!y3(5k&=OSQ>Z&melJB`zAmh0C>*@*TKbBcaFw$qgpPg~~MwDKS#9 zkB|#WBS0?jrQx0DW*3F9`6fc1norSJdJ-C`GUl(63t?rb4|L4QL;Jg%`*q@QcVn+Z z7o}k}N|BD7A>-uhS=kyX0iwTvl2UCqbrCUTSR{^s;}sO*k%ed`th^&h%P49I#%U~V zQ&6j<_@JB-w3OAzaWxWT!oqJU#e~Z#VHGP(&i1Nl9c6^}Qfe;?*-6ZesadT|WK4kU zGL{Xg_+6yz)-p=FOWvZO#=W{JT3Vf~WQ2w8Bq3v*lKP^|I3ly!AnBzdyycw!hL*XV zy+cz+ra>-x_MACg-Cau-FY4@Q9~kJjI~|b3GeA3x)#UfNU^*GB)%btE{P4d&fBNg= z>%Tw0d3Ed3iWyT*Z(p~0;jAi;rL(4@H4#n1`erT@HmV=ou{q*#z!2=O7LKo8I6l(d zzhzfW@KKa!C-N*K9 z1*q>{mDbYWxH!3QC%7^m-MRJp*|Q(szXusHnc4XLmtX(QxPtCQI;ayI34Y~vm!jaG6BM`-T**Q!iUBNZ;&{jF2N<~Zx@JV8hTZBrO1Th&S zAVwt0$w3~*V-nO+5Edn+iCxf&&x;{*t2m@iR&fWbI3^>tu_;Y-Od|_hM=olq2`_7@ zou5j~7m!={_$q8hEiNaH$qnMO!`Q4;Zf2BA=ob+ikeNNWf;NFDH8eWj(cL#Xb7rcc zVQkh+r`HRHLyN->g3aainC(^=KN715E}k{`&kt|^{`C5<_b>kS?!{m4U;g>}$sezu z{P6Jhn&~}CDeP@#SkzLeCBkk=SUld{Pz95M7R?xf9<;VpV)~TcjmwuS<>f>Q!D%yk z-A*cviY4HcFdR)Nq|vG3Qa11~jY%t$h-geYmPBAO=`e?cM2A6sbRvxc-&}$!hDD7m z*mTaILGIdN)W9gJvBB=6ySJS@u=mjR&8H6RJ#*y1iLdv}?CraG=_~{_4{qOlc>Bhk zi|3E;-VQFcYp0IE^zF?{7wm^B;r2}jwr>1({~pMd0b?KDv1vOP+t#lFX5O%H_J##x zP`m?3gZ%h*&$jDlPu;(D{r-(>Z=OH>^zI#y@T0r8KwX?avLAANla33B86kZKNe{?W zAKkw3)c#!{LhfF<`2Ef6kM7VEs;*^9@I9)EZD#p8#N`uOqFN66p-d;bAYo`?-U ze@wpt)d70rs}1X%0iQP<0%Hbf=DOyl!O>}R=FRKq=}p$Q7A;4$Iuo)5xM1=%v zImK?1CFzt>J#_tP)iSXpFDFOHDwU%ACT6{kkrJXjWhIT2OlN6<*T790__dropHt9n zp!IlEjYeUFQ{-hMQ&14ZW!KV*lZ3(q1JTApb`g+nVnJ0=Rs^5bU{wwc53QOxeQn4) z!)NU0p*k2jE%f{*Ty_|p9nZ?}=4VA1$a+L(vj97yq%^R}k=n+g(OGjqMQ_}^xv{ln z)|@%u*NRnFg9Q<~CzCZvvsphj(z|m0jK4p=`uoGHzW~qg0M*aoyu5m5@sw6@A8lDM z{oc3xmk)P-Ii*!m#$V7=Z&Ql>I{EP(>mFUZcjz)r=t&N=>ElU>6-MV(=nZpNH&70erO5V75_WN5mzq@|*)`fHDjvl^#?$m*8 z8&4gA^4yWL#}41PaQ6Deb2l%Yzk2r6k)2zhHV3~EkdEHEbOERikTJm3;JX0*yz8qk zp^^w(efq#2P|KH39EBM0@YW4L%jxU~h!gO6ezgQl{!mzf+BBs2z{m%lPe_=+Idxz+ z#GYV1g5L}Hzn?m==jMeo-`%)!^Wr&BI{@-`uU{d(uVy}n2oU=05W zfS+sX>%02;JHg@}tBEHY4XR3Vp^2Ddqh>p3B`%Asl@5gxq=irjsSG={C`>B!u!%8B ziJw8LV2~op@=l$;Tcv9uvU%IOwN`Zyl@A351L_MgAxF$8R`SUPtI8{7It-$aQs~ud^cI5-$_x}V zf5p7HZc9{3w^X_7RIHE?8z@Coun~58wpC86;1`9;@~Tx_V)Wn$@6^3Y~gIP0+&y0||r5VKD*HGEu3tlt;p#$Y>P07=bJ*M5BsPXcW*m zoT2Ckmq-UU0;9=Syzr_)AI$a_o}Hh_vjV}qRn4!DNk zOadFe6TX!0G1;>nxE%`UhqtcZw{`_&LiVpuS7(mw+;r*Nqo)q;yKww4u=k5cj~?E; z_x#bLyH_vYxq4~uzTFjx>QH3`n3+NKRi|p9(AjWehb8a7BS@N@A& zpSg~SwlQ%kG2L29Fp0=!o1!x2ul88{b+Ke;Q+rFYdEd6}%{3h?tf@LsQJ7hZ%QB$y zmE~NUh*oZu1-youy2?%_##|W)lySr?8mlSUJaftrhp4frW5{eTHcLe*_KPVAl^`HM zd*j|3ohTw_d2D43QAdqY9Fj4DB{>FUwzD|XPeD~+^TJw2w^r2L5SeZg4tfk@QpT{D z-epz}C2FVj_pPc+EhHnGXoy-&POX4cMMFn9R6pntN^ua8UB_lLvUv%Ks8*}2Xl(B4 z?CGtouWRe*s7a;3APvSX=)*PHtuDV;V>Ezm08DvXR?Pq7&C@^OfZllZ`1eu=5 z;j`fv8d`Fr4l~&KC{!YyN&=xGTRKo&z7ge)0VA{qG^SmX@kdpFF&G7qETd_z_5bfKCR}1+XX-M}U^oS&rokw=Y{T z30HW6u1@>qU{d{;bKyN88OR(yZeBcRQ`!_ao|fNVrmb}FW(&BFK)QT6ciWPAlO>pw z`*vJ7df*O7ky{`|?tmJ3_VE69H?Lnlb!_kM?ZL_jv;jhc_GIT&dslb7I^_?f1T43N z?H4nHe7v8D@i7U0QlXoP3~-4-e4c}hvJ;UeY_5%%=O-5il-v}E4LUMRLxlzWDrtF* zRF-1VD^P`cD#;;YIW!WV+m>WgHTXg~3uP>$f{NCY^JEa;iGE+S0k<9kW$4tKB$JP zd2JeT3y;_+m$nAO9WCI|>g?(p7=V!o?OmM%gM;2c05Z~MyA2ez+Mt8(EW6FPYwc11 z^PjID|MueH?=K(y`uzS+kMI5R^m};1`QgDGK=p_3t^=gs-?{So#>Lmy&%e5QZuwA` zOC#;C34!(E`1+;Ghr4=`;nQ1IE*^vq73N&;wp}W2+8FZ?p;!-Y?%V$BQ#%;9-`P}+y z=w;JT=~O(01hWCt^I9n+$nnB~Od9;j4gmh}_6;c5A0YAj`qk6>-@}?4(9*jgiLrSN zgn{?2UW6nbkT76%l7Zm~$eg_Y2htOGo&zq>G=`VV0}~O*?@fzlZ%&&+(_r4TaBRc; znHv|3?MyTI+^tLJZC^GY?)x{a1X*(N*rBtB_d-Sc*f)p$k&w;p0*z5o4JfW19vy9I z>#;kkI2acTX{QugD7i*Pk(&Xjwi3UP93vGuNN8})Ie3&PvB*Kp^-!|FT^~qQbn9i+ zM6{KL@yVohJZ^=gw7M+*(4eg-Q0Hv*nBuJ+;8aK{#YIH?z<|&ef%&b#lH{ zCv`R^>N^@cjOBpRE-~9a*wImtDK7d#g3VEgC|Zx%tuObIG7Y3mm6GYy^8CaCnadF5 zQg!H@a;?A}v_-ghqkyI^%F<%#wK8VZTAnN=B%G?0hF?iQ zgcbB25v5r~?P6iN=*6{|{91=>5qu;UMY*J&GQqHb)vXhbpdqc7U+I!HGjU0?yw#+t z;u6CYyoE!L6HviYaupd-uaxzw)$OTGD*j!FH7KaTA zE*d@bX=#q`-0@vt(n$&_t@S?=Z~)* z?S(cIK=r-j`}QrH>o=-o0xmdKpx=x_l1r2m=Zw-g! z=HVk;92DKGETpj%D+q9h)_M z5tm~{<{I#MUQB^e!1Ob49wx#^Lj*}k7dF$3%e1kJo%AAmIW5XX+DJL3f!02~ENqZE z=1!k6+&56+g`ac<4XbTSCW$5GgrG?WaNitQ6o>;i&0WUs^) zmD7tgc6rdE^p;XJRsNW`RKp~ybs}#W%TP}9sQJ*?RZA}pDCuDl$!?d|%NW%XdNnF5 zqT%#2k*yMXkA^cxfUKe+TYT#7GF%6%sGE?RFewJgOZ!#aZXTtz+TUdm*HE!>F}GI8 zj;RDqD!!wP7Si)l_L+0AyI0dVzjg8Lt&2e2@9$iN?|F6g?2~iHZXe!#qf|UOT&VO55SpONJWa`f`!H3^9a{kr_%%fjB=yhR;%vGYs@B zpAcVx%h!T)j|Q5j(5&IRHA07+XYraMdbyU47fR_qHQy&@=;dsurQB~Qt3YRmAjwun zO7JjV39ibeN$~KlfWBQq3c1Rs@{t|%tUejFBjKJUWptR8i^cd}r+HAp@1bLwSfu(g zZY7tHqUVRoa4ANKgGos_HF0PeD`&>YD36>GM(6mES=Fe*s8ZfGrGG|eXYZoLi#j^n zdwP4CTbrwElD>c+!0ht42KsuSi&mvo!F5Ee~=lHrMUY&eiS3}UGUOw2dZSFLWK`AbUX~fio&mOR98zVlo zLPqDZXlxp!M^ZtzNhx(1wZpKkcjc1y+8T$+OoR1z3@WG#C|LlK0ncCx`elNsp`HS4 z41yV~ao5hCymsaUbU#7i4{9YKk0)^ZZ$h4s7L)QA-i(8a*t94uEz)9R0?crkB;<_? z0m;DFvjM<>XL!O#cy3RNjd^=kf4LuquWndz2>g2+zpAW?>R^Pe!x4-|AX8e`)YLb1 z%E*lA^-UcTX@G&X3s^o76?iE8<=J$+I&!X0L{5@&9YR8^6dNrixCQt~8Py@ASsG$> z2X=1lX{oEKs93Xd-I4_>lzcB8rPPX}Y*vth3K8?dtl}yPm^Mpdlsp4I(?ZG(aY`)o z0tYkCET&kY_bOd4C!ATpsh7LEXuZRFvq z^D-2LnU=yYY_yzaGW^C-RT`n&V+xtI79K@KEi!@yT3zawat&mZj9Or#AnbB_4+kG- zW2#vNewVC8!SqXzRd!)LwE$3BD@7;eq#iCh!6>d3QoCeyD1|ra1T9b*=i+Obs5(BW z1D{)iEsCOYBQ#VT`n)W%T6|$S4^<7(A~vrMUl1YZx9})Uc4NQ8n(XKv0ISmC#f!%0 zk2ke6!2w!^LBS@gS#LCWeO|3jYd7oeUpxVt8Dz%i`!@m1AMRZFaOWyK-`&3O=Em9d zGfmMK;mw=t=Yg(YT|e{k>Zw=P&P+h}eCNS9(sQH)Wg$xWWE{dkfH7RQFP#s} zylW+7KNjs>v*hb_%V13>_*Y>dkV>bu*zM8E%0M^-twRt4!l|imb~+P0ipynaq~NT? z0&rzG@wpZf!cj^MiC7VImKN$JER@xzN^x->CAWf!F)GETT^rZW85#I;eAbT5o7a7{ zdh3P_S1+6o1Ujh%9~D(WMMhY-cquC>lho7DZhWSlnr~yF9MoJJvp_E-s{^i>soYcP zt&nQDB3eYvij|X7N=9`VzD~~>q~nq%Nk5$cdFiVBj8I8t5|dkv&aMXefyfV* zWQG)s4*0Dp%5oyJ;^@o-si2OEXoFNw8Lv87I~=KKhn9z~o?gh^Ro5gcV-+x&DOsBY zRJ%NGm=$ccnAKX1&t-Xh`4lMUA3$sXKi>mUaV;${ZeMzL>%zO+mtJ2#^9FeM`q|f4 z&%C*Q_7!mN<&!V3oO*WQ`11?L;R)ykBtJd(&E$cP&j8r))roHdjs5B>fdBNl9qSIQ zT+me&G{{6YmBg+R4>eS!{I+FN+J+lq^E&Gw*XK2>F74fTIP1Rpl{ofx!ab`-LYc9&Xo&yL09bZ1-n-* z-n;tCuh%X+ux>g0?zFcx!0ZSZO9;~o!L^%A)i$)XLhDetBB3*eg*-2x6rdK^DM$-3 zU(3RIs0dfuy zwF!U9sSSqh5guL4A!=#4PC}+ZfU`?^Mjk;cAh`s%q+4C*);35)o2T zoZ*KH7aP{`Tb<&zgujc2Ze*Y;38)x4tB!(76z2MKGD6uIPDE}+aaL_{PQ0YRQ<&wY z6-U7SLCHAp^c%Qb zJM-%5sTUW&1ti0P%d>Oeq|tl+8=&P0JReOz&qIFi#H(wkUR^o;D$VNWUtK$QVb}T_ zupe{J=7iI*u&-(7;xTCJ1|R9PmgJ2?+jlIQxqP%Atj@Q-*$0!ZUtGU%ZqN1#mjkBr zS@nv6mU;(Fd9|6##X|6{y?Xxa*5wP|e!Xk&x|I;<0f3S8Cr80K|DQD!BST^8tI%LpQU{kFBV~K>IWBaL0Tehn&q>HJroyT2mez0f?$${ida1p! zD$&>68nAiRES%F(Un4J5F$i2Xm0ys}F33=pWN1tB6zFUxCeua9iwWqp6l4&St-=>b z#AKIS7fnT)rF4gk>BMJiP}y=0-blk)aM@BJ(kCW|4ZK=SX_A_4RAQ@i%oAwEng^Lz6Ha2v0 zcS3muW|+WyNDYjkft3Tw^2(s=&FxD++`kE`<1>VWcdvd(^Yf*56FT|r&2#^zz-XX`|`#`So`$`wm4nC@c#Q-PcENn2>V*9f+u%v zx^#G7O~A8gbZGO^g;&m;{PyeJ(3!Gr`9gp(oXJjV=t5n;VAj9UyAY&88qDdJ&~rWc zoIex3I!VHlU!8c4tzQ6%xLNQ%t)J6@;lHyP0OlQFE?qhg^ah+=P?|~S=+gWQqmaH{ zw|sb@TWf$xpeC3X0hf3(3DZEQ3=KJ4u)NO!|J_LiS}xIOQ`b|9^(+h+l?`Nsk%I7W ziGB{*<T|=zLuBg)sYMqKMy(DB&RGG^Y9HI%IZ{%W~L1)rqkA_`IpQ{~R zlCSf>` zd0J|=wT$E=Bb6eOPtJ8yi|r(&S_oEEv|mQ8(y%M7!g_sal}FwwC)Oxg5h=NXRTAQ3 zBJ|=owKzpBs%D}(*`$WTEGsHMC}hPXd=ENbgUR(|XV~*IfvDX%UjRS*uzA(F8DR#x zjnC*rWQB6S@D^o6iZZH;GOBRd&4qaZxwIo3nUYL&4h#%V9h^F6?wroy~(6f%WJDbZ*N})Fn|6oo!|KM{WS;!-`zN$RvkCby}oh^So-CqG?*u7 z`RKEAN1ubz01Qtc`N`QM0OluW4&Oh%@5X^`=eMth9+NE#XFzkxl>^X|vI(Zu-9Ek# zQh85diR6(z9hF`faF<@Fap}~n8y8>Qy!7Jw#n-SP>Du|1*Dri}aOcybyWhcHm}C3i z+`abx{_UsNFTVNy&gU0TPaodDbItM%i{=1OC(%0zV*o9*RKpWsJn^OUS0}*?GX&N{ z+x7ez>nC!^K*(@`GfBwn=g-)%VAdpogV>m$>$IW0@=+BeBX*MP+?sOQf<2gtUo>Y~om^D{v?D}dFh2x~qJG5Eqx%Bn(S8VOmZf(&(DhLea05fB~@(TB-V zbMbacj)qg>BjXj6_evG6ZDja}4AMTXG1Au`67pXCtH8r8}cE~^%e@aAW@@-sYyf~w+-04l2% zSD2vSQmFhyK}GrlhcQvoIU*b^uY(;e!XGVK&{Vel#AR(4a^5iLif4d2<a{5>q!czpibXIIX=1pyB$p#j@h&cfx>lkb0h z|LV7oZ-034^z+MSYk_a)&jRR94g{FwUVtuKCJ#&rfRAhE%~(5k`i6;t7=Y*WnfLD} zyab#B!U50l1YpA(5YiLRNpeo-Iv`CAgbe%)EDex`=R_o!Cg<7H222(cXbc#J3_ru_ zWYQlD#j0v!@sv&0?`6)zwpJIncD2F6IvHxlw}m|PPB0fD5OiVYOyYLU6Xq84J2 zPQ4oO%U>!&rN|8>=(YDn!)yHePn_I_5Mq)u2n$#I~1v~2+*f=2_EicUC z;}AkbHq7GCatJznwm$C*OU@VGybLuP6)(=v=4I#s(vaDv=J@H*c$?=`3nFDC8;_vp zA*}&(yuv-;G4#9D9YI68Q(k8grAl$JQba(_jO+OchqOsT^>cDO;*x4&me*#SMn*Ii z=T@Nd;(W?LQFfS&iLvN$0S|s?LwHm$4|GKl`r{wVD3?VUDbw6&vcaCivDq1s(8x7P=Q){Pdk z9?BLv^=NMk2x+LNq_xL)*FJ)l2H|nz+`AiR-++pSRL13#fMkI5OVH03jz2ne;P%1o z_rBQ$sD60r;IiTFj;augPJxs~eblQc6IA;gjTHflTEXYAA=xY`WzL@h4Td!uX&HQ* zkV`+Ydm}8&eR}2W{nJMtojdmM?9s>Pz5$8`(tdXN%-xemK0kZ>)9V+1{`C2u-+uY~ zw_jF{jeIqG+Uhx@Z~)TqoP_km$cywH&LrAb&zS}b3YdCXsaYX}+Hr-9V{54!kch2H3A9SdWju2!Ri_hGDA)}) zWv^2=wXt%kfE4B9Y~{R&h-NLtc^G*va37UqX)rk|0>WI9tt-e>6N_yml!8|5VwBh@ zg??hbrY+U3mpVl(lSX2k2YIdWIb*}qmd>A76^hOt9t=2KGkd%2D(D9kCD0CIo}-+zcfW+Q9QH=qwv9&%r3NfUAUB;O8M7Dvmo9?o=`= zpkY?RsW*sf0n*CyCJ7-Vr$zY~zfn?YD615dI5@dMZnnJ)5v3M_)3t()Yakcbv5V_V z>5Xz(r$*gN!B_Z0P`n;ukZKUwm4zALEvZE2B#A`{3896CjC1i-XhaR9po=n-s* ztUyUY43$$UXQf=mx=^5{z6r)cwoDnEHa0#R1|6i^4`uiS^?4UP{*7Wi(NOx#8 z%7rtg{QUUtj}LB7YL5?hE&)Y@@OT4>j%%lZr2)*q(g0?-99p%|qb;wnY9JT4erymX z++EzYZrzN&eJkeoH6~{dcHg^v{>GVaXY_R|Bx03RG^?i>_9>6`vnig>@8*?0TMZou<{Q-_~iJOLZB=1uMLn$*k2hDUqazz+BP!QFrT`tz!>k(INC z0n%{!4@(1FC-D4l(gwIrviHAXJn_}F8~O~^ph^U@bcKBt8TyaY;5Q}jf2d+{8Q z8UNvDfbqmx1p0Yjdi>YomimNDDOYPWW~}lhduc}<`V&N0Vu{t-MLZ z@Js1_DI;VqYbixVmf;?zQ?CkB{5+W-w+XBjNGEp140mM(|PDQa)aT$SE((5|RpBs7zx?R;)PF znw3$WouMhpl)wNbXpkxR0>V;bK~@>PKu0K440cR0N_-}9SkH|Mifl4|N-3z0I@-P3 zsVX{Dx)bG$YO|=?rK}L)Y&LN%r@$*N2@9}Mc2NwSXX9eqvBgQXrqk+};_?it%G(^? z9=pAlf=(1=1amSXIT?ZCtWaU5hg8^7oDs^;3Ko3)R4Fo$;FXmi8WSD-Dkf4^JB&92tZ%@j7XJJ#@`Xy(!ef8wb5je-z zEw7Du?_D~(Z{wQjeO>LTdy)*18&pA`+s;& zBX%MHoPc^7!0=Uo?&SCUTQ)<|V}4pN13!achI&dm7@Rb9OfYjgN4I1yD2-iE%3rk@ zG;>-uuUP_0WB~=T<9%r0IQ!(*M8b)o?M)(v< zDZ`{L^OOthTF}X&N+I3HB)OC)6Vl=W6w ztr+i9F{>mbuNV*f>?+4pD(IDZVNgj8QM1A&nLa{(HJ{b&bc|?pE$+auH#n%$wj@(C zyxu8lSt||^!DLlqauR@Q(9)>PFr}ywGT}uTAr=D6r3q}77ncLSbk)U~p;CGep~xq| z2aK9lf2bYyW3+enfUg6FlnzYkPu16h>&{>Tj)8Qv)&P48d~TyoxntGBU(zfMS{fq6 zYoG32{do8Chuar{mbc6qoKh32b{XdPG=QRheCpt6L(Hv}Y?###sp-kQ2UNgeH{$c# z*W;lOEQ~($&B4dt-Tw6U_4^kupnY}q+}U0AwO$(pr7Boa1N~WCJ_l^lPzrC22UpJ= zxVmrC^@H2LKXvHIsG!>_T4UywSvMyaBoJdfoONZ%-_BaHCpfuo2rkbG?xEGqi!RNnr z>A{UF*Dal&UKFKJm@L*%q$(7N%jFiC%p{TMc}!S}V+?z$Rb>tVLt6%G!FUcn#VFw# zrCb*UVWJdUp-GC043JPRO0k=eYi1M~X$T9SV1lu6N%alpC3#^;pr2y!Z>43SX=_9S$UxZn$GZiWHzMI<*v zT?jK93v_gRnL?x>ASLA-BQals%+ynnb_v;`7X@^JW`n4~Dyvd3BPMaRS(a3Dz`Wsc zs46%)(AW~^qugcaN-Yn3)Nl!-bL}~qdYfZPL(4*UU_fu{3`Pgs{$8WGNi2zTm=P8u zrjoW2OA`3pDr|NDo#QLXs3sOP5cBHs`IVTgI3+h#l<7?qb#@$IoRsqVxRiQ6wH5r~ z3Pq~1rE})&IYYz4prRX_n*h?F0HG)VJCD*wt=8x?W~2Jx=2bsEy!{inqaUWV$ESN& zKHs~tYw=iLO?dO{sZBwfM=M=5t?S02oqLzeh7m@WcddJM^)$GZ-rv0j*|`_j&Mz45 z9~y{p044 z@~nokDxD~aK`1%QkW|ou$kPyVLWEpDA;V8E@Krclnv?BJtWqJ;06$L~=nuKV@lbs! zP2;sdSL^_n#+y6T8*(~}b6MDI39 JdDdyB66T&=q<{YB{iU~ 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

    K~^RxKq3@Nox!6Hg=1rlVo3YBj_ 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ʠALq=9D`ldhjwf9J`=&tHG=*(a|Zna=X+ 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�VG6 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%0AO= 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 DlCp-J diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/woof.565 b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/woof.565 deleted file mode 100644 index 0bcd579fa5f0a18ee52ac8299c6e9f6818f62f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153654 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 z�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 -#include -#include -#include -#include -#include -#include - -// CS and DC for the LCD -#define LCD_CS 10 // Chip Select for LCD -#define LCD_DC 9 // Command/Data for LCD - -#define SD_CS 7 // Chip Select for SD card - -#define BUFFPIXELCOUNT 320 // size of the buffer in pixels -#define SD_SPI_SPEED SPI_HALF_SPEED // SD card SPI speed, try SPI_FULL_SPEED - -SdFat sd; // set filesystem -SdFile bmpFile; // set filesystem -//ArduinoOutStream cout(Serial); - -ILI9341_due tft(LCD_CS, LCD_DC); - -// store error strings in flash to save RAM -#define error(s) sd.errorHalt_P(PSTR(s)) - -void setup() -{ - Serial.begin(9600); - - tft.begin(); - tft.setRotation(iliRotation270); // landscape - progmemPrint(PSTR("Initializing SD card...")); - - if (!sd.begin(SD_CS, SD_SPI_SPEED)){ - progmemPrintln(PSTR("failed!")); - return; - } - progmemPrintln(PSTR("OK!")); -} - -void loop() -{ - if (tft.getRotation() == iliRotation90 || tft.getRotation() == iliRotation270){ - bmpDraw("giraffe.565", 0, 0); - delay(2000); - bmpDraw("SOLDHO~1.565", 0, 0); - delay(2000); - bmpDraw("GLOOMY~1.565", 0, 0); - delay(2000); - bmpDraw("MOTIVA~1.565", 0, 0); - delay(2000); - } - else - { - bmpDraw("smokeP.565", 0, 0); - delay(2000); - bmpDraw("origP.565", 0, 0); - delay(2000); - bmpDraw("radioP.565", 0, 0); - delay(2000); - bmpDraw("stopP.565", 0, 0); - delay(2000); - } - -} - -// This function opens a Windows Bitmap (BMP) file and -// displays it at the given coordinates. It's sped up -// by reading many pixels worth of data at a time -// (rather than pixel by pixel). Increasing the buffer -// size takes more of the Arduino's RAM but -// makes loading a little faster. - -void bmpDraw(char* filename, int x, int y) { - - SdFile bmpFile; - int bmpWidth, bmpHeight; // W+H in pixels - uint8_t bmpDepth; // Bit depth (currently must be 24) - uint8_t headerSize; - uint32_t bmpImageoffset; // Start of image data in file - uint32_t rowSize; // Not always = bmpWidth; may have padding - uint32_t fileSize; - boolean goodBmp = false; // Set to true on valid header parse - boolean flip = true; // BMP is stored bottom-to-top - uint16_t w, h, row, col; - uint8_t r, g, b; - uint32_t pos = 0, startTime; - - if ((x >= tft.width()) || (y >= tft.height())) return; - - progmemPrint(PSTR("Loading image '")); - Serial.print(filename); - Serial.println('\''); - startTime = millis(); - // Open requested file on SD card - if (!bmpFile.open(filename, O_READ)) { - Serial.println("File open failed."); - return; - } - else { - //Serial.println("File opened."); - } - - // Parse BMP header - if (read16(bmpFile) == 0x4D42) { // BMP signature - fileSize = read32(bmpFile); - //progmemPrint(PSTR("File size: ")); Serial.println(fileSize); - (void)read32(bmpFile); // Read & ignore creator bytes - bmpImageoffset = read32(bmpFile); // Start of image data - //progmemPrint(PSTR("Image Offset: ")); Serial.println(bmpImageoffset, DEC); - // Read DIB header - headerSize = read32(bmpFile); - //progmemPrint(PSTR("Header size: ")); Serial.println(headerSize); - bmpWidth = read32(bmpFile); - bmpHeight = read32(bmpFile); - if (read16(bmpFile) == 1) { // # planes -- must be '1' - bmpDepth = read16(bmpFile); // bits per pixel - //progmemPrint(PSTR("Bit Depth: ")); Serial.println(bmpDepth); - if (read32(bmpFile) == 0) // 0 = uncompressed - { - //progmemPrint(PSTR("Image size: ")); - //Serial.print(bmpWidth); - //Serial.print('x'); - //Serial.println(bmpHeight); - - // If bmpHeight is negative, image is in top-down order. - // This is not canon but has been observed in the wild. - if (bmpHeight < 0) { - bmpHeight = -bmpHeight; - flip = false; - } - - // Crop area to be loaded - w = bmpWidth; - h = bmpHeight; - if ((x + w - 1) >= tft.width()) w = tft.width() - x; - if ((y + h - 1) >= tft.height()) h = tft.height() - y; - - // Set TFT address window to clipped image bounds - tft.setAddrWindow(x, y, x + w - 1, y + h - 1); - - if (bmpDepth == 16) //565 format - { - goodBmp = true; // Supported BMP format -- proceed! - - uint8_t buffer[2 * BUFFPIXELCOUNT]; // pixel buffer (contains already formatted data for ILI9341 display) - - bmpFile.seekSet(54); //skip header - uint32_t totalPixels = bmpWidth*bmpHeight; - uint16_t numFullBufferRuns = totalPixels / BUFFPIXELCOUNT; - for (uint32_t p = 0; p < numFullBufferRuns; p++) { - // read pixels into the buffer - bmpFile.read(buffer, 2 * BUFFPIXELCOUNT); - // push them to the diplay - tft.pushColors565(buffer, 0, 2 * BUFFPIXELCOUNT); - } - - // render any remaining pixels that did not fully fit the buffer - uint32_t remainingPixels = totalPixels % BUFFPIXELCOUNT; - if (remainingPixels > 0) - { - bmpFile.read(buffer, 2 * remainingPixels); - tft.pushColors565(buffer, 0, 2 * remainingPixels); - } - - } - else if (bmpDepth == 24) // standard 24bit bmp - { - goodBmp = true; // Supported BMP format -- proceed! - uint16_t bufferSize = min(w, BUFFPIXELCOUNT); - uint8_t sdbuffer[3 * bufferSize]; // pixel in buffer (R+G+B per pixel) - uint16_t lcdbuffer[bufferSize]; // pixel out buffer (16-bit per pixel) - - // BMP rows are padded (if needed) to 4-byte boundary - rowSize = (bmpWidth * 3 + 3) & ~3; - - for (row = 0; row < h; row++) { // For each scanline... - // Seek to start of scan line. It might seem labor- - // intensive to be doing this on every line, but this - // method covers a lot of gritty details like cropping - // and scanline padding. Also, the seek only takes - // place if the file position actually needs to change - // (avoids a lot of cluster math in SD library). - - if (flip) // Bitmap is stored bottom-to-top order (normal BMP) - pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize; - else // Bitmap is stored top-to-bottom - pos = bmpImageoffset + row * rowSize; - if (bmpFile.curPosition() != pos) { // Need seek? - bmpFile.seekSet(pos); - } - - for (col = 0; col < w; col += bufferSize) - { - // read pixels into the buffer - bmpFile.read(sdbuffer, 3 * bufferSize); - - // convert color - for (int p = 0; p < bufferSize; p++) - { - b = sdbuffer[3 * p]; - g = sdbuffer[3 * p + 1]; - r = sdbuffer[3 * p + 2]; - lcdbuffer[p] = tft.color565(r, g, b); - } - // push buffer to TFT - tft.pushColors(lcdbuffer, 0, bufferSize); - } - - // render any remaining pixels that did not fully fit the buffer - uint16_t remainingPixels = w % bufferSize; - if (remainingPixels > 0) - { - bmpFile.read(sdbuffer, 3 * remainingPixels); - - for (int p = 0; p < remainingPixels; p++) - { - b = sdbuffer[3 * p]; - g = sdbuffer[3 * p + 1]; - r = sdbuffer[3 * p + 2]; - lcdbuffer[p] = tft.color565(r, g, b); - } - - tft.pushColors(lcdbuffer, 0, remainingPixels); - } - } - } - else - { - progmemPrint(PSTR("Unsupported Bit Depth.")); - } - - if (goodBmp) - { - progmemPrint(PSTR("Loaded in ")); - Serial.print(millis() - startTime); - Serial.println(" ms"); - } - } - } - } - - bmpFile.close(); - if (!goodBmp) progmemPrintln(PSTR("BMP format not recognized.")); -} - - -// These read 16- and 32-bit types from the SD card file. -// BMP data is stored little-endian, Arduino is little-endian too. -// May need to reverse subscript order if porting elsewhere. - -uint16_t read16(SdFile& f) { - uint16_t result; - ((uint8_t *)&result)[0] = f.read(); // LSB - ((uint8_t *)&result)[1] = f.read(); // MSB - return result; -} - -uint32_t read32(SdFile& f) { - uint32_t result; - ((uint8_t *)&result)[0] = f.read(); // LSB - ((uint8_t *)&result)[1] = f.read(); - ((uint8_t *)&result)[2] = f.read(); - ((uint8_t *)&result)[3] = f.read(); // MSB - return result; -} - -// Copy string from flash to serial port -// Source string MUST be inside a PSTR() declaration! -void progmemPrint(const char *str) { - char c; - while (c = pgm_read_byte(str++)) Serial.print(c); -} - -// Same as above, with trailing newline -void progmemPrintln(const char *str) { - progmemPrint(str); - Serial.println(); -} - -//void PrintHex8(uint8_t *data, uint8_t length) // prints 8-bit data in hex -//{ -// char tmp[length*5+1]; -// byte first; -// byte second; -// for (int i=0; i> 4) & 0x0f; -// second = data[i] & 0x0f; -// // base for converting single digit numbers to ASCII is 48 -// // base for 10-16 to become upper-case characters A-F is 55 -// // note: difference is 7 -// tmp[i*5] = 48; // add leading 0 -// tmp[i*5+1] = 120; // add leading x -// tmp[i*5+2] = first+48; -// tmp[i*5+3] = second+48; -// tmp[i*5+4] = 32; // add trailing space -// if (first > 9) tmp[i*5+2] += 7; -// if (second > 9) tmp[i*5+3] += 7; -// } -// tmp[length*5] = 0; -// Serial.print(tmp); -//} \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/utftDemo/utftDemo.ino b/STM32F1/libraries/ILI9341_due_STM/examples/utftDemo/utftDemo.ino deleted file mode 100644 index 0aec4eace..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/examples/utftDemo/utftDemo.ino +++ /dev/null @@ -1,341 +0,0 @@ -// UTFT Demo ported to ILI9341_due library by TFTLCDCyg - -// Based on Demo 320x240 Serial of UTFT library -// UTFT-web: http://www.henningkarlsen.com/electronics - -#include - -// ILI9341_due NEW lib by Marek Buriak http://marekburiak.github.io/ILI9341_due/ -#include -#include -#include -#include -#include -#include "fonts\Arial14.h" -//#include "Streaming.h" -// For the Adafruit shield, these are the default. - -#define TFT_DC 10 -#define TFT_CS 8 -#define rst 9 - -// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC -ILI9341_due tft = ILI9341_due(TFT_CS, TFT_DC, rst); - -ILI9341_due_gText t1(&tft); -char textBuff[20]; - -// Color set -#define BLACK 0x0000 -#define RED 0xF800 -#define GREEN 0x07E0 -//#define BLUE 0x001F -#define BLUE 0x102E -#define CYAN 0x07FF -#define MAGENTA 0xF81F -#define YELLOW 0xFFE0 -#define ORANGE 0xFD20 -#define GREENYELLOW 0xAFE5 -#define DARKGREEN 0x03E0 -#define WHITE 0xFFFF - -uint16_t color; -uint16_t colorFONDO=BLACK; - -void setup() -{ - delay (5000); - randomSeed(analogRead(0)); - - // TFT 2.2" SPI - Serial.begin(115200); - tft.begin(); - tft.setRotation(iliRotation270); - tft.fillScreen(colorFONDO); - t1.defineArea(0, 0, 320, 240); - t1.selectFont(Arial14); -} - -void ILI9341duenodelay() -{ - int buf[318]; - int x, x2; - int y, y2; - int r; - - tft.fillScreen(colorFONDO); - - int timeinit= millis(); - - -//ILI9341due NEW - tft.fillRect(0, 0, 320, 15,RED); - t1.setFontColor(WHITE, RED); - t1.drawString("* ILI9341_due UTFT 240x320 Demo *", 47,0); - tft.fillRect(0, 226, 320, 240,tft.color565(64, 64, 64)); - t1.setFontColor(YELLOW, tft.color565(64, 64, 64)); - t1.drawString("", gTextAlignBottomCenter,227); - -//ILI9341due NEW - tft.drawRect(0, 15, 320, 211,BLUE); - -//ILI9341due NEW -// Draw crosshairs - tft.drawLine(159, 15, 159, 224,BLUE); - tft.drawLine(1, 119, 318, 119,BLUE); - for (int i=9; i<310; i+=10) - tft.drawLine(i, 117, i, 121,BLUE); - for (int i=19; i<220; i+=10) - tft.drawLine(157, i, 161, i, BLUE); -// Draw sin-, cos- and tan-lines - t1.setFontColor(CYAN, BLACK); - t1.drawString("Sin", 5,17); - for (int i=1; i<318; i++) - { - tft.drawPixel(i,119+(sin(((i*1.13)*3.14)/180)*95),CYAN); - } - t1.setFontColor(RED, BLACK); - t1.drawString("Cos", 5,29); - for (int i=1; i<318; i++) - { - tft.drawPixel(i,119+(cos(((i*1.13)*3.14)/180)*95),RED); - } - t1.setFontColor(YELLOW, BLACK); - t1.drawString("Tan", 5,41); - for (int i=1; i<318; i++) - { - tft.drawPixel(i,119+(tan(((i*1.13)*3.14)/180)),YELLOW); - } -// delay(2000); - - -//ILI9341due NEW - tft.fillRect(1,16,318,209,BLACK); - tft.drawLine(159, 16, 159, 224,BLUE); - tft.drawLine(1, 119, 318, 119,BLUE); - -// Draw a moving sinewave - x=1; - for (int i=1; i<(318*20); i++) - { - x++; - if (x==319) - x=1; - if (i>319) - { - if ((x==159)||(buf[x-1]==119)) - color = BLUE; - else - color = BLACK; - tft.drawPixel(x,buf[x-1],color); - } - y=119+(sin(((i*1.1)*3.14)/180)*(90-(i / 100))); - tft.drawPixel(x,y,CYAN); - buf[x-1]=y; - } -// delay(2000); - - -//ILI9341due NEW - tft.fillRect(1,16,318,209,BLACK); - -// Draw some filled rectangles - for (int i=1; i<6; i++) - { - switch (i) - { - case 1: - color = MAGENTA; - break; - case 2: - color = RED; - break; - case 3: - color = GREEN; - break; - case 4: - color = BLUE; - break; - case 5: - color = YELLOW; - break; - } - tft.fillRect(70+(i*20), 30+(i*20), 60, 60,color); - } -// delay(2000); - - -//ILI9341due NEW - tft.fillRect(1,16,318,209,BLACK); - -// Draw some filled, rounded rectangles - for (int i=1; i<6; i++) - { - switch (i) - { - case 1: - color = MAGENTA; - break; - case 2: - color = RED; - break; - case 3: - color = GREEN; - break; - case 4: - color = BLUE; - break; - case 5: - color = YELLOW; - break; - } - tft.fillRoundRect(190-(i*20), 30+(i*20), 60, 60,3,color); - } - // delay(2000); - - -//ILI9341due NEW - tft.fillRect(1,16,318,209,BLACK); - -// Draw some filled circles - for (int i=1; i<6; i++) - { - switch (i) - { - case 1: - color = MAGENTA; - break; - case 2: - color = RED; - break; - case 3: - color = GREEN; - break; - case 4: - color = BLUE; - break; - case 5: - color = YELLOW; - break; - } - tft.fillCircle(100+(i*20),60+(i*20), 30, color); - } -// delay(2000); - - -//ILI9341due NEW - tft.fillRect(1,16,318,209,BLACK); - -// Draw some lines in a pattern - for (int i=17; i<222; i+=5) - { - tft.drawLine(1, i, (i*1.44)-10, 224, RED); - } - for (int i=222; i>17; i-=5) - { - tft.drawLine(318, i, (i*1.44)-11, 15,RED); - } - for (int i=222; i>17; i-=5) - { - tft.drawLine(1, i, 331-(i*1.44), 15, CYAN); - } - for (int i=17; i<222; i+=5) - { - tft.drawLine(318, i, 330-(i*1.44), 223, CYAN); - } - // delay(2000); - - -//ILI9341due NEW - tft.fillRect(1,16,318,209,BLACK); - -// Draw some random circles - for (int i=0; i<100; i++) - { - color = tft.color565(random(255), random(255), random(255)); - x=32+random(256); - y=45+random(146); - r=random(30); - tft.drawCircle(x, y, r, color); - } - // delay(2000); - - -//ILI9341due NEW - tft.fillRect(1,16,318,209,BLACK); -// Draw some random rectangles - for (int i=0; i<100; i++) - { - color = tft.color565(random(255), random(255), random(255)); - x=2 + random(165); - y=16+ random(100); - x2=random(165); - y2=random(115); - tft.drawRect(x, y, x2, y2, color); - } -// delay(2000); - - -//ILI9341due NEW - tft.fillRect(1,16,318,209,BLACK); -// Draw some random rounded rectangles - for (int i=0; i<100; i++) - { - color = tft.color565(random(255), random(255), random(255)); - x=2+random(165); - y=16+random(100); - x2=random(165); - y2=random(115); - tft.drawRoundRect(x, y, x2, y2,3,color); - - } - // delay(2000); - -//ILI9341due NEW - tft.fillRect(1,16,318,209,BLACK); - - for (int i=0; i<100; i++) - { - color = tft.color565(random(255), random(255), random(255)); - x=2+random(316); - y=16+random(209); - x2=2+random(316); - y2=16+random(209); - tft.drawLine(x, y, x2, y2, color); - } - //delay(2000); - - -//ILI9341due NEW - tft.fillRect(1,16,318,209,BLACK); - - for (int i=0; i<10000; i++) - { - color = tft.color565(random(255), random(255), random(255)); - tft.drawPixel(2+random(316), 16+random(209), color); - } - int timetest = millis() -timeinit; - //delay(2000); - - -//ILI9341due NEW - tft.fillRect(0,0,320,240,BLUE); - tft.fillRoundRect(80, 70, 159, 99,3,RED); - t1.setFontColor(WHITE, RED); - t1.drawString("That's it!", 130,93); - t1.drawString("Restarting in a", 117, 119); - t1.drawString("few seconds...", 117, 132); - - t1.setFontColor(WHITE, BLUE); - t1.drawString("Runtime: (msecs)", 112, 210); - - sprintf(textBuff, "%d", timetest); - t1.drawString(textBuff, 146, 225); -} - -void loop() -{ - ILI9341duenodelay(); - delay(5000); -} - diff --git a/STM32F1/libraries/ILI9341_due_STM/fonts/Arial14.h b/STM32F1/libraries/ILI9341_due_STM/fonts/Arial14.h deleted file mode 100644 index 9536adb1d..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/fonts/Arial14.h +++ /dev/null @@ -1,173 +0,0 @@ - - -/* - * - * Arial_14 - * - * created with FontCreator - * written by F. Maximilian Thiele - * - * http://www.apetech.de/fontCreator - * me@apetech.de - * - * File Name : Arial14.h - * Date : 02.05.2008 - * Font size in bytes : 7788 - * Font width : 10 - * Font height : 14 - * Font first char : 32 - * Font last char : 128 - * Font used chars : 96 - * - * The font data are defined as - * - * struct _FONT_ { - * uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; - * uint8_t font_Width_in_Pixel_for_fixed_drawing; - * uint8_t font_Height_in_Pixel_for_all_characters; - * unit8_t font_First_Char; - * uint8_t font_Char_Count; - * - * uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1]; - * // for each character the separate width in pixels, - * // characters < 128 have an implicit virtual right empty row - * - * uint8_t font_data[]; - * // bit field of all characters - */ - -#include -#include - -#ifndef ARIAL_14_H -#define ARIAL_14_H - -#define ARIAL_14_WIDTH 10 -#define ARIAL_14_HEIGHT 14 - -/* - * added to allow fontname to match header file name. - * as well as keep the old name for backward compability - */ - -#define Arial14 Arial_14 - -static const uint8_t Arial_14[] PROGMEM = { - 0x1E, 0x6C, // size - 0x0A, // width - 0x0E, // height - 0x20, // first char - 0x60, // char count - - // char widths - 0x00, 0x01, 0x03, 0x08, 0x07, 0x0A, 0x08, 0x01, 0x03, 0x03, - 0x05, 0x07, 0x01, 0x04, 0x01, 0x04, 0x06, 0x03, 0x06, 0x06, - 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x01, 0x01, 0x06, 0x06, - 0x06, 0x06, 0x0D, 0x09, 0x07, 0x08, 0x08, 0x07, 0x07, 0x09, - 0x07, 0x01, 0x05, 0x08, 0x07, 0x09, 0x07, 0x09, 0x07, 0x09, - 0x08, 0x07, 0x07, 0x07, 0x09, 0x0D, 0x08, 0x09, 0x08, 0x02, - 0x04, 0x02, 0x05, 0x08, 0x02, 0x06, 0x06, 0x05, 0x06, 0x06, - 0x04, 0x06, 0x06, 0x01, 0x02, 0x06, 0x01, 0x09, 0x06, 0x06, - 0x06, 0x06, 0x04, 0x05, 0x04, 0x06, 0x07, 0x09, 0x06, 0x07, - 0x06, 0x03, 0x01, 0x03, 0x07, 0x07, - - // font data - 0xFE, 0x14, // 33 - 0x1E, 0x00, 0x1E, 0x00, 0x00, 0x00, // 34 - 0x90, 0x90, 0xF8, 0x96, 0x90, 0xF8, 0x96, 0x90, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, // 35 - 0x18, 0x24, 0x22, 0xFF, 0x42, 0x42, 0x84, 0x08, 0x10, 0x10, 0x3C, 0x10, 0x08, 0x04, // 36 - 0x1C, 0x22, 0x22, 0x1C, 0xC0, 0x30, 0x8C, 0x42, 0x40, 0x80, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00, 0x0C, 0x10, 0x10, 0x0C, // 37 - 0x80, 0x5C, 0x22, 0x62, 0x92, 0x0C, 0x80, 0x00, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x08, 0x10, // 38 - 0x1E, 0x00, // 39 - 0xF0, 0x0C, 0x02, 0x1C, 0x60, 0x80, // 40 - 0x02, 0x0C, 0xF0, 0x80, 0x60, 0x1C, // 41 - 0x04, 0x14, 0x0E, 0x14, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // 42 - 0x40, 0x40, 0x40, 0xF8, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, // 43 - 0x00, 0x70, // 44 - 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, // 45 - 0x00, 0x10, // 46 - 0x00, 0xC0, 0x38, 0x06, 0x18, 0x04, 0x00, 0x00, // 47 - 0xFC, 0x02, 0x02, 0x02, 0x02, 0xFC, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x0C, // 48 - 0x08, 0x04, 0xFE, 0x00, 0x00, 0x1C, // 49 - 0x0C, 0x02, 0x02, 0x82, 0x42, 0x3C, 0x10, 0x18, 0x14, 0x10, 0x10, 0x10, // 50 - 0x0C, 0x02, 0x22, 0x22, 0x22, 0xDC, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x0C, // 51 - 0x80, 0x40, 0x30, 0x08, 0x04, 0xFE, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1C, 0x04, // 52 - 0x38, 0x16, 0x12, 0x12, 0x12, 0xE2, 0x0C, 0x10, 0x10, 0x10, 0x18, 0x04, // 53 - 0xF8, 0x44, 0x22, 0x22, 0x22, 0xC4, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x0C, // 54 - 0x02, 0x02, 0x02, 0xE2, 0x1A, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, // 55 - 0xDC, 0x22, 0x22, 0x22, 0x22, 0xDC, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x0C, // 56 - 0x3C, 0x42, 0x42, 0x42, 0x22, 0xFC, 0x08, 0x10, 0x10, 0x10, 0x08, 0x04, // 57 - 0x08, 0x10, // 58 - 0x08, 0x70, // 59 - 0x40, 0xA0, 0xA0, 0x10, 0x10, 0x08, 0x00, 0x00, 0x00, 0x04, 0x04, 0x08, // 60 - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 61 - 0x08, 0x10, 0x10, 0xA0, 0xA0, 0x40, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00, // 62 - 0x0C, 0x02, 0x82, 0x42, 0x22, 0x1C, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, // 63 - 0xE0, 0x18, 0x04, 0xC4, 0x22, 0x12, 0x12, 0x12, 0xA2, 0x72, 0x04, 0x08, 0xF0, 0x0C, 0x30, 0x40, 0x4C, 0x90, 0x90, 0x90, 0x88, 0x9C, 0x90, 0x50, 0x4C, 0x20, // 64 - 0x00, 0x80, 0xE0, 0x9C, 0x82, 0x9C, 0xE0, 0x80, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, // 65 - 0xFE, 0x22, 0x22, 0x22, 0x22, 0x22, 0xDC, 0x1C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0C, // 66 - 0xF8, 0x04, 0x02, 0x02, 0x02, 0x02, 0x04, 0x08, 0x04, 0x08, 0x10, 0x10, 0x10, 0x10, 0x08, 0x04, // 67 - 0xFE, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0xF8, 0x1C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x04, // 68 - 0xFE, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 69 - 0xFE, 0x22, 0x22, 0x22, 0x22, 0x22, 0x02, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 70 - 0xF8, 0x04, 0x02, 0x02, 0x02, 0x42, 0x42, 0x44, 0xC8, 0x04, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x04, // 71 - 0xFE, 0x20, 0x20, 0x20, 0x20, 0x20, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, // 72 - 0xFE, 0x1C, // 73 - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0C, 0x10, 0x10, 0x10, 0x0C, // 74 - 0xFE, 0x80, 0x40, 0x20, 0x50, 0x88, 0x04, 0x02, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x10, // 75 - 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 76 - 0xFE, 0x0C, 0x30, 0xC0, 0x00, 0xC0, 0x30, 0x0C, 0xFE, 0x1C, 0x00, 0x00, 0x04, 0x18, 0x04, 0x00, 0x00, 0x1C, // 77 - 0xFE, 0x04, 0x18, 0x60, 0x80, 0x00, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x04, 0x08, 0x1C, // 78 - 0xF8, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0xF8, 0x04, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x04, // 79 - 0xFE, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 80 - 0xF8, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0xF8, 0x04, 0x08, 0x10, 0x10, 0x10, 0x14, 0x08, 0x1C, 0x10, // 81 - 0xFE, 0x42, 0x42, 0x42, 0xC2, 0x42, 0x42, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x10, // 82 - 0x1C, 0x22, 0x22, 0x22, 0x42, 0x42, 0x8C, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0C, // 83 - 0x02, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, // 84 - 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x04, 0x08, 0x10, 0x10, 0x10, 0x08, 0x04, // 85 - 0x06, 0x18, 0x60, 0x80, 0x00, 0x80, 0x60, 0x18, 0x06, 0x00, 0x00, 0x00, 0x04, 0x18, 0x04, 0x00, 0x00, 0x00, // 86 - 0x06, 0x38, 0xC0, 0x00, 0xC0, 0x3C, 0x02, 0x3C, 0xC0, 0x00, 0xC0, 0x38, 0x06, 0x00, 0x00, 0x04, 0x18, 0x04, 0x00, 0x00, 0x00, 0x04, 0x18, 0x04, 0x00, 0x00, // 87 - 0x02, 0x0C, 0x90, 0x60, 0x60, 0x90, 0x0C, 0x02, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x0C, 0x10, // 88 - 0x02, 0x04, 0x18, 0x20, 0xC0, 0x20, 0x18, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, // 89 - 0x00, 0x02, 0x82, 0x42, 0x22, 0x1A, 0x06, 0x02, 0x10, 0x18, 0x14, 0x10, 0x10, 0x10, 0x10, 0x10, // 90 - 0xFE, 0x02, 0xFC, 0x80, // 91 - 0x06, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x04, 0x18, // 92 - 0x02, 0xFE, 0x80, 0xFC, // 93 - 0x20, 0x1C, 0x02, 0x1C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, // 94 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 95 - 0x02, 0x04, 0x00, 0x00, // 96 - 0x10, 0x88, 0x48, 0x48, 0x48, 0xF0, 0x0C, 0x10, 0x10, 0x10, 0x08, 0x1C, // 97 - 0xFE, 0x10, 0x08, 0x08, 0x08, 0xF0, 0x1C, 0x08, 0x10, 0x10, 0x10, 0x0C, // 98 - 0xF0, 0x08, 0x08, 0x08, 0x10, 0x0C, 0x10, 0x10, 0x10, 0x08, // 99 - 0xF0, 0x08, 0x08, 0x08, 0x10, 0xFE, 0x0C, 0x10, 0x10, 0x10, 0x08, 0x1C, // 100 - 0xF0, 0x48, 0x48, 0x48, 0x48, 0x70, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x08, // 101 - 0x08, 0xFC, 0x0A, 0x0A, 0x00, 0x1C, 0x00, 0x00, // 102 - 0xF0, 0x08, 0x08, 0x08, 0x10, 0xF8, 0x4C, 0x90, 0x90, 0x90, 0x88, 0x7C, // 103 - 0xFE, 0x10, 0x08, 0x08, 0x08, 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x1C, // 104 - 0xFA, 0x1C, // 105 - 0x00, 0xFA, 0x80, 0x7C, // 106 - 0xFE, 0x80, 0x40, 0xA0, 0x10, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x0C, 0x10, // 107 - 0xFE, 0x1C, // 108 - 0xF8, 0x10, 0x08, 0x08, 0xF0, 0x10, 0x08, 0x08, 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, // 109 - 0xF8, 0x10, 0x08, 0x08, 0x08, 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x1C, // 110 - 0xF0, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x0C, // 111 - 0xF8, 0x10, 0x08, 0x08, 0x08, 0xF0, 0xFC, 0x08, 0x10, 0x10, 0x10, 0x0C, // 112 - 0xF0, 0x08, 0x08, 0x08, 0x10, 0xF8, 0x0C, 0x10, 0x10, 0x10, 0x08, 0xFC, // 113 - 0xF8, 0x10, 0x08, 0x08, 0x1C, 0x00, 0x00, 0x00, // 114 - 0x30, 0x48, 0x48, 0x48, 0x90, 0x08, 0x10, 0x10, 0x10, 0x0C, // 115 - 0x08, 0xFE, 0x08, 0x08, 0x00, 0x1C, 0x10, 0x10, // 116 - 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0C, 0x10, 0x10, 0x10, 0x08, 0x1C, // 117 - 0x18, 0x60, 0x80, 0x00, 0x80, 0x60, 0x18, 0x00, 0x00, 0x04, 0x18, 0x04, 0x00, 0x00, // 118 - 0x18, 0xE0, 0x00, 0xE0, 0x18, 0xE0, 0x00, 0xE0, 0x18, 0x00, 0x04, 0x18, 0x04, 0x00, 0x04, 0x18, 0x04, 0x00, // 119 - 0x08, 0x30, 0xC0, 0xC0, 0x30, 0x08, 0x10, 0x0C, 0x00, 0x00, 0x0C, 0x10, // 120 - 0x18, 0x60, 0x80, 0x00, 0x80, 0x60, 0x18, 0x00, 0x80, 0x8C, 0x70, 0x0C, 0x00, 0x00, // 121 - 0x08, 0x08, 0x88, 0x68, 0x18, 0x08, 0x10, 0x18, 0x14, 0x10, 0x10, 0x10, // 122 - 0x80, 0x7C, 0x02, 0x00, 0x7C, 0x80, // 123 - 0xFE, 0xFC, // 124 - 0x02, 0x7C, 0x80, 0x80, 0x7C, 0x00, // 125 - 0x40, 0x20, 0x20, 0x60, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 126 - 0xFC, 0x04, 0x04, 0x04, 0x04, 0x04, 0xFC, 0x1C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1C // 127 - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/fonts/Arial_bold_14.h b/STM32F1/libraries/ILI9341_due_STM/fonts/Arial_bold_14.h deleted file mode 100644 index bf634c6af..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/fonts/Arial_bold_14.h +++ /dev/null @@ -1,167 +0,0 @@ - - -/* - * - * Arial Bold 14 - * - * created with FontCreator - * written by F. Maximilian Thiele - * - * http://www.apetech.de/fontCreator - * me@apetech.de - * - * File Name : arial_bold_14 - * Date : 29.01.2005 - * Font size in bytes : 8712 - * Font width : 10 - * Font height : 14 - * Font first char : 32 - * Font last char : 128 - * Font used chars : 96 - * - * The font data are defined as - * - * struct _FONT_ { - * uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; - * uint8_t font_Width_in_Pixel_for_fixed_drawing; - * uint8_t font_Height_in_Pixel_for_all_characters; - * unit8_t font_First_Char; - * uint8_t font_Char_Count; - * - * uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1]; - * // for each character the separate width in pixels, - * // characters < 128 have an implicit virtual right empty row - * - * uint8_t font_data[]; - * // bit field of all characters - */ - -#include -#include - -#ifndef ARIAL_BOLD_14_H -#define ARIAL_BOLD_14_H - -#define ARIAL_BOLD_14_WIDTH 10 -#define ARIAL_BOLD_14_HEIGHT 14 - -static const uint8_t Arial_bold_14[] PROGMEM = { - 0x22, 0x08, // size - 0x0A, // width - 0x0E, // height - 0x20, // first char - 0x60, // char count - - // char widths - 0x04, 0x02, 0x05, 0x06, 0x07, 0x08, 0x09, 0x02, 0x03, 0x03, - 0x05, 0x08, 0x02, 0x04, 0x02, 0x04, 0x07, 0x04, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, 0x02, 0x07, 0x07, - 0x07, 0x08, 0x0E, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x09, - 0x08, 0x02, 0x07, 0x08, 0x07, 0x0B, 0x08, 0x09, 0x07, 0x09, - 0x09, 0x07, 0x08, 0x08, 0x09, 0x0D, 0x07, 0x08, 0x08, 0x04, - 0x04, 0x04, 0x06, 0x08, 0x03, 0x07, 0x07, 0x06, 0x07, 0x07, - 0x05, 0x07, 0x07, 0x02, 0x03, 0x06, 0x02, 0x0A, 0x07, 0x07, - 0x07, 0x07, 0x05, 0x06, 0x05, 0x07, 0x07, 0x0B, 0x06, 0x07, - 0x05, 0x05, 0x01, 0x05, 0x07, 0x08, - - // font data - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 32 - 0xFE, 0xFE, 0x18, 0x18, // 33 - 0x1E, 0x1E, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, // 34 - 0x90, 0xF8, 0x9E, 0x90, 0xF8, 0x9E, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, // 35 - 0x18, 0x3C, 0x26, 0xFF, 0x66, 0xCC, 0x88, 0x04, 0x0C, 0x18, 0x3C, 0x18, 0x0C, 0x04, // 36 - 0x1C, 0x22, 0x1C, 0xC0, 0x30, 0x8E, 0x40, 0x80, 0x00, 0x00, 0x18, 0x04, 0x00, 0x0C, 0x10, 0x0C, // 37 - 0x80, 0xCC, 0x7E, 0x72, 0xF2, 0xDE, 0x0C, 0x80, 0x00, 0x0C, 0x1C, 0x10, 0x10, 0x10, 0x1C, 0x0C, 0x1C, 0x10, // 38 - 0x1E, 0x1E, 0x00, 0x00, // 39 - 0xF0, 0xFC, 0x06, 0x1C, 0x7C, 0xC0, // 40 - 0x06, 0xFC, 0xF0, 0xC0, 0x7C, 0x1C, // 41 - 0x14, 0x14, 0x0E, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, // 42 - 0x60, 0x60, 0x60, 0xFC, 0xFC, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, // 43 - 0x00, 0x00, 0x58, 0x38, // 44 - 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, // 45 - 0x00, 0x00, 0x18, 0x18, // 46 - 0x00, 0xC0, 0x38, 0x06, 0x18, 0x04, 0x00, 0x00, // 47 - 0xF8, 0xFC, 0x0E, 0x06, 0x0E, 0xFC, 0xF8, 0x04, 0x0C, 0x1C, 0x18, 0x1C, 0x0C, 0x04, // 48 - 0x18, 0x0C, 0xFE, 0xFE, 0x00, 0x00, 0x1C, 0x1C, // 49 - 0x18, 0x1C, 0x86, 0xC6, 0x66, 0x3E, 0x1C, 0x18, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x18, // 50 - 0x88, 0x8C, 0x06, 0x26, 0x26, 0xFE, 0xDC, 0x04, 0x0C, 0x1C, 0x18, 0x18, 0x0C, 0x04, // 51 - 0xC0, 0xE0, 0xB8, 0x8C, 0xFE, 0xFE, 0x80, 0x04, 0x04, 0x04, 0x04, 0x1C, 0x1C, 0x04, // 52 - 0x70, 0x7E, 0x3E, 0x36, 0x36, 0xF6, 0xC6, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x0C, 0x04, // 53 - 0xF8, 0xFC, 0x6E, 0x66, 0x66, 0xEE, 0xCC, 0x04, 0x0C, 0x18, 0x18, 0x18, 0x1C, 0x0C, // 54 - 0x06, 0x06, 0x06, 0xE6, 0x76, 0x1E, 0x06, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, // 55 - 0x9C, 0xFE, 0x66, 0x66, 0x66, 0xFE, 0x9C, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x1C, 0x0C, // 56 - 0x3C, 0x7E, 0x66, 0x66, 0x66, 0xFC, 0xF8, 0x0C, 0x1C, 0x18, 0x18, 0x1C, 0x0C, 0x04, // 57 - 0x18, 0x18, 0x18, 0x18, // 58 - 0x18, 0x18, 0x58, 0x38, // 59 - 0x60, 0x60, 0xF0, 0xF0, 0x98, 0x98, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x0C, // 60 - 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 61 - 0x0C, 0x98, 0x98, 0xF0, 0xF0, 0x60, 0x60, 0x0C, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, // 62 - 0x08, 0x0C, 0x06, 0xC6, 0xE6, 0x76, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, // 63 - 0xE0, 0x30, 0x08, 0xC4, 0xF6, 0x3A, 0x1A, 0x1A, 0xF2, 0xFA, 0x7E, 0x04, 0x08, 0xF0, 0x0C, 0x30, 0x60, 0x4C, 0x9C, 0x98, 0x98, 0x8C, 0x9C, 0x9C, 0x90, 0x48, 0x4C, 0x20, // 64 - 0x00, 0xC0, 0xF8, 0xBE, 0x86, 0xBE, 0xF8, 0xC0, 0x00, 0x18, 0x1C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1C, 0x18, // 65 - 0xFE, 0xFE, 0x66, 0x66, 0x66, 0x66, 0xFE, 0xDC, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x0C, // 66 - 0xF8, 0xFC, 0x0E, 0x06, 0x06, 0x0E, 0x9C, 0x08, 0x04, 0x0C, 0x1C, 0x18, 0x18, 0x1C, 0x0C, 0x04, // 67 - 0xFE, 0xFE, 0x06, 0x06, 0x06, 0x0E, 0xFC, 0xF8, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x1C, 0x0C, 0x04, // 68 - 0xFE, 0xFE, 0x66, 0x66, 0x66, 0x66, 0x66, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, // 69 - 0xFE, 0xFE, 0x66, 0x66, 0x66, 0x66, 0x06, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, // 70 - 0xF8, 0xFC, 0x0E, 0x06, 0x06, 0xC6, 0xCE, 0xDC, 0xC8, 0x04, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x04, // 71 - 0xFE, 0xFE, 0x60, 0x60, 0x60, 0x60, 0xFE, 0xFE, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, // 72 - 0xFE, 0xFE, 0x1C, 0x1C, // 73 - 0x80, 0x80, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x1C, 0x0C, // 74 - 0xFE, 0xFE, 0x60, 0x30, 0x78, 0xEC, 0x86, 0x02, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x04, 0x1C, 0x18, // 75 - 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, // 76 - 0xFE, 0xFE, 0x0E, 0x7C, 0xE0, 0x00, 0xE0, 0x7C, 0x0E, 0xFE, 0xFE, 0x1C, 0x1C, 0x00, 0x00, 0x0C, 0x1C, 0x0C, 0x00, 0x00, 0x1C, 0x1C, // 77 - 0xFE, 0xFE, 0x1C, 0x78, 0xE0, 0x80, 0xFE, 0xFE, 0x1C, 0x1C, 0x00, 0x00, 0x04, 0x0C, 0x1C, 0x1C, // 78 - 0xF8, 0xFC, 0x0E, 0x06, 0x06, 0x06, 0x0E, 0xFC, 0xF8, 0x04, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x1C, 0x0C, 0x04, // 79 - 0xFE, 0xFE, 0x66, 0x66, 0x66, 0x7E, 0x3C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, // 80 - 0xF8, 0xFC, 0x0E, 0x06, 0x86, 0x06, 0x0E, 0xFC, 0xF8, 0x04, 0x0C, 0x1C, 0x18, 0x18, 0x1C, 0x0C, 0x1C, 0x24, // 81 - 0xFE, 0xFE, 0x66, 0x66, 0xE6, 0xE6, 0xBE, 0x1C, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x18, 0x10, // 82 - 0x3C, 0x7E, 0x66, 0x66, 0x66, 0xEE, 0xCC, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x1C, 0x0C, // 83 - 0x06, 0x06, 0x06, 0xFE, 0xFE, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, // 84 - 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x04, 0x0C, 0x1C, 0x18, 0x18, 0x1C, 0x0C, 0x04, // 85 - 0x02, 0x1E, 0xFC, 0xE0, 0x00, 0xE0, 0xFC, 0x1E, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, // 86 - 0x06, 0xFE, 0xF8, 0x00, 0xF0, 0xFE, 0x0E, 0xFE, 0xF0, 0x00, 0xF8, 0xFE, 0x06, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, // 87 - 0x06, 0x0E, 0xF8, 0xF0, 0xF8, 0x0E, 0x06, 0x18, 0x1C, 0x04, 0x00, 0x04, 0x1C, 0x18, // 88 - 0x06, 0x0E, 0x38, 0xF0, 0xF0, 0x38, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, // 89 - 0x06, 0x06, 0x86, 0xE6, 0x76, 0x1E, 0x0E, 0x06, 0x18, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, // 90 - 0xFE, 0xFE, 0x06, 0x06, 0xFC, 0xFC, 0xC0, 0xC0, // 91 - 0x06, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x04, 0x18, // 92 - 0x06, 0x06, 0xFE, 0xFE, 0xC0, 0xC0, 0xFC, 0xFC, // 93 - 0x20, 0x38, 0x0E, 0x0E, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 94 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 95 - 0x02, 0x06, 0x04, 0x00, 0x00, 0x00, // 96 - 0x10, 0x98, 0xD8, 0x58, 0xF8, 0xF0, 0x00, 0x0C, 0x1C, 0x18, 0x18, 0x0C, 0x1C, 0x10, // 97 - 0xFE, 0xFE, 0x30, 0x18, 0x38, 0xF0, 0xE0, 0x1C, 0x1C, 0x0C, 0x18, 0x1C, 0x0C, 0x04, // 98 - 0xE0, 0xF0, 0x18, 0x18, 0x38, 0x30, 0x04, 0x0C, 0x18, 0x18, 0x1C, 0x0C, // 99 - 0xE0, 0xF0, 0x38, 0x18, 0x30, 0xFE, 0xFE, 0x04, 0x0C, 0x1C, 0x18, 0x0C, 0x1C, 0x1C, // 100 - 0xE0, 0xF0, 0xD8, 0xD8, 0xD8, 0xF0, 0xE0, 0x04, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x08, // 101 - 0x18, 0xFC, 0xFE, 0x1A, 0x1A, 0x00, 0x1C, 0x1C, 0x00, 0x00, // 102 - 0xE0, 0xF0, 0x38, 0x18, 0x30, 0xF8, 0xF8, 0x64, 0xEC, 0xDC, 0xD8, 0xCC, 0xFC, 0x7C, // 103 - 0xFE, 0xFE, 0x30, 0x18, 0x18, 0xF8, 0xF0, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x1C, // 104 - 0xFA, 0xFA, 0x1C, 0x1C, // 105 - 0x00, 0xFA, 0xFA, 0xC0, 0xFC, 0x7C, // 106 - 0xFE, 0xFE, 0xE0, 0xF0, 0x98, 0x08, 0x1C, 0x1C, 0x00, 0x04, 0x1C, 0x18, // 107 - 0xFE, 0xFE, 0x1C, 0x1C, // 108 - 0xF8, 0xF8, 0x10, 0x18, 0xF8, 0xF0, 0x18, 0x18, 0xF8, 0xF0, 0x1C, 0x1C, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x1C, 0x1C, // 109 - 0xF8, 0xF8, 0x30, 0x18, 0x18, 0xF8, 0xF0, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x1C, // 110 - 0xE0, 0xF0, 0x38, 0x18, 0x38, 0xF0, 0xE0, 0x04, 0x0C, 0x1C, 0x18, 0x1C, 0x0C, 0x04, // 111 - 0xF8, 0xF8, 0x30, 0x18, 0x38, 0xF0, 0xE0, 0xFC, 0xFC, 0x0C, 0x18, 0x1C, 0x0C, 0x04, // 112 - 0xE0, 0xF0, 0x38, 0x18, 0x30, 0xF8, 0xF8, 0x04, 0x0C, 0x1C, 0x18, 0x0C, 0xFC, 0xFC, // 113 - 0xF8, 0xF8, 0x30, 0x18, 0x18, 0x1C, 0x1C, 0x00, 0x00, 0x00, // 114 - 0x70, 0xF8, 0xD8, 0xD8, 0xD8, 0x90, 0x08, 0x18, 0x18, 0x18, 0x1C, 0x0C, // 115 - 0x18, 0xFC, 0xFE, 0x18, 0x18, 0x00, 0x0C, 0x1C, 0x18, 0x18, // 116 - 0xF8, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x0C, 0x1C, 0x18, 0x18, 0x0C, 0x1C, 0x1C, // 117 - 0x38, 0xF8, 0xC0, 0x00, 0xC0, 0xF8, 0x38, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, // 118 - 0x18, 0xF8, 0xE0, 0x00, 0xF0, 0x38, 0xF0, 0x00, 0xE0, 0xF8, 0x18, 0x00, 0x00, 0x1C, 0x1C, 0x0C, 0x00, 0x0C, 0x1C, 0x1C, 0x00, 0x00, // 119 - 0x18, 0x38, 0xE0, 0xE0, 0x38, 0x18, 0x18, 0x1C, 0x04, 0x04, 0x1C, 0x18, // 120 - 0x18, 0xF8, 0xE0, 0x00, 0xE0, 0xF8, 0x18, 0x00, 0x84, 0xFC, 0xF8, 0x3C, 0x04, 0x00, // 121 - 0x18, 0x98, 0xD8, 0x78, 0x38, 0x1C, 0x1C, 0x18, 0x18, 0x18, // 122 - 0x80, 0xFC, 0x7E, 0x06, 0x06, 0x00, 0x7C, 0xFC, 0xC0, 0xC0, // 123 - 0xFE, 0xFC, // 124 - 0x06, 0x06, 0x7E, 0xFC, 0x80, 0xC0, 0xC0, 0xFC, 0x7C, 0x00, // 125 - 0x60, 0x30, 0x30, 0x70, 0x60, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 126 - 0xFE, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFE, 0x1C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1C // 127 - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/fonts/Corsiva_12.h b/STM32F1/libraries/ILI9341_due_STM/fonts/Corsiva_12.h deleted file mode 100644 index 74ee8d681..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/fonts/Corsiva_12.h +++ /dev/null @@ -1,167 +0,0 @@ - - -/* - * - * Corsiva_12 - * - * created with FontCreator - * written by F. Maximilian Thiele - * - * http://www.apetech.de/fontCreator - * me@apetech.de - * - * File Name : corsiva_12.h - * Date : 29.01.2005 - * Font size in bytes : 5690 - * Font width : 10 - * Font height : 11 - * Font first char : 32 - * Font last char : 128 - * Font used chars : 96 - * - * The font data are defined as - * - * struct _FONT_ { - * uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; - * uint8_t font_Width_in_Pixel_for_fixed_drawing; - * uint8_t font_Height_in_Pixel_for_all_characters; - * unit8_t font_First_Char; - * uint8_t font_Char_Count; - * - * uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1]; - * // for each character the separate width in pixels, - * // characters < 128 have an implicit virtual right empty row - * - * uint8_t font_data[]; - * // bit field of all characters - */ - -#include -#include - -#ifndef CORSIVA_12_H -#define CORSIVA_12_H - -#define CORSIVA_12_WIDTH 10 -#define CORSIVA_12_HEIGHT 11 - -static const uint8_t Corsiva_12[] PROGMEM = { - 0x16, 0x3A, // size - 0x0A, // width - 0x0B, // height - 0x20, // first char - 0x60, // char count - - // char widths - 0x03, 0x02, 0x02, 0x06, 0x05, 0x07, 0x09, 0x01, 0x03, 0x04, - 0x02, 0x05, 0x02, 0x03, 0x01, 0x05, 0x05, 0x04, 0x05, 0x04, - 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x02, 0x03, 0x05, 0x05, - 0x05, 0x04, 0x07, 0x07, 0x07, 0x06, 0x08, 0x07, 0x07, 0x07, - 0x0A, 0x05, 0x06, 0x09, 0x07, 0x09, 0x0A, 0x06, 0x07, 0x09, - 0x09, 0x06, 0x08, 0x08, 0x08, 0x0B, 0x09, 0x09, 0x07, 0x03, - 0x03, 0x04, 0x03, 0x06, 0x02, 0x04, 0x04, 0x04, 0x06, 0x04, - 0x06, 0x06, 0x04, 0x03, 0x04, 0x06, 0x03, 0x06, 0x04, 0x04, - 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x06, 0x08, 0x07, 0x05, - 0x06, 0x03, 0x01, 0x04, 0x05, 0x06, - - // font data - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 32 - 0x80, 0x3E, 0x00, 0x00, // 33 - 0x08, 0x06, 0x00, 0x00, // 34 - 0xA0, 0x78, 0xAE, 0x78, 0x2E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 35 - 0x80, 0x8C, 0xF2, 0xBF, 0x62, 0x00, 0x20, 0x00, 0x00, 0x00, // 36 - 0x1C, 0x92, 0x7E, 0x0C, 0xE2, 0x90, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 37 - 0x70, 0xC8, 0xA8, 0xB8, 0x6C, 0xBE, 0x02, 0xC2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, // 38 - 0x08, 0x00, // 39 - 0xE0, 0x18, 0x06, 0x60, 0x80, 0x00, // 40 - 0x00, 0x00, 0xC3, 0x3C, 0x40, 0x20, 0x00, 0x00, // 41 - 0x0C, 0x0F, 0x00, 0x00, // 42 - 0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // 43 - 0x00, 0x80, 0x40, 0x20, // 44 - 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, // 45 - 0x80, 0x00, // 46 - 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, // 47 - 0x78, 0x84, 0x82, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, // 48 - 0x80, 0x88, 0xFC, 0x86, 0x00, 0x00, 0x00, 0x00, // 49 - 0xC0, 0xC4, 0xA2, 0x92, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, // 50 - 0xC0, 0x80, 0xDA, 0x76, 0x00, 0x00, 0x00, 0x00, // 51 - 0x20, 0x30, 0xA8, 0x7E, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 52 - 0x80, 0x80, 0x84, 0x4A, 0x32, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 53 - 0x70, 0xAC, 0x94, 0x72, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 54 - 0xC4, 0x32, 0x0A, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 55 - 0xE0, 0xAC, 0x92, 0x6A, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, // 56 - 0x80, 0x9C, 0x52, 0x72, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, // 57 - 0x80, 0x08, 0x00, 0x00, // 58 - 0x00, 0x80, 0x08, 0x40, 0x20, 0x00, // 59 - 0x30, 0x30, 0x48, 0x48, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, // 60 - 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, // 61 - 0x48, 0x48, 0x48, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // 62 - 0x80, 0x36, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00, // 63 - 0x70, 0xCC, 0xB4, 0xAA, 0xBA, 0x62, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 64 - 0x00, 0x80, 0x4C, 0x32, 0x2E, 0xFE, 0x82, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 65 - 0x38, 0x24, 0x86, 0xFA, 0x8E, 0x8A, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 66 - 0xF0, 0x8C, 0x04, 0x02, 0x82, 0x0C, 0x00, 0x20, 0x20, 0x20, 0x00, 0x00, // 67 - 0x38, 0x4C, 0x86, 0xEA, 0x9A, 0x82, 0x46, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 68 - 0x38, 0x84, 0xE2, 0x9E, 0x92, 0xBA, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 69 - 0x1C, 0x86, 0xE2, 0x9E, 0x12, 0x3A, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 70 - 0x70, 0x8C, 0x84, 0x82, 0xD2, 0x32, 0x16, 0x00, 0x80, 0x80, 0xC0, 0x20, 0x00, 0x00, // 71 - 0xC0, 0x8C, 0xC2, 0x3A, 0x16, 0x90, 0xF8, 0x86, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 72 - 0x80, 0xC0, 0xFA, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 73 - 0x00, 0x00, 0x0C, 0xC2, 0x3A, 0x06, 0x60, 0x40, 0x40, 0x20, 0x00, 0x00, // 74 - 0x8C, 0x82, 0xF2, 0x1E, 0x78, 0x88, 0x06, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x40, 0x40, // 75 - 0x80, 0xC0, 0xB8, 0x84, 0x82, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 76 - 0x80, 0x9C, 0x62, 0x1E, 0xF8, 0x60, 0x90, 0xFC, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 77 - 0x80, 0x0C, 0xE2, 0x12, 0x0E, 0xF0, 0x70, 0x0C, 0x02, 0x02, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 78 - 0x78, 0xC4, 0x82, 0x82, 0x46, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 79 - 0x38, 0xCC, 0x86, 0xFA, 0x92, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 80 - 0x78, 0xC4, 0x82, 0x82, 0x42, 0x26, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0xC0, 0x80, 0x80, 0x40, // 81 - 0x38, 0xA4, 0x86, 0xFA, 0x32, 0xD2, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x40, 0x40, // 82 - 0x80, 0x00, 0x0C, 0x92, 0xE2, 0x0E, 0x00, 0x20, 0x20, 0x20, 0x00, 0x00, // 83 - 0x1C, 0x86, 0x82, 0xF2, 0x8E, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 84 - 0x0C, 0x7A, 0x86, 0x80, 0x80, 0x40, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 85 - 0x0C, 0x06, 0xFE, 0x42, 0x20, 0x10, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 86 - 0x0C, 0x06, 0xFE, 0x32, 0x08, 0x04, 0xFE, 0x20, 0x10, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 87 - 0x00, 0x80, 0x40, 0x22, 0x1E, 0xF4, 0x82, 0x01, 0x01, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 88 - 0x1C, 0x04, 0x82, 0xC6, 0xBC, 0x8C, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 89 - 0x80, 0xC0, 0xA6, 0x92, 0x8A, 0x86, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 90 - 0x00, 0xF0, 0x0F, 0xC0, 0xA0, 0x00, // 91 - 0x07, 0xFC, 0x80, 0x00, 0x00, 0x60, // 92 - 0x00, 0x00, 0xF1, 0x0F, 0x80, 0xE0, 0x00, 0x00, // 93 - 0x04, 0x02, 0x04, 0x00, 0x00, 0x00, // 94 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 95 - 0x01, 0x02, 0x00, 0x00, // 96 - 0xE0, 0x90, 0xC8, 0xB8, 0x00, 0x00, 0x00, 0x00, // 97 - 0xE0, 0x9E, 0x49, 0x39, 0x00, 0x00, 0x00, 0x00, // 98 - 0xE0, 0x90, 0x88, 0x48, 0x00, 0x00, 0x00, 0x00, // 99 - 0xE0, 0x90, 0x48, 0xF8, 0x4E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 100 - 0xF0, 0xB0, 0xA8, 0x58, 0x00, 0x00, 0x00, 0x00, // 101 - 0x00, 0x90, 0x78, 0x16, 0x01, 0x01, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, // 102 - 0x00, 0xE0, 0x90, 0x88, 0xE8, 0x18, 0xE0, 0x80, 0x80, 0xC0, 0x60, 0x00, // 103 - 0xE0, 0x1E, 0xD1, 0xB9, 0x00, 0x00, 0x00, 0x00, // 104 - 0xE0, 0x38, 0x02, 0x00, 0x00, 0x00, // 105 - 0x00, 0x90, 0x78, 0x02, 0x80, 0x60, 0x00, 0x00, // 106 - 0xE0, 0x3E, 0xE9, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x40, 0x40, // 107 - 0xE0, 0x9C, 0x42, 0x00, 0x00, 0x00, // 108 - 0xC8, 0x38, 0xD0, 0x38, 0xF0, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 109 - 0xE8, 0x18, 0xD0, 0xB8, 0x00, 0x00, 0x00, 0x00, // 110 - 0xF0, 0x88, 0xC8, 0x38, 0x00, 0x00, 0x00, 0x00, // 111 - 0x88, 0xF8, 0x90, 0x48, 0x38, 0xE0, 0x80, 0x00, 0x00, 0x00, // 112 - 0xE0, 0x90, 0x88, 0xE8, 0x18, 0x00, 0x80, 0xC0, 0xA0, 0x00, // 113 - 0xC8, 0x38, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, // 114 - 0xC0, 0x98, 0xE8, 0x08, 0x00, 0x00, 0x00, 0x00, // 115 - 0xE8, 0x9C, 0x88, 0x40, 0x00, 0x00, 0x00, 0x00, // 116 - 0xE8, 0x98, 0xE0, 0x98, 0x00, 0x00, 0x00, 0x00, // 117 - 0x10, 0x08, 0xF8, 0x88, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 118 - 0x10, 0x08, 0xF8, 0x88, 0x40, 0xF8, 0x40, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 119 - 0x80, 0xD0, 0x58, 0xF0, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x60, // 120 - 0x10, 0x18, 0xF0, 0xC0, 0x38, 0x80, 0x40, 0x20, 0x00, 0x00, // 121 - 0x80, 0xD8, 0xA8, 0x98, 0xD8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 122 - 0xA0, 0xD8, 0x07, 0xE0, 0x80, 0x00, // 123 - 0xFF, 0xE0, // 124 - 0x00, 0x00, 0xD1, 0x2F, 0x80, 0xC0, 0x20, 0x00, // 125 - 0x08, 0x08, 0x18, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // 126 - 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // 127 - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/fonts/SystemFont5x7.h b/STM32F1/libraries/ILI9341_due_STM/fonts/SystemFont5x7.h deleted file mode 100644 index 8959af1ac..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/fonts/SystemFont5x7.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * - * System5x7 - * - * - * File Name : System5x7.h - * Date : 28 Oct 2008 - * Font size in bytes : 470 - * Font width : 5 - * Font height : 7 - * Font first char : 32 - * Font last char : 127 - * Font used chars : 94 - * - * The font data are defined as - * - * struct _FONT_ { - * uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; - * uint8_t font_Width_in_Pixel_for_fixed_drawing; - * uint8_t font_Height_in_Pixel_for_all_characters; - * unit8_t font_First_Char; - * uint8_t font_Char_Count; - * - * uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1]; - * // for each character the separate width in pixels, - * // characters < 128 have an implicit virtual right empty row - * - * uint8_t font_data[]; - * // bit field of all characters - */ - -#include -#include - -#ifndef SYSTEM5x7_H -#define SYSTEM5x7_H - -#define SYSTEM5x7_WIDTH 5 -#define SYSTEM5x7_HEIGHT 7 - -/* - * added to allow fontname to match header file name. - * as well as keep the old name for backward compability - */ - -#define SystemFont5x7 System5x7 - -static const uint8_t System5x7[] PROGMEM = { - 0x0, 0x0, // size of zero indicates fixed width font, actual length is width * height - 0x05, // width - 0x07, // height - 0x20, // first char - 0x60, // char count - - // Fixed width; char width table not used !!!! - - // font data - 0x00, 0x00, 0x00, 0x00, 0x00,// (space) - 0x00, 0x00, 0x5F, 0x00, 0x00,// ! - 0x00, 0x07, 0x00, 0x07, 0x00,// " - 0x14, 0x7F, 0x14, 0x7F, 0x14,// # - 0x24, 0x2A, 0x7F, 0x2A, 0x12,// $ - 0x23, 0x13, 0x08, 0x64, 0x62,// % - 0x36, 0x49, 0x55, 0x22, 0x50,// & - 0x00, 0x05, 0x03, 0x00, 0x00,// ' - 0x00, 0x1C, 0x22, 0x41, 0x00,// ( - 0x00, 0x41, 0x22, 0x1C, 0x00,// ) - 0x08, 0x2A, 0x1C, 0x2A, 0x08,// * - 0x08, 0x08, 0x3E, 0x08, 0x08,// + - 0x00, 0x50, 0x30, 0x00, 0x00,// , - 0x08, 0x08, 0x08, 0x08, 0x08,// - - 0x00, 0x60, 0x60, 0x00, 0x00,// . - 0x20, 0x10, 0x08, 0x04, 0x02,// / - 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0 - 0x00, 0x42, 0x7F, 0x40, 0x00,// 1 - 0x42, 0x61, 0x51, 0x49, 0x46,// 2 - 0x21, 0x41, 0x45, 0x4B, 0x31,// 3 - 0x18, 0x14, 0x12, 0x7F, 0x10,// 4 - 0x27, 0x45, 0x45, 0x45, 0x39,// 5 - 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6 - 0x01, 0x71, 0x09, 0x05, 0x03,// 7 - 0x36, 0x49, 0x49, 0x49, 0x36,// 8 - 0x06, 0x49, 0x49, 0x29, 0x1E,// 9 - 0x00, 0x36, 0x36, 0x00, 0x00,// : - 0x00, 0x56, 0x36, 0x00, 0x00,// ; - 0x00, 0x08, 0x14, 0x22, 0x41,// < - 0x14, 0x14, 0x14, 0x14, 0x14,// = - 0x41, 0x22, 0x14, 0x08, 0x00,// > - 0x02, 0x01, 0x51, 0x09, 0x06,// ? - 0x32, 0x49, 0x79, 0x41, 0x3E,// @ - 0x7E, 0x11, 0x11, 0x11, 0x7E,// A - 0x7F, 0x49, 0x49, 0x49, 0x36,// B - 0x3E, 0x41, 0x41, 0x41, 0x22,// C - 0x7F, 0x41, 0x41, 0x22, 0x1C,// D - 0x7F, 0x49, 0x49, 0x49, 0x41,// E - 0x7F, 0x09, 0x09, 0x01, 0x01,// F - 0x3E, 0x41, 0x41, 0x51, 0x32,// G - 0x7F, 0x08, 0x08, 0x08, 0x7F,// H - 0x00, 0x41, 0x7F, 0x41, 0x00,// I - 0x20, 0x40, 0x41, 0x3F, 0x01,// J - 0x7F, 0x08, 0x14, 0x22, 0x41,// K - 0x7F, 0x40, 0x40, 0x40, 0x40,// L - 0x7F, 0x02, 0x04, 0x02, 0x7F,// M - 0x7F, 0x04, 0x08, 0x10, 0x7F,// N - 0x3E, 0x41, 0x41, 0x41, 0x3E,// O - 0x7F, 0x09, 0x09, 0x09, 0x06,// P - 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q - 0x7F, 0x09, 0x19, 0x29, 0x46,// R - 0x46, 0x49, 0x49, 0x49, 0x31,// S - 0x01, 0x01, 0x7F, 0x01, 0x01,// T - 0x3F, 0x40, 0x40, 0x40, 0x3F,// U - 0x1F, 0x20, 0x40, 0x20, 0x1F,// V - 0x7F, 0x20, 0x18, 0x20, 0x7F,// W - 0x63, 0x14, 0x08, 0x14, 0x63,// X - 0x03, 0x04, 0x78, 0x04, 0x03,// Y - 0x61, 0x51, 0x49, 0x45, 0x43,// Z - 0x00, 0x00, 0x7F, 0x41, 0x41,// [ - 0x02, 0x04, 0x08, 0x10, 0x20,// "\" - 0x41, 0x41, 0x7F, 0x00, 0x00,// ] - 0x04, 0x02, 0x01, 0x02, 0x04,// ^ - 0x40, 0x40, 0x40, 0x40, 0x40,// _ - 0x00, 0x01, 0x02, 0x04, 0x00,// ` - 0x20, 0x54, 0x54, 0x54, 0x78,// a - 0x7F, 0x48, 0x44, 0x44, 0x38,// b - 0x38, 0x44, 0x44, 0x44, 0x20,// c - 0x38, 0x44, 0x44, 0x48, 0x7F,// d - 0x38, 0x54, 0x54, 0x54, 0x18,// e - 0x08, 0x7E, 0x09, 0x01, 0x02,// f - 0x08, 0x14, 0x54, 0x54, 0x3C,// g - 0x7F, 0x08, 0x04, 0x04, 0x78,// h - 0x00, 0x44, 0x7D, 0x40, 0x00,// i - 0x20, 0x40, 0x44, 0x3D, 0x00,// j - 0x00, 0x7F, 0x10, 0x28, 0x44,// k - 0x00, 0x41, 0x7F, 0x40, 0x00,// l - 0x7C, 0x04, 0x18, 0x04, 0x78,// m - 0x7C, 0x08, 0x04, 0x04, 0x78,// n - 0x38, 0x44, 0x44, 0x44, 0x38,// o - 0x7C, 0x14, 0x14, 0x14, 0x08,// p - 0x08, 0x14, 0x14, 0x18, 0x7C,// q - 0x7C, 0x08, 0x04, 0x04, 0x08,// r - 0x48, 0x54, 0x54, 0x54, 0x20,// s - 0x04, 0x3F, 0x44, 0x40, 0x20,// t - 0x3C, 0x40, 0x40, 0x20, 0x7C,// u - 0x1C, 0x20, 0x40, 0x20, 0x1C,// v - 0x3C, 0x40, 0x30, 0x40, 0x3C,// w - 0x44, 0x28, 0x10, 0x28, 0x44,// x - 0x0C, 0x50, 0x50, 0x50, 0x3C,// y - 0x44, 0x64, 0x54, 0x4C, 0x44,// z - 0x00, 0x08, 0x36, 0x41, 0x00,// { - 0x00, 0x00, 0x7F, 0x00, 0x00,// | - 0x00, 0x41, 0x36, 0x08, 0x00,// } - 0x08, 0x08, 0x2A, 0x1C, 0x08,// -> - 0x08, 0x1C, 0x2A, 0x08, 0x08 // <- - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/fonts/Verdana_digits_24.h b/STM32F1/libraries/ILI9341_due_STM/fonts/Verdana_digits_24.h deleted file mode 100644 index 38e86143c..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/fonts/Verdana_digits_24.h +++ /dev/null @@ -1,116 +0,0 @@ - - -/* - * - * Verdana28 - * - * created with FontCreator - * written by F. Maximilian Thiele - * - * http://www.apetech.de/fontCreator - * me@apetech.de - * - * File Name : Verdana_digits_24 - * Date : 01.05.2008 - * Font size in bytes : 3833 - * Font width : 10 - * Font height : 24 - * Font first char : 48 - * Font last char : 59 - * Font used chars : 11 - * - * The font data are defined as - * - * struct _FONT_ { - * uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; - * uint8_t font_Width_in_Pixel_for_fixed_drawing; - * uint8_t font_Height_in_Pixel_for_all_characters; - * unit8_t font_First_Char; - * uint8_t font_Char_Count; - * - * uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1]; - * // for each character the separate width in pixels, - * // characters < 128 have an implicit virtual right empty -row - * - * uint8_t font_data[]; - * // bit field of all characters - */ - -#include -#include - -#ifndef VERDANA24_H -#define VERDANA24_H - -#define VERDANA24_WIDTH 10 -#define VERDANA24_HEIGHT 24 - -static const uint8_t Verdana24[] PROGMEM = { - 0x0E, 0xF9, // size - 0x0A, // width - 0x18, // height - 0x30, // first char - 0x0B, // char count - - // char widths - 0x10, 0x0D, 0x0F, 0x0F, 0x11, 0x0F, 0x10, 0x10, 0x10, 0x10, - 0x04, - - // font data - 0x80, 0xF0, 0xFC, 0x7E, 0x0E, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x1E, -0x7E, 0xFC, 0xF0, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x0F, 0x3F, 0x7E, -0x70, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0x70, 0x7E, 0x3F, 0x0F, 0x01, //48 - - 0x38, 0x38, 0x38, 0x38, 0x3C, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, -0xE0, 0xE0, 0xE0, // 49 - - 0x00, 0x1E, 0x0E, 0x0E, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x1E, 0xFE, -0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, -0x78, 0x3E, 0x1F, 0x07, 0x01, 0x00, 0xF0, 0xF8, 0xFC, 0xFE, 0xEF, 0xE7, -0xE3, 0xE1, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, // 50 - - 0x00, 0x1E, 0x0E, 0x0E, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x1E, -0xFE, 0xFC, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, -0x1E, 0x36, 0x77, 0xF3, 0xE1, 0xC0, 0x78, 0x70, 0x70, 0xF0, 0xE0, 0xE0, -0xE0, 0xE0, 0xE0, 0xF0, 0x70, 0x78, 0x3F, 0x1F, 0x0F, // 51 - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF8, 0x7C, 0x1E, 0xFF, -0xFF, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0xFC, 0xFE, 0xDF, 0xC7, 0xC3, -0xC1, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, -0x01, 0x01, 0x01, // 52 - - 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x00, 0x1F, 0x1F, 0x0F, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, -0x1E, 0x1C, 0x3C, 0xF8, 0xF8, 0xE0, 0x78, 0x70, 0x70, 0xF0, 0xE0, 0xE0, -0xE0, 0xE0, 0xE0, 0xF0, 0x70, 0x7C, 0x3F, 0x1F, 0x07, // 53 - - 0x00, 0xC0, 0xF0, 0xF8, 0x3C, 0x1E, 0x0E, 0x0E, 0x07, 0x07, 0x07, 0x07, -0x07, 0x0F, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x1C, 0x1C, 0x0E, 0x0E, 0x0E, -0x0E, 0x0E, 0x0E, 0x1E, 0x3C, 0xF8, 0xF8, 0xE0, 0x03, 0x0F, 0x3F, 0x7C, -0x78, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x70, 0x78, 0x3F, 0x1F, 0x07, //54 - - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x87, -0xE7, 0xFF, 0x7F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, -0xF0, 0xFC, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, -0xF8, 0xFC, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //55 - - 0x00, 0xF0, 0xFC, 0xFE, 0x0E, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x1E, -0xFE, 0xFC, 0xF8, 0x00, 0x80, 0xE0, 0xF3, 0x77, 0x1F, 0x0E, 0x0E, 0x0C, -0x1C, 0x1C, 0x1C, 0x3E, 0x77, 0xF3, 0xE0, 0x80, 0x0F, 0x1F, 0x3F, 0x78, -0x70, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x70, 0x78, 0x3F, 0x1F, 0x0F, //56 - - 0xE0, 0xF8, 0xFC, 0x1E, 0x0E, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x1E, -0x3E, 0xFC, 0xF0, 0xC0, 0x07, 0x1F, 0x1F, 0x3C, 0x78, 0x70, 0x70, 0x70, -0x70, 0x70, 0x70, 0x38, 0x38, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xF0, 0xE0, -0xE0, 0xE0, 0xE0, 0xE0, 0x70, 0x70, 0x78, 0x3C, 0x1F, 0x0F, 0x03, 0x00, //57 - - 0xC0, 0xC0, 0xC0, 0xC0, 0x03, 0x03, 0x03, 0x03, 0xF0, 0xF0, 0xF0, 0xF0 // 58 - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/fonts/allFonts.h b/STM32F1/libraries/ILI9341_due_STM/fonts/allFonts.h deleted file mode 100644 index cafd7ebec..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/fonts/allFonts.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * allFonts.h font header for GLCD library - * The fonts listed below will be available in a sketch if this file is included - * - * If you create your own fonts you can add the header to this file - * - * Note that the build environment only holds a font in Flash if its selected - * so there is no penalty to including a font file here if its not used - */ - -#include "SystemFont5x7.h" // system font -#include "Arial14.h" // proportional font -#include "Arial_bold_14.h" // Bold proportional font -#include "Corsiva_12.h" -#include "Verdana_digits_24.h" // large proportional font - numerals only -#include "fixednums7x15.h" // fixed width font - numerals only -#include "fixednums8x16.h" // fixed width font - numerals only -#include "fixednums15x31.h" // fixed width font - numerals only diff --git a/STM32F1/libraries/ILI9341_due_STM/fonts/fixednums15x31.h b/STM32F1/libraries/ILI9341_due_STM/fonts/fixednums15x31.h deleted file mode 100644 index 346e1298f..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/fonts/fixednums15x31.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Fixed width font for numbers - * - * This font is very useful when using overstrike as all characters & numbers - * are all the same width. - * - * This font also contains a few special characters that are nice for certain applications - * like clocks, signed values or decimal point values. - * - * The rendering code normally inserts a pad pixel so this size allows the font to fit - * perfectly on 32 and 64 tall glcd displays. - * - * Font has also been squeezed to 15 pixels wide for better alignment on 128 & 192 pixel displays. - */ - -#ifndef FIXEDNUMS15x31_H -#define FIXEDNUMS15x31_H - -#include -#include - - -static const uint8_t fixednums15x31[] PROGMEM = { - 0x0, 0x0, // size of zero indicates fixed width font - 15, // width - 31, // height - '+', // first char (48) - 16, // char count -// char '+' -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xfc, 0xfc, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - -// char ',' -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xcf, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, - -// char '-' -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - -// char '.' -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - -// char '/' -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, -0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - -// char '0' -0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0xcf, 0xcf, 0xfc, 0xfc, 0xf0, 0xf0, -0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, 0xc0, 0x3c, 0x3f, 0x03, 0xff, 0xff, 0xff, 0xff, -0xff, 0xff, 0xff, 0xff, 0x3c, 0x3c, 0x03, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - -// char '1' -0x30, 0x30, 0x30, 0x30, 0x3c, 0x3c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, - -// char '2' -0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x0f, 0xff, 0xfc, 0xfc, 0xf0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xff, 0x3f, 0x3f, 0x0f, -0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, - -// char '3' -0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x1f, 0xfc, 0xfc, 0xf0, -0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xff, 0xdf, 0x8f, -0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, -0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, - -// char '4' -0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, - -// char '5' -0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, -0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0xfc, 0xf0, 0xf0, 0xc0, -0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, - -// char '6' -0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x03, -0xfc, 0xfc, 0xff, 0xff, 0x33, 0x33, 0x30, 0x30, 0x30, 0x30, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, -0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, - -// char '7' -0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xff, 0xff, 0x3f, 0x3f, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - -// char '8' -0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xf0, 0xf0, -0x03, 0x03, 0xcf, 0xcf, 0xfc, 0xfc, 0x30, 0x30, 0x30, 0xfc, 0xfc, 0xcf, 0xcf, 0x03, 0x03, -0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - -// char '9' -0xe0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xf0, 0xe0, -0x07, 0x0f, 0x3f, 0x3f, 0xf0, 0xf0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xfc, 0xfc, 0x3f, 0x3f, 0x03, -0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - -// char ':' -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/fonts/fixednums7x15.h b/STM32F1/libraries/ILI9341_due_STM/fonts/fixednums7x15.h deleted file mode 100644 index 42337e366..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/fonts/fixednums7x15.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Fixed width font for numbers - * - * This font is very useful when using overstrike as all characters & numbers - * are all the same width. - * - * This font also contains a few special characters that are nice for certain applications - * like clocks, signed values or decimal point values. - * - * When rendering code inserts a pad pixel this size allows the font to fit - * perfectly on 32 and 64 tall glcd displays as well as 128 wide displays. - */ - -#ifndef FIXEDNUMS7x15_H -#define FIXEDNUMS7x15_H - -#include -#include - - -static const uint8_t fixednums7x15[] PROGMEM = { - 0x0, 0x0, // size of zero indicates fixed width font - 7, // width - 15, // height - '+', // first char (48) - 16, // char count -// char '+' -0x00, 0x80, 0x80, 0xe0, 0xe0, 0x80, 0x80, -0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, - -// char ',' -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x58, 0x38, 0x00, 0x00, - -// char '-' -0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - -// char '.' -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, - -// char '/' -0x00, 0x00, 0x00, 0xc0, 0xf0, 0x3c, 0x0f, -0x00, 0x3c, 0x0f, 0x03, 0x00, 0x00, 0x00, - -// char '0' -0xfc, 0xfe, 0x03, 0xe1, 0x1b, 0xfe, 0xfc, -0x0f, 0x1f, 0x36, 0x21, 0x30, 0x1f, 0x0f, - -// char '1' -0x04, 0x04, 0x06, 0xff, 0xff, 0x00, 0x00, -0x20, 0x20, 0x20, 0x3f, 0x3f, 0x20, 0x20, - -// char '2' -0x0c, 0x0e, 0x03, 0x01, 0x81, 0xfe, 0x7c, -0x38, 0x3c, 0x26, 0x23, 0x21, 0x20, 0x20, - -// char '3' -0x0c, 0x0e, 0x43, 0x41, 0x43, 0xfe, 0xbc, -0x0c, 0x1c, 0x30, 0x20, 0x30, 0x1f, 0x0f, - -// char '4' -0x00, 0xe0, 0xfc, 0x1f, 0x83, 0x80, 0x00, -0x0f, 0x0f, 0x08, 0x08, 0x3f, 0x3f, 0x08, - -// char '5' -0x3f, 0x3f, 0x21, 0x21, 0x61, 0xe1, 0x81, -0x0c, 0x1c, 0x30, 0x20, 0x30, 0x3f, 0x0f, - -// char '6' -0xe0, 0xf8, 0x5c, 0x46, 0xc3, 0xc1, 0x01, -0x0f, 0x1f, 0x30, 0x20, 0x30, 0x3f, 0x0f, - -// char '7' -0x01, 0x01, 0x01, 0x81, 0xf1, 0x7f, 0x0f, -0x00, 0x00, 0x3c, 0x3f, 0x03, 0x00, 0x00, - -// char '8' -0x1c, 0xbe, 0xe3, 0x41, 0xe3, 0xbe, 0x1c, -0x0f, 0x1f, 0x30, 0x20, 0x30, 0x1f, 0x0f, - -// char '9' -0x3c, 0x7e, 0xc3, 0x81, 0x81, 0xfe, 0xfc, -0x20, 0x30, 0x38, 0x0c, 0x07, 0x03, 0x00, - -// char ':' -0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, -0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, - -}; -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/fonts/fixednums8x16.h b/STM32F1/libraries/ILI9341_due_STM/fonts/fixednums8x16.h deleted file mode 100644 index b1981ce81..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/fonts/fixednums8x16.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Fixed width font file for numbers only. - * - * This font is very useful when using overstrike as all characters & numbers - * are all the same width. - * - * This font file can be used when only numbers are needed. - * - * This font also contains a few special characters that are nice for certain applications - * like clocks, signed values or decimal point values. - * - * Font is really 16 tall but this file is set to indicate 15 to allow it to line up with the lcd page size. - * It works as the the bottom row in the glyph is whitespace anyway. - * The rendering code normally inserts a pad pixel so this size allows additional rows - * on 32 and 64 tall glcd displays. - * - */ - -#ifndef FIXEDNUMS8x16_H -#define FIXEDNUMS8x16_H - -#include -#include - - -static const uint8_t fixednums8x16[] PROGMEM = { - 0x0, 0x0, // size of zero indicates fixed width font - 8, // width - 15, // height - '+', // first char (48) - 16, // char count - - 0x80, 0x80, 0x80, 0xe0, 0xe0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, // char '+' - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x70, 0x00, 0x00, 0x00, // char ',' - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // char '-' - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, // char '.' - 0x00, 0x00, 0x00, 0xc0, 0xf0, 0x3c, 0x0f, 0x03, 0x30, 0x3c, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00, // char '/' - 0xfc, 0xfe, 0x03, 0x81, 0x61, 0x1b, 0xfe, 0xfc, 0x0f, 0x1f, 0x36, 0x21, 0x20, 0x30, 0x1f, 0x0f, // char '0' - 0x04, 0x04, 0x06, 0xff, 0xff, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x3f, 0x3f, 0x20, 0x20, 0x20, // char '1' - 0x0c, 0x0e, 0x03, 0x01, 0x81, 0xc3, 0x7e, 0x3c, 0x38, 0x3c, 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, // char '2' - 0x0c, 0x0e, 0x43, 0x41, 0x41, 0x43, 0xfe, 0xbc, 0x0c, 0x1c, 0x30, 0x20, 0x20, 0x30, 0x1f, 0x0f, // char '3' - 0x00, 0xe0, 0xfc, 0x1f, 0x83, 0x80, 0x00, 0x00, 0x0f, 0x0f, 0x08, 0x08, 0x3f, 0x3f, 0x08, 0x08, // char '4' - 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x61, 0xc1, 0x81, 0x0c, 0x1c, 0x30, 0x20, 0x20, 0x30, 0x1f, 0x0f, // char '5' - 0xe0, 0xf8, 0x5c, 0x46, 0x43, 0xc1, 0x81, 0x01, 0x0f, 0x1f, 0x30, 0x20, 0x20, 0x30, 0x1f, 0x0f, // char '6' - 0x01, 0x01, 0x01, 0x01, 0x81, 0xf1, 0x7f, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x3f, 0x03, 0x00, 0x00, // char '7' - 0x1c, 0xbe, 0xe3, 0x41, 0x41, 0xe3, 0xbe, 0x1c, 0x0f, 0x1f, 0x30, 0x20, 0x20, 0x30, 0x1f, 0x0f, // char '8' - 0x3c, 0x7e, 0xc3, 0x81, 0x81, 0x83, 0xfe, 0xfc, 0x20, 0x20, 0x20, 0x30, 0x18, 0x0e, 0x07, 0x01, // char '9' - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00 // char ': -}; -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/fonts/jokerman_255.h b/STM32F1/libraries/ILI9341_due_STM/fonts/jokerman_255.h deleted file mode 100644 index 3045ce31e..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/fonts/jokerman_255.h +++ /dev/null @@ -1,73 +0,0 @@ - - -/* - * - * jokerman_255 - * - * created with FontCreator - * written by F. Maximilian Thiele - * - * http://www.apetech.de/fontCreator - * me@apetech.de - * - * File Name : jokerman_255 - * Date : 04.09.2014 - * Font size in bytes : 362565 - * Font width : 10 - * Font height : 253 - * Font first char : 48 - * Font last char : 58 - * Font used chars : 10 - * - * The font data are defined as - * - * struct _FONT_ { - * uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; - * uint8_t font_Width_in_Pixel_for_fixed_drawing; - * uint8_t font_Height_in_Pixel_for_all_characters; - * unit8_t font_First_Char; - * uint8_t font_Char_Count; - * - * uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1]; - * // for each character the separate width in pixels, - * // characters < 128 have an implicit virtual right empty row - * - * uint8_t font_data[]; - * // bit field of all characters - */ - -#include -#include - -#ifndef JOKERMAN_255_H -#define JOKERMAN_255_H - -#define JOKERMAN_255_WIDTH 10 -#define JOKERMAN_255_HEIGHT 253 - -static const uint8_t jokerman_255[] PROGMEM = { - 0x88, 0x45, // size - 0x0A, // width - 0xFD, // height - 0x30, // first char - 0x0A, // char count - - // char widths - 0x9A, 0x4D, 0x8B, 0x9E, 0xAD, 0x91, 0x8E, 0x91, 0x90, 0x9C, - - - // font data - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x3F, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x3C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xFC, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE0, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC, 0xFE, 0xFC, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xFC, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, 0x0F, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xC7, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x1F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 48 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 49 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x3F, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFC, 0xF8, 0xF8, 0xF8, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x07, 0x81, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 50 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0xC7, 0xE7, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFE, 0xFC, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0C, 0x0E, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7E, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0E, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x07, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x07, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x0F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 51 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x80, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0x78, 0x78, 0x78, 0x38, 0x38, 0x38, 0x38, 0x18, 0x18, 0x18, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 52 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7C, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0F, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x1F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x78, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x07, 0x0F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x1F, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF8, 0xF8, 0xFC, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 53 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x1F, 0x0E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xF8, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, 0x0F, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 54 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x81, 0xE1, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x07, 0x0F, 0x1F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x01, 0x03, 0x07, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x78, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 55 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x0F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x0F, 0x1F, 0x3F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xEF, 0xC7, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x01, 0x01, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x0F, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0F, 0x1F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0xFF, 0x7F, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF0, 0x80, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF8, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x07, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x03, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 56 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF0, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC1, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x7C, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x3F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x3F, 0x3F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x03, 0x03, 0x01, 0x01, 0x01, 0x03, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE1, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x07, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // 57 - -}; - -#endif diff --git a/STM32F1/libraries/ILI9341_due_STM/glcdfont.c b/STM32F1/libraries/ILI9341_due_STM/glcdfont.c deleted file mode 100644 index d6e8af236..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/glcdfont.c +++ /dev/null @@ -1,263 +0,0 @@ -#ifndef FONT5X7_H -#define FONT5X7_H - -// Standard ASCII 5x7 font - -static const unsigned char font[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, - 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, - 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, - 0x18, 0x3C, 0x7E, 0x3C, 0x18, - 0x1C, 0x57, 0x7D, 0x57, 0x1C, - 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, - 0x00, 0x18, 0x3C, 0x18, 0x00, - 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, - 0x00, 0x18, 0x24, 0x18, 0x00, - 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, - 0x30, 0x48, 0x3A, 0x06, 0x0E, - 0x26, 0x29, 0x79, 0x29, 0x26, - 0x40, 0x7F, 0x05, 0x05, 0x07, - 0x40, 0x7F, 0x05, 0x25, 0x3F, - 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, - 0x7F, 0x3E, 0x1C, 0x1C, 0x08, - 0x08, 0x1C, 0x1C, 0x3E, 0x7F, - 0x14, 0x22, 0x7F, 0x22, 0x14, - 0x5F, 0x5F, 0x00, 0x5F, 0x5F, - 0x06, 0x09, 0x7F, 0x01, 0x7F, - 0x00, 0x66, 0x89, 0x95, 0x6A, - 0x60, 0x60, 0x60, 0x60, 0x60, - 0x94, 0xA2, 0xFF, 0xA2, 0x94, - 0x08, 0x04, 0x7E, 0x04, 0x08, - 0x10, 0x20, 0x7E, 0x20, 0x10, - 0x08, 0x08, 0x2A, 0x1C, 0x08, - 0x08, 0x1C, 0x2A, 0x08, 0x08, - 0x1E, 0x10, 0x10, 0x10, 0x10, - 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, - 0x30, 0x38, 0x3E, 0x38, 0x30, - 0x06, 0x0E, 0x3E, 0x0E, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5F, 0x00, 0x00, - 0x00, 0x07, 0x00, 0x07, 0x00, - 0x14, 0x7F, 0x14, 0x7F, 0x14, - 0x24, 0x2A, 0x7F, 0x2A, 0x12, - 0x23, 0x13, 0x08, 0x64, 0x62, - 0x36, 0x49, 0x56, 0x20, 0x50, - 0x00, 0x08, 0x07, 0x03, 0x00, - 0x00, 0x1C, 0x22, 0x41, 0x00, - 0x00, 0x41, 0x22, 0x1C, 0x00, - 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, - 0x08, 0x08, 0x3E, 0x08, 0x08, - 0x00, 0x80, 0x70, 0x30, 0x00, - 0x08, 0x08, 0x08, 0x08, 0x08, - 0x00, 0x00, 0x60, 0x60, 0x00, - 0x20, 0x10, 0x08, 0x04, 0x02, - 0x3E, 0x51, 0x49, 0x45, 0x3E, - 0x00, 0x42, 0x7F, 0x40, 0x00, - 0x72, 0x49, 0x49, 0x49, 0x46, - 0x21, 0x41, 0x49, 0x4D, 0x33, - 0x18, 0x14, 0x12, 0x7F, 0x10, - 0x27, 0x45, 0x45, 0x45, 0x39, - 0x3C, 0x4A, 0x49, 0x49, 0x31, - 0x41, 0x21, 0x11, 0x09, 0x07, - 0x36, 0x49, 0x49, 0x49, 0x36, - 0x46, 0x49, 0x49, 0x29, 0x1E, - 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x40, 0x34, 0x00, 0x00, - 0x00, 0x08, 0x14, 0x22, 0x41, - 0x14, 0x14, 0x14, 0x14, 0x14, - 0x00, 0x41, 0x22, 0x14, 0x08, - 0x02, 0x01, 0x59, 0x09, 0x06, - 0x3E, 0x41, 0x5D, 0x59, 0x4E, - 0x7C, 0x12, 0x11, 0x12, 0x7C, - 0x7F, 0x49, 0x49, 0x49, 0x36, - 0x3E, 0x41, 0x41, 0x41, 0x22, - 0x7F, 0x41, 0x41, 0x41, 0x3E, - 0x7F, 0x49, 0x49, 0x49, 0x41, - 0x7F, 0x09, 0x09, 0x09, 0x01, - 0x3E, 0x41, 0x41, 0x51, 0x73, - 0x7F, 0x08, 0x08, 0x08, 0x7F, - 0x00, 0x41, 0x7F, 0x41, 0x00, - 0x20, 0x40, 0x41, 0x3F, 0x01, - 0x7F, 0x08, 0x14, 0x22, 0x41, - 0x7F, 0x40, 0x40, 0x40, 0x40, - 0x7F, 0x02, 0x1C, 0x02, 0x7F, - 0x7F, 0x04, 0x08, 0x10, 0x7F, - 0x3E, 0x41, 0x41, 0x41, 0x3E, - 0x7F, 0x09, 0x09, 0x09, 0x06, - 0x3E, 0x41, 0x51, 0x21, 0x5E, - 0x7F, 0x09, 0x19, 0x29, 0x46, - 0x26, 0x49, 0x49, 0x49, 0x32, - 0x03, 0x01, 0x7F, 0x01, 0x03, - 0x3F, 0x40, 0x40, 0x40, 0x3F, - 0x1F, 0x20, 0x40, 0x20, 0x1F, - 0x3F, 0x40, 0x38, 0x40, 0x3F, - 0x63, 0x14, 0x08, 0x14, 0x63, - 0x03, 0x04, 0x78, 0x04, 0x03, - 0x61, 0x59, 0x49, 0x4D, 0x43, - 0x00, 0x7F, 0x41, 0x41, 0x41, - 0x02, 0x04, 0x08, 0x10, 0x20, - 0x00, 0x41, 0x41, 0x41, 0x7F, - 0x04, 0x02, 0x01, 0x02, 0x04, - 0x40, 0x40, 0x40, 0x40, 0x40, - 0x00, 0x03, 0x07, 0x08, 0x00, - 0x20, 0x54, 0x54, 0x78, 0x40, - 0x7F, 0x28, 0x44, 0x44, 0x38, - 0x38, 0x44, 0x44, 0x44, 0x28, - 0x38, 0x44, 0x44, 0x28, 0x7F, - 0x38, 0x54, 0x54, 0x54, 0x18, - 0x00, 0x08, 0x7E, 0x09, 0x02, - 0x18, 0xA4, 0xA4, 0x9C, 0x78, - 0x7F, 0x08, 0x04, 0x04, 0x78, - 0x00, 0x44, 0x7D, 0x40, 0x00, - 0x20, 0x40, 0x40, 0x3D, 0x00, - 0x7F, 0x10, 0x28, 0x44, 0x00, - 0x00, 0x41, 0x7F, 0x40, 0x00, - 0x7C, 0x04, 0x78, 0x04, 0x78, - 0x7C, 0x08, 0x04, 0x04, 0x78, - 0x38, 0x44, 0x44, 0x44, 0x38, - 0xFC, 0x18, 0x24, 0x24, 0x18, - 0x18, 0x24, 0x24, 0x18, 0xFC, - 0x7C, 0x08, 0x04, 0x04, 0x08, - 0x48, 0x54, 0x54, 0x54, 0x24, - 0x04, 0x04, 0x3F, 0x44, 0x24, - 0x3C, 0x40, 0x40, 0x20, 0x7C, - 0x1C, 0x20, 0x40, 0x20, 0x1C, - 0x3C, 0x40, 0x30, 0x40, 0x3C, - 0x44, 0x28, 0x10, 0x28, 0x44, - 0x4C, 0x90, 0x90, 0x90, 0x7C, - 0x44, 0x64, 0x54, 0x4C, 0x44, - 0x00, 0x08, 0x36, 0x41, 0x00, - 0x00, 0x00, 0x77, 0x00, 0x00, - 0x00, 0x41, 0x36, 0x08, 0x00, - 0x02, 0x01, 0x02, 0x04, 0x02, - 0x3C, 0x26, 0x23, 0x26, 0x3C, - 0x1E, 0xA1, 0xA1, 0x61, 0x12, - 0x3A, 0x40, 0x40, 0x20, 0x7A, - 0x38, 0x54, 0x54, 0x55, 0x59, - 0x21, 0x55, 0x55, 0x79, 0x41, - 0x21, 0x54, 0x54, 0x78, 0x41, - 0x21, 0x55, 0x54, 0x78, 0x40, - 0x20, 0x54, 0x55, 0x79, 0x40, - 0x0C, 0x1E, 0x52, 0x72, 0x12, - 0x39, 0x55, 0x55, 0x55, 0x59, - 0x39, 0x54, 0x54, 0x54, 0x59, - 0x39, 0x55, 0x54, 0x54, 0x58, - 0x00, 0x00, 0x45, 0x7C, 0x41, - 0x00, 0x02, 0x45, 0x7D, 0x42, - 0x00, 0x01, 0x45, 0x7C, 0x40, - 0xF0, 0x29, 0x24, 0x29, 0xF0, - 0xF0, 0x28, 0x25, 0x28, 0xF0, - 0x7C, 0x54, 0x55, 0x45, 0x00, - 0x20, 0x54, 0x54, 0x7C, 0x54, - 0x7C, 0x0A, 0x09, 0x7F, 0x49, - 0x32, 0x49, 0x49, 0x49, 0x32, - 0x32, 0x48, 0x48, 0x48, 0x32, - 0x32, 0x4A, 0x48, 0x48, 0x30, - 0x3A, 0x41, 0x41, 0x21, 0x7A, - 0x3A, 0x42, 0x40, 0x20, 0x78, - 0x00, 0x9D, 0xA0, 0xA0, 0x7D, - 0x39, 0x44, 0x44, 0x44, 0x39, - 0x3D, 0x40, 0x40, 0x40, 0x3D, - 0x3C, 0x24, 0xFF, 0x24, 0x24, - 0x48, 0x7E, 0x49, 0x43, 0x66, - 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, - 0xFF, 0x09, 0x29, 0xF6, 0x20, - 0xC0, 0x88, 0x7E, 0x09, 0x03, - 0x20, 0x54, 0x54, 0x79, 0x41, - 0x00, 0x00, 0x44, 0x7D, 0x41, - 0x30, 0x48, 0x48, 0x4A, 0x32, - 0x38, 0x40, 0x40, 0x22, 0x7A, - 0x00, 0x7A, 0x0A, 0x0A, 0x72, - 0x7D, 0x0D, 0x19, 0x31, 0x7D, - 0x26, 0x29, 0x29, 0x2F, 0x28, - 0x26, 0x29, 0x29, 0x29, 0x26, - 0x30, 0x48, 0x4D, 0x40, 0x20, - 0x38, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x38, - 0x2F, 0x10, 0xC8, 0xAC, 0xBA, - 0x2F, 0x10, 0x28, 0x34, 0xFA, - 0x00, 0x00, 0x7B, 0x00, 0x00, - 0x08, 0x14, 0x2A, 0x14, 0x22, - 0x22, 0x14, 0x2A, 0x14, 0x08, - 0xAA, 0x00, 0x55, 0x00, 0xAA, - 0xAA, 0x55, 0xAA, 0x55, 0xAA, - 0x00, 0x00, 0x00, 0xFF, 0x00, - 0x10, 0x10, 0x10, 0xFF, 0x00, - 0x14, 0x14, 0x14, 0xFF, 0x00, - 0x10, 0x10, 0xFF, 0x00, 0xFF, - 0x10, 0x10, 0xF0, 0x10, 0xF0, - 0x14, 0x14, 0x14, 0xFC, 0x00, - 0x14, 0x14, 0xF7, 0x00, 0xFF, - 0x00, 0x00, 0xFF, 0x00, 0xFF, - 0x14, 0x14, 0xF4, 0x04, 0xFC, - 0x14, 0x14, 0x17, 0x10, 0x1F, - 0x10, 0x10, 0x1F, 0x10, 0x1F, - 0x14, 0x14, 0x14, 0x1F, 0x00, - 0x10, 0x10, 0x10, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x1F, 0x10, - 0x10, 0x10, 0x10, 0x1F, 0x10, - 0x10, 0x10, 0x10, 0xF0, 0x10, - 0x00, 0x00, 0x00, 0xFF, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0xFF, 0x10, - 0x00, 0x00, 0x00, 0xFF, 0x14, - 0x00, 0x00, 0xFF, 0x00, 0xFF, - 0x00, 0x00, 0x1F, 0x10, 0x17, - 0x00, 0x00, 0xFC, 0x04, 0xF4, - 0x14, 0x14, 0x17, 0x10, 0x17, - 0x14, 0x14, 0xF4, 0x04, 0xF4, - 0x00, 0x00, 0xFF, 0x00, 0xF7, - 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x14, 0xF7, 0x00, 0xF7, - 0x14, 0x14, 0x14, 0x17, 0x14, - 0x10, 0x10, 0x1F, 0x10, 0x1F, - 0x14, 0x14, 0x14, 0xF4, 0x14, - 0x10, 0x10, 0xF0, 0x10, 0xF0, - 0x00, 0x00, 0x1F, 0x10, 0x1F, - 0x00, 0x00, 0x00, 0x1F, 0x14, - 0x00, 0x00, 0x00, 0xFC, 0x14, - 0x00, 0x00, 0xF0, 0x10, 0xF0, - 0x10, 0x10, 0xFF, 0x10, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x14, - 0x10, 0x10, 0x10, 0x1F, 0x00, - 0x00, 0x00, 0x00, 0xF0, 0x10, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, - 0xFF, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, - 0x38, 0x44, 0x44, 0x38, 0x44, - 0x7C, 0x2A, 0x2A, 0x3E, 0x14, - 0x7E, 0x02, 0x02, 0x06, 0x06, - 0x02, 0x7E, 0x02, 0x7E, 0x02, - 0x63, 0x55, 0x49, 0x41, 0x63, - 0x38, 0x44, 0x44, 0x3C, 0x04, - 0x40, 0x7E, 0x20, 0x1E, 0x20, - 0x06, 0x02, 0x7E, 0x02, 0x02, - 0x99, 0xA5, 0xE7, 0xA5, 0x99, - 0x1C, 0x2A, 0x49, 0x2A, 0x1C, - 0x4C, 0x72, 0x01, 0x72, 0x4C, - 0x30, 0x4A, 0x4D, 0x4D, 0x30, - 0x30, 0x48, 0x78, 0x48, 0x30, - 0xBC, 0x62, 0x5A, 0x46, 0x3D, - 0x3E, 0x49, 0x49, 0x49, 0x00, - 0x7E, 0x01, 0x01, 0x01, 0x7E, - 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, - 0x44, 0x44, 0x5F, 0x44, 0x44, - 0x40, 0x51, 0x4A, 0x44, 0x40, - 0x40, 0x44, 0x4A, 0x51, 0x40, - 0x00, 0x00, 0xFF, 0x01, 0x03, - 0xE0, 0x80, 0xFF, 0x00, 0x00, - 0x08, 0x08, 0x6B, 0x6B, 0x08, - 0x36, 0x12, 0x36, 0x24, 0x36, - 0x06, 0x0F, 0x09, 0x0F, 0x06, - 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x00, 0x10, 0x10, 0x00, - 0x30, 0x40, 0xFF, 0x01, 0x01, - 0x00, 0x1F, 0x01, 0x01, 0x1E, - 0x00, 0x19, 0x1D, 0x17, 0x12, - 0x00, 0x3C, 0x3C, 0x3C, 0x3C, - 0x00, 0x00, 0x00, 0x00, 0x00 -}; -#endif // FONT5X7_H diff --git a/STM32F1/libraries/ILI9341_due_STM/keywords.txt b/STM32F1/libraries/ILI9341_due_STM/keywords.txt deleted file mode 100644 index 8278c0bfe..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/keywords.txt +++ /dev/null @@ -1,38 +0,0 @@ -ILI9341_due KEYWORD1 -ILI9341_due_gText KEYWORD1 -ILI9341_BLACK LITERAL1 -ILI9341_BLUE LITERAL1 -ILI9341_RED LITERAL1 -ILI9341_GREEN LITERAL1 -ILI9341_CYAN LITERAL1 -ILI9341_MAGENTA LITERAL1 -ILI9341_YELLOW LITERAL1 -ILI9341_WHITE LITERAL1 -pushColor KEYWORD2 -fillScreen KEYWORD2 -drawPixel KEYWORD2 -drawFastVLine KEYWORD2 -drawFastHLine KEYWORD2 -drawRect KEYWORD2 -fillRect KEYWORD2 -setRotation KEYWORD2 -invertDisplay KEYWORD2 -setAddrWindow KEYWORD2 -color565 KEYWORD2 -readcommand8 KEYWORD2 -readPixel KEYWORD2 -drawCircle KEYWORD2 -fillCircle KEYWORD2 -drawTriangle KEYWORD2 -fillTriangle KEYWORD2 -drawRoundRect KEYWORD2 -fillRoundRect KEYWORD2 -drawBitmap KEYWORD2 -drawChar KEYWORD2 -setCursor KEYWORD2 -setTextColor KEYWORD2 -setTextSize KEYWORD2 -setTextWrap KEYWORD2 -drawLine KEYWORD2 -DefineArea KEYWORD2 -SelectFont KEYWORD2 diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/BMP24toILI565.exe b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/BMP24toILI565.exe deleted file mode 100644 index c8f2e5bed1e15b898ceaeb27a0c06c12b3b1e48d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 - - - - - \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.csproj b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.csproj deleted file mode 100644 index 2d9c787ee..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.csproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Debug - AnyCPU - {D2F086B2-74B5-4256-BCEE-719106D306F9} - Exe - Properties - BMP24toILI565 - BMP24toILI565 - v4.5 - 512 - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.csproj.user b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.csproj.user deleted file mode 100644 index 509f79301..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.csproj.user +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.sln b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.sln deleted file mode 100644 index 803a209b7..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/BMP24toILI565.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BMP24toILI565", "BMP24toILI565.csproj", "{D2F086B2-74B5-4256-BCEE-719106D306F9}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D2F086B2-74B5-4256-BCEE-719106D306F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2F086B2-74B5-4256-BCEE-719106D306F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2F086B2-74B5-4256-BCEE-719106D306F9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2F086B2-74B5-4256-BCEE-719106D306F9}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/Program.cs b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/Program.cs deleted file mode 100644 index 995c29083..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/Program.cs +++ /dev/null @@ -1,210 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; - -namespace BMP24toILI565 -{ - internal class Program - { - static private FileStream rgb24file; - static private FileStream rgb16file; - static private int bmpWidth, bmpHeight; // W+H in pixels - static private int bmpDepth; // Bit depth (currently must be 24) - static private UInt32 bmpImageoffset; // Start of image data in file - static private int rowSize; // Not always = bmpWidth; may have padding - static private bool goodBmp = false; // Set to true on valid header parse - static private bool flip = true; // BMP is stored bottom-to-top - static private UInt16 w, h, row, col; - static private byte r, g, b; - static private long pos = 0, startTime; - static private bool first = true; - - - private static void Main(string[] args) - { - string codeBase = Assembly.GetExecutingAssembly().CodeBase; - string exeFilename = Path.GetFileName(codeBase); - - if (args.Length == 0) - { - var bmpFiles = Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "*.bmp").ToList(); - if (bmpFiles.Count == 0) - Console.WriteLine("\nNo .bmp files found."); - else - bmpFiles.ForEach(i => ConvertImage(i)); - } - else - { - ConvertImage(args[0]); - } - } - - static void ConvertImage(string imageFilename) - { - if (File.Exists(imageFilename)) - { - try - { - Console.WriteLine("\nConverting {0}...", imageFilename); - rgb24file = new FileStream(imageFilename, FileMode.Open); - if (rgb24file == null) - { - Console.WriteLine("Could not open {0}", imageFilename); - return; - } - - rgb24file.Seek(0, SeekOrigin.Begin); - - if (read16(rgb24file) != 0x4D42) - { - Console.WriteLine("Not a BMP file"); - return; - } - - // BMP signature - Console.WriteLine("File size: {0}", read32(rgb24file)); - read32(rgb24file); // Read & ignore creator bytes - bmpImageoffset = read32(rgb24file); // Start of image data - Console.WriteLine("Image Offset: {0}", bmpImageoffset); - // Read DIB header - Console.WriteLine("Header size: {0}", read32(rgb24file)); - bmpWidth = (UInt16)read32(rgb24file); - bmpHeight = (UInt16)read32(rgb24file); - if (read16(rgb24file) != 1) // # planes -- must be '1' - { - Console.WriteLine("Number of planes must be 1"); - return; - } - - bmpDepth = read16(rgb24file); // bits per pixel - Console.WriteLine("Bit Depth: {0}", bmpDepth); - if (bmpDepth != 24) - { - Console.WriteLine("Image is not in 24bit"); - return; - } - - if (read32(rgb24file) != 0) // 0 = uncompressed - { - Console.WriteLine("BMP must be in uncompressed format"); - return; - } - - goodBmp = true; // Supported BMP format -- proceed! - Console.WriteLine("Image size: {0}x{1}", bmpWidth, bmpHeight); - - string outFilename = Path.ChangeExtension(imageFilename, "565"); - - Console.WriteLine("{0} created", outFilename); - - rgb16file = new FileStream(outFilename, FileMode.Create); - - if (rgb16file == null) - { - Console.WriteLine("Could not create file {0}", outFilename); - return; - } - - var header = new byte[54]; - - rgb24file.Seek(0, SeekOrigin.Begin); - rgb24file.Read(header, 0, 54); - - header[0x1C] = 16; // updage bit depth to 16 bpp - - rgb16file.Write(header, 0, 54); - - // BMP rows are padded (if needed) to 4-byte boundary - rowSize = (bmpWidth * 3 + 3) & ~3; - - // If bmpHeight is negative, image is in top-down order. - // This is not canon but has been observed in the wild. - if (bmpHeight < 0) - { - bmpHeight = -bmpHeight; - flip = false; - } - - var inRGB = new byte[3]; - var outRGB = new byte[2]; - - for (row = 0; row < bmpHeight; row++) - { - // For each scanline... - - if (flip) // Bitmap is stored bottom-to-top order (normal BMP) - pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize; - else // Bitmap is stored top-to-bottom - pos = bmpImageoffset + row * rowSize; - - rgb24file.Seek(pos, SeekOrigin.Begin); - - for (var c = 0; c < 3 * bmpWidth; c += 3) - { - rgb24file.Read(inRGB, 0, 3); - - UInt16 iliColor = to565(inRGB[2], inRGB[1], inRGB[0]); - outRGB[0] = (byte)(iliColor >> 8); - outRGB[1] = (byte)(iliColor & 0xFF); - rgb16file.Write(outRGB, 0, 2); - } - } - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - Console.WriteLine(ex.StackTrace); - } - finally - { - if (rgb24file != null) - { - rgb24file.Close(); - rgb24file = null; - } - if (rgb16file != null) - { - rgb16file.Close(); - rgb16file = null; - } - } - } - else - { - Console.WriteLine("File {0} does not exists"); - } - } - - static private UInt16 to565(byte r, byte g, byte b) - { - return (UInt16)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)); - //return ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3); - } - - static UInt16 read16(FileStream file) - { - var bytes = new byte[2]; - - file.Read(bytes, 0, 2); - var word = (UInt16)(bytes[1] << 8 | bytes[0]); - - return word; - } - - static UInt32 read32(FileStream file) - { - var bytes = new byte[4]; - - file.Read(bytes, 0, 4); - var dword = (UInt32)(bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0]); - - return dword; - } - } - - -} diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/Properties/AssemblyInfo.cs b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/Properties/AssemblyInfo.cs deleted file mode 100644 index c7a75dc83..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/.NET/src/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BMP24toILI565")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("BMP24toILI565")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("79edc0d8-9635-4e86-9a00-3e845d89d64b")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/BMP24toILI565.exe b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/BMP24toILI565.exe deleted file mode 100644 index a1c2ee1d14ea860fafd61a248247bea3b41da873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43008 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 E2eoN*5&!@I diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.cpp b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.cpp deleted file mode 100644 index db3398cad..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.cpp +++ /dev/null @@ -1,210 +0,0 @@ -// BMP24toILI565.cpp : Defines the entry point for the console application. -// - -#include "stdafx.h" -#include -#include -#include -#include "dirent.h" - -FILE *rgb24file; -FILE *rgb16file; -int bmpWidth, bmpHeight; // W+H in pixels -UINT16 bmpDepth; // Bit depth (currently must be 24) -UINT32 bmpImageoffset; // Start of image data in file -UINT32 rowSize; // Not always = bmpWidth; may have padding -boolean goodBmp = false; // Set to true on valid header parse -boolean flip = true; // BMP is stored bottom-to-top -UINT16 w, h, row, col; -UINT8 r, g, b; -UINT32 pos = 0, startTime; -bool first = true; -DIR* dir; -struct dirent *ent; - - -//inline UINT16 read16(FILE *file) -//{ -// UINT16 word; -// fread(&word, 2, 1, file); -// return word; -//} - -//inline UINT16 read32(FILE *file) -//{ -// UINT32 dword; -// fread(&dword, 4, 1, file); -// return dword; -//} - -UINT16 read16(FILE *file) { - UINT16 word; - fread(&(((UINT8 *)&word)[0]), 1, 1, file); - fread(&(((UINT8 *)&word)[1]), 1, 1, file); - //((UINT8 *)&word)[0] = f.read(); // LSB - //((UINT8 *)&word)[1] = f.read(); // MSB - return word; -} -// -UINT32 read32(FILE *file) { - UINT32 dword; - fread(&(((UINT8 *)&dword)[0]), 1, 1, file); - fread(&(((UINT8 *)&dword)[1]), 1, 1, file); - fread(&(((UINT8 *)&dword)[2]), 1, 1, file); - fread(&(((UINT8 *)&dword)[3]), 1, 1, file); - return dword; -} - -inline UINT16 to565(UINT8 r, UINT8 g, UINT8 b) -{ - return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); - //return ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3); -} - -int convertImage(char* filename) -{ - try - { - printf("\n"); - printf("Converting %s...\n", filename); - rgb24file = fopen(filename, "rb"); - if (rgb24file == NULL) - { - printf("Could not find file %s \n", filename); - return -1; - } - - fseek(rgb24file, 0, SEEK_SET); - - if(read16(rgb24file) != 0x4D42) // BMP signature - { - printf("Not a BMP file.\n"); - return -1; - } - - printf("File size: %u\n", read32(rgb24file)); - (void)read32(rgb24file); // Read & ignore creator bytes - bmpImageoffset = read32(rgb24file); // Start of image data - printf("Image Offset: %d\n", bmpImageoffset); - // Read DIB header - printf("Header size: %d\n", read32(rgb24file)); - bmpWidth = read32(rgb24file); - bmpHeight = read32(rgb24file); - - if(read16(rgb24file) != 1) // # planes -- must be '1' - { - printf("Number of planes must be 1\n"); - return -1; - } - - bmpDepth = read16(rgb24file); // bits per pixel - printf("Bit Depth: %d\n", bmpDepth); - - if(bmpDepth != 24) - { - printf("Image is not in 24bit\n"); - return -1; - } - - if(read32(rgb24file) != 0) // 0 = uncompressed - { - printf("BMP must be in uncompressed format\n"); - return -1; - } - - goodBmp = true; // Supported BMP format -- proceed! - printf("Image size: %dx%d\n", bmpWidth, bmpHeight); - - char outFilename[255]; - sprintf(outFilename, "%s", filename); - sprintf(outFilename+strlen(filename)-3, "565"); - - printf("%s created\n", outFilename); - rgb16file = fopen(outFilename, "wb"); - - if(rgb16file == NULL) - { - printf("Could not create file %s\n", outFilename); - return -1; - } - - UINT8 header[54]; - fseek(rgb24file, 0, SEEK_SET); - fread(header, 1, 54, rgb24file); - - header[0x1C] = 16; // updage bit depth to 16 bpp - - fwrite(header, 1, 54, rgb16file); - - // BMP rows are padded (if needed) to 4-byte boundary - rowSize = (bmpWidth * 3 + 3) & ~3; - - // If bmpHeight is negative, image is in top-down order. - // This is not canon but has been observed in the wild. - if(bmpHeight < 0) { - bmpHeight = -bmpHeight; - flip = false; - } - - UINT8 inRGB[3], outRGB[2]; - - for (row=0; row> 8; - outRGB[1] = iliColor & 0xFF; - fwrite(outRGB, 1, 2, rgb16file); - } - } - } - catch(...) - { - printf("Error converting file\n"); - } - - _fcloseall(); -} - -int main(int argc, char *argv[]) -{ - if (argc == 1) - { - if ((dir = opendir (".")) != NULL) { - /* print all the files and directories within directory */ - int bmpFilesFound = 0; - while ((ent = readdir(dir)) != NULL) { - if(strncmp(ent->d_name + ent->d_namlen - 4, ".bmp", 4) == 0) - { - convertImage(ent->d_name); - bmpFilesFound++; - } - } - closedir (dir); - if(bmpFilesFound == 0) - { - printf("\n"); - printf("No .bmp files found.\n"); - } - } else { - /* could not open directory */ - perror (""); - return EXIT_FAILURE; - } - } - else - { - convertImage(argv[1]); - } - - -} diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.sln b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.sln deleted file mode 100644 index a3eee5bb1..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BMP24toILI565", "BMP24toILI565.vcxproj", "{EFE947CC-711C-44E0-9FA5-605D37DD3E8C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EFE947CC-711C-44E0-9FA5-605D37DD3E8C}.Debug|Win32.ActiveCfg = Debug|Win32 - {EFE947CC-711C-44E0-9FA5-605D37DD3E8C}.Debug|Win32.Build.0 = Debug|Win32 - {EFE947CC-711C-44E0-9FA5-605D37DD3E8C}.Release|Win32.ActiveCfg = Release|Win32 - {EFE947CC-711C-44E0-9FA5-605D37DD3E8C}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.vcxproj b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.vcxproj deleted file mode 100644 index 4157e33fb..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.vcxproj +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {EFE947CC-711C-44E0-9FA5-605D37DD3E8C} - Win32Proj - BMP24toILI565 - - - - Application - true - v110 - Unicode - - - Application - false - v110 - true - Unicode - - - - - - - - - - - - - true - - - false - - - - Use - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - Use - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - - - - - - - - - Create - Create - - - - - - \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.vcxproj.filters b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.vcxproj.filters deleted file mode 100644 index 515d07315..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/BMP24toILI565.vcxproj.filters +++ /dev/null @@ -1,36 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/ReadMe.txt b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/ReadMe.txt deleted file mode 100644 index b72047adb..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/ReadMe.txt +++ /dev/null @@ -1,40 +0,0 @@ -======================================================================== - CONSOLE APPLICATION : BMP24toILI565 Project Overview -======================================================================== - -AppWizard has created this BMP24toILI565 application for you. - -This file contains a summary of what you will find in each of the files that -make up your BMP24toILI565 application. - - -BMP24toILI565.vcxproj - This is the main project file for VC++ projects generated using an Application Wizard. - It contains information about the version of Visual C++ that generated the file, and - information about the platforms, configurations, and project features selected with the - Application Wizard. - -BMP24toILI565.vcxproj.filters - This is the filters file for VC++ projects generated using an Application Wizard. - It contains information about the association between the files in your project - and the filters. This association is used in the IDE to show grouping of files with - similar extensions under a specific node (for e.g. ".cpp" files are associated with the - "Source Files" filter). - -BMP24toILI565.cpp - This is the main application source file. - -///////////////////////////////////////////////////////////////////////////// -Other standard files: - -StdAfx.h, StdAfx.cpp - These files are used to build a precompiled header (PCH) file - named BMP24toILI565.pch and a precompiled types file named StdAfx.obj. - -///////////////////////////////////////////////////////////////////////////// -Other notes: - -AppWizard uses "TODO:" comments to indicate parts of the source code you -should add to or customize. - -///////////////////////////////////////////////////////////////////////////// diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/dirent.h b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/dirent.h deleted file mode 100644 index 6f959a501..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/dirent.h +++ /dev/null @@ -1,838 +0,0 @@ -/* - * dirent.h - dirent API for Microsoft Visual Studio - * - * Copyright (C) 2006-2012 Toni Ronkko - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * ``Software''), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL TONI RONKKO BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * $Id: dirent.h,v 1.20 2014/03/19 17:52:23 tronkko Exp $ - */ -#ifndef DIRENT_H -#define DIRENT_H - -/* - * Define architecture flags so we don't need to include windows.h. - * Avoiding windows.h makes it simpler to use windows sockets in conjunction - * with dirent.h. - */ -#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_IX86) -# define _X86_ -#endif -#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_AMD64) -#define _AMD64_ -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Indicates that d_type field is available in dirent structure */ -#define _DIRENT_HAVE_D_TYPE - -/* Indicates that d_namlen field is available in dirent structure */ -#define _DIRENT_HAVE_D_NAMLEN - -/* Entries missing from MSVC 6.0 */ -#if !defined(FILE_ATTRIBUTE_DEVICE) -# define FILE_ATTRIBUTE_DEVICE 0x40 -#endif - -/* File type and permission flags for stat() */ -#if !defined(S_IFMT) -# define S_IFMT _S_IFMT /* File type mask */ -#endif -#if !defined(S_IFDIR) -# define S_IFDIR _S_IFDIR /* Directory */ -#endif -#if !defined(S_IFCHR) -# define S_IFCHR _S_IFCHR /* Character device */ -#endif -#if !defined(S_IFFIFO) -# define S_IFFIFO _S_IFFIFO /* Pipe */ -#endif -#if !defined(S_IFREG) -# define S_IFREG _S_IFREG /* Regular file */ -#endif -#if !defined(S_IREAD) -# define S_IREAD _S_IREAD /* Read permission */ -#endif -#if !defined(S_IWRITE) -# define S_IWRITE _S_IWRITE /* Write permission */ -#endif -#if !defined(S_IEXEC) -# define S_IEXEC _S_IEXEC /* Execute permission */ -#endif -#if !defined(S_IFIFO) -# define S_IFIFO _S_IFIFO /* Pipe */ -#endif -#if !defined(S_IFBLK) -# define S_IFBLK 0 /* Block device */ -#endif -#if !defined(S_IFLNK) -# define S_IFLNK 0 /* Link */ -#endif -#if !defined(S_IFSOCK) -# define S_IFSOCK 0 /* Socket */ -#endif - -#if defined(_MSC_VER) -# define S_IRUSR S_IREAD /* Read user */ -# define S_IWUSR S_IWRITE /* Write user */ -# define S_IXUSR 0 /* Execute user */ -# define S_IRGRP 0 /* Read group */ -# define S_IWGRP 0 /* Write group */ -# define S_IXGRP 0 /* Execute group */ -# define S_IROTH 0 /* Read others */ -# define S_IWOTH 0 /* Write others */ -# define S_IXOTH 0 /* Execute others */ -#endif - -/* Maximum length of file name */ -#if !defined(PATH_MAX) -# define PATH_MAX MAX_PATH -#endif -#if !defined(FILENAME_MAX) -# define FILENAME_MAX MAX_PATH -#endif -#if !defined(NAME_MAX) -# define NAME_MAX FILENAME_MAX -#endif - -/* File type flags for d_type */ -#define DT_UNKNOWN 0 -#define DT_REG S_IFREG -#define DT_DIR S_IFDIR -#define DT_FIFO S_IFIFO -#define DT_SOCK S_IFSOCK -#define DT_CHR S_IFCHR -#define DT_BLK S_IFBLK -#define DT_LNK S_IFLNK - -/* Macros for converting between st_mode and d_type */ -#define IFTODT(mode) ((mode) & S_IFMT) -#define DTTOIF(type) (type) - -/* - * File type macros. Note that block devices, sockets and links cannot be - * distinguished on Windows and the macros S_ISBLK, S_ISSOCK and S_ISLNK are - * only defined for compatibility. These macros should always return false - * on Windows. - */ -#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) -#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) -#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) -#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) -#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) -#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) -#define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) - -/* Return the exact length of d_namlen without zero terminator */ -#define _D_EXACT_NAMLEN(p) ((p)->d_namlen) - -/* Return number of bytes needed to store d_namlen */ -#define _D_ALLOC_NAMLEN(p) (PATH_MAX) - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* Wide-character version */ -struct _wdirent { - long d_ino; /* Always zero */ - unsigned short d_reclen; /* Structure size */ - size_t d_namlen; /* Length of name without \0 */ - int d_type; /* File type */ - wchar_t d_name[PATH_MAX]; /* File name */ -}; -typedef struct _wdirent _wdirent; - -struct _WDIR { - struct _wdirent ent; /* Current directory entry */ - WIN32_FIND_DATAW data; /* Private file data */ - int cached; /* True if data is valid */ - HANDLE handle; /* Win32 search handle */ - wchar_t *patt; /* Initial directory name */ -}; -typedef struct _WDIR _WDIR; - -static _WDIR *_wopendir (const wchar_t *dirname); -static struct _wdirent *_wreaddir (_WDIR *dirp); -static int _wclosedir (_WDIR *dirp); -static void _wrewinddir (_WDIR* dirp); - - -/* For compatibility with Symbian */ -#define wdirent _wdirent -#define WDIR _WDIR -#define wopendir _wopendir -#define wreaddir _wreaddir -#define wclosedir _wclosedir -#define wrewinddir _wrewinddir - - -/* Multi-byte character versions */ -struct dirent { - long d_ino; /* Always zero */ - unsigned short d_reclen; /* Structure size */ - size_t d_namlen; /* Length of name without \0 */ - int d_type; /* File type */ - char d_name[PATH_MAX]; /* File name */ -}; -typedef struct dirent dirent; - -struct DIR { - struct dirent ent; - struct _WDIR *wdirp; -}; -typedef struct DIR DIR; - -static DIR *opendir (const char *dirname); -static struct dirent *readdir (DIR *dirp); -static int closedir (DIR *dirp); -static void rewinddir (DIR* dirp); - - -/* Internal utility functions */ -static WIN32_FIND_DATAW *dirent_first (_WDIR *dirp); -static WIN32_FIND_DATAW *dirent_next (_WDIR *dirp); - -static int dirent_mbstowcs_s( - size_t *pReturnValue, - wchar_t *wcstr, - size_t sizeInWords, - const char *mbstr, - size_t count); - -static int dirent_wcstombs_s( - size_t *pReturnValue, - char *mbstr, - size_t sizeInBytes, - const wchar_t *wcstr, - size_t count); - -static void dirent_set_errno (int error); - -/* - * Open directory stream DIRNAME for read and return a pointer to the - * internal working area that is used to retrieve individual directory - * entries. - */ -static _WDIR* -_wopendir( - const wchar_t *dirname) -{ - _WDIR *dirp = NULL; - int error; - - /* Must have directory name */ - if (dirname == NULL || dirname[0] == '\0') { - dirent_set_errno (ENOENT); - return NULL; - } - - /* Allocate new _WDIR structure */ - dirp = (_WDIR*) malloc (sizeof (struct _WDIR)); - if (dirp != NULL) { - DWORD n; - - /* Reset _WDIR structure */ - dirp->handle = INVALID_HANDLE_VALUE; - dirp->patt = NULL; - dirp->cached = 0; - - /* Compute the length of full path plus zero terminator */ - n = GetFullPathNameW (dirname, 0, NULL, NULL); - - /* Allocate room for absolute directory name and search pattern */ - dirp->patt = (wchar_t*) malloc (sizeof (wchar_t) * n + 16); - if (dirp->patt) { - - /* - * Convert relative directory name to an absolute one. This - * allows rewinddir() to function correctly even when current - * working directory is changed between opendir() and rewinddir(). - */ - n = GetFullPathNameW (dirname, n, dirp->patt, NULL); - if (n > 0) { - wchar_t *p; - - /* Append search pattern \* to the directory name */ - p = dirp->patt + n; - if (dirp->patt < p) { - switch (p[-1]) { - case '\\': - case '/': - case ':': - /* Directory ends in path separator, e.g. c:\temp\ */ - /*NOP*/; - break; - - default: - /* Directory name doesn't end in path separator */ - *p++ = '\\'; - } - } - *p++ = '*'; - *p = '\0'; - - /* Open directory stream and retrieve the first entry */ - if (dirent_first (dirp)) { - /* Directory stream opened successfully */ - error = 0; - } else { - /* Cannot retrieve first entry */ - error = 1; - dirent_set_errno (ENOENT); - } - - } else { - /* Cannot retrieve full path name */ - dirent_set_errno (ENOENT); - error = 1; - } - - } else { - /* Cannot allocate memory for search pattern */ - error = 1; - } - - } else { - /* Cannot allocate _WDIR structure */ - error = 1; - } - - /* Clean up in case of error */ - if (error && dirp) { - _wclosedir (dirp); - dirp = NULL; - } - - return dirp; -} - -/* - * Read next directory entry. The directory entry is returned in dirent - * structure in the d_name field. Individual directory entries returned by - * this function include regular files, sub-directories, pseudo-directories - * "." and ".." as well as volume labels, hidden files and system files. - */ -static struct _wdirent* -_wreaddir( - _WDIR *dirp) -{ - WIN32_FIND_DATAW *datap; - struct _wdirent *entp; - - /* Read next directory entry */ - datap = dirent_next (dirp); - if (datap) { - size_t n; - DWORD attr; - - /* Pointer to directory entry to return */ - entp = &dirp->ent; - - /* - * Copy file name as wide-character string. If the file name is too - * long to fit in to the destination buffer, then truncate file name - * to PATH_MAX characters and zero-terminate the buffer. - */ - n = 0; - while (n + 1 < PATH_MAX && datap->cFileName[n] != 0) { - entp->d_name[n] = datap->cFileName[n]; - n++; - } - dirp->ent.d_name[n] = 0; - - /* Length of file name excluding zero terminator */ - entp->d_namlen = n; - - /* File type */ - attr = datap->dwFileAttributes; - if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { - entp->d_type = DT_CHR; - } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { - entp->d_type = DT_DIR; - } else { - entp->d_type = DT_REG; - } - - /* Reset dummy fields */ - entp->d_ino = 0; - entp->d_reclen = sizeof (struct _wdirent); - - } else { - - /* Last directory entry read */ - entp = NULL; - - } - - return entp; -} - -/* - * Close directory stream opened by opendir() function. This invalidates the - * DIR structure as well as any directory entry read previously by - * _wreaddir(). - */ -static int -_wclosedir( - _WDIR *dirp) -{ - int ok; - if (dirp) { - - /* Release search handle */ - if (dirp->handle != INVALID_HANDLE_VALUE) { - FindClose (dirp->handle); - dirp->handle = INVALID_HANDLE_VALUE; - } - - /* Release search pattern */ - if (dirp->patt) { - free (dirp->patt); - dirp->patt = NULL; - } - - /* Release directory structure */ - free (dirp); - ok = /*success*/0; - - } else { - /* Invalid directory stream */ - dirent_set_errno (EBADF); - ok = /*failure*/-1; - } - return ok; -} - -/* - * Rewind directory stream such that _wreaddir() returns the very first - * file name again. - */ -static void -_wrewinddir( - _WDIR* dirp) -{ - if (dirp) { - /* Release existing search handle */ - if (dirp->handle != INVALID_HANDLE_VALUE) { - FindClose (dirp->handle); - } - - /* Open new search handle */ - dirent_first (dirp); - } -} - -/* Get first directory entry (internal) */ -static WIN32_FIND_DATAW* -dirent_first( - _WDIR *dirp) -{ - WIN32_FIND_DATAW *datap; - - /* Open directory and retrieve the first entry */ - dirp->handle = FindFirstFileW (dirp->patt, &dirp->data); - if (dirp->handle != INVALID_HANDLE_VALUE) { - - /* a directory entry is now waiting in memory */ - datap = &dirp->data; - dirp->cached = 1; - - } else { - - /* Failed to re-open directory: no directory entry in memory */ - dirp->cached = 0; - datap = NULL; - - } - return datap; -} - -/* Get next directory entry (internal) */ -static WIN32_FIND_DATAW* -dirent_next( - _WDIR *dirp) -{ - WIN32_FIND_DATAW *p; - - /* Get next directory entry */ - if (dirp->cached != 0) { - - /* A valid directory entry already in memory */ - p = &dirp->data; - dirp->cached = 0; - - } else if (dirp->handle != INVALID_HANDLE_VALUE) { - - /* Get the next directory entry from stream */ - if (FindNextFileW (dirp->handle, &dirp->data) != FALSE) { - /* Got a file */ - p = &dirp->data; - } else { - /* The very last entry has been processed or an error occured */ - FindClose (dirp->handle); - dirp->handle = INVALID_HANDLE_VALUE; - p = NULL; - } - - } else { - - /* End of directory stream reached */ - p = NULL; - - } - - return p; -} - -/* - * Open directory stream using plain old C-string. - */ -static DIR* -opendir( - const char *dirname) -{ - struct DIR *dirp; - int error; - - /* Must have directory name */ - if (dirname == NULL || dirname[0] == '\0') { - dirent_set_errno (ENOENT); - return NULL; - } - - /* Allocate memory for DIR structure */ - dirp = (DIR*) malloc (sizeof (struct DIR)); - if (dirp) { - wchar_t wname[PATH_MAX]; - size_t n; - - /* Convert directory name to wide-character string */ - error = dirent_mbstowcs_s (&n, wname, PATH_MAX, dirname, PATH_MAX); - if (!error) { - - /* Open directory stream using wide-character name */ - dirp->wdirp = _wopendir (wname); - if (dirp->wdirp) { - /* Directory stream opened */ - error = 0; - } else { - /* Failed to open directory stream */ - error = 1; - } - - } else { - /* - * Cannot convert file name to wide-character string. This - * occurs if the string contains invalid multi-byte sequences or - * the output buffer is too small to contain the resulting - * string. - */ - error = 1; - } - - } else { - /* Cannot allocate DIR structure */ - error = 1; - } - - /* Clean up in case of error */ - if (error && dirp) { - free (dirp); - dirp = NULL; - } - - return dirp; -} - -/* - * Read next directory entry. - * - * When working with text consoles, please note that file names returned by - * readdir() are represented in the default ANSI code page while any output to - * console is typically formatted on another code page. Thus, non-ASCII - * characters in file names will not usually display correctly on console. The - * problem can be fixed in two ways: (1) change the character set of console - * to 1252 using chcp utility and use Lucida Console font, or (2) use - * _cprintf function when writing to console. The _cprinf() will re-encode - * ANSI strings to the console code page so many non-ASCII characters will - * display correcly. - */ -static struct dirent* -readdir( - DIR *dirp) -{ - WIN32_FIND_DATAW *datap; - struct dirent *entp; - - /* Read next directory entry */ - datap = dirent_next (dirp->wdirp); - if (datap) { - size_t n; - int error; - - /* Attempt to convert file name to multi-byte string */ - error = dirent_wcstombs_s( - &n, dirp->ent.d_name, PATH_MAX, datap->cFileName, PATH_MAX); - - /* - * If the file name cannot be represented by a multi-byte string, - * then attempt to use old 8+3 file name. This allows traditional - * Unix-code to access some file names despite of unicode - * characters, although file names may seem unfamiliar to the user. - * - * Be ware that the code below cannot come up with a short file - * name unless the file system provides one. At least - * VirtualBox shared folders fail to do this. - */ - if (error && datap->cAlternateFileName[0] != '\0') { - error = dirent_wcstombs_s( - &n, dirp->ent.d_name, PATH_MAX, - datap->cAlternateFileName, PATH_MAX); - } - - if (!error) { - DWORD attr; - - /* Initialize directory entry for return */ - entp = &dirp->ent; - - /* Length of file name excluding zero terminator */ - entp->d_namlen = n - 1; - - /* File attributes */ - attr = datap->dwFileAttributes; - if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { - entp->d_type = DT_CHR; - } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { - entp->d_type = DT_DIR; - } else { - entp->d_type = DT_REG; - } - - /* Reset dummy fields */ - entp->d_ino = 0; - entp->d_reclen = sizeof (struct dirent); - - } else { - /* - * Cannot convert file name to multi-byte string so construct - * an errornous directory entry and return that. Note that - * we cannot return NULL as that would stop the processing - * of directory entries completely. - */ - entp = &dirp->ent; - entp->d_name[0] = '?'; - entp->d_name[1] = '\0'; - entp->d_namlen = 1; - entp->d_type = DT_UNKNOWN; - entp->d_ino = 0; - entp->d_reclen = 0; - } - - } else { - /* No more directory entries */ - entp = NULL; - } - - return entp; -} - -/* - * Close directory stream. - */ -static int -closedir( - DIR *dirp) -{ - int ok; - if (dirp) { - - /* Close wide-character directory stream */ - ok = _wclosedir (dirp->wdirp); - dirp->wdirp = NULL; - - /* Release multi-byte character version */ - free (dirp); - - } else { - - /* Invalid directory stream */ - dirent_set_errno (EBADF); - ok = /*failure*/-1; - - } - return ok; -} - -/* - * Rewind directory stream to beginning. - */ -static void -rewinddir( - DIR* dirp) -{ - /* Rewind wide-character string directory stream */ - _wrewinddir (dirp->wdirp); -} - -/* Convert multi-byte string to wide character string */ -static int -dirent_mbstowcs_s( - size_t *pReturnValue, - wchar_t *wcstr, - size_t sizeInWords, - const char *mbstr, - size_t count) -{ - int error; - -#if defined(_MSC_VER) && _MSC_VER >= 1400 - - /* Microsoft Visual Studio 2005 or later */ - error = mbstowcs_s (pReturnValue, wcstr, sizeInWords, mbstr, count); - -#else - - /* Older Visual Studio or non-Microsoft compiler */ - size_t n; - - /* Convert to wide-character string (or count characters) */ - n = mbstowcs (wcstr, mbstr, sizeInWords); - if (!wcstr || n < count) { - - /* Zero-terminate output buffer */ - if (wcstr && sizeInWords) { - if (n >= sizeInWords) { - n = sizeInWords - 1; - } - wcstr[n] = 0; - } - - /* Length of resuting multi-byte string WITH zero terminator */ - if (pReturnValue) { - *pReturnValue = n + 1; - } - - /* Success */ - error = 0; - - } else { - - /* Could not convert string */ - error = 1; - - } - -#endif - - return error; -} - -/* Convert wide-character string to multi-byte string */ -static int -dirent_wcstombs_s( - size_t *pReturnValue, - char *mbstr, - size_t sizeInBytes, /* max size of mbstr */ - const wchar_t *wcstr, - size_t count) -{ - int error; - -#if defined(_MSC_VER) && _MSC_VER >= 1400 - - /* Microsoft Visual Studio 2005 or later */ - error = wcstombs_s (pReturnValue, mbstr, sizeInBytes, wcstr, count); - -#else - - /* Older Visual Studio or non-Microsoft compiler */ - size_t n; - - /* Convert to multi-byte string (or count the number of bytes needed) */ - n = wcstombs (mbstr, wcstr, sizeInBytes); - if (!mbstr || n < count) { - - /* Zero-terminate output buffer */ - if (mbstr && sizeInBytes) { - if (n >= sizeInBytes) { - n = sizeInBytes - 1; - } - mbstr[n] = '\0'; - } - - /* Lenght of resulting multi-bytes string WITH zero-terminator */ - if (pReturnValue) { - *pReturnValue = n + 1; - } - - /* Success */ - error = 0; - - } else { - - /* Cannot convert string */ - error = 1; - - } - -#endif - - return error; -} - -/* Set errno variable */ -static void -dirent_set_errno( - int error) -{ -#if defined(_MSC_VER) && _MSC_VER >= 1400 - - /* Microsoft Visual Studio 2005 and later */ - _set_errno (error); - -#else - - /* Non-Microsoft compiler or older Microsoft compiler */ - errno = error; - -#endif -} - - -#ifdef __cplusplus -} -#endif -#endif /*DIRENT_H*/ - diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/stdafx.cpp b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/stdafx.cpp deleted file mode 100644 index f913bf52c..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// BMP24toILI565.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/stdafx.h b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/stdafx.h deleted file mode 100644 index b005a839d..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/stdafx.h +++ /dev/null @@ -1,15 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -#include "targetver.h" - -#include -#include - - - -// TODO: reference additional headers your program requires here diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/targetver.h b/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/targetver.h deleted file mode 100644 index 87c0086de..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/BMP24toILI565/C/src/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/GLCDFontCreator2.zip b/STM32F1/libraries/ILI9341_due_STM/tools/GLCDFontCreator2.zip deleted file mode 100644 index c1373478ab6763f58d277975fbdfe371c3606475..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76786 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 P+n3-K - - - - - \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.Designer.cs b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.Designer.cs deleted file mode 100644 index 75a958932..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.Designer.cs +++ /dev/null @@ -1,108 +0,0 @@ -namespace ILIScreenshotViewer -{ - partial class Form1 - { - ///

    - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.pictureBox = new System.Windows.Forms.PictureBox(); - this.btnShow = new System.Windows.Forms.Button(); - this.lblFailed = new System.Windows.Forms.Label(); - this.btnSaveAs = new System.Windows.Forms.Button(); - this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); - this.SuspendLayout(); - // - // pictureBox - // - this.pictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.pictureBox.Location = new System.Drawing.Point(12, 12); - this.pictureBox.Name = "pictureBox"; - this.pictureBox.Size = new System.Drawing.Size(320, 240); - this.pictureBox.TabIndex = 0; - this.pictureBox.TabStop = false; - // - // btnShow - // - this.btnShow.Location = new System.Drawing.Point(93, 258); - this.btnShow.Name = "btnShow"; - this.btnShow.Size = new System.Drawing.Size(158, 23); - this.btnShow.TabIndex = 2; - this.btnShow.Text = "Load Image from Clipboard"; - this.btnShow.UseVisualStyleBackColor = true; - this.btnShow.Click += new System.EventHandler(this.btnShow_Click); - // - // lblFailed - // - this.lblFailed.Location = new System.Drawing.Point(47, 84); - this.lblFailed.Name = "lblFailed"; - this.lblFailed.Size = new System.Drawing.Size(251, 86); - this.lblFailed.TabIndex = 3; - this.lblFailed.Text = "Failed to load an image from clipboard"; - this.lblFailed.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.lblFailed.Visible = false; - // - // btnSaveAs - // - this.btnSaveAs.Location = new System.Drawing.Point(258, 258); - this.btnSaveAs.Name = "btnSaveAs"; - this.btnSaveAs.Size = new System.Drawing.Size(75, 23); - this.btnSaveAs.TabIndex = 4; - this.btnSaveAs.Text = "Save As..."; - this.btnSaveAs.UseVisualStyleBackColor = true; - this.btnSaveAs.Visible = false; - this.btnSaveAs.Click += new System.EventHandler(this.btnSaveAs_Click); - // - // saveFileDialog - // - this.saveFileDialog.Filter = "*.bmp|*.bmp|*.png|*.png|*.gif|*.gif|*.jpg|*.jpg|All Files (*.*)|*.*"; - // - // Form1 - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(347, 294); - this.Controls.Add(this.btnSaveAs); - this.Controls.Add(this.lblFailed); - this.Controls.Add(this.btnShow); - this.Controls.Add(this.pictureBox); - this.Name = "Form1"; - this.Text = "ILI Screenshot Viewer"; - ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.PictureBox pictureBox; - private System.Windows.Forms.Button btnShow; - private System.Windows.Forms.Label lblFailed; - private System.Windows.Forms.Button btnSaveAs; - private System.Windows.Forms.SaveFileDialog saveFileDialog; - } -} - diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.cs b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.cs deleted file mode 100644 index bef5b3b7a..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace ILIScreenshotViewer -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - - private void btnShow_Click(object sender, EventArgs e) - { - lblFailed.Visible = false; - var bitmap = new Bitmap(320, 240, PixelFormat.Format24bppRgb); - - //var hexString = Clipboard.GetText(); - //for (int x = 0; x < 320; x++) - //{ - // for (int y = 0; y < 240; y++) - // { - // var pixelColorString = hexString.Substring(4*x + 4*320*y, 4); - - // var pix = Convert.ToUInt16(pixelColorString, 16); - - - // //* For PixelFormat.Format16bppRgb565 - // //var r = BitConverter.GetBytes((UInt16)((pix & 0xF800) >> 11)); - - // int red = ((pix >> 11)*527 + 23) >> 6; - // int green = (((pix >> 5) & 0x003F)*259 + 33) >> 6; - // int blue = ((pix & 0x001F)*527 + 23) >> 6; - - // bitmap.SetPixel(x, y, Color.FromArgb(red, green, blue)); - // } - //} - - - try - { - string hexString = Clipboard.GetText(); - //for (int x = 0; x < 320; x++) - //{ - // for (int y = 0; y < 240; y++) - // { - // var pixelColorString = hexString.Substring(6 * (x + 320 * y), 6); - - // var r = Convert.ToByte(pixelColorString.Substring(0, 2), 16); - // var g = Convert.ToByte(pixelColorString.Substring(2, 2), 16); - // var b = Convert.ToByte(pixelColorString.Substring(4, 2), 16); - - // //* For PixelFormat.Format16bppRgb565 - // //var r = BitConverter.GetBytes((UInt16)((pix & 0xF800) >> 11)); - - // //int red = ((pix >> 11) * 527 + 23) >> 6; - // //int green = (((pix >> 5) & 0x003F) * 259 + 33) >> 6; - // //int blue = ((pix & 0x001F) * 527 + 23) >> 6; - - // bitmap.SetPixel(x, y, Color.FromArgb(r, g, b)); - // } - //} - int x = 0, y = 0; - var totalImageDataSize = Convert.ToUInt32(hexString.Substring(hexString.Length - 8, 8), 16); - if (hexString.Length - 8 == totalImageDataSize) - { - for (int i = 0; i < totalImageDataSize; i += 10) // 6 bytes for color, 4 bytes for length - { - var pixelColorString = hexString.Substring(i, 6); - var r = Convert.ToByte(pixelColorString.Substring(0, 2), 16); - var g = Convert.ToByte(pixelColorString.Substring(2, 2), 16); - var b = Convert.ToByte(pixelColorString.Substring(4, 2), 16); - - var pixelCountString = hexString.Substring(i + 6, 4); - var pixelCount = Convert.ToUInt16(pixelCountString, 16); - - for (int p = 0; p < pixelCount; p++) - { - bitmap.SetPixel(x, y, Color.FromArgb(r, g, b)); - x++; - if (x > 319) - { - x = 0; - y++; - } - } - } - - pictureBox.Image = bitmap; - btnSaveAs.Visible = true; - } - else - { - lblFailed.Text = "Image Data length mismatch."; - pictureBox.Image = null; - lblFailed.Visible = true; - btnSaveAs.Visible = false; - } - } - catch - { - lblFailed.Text = "Failed to load an image from clipboard\nTry increasing ILI9341_SPI_CLKDIVIDER or\nchange to NORMAL or EXTENDED SPI mode."; - pictureBox.Image = null; - lblFailed.Visible = true; - btnSaveAs.Visible = false; - } - } - - private void btnSaveAs_Click(object sender, EventArgs e) - { - saveFileDialog.FileName = Path.GetFileNameWithoutExtension(saveFileDialog.FileName); - var result = saveFileDialog.ShowDialog(); - if (result == DialogResult.OK) - { - ImageFormat imageFormat = ImageFormat.Bmp; - switch (Path.GetExtension(saveFileDialog.FileName).ToLower()) - { - case ".jpg": - imageFormat = ImageFormat.Jpeg; - break; - case ".png": - imageFormat = ImageFormat.Png; - break; - case ".gif": - imageFormat = ImageFormat.Gif; - break; - } - pictureBox.Image.Save(saveFileDialog.FileName, imageFormat); - } - - } - - } -} diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.resx b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.resx deleted file mode 100644 index 5e7f0a6fe..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Form1.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/ILIScreenshotViewer.csproj b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/ILIScreenshotViewer.csproj deleted file mode 100644 index 30d5cb1fb..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/ILIScreenshotViewer.csproj +++ /dev/null @@ -1,82 +0,0 @@ - - - - - Debug - AnyCPU - {AD6D4A3D-2F94-435B-836F-E617ED847F46} - WinExe - Properties - ILIScreenshotViewer - ILIScreenshotViewer - v4.5 - 512 - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - Form - - - Form1.cs - - - - - Form1.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/ILIScreenshotViewer.sln b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/ILIScreenshotViewer.sln deleted file mode 100644 index ec191d30a..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/ILIScreenshotViewer.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ILIScreenshotViewer", "ILIScreenshotViewer.csproj", "{AD6D4A3D-2F94-435B-836F-E617ED847F46}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AD6D4A3D-2F94-435B-836F-E617ED847F46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AD6D4A3D-2F94-435B-836F-E617ED847F46}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AD6D4A3D-2F94-435B-836F-E617ED847F46}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AD6D4A3D-2F94-435B-836F-E617ED847F46}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Program.cs b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Program.cs deleted file mode 100644 index f2930c0a1..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace ILIScreenshotViewer -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); - } - } -} diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/AssemblyInfo.cs b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/AssemblyInfo.cs deleted file mode 100644 index b9edad9e1..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ILIScreenshotViewer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("ILIScreenshotViewer")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("bfab4204-5b3c-43c8-b397-d137817de176")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Resources.Designer.cs b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Resources.Designer.cs deleted file mode 100644 index de9c11bed..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18063 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ILIScreenshotViewer.Properties -{ - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ILIScreenshotViewer.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Resources.resx b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Resources.resx deleted file mode 100644 index af7dbebba..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Settings.Designer.cs b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Settings.Designer.cs deleted file mode 100644 index feddeef2d..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18063 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ILIScreenshotViewer.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Settings.settings b/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Settings.settings deleted file mode 100644 index 39645652a..000000000 --- a/STM32F1/libraries/ILI9341_due_STM/tools/ILIScreenshotViewer/src/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - From 7c9b1cc11ae391be547f191ceb7865a4b3925ffb Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 26 Dec 2016 20:34:11 +1100 Subject: [PATCH 036/307] Enable SWD pins for all upload types, on all F103 boards except Maple mini and Maple --- STM32F1/boards.txt | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 95a5f8635..d9c5df511 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -190,7 +190,7 @@ genericSTM32F103C.menu.device_variant.STM32F103CB.upload.flash.maximum_size=1310 genericSTM32F103C.menu.upload_method.DFUUploadMethod=STM32duino bootloader genericSTM32F103C.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericSTM32F103C.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericSTM32F103C.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER +genericSTM32F103C.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericSTM32F103C.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericSTM32F103C.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader_20.ld genericSTM32F103C.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -199,7 +199,7 @@ genericSTM32F103C.menu.upload_method.DFUUploadMethod.upload.altID=2 genericSTM32F103C.menu.upload_method.serialMethod=Serial genericSTM32F103C.menu.upload_method.serialMethod.upload.protocol=maple_serial genericSTM32F103C.menu.upload_method.serialMethod.upload.tool=serial_upload - +genericSTM32F103C.menu.upload_method.serialMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG genericSTM32F103C.menu.upload_method.STLinkMethod=STLink genericSTM32F103C.menu.upload_method.STLinkMethod.upload.protocol=STLink @@ -267,7 +267,7 @@ genericSTM32F103R.menu.device_variant.STM32F103RE.build.ldscript=ld/stm32f103re. genericSTM32F103R.menu.upload_method.DFUUploadMethod=STM32duino bootloader genericSTM32F103R.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericSTM32F103R.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericSTM32F103R.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER +genericSTM32F103R.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericSTM32F103R.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericSTM32F103R.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader.ld genericSTM32F103R.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -276,6 +276,7 @@ genericSTM32F103R.menu.upload_method.DFUUploadMethod.upload.altID=2 genericSTM32F103R.menu.upload_method.serialMethod=Serial genericSTM32F103R.menu.upload_method.serialMethod.upload.protocol=maple_serial genericSTM32F103R.menu.upload_method.serialMethod.upload.tool=serial_upload +genericSTM32F103R.menu.upload_method.serialMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericSTM32F103R.menu.upload_method.STLinkMethod=STLink genericSTM32F103R.menu.upload_method.STLinkMethod.upload.protocol=STLink @@ -321,7 +322,7 @@ genericSTM32F103T.menu.device_variant.STM32F103TB.upload.flash.maximum_size=1310 genericSTM32F103T.menu.upload_method.DFUUploadMethod=STM32duino bootloader genericSTM32F103T.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericSTM32F103T.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericSTM32F103T.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER +genericSTM32F103T.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericSTM32F103T.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericSTM32F103T.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader_20.ld genericSTM32F103T.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -330,6 +331,7 @@ genericSTM32F103T.menu.upload_method.DFUUploadMethod.upload.altID=2 genericSTM32F103T.menu.upload_method.serialMethod=Serial genericSTM32F103T.menu.upload_method.serialMethod.upload.protocol=maple_serial genericSTM32F103T.menu.upload_method.serialMethod.upload.tool=serial_upload +genericSTM32F103T.menu.upload_method.serialMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericSTM32F103T.menu.upload_method.STLinkMethod=STLink genericSTM32F103T.menu.upload_method.STLinkMethod.upload.protocol=STLink @@ -383,7 +385,7 @@ genericSTM32F103V.menu.device_variant.STM32F103VE.build.ldscript=ld/stm32f103ve. genericSTM32F103V.menu.upload_method.DFUUploadMethod=STM32duino bootloader genericSTM32F103V.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericSTM32F103V.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericSTM32F103V.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER +genericSTM32F103V.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericSTM32F103V.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericSTM32F103V.menu.upload_method.DFUUploadMethod.build.ldscript=ld/stm32f103veDFU.ld genericSTM32F103V.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -392,6 +394,7 @@ genericSTM32F103V.menu.upload_method.DFUUploadMethod.upload.altID=2 genericSTM32F103V.menu.upload_method.serialMethod=Serial genericSTM32F103V.menu.upload_method.serialMethod.upload.protocol=maple_serial genericSTM32F103V.menu.upload_method.serialMethod.upload.tool=serial_upload +genericSTM32F103V.menu.upload_method.serialMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericSTM32F103V.menu.upload_method.STLinkMethod=STLink genericSTM32F103V.menu.upload_method.STLinkMethod.upload.protocol=STLink @@ -442,7 +445,7 @@ genericSTM32F103Z.menu.device_variant.STM32F103ZE.build.ldscript=ld/stm32f103ze. genericSTM32F103Z.menu.upload_method.DFUUploadMethod=STM32duino bootloader genericSTM32F103Z.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericSTM32F103Z.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericSTM32F103Z.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER +genericSTM32F103Z.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericSTM32F103Z.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericSTM32F103Z.menu.upload_method.DFUUploadMethod.build.ldscript=ld/stm32f103z_dfu.ld genericSTM32F103Z.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -451,6 +454,7 @@ genericSTM32F103Z.menu.upload_method.DFUUploadMethod.upload.altID=2 genericSTM32F103Z.menu.upload_method.serialMethod=Serial genericSTM32F103Z.menu.upload_method.serialMethod.upload.protocol=maple_serial genericSTM32F103Z.menu.upload_method.serialMethod.upload.tool=serial_upload +genericSTM32F103Z.menu.upload_method.serialMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericSTM32F103Z.menu.upload_method.STLinkMethod=STLink genericSTM32F103Z.menu.upload_method.STLinkMethod.upload.protocol=STLink @@ -497,7 +501,7 @@ hytiny-stm32f103t.menu.upload_method.DFUUploadMethod.upload.altID=2 hytiny-stm32f103t.menu.upload_method.serialMethod=Serial hytiny-stm32f103t.menu.upload_method.serialMethod.upload.protocol=maple_serial hytiny-stm32f103t.menu.upload_method.serialMethod.upload.tool=serial_upload - +hytiny-stm32f103t.menu.upload_method.serialMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 hytiny-stm32f103t.menu.upload_method.STLinkMethod=STLink hytiny-stm32f103t.menu.upload_method.STLinkMethod.upload.protocol=STLink @@ -550,7 +554,7 @@ genericGD32F103C.menu.upload_method.DFUUploadMethod=GD32duino bootloader genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericGD32F103C.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER +genericGD32F103C.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericGD32F103C.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericGD32F103C.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader_20.ld genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -559,7 +563,7 @@ genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.altID=2 genericGD32F103C.menu.upload_method.serialMethod=Serial genericGD32F103C.menu.upload_method.serialMethod.upload.protocol=maple_serial genericGD32F103C.menu.upload_method.serialMethod.upload.tool=serial_upload - +genericGD32F103C.menu.upload_method.serialMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 genericGD32F103C.menu.upload_method.STLinkMethod=STLink genericGD32F103C.menu.upload_method.STLinkMethod.upload.protocol=STLink From fb823b6929e4416b0921b4ff6c9ea4fa5a186262 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 26 Dec 2016 15:26:51 +0100 Subject: [PATCH 037/307] remove unused code & bugfixes - setDataSize shall first disable the SPI before writing new value - dmaTransfer adapted for TFT library usage --- .gitignore | 2 ++ STM32F1/libraries/SPI/src/SPI.cpp | 21 ++++++++++----------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 05bb0a597..1fc5dc8ed 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ other/maple-bootloader/build other/maple-bootloader/*~ *.o tools/src/stm32flash_serial/src/parsers/parsers.a +*.bak +*.1 diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 9b6e28e7d..45ee25ab4 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -214,8 +214,10 @@ void SPIClass::setBitOrder(BitOrder bitOrder) void SPIClass::setDataSize(uint32 datasize) { _currentSetting->dataSize = datasize; - uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF); - _currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF); + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF); + uint8 en = spi_is_enabled(_currentSetting->spi_d); + spi_peripheral_disable(_currentSetting->spi_d); + _currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF) | en; } void SPIClass::setDataMode(uint8_t dataMode) @@ -316,12 +318,11 @@ void SPIClass::read(uint8 *buf, uint32 len) { spi_reg_map * regs = _currentSetting->spi_d->regs; uint8 b = (regs->DR); // clear the RX buffer in case a byte is waiting on it. - uint32 rxed = 0; // start sequence - while ( rxed < len) { + while ( (len--)>0) { regs->DR = 0x00FF; // " write the data item to be transmitted into the SPI_DR register (this clears the TXE flag)." while ( (regs->SR & SPI_SR_RXNE)==0 ) ; // wait till data is available in the Rx register - *buf++ = (regs->DR); // read and store the received byte + *buf++ = (uint8)(regs->DR); // read and store the received byte } } @@ -333,6 +334,7 @@ void SPIClass::write(uint16 data) * This almost doubles the speed of this function. */ spi_tx_reg(_currentSetting->spi_d, data); // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } @@ -387,7 +389,7 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length // RX spi_rx_dma_enable(_currentSetting->spi_d); - dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_8BIT) ? DMA_SIZE_8BITS : DMA_SIZE_16BITS; + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); @@ -408,7 +410,7 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit uint32_t m = millis(); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & 0x2)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); @@ -434,13 +436,10 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) if (length == 0) return 0; uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); uint8 b = 0; -// dma1_ch3_Active=true; dma_init(_currentSetting->spiDmaDev); -// dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - // TX spi_tx_dma_enable(_currentSetting->spi_d); - dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_8BIT) ? DMA_SIZE_8BITS : DMA_SIZE_16BITS; + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); From 7dcbbc85b00b23a9ef7ec8692310d90623aeebc1 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 9 Jan 2017 20:27:07 +1100 Subject: [PATCH 038/307] Fix bug USB divider for 48Mhz operation. Also added support for 48Mhz to Maple mini and Generic F103C (Note. There is a bug in tone() at 48Mhz) --- STM32F1/boards.txt | 15 +++++++++++++++ STM32F1/variants/STM32VLD/wirish/boards_setup.cpp | 2 +- .../generic_gd32f103c/wirish/boards_setup.cpp | 2 +- .../generic_stm32f103c/wirish/boards_setup.cpp | 8 ++++++-- .../generic_stm32f103r/wirish/boards_setup.cpp | 8 ++++++-- .../generic_stm32f103r8/wirish/boards_setup.cpp | 8 ++++++-- .../generic_stm32f103t/wirish/boards_setup.cpp | 8 ++++++-- .../generic_stm32f103v/wirish/boards_setup.cpp | 8 ++++++-- .../generic_stm32f103z/wirish/boards_setup.cpp | 8 ++++++-- .../hytiny_stm32f103t/wirish/boards_setup.cpp | 8 ++++++-- STM32F1/variants/maple/wirish/boards_setup.cpp | 8 ++++++-- .../variants/maple_mini/wirish/boards_setup.cpp | 8 ++++++-- .../variants/maple_ret6/wirish/boards_setup.cpp | 8 ++++++-- .../variants/microduino/wirish/boards_setup.cpp | 8 ++++++-- 14 files changed, 83 insertions(+), 24 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index d9c5df511..24202fc9d 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -38,6 +38,14 @@ mapleMini.menu.bootloader_version.bootloader20.upload.flash.maximum_size=122880 mapleMini.menu.bootloader_version.bootloader20.upload.maximum_size=122880 mapleMini.menu.bootloader_version.bootloader20.upload.altID=2 +#-- CPU Clock frequency +mapleMini.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +mapleMini.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +mapleMini.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +mapleMini.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + + ############################################################## maple.name=Maple (Rev 3) @@ -217,6 +225,13 @@ genericSTM32F103C.menu.upload_method.jlinkMethod.upload.protocol=jlink genericSTM32F103C.menu.upload_method.jlinkMethod.upload.tool=jlink_upload genericSTM32F103C.menu.upload_method.jlinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER +#-- CPU Clock frequency +genericSTM32F103C.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +genericSTM32F103C.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +genericSTM32F103C.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +genericSTM32F103C.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + ########################### Generic STM32F103R ########################### genericSTM32F103R.name=Generic STM32F103R series diff --git a/STM32F1/variants/STM32VLD/wirish/boards_setup.cpp b/STM32F1/variants/STM32VLD/wirish/boards_setup.cpp index 9de4d5396..f6a28c0d1 100644 --- a/STM32F1/variants/STM32VLD/wirish/boards_setup.cpp +++ b/STM32F1/variants/STM32VLD/wirish/boards_setup.cpp @@ -71,7 +71,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/generic_gd32f103c/wirish/boards_setup.cpp b/STM32F1/variants/generic_gd32f103c/wirish/boards_setup.cpp index a5a26be56..3df1fe784 100644 --- a/STM32F1/variants/generic_gd32f103c/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_gd32f103c/wirish/boards_setup.cpp @@ -80,7 +80,7 @@ namespace wirish { #elif F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/generic_stm32f103c/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103c/wirish/boards_setup.cpp index 1f833afde..551628264 100644 --- a/STM32F1/variants/generic_stm32f103c/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103c/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/generic_stm32f103r/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103r/wirish/boards_setup.cpp index 25060bb22..d7774f763 100644 --- a/STM32F1/variants/generic_stm32f103r/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103r/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/generic_stm32f103r8/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103r8/wirish/boards_setup.cpp index 9c04e74ce..7c939771e 100644 --- a/STM32F1/variants/generic_stm32f103r8/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103r8/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/generic_stm32f103t/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103t/wirish/boards_setup.cpp index 1f833afde..551628264 100644 --- a/STM32F1/variants/generic_stm32f103t/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103t/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/generic_stm32f103v/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103v/wirish/boards_setup.cpp index 2f638f427..1f23679ab 100644 --- a/STM32F1/variants/generic_stm32f103v/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103v/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/generic_stm32f103z/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103z/wirish/boards_setup.cpp index 78868b20f..e2cfe4ad8 100644 --- a/STM32F1/variants/generic_stm32f103z/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103z/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp b/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp index 5d762c7cc..df393473b 100644 --- a/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp +++ b/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/maple/wirish/boards_setup.cpp b/STM32F1/variants/maple/wirish/boards_setup.cpp index d7b8ef8af..1071d6da5 100644 --- a/STM32F1/variants/maple/wirish/boards_setup.cpp +++ b/STM32F1/variants/maple/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/maple_mini/wirish/boards_setup.cpp b/STM32F1/variants/maple_mini/wirish/boards_setup.cpp index 5d762c7cc..df393473b 100644 --- a/STM32F1/variants/maple_mini/wirish/boards_setup.cpp +++ b/STM32F1/variants/maple_mini/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/maple_ret6/wirish/boards_setup.cpp b/STM32F1/variants/maple_ret6/wirish/boards_setup.cpp index d7b8ef8af..1071d6da5 100644 --- a/STM32F1/variants/maple_ret6/wirish/boards_setup.cpp +++ b/STM32F1/variants/maple_ret6/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } diff --git a/STM32F1/variants/microduino/wirish/boards_setup.cpp b/STM32F1/variants/microduino/wirish/boards_setup.cpp index 6a26b9181..e8998435b 100644 --- a/STM32F1/variants/microduino/wirish/boards_setup.cpp +++ b/STM32F1/variants/microduino/wirish/boards_setup.cpp @@ -48,7 +48,11 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL -#define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #if F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { @@ -71,7 +75,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } From c2f4aa8566e6d294e544084f286a5b06f070453e Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 9 Jan 2017 21:17:28 +1100 Subject: [PATCH 039/307] Fixed tone() so it works is F_CPU is not 72Mhz --- STM32F1/cores/maple/tone.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/cores/maple/tone.cpp b/STM32F1/cores/maple/tone.cpp index 26aa67679..965bfddc9 100644 --- a/STM32F1/cores/maple/tone.cpp +++ b/STM32F1/cores/maple/tone.cpp @@ -147,7 +147,7 @@ void tone(uint32_t pin, uint32_t freq, uint32_t duration) { tone_timer->pause(); if(freq > 0 && duration >0 ){ - uint32_t count = 18000000/freq; // timer counts per half wave + uint32_t count = (F_CPU/4)/freq; // timer counts per half wave tone_ncount = tone_n = (count>>16)+1; // number of 16-bit count chunk tone_tcount = count/tone_ncount; // size of count chunk if(duration > 0) // number of half waves to be generated From 8cfa60ff8419183b8ff0b7125bc43a412d673f30 Mon Sep 17 00:00:00 2001 From: "Romero B. de S. Malaquias" Date: Mon, 16 Jan 2017 03:55:16 -0200 Subject: [PATCH 040/307] Avoiding conditional directives that break statements --- STM32F3/cores/maple/libmaple/stm32f3/f3_adc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STM32F3/cores/maple/libmaple/stm32f3/f3_adc.c b/STM32F3/cores/maple/libmaple/stm32f3/f3_adc.c index 79fcd515b..982d6ea44 100644 --- a/STM32F3/cores/maple/libmaple/stm32f3/f3_adc.c +++ b/STM32F3/cores/maple/libmaple/stm32f3/f3_adc.c @@ -301,11 +301,11 @@ void adc_config_gpio(const adc_dev *ignored, gpio_dev *gdev, uint8 bit) { } void adc_enable_single_swstart(const adc_dev *dev) { + int check_dev_adc = dev == ADC1; #if STM32_F3_LINE == STM32_F3_LINE_303 - if ( (dev == ADC1) || (dev == ADC3) ) -#else - if (dev == ADC1) + check_dev_adc = (check_dev_adc || dev == ADC3); #endif + if (check_dev_adc) adc_init(dev); /* FIXME hack needed for wirish, as master and slave ADC share the same reset register */ adc_set_exttrig(dev, ADC_EXTTRIG_MODE_SOFTWARE); adc_regulator_enable(dev); From 7c320774b1477acec19acd330264d6303de4d67a Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Wed, 8 Feb 2017 15:17:58 +1100 Subject: [PATCH 041/307] Add EEPROM.update() function --- STM32F1/libraries/EEPROM/EEPROM.cpp | 22 ++++++++++++++++++++++ STM32F1/libraries/EEPROM/EEPROM.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/STM32F1/libraries/EEPROM/EEPROM.cpp b/STM32F1/libraries/EEPROM/EEPROM.cpp index 2cfd64866..289a93ad8 100644 --- a/STM32F1/libraries/EEPROM/EEPROM.cpp +++ b/STM32F1/libraries/EEPROM/EEPROM.cpp @@ -521,6 +521,28 @@ uint16 EEPROMClass::write(uint16 Address, uint16 Data) return status; } +/** + * @brief Writes/upadtes variable data in EEPROM. + The value is written only if differs from the one already saved at the same address. + * @param VirtAddress: Variable virtual address + * @param Data: 16 bit data to be written + * @retval Success or error status: + * - EEPROM_SAME_VALUE: If new Data matches existing EEPROM Data + * - FLASH_COMPLETE: on success + * - EEPROM_BAD_ADDRESS: if address = 0xFFFF + * - EEPROM_PAGE_FULL: if valid page is full + * - EEPROM_NO_VALID_PAGE: if no valid page was found + * - EEPROM_OUT_SIZE: if no empty EEPROM variables + * - Flash error code: on write Flash error + */ +uint16 EEPROMClass::update(uint16 Address, uint16 Data) +{ + if (read(Address) == Data) + return EEPROM_SAME_VALUE; + else + return write(Address, Data); +} + /** * @brief Return number of variable * @retval Number of variables diff --git a/STM32F1/libraries/EEPROM/EEPROM.h b/STM32F1/libraries/EEPROM/EEPROM.h index 8a8320b6b..29574767d 100644 --- a/STM32F1/libraries/EEPROM/EEPROM.h +++ b/STM32F1/libraries/EEPROM/EEPROM.h @@ -47,6 +47,7 @@ enum : uint16 EEPROM_BAD_ADDRESS = ((uint16)0x0082), EEPROM_BAD_FLASH = ((uint16)0x0083), EEPROM_NOT_INIT = ((uint16)0x0084), + EEPROM_SAME_VALUE = ((uint16)0x0085), EEPROM_NO_VALID_PAGE = ((uint16)0x00AB) }; @@ -67,6 +68,7 @@ class EEPROMClass uint16 read (uint16 address); uint16 read (uint16 address, uint16 *data); uint16 write(uint16 address, uint16 data); + uint16 update(uint16 address, uint16 data); uint16 count(uint16 *); uint16 maxcount(void); From a8d1c1d1b614a5ed6924df3facc72a5f9980e34d Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 26 Feb 2017 13:26:24 +1100 Subject: [PATCH 042/307] Disabled SWD pins for all boards when using DFU (bootloader) upload method --- STM32F1/boards.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 24202fc9d..d5c4ec9bf 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -198,7 +198,7 @@ genericSTM32F103C.menu.device_variant.STM32F103CB.upload.flash.maximum_size=1310 genericSTM32F103C.menu.upload_method.DFUUploadMethod=STM32duino bootloader genericSTM32F103C.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericSTM32F103C.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericSTM32F103C.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 +genericSTM32F103C.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER genericSTM32F103C.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericSTM32F103C.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader_20.ld genericSTM32F103C.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -282,7 +282,7 @@ genericSTM32F103R.menu.device_variant.STM32F103RE.build.ldscript=ld/stm32f103re. genericSTM32F103R.menu.upload_method.DFUUploadMethod=STM32duino bootloader genericSTM32F103R.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericSTM32F103R.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericSTM32F103R.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 +genericSTM32F103R.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER genericSTM32F103R.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericSTM32F103R.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader.ld genericSTM32F103R.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -337,7 +337,7 @@ genericSTM32F103T.menu.device_variant.STM32F103TB.upload.flash.maximum_size=1310 genericSTM32F103T.menu.upload_method.DFUUploadMethod=STM32duino bootloader genericSTM32F103T.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericSTM32F103T.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericSTM32F103T.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 +genericSTM32F103T.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER genericSTM32F103T.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericSTM32F103T.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader_20.ld genericSTM32F103T.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -400,7 +400,7 @@ genericSTM32F103V.menu.device_variant.STM32F103VE.build.ldscript=ld/stm32f103ve. genericSTM32F103V.menu.upload_method.DFUUploadMethod=STM32duino bootloader genericSTM32F103V.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericSTM32F103V.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericSTM32F103V.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 +genericSTM32F103V.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER genericSTM32F103V.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericSTM32F103V.menu.upload_method.DFUUploadMethod.build.ldscript=ld/stm32f103veDFU.ld genericSTM32F103V.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -460,7 +460,7 @@ genericSTM32F103Z.menu.device_variant.STM32F103ZE.build.ldscript=ld/stm32f103ze. genericSTM32F103Z.menu.upload_method.DFUUploadMethod=STM32duino bootloader genericSTM32F103Z.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericSTM32F103Z.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericSTM32F103Z.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 +genericSTM32F103Z.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER genericSTM32F103Z.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericSTM32F103Z.menu.upload_method.DFUUploadMethod.build.ldscript=ld/stm32f103z_dfu.ld genericSTM32F103Z.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 @@ -569,7 +569,7 @@ genericGD32F103C.menu.upload_method.DFUUploadMethod=GD32duino bootloader genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericGD32F103C.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 +genericGD32F103C.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER genericGD32F103C.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 genericGD32F103C.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader_20.ld genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 From 9b759c87f8635bf8f6551cafcadfcb5944396821 Mon Sep 17 00:00:00 2001 From: Floris Lambrechts Date: Wed, 22 Mar 2017 13:55:27 +0100 Subject: [PATCH 043/307] Fix F103T compilation error: remove const Method adc_default_config still had the adc_dev* 'const' for F103T, but this doesn't compile. For other boards, the 'const' was removed already. See for example commits 0b34af3b6a29c2ea40a0005fde57f67f75829378 and 2cdbbc83390b27570c9040fc92bda6e63947f160. Tested on Arduino IDE 1.6.13. Compilation error message was along these lines: STM32F1\variants\generic_stm32f103t\wirish\boards.cpp:183:34: error: invalid conversion from 'const adc_dev*' to 'adc_dev*' [-fpermissive] STM32F1\system/libmaple/include/libmaple/adc.h:306:13: error: initializing argument 1 of 'void adc_enable_single_swstart(adc_dev*)' [-fpermissive] STM32F1\variants\generic_stm32f103t\wirish\boards.cpp:184:53: error: invalid conversion from 'const adc_dev*' to 'adc_dev*' [-fpermissive] STM32F1\system/libmaple/include/libmaple/adc.h:268:6: error: initializing argument 1 of 'void adc_set_sample_rate(adc_dev*, adc_smp_rate)' [-fpermissive] STM32F1\variants\generic_stm32f103t\wirish\boards.cpp: In function 'void setup_adcs()': STM32F1\variants\generic_stm32f103t\wirish\boards.cpp:189:35: error: invalid conversion from 'void (*)(const adc_dev*)' to 'void (*)(adc_dev*)' [-fpermissive] STM32F1\system/libmaple/include/libmaple/adc.h:282:13: error: initializing argument 1 of 'void adc_foreach(void (*)(adc_dev*))' [-fpermissive] --- STM32F1/variants/generic_stm32f103t/wirish/boards.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/variants/generic_stm32f103t/wirish/boards.cpp b/STM32F1/variants/generic_stm32f103t/wirish/boards.cpp index 0c018e885..5274e7a93 100644 --- a/STM32F1/variants/generic_stm32f103t/wirish/boards.cpp +++ b/STM32F1/variants/generic_stm32f103t/wirish/boards.cpp @@ -179,7 +179,7 @@ nvic_init((uint32)VECT_TAB_ADDR, 0); */ } -static void adc_default_config(const adc_dev *dev) { +static void adc_default_config(adc_dev *dev) { adc_enable_single_swstart(dev); adc_set_sample_rate(dev, wirish::priv::w_adc_smp); } From ea81f36fa526f17bf7069474720caa001382b898 Mon Sep 17 00:00:00 2001 From: victorpv Date: Sat, 25 Mar 2017 08:31:44 -0500 Subject: [PATCH 044/307] FreeRTOS900 --- .../FreeRTOS900/MapleFreeRTOS900.cpp | 44 + .../libraries/FreeRTOS900/MapleFreeRTOS900.h | 40 + .../examples/rtos_blink/rtos_blink.ino | 31 + .../rtos_display_blink/rtos_display_blink.ino | 212 + .../libraries/FreeRTOS900/utility/FreeRTOS.h | 1063 ++++ .../FreeRTOS900/utility/FreeRTOSConfig.h | 144 + .../FreeRTOS900/utility/MemMang/heap_1.c | 174 + .../FreeRTOS900/utility/MemMang/heap_2.c | 303 ++ .../FreeRTOS900/utility/MemMang/heap_3.c | 135 + .../FreeRTOS900/utility/MemMang/heap_4.c | 474 ++ .../FreeRTOS900/utility/MemMang/heap_5.c | 523 ++ .../FreeRTOS900/utility/StackMacros.h | 171 + .../libraries/FreeRTOS900/utility/croutine.c | 395 ++ .../libraries/FreeRTOS900/utility/croutine.h | 762 +++ .../utility/deprecated_definitions.h | 321 ++ .../FreeRTOS900/utility/event_groups.c | 752 +++ .../FreeRTOS900/utility/event_groups.h | 797 +++ .../libraries/FreeRTOS900/utility/heap_1.c | 174 + STM32F1/libraries/FreeRTOS900/utility/list.c | 240 + STM32F1/libraries/FreeRTOS900/utility/list.h | 453 ++ .../FreeRTOS900/utility/mpu_prototypes.h | 177 + .../FreeRTOS900/utility/mpu_wrappers.h | 201 + STM32F1/libraries/FreeRTOS900/utility/port.c | 717 +++ .../libraries/FreeRTOS900/utility/portable.h | 207 + .../libraries/FreeRTOS900/utility/portmacro.h | 284 + .../libraries/FreeRTOS900/utility/projdefs.h | 161 + STM32F1/libraries/FreeRTOS900/utility/queue.c | 2566 +++++++++ STM32F1/libraries/FreeRTOS900/utility/queue.h | 1798 ++++++ .../libraries/FreeRTOS900/utility/readme.txt | 17 + .../libraries/FreeRTOS900/utility/semphr.h | 1171 ++++ .../FreeRTOS900/utility/stdint.readme | 27 + STM32F1/libraries/FreeRTOS900/utility/task.h | 2267 ++++++++ STM32F1/libraries/FreeRTOS900/utility/tasks.c | 4807 +++++++++++++++++ .../libraries/FreeRTOS900/utility/timers.c | 1092 ++++ .../libraries/FreeRTOS900/utility/timers.h | 1314 +++++ 35 files changed, 24014 insertions(+) create mode 100644 STM32F1/libraries/FreeRTOS900/MapleFreeRTOS900.cpp create mode 100644 STM32F1/libraries/FreeRTOS900/MapleFreeRTOS900.h create mode 100644 STM32F1/libraries/FreeRTOS900/examples/rtos_blink/rtos_blink.ino create mode 100644 STM32F1/libraries/FreeRTOS900/examples/rtos_display_blink/rtos_display_blink.ino create mode 100644 STM32F1/libraries/FreeRTOS900/utility/FreeRTOS.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/FreeRTOSConfig.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_1.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_2.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_3.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_4.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_5.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/StackMacros.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/croutine.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/croutine.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/deprecated_definitions.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/event_groups.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/event_groups.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/heap_1.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/list.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/list.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/mpu_prototypes.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/mpu_wrappers.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/port.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/portable.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/portmacro.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/projdefs.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/queue.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/queue.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/readme.txt create mode 100644 STM32F1/libraries/FreeRTOS900/utility/semphr.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/stdint.readme create mode 100644 STM32F1/libraries/FreeRTOS900/utility/task.h create mode 100644 STM32F1/libraries/FreeRTOS900/utility/tasks.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/timers.c create mode 100644 STM32F1/libraries/FreeRTOS900/utility/timers.h diff --git a/STM32F1/libraries/FreeRTOS900/MapleFreeRTOS900.cpp b/STM32F1/libraries/FreeRTOS900/MapleFreeRTOS900.cpp new file mode 100644 index 000000000..43fc2f1be --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/MapleFreeRTOS900.cpp @@ -0,0 +1,44 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +#include "MapleFreeRTOS900.h" + +extern "C" { + +void vApplicationStackOverflowHook(xTaskHandle *pxTask, + signed char *pcTaskName) { + /* This function will get called if a task overflows its stack. + * If the parameters are corrupt then inspect pxCurrentTCB to find + * which was the offending task. */ + + (void) pxTask; + (void) pcTaskName; + + while (1) + ; +} + +} diff --git a/STM32F1/libraries/FreeRTOS900/MapleFreeRTOS900.h b/STM32F1/libraries/FreeRTOS900/MapleFreeRTOS900.h new file mode 100644 index 000000000..4cbbb962f --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/MapleFreeRTOS900.h @@ -0,0 +1,40 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +#ifndef __MAPLE_FREERTOS_H__ +#define __MAPLE_FREERTOS_H__ + +#include + +extern "C" { +#define GCC_ARMCM3 +#include "utility/FreeRTOS.h" +#include "utility/task.h" +#include "utility/queue.h" +#include "utility/semphr.h" +} + +#endif diff --git a/STM32F1/libraries/FreeRTOS900/examples/rtos_blink/rtos_blink.ino b/STM32F1/libraries/FreeRTOS900/examples/rtos_blink/rtos_blink.ino new file mode 100644 index 000000000..a972b6c18 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/examples/rtos_blink/rtos_blink.ino @@ -0,0 +1,31 @@ +//#include +//#include "libraries/FreeRTOS/MapleFreeRTOS.h" +#include + +static void vLEDFlashTask(void *pvParameters) { + for (;;) { + vTaskDelay(1000); + digitalWrite(BOARD_LED_PIN, HIGH); + vTaskDelay(50); + digitalWrite(BOARD_LED_PIN, LOW); + } +} + +void setup() { + // initialize the digital pin as an output: + pinMode(BOARD_LED_PIN, OUTPUT); + + xTaskCreate(vLEDFlashTask, + "Task1", + configMINIMAL_STACK_SIZE, + NULL, + tskIDLE_PRIORITY + 2, + NULL); + vTaskStartScheduler(); +} + +void loop() { + // Insert background code here +} + + diff --git a/STM32F1/libraries/FreeRTOS900/examples/rtos_display_blink/rtos_display_blink.ino b/STM32F1/libraries/FreeRTOS900/examples/rtos_display_blink/rtos_display_blink.ino new file mode 100644 index 000000000..bd6c3e4e0 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/examples/rtos_display_blink/rtos_display_blink.ino @@ -0,0 +1,212 @@ +#define USE_SEMAPHORE_DMA1 +#include +#include +#include +#include + +#define __CS 8 +#define __RST 9 +#define __DC 10 + +TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC, __RST); + +xSemaphoreHandle xDisplayFree; + + +const float sin_d[] = { + 0, 0.17, 0.34, 0.5, 0.64, 0.77, 0.87, 0.94, 0.98, 1, 0.98, 0.94, + 0.87, 0.77, 0.64, 0.5, 0.34, 0.17, 0, -0.17, -0.34, -0.5, -0.64, + -0.77, -0.87, -0.94, -0.98, -1, -0.98, -0.94, -0.87, -0.77, + -0.64, -0.5, -0.34, -0.17 +}; +const float cos_d[] = { + 1, 0.98, 0.94, 0.87, 0.77, 0.64, 0.5, 0.34, 0.17, 0, -0.17, -0.34, + -0.5, -0.64, -0.77, -0.87, -0.94, -0.98, -1, -0.98, -0.94, -0.87, + -0.77, -0.64, -0.5, -0.34, -0.17, 0, 0.17, 0.34, 0.5, 0.64, 0.77, + 0.87, 0.94, 0.98 +}; +const float d = 5; +float cube1_px[] = { + -d, d, d, -d, -d, d, d, -d +}; +float cube1_py[] = { + -d, -d, d, d, -d, -d, d, d +}; +float cube1_pz[] = { + -d, -d, -d, -d, d, d, d, d +}; + +float cube1_p2x[] = { + 0, 0, 0, 0, 0, 0, 0, 0 +}; +float cube1_p2y[] = { + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +int cube1_r[] = { + 0, 0, 0 +}; +const float d2 = 10; +float cube2_px[] = { + -d2, d2, d2, -d2, -d2, d2, d2, -d2 +}; +float cube2_py[] = { + -d2, -d2, d2, d2, -d2, -d2, d2, d2 +}; +float cube2_pz[] = { + -d2, -d2, -d2, -d2, d2, d2, d2, d2 +}; + +float cube2_p2x[] = { + 0, 0, 0, 0, 0, 0, 0, 0 +}; +float cube2_p2y[] = { + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +int cube2_r[] = { + 0, 0, 0 +}; + +uint16 cube1_x, cube1_y, cube2_x, cube2_y, cube1_color, cube2_color; + +static void vLEDFlashTask(void *pvParameters) { + for (;;) { + vTaskDelay(1000); + digitalWrite(BOARD_LED_PIN, HIGH); + vTaskDelay(50); + digitalWrite(BOARD_LED_PIN, LOW); + } +} + +static void vCube1LoopTask(void *pvParameters) { + while (1) { + if ( xSemaphoreTake( xDisplayFree, ( portTickType ) 10 ) == pdTRUE ) + { + cube(cube1_px, cube1_py, cube1_pz, cube1_p2x, cube1_p2y, cube1_r, &cube1_x, &cube1_y, &cube1_color); + xSemaphoreGive( xDisplayFree ); + vTaskDelay(15); + } + } +} + +static void vCube2LoopTask(void *pvParameters) { + while (1) { + if ( xSemaphoreTake( xDisplayFree, ( portTickType ) 10 ) == pdTRUE ) + { + cube(cube2_px, cube2_py, cube2_pz, cube2_p2x, cube2_p2y, cube2_r, &cube2_x, &cube2_y, &cube2_color); + xSemaphoreGive( xDisplayFree ); + vTaskDelay(40); + } + } +} + + +void cube(float *px, float *py, float *pz, float *p2x, float *p2y, int *r, uint16 *x, uint16 *y, uint16 *color) { + + for (int i = 0; i < 3; i++) { + tft.drawLine(p2x[i], p2y[i], p2x[i + 1], p2y[i + 1], WHITE); + tft.drawLine(p2x[i + 4], p2y[i + 4], p2x[i + 5], p2y[i + 5], WHITE); + tft.drawLine(p2x[i], p2y[i], p2x[i + 4], p2y[i + 4], WHITE); + } + tft.drawLine(p2x[3], p2y[3], p2x[0], p2y[0], WHITE); + tft.drawLine(p2x[7], p2y[7], p2x[4], p2y[4], WHITE); + tft.drawLine(p2x[3], p2y[3], p2x[7], p2y[7], WHITE); + + r[0] = r[0] + 1; + r[1] = r[1] + 1; + if (r[0] == 36) r[0] = 0; + if (r[1] == 36) r[1] = 0; + if (r[2] == 36) r[2] = 0; + for (int i = 0; i < 8; i++) + { + float px2 = px[i]; + float py2 = cos_d[r[0]] * py[i] - sin_d[r[0]] * pz[i]; + float pz2 = sin_d[r[0]] * py[i] + cos_d[r[0]] * pz[i]; + + float px3 = cos_d[r[1]] * px2 + sin_d[r[1]] * pz2; + float py3 = py2; + float pz3 = -sin_d[r[1]] * px2 + cos_d[r[1]] * pz2; + + float ax = cos_d[r[2]] * px3 - sin_d[r[2]] * py3; + float ay = sin_d[r[2]] * px3 + cos_d[r[2]] * py3; + float az = pz3 - 190; + + p2x[i] = *x + ax * 500 / az; + p2y[i] = *y + ay * 500 / az; + } + + for (int i = 0; i < 3; i++) { + tft.drawLine(p2x[i], p2y[i], p2x[i + 1], p2y[i + 1], *color); + tft.drawLine(p2x[i + 4], p2y[i + 4], p2x[i + 5], p2y[i + 5], *color); + tft.drawLine(p2x[i], p2y[i], p2x[i + 4], p2y[i + 4], *color); + } + tft.drawLine(p2x[3], p2y[3], p2x[0], p2y[0], *color); + tft.drawLine(p2x[7], p2y[7], p2x[4], p2y[4], *color); + tft.drawLine(p2x[3], p2y[3], p2x[7], p2y[7], *color); +} + +static void vSqrtTask(void *pvParameters) { + while (1){ + Serial.println ("Starting Sqrt calculations..."); + uint16 x = 0; + uint16 ixx[1001]; + // Library Sqrt + uint32_t t0 = millis(); + for (uint32_t n = 247583650 ; n > 247400000 ; n--) { + x = sqrt (n); + } + uint32_t t1 = millis() - t0; + Serial.print ("Sqrt calculations took (ms): "); + Serial.println (t1); + delay (5000); + } +} + +void setup() { + // initialize the digital pin as an output: + Serial.begin(9600); + delay (5000); + Serial.println ("Running..."); + pinMode(BOARD_LED_PIN, OUTPUT); + tft.begin(); + tft.fillScreen(WHITE); + cube1_x = ((tft.width()) / 4); + cube1_y = ((tft.height()) / 4); + cube2_x = ((tft.width()) / 2); + cube2_y = ((tft.height()) / 2); + cube1_color = BLACK; + cube2_color = RED; + vSemaphoreCreateBinary(xDisplayFree); + xTaskCreate(vLEDFlashTask, + "Task1", + configMINIMAL_STACK_SIZE, + NULL, + tskIDLE_PRIORITY + 2, + NULL); + xTaskCreate(vCube1LoopTask, + "Cube1", + configMINIMAL_STACK_SIZE, + NULL, + tskIDLE_PRIORITY + 2, + NULL); + xTaskCreate(vCube2LoopTask, + "Cube2", + configMINIMAL_STACK_SIZE, + NULL, + tskIDLE_PRIORITY+1, + NULL); + xTaskCreate(vSqrtTask, + "Sqrt", + configMINIMAL_STACK_SIZE, + NULL, + tskIDLE_PRIORITY, + NULL); + vTaskStartScheduler(); +} + +void loop() { + // Do not write any code here, it would not execute. +} + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/FreeRTOS.h b/STM32F1/libraries/FreeRTOS900/utility/FreeRTOS.h new file mode 100644 index 000000000..f81172dbe --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/FreeRTOS.h @@ -0,0 +1,1063 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef INC_FREERTOS_H +#define INC_FREERTOS_H + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include + +/* + * If stdint.h cannot be located then: + * + If using GCC ensure the -nostdint options is *not* being used. + * + Ensure the project's include path includes the directory in which your + * compiler stores stdint.h. + * + Set any compiler options necessary for it to support C99, as technically + * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any + * other way). + * + The FreeRTOS download includes a simple stdint.h definition that can be + * used in cases where none is provided by the compiler. The files only + * contains the typedefs required to build FreeRTOS. Read the instructions + * in FreeRTOS/source/stdint.readme for more information. + */ +#include /* READ COMMENT ABOVE. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Definitions specific to the port being used. */ +#include "portable.h" + +/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ +#ifndef configUSE_NEWLIB_REENTRANT + #define configUSE_NEWLIB_REENTRANT 0 +#endif + +/* Required if struct _reent is used. */ +#if ( configUSE_NEWLIB_REENTRANT == 1 ) + #include +#endif +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#ifndef configMINIMAL_STACK_SIZE + #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. +#endif + +#ifndef configMAX_PRIORITIES + #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_PREEMPTION + #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_IDLE_HOOK + #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_TICK_HOOK + #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_16_BIT_TICKS + #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configMAX_PRIORITIES + #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. +#endif + +#ifndef configUSE_CO_ROUTINES + #define configUSE_CO_ROUTINES 0 +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #define INCLUDE_vTaskPrioritySet 0 +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #define INCLUDE_uxTaskPriorityGet 0 +#endif + +#ifndef INCLUDE_vTaskDelete + #define INCLUDE_vTaskDelete 0 +#endif + +#ifndef INCLUDE_vTaskSuspend + #define INCLUDE_vTaskSuspend 0 +#endif + +#ifndef INCLUDE_vTaskDelayUntil + #define INCLUDE_vTaskDelayUntil 0 +#endif + +#ifndef INCLUDE_vTaskDelay + #define INCLUDE_vTaskDelay 0 +#endif + +#ifndef INCLUDE_xTaskGetIdleTaskHandle + #define INCLUDE_xTaskGetIdleTaskHandle 0 +#endif + +#ifndef INCLUDE_xTaskAbortDelay + #define INCLUDE_xTaskAbortDelay 0 +#endif + +#ifndef INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xQueueGetMutexHolder 0 +#endif + +#ifndef INCLUDE_xSemaphoreGetMutexHolder + #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder +#endif + +#ifndef INCLUDE_xTaskGetHandle + #define INCLUDE_xTaskGetHandle 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 0 +#endif + +#ifndef INCLUDE_eTaskGetState + #define INCLUDE_eTaskGetState 0 +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef INCLUDE_xTimerPendFunctionCall + #define INCLUDE_xTimerPendFunctionCall 0 +#endif + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 0 +#endif + +#if configUSE_CO_ROUTINES != 0 + #ifndef configMAX_CO_ROUTINE_PRIORITIES + #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. + #endif +#endif + +#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK + #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS + #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 +#endif + +#if configMAX_TASK_NAME_LEN < 1 + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h +#endif + +#ifndef configASSERT + #define configASSERT( x ) + #define configASSERT_DEFINED 0 +#else + #define configASSERT_DEFINED 1 +#endif + +/* The timers module relies on xTaskGetSchedulerState(). */ +#if configUSE_TIMERS == 1 + + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ + + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ + + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ + +#endif /* configUSE_TIMERS */ + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue +#endif + +#ifndef portCLEAN_UP_TCB + #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef portPRE_TASK_DELETE_HOOK + #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) +#endif + +#ifndef portSETUP_TCB + #define portSETUP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1 ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) + #define pcQueueGetName( xQueue ) +#endif + +#ifndef portPOINTER_SIZE_TYPE + #define portPOINTER_SIZE_TYPE uint32_t +#endif + +/* Remove any unused trace macros. */ +#ifndef traceSTART + /* Used to perform any necessary initialisation - for example, open a file + into which trace is to be written. */ + #define traceSTART() +#endif + +#ifndef traceEND + /* Use to close a trace, for example close a file into which trace has been + written. */ + #define traceEND() +#endif + +#ifndef traceTASK_SWITCHED_IN + /* Called after a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() +#endif + +#ifndef traceINCREASE_TICK_COUNT + /* Called before stepping the tick count after waking from tickless idle + sleep. */ + #define traceINCREASE_TICK_COUNT( x ) +#endif + +#ifndef traceLOW_POWER_IDLE_BEGIN + /* Called immediately before entering tickless idle. */ + #define traceLOW_POWER_IDLE_BEGIN() +#endif + +#ifndef traceLOW_POWER_IDLE_END + /* Called when returning to the Idle task after a tickless idle. */ + #define traceLOW_POWER_IDLE_END() +#endif + +#ifndef traceTASK_SWITCHED_OUT + /* Called before a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() +#endif + +#ifndef traceTASK_PRIORITY_INHERIT + /* Called when a task attempts to take a mutex that is already held by a + lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task + that holds the mutex. uxInheritedPriority is the priority the mutex holder + will inherit (the priority of the task that is attempting to obtain the + muted. */ + #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) +#endif + +#ifndef traceTASK_PRIORITY_DISINHERIT + /* Called when a task releases a mutex, the holding of which had resulted in + the task inheriting the priority of a higher priority task. + pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the + mutex. uxOriginalPriority is the task's configured (base) priority. */ + #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_RECEIVE + /* Task is about to block because it cannot read from a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the read was attempted. pxCurrentTCB points to the TCB of the + task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_SEND + /* Task is about to block because it cannot write to a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the write was attempted. pxCurrentTCB points to the TCB of the + task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 0 +#endif + +/* The following event macros are embedded in the kernel API calls. */ + +#ifndef traceMOVED_TASK_TO_READY_STATE + #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef tracePOST_MOVED_TASK_TO_READY_STATE + #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED( ucQueueType ) +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL( x ) +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef traceMALLOC + #define traceMALLOC( pvAddress, uiSize ) +#endif + +#ifndef traceFREE + #define traceFREE( pvAddress, uiSize ) +#endif + +#ifndef traceEVENT_GROUP_CREATE + #define traceEVENT_GROUP_CREATE( xEventGroup ) +#endif + +#ifndef traceEVENT_GROUP_CREATE_FAILED + #define traceEVENT_GROUP_CREATE_FAILED() +#endif + +#ifndef traceEVENT_GROUP_SYNC_BLOCK + #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_SYNC_END + #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK + #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_END + #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS + #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR + #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS + #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR + #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_DELETE + #define traceEVENT_GROUP_DELETE( xEventGroup ) +#endif + +#ifndef tracePEND_FUNC_CALL + #define tracePEND_FUNC_CALL(xFunctionToPend, pvParameter1, ulParameter2, ret) +#endif + +#ifndef tracePEND_FUNC_CALL_FROM_ISR + #define tracePEND_FUNC_CALL_FROM_ISR(xFunctionToPend, pvParameter1, ulParameter2, ret) +#endif + +#ifndef traceQUEUE_REGISTRY_ADD + #define traceQUEUE_REGISTRY_ADD(xQueue, pcQueueName) +#endif + +#ifndef traceTASK_NOTIFY_TAKE_BLOCK + #define traceTASK_NOTIFY_TAKE_BLOCK() +#endif + +#ifndef traceTASK_NOTIFY_TAKE + #define traceTASK_NOTIFY_TAKE() +#endif + +#ifndef traceTASK_NOTIFY_WAIT_BLOCK + #define traceTASK_NOTIFY_WAIT_BLOCK() +#endif + +#ifndef traceTASK_NOTIFY_WAIT + #define traceTASK_NOTIFY_WAIT() +#endif + +#ifndef traceTASK_NOTIFY + #define traceTASK_NOTIFY() +#endif + +#ifndef traceTASK_NOTIFY_FROM_ISR + #define traceTASK_NOTIFY_FROM_ISR() +#endif + +#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR + #define traceTASK_NOTIFY_GIVE_FROM_ISR() +#endif + +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 0 +#endif + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + +#endif /* configGENERATE_RUN_TIME_STATS */ + +#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef portSUPPRESS_TICKS_AND_SLEEP + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) +#endif + +#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP + #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 +#endif + +#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 + #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 +#endif + +#ifndef configUSE_TICKLESS_IDLE + #define configUSE_TICKLESS_IDLE 0 +#endif + +#ifndef configPRE_SLEEP_PROCESSING + #define configPRE_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPOST_SLEEP_PROCESSING + #define configPOST_SLEEP_PROCESSING( x ) +#endif + +#ifndef configUSE_QUEUE_SETS + #define configUSE_QUEUE_SETS 0 +#endif + +#ifndef portTASK_USES_FLOATING_POINT + #define portTASK_USES_FLOATING_POINT() +#endif + +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 +#endif + +#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#endif + +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#endif + +#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif + +#ifndef configUSE_TRACE_FACILITY + #define configUSE_TRACE_FACILITY 0 +#endif + +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +#ifndef mtCOVERAGE_TEST_DELAY + #define mtCOVERAGE_TEST_DELAY() +#endif + +#ifndef portASSERT_IF_IN_ISR + #define portASSERT_IF_IN_ISR() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#endif + +#ifndef configAPPLICATION_ALLOCATED_HEAP + #define configAPPLICATION_ALLOCATED_HEAP 0 +#endif + +#ifndef configUSE_TASK_NOTIFICATIONS + #define configUSE_TASK_NOTIFICATIONS 1 +#endif + +#ifndef portTICK_TYPE_IS_ATOMIC + #define portTICK_TYPE_IS_ATOMIC 0 +#endif + +#ifndef configSUPPORT_STATIC_ALLOCATION + /* Defaults to 0 for backward compatibility. */ + #define configSUPPORT_STATIC_ALLOCATION 0 +#endif + +#ifndef configSUPPORT_DYNAMIC_ALLOCATION + /* Defaults to 1 for backward compatibility. */ + #define configSUPPORT_DYNAMIC_ALLOCATION 1 +#endif + +/* Sanity check the configuration. */ +#if( configUSE_TICKLESS_IDLE != 0 ) + #if( INCLUDE_vTaskSuspend != 1 ) + #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 + #endif /* INCLUDE_vTaskSuspend */ +#endif /* configUSE_TICKLESS_IDLE */ + +#if( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) + #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. +#endif + +#if( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) + #error configUSE_MUTEXES must be set to 1 to use recursive mutexes +#endif + +#if( portTICK_TYPE_IS_ATOMIC == 0 ) + /* Either variables of tick type cannot be read atomically, or + portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when + the tick count is returned to the standard critical section macros. */ + #define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) +#else + /* The tick type can be read atomically, so critical sections used when the + tick count is returned can be defined away. */ + #define portTICK_TYPE_ENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x +#endif + +/* Definitions to allow backward compatibility with FreeRTOS versions prior to +V8 if desired. */ +#ifndef configENABLE_BACKWARD_COMPATIBILITY + #define configENABLE_BACKWARD_COMPATIBILITY 1 +#endif + +#if configENABLE_BACKWARD_COMPATIBILITY == 1 + #define eTaskStateGet eTaskGetState + #define portTickType TickType_t + #define xTaskHandle TaskHandle_t + #define xQueueHandle QueueHandle_t + #define xSemaphoreHandle SemaphoreHandle_t + #define xQueueSetHandle QueueSetHandle_t + #define xQueueSetMemberHandle QueueSetMemberHandle_t + #define xTimeOutType TimeOut_t + #define xMemoryRegion MemoryRegion_t + #define xTaskParameters TaskParameters_t + #define xTaskStatusType TaskStatus_t + #define xTimerHandle TimerHandle_t + #define xCoRoutineHandle CoRoutineHandle_t + #define pdTASK_HOOK_CODE TaskHookFunction_t + #define portTICK_RATE_MS portTICK_PERIOD_MS + #define pcTaskGetTaskName pcTaskGetName + #define pcTimerGetTimerName pcTimerGetName + #define pcQueueGetQueueName pcQueueGetName + #define vTaskGetTaskInfo vTaskGetInfo + + /* Backward compatibility within the scheduler code only - these definitions + are not really required but are included for completeness. */ + #define tmrTIMER_CALLBACK TimerCallbackFunction_t + #define pdTASK_CODE TaskFunction_t + #define xListItem ListItem_t + #define xList List_t +#endif /* configENABLE_BACKWARD_COMPATIBILITY */ + +#if( configUSE_ALTERNATIVE_API != 0 ) + #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 +#endif + +/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even +if floating point hardware is otherwise supported by the FreeRTOS port in use. +This constant is not supported by all FreeRTOS ports that include floating +point support. */ +#ifndef configUSE_TASK_FPU_SUPPORT + #define configUSE_TASK_FPU_SUPPORT 1 +#endif + +/* + * In line with software engineering best practice, FreeRTOS implements a strict + * data hiding policy, so the real structures used by FreeRTOS to maintain the + * state of tasks, queues, semaphores, etc. are not accessible to the application + * code. However, if the application writer wants to statically allocate such + * an object then the size of the object needs to be know. Dummy structures + * that are guaranteed to have the same size and alignment requirements of the + * real objects are used for this purpose. The dummy list and list item + * structures below are used for inclusion in such a dummy structure. + */ +struct xSTATIC_LIST_ITEM +{ + TickType_t xDummy1; + void *pvDummy2[ 4 ]; +}; +typedef struct xSTATIC_LIST_ITEM StaticListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +struct xSTATIC_MINI_LIST_ITEM +{ + TickType_t xDummy1; + void *pvDummy2[ 2 ]; +}; +typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +typedef struct xSTATIC_LIST +{ + UBaseType_t uxDummy1; + void *pvDummy2; + StaticMiniListItem_t xDummy3; +} StaticList_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Task structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a task then + * the size of the task object needs to be know. The StaticTask_t structure + * below is provided for this purpose. Its sizes and alignment requirements are + * guaranteed to match those of the genuine structure, no matter which + * architecture is being used, and no matter how the values in FreeRTOSConfig.h + * are set. Its contents are somewhat obfuscated in the hope users will + * recognise that it would be unwise to make direct use of the structure members. + */ +typedef struct xSTATIC_TCB +{ + void *pxDummy1; + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xDummy2; + #endif + StaticListItem_t xDummy3[ 2 ]; + UBaseType_t uxDummy5; + void *pxDummy6; + uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; + #if ( portSTACK_GROWTH > 0 ) + void *pxDummy8; + #endif + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxDummy9; + #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy10[ 2 ]; + #endif + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxDummy12[ 2 ]; + #endif + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void *pxDummy14; + #endif + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void *pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulDummy16; + #endif + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + struct _reent xDummy17; + #endif + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t ulDummy18; + uint8_t ucDummy19; + #endif + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t uxDummy20; + #endif + +} StaticTask_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Queue structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a queue + * then the size of the queue object needs to be know. The StaticQueue_t + * structure below is provided for this purpose. Its sizes and alignment + * requirements are guaranteed to match those of the genuine structure, no + * matter which architecture is being used, and no matter how the values in + * FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in the hope + * users will recognise that it would be unwise to make direct use of the + * structure members. + */ +typedef struct xSTATIC_QUEUE +{ + void *pvDummy1[ 3 ]; + + union + { + void *pvDummy2; + UBaseType_t uxDummy2; + } u; + + StaticList_t xDummy3[ 2 ]; + UBaseType_t uxDummy4[ 3 ]; + uint8_t ucDummy5[ 2 ]; + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy6; + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + void *pvDummy7; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy8; + uint8_t ucDummy9; + #endif + +} StaticQueue_t; +typedef StaticQueue_t StaticSemaphore_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the event group structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create an event group then the size of the event group object needs to be + * know. The StaticEventGroup_t structure below is provided for this purpose. + * Its sizes and alignment requirements are guaranteed to match those of the + * genuine structure, no matter which architecture is being used, and no matter + * how the values in FreeRTOSConfig.h are set. Its contents are somewhat + * obfuscated in the hope users will recognise that it would be unwise to make + * direct use of the structure members. + */ +typedef struct xSTATIC_EVENT_GROUP +{ + TickType_t xDummy1; + StaticList_t xDummy2; + + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy3; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy4; + #endif + +} StaticEventGroup_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the software timer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a software timer then the size of the queue object needs to be know. + * The StaticTimer_t structure below is provided for this purpose. Its sizes + * and alignment requirements are guaranteed to match those of the genuine + * structure, no matter which architecture is being used, and no matter how the + * values in FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in + * the hope users will recognise that it would be unwise to make direct use of + * the structure members. + */ +typedef struct xSTATIC_TIMER +{ + void *pvDummy1; + StaticListItem_t xDummy2; + TickType_t xDummy3; + UBaseType_t uxDummy4; + void *pvDummy5[ 2 ]; + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy6; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy7; + #endif + +} StaticTimer_t; + +#ifdef __cplusplus +} +#endif + +#endif /* INC_FREERTOS_H */ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/FreeRTOSConfig.h b/STM32F1/libraries/FreeRTOS900/utility/FreeRTOSConfig.h new file mode 100644 index 000000000..87d6c5d8a --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/FreeRTOSConfig.h @@ -0,0 +1,144 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) F_CPU ) +#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) +#define configMAX_PRIORITIES ( 5 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 120 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 16 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +#define configUSE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 0 +#define configGENERATE_RUN_TIME_STATS 0 + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + +/* This is the raw value as per the Cortex-M3 NVIC. Values can be 255 +(lowest) to 0 (1?) (highest). */ +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xb0, or priority 11. */ + + +/* This is the value being used as per the ST library which permits 16 +priority values, 0 to 15. This must correspond to the +configKERNEL_INTERRUPT_PRIORITY setting. Here 15 corresponds to the lowest +NVIC value of 255. */ +#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15 + +/*----------------------------------------------------------- + * UART configuration. + *-----------------------------------------------------------*/ +#define configCOM0_RX_BUFFER_LENGTH 128 +#define configCOM0_TX_BUFFER_LENGTH 128 +#define configCOM1_RX_BUFFER_LENGTH 128 +#define configCOM1_TX_BUFFER_LENGTH 128 + +#endif /* FREERTOS_CONFIG_H */ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_1.c b/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_1.c new file mode 100644 index 000000000..178ff7c32 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_1.c @@ -0,0 +1,174 @@ +/* + FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * The simplest possible implementation of pvPortMalloc(). Note that this + * implementation does NOT allow allocated memory to be freed again. + * + * See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* Allocate the memory for the heap. */ +static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +static size_t xNextFreeByte = ( size_t ) 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn = NULL; +static uint8_t *pucAlignedHeap = NULL; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + #if portBYTE_ALIGNMENT != 1 + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + #endif + + vTaskSuspendAll(); + { + if( pucAlignedHeap == NULL ) + { + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + } + + /* Check there is enough room left for the allocation. */ + if( ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) && + ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */ + { + /* Return the next free byte then increment the index past this + block. */ + pvReturn = pucAlignedHeap + xNextFreeByte; + xNextFreeByte += xWantedSize; + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and + heap_4.c for alternative implementations, and the memory management pages of + http://www.FreeRTOS.org for more information. */ + ( void ) pv; + + /* Force an assert as it is invalid to call this function. */ + configASSERT( pv == NULL ); +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* Only required when static memory is not cleared. */ + xNextFreeByte = ( size_t ) 0; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return ( configADJUSTED_HEAP_SIZE - xNextFreeByte ); +} + + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_2.c b/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_2.c new file mode 100644 index 000000000..a1a76747e --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_2.c @@ -0,0 +1,303 @@ +/* + FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that permits + * allocated blocks to be freed, but does not combine adjacent free blocks + * into a single larger block (and so will fragment memory). See heap_4.c for + * an equivalent that does combine adjacent blocks into single larger blocks. + * + * See heap_1.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* + * Initialises the heap structures before their first use. + */ +static void prvHeapInit( void ); + +/* Allocate the memory for the heap. */ +static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; + +/* Define the linked list structure. This is used to link free blocks in order +of their size. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + + +static const uint16_t heapSTRUCT_SIZE = ( ( sizeof ( BlockLink_t ) + ( portBYTE_ALIGNMENT - 1 ) ) & ~portBYTE_ALIGNMENT_MASK ); +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) ) + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart, xEnd; + +/* Keeps track of the number of free bytes remaining, but says nothing about +fragmentation. */ +static size_t xFreeBytesRemaining = configADJUSTED_HEAP_SIZE; + +/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */ + +/* + * Insert a block into the list of free blocks - which is ordered by size of + * the block. Small blocks at the start of the list and large blocks at the end + * of the list. + */ +#define prvInsertBlockIntoFreeList( pxBlockToInsert ) \ +{ \ +BlockLink_t *pxIterator; \ +size_t xBlockSize; \ + \ + xBlockSize = pxBlockToInsert->xBlockSize; \ + \ + /* Iterate through the list until a block is found that has a larger size */ \ + /* than the block we are inserting. */ \ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock ) \ + { \ + /* There is nothing to do here - just iterate to the correct position. */ \ + } \ + \ + /* Update the list to include the block being inserted in the correct */ \ + /* position. */ \ + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; \ + pxIterator->pxNextFreeBlock = pxBlockToInsert; \ +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +static BaseType_t xHeapHasBeenInitialised = pdFALSE; +void *pvReturn = NULL; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + initialisation to setup the list of free blocks. */ + if( xHeapHasBeenInitialised == pdFALSE ) + { + prvHeapInit(); + xHeapHasBeenInitialised = pdTRUE; + } + + /* The wanted size is increased so it can contain a BlockLink_t + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += heapSTRUCT_SIZE; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + } + + if( ( xWantedSize > 0 ) && ( xWantedSize < configADJUSTED_HEAP_SIZE ) ) + { + /* Blocks are stored in byte order - traverse the list from the start + (smallest) block until one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If we found the end marker then a block of adequate size was not found. */ + if( pxBlock != &xEnd ) + { + /* Return the memory space - jumping over the BlockLink_t structure + at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE ); + + /* This block is being returned for use so must be taken out of the + list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new block + following the number of bytes requested. The void cast is + used to prevent byte alignment warnings from the compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the single + block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + } + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + before it. */ + puc -= heapSTRUCT_SIZE; + + /* This unexpected casting is to keep some compilers from issuing + byte alignment warnings. */ + pxLink = ( void * ) puc; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + } + ( void ) xTaskResumeAll(); + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ +BlockLink_t *pxFirstFreeBlock; +uint8_t *pucAlignedHeap; + + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + + /* xStart is used to hold a pointer to the first item in the list of free + blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* xEnd is used to mark the end of the list of free blocks. */ + xEnd.xBlockSize = configADJUSTED_HEAP_SIZE; + xEnd.pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + entire heap space. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = configADJUSTED_HEAP_SIZE; + pxFirstFreeBlock->pxNextFreeBlock = &xEnd; +} +/*-----------------------------------------------------------*/ diff --git a/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_3.c b/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_3.c new file mode 100644 index 000000000..f3c49c06a --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_3.c @@ -0,0 +1,135 @@ +/* + FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Implementation of pvPortMalloc() and vPortFree() that relies on the + * compilers own malloc() and free() implementations. + * + * This file can only be used if the linker is configured to to generate + * a heap memory area. + * + * See heap_1.c, heap_2.c and heap_4.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ + +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = malloc( xWantedSize ); + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + if( pv ) + { + vTaskSuspendAll(); + { + free( pv ); + traceFREE( pv, 0 ); + } + ( void ) xTaskResumeAll(); + } +} + + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_4.c b/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_4.c new file mode 100644 index 000000000..8df0e9a79 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_4.c @@ -0,0 +1,474 @@ +/* + FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that combines + * (coalescences) adjacent memory blocks as they are freed, and in so doing + * limits memory fragmentation. + * + * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize * 2 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Allocate the memory for the heap. */ +#if( configAPPLICATION_ALLOCATED_HEAP == 1 ) + /* The application writer has already defined the array used for the RTOS + heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/* Define the linked list structure. This is used to link free blocks in order +of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ); + +/* + * Called automatically to setup the required heap structures the first time + * pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory +block must by correctly byte aligned. */ +static const size_t xHeapStructSize = ( ( sizeof( BlockLink_t ) + ( ( ( size_t ) portBYTE_ALIGNMENT_MASK ) - ( size_t ) 1 ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ) ); + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart, *pxEnd = NULL; + +/* Keeps track of the number of free bytes remaining, but says nothing about +fragmentation. */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize +member of an BlockLink_t structure is set then the block belongs to the +application. When the bit is free the block is still part of the free heap +space. */ +static size_t xBlockAllocatedBit = 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +void *pvReturn = NULL; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is + set. The top bit of the block size member of the BlockLink_t structure + is used to determine who owns the block - the application or the + kernel, so it must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number + of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size + was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + block following the number of bytes requested. The void + cast is used to prevent byte alignment warnings from the + compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + configASSERT( ( ( ( uint32_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the + single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + by the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + configASSERT( ( ( ( uint32_t ) pvReturn ) & portBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ +BlockLink_t *pxFirstFreeBlock; +uint8_t *pucAlignedHeap; +uint32_t ulAddress; +size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + ulAddress = ( uint32_t ) ucHeap; + + if( ( ulAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + ulAddress += ( portBYTE_ALIGNMENT - 1 ); + ulAddress &= ~( ( uint32_t ) portBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= ulAddress - ( uint32_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) ulAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + at the end of the heap space. */ + ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalHeapSize; + ulAddress -= xHeapStructSize; + ulAddress &= ~( ( uint32_t ) portBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) ulAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) +{ +BlockLink_t *pxIterator; +uint8_t *puc; + + /* Iterate through the list until a block is found that has a higher address + than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + before and the block after, then it's pxNextFreeBlock pointer will have + already been set, and should not be set here as that would make it point + to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} + diff --git a/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_5.c b/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_5.c new file mode 100644 index 000000000..b7bcaae20 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/MemMang/heap_5.c @@ -0,0 +1,523 @@ +/* + FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * A sample implementation of pvPortMalloc() that allows the heap to be defined + * across multiple non-contigous blocks and combines (coalescences) adjacent + * memory blocks as they are freed. + * + * See heap_1.c, heap_2.c, heap_3.c and heap_4.c for alternative + * implementations, and the memory management pages of http://www.FreeRTOS.org + * for more information. + * + * Usage notes: + * + * vPortDefineHeapRegions() ***must*** be called before pvPortMalloc(). + * pvPortMalloc() will be called if any task objects (tasks, queues, event + * groups, etc.) are created, therefore vPortDefineHeapRegions() ***must*** be + * called before any other objects are defined. + * + * vPortDefineHeapRegions() takes a single parameter. The parameter is an array + * of HeapRegion_t structures. HeapRegion_t is defined in portable.h as + * + * typedef struct HeapRegion + * { + * uint8_t *pucStartAddress; << Start address of a block of memory that will be part of the heap. + * size_t xSizeInBytes; << Size of the block of memory. + * } HeapRegion_t; + * + * The array is terminated using a NULL zero sized region definition, and the + * memory regions defined in the array ***must*** appear in address order from + * low address to high address. So the following is a valid example of how + * to use the function. + * + * HeapRegion_t xHeapRegions[] = + * { + * { ( uint8_t * ) 0x80000000UL, 0x10000 }, << Defines a block of 0x10000 bytes starting at address 0x80000000 + * { ( uint8_t * ) 0x90000000UL, 0xa0000 }, << Defines a block of 0xa0000 bytes starting at address of 0x90000000 + * { NULL, 0 } << Terminates the array. + * }; + * + * vPortDefineHeapRegions( xHeapRegions ); << Pass the array into vPortDefineHeapRegions(). + * + * Note 0x80000000 is the lower address so appears in the array first. + * + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( uxHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Define the linked list structure. This is used to link free blocks in order +of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ); + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory +block must by correctly byte aligned. */ +static const uint32_t uxHeapStructSize = ( ( sizeof ( BlockLink_t ) + ( portBYTE_ALIGNMENT - 1 ) ) & ~portBYTE_ALIGNMENT_MASK ); + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart, *pxEnd = NULL; + +/* Keeps track of the number of free bytes remaining, but says nothing about +fragmentation. */ +static size_t xFreeBytesRemaining = 0; +static size_t xMinimumEverFreeBytesRemaining = 0; + +/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize +member of an BlockLink_t structure is set then the block belongs to the +application. When the bit is free the block is still part of the free heap +space. */ +static size_t xBlockAllocatedBit = 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +void *pvReturn = NULL; + + /* The heap must be initialised before the first call to + prvPortMalloc(). */ + configASSERT( pxEnd ); + + vTaskSuspendAll(); + { + /* Check the requested block size is not so large that the top bit is + set. The top bit of the block size member of the BlockLink_t structure + is used to determine who owns the block - the application or the + kernel, so it must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += uxHeapStructSize; + + /* Ensure that blocks are always aligned to the required number + of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size + was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + uxHeapStructSize ); + + /* This block is being returned for use so must be taken out + of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + block following the number of bytes requested. The void + cast is used to prevent byte alignment warnings from the + compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the + single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + by the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + before it. */ + puc -= uxHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) +{ +BlockLink_t *pxIterator; +uint8_t *puc; + + /* Iterate through the list until a block is found that has a higher address + than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + before and the block after, then it's pxNextFreeBlock pointer will have + already been set, and should not be set here as that would make it point + to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) +{ +BlockLink_t *pxFirstFreeBlockInRegion = NULL, *pxPreviousFreeBlock; +uint8_t *pucAlignedHeap; +size_t xTotalRegionSize, xTotalHeapSize = 0; +BaseType_t xDefinedRegions = 0; +uint32_t ulAddress; +const HeapRegion_t *pxHeapRegion; + + /* Can only call once! */ + configASSERT( pxEnd == NULL ); + + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + + while( pxHeapRegion->xSizeInBytes > 0 ) + { + xTotalRegionSize = pxHeapRegion->xSizeInBytes; + + /* Ensure the heap region starts on a correctly aligned boundary. */ + ulAddress = ( uint32_t ) pxHeapRegion->pucStartAddress; + if( ( ulAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + ulAddress += ( portBYTE_ALIGNMENT - 1 ); + ulAddress &= ~portBYTE_ALIGNMENT_MASK; + + /* Adjust the size for the bytes lost to alignment. */ + xTotalRegionSize -= ulAddress - ( uint32_t ) pxHeapRegion->pucStartAddress; + } + + pucAlignedHeap = ( uint8_t * ) ulAddress; + + /* Set xStart if it has not already been set. */ + if( xDefinedRegions == 0 ) + { + /* xStart is used to hold a pointer to the first item in the list of + free blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( BlockLink_t * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + } + else + { + /* Should only get here if one region has already been added to the + heap. */ + configASSERT( pxEnd != NULL ); + + /* Check blocks are passed in with increasing start addresses. */ + configASSERT( ulAddress > ( uint32_t ) pxEnd ); + } + + /* Remember the location of the end marker in the previous region, if + any. */ + pxPreviousFreeBlock = pxEnd; + + /* pxEnd is used to mark the end of the list of free blocks and is + inserted at the end of the region space. */ + ulAddress = ( ( uint32_t ) pucAlignedHeap ) + xTotalRegionSize; + ulAddress -= uxHeapStructSize; + ulAddress &= ~portBYTE_ALIGNMENT_MASK; + pxEnd = ( BlockLink_t * ) ulAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block in this region that is + sized to take up the entire heap region minus the space taken by the + free block structure. */ + pxFirstFreeBlockInRegion = ( BlockLink_t * ) pucAlignedHeap; + pxFirstFreeBlockInRegion->xBlockSize = ulAddress - ( uint32_t ) pxFirstFreeBlockInRegion; + pxFirstFreeBlockInRegion->pxNextFreeBlock = pxEnd; + + /* If this is not the first region that makes up the entire heap space + then link the previous region to this region. */ + if( pxPreviousFreeBlock != NULL ) + { + pxPreviousFreeBlock->pxNextFreeBlock = pxFirstFreeBlockInRegion; + } + + xTotalHeapSize += pxFirstFreeBlockInRegion->xBlockSize; + + /* Move onto the next HeapRegion_t structure. */ + xDefinedRegions++; + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + } + + xMinimumEverFreeBytesRemaining = xTotalHeapSize; + xFreeBytesRemaining = xTotalHeapSize; + + /* Check something was actually defined before it is accessed. */ + configASSERT( xTotalHeapSize ); + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); +} + diff --git a/STM32F1/libraries/FreeRTOS900/utility/StackMacros.h b/STM32F1/libraries/FreeRTOS900/utility/StackMacros.h new file mode 100644 index 000000000..13c6b829b --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/StackMacros.h @@ -0,0 +1,171 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef STACK_MACROS_H +#define STACK_MACROS_H + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ + const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \ + \ + if( ( pulStack[ 0 ] != ulCheckValue ) || \ + ( pulStack[ 1 ] != ulCheckValue ) || \ + ( pulStack[ 2 ] != ulCheckValue ) || \ + ( pulStack[ 3 ] != ulCheckValue ) ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ + static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +/* Remove stack overflow macro if not being used. */ +#ifndef taskCHECK_FOR_STACK_OVERFLOW + #define taskCHECK_FOR_STACK_OVERFLOW() +#endif + + + +#endif /* STACK_MACROS_H */ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/croutine.c b/STM32F1/libraries/FreeRTOS900/utility/croutine.c new file mode 100644 index 000000000..993e09b29 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/croutine.c @@ -0,0 +1,395 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +/* Remove the whole file is co-routines are not being used. */ +#if( configUSE_CO_ROUTINES != 0 ) + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + + +/* Lists for ready and blocked co-routines. --------------------*/ +static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ +static List_t xDelayedCoRoutineList1; /*< Delayed co-routines. */ +static List_t xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ +static List_t * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */ +static List_t * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ +static List_t xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ + +/* Other file private variables. --------------------------------*/ +CRCB_t * pxCurrentCoRoutine = NULL; +static UBaseType_t uxTopCoRoutineReadyPriority = 0; +static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; + +/* The initial state of the co-routine when it is created. */ +#define corINITIAL_STATE ( 0 ) + +/* + * Place the co-routine represented by pxCRCB into the appropriate ready queue + * for the priority. It is inserted at the end of the list. + * + * This macro accesses the co-routine ready lists and therefore must not be + * used from within an ISR. + */ +#define prvAddCoRoutineToReadyQueue( pxCRCB ) \ +{ \ + if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ + { \ + uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ + } \ + vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ +} + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first co-routine. + */ +static void prvInitialiseCoRoutineLists( void ); + +/* + * Co-routines that are readied by an interrupt cannot be placed directly into + * the ready lists (there is no mutual exclusion). Instead they are placed in + * in the pending ready list in order that they can later be moved to the ready + * list by the co-routine scheduler. + */ +static void prvCheckPendingReadyList( void ); + +/* + * Macro that looks at the list of co-routines that are currently delayed to + * see if any require waking. + * + * Co-routines are stored in the queue in the order of their wake time - + * meaning once one co-routine has been found whose timer has not expired + * we need not look any further down the list. + */ +static void prvCheckDelayedList( void ); + +/*-----------------------------------------------------------*/ + +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ) +{ +BaseType_t xReturn; +CRCB_t *pxCoRoutine; + + /* Allocate the memory that will store the co-routine control block. */ + pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); + if( pxCoRoutine ) + { + /* If pxCurrentCoRoutine is NULL then this is the first co-routine to + be created and the co-routine data structures need initialising. */ + if( pxCurrentCoRoutine == NULL ) + { + pxCurrentCoRoutine = pxCoRoutine; + prvInitialiseCoRoutineLists(); + } + + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } + + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + + /* Set the co-routine control block as a link back from the ListItem_t. + This is so we can get back to the containing CRCB from a generic item + in a list. */ + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); + + /* Now the co-routine has been initialised it can be added to the ready + list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ) +{ +TickType_t xTimeToWake; + + /* Calculate the time to wake - this may overflow but this is + not a problem. */ + xTimeToWake = xCoRoutineTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xCoRoutineTickCount ) + { + /* Wake time has overflowed. Place this item in the + overflow list. */ + vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the + current block list. */ + vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + + if( pxEventList ) + { + /* Also add the co-routine to an event list. If this is done then the + function must be called with interrupts disabled. */ + vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckPendingReadyList( void ) +{ + /* Are there any co-routines waiting to get moved to the ready list? These + are co-routines that have been readied by an ISR. The ISR cannot access + the ready lists itself. */ + while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) + { + CRCB_t *pxUnblockedCRCB; + + /* The pending ready list can be accessed by an ISR. */ + portDISABLE_INTERRUPTS(); + { + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + } + portENABLE_INTERRUPTS(); + + ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckDelayedList( void ) +{ +CRCB_t *pxCRCB; + + xPassedTicks = xTaskGetTickCount() - xLastTickCount; + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; + + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + List_t * pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. If there are + any items in pxDelayedCoRoutineList here then there is an error! */ + pxTemp = pxDelayedCoRoutineList; + pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; + pxOverflowDelayedCoRoutineList = pxTemp; + } + + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } + + portDISABLE_INTERRUPTS(); + { + /* The event could have occurred just before this critical + section. If this is the case then the generic list item will + have been moved to the pending ready list and the following + line is still valid. Also the pvContainer parameter will have + been set to NULL so the following lines are also valid. */ + ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) ); + + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pvContainer ) + { + ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); + + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineSchedule( void ) +{ + /* See if any co-routines readied by events need moving to the ready lists. */ + prvCheckPendingReadyList(); + + /* See if any delayed co-routines have timed out. */ + prvCheckDelayedList(); + + /* Find the highest priority queue that contains ready co-routines. */ + while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) + { + if( uxTopCoRoutineReadyPriority == 0 ) + { + /* No more co-routines to check. */ + return; + } + --uxTopCoRoutineReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines + of the same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); + + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + + return; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseCoRoutineLists( void ) +{ +UBaseType_t uxPriority; + + for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + } + + vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList ); + + /* Start with pxDelayedCoRoutineList using list1 and the + pxOverflowDelayedCoRoutineList using list2. */ + pxDelayedCoRoutineList = &xDelayedCoRoutineList1; + pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; +} +/*-----------------------------------------------------------*/ + +BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ) +{ +CRCB_t *pxUnblockedCRCB; +BaseType_t xReturn; + + /* This function is called from within an interrupt. It can only access + event lists and the pending ready list. This function assumes that a + check has already been made to ensure pxEventList is not empty. */ + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + + if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} + +#endif /* configUSE_CO_ROUTINES == 0 */ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/croutine.h b/STM32F1/libraries/FreeRTOS900/utility/croutine.h new file mode 100644 index 000000000..4f003a0ba --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/croutine.h @@ -0,0 +1,762 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef CO_ROUTINE_H +#define CO_ROUTINE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include croutine.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Used to hide the implementation of the co-routine control block. The +control block structure however has to be included in the header due to +the macro implementation of the co-routine functionality. */ +typedef void * CoRoutineHandle_t; + +/* Defines the prototype to which co-routine functions must conform. */ +typedef void (*crCOROUTINE_CODE)( CoRoutineHandle_t, UBaseType_t ); + +typedef struct corCoRoutineControlBlock +{ + crCOROUTINE_CODE pxCoRoutineFunction; + ListItem_t xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ + ListItem_t xEventListItem; /*< List item used to place the CRCB in event lists. */ + UBaseType_t uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ + UBaseType_t uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + uint16_t uxState; /*< Used internally by the co-routine implementation. */ +} CRCB_t; /* Co-routine control block. Note must be identical in size down to uxPriority with TCB_t. */ + +/** + * croutine. h + *
    + BaseType_t xCoRoutineCreate(
    +                                 crCOROUTINE_CODE pxCoRoutineCode,
    +                                 UBaseType_t uxPriority,
    +                                 UBaseType_t uxIndex
    +                               );
    + * + * Create a new co-routine and add it to the list of co-routines that are + * ready to run. + * + * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine + * functions require special syntax - see the co-routine section of the WEB + * documentation for more information. + * + * @param uxPriority The priority with respect to other co-routines at which + * the co-routine will run. + * + * @param uxIndex Used to distinguish between different co-routines that + * execute the same function. See the example below and the co-routine section + * of the WEB documentation for further information. + * + * @return pdPASS if the co-routine was successfully created and added to a ready + * list, otherwise an error code defined with ProjDefs.h. + * + * Example usage: +
    + // Co-routine to be created.
    + void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + // This may not be necessary for const variables.
    + static const char cLedToFlash[ 2 ] = { 5, 6 };
    + static const TickType_t uxFlashRates[ 2 ] = { 200, 400 };
    +
    +     // Must start every co-routine with a call to crSTART();
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +         // This co-routine just delays for a fixed period, then toggles
    +         // an LED.  Two co-routines are created using this function, so
    +         // the uxIndex parameter is used to tell the co-routine which
    +         // LED to flash and how int32_t to delay.  This assumes xQueue has
    +         // already been created.
    +         vParTestToggleLED( cLedToFlash[ uxIndex ] );
    +         crDELAY( xHandle, uxFlashRates[ uxIndex ] );
    +     }
    +
    +     // Must end every co-routine with a call to crEND();
    +     crEND();
    + }
    +
    + // Function that creates two co-routines.
    + void vOtherFunction( void )
    + {
    + uint8_t ucParameterToPass;
    + TaskHandle_t xHandle;
    +
    +     // Create two co-routines at priority 0.  The first is given index 0
    +     // so (from the code above) toggles LED 5 every 200 ticks.  The second
    +     // is given index 1 so toggles LED 6 every 400 ticks.
    +     for( uxIndex = 0; uxIndex < 2; uxIndex++ )
    +     {
    +         xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
    +     }
    + }
    +   
    + * \defgroup xCoRoutineCreate xCoRoutineCreate + * \ingroup Tasks + */ +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ); + + +/** + * croutine. h + *
    + void vCoRoutineSchedule( void );
    + * + * Run a co-routine. + * + * vCoRoutineSchedule() executes the highest priority co-routine that is able + * to run. The co-routine will execute until it either blocks, yields or is + * preempted by a task. Co-routines execute cooperatively so one + * co-routine cannot be preempted by another, but can be preempted by a task. + * + * If an application comprises of both tasks and co-routines then + * vCoRoutineSchedule should be called from the idle task (in an idle task + * hook). + * + * Example usage: +
    + // This idle task hook will schedule a co-routine each time it is called.
    + // The rest of the idle task will execute between co-routine calls.
    + void vApplicationIdleHook( void )
    + {
    +	vCoRoutineSchedule();
    + }
    +
    + // Alternatively, if you do not require any other part of the idle task to
    + // execute, the idle task hook can call vCoRoutineScheduler() within an
    + // infinite loop.
    + void vApplicationIdleHook( void )
    + {
    +    for( ;; )
    +    {
    +        vCoRoutineSchedule();
    +    }
    + }
    + 
    + * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * \ingroup Tasks + */ +void vCoRoutineSchedule( void ); + +/** + * croutine. h + *
    + crSTART( CoRoutineHandle_t xHandle );
    + * + * This macro MUST always be called at the start of a co-routine function. + * + * Example usage: +
    + // Co-routine to be created.
    + void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + static int32_t ulAVariable;
    +
    +     // Must start every co-routine with a call to crSTART();
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +          // Co-routine functionality goes here.
    +     }
    +
    +     // Must end every co-routine with a call to crEND();
    +     crEND();
    + }
    + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crSTART( pxCRCB ) switch( ( ( CRCB_t * )( pxCRCB ) )->uxState ) { case 0: + +/** + * croutine. h + *
    + crEND();
    + * + * This macro MUST always be called at the end of a co-routine function. + * + * Example usage: +
    + // Co-routine to be created.
    + void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + static int32_t ulAVariable;
    +
    +     // Must start every co-routine with a call to crSTART();
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +          // Co-routine functionality goes here.
    +     }
    +
    +     // Must end every co-routine with a call to crEND();
    +     crEND();
    + }
    + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crEND() } + +/* + * These macros are intended for internal use by the co-routine implementation + * only. The macros should not be used directly by application writers. + */ +#define crSET_STATE0( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2): +#define crSET_STATE1( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1): + +/** + * croutine. h + *
    + crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );
    + * + * Delay a co-routine for a fixed period of time. + * + * crDELAY can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * @param xHandle The handle of the co-routine to delay. This is the xHandle + * parameter of the co-routine function. + * + * @param xTickToDelay The number of ticks that the co-routine should delay + * for. The actual amount of time this equates to is defined by + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_PERIOD_MS + * can be used to convert ticks to milliseconds. + * + * Example usage: +
    + // Co-routine to be created.
    + void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + // This may not be necessary for const variables.
    + // We are to delay for 200ms.
    + static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS;
    +
    +     // Must start every co-routine with a call to crSTART();
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +        // Delay for 200ms.
    +        crDELAY( xHandle, xDelayTime );
    +
    +        // Do something here.
    +     }
    +
    +     // Must end every co-routine with a call to crEND();
    +     crEND();
    + }
    + * \defgroup crDELAY crDELAY + * \ingroup Tasks + */ +#define crDELAY( xHandle, xTicksToDelay ) \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); + +/** + *
    + crQUEUE_SEND(
    +                  CoRoutineHandle_t xHandle,
    +                  QueueHandle_t pxQueue,
    +                  void *pvItemToQueue,
    +                  TickType_t xTicksToWait,
    +                  BaseType_t *pxResult
    +             )
    + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_SEND can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue on which the data will be posted. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvItemToQueue A pointer to the data being posted onto the queue. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied from pvItemToQueue into the queue + * itself. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for space to become available on the queue, should space not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see example + * below). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully posted onto the queue, otherwise it will be set to an + * error defined within ProjDefs.h. + * + * Example usage: +
    + // Co-routine function that blocks for a fixed period then posts a number onto
    + // a queue.
    + static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + static BaseType_t xNumberToPost = 0;
    + static BaseType_t xResult;
    +
    +    // Co-routines must begin with a call to crSTART().
    +    crSTART( xHandle );
    +
    +    for( ;; )
    +    {
    +        // This assumes the queue has already been created.
    +        crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );
    +
    +        if( xResult != pdPASS )
    +        {
    +            // The message was not posted!
    +        }
    +
    +        // Increment the number to be posted onto the queue.
    +        xNumberToPost++;
    +
    +        // Delay for 100 ticks.
    +        crDELAY( xHandle, 100 );
    +    }
    +
    +    // Co-routines must end with a call to crEND().
    +    crEND();
    + }
    + * \defgroup crQUEUE_SEND crQUEUE_SEND + * \ingroup Tasks + */ +#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ + } \ + if( *pxResult == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *pxResult = pdPASS; \ + } \ +} + +/** + * croutine. h + *
    +  crQUEUE_RECEIVE(
    +                     CoRoutineHandle_t xHandle,
    +                     QueueHandle_t pxQueue,
    +                     void *pvBuffer,
    +                     TickType_t xTicksToWait,
    +                     BaseType_t *pxResult
    +                 )
    + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_RECEIVE can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue from which the data will be received. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvBuffer The buffer into which the received item is to be copied. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied into pvBuffer. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for data to become available from the queue, should data not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see the + * crQUEUE_SEND example). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully retrieved from the queue, otherwise it will be set to + * an error code as defined within ProjDefs.h. + * + * Example usage: +
    + // A co-routine receives the number of an LED to flash from a queue.  It
    + // blocks on the queue until the number is received.
    + static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + static BaseType_t xResult;
    + static UBaseType_t uxLEDToFlash;
    +
    +    // All co-routines must start with a call to crSTART().
    +    crSTART( xHandle );
    +
    +    for( ;; )
    +    {
    +        // Wait for data to become available on the queue.
    +        crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
    +
    +        if( xResult == pdPASS )
    +        {
    +            // We received the LED to flash - flash it!
    +            vParTestToggleLED( uxLEDToFlash );
    +        }
    +    }
    +
    +    crEND();
    + }
    + * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 ); \ + } \ + if( *( pxResult ) == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *( pxResult ) = pdPASS; \ + } \ +} + +/** + * croutine. h + *
    +  crQUEUE_SEND_FROM_ISR(
    +                            QueueHandle_t pxQueue,
    +                            void *pvItemToQueue,
    +                            BaseType_t xCoRoutinePreviouslyWoken
    +                       )
    + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue + * that is being used from within a co-routine. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto + * the same queue multiple times from a single interrupt. The first call + * should always pass in pdFALSE. Subsequent calls should pass in + * the value returned from the previous call. + * + * @return pdTRUE if a co-routine was woken by posting onto the queue. This is + * used by the ISR to determine if a context switch may be required following + * the ISR. + * + * Example usage: +
    + // A co-routine that blocks on a queue waiting for characters to be received.
    + static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + char cRxedChar;
    + BaseType_t xResult;
    +
    +     // All co-routines must start with a call to crSTART().
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +         // Wait for data to become available on the queue.  This assumes the
    +         // queue xCommsRxQueue has already been created!
    +         crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
    +
    +         // Was a character received?
    +         if( xResult == pdPASS )
    +         {
    +             // Process the character here.
    +         }
    +     }
    +
    +     // All co-routines must end with a call to crEND().
    +     crEND();
    + }
    +
    + // An ISR that uses a queue to send characters received on a serial port to
    + // a co-routine.
    + void vUART_ISR( void )
    + {
    + char cRxedChar;
    + BaseType_t xCRWokenByPost = pdFALSE;
    +
    +     // We loop around reading characters until there are none left in the UART.
    +     while( UART_RX_REG_NOT_EMPTY() )
    +     {
    +         // Obtain the character from the UART.
    +         cRxedChar = UART_RX_REG;
    +
    +         // Post the character onto a queue.  xCRWokenByPost will be pdFALSE
    +         // the first time around the loop.  If the post causes a co-routine
    +         // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.
    +         // In this manner we can ensure that if more than one co-routine is
    +         // blocked on the queue only one is woken by this ISR no matter how
    +         // many characters are posted to the queue.
    +         xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );
    +     }
    + }
    + * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) + + +/** + * croutine. h + *
    +  crQUEUE_SEND_FROM_ISR(
    +                            QueueHandle_t pxQueue,
    +                            void *pvBuffer,
    +                            BaseType_t * pxCoRoutineWoken
    +                       )
    + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data + * from a queue that is being used from within a co-routine (a co-routine + * posted to the queue). + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvBuffer A pointer to a buffer into which the received item will be + * placed. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from the queue into + * pvBuffer. + * + * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become + * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a + * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise + * *pxCoRoutineWoken will remain unchanged. + * + * @return pdTRUE an item was successfully received from the queue, otherwise + * pdFALSE. + * + * Example usage: +
    + // A co-routine that posts a character to a queue then blocks for a fixed
    + // period.  The character is incremented each time.
    + static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // cChar holds its value while this co-routine is blocked and must therefore
    + // be declared static.
    + static char cCharToTx = 'a';
    + BaseType_t xResult;
    +
    +     // All co-routines must start with a call to crSTART().
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +         // Send the next character to the queue.
    +         crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );
    +
    +         if( xResult == pdPASS )
    +         {
    +             // The character was successfully posted to the queue.
    +         }
    +		 else
    +		 {
    +			// Could not post the character to the queue.
    +		 }
    +
    +         // Enable the UART Tx interrupt to cause an interrupt in this
    +		 // hypothetical UART.  The interrupt will obtain the character
    +		 // from the queue and send it.
    +		 ENABLE_RX_INTERRUPT();
    +
    +		 // Increment to the next character then block for a fixed period.
    +		 // cCharToTx will maintain its value across the delay as it is
    +		 // declared static.
    +		 cCharToTx++;
    +		 if( cCharToTx > 'x' )
    +		 {
    +			cCharToTx = 'a';
    +		 }
    +		 crDELAY( 100 );
    +     }
    +
    +     // All co-routines must end with a call to crEND().
    +     crEND();
    + }
    +
    + // An ISR that uses a queue to receive characters to send on a UART.
    + void vUART_ISR( void )
    + {
    + char cCharToTx;
    + BaseType_t xCRWokenByPost = pdFALSE;
    +
    +     while( UART_TX_REG_EMPTY() )
    +     {
    +         // Are there any characters in the queue waiting to be sent?
    +		 // xCRWokenByPost will automatically be set to pdTRUE if a co-routine
    +		 // is woken by the post - ensuring that only a single co-routine is
    +		 // woken no matter how many times we go around this loop.
    +         if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )
    +		 {
    +			 SEND_CHARACTER( cCharToTx );
    +		 }
    +     }
    + }
    + * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) + +/* + * This function is intended for internal use by the co-routine macros only. + * The macro nature of the co-routine implementation requires that the + * prototype appears here. The function should not be used by application + * writers. + * + * Removes the current co-routine from its ready list and places it in the + * appropriate delayed list. + */ +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ); + +/* + * This function is intended for internal use by the queue implementation only. + * The function should not be used by application writers. + * + * Removes the highest priority co-routine from the event list and places it in + * the pending ready list. + */ +BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ); + +#ifdef __cplusplus +} +#endif + +#endif /* CO_ROUTINE_H */ diff --git a/STM32F1/libraries/FreeRTOS900/utility/deprecated_definitions.h b/STM32F1/libraries/FreeRTOS900/utility/deprecated_definitions.h new file mode 100644 index 000000000..7c6721c6c --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/deprecated_definitions.h @@ -0,0 +1,321 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef DEPRECATED_DEFINITIONS_H +#define DEPRECATED_DEFINITIONS_H + + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a +pre-processor definition was used to ensure the pre-processor found the correct +portmacro.h file for the port being used. That scheme was deprecated in favour +of setting the compiler's include path such that it found the correct +portmacro.h file - removing the need for the constant and allowing the +portmacro.h file to be located anywhere in relation to the port being used. The +definitions below remain in the code for backward compatibility only. New +projects should not use them. */ + +#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT + #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef GCC_MEGA_AVR + #include "../portable/GCC/ATMega323/portmacro.h" +#endif + +#ifdef IAR_MEGA_AVR + #include "../portable/IAR/ATMega323/portmacro.h" +#endif + +#ifdef MPLAB_PIC24_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_DSPIC_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_PIC18F_PORT + #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" +#endif + +#ifdef MPLAB_PIC32MX_PORT + #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" +#endif + +#ifdef _FEDPICC + #include "libFreeRTOS/Include/portmacro.h" +#endif + +#ifdef SDCC_CYGNAL + #include "../../Source/portable/SDCC/Cygnal/portmacro.h" +#endif + +#ifdef GCC_ARM7 + #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" +#endif + +#ifdef GCC_ARM7_ECLIPSE + #include "portmacro.h" +#endif + +#ifdef ROWLEY_LPC23xx + #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" +#endif + +#ifdef IAR_MSP430 + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" +#endif + +#ifdef GCC_MSP430 + #include "../../Source/portable/GCC/MSP430F449/portmacro.h" +#endif + +#ifdef ROWLEY_MSP430 + #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" +#endif + +#ifdef ARM7_LPC21xx_KEIL_RVDS + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" +#endif + +#ifdef SAM7_GCC + #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" +#endif + +#ifdef SAM7_IAR + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" +#endif + +#ifdef SAM9XE_IAR + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" +#endif + +#ifdef LPC2000_IAR + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" +#endif + +#ifdef STR71X_IAR + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" +#endif + +#ifdef STR75X_IAR + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" +#endif + +#ifdef STR75X_GCC + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" +#endif + +#ifdef STR91X_IAR + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" +#endif + +#ifdef GCC_H8S + #include "../../Source/portable/GCC/H8S2329/portmacro.h" +#endif + +#ifdef GCC_AT91FR40008 + #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" +#endif + +#ifdef RVDS_ARMCM3_LM3S102 + #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3_LM3S102 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3 + #include "portmacro.h" +#endif + +#ifdef IAR_ARM_CM3 + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARMCM3_LM + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef HCS12_CODE_WARRIOR + #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" +#endif + +#ifdef MICROBLAZE_GCC + #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" +#endif + +#ifdef TERN_EE + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" +#endif + +#ifdef GCC_HCS12 + #include "../../Source/portable/GCC/HCS12/portmacro.h" +#endif + +#ifdef GCC_MCF5235 + #include "../../Source/portable/GCC/MCF5235/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_GCC + #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_CODEWARRIOR + #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" +#endif + +#ifdef GCC_PPC405 + #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" +#endif + +#ifdef GCC_PPC440 + #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" +#endif + +#ifdef _16FX_SOFTUNE + #include "..\..\Source\portable\Softune\MB96340\portmacro.h" +#endif + +#ifdef BCC_INDUSTRIAL_PC_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef BCC_FLASH_LITE_186_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef __GNUC__ + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif +#endif + +#ifdef __ICCAVR32__ + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif +#endif + +#ifdef __91467D + #include "portmacro.h" +#endif + +#ifdef __96340 + #include "portmacro.h" +#endif + + +#ifdef __IAR_V850ES_Fx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3_L__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Hx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3L__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#endif /* DEPRECATED_DEFINITIONS_H */ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/event_groups.c b/STM32F1/libraries/FreeRTOS900/utility/event_groups.c new file mode 100644 index 000000000..b8df5fd95 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/event_groups.c @@ -0,0 +1,752 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "event_groups.h" + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + +/* The following bit fields convey control information in a task's event list +item value. It is important they don't clash with the +taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */ +#if configUSE_16_BIT_TICKS == 1 + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U + #define eventWAIT_FOR_ALL_BITS 0x0400U + #define eventEVENT_BITS_CONTROL_BYTES 0xff00U +#else + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL + #define eventWAIT_FOR_ALL_BITS 0x04000000UL + #define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL +#endif + +typedef struct xEventGroupDefinition +{ + EventBits_t uxEventBits; + List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */ + + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupNumber; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */ + #endif +} EventGroup_t; + +/*-----------------------------------------------------------*/ + +/* + * Test the bits set in uxCurrentEventBits to see if the wait condition is met. + * The wait condition is defined by xWaitForAllBits. If xWaitForAllBits is + * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor + * are also set in uxCurrentEventBits. If xWaitForAllBits is pdFALSE then the + * wait condition is met if any of the bits set in uxBitsToWait for are also set + * in uxCurrentEventBits. + */ +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) + { + EventGroup_t *pxEventBits; + + /* A StaticEventGroup_t object must be provided. */ + configASSERT( pxEventGroupBuffer ); + + /* The user has provided a statically allocated event group - use it. */ + pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 EventGroup_t and StaticEventGroup_t are guaranteed to have the same size and alignment requirement - checked by configASSERT(). */ + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note that + this event group was created statically in case the event group + is later deleted. */ + pxEventBits->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); + } + + return ( EventGroupHandle_t ) pxEventBits; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreate( void ) + { + EventGroup_t *pxEventBits; + + /* Allocate the event group. */ + pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note this + event group was allocated statically in case the event group is + later deleted. */ + pxEventBits->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); + } + + return ( EventGroupHandle_t ) pxEventBits; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) +{ +EventBits_t uxOriginalBitValue, uxReturn; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +BaseType_t xAlreadyYielded; +BaseType_t xTimeoutOccurred = pdFALSE; + + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + uxOriginalBitValue = pxEventBits->uxEventBits; + + ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet ); + + if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + /* All the rendezvous bits are now set - no need to block. */ + uxReturn = ( uxOriginalBitValue | uxBitsToSet ); + + /* Rendezvous always clear the bits. They will have been cleared + already unless this is the only task in the rendezvous. */ + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + + xTicksToWait = 0; + } + else + { + if( xTicksToWait != ( TickType_t ) 0 ) + { + traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ); + + /* Store the bits that the calling task is waiting for in the + task's event list item so the kernel knows when a match is + found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait ); + + /* This assignment is obsolete as uxReturn will get set after + the task unblocks, but some compilers mistakenly generate a + warning about uxReturn being returned without being set if the + assignment is omitted. */ + uxReturn = 0; + } + else + { + /* The rendezvous bits were not set, but no block time was + specified - just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + } + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + point either the required bits were set or the block time expired. If + the required bits were set they will have been stored in the task's + event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + /* The task timed out, just return the current event bit value. */ + taskENTER_CRITICAL(); + { + uxReturn = pxEventBits->uxEventBits; + + /* Although the task got here because it timed out before the + bits it was waiting for were set, it is possible that since it + unblocked another task has set the bits. If this is the case + then it needs to clear the bits before exiting. */ + if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* Control bits might be set as the task had blocked should not be + returned. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + + traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn, uxControlBits = 0; +BaseType_t xWaitConditionMet, xAlreadyYielded; +BaseType_t xTimeoutOccurred = pdFALSE; + + /* Check the user is not attempting to wait on the bits used by the kernel + itself, and that at least one bit is being requested. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits; + + /* Check to see if the wait condition is already met or not. */ + xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits ); + + if( xWaitConditionMet != pdFALSE ) + { + /* The wait condition has already been met so there is no need to + block. */ + uxReturn = uxCurrentEventBits; + xTicksToWait = ( TickType_t ) 0; + + /* Clear the wait bits if requested to do so. */ + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The wait condition has not been met, but no block time was + specified, so just return the current value. */ + uxReturn = uxCurrentEventBits; + } + else + { + /* The task is going to block to wait for its required bits to be + set. uxControlBits are used to remember the specified behaviour of + this call to xEventGroupWaitBits() - for use when the event bits + unblock the task. */ + if( xClearOnExit != pdFALSE ) + { + uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xWaitForAllBits != pdFALSE ) + { + uxControlBits |= eventWAIT_FOR_ALL_BITS; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the bits that the calling task is waiting for in the + task's event list item so the kernel knows when a match is + found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait ); + + /* This is obsolete as it will get set after the task unblocks, but + some compilers mistakenly generate a warning about the variable + being returned without being set if it is not done. */ + uxReturn = 0; + + traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + point either the required bits were set or the block time expired. If + the required bits were set they will have been stored in the task's + event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + taskENTER_CRITICAL(); + { + /* The task timed out, just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + + /* It is possible that the event bits were updated between this + task leaving the Blocked state and running again. */ + if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE ) + { + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + /* Prevent compiler warnings when trace macros are not used. */ + xTimeoutOccurred = pdFALSE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* The task blocked so control bits may have been set. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn; + + /* Check the user is not attempting to clear the bits used by the kernel + itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + taskENTER_CRITICAL(); + { + traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ); + + /* The value returned is the event group value prior to the bits being + cleared. */ + uxReturn = pxEventBits->uxEventBits; + + /* Clear the bits. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) +{ +UBaseType_t uxSavedInterruptStatus; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + uxReturn = pxEventBits->uxEventBits; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +{ +ListItem_t *pxListItem, *pxNext; +ListItem_t const *pxListEnd; +List_t *pxList; +EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +BaseType_t xMatchFound = pdFALSE; + + /* Check the user is not attempting to set the bits used by the kernel + itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + pxList = &( pxEventBits->xTasksWaitingForBits ); + pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + vTaskSuspendAll(); + { + traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); + + pxListItem = listGET_HEAD_ENTRY( pxList ); + + /* Set the bits. */ + pxEventBits->uxEventBits |= uxBitsToSet; + + /* See if the new bit value should unblock any tasks. */ + while( pxListItem != pxListEnd ) + { + pxNext = listGET_NEXT( pxListItem ); + uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem ); + xMatchFound = pdFALSE; + + /* Split the bits waited for from the control bits. */ + uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES; + uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES; + + if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ) + { + /* Just looking for single bit being set. */ + if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 ) + { + xMatchFound = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor ) + { + /* All bits are set. */ + xMatchFound = pdTRUE; + } + else + { + /* Need all bits to be set, but not all the bits were set. */ + } + + if( xMatchFound != pdFALSE ) + { + /* The bits match. Should the bits be cleared on exit? */ + if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 ) + { + uxBitsToClear |= uxBitsWaitedFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the actual event flag value in the task's event list + item before removing the task from the event list. The + eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows + that is was unblocked due to its required bits matching, rather + than because it timed out. */ + ( void ) xTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + /* Move onto the next list item. Note pxListItem->pxNext is not + used here as the list item may have been removed from the event list + and inserted into the ready/pending reading list. */ + pxListItem = pxNext; + } + + /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT + bit was set in the control word. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + ( void ) xTaskResumeAll(); + + return pxEventBits->uxEventBits; +} +/*-----------------------------------------------------------*/ + +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); + + vTaskSuspendAll(); + { + traceEVENT_GROUP_DELETE( xEventGroup ); + + while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 ) + { + /* Unblock the task, returning 0 as the event list is being deleted + and cannot therefore have any bits set. */ + configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); + ( void ) xTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The event group can only have been allocated dynamically - free + it again. */ + vPortFree( pxEventBits ); + } + #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The event group could have been allocated statically or + dynamically, so check before attempting to free the memory. */ + if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxEventBits ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + ( void ) xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'set bits' command that was pended from +an interrupt. */ +void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) +{ + ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'clear bits' command that was pended from +an interrupt. */ +void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) +{ + ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) +{ +BaseType_t xWaitConditionMet = pdFALSE; + + if( xWaitForAllBits == pdFALSE ) + { + /* Task only has to wait for one bit within uxBitsToWaitFor to be + set. Is one already set? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Task has to wait for all the bits in uxBitsToWaitFor to be set. + Are they set already? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return xWaitConditionMet; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if (configUSE_TRACE_FACILITY == 1) + + UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) + { + UBaseType_t xReturn; + EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; + + if( xEventGroup == NULL ) + { + xReturn = 0; + } + else + { + xReturn = pxEventBits->uxEventGroupNumber; + } + + return xReturn; + } + +#endif + diff --git a/STM32F1/libraries/FreeRTOS900/utility/event_groups.h b/STM32F1/libraries/FreeRTOS900/utility/event_groups.h new file mode 100644 index 000000000..7331c91c2 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/event_groups.h @@ -0,0 +1,797 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef EVENT_GROUPS_H +#define EVENT_GROUPS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include event_groups.h" +#endif + +/* FreeRTOS includes. */ +#include "timers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * An event group is a collection of bits to which an application can assign a + * meaning. For example, an application may create an event group to convey + * the status of various CAN bus related events in which bit 0 might mean "A CAN + * message has been received and is ready for processing", bit 1 might mean "The + * application has queued a message that is ready for sending onto the CAN + * network", and bit 2 might mean "It is time to send a SYNC message onto the + * CAN network" etc. A task can then test the bit values to see which events + * are active, and optionally enter the Blocked state to wait for a specified + * bit or a group of specified bits to be active. To continue the CAN bus + * example, a CAN controlling task can enter the Blocked state (and therefore + * not consume any processing time) until either bit 0, bit 1 or bit 2 are + * active, at which time the bit that was actually active would inform the task + * which action it had to take (process a received message, send a message, or + * send a SYNC). + * + * The event groups implementation contains intelligence to avoid race + * conditions that would otherwise occur were an application to use a simple + * variable for the same purpose. This is particularly important with respect + * to when a bit within an event group is to be cleared, and when bits have to + * be set and then tested atomically - as is the case where event groups are + * used to create a synchronisation point between multiple tasks (a + * 'rendezvous'). + * + * \defgroup EventGroup + */ + + + +/** + * event_groups.h + * + * Type by which event groups are referenced. For example, a call to + * xEventGroupCreate() returns an EventGroupHandle_t variable that can then + * be used as a parameter to other event group functions. + * + * \defgroup EventGroupHandle_t EventGroupHandle_t + * \ingroup EventGroup + */ +typedef void * EventGroupHandle_t; + +/* + * The type that holds event bits always matches TickType_t - therefore the + * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1, + * 32 bits if set to 0. + * + * \defgroup EventBits_t EventBits_t + * \ingroup EventGroup + */ +typedef TickType_t EventBits_t; + +/** + * event_groups.h + *
    + EventGroupHandle_t xEventGroupCreate( void );
    + 
    + * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGropuCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see http://www.freertos.org/a00111.html). If an event group is created + * using xEventGropuCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @return If the event group was created then a handle to the event group is + * returned. If there was insufficient FreeRTOS heap available to create the + * event group then NULL is returned. See http://www.freertos.org/a00111.html + * + * Example usage: +
    +	// Declare a variable to hold the created event group.
    +	EventGroupHandle_t xCreatedEventGroup;
    +
    +	// Attempt to create the event group.
    +	xCreatedEventGroup = xEventGroupCreate();
    +
    +	// Was the event group created successfully?
    +	if( xCreatedEventGroup == NULL )
    +	{
    +		// The event group was not created because there was insufficient
    +		// FreeRTOS heap available.
    +	}
    +	else
    +	{
    +		// The event group was created.
    +	}
    +   
    + * \defgroup xEventGroupCreate xEventGroupCreate + * \ingroup EventGroup + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + *
    + EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer );
    + 
    + * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGropuCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see http://www.freertos.org/a00111.html). If an event group is created + * using xEventGropuCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type + * StaticEventGroup_t, which will be then be used to hold the event group's data + * structures, removing the need for the memory to be allocated dynamically. + * + * @return If the event group was created then a handle to the event group is + * returned. If pxEventGroupBuffer was NULL then NULL is returned. + * + * Example usage: +
    +	// StaticEventGroup_t is a publicly accessible structure that has the same
    +	// size and alignment requirements as the real event group structure.  It is
    +	// provided as a mechanism for applications to know the size of the event
    +	// group (which is dependent on the architecture and configuration file
    +	// settings) without breaking the strict data hiding policy by exposing the
    +	// real event group internals.  This StaticEventGroup_t variable is passed
    +	// into the xSemaphoreCreateEventGroupStatic() function and is used to store
    +	// the event group's data structures
    +	StaticEventGroup_t xEventGroupBuffer;
    +
    +	// Create the event group without dynamically allocating any memory.
    +	xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer );
    +   
    + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupWaitBits( 	EventGroupHandle_t xEventGroup,
    +										const EventBits_t uxBitsToWaitFor,
    +										const BaseType_t xClearOnExit,
    +										const BaseType_t xWaitForAllBits,
    +										const TickType_t xTicksToWait );
    + 
    + * + * [Potentially] block to wait for one or more bits to be set within a + * previously created event group. + * + * This function cannot be called from an interrupt. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and/or bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and/or bit 1 and/or bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within + * uxBitsToWaitFor that are set within the event group will be cleared before + * xEventGroupWaitBits() returns if the wait condition was met (if the function + * returns for a reason other than a timeout). If xClearOnExit is set to + * pdFALSE then the bits set in the event group are not altered when the call to + * xEventGroupWaitBits() returns. + * + * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then + * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor + * are set or the specified block time expires. If xWaitForAllBits is set to + * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set + * in uxBitsToWaitFor is set or the specified block time expires. The block + * time is specified by the xTicksToWait parameter. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for one/all (depending on the xWaitForAllBits value) of the bits specified by + * uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupWaitBits() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupWaitBits() returned because the bits it was waiting for were set + * then the returned value is the event group value before any bits were + * automatically cleared in the case that xClearOnExit parameter was set to + * pdTRUE. + * + * Example usage: +
    +   #define BIT_0	( 1 << 0 )
    +   #define BIT_4	( 1 << 4 )
    +
    +   void aFunction( EventGroupHandle_t xEventGroup )
    +   {
    +   EventBits_t uxBits;
    +   const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
    +
    +		// Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
    +		// the event group.  Clear the bits before exiting.
    +		uxBits = xEventGroupWaitBits(
    +					xEventGroup,	// The event group being tested.
    +					BIT_0 | BIT_4,	// The bits within the event group to wait for.
    +					pdTRUE,			// BIT_0 and BIT_4 should be cleared before returning.
    +					pdFALSE,		// Don't wait for both bits, either bit will do.
    +					xTicksToWait );	// Wait a maximum of 100ms for either bit to be set.
    +
    +		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
    +		{
    +			// xEventGroupWaitBits() returned because both bits were set.
    +		}
    +		else if( ( uxBits & BIT_0 ) != 0 )
    +		{
    +			// xEventGroupWaitBits() returned because just BIT_0 was set.
    +		}
    +		else if( ( uxBits & BIT_4 ) != 0 )
    +		{
    +			// xEventGroupWaitBits() returned because just BIT_4 was set.
    +		}
    +		else
    +		{
    +			// xEventGroupWaitBits() returned because xTicksToWait ticks passed
    +			// without either BIT_0 or BIT_4 becoming set.
    +		}
    +   }
    +   
    + * \defgroup xEventGroupWaitBits xEventGroupWaitBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
    + 
    + * + * Clear bits within an event group. This function cannot be called from an + * interrupt. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear + * in the event group. For example, to clear bit 3 only, set uxBitsToClear to + * 0x08. To clear bit 3 and bit 0 set uxBitsToClear to 0x09. + * + * @return The value of the event group before the specified bits were cleared. + * + * Example usage: +
    +   #define BIT_0	( 1 << 0 )
    +   #define BIT_4	( 1 << 4 )
    +
    +   void aFunction( EventGroupHandle_t xEventGroup )
    +   {
    +   EventBits_t uxBits;
    +
    +		// Clear bit 0 and bit 4 in xEventGroup.
    +		uxBits = xEventGroupClearBits(
    +								xEventGroup,	// The event group being updated.
    +								BIT_0 | BIT_4 );// The bits being cleared.
    +
    +		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
    +		{
    +			// Both bit 0 and bit 4 were set before xEventGroupClearBits() was
    +			// called.  Both will now be clear (not set).
    +		}
    +		else if( ( uxBits & BIT_0 ) != 0 )
    +		{
    +			// Bit 0 was set before xEventGroupClearBits() was called.  It will
    +			// now be clear.
    +		}
    +		else if( ( uxBits & BIT_4 ) != 0 )
    +		{
    +			// Bit 4 was set before xEventGroupClearBits() was called.  It will
    +			// now be clear.
    +		}
    +		else
    +		{
    +			// Neither bit 0 nor bit 4 were set in the first place.
    +		}
    +   }
    +   
    + * \defgroup xEventGroupClearBits xEventGroupClearBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
    +	BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
    + 
    + * + * A version of xEventGroupClearBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed + * while interrupts are disabled, so protects event groups that are accessed + * from tasks by suspending the scheduler rather than disabling interrupts. As + * a result event groups cannot be accessed directly from an interrupt service + * routine. Therefore xEventGroupClearBitsFromISR() sends a message to the + * timer task to have the clear operation performed in the context of the timer + * task. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. + * For example, to clear bit 3 only, set uxBitsToClear to 0x08. To clear bit 3 + * and bit 0 set uxBitsToClear to 0x09. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: +
    +   #define BIT_0	( 1 << 0 )
    +   #define BIT_4	( 1 << 4 )
    +
    +   // An event group which it is assumed has already been created by a call to
    +   // xEventGroupCreate().
    +   EventGroupHandle_t xEventGroup;
    +
    +   void anInterruptHandler( void )
    +   {
    +		// Clear bit 0 and bit 4 in xEventGroup.
    +		xResult = xEventGroupClearBitsFromISR(
    +							xEventGroup,	 // The event group being updated.
    +							BIT_0 | BIT_4 ); // The bits being set.
    +
    +		if( xResult == pdPASS )
    +		{
    +			// The message was posted successfully.
    +		}
    +  }
    +   
    + * \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR + * \ingroup EventGroup + */ +#if( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) +#endif + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
    + 
    + * + * Set bits within an event group. + * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() + * is a version that can be called from an interrupt. + * + * Setting bits in an event group will automatically unblock tasks that are + * blocked waiting for the bits. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @return The value of the event group at the time the call to + * xEventGroupSetBits() returns. There are two reasons why the returned value + * might have the bits specified by the uxBitsToSet parameter cleared. First, + * if setting a bit results in a task that was waiting for the bit leaving the + * blocked state then it is possible the bit will be cleared automatically + * (see the xClearBitOnExit parameter of xEventGroupWaitBits()). Second, any + * unblocked (or otherwise Ready state) task that has a priority above that of + * the task that called xEventGroupSetBits() will execute and may change the + * event group value before the call to xEventGroupSetBits() returns. + * + * Example usage: +
    +   #define BIT_0	( 1 << 0 )
    +   #define BIT_4	( 1 << 4 )
    +
    +   void aFunction( EventGroupHandle_t xEventGroup )
    +   {
    +   EventBits_t uxBits;
    +
    +		// Set bit 0 and bit 4 in xEventGroup.
    +		uxBits = xEventGroupSetBits(
    +							xEventGroup,	// The event group being updated.
    +							BIT_0 | BIT_4 );// The bits being set.
    +
    +		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
    +		{
    +			// Both bit 0 and bit 4 remained set when the function returned.
    +		}
    +		else if( ( uxBits & BIT_0 ) != 0 )
    +		{
    +			// Bit 0 remained set when the function returned, but bit 4 was
    +			// cleared.  It might be that bit 4 was cleared automatically as a
    +			// task that was waiting for bit 4 was removed from the Blocked
    +			// state.
    +		}
    +		else if( ( uxBits & BIT_4 ) != 0 )
    +		{
    +			// Bit 4 remained set when the function returned, but bit 0 was
    +			// cleared.  It might be that bit 0 was cleared automatically as a
    +			// task that was waiting for bit 0 was removed from the Blocked
    +			// state.
    +		}
    +		else
    +		{
    +			// Neither bit 0 nor bit 4 remained set.  It might be that a task
    +			// was waiting for both of the bits to be set, and the bits were
    +			// cleared as the task left the Blocked state.
    +		}
    +   }
    +   
    + * \defgroup xEventGroupSetBits xEventGroupSetBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
    +	BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );
    + 
    + * + * A version of xEventGroupSetBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed in + * interrupts or from critical sections. Therefore xEventGroupSetBitsFromISR() + * sends a message to the timer task to have the set operation performed in the + * context of the timer task - where a scheduler lock is used in place of a + * critical section. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task is higher than the priority of the + * currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE by + * xEventGroupSetBitsFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: +
    +   #define BIT_0	( 1 << 0 )
    +   #define BIT_4	( 1 << 4 )
    +
    +   // An event group which it is assumed has already been created by a call to
    +   // xEventGroupCreate().
    +   EventGroupHandle_t xEventGroup;
    +
    +   void anInterruptHandler( void )
    +   {
    +   BaseType_t xHigherPriorityTaskWoken, xResult;
    +
    +		// xHigherPriorityTaskWoken must be initialised to pdFALSE.
    +		xHigherPriorityTaskWoken = pdFALSE;
    +
    +		// Set bit 0 and bit 4 in xEventGroup.
    +		xResult = xEventGroupSetBitsFromISR(
    +							xEventGroup,	// The event group being updated.
    +							BIT_0 | BIT_4   // The bits being set.
    +							&xHigherPriorityTaskWoken );
    +
    +		// Was the message posted successfully?
    +		if( xResult == pdPASS )
    +		{
    +			// If xHigherPriorityTaskWoken is now set to pdTRUE then a context
    +			// switch should be requested.  The macro used is port specific and
    +			// will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -
    +			// refer to the documentation page for the port being used.
    +			portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
    +		}
    +  }
    +   
    + * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR + * \ingroup EventGroup + */ +#if( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) +#endif + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupSync(	EventGroupHandle_t xEventGroup,
    +									const EventBits_t uxBitsToSet,
    +									const EventBits_t uxBitsToWaitFor,
    +									TickType_t xTicksToWait );
    + 
    + * + * Atomically set bits within an event group, then wait for a combination of + * bits to be set within the same event group. This functionality is typically + * used to synchronise multiple tasks, where each task has to wait for the other + * tasks to reach a synchronisation point before proceeding. + * + * This function cannot be used from an interrupt. + * + * The function will return before its block time expires if the bits specified + * by the uxBitsToWait parameter are set, or become set within that time. In + * this case all the bits specified by uxBitsToWait will be automatically + * cleared before the function returns. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToSet The bits to set in the event group before determining + * if, and possibly waiting for, all the bits specified by the uxBitsToWait + * parameter are set. + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and bit 1 and bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for all of the bits specified by uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupSync() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupSync() returned because all the bits it was waiting for were + * set then the returned value is the event group value before any bits were + * automatically cleared. + * + * Example usage: +
    + // Bits used by the three tasks.
    + #define TASK_0_BIT		( 1 << 0 )
    + #define TASK_1_BIT		( 1 << 1 )
    + #define TASK_2_BIT		( 1 << 2 )
    +
    + #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )
    +
    + // Use an event group to synchronise three tasks.  It is assumed this event
    + // group has already been created elsewhere.
    + EventGroupHandle_t xEventBits;
    +
    + void vTask0( void *pvParameters )
    + {
    + EventBits_t uxReturn;
    + TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
    +
    +	 for( ;; )
    +	 {
    +		// Perform task functionality here.
    +
    +		// Set bit 0 in the event flag to note this task has reached the
    +		// sync point.  The other two tasks will set the other two bits defined
    +		// by ALL_SYNC_BITS.  All three tasks have reached the synchronisation
    +		// point when all the ALL_SYNC_BITS are set.  Wait a maximum of 100ms
    +		// for this to happen.
    +		uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );
    +
    +		if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
    +		{
    +			// All three tasks reached the synchronisation point before the call
    +			// to xEventGroupSync() timed out.
    +		}
    +	}
    + }
    +
    + void vTask1( void *pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		// Perform task functionality here.
    +
    +		// Set bit 1 in the event flag to note this task has reached the
    +		// synchronisation point.  The other two tasks will set the other two
    +		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
    +		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
    +		// indefinitely for this to happen.
    +		xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );
    +
    +		// xEventGroupSync() was called with an indefinite block time, so
    +		// this task will only reach here if the syncrhonisation was made by all
    +		// three tasks, so there is no need to test the return value.
    +	 }
    + }
    +
    + void vTask2( void *pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		// Perform task functionality here.
    +
    +		// Set bit 2 in the event flag to note this task has reached the
    +		// synchronisation point.  The other two tasks will set the other two
    +		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
    +		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
    +		// indefinitely for this to happen.
    +		xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );
    +
    +		// xEventGroupSync() was called with an indefinite block time, so
    +		// this task will only reach here if the syncrhonisation was made by all
    +		// three tasks, so there is no need to test the return value.
    +	}
    + }
    +
    + 
    + * \defgroup xEventGroupSync xEventGroupSync + * \ingroup EventGroup + */ +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
    + 
    + * + * Returns the current value of the bits in an event group. This function + * cannot be used from an interrupt. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBits() was called. + * + * \defgroup xEventGroupGetBits xEventGroupGetBits + * \ingroup EventGroup + */ +#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
    + 
    + * + * A version of xEventGroupGetBits() that can be called from an ISR. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. + * + * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR + * \ingroup EventGroup + */ +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
    +	void xEventGroupDelete( EventGroupHandle_t xEventGroup );
    + 
    + * + * Delete an event group that was previously created by a call to + * xEventGroupCreate(). Tasks that are blocked on the event group will be + * unblocked and obtain 0 as the event group's value. + * + * @param xEventGroup The event group being deleted. + */ +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/* For internal use only. */ +void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; +void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; + + +#if (configUSE_TRACE_FACILITY == 1) + UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT_GROUPS_H */ + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/heap_1.c b/STM32F1/libraries/FreeRTOS900/utility/heap_1.c new file mode 100644 index 000000000..178ff7c32 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/heap_1.c @@ -0,0 +1,174 @@ +/* + FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * The simplest possible implementation of pvPortMalloc(). Note that this + * implementation does NOT allow allocated memory to be freed again. + * + * See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* Allocate the memory for the heap. */ +static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +static size_t xNextFreeByte = ( size_t ) 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn = NULL; +static uint8_t *pucAlignedHeap = NULL; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + #if portBYTE_ALIGNMENT != 1 + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + #endif + + vTaskSuspendAll(); + { + if( pucAlignedHeap == NULL ) + { + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + } + + /* Check there is enough room left for the allocation. */ + if( ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) && + ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */ + { + /* Return the next free byte then increment the index past this + block. */ + pvReturn = pucAlignedHeap + xNextFreeByte; + xNextFreeByte += xWantedSize; + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and + heap_4.c for alternative implementations, and the memory management pages of + http://www.FreeRTOS.org for more information. */ + ( void ) pv; + + /* Force an assert as it is invalid to call this function. */ + configASSERT( pv == NULL ); +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* Only required when static memory is not cleared. */ + xNextFreeByte = ( size_t ) 0; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return ( configADJUSTED_HEAP_SIZE - xNextFreeByte ); +} + + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/list.c b/STM32F1/libraries/FreeRTOS900/utility/list.c new file mode 100644 index 000000000..5e207c160 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/list.c @@ -0,0 +1,240 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#include +#include "FreeRTOS.h" +#include "list.h" + +/*----------------------------------------------------------- + * PUBLIC LIST API documented in list.h + *----------------------------------------------------------*/ + +void vListInitialise( List_t * const pxList ) +{ + /* The list structure contains a list item which is used to mark the + end of the list. To initialise the list the list end is inserted + as the only list entry. */ + pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + /* The list end value is the highest possible value in the list to + ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; + + /* The list end next and previous pointers point to itself so we know + when the list is empty. */ + pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + pxList->uxNumberOfItems = ( UBaseType_t ) 0U; + + /* Write known values into the list if + configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); + listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); +} +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( ListItem_t * const pxItem ) +{ + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pvContainer = NULL; + + /* Write known values into the list item if + configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); +} +/*-----------------------------------------------------------*/ + +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) +{ +ListItem_t * const pxIndex = pxList->pxIndex; + + /* Only effective when configASSERT() is also defined, these tests may catch + the list data structures being overwritten in memory. They will not catch + data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert a new list item into pxList, but rather than sort the list, + makes the new list item the last item to be removed by a call to + listGET_OWNER_OF_NEXT_ENTRY(). */ + pxNewListItem->pxNext = pxIndex; + pxNewListItem->pxPrevious = pxIndex->pxPrevious; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + pxIndex->pxPrevious->pxNext = pxNewListItem; + pxIndex->pxPrevious = pxNewListItem; + + /* Remember which list the item is in. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) +{ +ListItem_t *pxIterator; +const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; + + /* Only effective when configASSERT() is also defined, these tests may catch + the list data structures being overwritten in memory. They will not catch + data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert the new list item into the list, sorted in xItemValue order. + + If the list already contains a list item with the same item value then the + new list item should be placed after it. This ensures that TCB's which are + stored in ready lists (all of which have the same xItemValue value) get a + share of the CPU. However, if the xItemValue is the same as the back marker + the iteration loop below will not end. Therefore the value is checked + first, and the algorithm slightly modified if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + { + pxIterator = pxList->xListEnd.pxPrevious; + } + else + { + /* *** NOTE *********************************************************** + If you find your application is crashing here then likely causes are + listed below. In addition see http://www.freertos.org/FAQHelp.html for + more tips, and ensure configASSERT() is defined! + http://www.freertos.org/a00110.html#configASSERT + + 1) Stack overflow - + see http://www.freertos.org/Stacks-and-stack-overflow-checking.html + 2) Incorrect interrupt priority assignment, especially on Cortex-M + parts where numerically high priority values denote low actual + interrupt priorities, which can seem counter intuitive. See + http://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition + of configMAX_SYSCALL_INTERRUPT_PRIORITY on + http://www.freertos.org/a00110.html + 3) Calling an API function from within a critical section or when + the scheduler is suspended, or calling an API function that does + not end in "FromISR" from an interrupt. + 4) Using a queue or semaphore before it has been initialised or + before the scheduler has been started (are interrupts firing + before vTaskStartScheduler() has been called?). + **********************************************************************/ + + for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + { + /* There is nothing to do here, just iterating to the wanted + insertion position. */ + } + } + + pxNewListItem->pxNext = pxIterator->pxNext; + pxNewListItem->pxNext->pxPrevious = pxNewListItem; + pxNewListItem->pxPrevious = pxIterator; + pxIterator->pxNext = pxNewListItem; + + /* Remember which list the item is in. This allows fast removal of the + item later. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) +{ +/* The list item knows which list it is in. Obtain the list from the list +item. */ +List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer; + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxItemToRemove->pvContainer = NULL; + ( pxList->uxNumberOfItems )--; + + return pxList->uxNumberOfItems; +} +/*-----------------------------------------------------------*/ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/list.h b/STM32F1/libraries/FreeRTOS900/utility/list.h new file mode 100644 index 000000000..a080d27de --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/list.h @@ -0,0 +1,453 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This is the list implementation used by the scheduler. While it is tailored + * heavily for the schedulers needs, it is also available for use by + * application code. + * + * list_ts can only store pointers to list_item_ts. Each ListItem_t contains a + * numeric value (xItemValue). Most of the time the lists are sorted in + * descending item value order. + * + * Lists are created already containing one list item. The value of this + * item is the maximum possible that can be stored, it is therefore always at + * the end of the list and acts as a marker. The list member pxHead always + * points to this marker - even though it is at the tail of the list. This + * is because the tail contains a wrap back pointer to the true head of + * the list. + * + * In addition to it's value, each list item contains a pointer to the next + * item in the list (pxNext), a pointer to the list it is in (pxContainer) + * and a pointer to back to the object that contains it. These later two + * pointers are included for efficiency of list manipulation. There is + * effectively a two way link between the object containing the list item and + * the list item itself. + * + * + * \page ListIntroduction List Implementation + * \ingroup FreeRTOSIntro + */ + +#ifndef INC_FREERTOS_H + #error FreeRTOS.h must be included before list.h +#endif + +#ifndef LIST_H +#define LIST_H + +/* + * The list structure members are modified from within interrupts, and therefore + * by rights should be declared volatile. However, they are only modified in a + * functionally atomic way (within critical sections of with the scheduler + * suspended) and are either passed by reference into a function or indexed via + * a volatile variable. Therefore, in all use cases tested so far, the volatile + * qualifier can be omitted in order to provide a moderate performance + * improvement without adversely affecting functional behaviour. The assembly + * instructions generated by the IAR, ARM and GCC compilers when the respective + * compiler's options were set for maximum optimisation has been inspected and + * deemed to be as intended. That said, as compiler technology advances, and + * especially if aggressive cross module optimisation is used (a use case that + * has not been exercised to any great extend) then it is feasible that the + * volatile qualifier will be needed for correct optimisation. It is expected + * that a compiler removing essential code because, without the volatile + * qualifier on the list structure members and with aggressive cross module + * optimisation, the compiler deemed the code unnecessary will result in + * complete and obvious failure of the scheduler. If this is ever experienced + * then the volatile qualifier can be inserted in the relevant places within the + * list structures by simply defining configLIST_VOLATILE to volatile in + * FreeRTOSConfig.h (as per the example at the bottom of this comment block). + * If configLIST_VOLATILE is not defined then the preprocessor directives below + * will simply #define configLIST_VOLATILE away completely. + * + * To use volatile list structure members then add the following line to + * FreeRTOSConfig.h (without the quotes): + * "#define configLIST_VOLATILE volatile" + */ +#ifndef configLIST_VOLATILE + #define configLIST_VOLATILE +#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Macros that can be used to place known values within the list structures, +then check that the known values do not get corrupted during the execution of +the application. These may catch the list data structures being overwritten in +memory. They will not catch data errors caused by incorrect configuration or +use of FreeRTOS.*/ +#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) + /* Define the macros to do nothing. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) + #define listTEST_LIST_INTEGRITY( pxList ) +#else + /* Define macros that add new members into the list structures. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; + + /* Define macros that set the new structure members to known values. */ + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + + /* Define macros that will assert if one of the structure members does not + contain its expected value. */ + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) + #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) +#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ + + +/* + * Definition of the only type of object that a list can contain. + */ +struct xLIST_ITEM +{ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ + struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */ + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */ + void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + void * configLIST_VOLATILE pvContainer; /*< Pointer to the list in which this list item is placed (if any). */ + listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +}; +typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */ + +struct xMINI_LIST_ITEM +{ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; + struct xLIST_ITEM * configLIST_VOLATILE pxNext; + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; +}; +typedef struct xMINI_LIST_ITEM MiniListItem_t; + +/* + * Definition of the type of queue used by the scheduler. + */ +typedef struct xLIST +{ + listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE UBaseType_t uxNumberOfItems; + ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ + MiniListItem_t xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ + listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +} List_t; + +/* + * Access macro to set the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) + +/* + * Access macro to get the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) + +/* + * Access macro to set the value of the list item. In most cases the value is + * used to sort the list in descending order. + * + * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) + +/* + * Access macro to retrieve the value of the list item. The value can + * represent anything - for example the priority of a task, or the time at + * which a task should be unblocked. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) + +/* + * Access macro to retrieve the value of the list item at the head of a given + * list. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_NEXT listGET_NEXT + * \ingroup LinkedList + */ +#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) + +/* + * Return the list item that marks the end of the list + * + * \page listGET_END_MARKER listGET_END_MARKER + * \ingroup LinkedList + */ +#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) + +/* + * Access macro to determine if a list contains any items. The macro will + * only have the value true if the list is empty. + * + * \page listLIST_IS_EMPTY listLIST_IS_EMPTY + * \ingroup LinkedList + */ +#define listLIST_IS_EMPTY( pxList ) ( ( BaseType_t ) ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ) + +/* + * Access macro to return the number of items in the list. + */ +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) + +/* + * Access function to obtain the owner of the next entry in a list. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list + * and returns that entry's pxOwner parameter. Using multiple calls to this + * function it is therefore possible to move through every item contained in + * a list. + * + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxTCB pxTCB is set to the address of the owner of the next list item. + * @param pxList The list from which the next item owner is to be returned. + * + * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ +{ \ +List_t * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ +} + + +/* + * Access function to obtain the owner of the first entry in a list. Lists + * are normally sorted in ascending item value order. + * + * This function returns the pxOwner member of the first item in the list. + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the owner of the head item is to be + * returned. + * + * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ) + +/* + * Check to see if a list item is within a list. The list item maintains a + * "container" pointer that points to the list it is in. All this macro does + * is check to see if the container and the list match. + * + * @param pxList The list we want to know if the list item is within. + * @param pxListItem The list item we want to know if is in the list. + * @return pdTRUE if the list item is in the list, otherwise pdFALSE. + */ +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( BaseType_t ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) ) + +/* + * Return the list a list item is contained within (referenced from). + * + * @param pxListItem The list item being queried. + * @return A pointer to the List_t object that references the pxListItem + */ +#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pvContainer ) + +/* + * This provides a crude means of knowing if a list has been initialised, as + * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() + * function. + */ +#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) + +/* + * Must be called before a list is used! This initialises all the members + * of the list structure and inserts the xListEnd item into the list as a + * marker to the back of the list. + * + * @param pxList Pointer to the list being initialised. + * + * \page vListInitialise vListInitialise + * \ingroup LinkedList + */ +void vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION; + +/* + * Must be called before a list item is used. This sets the list container to + * null so the item does not think that it is already contained in a list. + * + * @param pxItem Pointer to the list item being initialised. + * + * \page vListInitialiseItem vListInitialiseItem + * \ingroup LinkedList + */ +void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted into the list in + * a position determined by its item value (descending item value order). + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The item that is to be placed in the list. + * + * \page vListInsert vListInsert + * \ingroup LinkedList + */ +void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pxIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pxIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page vListInsertEnd vListInsertEnd + * \ingroup LinkedList + */ +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page uxListRemove uxListRemove + * \ingroup LinkedList + */ +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/STM32F1/libraries/FreeRTOS900/utility/mpu_prototypes.h b/STM32F1/libraries/FreeRTOS900/utility/mpu_prototypes.h new file mode 100644 index 000000000..8f7500b02 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/mpu_prototypes.h @@ -0,0 +1,177 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * When the MPU is used the standard (non MPU) API functions are mapped to + * equivalents that start "MPU_", the prototypes for which are defined in this + * header files. This will cause the application code to call the MPU_ version + * which wraps the non-MPU version with privilege promoting then demoting code, + * so the kernel code always runs will full privileges. + */ + + +#ifndef MPU_PROTOTYPES_H +#define MPU_PROTOTYPES_H + +/* MPU versions of tasks.h API function. */ +BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ); +TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer ); +BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ); +void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ); +void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ); +void MPU_vTaskDelay( const TickType_t xTicksToDelay ); +void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ); +BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ); +UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t xTask ); +eTaskState MPU_eTaskGetState( TaskHandle_t xTask ); +void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ); +void MPU_vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ); +void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ); +void MPU_vTaskResume( TaskHandle_t xTaskToResume ); +void MPU_vTaskStartScheduler( void ); +void MPU_vTaskSuspendAll( void ); +BaseType_t MPU_xTaskResumeAll( void ); +TickType_t MPU_xTaskGetTickCount( void ); +UBaseType_t MPU_uxTaskGetNumberOfTasks( void ); +char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ); +TaskHandle_t MPU_xTaskGetHandle( const char *pcNameToQuery ); +UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ); +void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ); +TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ); +void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ); +void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ); +BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ); +TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ); +UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ); +void MPU_vTaskList( char * pcWriteBuffer ); +void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer ); +BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ); +BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ); +uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); +BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ); +BaseType_t MPU_xTaskIncrementTick( void ); +TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ); +void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ); +BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ); +void MPU_vTaskMissedYield( void ); +BaseType_t MPU_xTaskGetSchedulerState( void ); + +/* MPU versions of queue.h API function. */ +BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ); +BaseType_t MPU_xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeek ); +UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ); +UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ); +void MPU_vQueueDelete( QueueHandle_t xQueue ); +QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ); +QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ); +QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ); +QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ); +void* MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ); +BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ); +BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ); +void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ); +void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ); +const char * MPU_pcQueueGetName( QueueHandle_t xQueue ); +QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ); +QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ); +QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ); +BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ); +BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ); +QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ); +BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ); +void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ); +UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ); +uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ); + +/* MPU versions of timers.h API function. */ +TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ); +TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t *pxTimerBuffer ); +void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ); +void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); +BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ); +TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ); +BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ); +const char * MPU_pcTimerGetName( TimerHandle_t xTimer ); +TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ); +TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ); +BaseType_t MPU_xTimerCreateTimerTask( void ); +BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ); + +/* MPU versions of event_group.h API function. */ +EventGroupHandle_t MPU_xEventGroupCreate( void ); +EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ); +EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ); +EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ); +EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); +EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ); +void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ); +UBaseType_t MPU_uxEventGroupGetNumber( void* xEventGroup ); + +#endif /* MPU_PROTOTYPES_H */ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/mpu_wrappers.h b/STM32F1/libraries/FreeRTOS900/utility/mpu_wrappers.h new file mode 100644 index 000000000..78f5a9aea --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/mpu_wrappers.h @@ -0,0 +1,201 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef MPU_WRAPPERS_H +#define MPU_WRAPPERS_H + +/* This file redefines API functions to be called through a wrapper macro, but +only for ports that are using the MPU. */ +#ifdef portUSING_MPU_WRAPPERS + + /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is + included from queue.c or task.c to prevent it from having an effect within + those files. */ + #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + + /* + * Map standard (non MPU) API functions to equivalents that start + * "MPU_". This will cause the application code to call the MPU_ + * version, which wraps the non-MPU version with privilege promoting + * then demoting code, so the kernel code always runs will full + * privileges. + */ + + /* Map standard tasks.h API functions to the MPU equivalents. */ + #define xTaskCreate MPU_xTaskCreate + #define xTaskCreateStatic MPU_xTaskCreateStatic + #define xTaskCreateRestricted MPU_xTaskCreateRestricted + #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions + #define vTaskDelete MPU_vTaskDelete + #define vTaskDelay MPU_vTaskDelay + #define vTaskDelayUntil MPU_vTaskDelayUntil + #define xTaskAbortDelay MPU_xTaskAbortDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define eTaskGetState MPU_eTaskGetState + #define vTaskGetInfo MPU_vTaskGetInfo + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define vTaskSuspend MPU_vTaskSuspend + #define vTaskResume MPU_vTaskResume + #define vTaskSuspendAll MPU_vTaskSuspendAll + #define xTaskResumeAll MPU_xTaskResumeAll + #define xTaskGetTickCount MPU_xTaskGetTickCount + #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks + #define pcTaskGetName MPU_pcTaskGetName + #define xTaskGetHandle MPU_xTaskGetHandle + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer + #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle + #define uxTaskGetSystemState MPU_uxTaskGetSystemState + #define vTaskList MPU_vTaskList + #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats + #define xTaskGenericNotify MPU_xTaskGenericNotify + #define xTaskNotifyWait MPU_xTaskNotifyWait + #define ulTaskNotifyTake MPU_ulTaskNotifyTake + #define xTaskNotifyStateClear MPU_xTaskNotifyStateClear + + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState + #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + + /* Map standard queue.h API functions to the MPU equivalents. */ + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueGenericReceive MPU_xQueueGenericReceive + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable + #define vQueueDelete MPU_vQueueDelete + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic + #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueGenericCreate MPU_xQueueGenericCreate + #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic + #define xQueueCreateSet MPU_xQueueCreateSet + #define xQueueAddToSet MPU_xQueueAddToSet + #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet + #define xQueueSelectFromSet MPU_xQueueSelectFromSet + #define xQueueGenericReset MPU_xQueueGenericReset + + #if( configQUEUE_REGISTRY_SIZE > 0 ) + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #define pcQueueGetName MPU_pcQueueGetName + #endif + + /* Map standard timer.h API functions to the MPU equivalents. */ + #define xTimerCreate MPU_xTimerCreate + #define xTimerCreateStatic MPU_xTimerCreateStatic + #define pvTimerGetTimerID MPU_pvTimerGetTimerID + #define vTimerSetTimerID MPU_vTimerSetTimerID + #define xTimerIsTimerActive MPU_xTimerIsTimerActive + #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle + #define xTimerPendFunctionCall MPU_xTimerPendFunctionCall + #define pcTimerGetName MPU_pcTimerGetName + #define xTimerGetPeriod MPU_xTimerGetPeriod + #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime + #define xTimerGenericCommand MPU_xTimerGenericCommand + + /* Map standard event_group.h API functions to the MPU equivalents. */ + #define xEventGroupCreate MPU_xEventGroupCreate + #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic + #define xEventGroupWaitBits MPU_xEventGroupWaitBits + #define xEventGroupClearBits MPU_xEventGroupClearBits + #define xEventGroupSetBits MPU_xEventGroupSetBits + #define xEventGroupSync MPU_xEventGroupSync + #define vEventGroupDelete MPU_vEventGroupDelete + + /* Remove the privileged function macro. */ + #define PRIVILEGED_FUNCTION + + #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + + /* Ensure API functions go in the privileged execution section. */ + #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) + #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) + + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +#else /* portUSING_MPU_WRAPPERS */ + + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define portUSING_MPU_WRAPPERS 0 + +#endif /* portUSING_MPU_WRAPPERS */ + + +#endif /* MPU_WRAPPERS_H */ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/port.c b/STM32F1/libraries/FreeRTOS900/utility/port.c new file mode 100644 index 000000000..6cfebe8d2 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/port.c @@ -0,0 +1,717 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is +defined. The value should also ensure backward compatibility. +FreeRTOS.org versions prior to V4.4.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__ (( naked )); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__ (( naked )); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +// !!! Maple +//void vPortSVCHandler( void ) +void __exc_svc( void ) +// !!! Maple +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " orr r14, #0xd \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + //vPortSetupTimerInterrupt(); + systick_attach_callback(&xPortSysTickHandler); + // !!! Maple + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + + // !!! Maple + //void xPortPendSVHandler( void ) + void __exc_pendsv( void ) + { + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " stmdb r0!, {r4-r11} \n" /* Save the remaining registers. */ + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n" /* Restore the context, including the critical nesting count. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n" /* Pop the registers. */ + " msr psp, r0 \n" + " isb \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __asm volatile( "cpsid i" ); + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __asm volatile( "dsb" ); + __asm volatile( "wfi" ); + __asm volatile( "isb" ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/portable.h b/STM32F1/libraries/FreeRTOS900/utility/portable.h new file mode 100644 index 000000000..b9f8be39d --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/portable.h @@ -0,0 +1,207 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Portable layer API. Each function must be defined for each port. + *----------------------------------------------------------*/ + +#ifndef PORTABLE_H +#define PORTABLE_H + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a +pre-processor definition was used to ensure the pre-processor found the correct +portmacro.h file for the port being used. That scheme was deprecated in favour +of setting the compiler's include path such that it found the correct +portmacro.h file - removing the need for the constant and allowing the +portmacro.h file to be located anywhere in relation to the port being used. +Purely for reasons of backward compatibility the old method is still valid, but +to make it clear that new projects should not use it, support for the port +specific constants has been moved into the deprecated_definitions.h header +file. */ +#include "deprecated_definitions.h" + +/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h +did not result in a portmacro.h header file being included - and it should be +included here. In this case the path to the correct portmacro.h header file +must be set in the compiler's include path. */ +#ifndef portENTER_CRITICAL + #include "portmacro.h" +#endif + +#if portBYTE_ALIGNMENT == 32 + #define portBYTE_ALIGNMENT_MASK ( 0x001f ) +#endif + +#if portBYTE_ALIGNMENT == 16 + #define portBYTE_ALIGNMENT_MASK ( 0x000f ) +#endif + +#if portBYTE_ALIGNMENT == 8 + #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) +#endif + +#if portBYTE_ALIGNMENT == 4 + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) +#endif + +#if portBYTE_ALIGNMENT == 2 + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) +#endif + +#if portBYTE_ALIGNMENT == 1 + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) +#endif + +#ifndef portBYTE_ALIGNMENT_MASK + #error "Invalid portBYTE_ALIGNMENT definition" +#endif + +#ifndef portNUM_CONFIGURABLE_REGIONS + #define portNUM_CONFIGURABLE_REGIONS 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mpu_wrappers.h" + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; +#else + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; +#endif + +/* Used by heap_5.c. */ +typedef struct HeapRegion +{ + uint8_t *pucStartAddress; + size_t xSizeInBytes; +} HeapRegion_t; + +/* + * Used to define multiple heap regions for use by heap_5.c. This function + * must be called before any calls to pvPortMalloc() - not creating a task, + * queue, semaphore, mutex, software timer, event group, etc. will result in + * pvPortMalloc being called. + * + * pxHeapRegions passes in an array of HeapRegion_t structures - each of which + * defines a region of memory that can be used as the heap. The array is + * terminated by a HeapRegions_t structure that has a size of 0. The region + * with the lowest start address must appear first in the array. + */ +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; + + +/* + * Map to the memory management routines required for the port. + */ +void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; +void vPortFree( void *pv ) PRIVILEGED_FUNCTION; +void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; +size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; +size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; + +/* + * Setup the hardware ready for the scheduler to take control. This generally + * sets up a tick interrupt and sets timers for the correct tick frequency. + */ +BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so + * the hardware is left in its original condition after the scheduler stops + * executing. + */ +void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTABLE_H */ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/portmacro.h b/STM32F1/libraries/FreeRTOS900/utility/portmacro.h new file mode 100644 index 000000000..d44fc9222 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/portmacro.h @@ -0,0 +1,284 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __asm volatile( "dsb" ); \ + __asm volatile( "isb" ); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n" \ + " msr basepri, %0 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n" \ + " mov %1, %2 \n" \ + " msr basepri, %1 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + ( + " msr basepri, %0 " :: "r" ( ulNewMaskValue ) + ); +} +/*-----------------------------------------------------------*/ + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/projdefs.h b/STM32F1/libraries/FreeRTOS900/utility/projdefs.h new file mode 100644 index 000000000..0b63fd8a9 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/projdefs.h @@ -0,0 +1,161 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PROJDEFS_H +#define PROJDEFS_H + +/* + * Defines the prototype to which task functions must conform. Defined in this + * file to ensure the type is known before portable.h is included. + */ +typedef void (*TaskFunction_t)( void * ); + +/* Converts a time in milliseconds to a time in ticks. This macro can be +overridden by a macro of the same name defined in FreeRTOSConfig.h in case the +definition here is not suitable for your application. */ +#ifndef pdMS_TO_TICKS + #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) ) +#endif + +#define pdFALSE ( ( BaseType_t ) 0 ) +#define pdTRUE ( ( BaseType_t ) 1 ) + +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) +#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) +#define errQUEUE_FULL ( ( BaseType_t ) 0 ) + +/* FreeRTOS error definitions. */ +#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) +#define errQUEUE_BLOCKED ( -4 ) +#define errQUEUE_YIELD ( -5 ) + +/* Macros used for basic data corruption checks. */ +#ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES + #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 +#endif + +#if( configUSE_16_BIT_TICKS == 1 ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a +#else + #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL +#endif + +/* The following errno values are used by FreeRTOS+ components, not FreeRTOS +itself. */ +#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ +#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ +#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */ +#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ +#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ +#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ +#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ +#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ +#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ +#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ +#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ +#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ +#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ +#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ +#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ +#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ +#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ +#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ +#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ +#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ +#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ +#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ +#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ +#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ +#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ +#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ +#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ +#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ +#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ +#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ +#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ +#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ +#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ +#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ +#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ +#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ +#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ +#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ +#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ + +/* The following endian values are used by FreeRTOS+ components, not FreeRTOS +itself. */ +#define pdFREERTOS_LITTLE_ENDIAN 0 +#define pdFREERTOS_BIG_ENDIAN 1 + +#endif /* PROJDEFS_H */ + + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/queue.c b/STM32F1/libraries/FreeRTOS900/utility/queue.c new file mode 100644 index 000000000..ce623bec2 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/queue.c @@ -0,0 +1,2566 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +#if ( configUSE_CO_ROUTINES == 1 ) + #include "croutine.h" +#endif + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + + +/* Constants used with the cRxLock and cTxLock structure members. */ +#define queueUNLOCKED ( ( int8_t ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( int8_t ) 0 ) + +/* When the Queue_t structure is used to represent a base queue its pcHead and +pcTail members are used as pointers into the queue storage area. When the +Queue_t structure is used to represent a mutex pcHead and pcTail pointers are +not necessary, and the pcHead pointer is set to NULL to indicate that the +pcTail pointer actually points to the mutex holder (if any). Map alternative +names to the pcHead and pcTail structure members to ensure the readability of +the code is maintained despite this dual use of two structure members. An +alternative implementation would be to use a union, but use of a union is +against the coding standard (although an exception to the standard has been +permitted where the dual use also significantly changes the type of the +structure member). */ +#define pxMutexHolder pcTail +#define uxQueueType pcHead +#define queueQUEUE_IS_MUTEX NULL + +/* Semaphores do not actually store or copy data, so have an item size of +zero. */ +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + +#if( configUSE_PREEMPTION == 0 ) + /* If the cooperative scheduler is being used then a yield should not be + performed just because a higher priority task has been woken. */ + #define queueYIELD_IF_USING_PREEMPTION() +#else + #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* + * Definition of the queue used by the scheduler. + * Items are queued by copy, not reference. See the following link for the + * rationale: http://www.freertos.org/Embedded-RTOS-Queues.html + */ +typedef struct QueueDefinition +{ + int8_t *pcHead; /*< Points to the beginning of the queue storage area. */ + int8_t *pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + int8_t *pcWriteTo; /*< Points to the free next place in the storage area. */ + + union /* Use of a union is an exception to the coding standard to ensure two mutually exclusive structure members don't appear simultaneously (wasting RAM). */ + { + int8_t *pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ + UBaseType_t uxRecursiveCallCount;/*< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ + } u; + + List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + List_t xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + + volatile UBaseType_t uxMessagesWaiting;/*< The number of items currently in the queue. */ + UBaseType_t uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + UBaseType_t uxItemSize; /*< The size of each items that the queue will hold. */ + + volatile int8_t cRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + volatile int8_t cTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the memory used by the queue was statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + struct QueueDefinition *pxQueueSetContainer; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxQueueNumber; + uint8_t ucQueueType; + #endif + +} xQUEUE; + +/* The old xQUEUE name is maintained above then typedefed to the new Queue_t +name below to enable the use of older kernel aware debuggers. */ +typedef xQUEUE Queue_t; + +/*-----------------------------------------------------------*/ + +/* + * The queue registry is just a means for kernel aware debuggers to locate + * queue structures. It has no other purpose so is an optional component. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + /* The type stored within the queue registry array. This allows a name + to be assigned to each queue making kernel aware debugging a little + more user friendly. */ + typedef struct QUEUE_REGISTRY_ITEM + { + const char *pcQueueName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + QueueHandle_t xHandle; + } xQueueRegistryItem; + + /* The old xQueueRegistryItem name is maintained above then typedefed to the + new xQueueRegistryItem name below to enable the use of older kernel aware + debuggers. */ + typedef xQueueRegistryItem QueueRegistryItem_t; + + /* The queue registry is simply an array of QueueRegistryItem_t structures. + The pcQueueName member of a structure being NULL is indicative of the + array position being vacant. */ + PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; + +#endif /* configQUEUE_REGISTRY_SIZE */ + +/* + * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not + * prevent an ISR from adding or removing items to the queue, but does prevent + * an ISR from removing tasks from the queue event lists. If an ISR finds a + * queue is locked it will instead increment the appropriate queue lock count + * to indicate that a task may require unblocking. When the queue in unlocked + * these lock counts are inspected, and the appropriate action taken. + */ +static void prvUnlockQueue( Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any data in a queue. + * + * @return pdTRUE if the queue contains no items, otherwise pdFALSE. + */ +static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any space in a queue. + * + * @return pdTRUE if there is no space, otherwise pdFALSE; + */ +static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Copies an item into the queue, either at the front of the queue or the + * back of the queue. + */ +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) PRIVILEGED_FUNCTION; + +/* + * Copies an item out of a queue. + */ +static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; + +#if ( configUSE_QUEUE_SETS == 1 ) + /* + * Checks to see if a queue is a member of a queue set, and if so, notifies + * the queue set that the queue contains data. + */ + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +#endif + +/* + * Called after a Queue_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) PRIVILEGED_FUNCTION; + +/* + * Mutexes are a special type of queue. When a mutex is created, first the + * queue is created, then prvInitialiseMutex() is called to configure the queue + * as a mutex. + */ +#if( configUSE_MUTEXES == 1 ) + static void prvInitialiseMutex( Queue_t *pxNewQueue ) PRIVILEGED_FUNCTION; +#endif + +/*-----------------------------------------------------------*/ + +/* + * Macro to mark a queue as locked. Locking a queue prevents an ISR from + * accessing the queue event lists. + */ +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL(); \ + { \ + if( ( pxQueue )->cRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->cTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL() +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) +{ +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); + pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; + pxQueue->pcWriteTo = pxQueue->pcHead; + pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize ); + pxQueue->cRxLock = queueUNLOCKED; + pxQueue->cTxLock = queueUNLOCKED; + + if( xNewQueue == pdFALSE ) + { + /* If there are tasks blocked waiting to read from the queue, then + the tasks will remain blocked as after this function exits the queue + will still be empty. If there are tasks blocked waiting to write to + the queue, then one should be unblocked as after this function exits + it will be possible to write to it. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Ensure the event queues start in the correct state. */ + vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); + } + } + taskEXIT_CRITICAL(); + + /* A value is returned for calling semantic consistency with previous + versions. */ + return pdPASS; +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) + { + Queue_t *pxNewQueue; + + configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); + + /* The StaticQueue_t structure and the queue storage area must be + supplied. */ + configASSERT( pxStaticQueue != NULL ); + + /* A queue storage area should be provided if the item size is not 0, and + should not be provided if the item size is 0. */ + configASSERT( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0 ) ) ); + configASSERT( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0 ) ) ); + + #if( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + variable of type StaticQueue_t or StaticSemaphore_t equals the size of + the real queue and semaphore structures. */ + volatile size_t xSize = sizeof( StaticQueue_t ); + configASSERT( xSize == sizeof( Queue_t ) ); + } + #endif /* configASSERT_DEFINED */ + + /* The address of a statically allocated queue was passed in, use it. + The address of a statically allocated storage area was also passed in + but is already set. */ + pxNewQueue = ( Queue_t * ) pxStaticQueue; /*lint !e740 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + + if( pxNewQueue != NULL ) + { + #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Queues can be allocated wither statically or dynamically, so + note this queue was allocated statically in case the queue is + later deleted. */ + pxNewQueue->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) + { + Queue_t *pxNewQueue; + size_t xQueueSizeInBytes; + uint8_t *pucQueueStorage; + + configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); + + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* There is not going to be a queue storage area. */ + xQueueSizeInBytes = ( size_t ) 0; + } + else + { + /* Allocate enough space to hold the maximum number of items that + can be in the queue at any time. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); + + if( pxNewQueue != NULL ) + { + /* Jump past the queue structure to find the location of the queue + storage area. */ + pucQueueStorage = ( ( uint8_t * ) pxNewQueue ) + sizeof( Queue_t ); + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Queues can be created either statically or dynamically, so + note this task was created dynamically in case it is later + deleted. */ + pxNewQueue->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) +{ + /* Remove compiler warnings about unused parameters should + configUSE_TRACE_FACILITY not be set to 1. */ + ( void ) ucQueueType; + + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* No RAM was allocated for the queue storage area, but PC head cannot + be set to NULL because NULL is used as a key to say the queue is used as + a mutex. Therefore just set pcHead to point to the queue as a benign + value that is known to be within the memory map. */ + pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; + } + else + { + /* Set the head to the start of the queue storage area. */ + pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage; + } + + /* Initialise the queue members as described where the queue type is + defined. */ + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif /* configUSE_TRACE_FACILITY */ + + #if( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; + } + #endif /* configUSE_QUEUE_SETS */ + + traceQUEUE_CREATE( pxNewQueue ); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_MUTEXES == 1 ) + + static void prvInitialiseMutex( Queue_t *pxNewQueue ) + { + if( pxNewQueue != NULL ) + { + /* The queue create function will set all the queue structure members + correctly for a generic queue, but this function is creating a + mutex. Overwrite those members that need to be set differently - + in particular the information required for priority inheritance. */ + pxNewQueue->pxMutexHolder = NULL; + pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; + + /* In case this is a recursive mutex. */ + pxNewQueue->u.uxRecursiveCallCount = 0; + + traceCREATE_MUTEX( pxNewQueue ); + + /* Start with the semaphore in the expected state. */ + ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK ); + } + else + { + traceCREATE_MUTEX_FAILED(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) + { + Queue_t *pxNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + pxNewQueue = ( Queue_t * ) xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); + prvInitialiseMutex( pxNewQueue ); + + return pxNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) + { + Queue_t *pxNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + /* Prevent compiler warnings about unused parameters if + configUSE_TRACE_FACILITY does not equal 1. */ + ( void ) ucQueueType; + + pxNewQueue = ( Queue_t * ) xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType ); + prvInitialiseMutex( pxNewQueue ); + + return pxNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) + { + void *pxReturn; + + /* This function is called by xSemaphoreGetMutexHolder(), and should not + be called directly. Note: This is a good way of determining if the + calling task is the mutex holder, but not a good way of determining the + identity of the mutex holder, as the holder may change between the + following critical section exiting and the function returning. */ + taskENTER_CRITICAL(); + { + if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = ( void * ) ( ( Queue_t * ) xSemaphore )->pxMutexHolder; + } + else + { + pxReturn = NULL; + } + } + taskEXIT_CRITICAL(); + + return pxReturn; + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + configASSERT( pxMutex ); + + /* If this is the task that holds the mutex then pxMutexHolder will not + change outside of this task. If this task does not hold the mutex then + pxMutexHolder can never coincidentally equal the tasks handle, and as + this is the only condition we are interested in it does not matter if + pxMutexHolder is accessed simultaneously by another task. Therefore no + mutual exclusion is required to test the pxMutexHolder variable. */ + if( pxMutex->pxMutexHolder == ( void * ) xTaskGetCurrentTaskHandle() ) /*lint !e961 Not a redundant cast as TaskHandle_t is a typedef. */ + { + traceGIVE_MUTEX_RECURSIVE( pxMutex ); + + /* uxRecursiveCallCount cannot be zero if pxMutexHolder is equal to + the task handle, therefore no underflow check is required. Also, + uxRecursiveCallCount is only modified by the mutex holder, and as + there can only be one, no mutual exclusion is required to modify the + uxRecursiveCallCount member. */ + ( pxMutex->u.uxRecursiveCallCount )--; + + /* Has the recursive call count unwound to 0? */ + if( pxMutex->u.uxRecursiveCallCount == ( UBaseType_t ) 0 ) + { + /* Return the mutex. This will automatically unblock any other + task that might be waiting to access the mutex. */ + ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + /* The mutex cannot be given because the calling task is not the + holder. */ + xReturn = pdFAIL; + + traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + configASSERT( pxMutex ); + + /* Comments regarding mutual exclusion as per those within + xQueueGiveMutexRecursive(). */ + + traceTAKE_MUTEX_RECURSIVE( pxMutex ); + + if( pxMutex->pxMutexHolder == ( void * ) xTaskGetCurrentTaskHandle() ) /*lint !e961 Cast is not redundant as TaskHandle_t is a typedef. */ + { + ( pxMutex->u.uxRecursiveCallCount )++; + xReturn = pdPASS; + } + else + { + xReturn = xQueueGenericReceive( pxMutex, NULL, xTicksToWait, pdFALSE ); + + /* pdPASS will only be returned if the mutex was successfully + obtained. The calling task may have entered the Blocked state + before reaching here. */ + if( xReturn != pdFAIL ) + { + ( pxMutex->u.uxRecursiveCallCount )++; + } + else + { + traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) + { + QueueHandle_t xHandle; + + configASSERT( uxMaxCount != 0 ); + configASSERT( uxInitialCount <= uxMaxCount ); + + xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) + { + QueueHandle_t xHandle; + + configASSERT( uxMaxCount != 0 ); + configASSERT( uxInitialCount <= uxMaxCount ); + + xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) +{ +BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; +TimeOut_t xTimeOut; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + + /* This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? The running task must be the + highest priority task wanting to access the queue. If the head item + in the queue is to be overwritten then it does not matter if the + queue is full. */ + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + traceQUEUE_SEND( pxQueue ); + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + to the queue set caused a higher priority task to + unblock. A context switch is required. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to + do this from within the critical section - the + kernel takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + executed if the task was holding multiple mutexes + and the mutexes were given back in an order that is + different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to do + this from within the critical section - the kernel + takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + executed if the task was holding multiple mutexes and + the mutexes were given back in an order that is + different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was full and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting + the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + configure the timeout structure. */ + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + + /* Unlocking the queue means queue events can effect the + event list. It is possible that interrupts occurring now + remove this task from the event list again - but as the + scheduler is suspended the task will go onto the pending + ready last instead of the actual ready list. */ + prvUnlockQueue( pxQueue ); + + /* Resuming the scheduler will move tasks from the pending + ready list into the ready list - so it is feasible that this + task is already in a ready list before it yields - in which + case the yield will not cause a context switch unless there + is also a higher priority task in the pending ready list. */ + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + /* Similar to xQueueGenericSend, except without blocking if there is no room + in the queue. Also don't directly wake a task that was blocked on a queue + read, instead return a flag to say whether a context switch is required or + not (i.e. has a task with a higher priority than us been woken by this + post). */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + const int8_t cTxLock = pxQueue->cTxLock; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a + semaphore or mutex. That means prvCopyDataToQueue() cannot result + in a task disinheriting a priority and prvCopyDataToQueue() can be + called here even though the disinherit function does not check if + the scheduler is suspended before accessing the ready lists. */ + ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* The event list is not altered if the queue is locked. This will + be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + to the queue set caused a higher priority task to + unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was posted while it was locked. */ + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* Similar to xQueueGenericSendFromISR() but used with semaphores where the + item size is 0. Don't directly wake a task that was blocked on a queue + read, instead return a flag to say whether a context switch is required or + not (i.e. has a task with a higher priority than us been woken by this + post). */ + + configASSERT( pxQueue ); + + /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR() + if the item size is not 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Normally a mutex would not be given from an interrupt, especially if + there is a mutex holder, as priority inheritance makes no sense for an + interrupts, only tasks. */ + configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->pxMutexHolder != NULL ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* When the queue is used to implement a semaphore no data is ever + moved through the queue but it is still valid to see if the queue 'has + space'. */ + if( uxMessagesWaiting < pxQueue->uxLength ) + { + const int8_t cTxLock = pxQueue->cTxLock; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* A task can only have an inherited priority if it is a mutex + holder - and if there is a mutex holder then the mutex cannot be + given from an ISR. As this is the ISR version of the function it + can be assumed there is no mutex holder and no need to determine if + priority disinheritance is needed. Simply increase the count of + messages (semaphores) available. */ + pxQueue->uxMessagesWaiting = uxMessagesWaiting + 1; + + /* The event list is not altered if the queue is locked. This will + be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE ) + { + /* The semaphore is a member of a queue set, and + posting to the queue set caused a higher priority + task to unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was posted while it was locked. */ + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeeking ) +{ +BaseType_t xEntryTimeSet = pdFALSE; +TimeOut_t xTimeOut; +int8_t *pcOriginalReadPosition; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + /* This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + + for( ;; ) + { + taskENTER_CRITICAL(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Remember the read position in case the queue is only being + peeked. */ + pcOriginalReadPosition = pxQueue->u.pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + + if( xJustPeeking == pdFALSE ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* Actually removing data, not just peeking. */ + pxQueue->uxMessagesWaiting = uxMessagesWaiting - 1; + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + priority inheritance should it become necessary. */ + pxQueue->pxMutexHolder = ( int8_t * ) pvTaskIncrementMutexHeldCount(); /*lint !e961 Cast is not redundant as TaskHandle_t is a typedef. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + traceQUEUE_PEEK( pxQueue ); + + /* The data is not being removed, so reset the read + pointer. */ + pxQueue->u.pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + configure the timeout structure. */ + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + taskENTER_CRITICAL(); + { + vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Cannot block in an ISR, so check there is data available. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + const int8_t cRxLock = pxQueue->cRxLock; + + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - 1; + + /* If the queue is locked the event list will not be modified. + Instead update the lock count so the task that unlocks the queue + will know that an ISR has removed data while the queue was + locked. */ + if( cRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + force a context switch. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was removed while it was locked. */ + pxQueue->cRxLock = ( int8_t ) ( cRxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +int8_t *pcOriginalReadPosition; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + traceQUEUE_PEEK_FROM_ISR( pxQueue ); + + /* Remember the read position so it can be reset as nothing is + actually being removed from the queue. */ + pcOriginalReadPosition = pxQueue->u.pcReadFrom; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->u.pcReadFrom = pcOriginalReadPosition; + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) +{ +UBaseType_t uxReturn; + + configASSERT( xQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) +{ +UBaseType_t uxReturn; +Queue_t *pxQueue; + + pxQueue = ( Queue_t * ) xQueue; + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) +{ +UBaseType_t uxReturn; + + configASSERT( xQueue ); + + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +void vQueueDelete( QueueHandle_t xQueue ) +{ +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + traceQUEUE_DELETE( pxQueue ); + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + vQueueUnregisterQueue( pxQueue ); + } + #endif + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The queue can only have been allocated dynamically - free it + again. */ + vPortFree( pxQueue ); + } + #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The queue could have been allocated statically or dynamically, so + check before attempting to free the memory. */ + if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxQueue ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else + { + /* The queue must have been statically allocated, so is not going to be + deleted. Avoid compiler warnings about the unused parameter. */ + ( void ) pxQueue; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) + { + ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->ucQueueType; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) +{ +BaseType_t xReturn = pdFALSE; +UBaseType_t uxMessagesWaiting; + + /* This function is called from a critical section. */ + + uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) + { + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + xReturn = xTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder ); + pxQueue->pxMutexHolder = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + } + else if( xPosition == queueSEND_TO_BACK ) + { + ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. */ + pxQueue->pcWriteTo += pxQueue->uxItemSize; + if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->pcWriteTo = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + pxQueue->u.pcReadFrom -= pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->u.pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xPosition == queueOVERWRITE ) + { + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* An item is not being added but overwritten, so subtract + one from the recorded number of items in the queue so when + one is added again below the number of recorded items remains + correct. */ + --uxMessagesWaiting; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxQueue->uxMessagesWaiting = uxMessagesWaiting + 1; + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) +{ + if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) + { + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. */ + } +} +/*-----------------------------------------------------------*/ + +static void prvUnlockQueue( Queue_t * const pxQueue ) +{ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* The lock counts contains the number of extra data items placed or + removed from the queue while the queue was locked. When a queue is + locked items can be added or removed, but the event lists cannot be + updated. */ + taskENTER_CRITICAL(); + { + int8_t cTxLock = pxQueue->cTxLock; + + /* See if data was added to the queue while it was locked. */ + while( cTxLock > queueLOCKED_UNMODIFIED ) + { + /* Data was posted while the queue was locked. Are any tasks + blocked waiting for data to become available? */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting to + the queue set caused a higher priority task to unblock. + A context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Tasks that are removed from the event list will get + added to the pending ready list as the scheduler is still + suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that + a context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + #endif /* configUSE_QUEUE_SETS */ + + --cTxLock; + } + + pxQueue->cTxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); + + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL(); + { + int8_t cRxLock = pxQueue->cRxLock; + + while( cRxLock > queueLOCKED_UNMODIFIED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --cRxLock; + } + else + { + break; + } + } + + pxQueue->cRxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) +{ +BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) +{ +BaseType_t xReturn; + + configASSERT( xQueue ); + if( ( ( Queue_t * ) xQueue )->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) +{ +BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) +{ +BaseType_t xReturn; + + configASSERT( xQueue ); + if( ( ( Queue_t * ) xQueue )->uxMessagesWaiting == ( ( Queue_t * ) xQueue )->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* If the queue is already full we may have to block. A critical section + is required to prevent an interrupt removing something from the queue + between the check to see if the queue is full and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + /* The queue is full - do we want to block or just leave without + posting? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is called from a coroutine we cannot block directly, but + return indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + /* There is room in the queue, copy the data into the queue. */ + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + xReturn = pdPASS; + + /* Were any co-routines waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The co-routine waiting has a higher priority so record + that a yield might be appropriate. */ + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = errQUEUE_FULL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* If the queue is already empty we may have to block. A critical section + is required to prevent an interrupt adding something to the queue + between the check to see if the queue is empty and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + /* There are no messages in the queue, do we want to block or just + leave with nothing? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is a co-routine we cannot block directly, but return + indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data is available from the queue. */ + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + xReturn = pdPASS; + + /* Were any co-routines waiting for space to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = pdFAIL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ) + { + Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* Cannot block within an ISR so if there is no space on the queue then + exit without doing anything. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + + /* We only want to wake one co-routine per ISR, so check that a + co-routine has not already been woken. */ + if( xCoRoutinePreviouslyWoken == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + return pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCoRoutinePreviouslyWoken; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxCoRoutineWoken ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* We cannot block from an ISR, so check there is data available. If + not then just leave without doing anything. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Copy the data from the queue. */ + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + if( ( *pxCoRoutineWoken ) == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + *pxCoRoutineWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + + /* See if there is an empty space in the registry. A NULL name denotes + a free slot. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].pcQueueName == NULL ) + { + /* Store the information on this queue. */ + xQueueRegistry[ ux ].pcQueueName = pcQueueName; + xQueueRegistry[ ux ].xHandle = xQueue; + + traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ); + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + const char *pcQueueGetName( QueueHandle_t xQueue ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + const char *pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + /* Note there is nothing here to protect against another task adding or + removing entries from the registry while it is being searched. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + pcReturn = xQueueRegistry[ ux ].pcQueueName; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return pcReturn; + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueUnregisterQueue( QueueHandle_t xQueue ) + { + UBaseType_t ux; + + /* See if the handle of the queue being unregistered in actually in the + registry. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + /* Set the name to NULL to show that this slot if free again. */ + xQueueRegistry[ ux ].pcQueueName = NULL; + + /* Set the handle to NULL to ensure the same queue handle cannot + appear in the registry twice if it is added, removed, then + added again. */ + xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMERS == 1 ) + + void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) + { + Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements. + It can result in vListInsert() being called on a list that can only + possibly ever have one item in it, so the list will be fast, but even + so it should be called with the scheduler locked and not from a critical + section. */ + + /* Only do anything if there are no messages in the queue. This function + will not actually cause the task to block, just place it on a blocked + list. It will not block until the scheduler is unlocked - at which + time a yield will be performed. If an item is added to the queue while + the queue is locked, and the calling task blocks on the queue, then the + calling task will be immediately unblocked when the queue is unlocked. */ + prvLockQueue( pxQueue ); + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U ) + { + /* There is nothing in the queue, block for the specified period. */ + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + prvUnlockQueue( pxQueue ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) + { + QueueSetHandle_t pxQueue; + + pxQueue = xQueueGenericCreate( uxEventQueueLength, sizeof( Queue_t * ), queueQUEUE_TYPE_SET ); + + return pxQueue; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) + { + /* Cannot add a queue/semaphore to more than one queue set. */ + xReturn = pdFAIL; + } + else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* Cannot add a queue/semaphore to a queue set if there are already + items in the queue/semaphore. */ + xReturn = pdFAIL; + } + else + { + ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; + xReturn = pdPASS; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore; + + if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) + { + /* The queue was not a member of the set. */ + xReturn = pdFAIL; + } + else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* It is dangerous to remove a queue from a set when the queue is + not empty because the queue set will still hold pending events for + the queue. */ + xReturn = pdFAIL; + } + else + { + taskENTER_CRITICAL(); + { + /* The queue is no longer contained in the set. */ + pxQueueOrSemaphore->pxQueueSetContainer = NULL; + } + taskEXIT_CRITICAL(); + xReturn = pdPASS; + } + + return xReturn; + } /*lint !e818 xQueueSet could not be declared as pointing to const as it is a typedef. */ + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t const xTicksToWait ) + { + QueueSetMemberHandle_t xReturn = NULL; + + ( void ) xQueueGenericReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait, pdFALSE ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) + { + QueueSetMemberHandle_t xReturn = NULL; + + ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition ) + { + Queue_t *pxQueueSetContainer = pxQueue->pxQueueSetContainer; + BaseType_t xReturn = pdFALSE; + + /* This function must be called form a critical section. */ + + configASSERT( pxQueueSetContainer ); + configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); + + if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) + { + const int8_t cTxLock = pxQueueSetContainer->cTxLock; + + traceQUEUE_SEND( pxQueueSetContainer ); + + /* The data copied is the handle of the queue that contains data. */ + xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, xCopyPosition ); + + if( cTxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + pxQueueSetContainer->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ + + + + + + + + + + + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/queue.h b/STM32F1/libraries/FreeRTOS900/utility/queue.h new file mode 100644 index 000000000..30be36013 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/queue.h @@ -0,0 +1,1798 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef QUEUE_H +#define QUEUE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include queue.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * Type by which queues are referenced. For example, a call to xQueueCreate() + * returns an QueueHandle_t variable that can then be used as a parameter to + * xQueueSend(), xQueueReceive(), etc. + */ +typedef void * QueueHandle_t; + +/** + * Type by which queue sets are referenced. For example, a call to + * xQueueCreateSet() returns an xQueueSet variable that can then be used as a + * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. + */ +typedef void * QueueSetHandle_t; + +/** + * Queue sets can contain both queues and semaphores, so the + * QueueSetMemberHandle_t is defined as a type to be used where a parameter or + * return value can be either an QueueHandle_t or an SemaphoreHandle_t. + */ +typedef void * QueueSetMemberHandle_t; + +/* For internal use only. */ +#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) +#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) +#define queueOVERWRITE ( ( BaseType_t ) 2 ) + +/* For internal use only. These definitions *must* match those in queue.c. */ +#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) +#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) +#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) +#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) + +/** + * queue. h + *
    + QueueHandle_t xQueueCreate(
    +							  UBaseType_t uxQueueLength,
    +							  UBaseType_t uxItemSize
    +						  );
    + * 
    + * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * http://www.freertos.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @return If the queue is successfully create then a handle to the newly + * created queue is returned. If the queue cannot be created then 0 is + * returned. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + };
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1, xQueue2;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    +	if( xQueue1 == 0 )
    +	{
    +		// Queue was not created and must not be used.
    +	}
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +	if( xQueue2 == 0 )
    +	{
    +		// Queue was not created and must not be used.
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueCreate xQueueCreate + * \ingroup QueueManagement + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) +#endif + +/** + * queue. h + *
    + QueueHandle_t xQueueCreateStatic(
    +							  UBaseType_t uxQueueLength,
    +							  UBaseType_t uxItemSize,
    +							  uint8_t *pucQueueStorageBuffer,
    +							  StaticQueue_t *pxQueueBuffer
    +						  );
    + * 
    + * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * http://www.freertos.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @param pucQueueStorageBuffer If uxItemSize is not zero then + * pucQueueStorageBuffer must point to a uint8_t array that is at least large + * enough to hold the maximum number of items that can be in the queue at any + * one time - which is ( uxQueueLength * uxItemsSize ) bytes. If uxItemSize is + * zero then pucQueueStorageBuffer can be NULL. + * + * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which + * will be used to hold the queue's data structure. + * + * @return If the queue is created then a handle to the created queue is + * returned. If pxQueueBuffer is NULL then NULL is returned. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + };
    +
    + #define QUEUE_LENGTH 10
    + #define ITEM_SIZE sizeof( uint32_t )
    +
    + // xQueueBuffer will hold the queue structure.
    + StaticQueue_t xQueueBuffer;
    +
    + // ucQueueStorage will hold the items posted to the queue.  Must be at least
    + // [(queue length) * ( queue item size)] bytes long.
    + uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold.
    +							ITEM_SIZE	  // The size of each item in the queue
    +							&( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue.
    +							&xQueueBuffer ); // The buffer that will hold the queue structure.
    +
    +	// The queue is guaranteed to be created successfully as no dynamic memory
    +	// allocation is used.  Therefore xQueue1 is now a handle to a valid queue.
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueCreateStatic xQueueCreateStatic + * \ingroup QueueManagement + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * queue. h + *
    + BaseType_t xQueueSendToToFront(
    +								   QueueHandle_t	xQueue,
    +								   const void		*pvItemToQueue,
    +								   TickType_t		xTicksToWait
    +							   );
    + * 
    + * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the front of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + uint32_t ulVar = 10UL;
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1, xQueue2;
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +
    +	// ...
    +
    +	if( xQueue1 != 0 )
    +	{
    +		// Send an uint32_t.  Wait for 10 ticks for space to become
    +		// available if necessary.
    +		if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
    +		{
    +			// Failed to post the message, even after 10 ticks.
    +		}
    +	}
    +
    +	if( xQueue2 != 0 )
    +	{
    +		// Send a pointer to a struct AMessage object.  Don't block if the
    +		// queue is already full.
    +		pxMessage = & xMessage;
    +		xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) + +/** + * queue. h + *
    + BaseType_t xQueueSendToBack(
    +								   QueueHandle_t	xQueue,
    +								   const void		*pvItemToQueue,
    +								   TickType_t		xTicksToWait
    +							   );
    + * 
    + * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the back of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the queue + * is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + uint32_t ulVar = 10UL;
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1, xQueue2;
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +
    +	// ...
    +
    +	if( xQueue1 != 0 )
    +	{
    +		// Send an uint32_t.  Wait for 10 ticks for space to become
    +		// available if necessary.
    +		if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
    +		{
    +			// Failed to post the message, even after 10 ticks.
    +		}
    +	}
    +
    +	if( xQueue2 != 0 )
    +	{
    +		// Send a pointer to a struct AMessage object.  Don't block if the
    +		// queue is already full.
    +		pxMessage = & xMessage;
    +		xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + *
    + BaseType_t xQueueSend(
    +							  QueueHandle_t xQueue,
    +							  const void * pvItemToQueue,
    +							  TickType_t xTicksToWait
    +						 );
    + * 
    + * + * This is a macro that calls xQueueGenericSend(). It is included for + * backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToFront() and xQueueSendToBack() macros. It is + * equivalent to xQueueSendToBack(). + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + uint32_t ulVar = 10UL;
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1, xQueue2;
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +
    +	// ...
    +
    +	if( xQueue1 != 0 )
    +	{
    +		// Send an uint32_t.  Wait for 10 ticks for space to become
    +		// available if necessary.
    +		if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
    +		{
    +			// Failed to post the message, even after 10 ticks.
    +		}
    +	}
    +
    +	if( xQueue2 != 0 )
    +	{
    +		// Send a pointer to a struct AMessage object.  Don't block if the
    +		// queue is already full.
    +		pxMessage = & xMessage;
    +		xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + *
    + BaseType_t xQueueOverwrite(
    +							  QueueHandle_t xQueue,
    +							  const void * pvItemToQueue
    +						 );
    + * 
    + * + * Only for use with queues that have a length of one - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * This function must not be called from an interrupt service routine. + * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle of the queue to which the data is being sent. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and + * therefore has the same return values as xQueueSendToFront(). However, pdPASS + * is the only value that can be returned because xQueueOverwrite() will write + * to the queue even when the queue is already full. + * + * Example usage: +
    +
    + void vFunction( void *pvParameters )
    + {
    + QueueHandle_t xQueue;
    + uint32_t ulVarToSend, ulValReceived;
    +
    +	// Create a queue to hold one uint32_t value.  It is strongly
    +	// recommended *not* to use xQueueOverwrite() on queues that can
    +	// contain more than one value, and doing so will trigger an assertion
    +	// if configASSERT() is defined.
    +	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
    +
    +	// Write the value 10 to the queue using xQueueOverwrite().
    +	ulVarToSend = 10;
    +	xQueueOverwrite( xQueue, &ulVarToSend );
    +
    +	// Peeking the queue should now return 10, but leave the value 10 in
    +	// the queue.  A block time of zero is used as it is known that the
    +	// queue holds a value.
    +	ulValReceived = 0;
    +	xQueuePeek( xQueue, &ulValReceived, 0 );
    +
    +	if( ulValReceived != 10 )
    +	{
    +		// Error unless the item was removed by a different task.
    +	}
    +
    +	// The queue is still full.  Use xQueueOverwrite() to overwrite the
    +	// value held in the queue with 100.
    +	ulVarToSend = 100;
    +	xQueueOverwrite( xQueue, &ulVarToSend );
    +
    +	// This time read from the queue, leaving the queue empty once more.
    +	// A block time of 0 is used again.
    +	xQueueReceive( xQueue, &ulValReceived, 0 );
    +
    +	// The value read should be the last value written, even though the
    +	// queue was already full when the value was written.
    +	if( ulValReceived != 100 )
    +	{
    +		// Error!
    +	}
    +
    +	// ...
    +}
    + 
    + * \defgroup xQueueOverwrite xQueueOverwrite + * \ingroup QueueManagement + */ +#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) + + +/** + * queue. h + *
    + BaseType_t xQueueGenericSend(
    +									QueueHandle_t xQueue,
    +									const void * pvItemToQueue,
    +									TickType_t xTicksToWait
    +									BaseType_t xCopyPosition
    +								);
    + * 
    + * + * It is preferred that the macros xQueueSend(), xQueueSendToFront() and + * xQueueSendToBack() are used in place of calling this function directly. + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + uint32_t ulVar = 10UL;
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1, xQueue2;
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +
    +	// ...
    +
    +	if( xQueue1 != 0 )
    +	{
    +		// Send an uint32_t.  Wait for 10 ticks for space to become
    +		// available if necessary.
    +		if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS )
    +		{
    +			// Failed to post the message, even after 10 ticks.
    +		}
    +	}
    +
    +	if( xQueue2 != 0 )
    +	{
    +		// Send a pointer to a struct AMessage object.  Don't block if the
    +		// queue is already full.
    +		pxMessage = & xMessage;
    +		xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK );
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    + BaseType_t xQueuePeek(
    +							 QueueHandle_t xQueue,
    +							 void *pvBuffer,
    +							 TickType_t xTicksToWait
    +						 );
    + * + * This is a macro that calls the xQueueGenericReceive() function. + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * This macro must not be used in an interrupt service routine. See + * xQueuePeekFromISR() for an alternative that can be called from an interrupt + * service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue + * is empty. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + QueueHandle_t xQueue;
    +
    + // Task to create a queue and post a value.
    + void vATask( void *pvParameters )
    + {
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +	if( xQueue == 0 )
    +	{
    +		// Failed to create the queue.
    +	}
    +
    +	// ...
    +
    +	// Send a pointer to a struct AMessage object.  Don't block if the
    +	// queue is already full.
    +	pxMessage = & xMessage;
    +	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +
    +	// ... Rest of task code.
    + }
    +
    + // Task to peek the data from the queue.
    + void vADifferentTask( void *pvParameters )
    + {
    + struct AMessage *pxRxedMessage;
    +
    +	if( xQueue != 0 )
    +	{
    +		// Peek a message on the created queue.  Block for 10 ticks if a
    +		// message is not immediately available.
    +		if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
    +		{
    +			// pcRxedMessage now points to the struct AMessage variable posted
    +			// by vATask, but the item still remains on the queue.
    +		}
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE ) + +/** + * queue. h + *
    + BaseType_t xQueuePeekFromISR(
    +									QueueHandle_t xQueue,
    +									void *pvBuffer,
    +								);
    + * + * A version of xQueuePeek() that can be called from an interrupt service + * routine (ISR). + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * \defgroup xQueuePeekFromISR xQueuePeekFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    + BaseType_t xQueueReceive(
    +								 QueueHandle_t xQueue,
    +								 void *pvBuffer,
    +								 TickType_t xTicksToWait
    +							);
    + * + * This is a macro that calls the xQueueGenericReceive() function. + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * Successfully received items are removed from the queue. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. xQueueReceive() will return immediately if xTicksToWait + * is zero and the queue is empty. The time is defined in tick periods so the + * constant portTICK_PERIOD_MS should be used to convert to real time if this is + * required. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + QueueHandle_t xQueue;
    +
    + // Task to create a queue and post a value.
    + void vATask( void *pvParameters )
    + {
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +	if( xQueue == 0 )
    +	{
    +		// Failed to create the queue.
    +	}
    +
    +	// ...
    +
    +	// Send a pointer to a struct AMessage object.  Don't block if the
    +	// queue is already full.
    +	pxMessage = & xMessage;
    +	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +
    +	// ... Rest of task code.
    + }
    +
    + // Task to receive from the queue.
    + void vADifferentTask( void *pvParameters )
    + {
    + struct AMessage *pxRxedMessage;
    +
    +	if( xQueue != 0 )
    +	{
    +		// Receive a message on the created queue.  Block for 10 ticks if a
    +		// message is not immediately available.
    +		if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
    +		{
    +			// pcRxedMessage now points to the struct AMessage variable posted
    +			// by vATask.
    +		}
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE ) + + +/** + * queue. h + *
    + BaseType_t xQueueGenericReceive(
    +									   QueueHandle_t	xQueue,
    +									   void	*pvBuffer,
    +									   TickType_t	xTicksToWait
    +									   BaseType_t	xJustPeek
    +									);
    + * + * It is preferred that the macro xQueueReceive() be used rather than calling + * this function directly. + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * xQueueGenericReceive() will return immediately if the queue is empty and + * xTicksToWait is 0. + * + * @param xJustPeek When set to true, the item received from the queue is not + * actually removed from the queue - meaning a subsequent call to + * xQueueReceive() will return the same item. When set to false, the item + * being received from the queue is also removed from the queue. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + QueueHandle_t xQueue;
    +
    + // Task to create a queue and post a value.
    + void vATask( void *pvParameters )
    + {
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +	if( xQueue == 0 )
    +	{
    +		// Failed to create the queue.
    +	}
    +
    +	// ...
    +
    +	// Send a pointer to a struct AMessage object.  Don't block if the
    +	// queue is already full.
    +	pxMessage = & xMessage;
    +	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +
    +	// ... Rest of task code.
    + }
    +
    + // Task to receive from the queue.
    + void vADifferentTask( void *pvParameters )
    + {
    + struct AMessage *pxRxedMessage;
    +
    +	if( xQueue != 0 )
    +	{
    +		// Receive a message on the created queue.  Block for 10 ticks if a
    +		// message is not immediately available.
    +		if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
    +		{
    +			// pcRxedMessage now points to the struct AMessage variable posted
    +			// by vATask.
    +		}
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeek ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );
    + * + * Return the number of messages stored in a queue. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of messages available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
    + * + * Return the number of free spaces available in a queue. This is equal to the + * number of items that can be sent to the queue before the queue becomes full + * if no items are removed. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of spaces available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    void vQueueDelete( QueueHandle_t xQueue );
    + * + * Delete a queue - freeing all the memory allocated for storing of items + * placed on the queue. + * + * @param xQueue A handle to the queue to be deleted. + * + * \defgroup vQueueDelete vQueueDelete + * \ingroup QueueManagement + */ +void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    + BaseType_t xQueueSendToFrontFromISR(
    +										 QueueHandle_t xQueue,
    +										 const void *pvItemToQueue,
    +										 BaseType_t *pxHigherPriorityTaskWoken
    +									  );
    + 
    + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the front of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
    + void vBufferISR( void )
    + {
    + char cIn;
    + BaseType_t xHigherPrioritTaskWoken;
    +
    +	// We have not woken a task at the start of the ISR.
    +	xHigherPriorityTaskWoken = pdFALSE;
    +
    +	// Loop until the buffer is empty.
    +	do
    +	{
    +		// Obtain a byte from the buffer.
    +		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    +
    +		// Post the byte.
    +		xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
    +
    +	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    +
    +	// Now the buffer is empty we can switch context if necessary.
    +	if( xHigherPriorityTaskWoken )
    +	{
    +		taskYIELD ();
    +	}
    + }
    + 
    + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) + + +/** + * queue. h + *
    + BaseType_t xQueueSendToBackFromISR(
    +										 QueueHandle_t xQueue,
    +										 const void *pvItemToQueue,
    +										 BaseType_t *pxHigherPriorityTaskWoken
    +									  );
    + 
    + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the back of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
    + void vBufferISR( void )
    + {
    + char cIn;
    + BaseType_t xHigherPriorityTaskWoken;
    +
    +	// We have not woken a task at the start of the ISR.
    +	xHigherPriorityTaskWoken = pdFALSE;
    +
    +	// Loop until the buffer is empty.
    +	do
    +	{
    +		// Obtain a byte from the buffer.
    +		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    +
    +		// Post the byte.
    +		xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
    +
    +	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    +
    +	// Now the buffer is empty we can switch context if necessary.
    +	if( xHigherPriorityTaskWoken )
    +	{
    +		taskYIELD ();
    +	}
    + }
    + 
    + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + *
    + BaseType_t xQueueOverwriteFromISR(
    +							  QueueHandle_t xQueue,
    +							  const void * pvItemToQueue,
    +							  BaseType_t *pxHigherPriorityTaskWoken
    +						 );
    + * 
    + * + * A version of xQueueOverwrite() that can be used in an interrupt service + * routine (ISR). + * + * Only for use with queues that can hold a single item - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueOverwriteFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return xQueueOverwriteFromISR() is a macro that calls + * xQueueGenericSendFromISR(), and therefore has the same return values as + * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be + * returned because xQueueOverwriteFromISR() will write to the queue even when + * the queue is already full. + * + * Example usage: +
    +
    + QueueHandle_t xQueue;
    +
    + void vFunction( void *pvParameters )
    + {
    + 	// Create a queue to hold one uint32_t value.  It is strongly
    +	// recommended *not* to use xQueueOverwriteFromISR() on queues that can
    +	// contain more than one value, and doing so will trigger an assertion
    +	// if configASSERT() is defined.
    +	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
    +}
    +
    +void vAnInterruptHandler( void )
    +{
    +// xHigherPriorityTaskWoken must be set to pdFALSE before it is used.
    +BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    +uint32_t ulVarToSend, ulValReceived;
    +
    +	// Write the value 10 to the queue using xQueueOverwriteFromISR().
    +	ulVarToSend = 10;
    +	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
    +
    +	// The queue is full, but calling xQueueOverwriteFromISR() again will still
    +	// pass because the value held in the queue will be overwritten with the
    +	// new value.
    +	ulVarToSend = 100;
    +	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
    +
    +	// Reading from the queue will now return 100.
    +
    +	// ...
    +
    +	if( xHigherPrioritytaskWoken == pdTRUE )
    +	{
    +		// Writing to the queue caused a task to unblock and the unblocked task
    +		// has a priority higher than or equal to the priority of the currently
    +		// executing task (the task this interrupt interrupted).  Perform a context
    +		// switch so this interrupt returns directly to the unblocked task.
    +		portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port.
    +	}
    +}
    + 
    + * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR + * \ingroup QueueManagement + */ +#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) + +/** + * queue. h + *
    + BaseType_t xQueueSendFromISR(
    +									 QueueHandle_t xQueue,
    +									 const void *pvItemToQueue,
    +									 BaseType_t *pxHigherPriorityTaskWoken
    +								);
    + 
    + * + * This is a macro that calls xQueueGenericSendFromISR(). It is included + * for backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() + * macros. + * + * Post an item to the back of a queue. It is safe to use this function from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
    + void vBufferISR( void )
    + {
    + char cIn;
    + BaseType_t xHigherPriorityTaskWoken;
    +
    +	// We have not woken a task at the start of the ISR.
    +	xHigherPriorityTaskWoken = pdFALSE;
    +
    +	// Loop until the buffer is empty.
    +	do
    +	{
    +		// Obtain a byte from the buffer.
    +		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    +
    +		// Post the byte.
    +		xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
    +
    +	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    +
    +	// Now the buffer is empty we can switch context if necessary.
    +	if( xHigherPriorityTaskWoken )
    +	{
    +		// Actual macro used here is port specific.
    +		portYIELD_FROM_ISR ();
    +	}
    + }
    + 
    + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + *
    + BaseType_t xQueueGenericSendFromISR(
    +										   QueueHandle_t		xQueue,
    +										   const	void	*pvItemToQueue,
    +										   BaseType_t	*pxHigherPriorityTaskWoken,
    +										   BaseType_t	xCopyPosition
    +									   );
    + 
    + * + * It is preferred that the macros xQueueSendFromISR(), + * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place + * of calling this function directly. xQueueGiveFromISR() is an + * equivalent for use by semaphores that don't actually copy any data. + * + * Post an item on a queue. It is safe to use this function from within an + * interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
    + void vBufferISR( void )
    + {
    + char cIn;
    + BaseType_t xHigherPriorityTaskWokenByPost;
    +
    +	// We have not woken a task at the start of the ISR.
    +	xHigherPriorityTaskWokenByPost = pdFALSE;
    +
    +	// Loop until the buffer is empty.
    +	do
    +	{
    +		// Obtain a byte from the buffer.
    +		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    +
    +		// Post each byte.
    +		xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK );
    +
    +	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    +
    +	// Now the buffer is empty we can switch context if necessary.  Note that the
    +	// name of the yield function required is port specific.
    +	if( xHigherPriorityTaskWokenByPost )
    +	{
    +		taskYIELD_YIELD_FROM_ISR();
    +	}
    + }
    + 
    + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    + BaseType_t xQueueReceiveFromISR(
    +									   QueueHandle_t	xQueue,
    +									   void	*pvBuffer,
    +									   BaseType_t *pxTaskWoken
    +								   );
    + * 
    + * + * Receive an item from a queue. It is safe to use this function from within an + * interrupt service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param pxTaskWoken A task may be blocked waiting for space to become + * available on the queue. If xQueueReceiveFromISR causes such a task to + * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will + * remain unchanged. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
    +
    + QueueHandle_t xQueue;
    +
    + // Function to create a queue and post some values.
    + void vAFunction( void *pvParameters )
    + {
    + char cValueToPost;
    + const TickType_t xTicksToWait = ( TickType_t )0xff;
    +
    +	// Create a queue capable of containing 10 characters.
    +	xQueue = xQueueCreate( 10, sizeof( char ) );
    +	if( xQueue == 0 )
    +	{
    +		// Failed to create the queue.
    +	}
    +
    +	// ...
    +
    +	// Post some characters that will be used within an ISR.  If the queue
    +	// is full then this task will block for xTicksToWait ticks.
    +	cValueToPost = 'a';
    +	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
    +	cValueToPost = 'b';
    +	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
    +
    +	// ... keep posting characters ... this task may block when the queue
    +	// becomes full.
    +
    +	cValueToPost = 'c';
    +	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
    + }
    +
    + // ISR that outputs all the characters received on the queue.
    + void vISR_Routine( void )
    + {
    + BaseType_t xTaskWokenByReceive = pdFALSE;
    + char cRxedChar;
    +
    +	while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
    +	{
    +		// A character was received.  Output the character now.
    +		vOutputCharacter( cRxedChar );
    +
    +		// If removing the character from the queue woke the task that was
    +		// posting onto the queue cTaskWokenByReceive will have been set to
    +		// pdTRUE.  No matter how many times this loop iterates only one
    +		// task will be woken.
    +	}
    +
    +	if( cTaskWokenByPost != ( char ) pdFALSE;
    +	{
    +		taskYIELD ();
    +	}
    + }
    + 
    + * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* + * Utilities to query queues that are safe to use from an ISR. These utilities + * should be used only from witin an ISR, or within a critical section. + */ +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/* + * The functions defined above are for passing data to and from tasks. The + * functions below are the equivalents for passing data to and from + * co-routines. + * + * These functions are called from the co-routine macro implementation and + * should not be called directly from application code. Instead use the macro + * wrappers defined within croutine.h. + */ +BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ); +BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxTaskWoken ); +BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ); +BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ); + +/* + * For internal use only. Use xSemaphoreCreateMutex(), + * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling + * these functions directly. + */ +QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; +void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Use xSemaphoreTakeMutexRecursive() or + * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. + */ +BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) PRIVILEGED_FUNCTION; + +/* + * Reset a queue back to its original empty state. The return value is now + * obsolete and is always set to pdPASS. + */ +#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE ) + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger. If you are not using a kernel + * aware debugger then this function can be ignored. + * + * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the + * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 + * within FreeRTOSConfig.h for the registry to be available. Its value + * does not effect the number of queues, semaphores and mutexes that can be + * created - just the number that the registry can hold. + * + * @param xQueue The handle of the queue being added to the registry. This + * is the handle returned by a call to xQueueCreate(). Semaphore and mutex + * handles can also be passed in here. + * + * @param pcName The name to be associated with the handle. This is the + * name that the kernel aware debugger will display. The queue registry only + * stores a pointer to the string - so the string must be persistent (global or + * preferably in ROM/Flash), not on the stack. + */ +#if( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to + * remove the queue, semaphore or mutex from the register. If you are not using + * a kernel aware debugger then this function can be ignored. + * + * @param xQueue The handle of the queue being removed from the registry. + */ +#if( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * The queue registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call pcQueueGetName() to look + * up and return the name of a queue in the queue registry from the queue's + * handle. + * + * @param xQueue The handle of the queue the name of which will be returned. + * @return If the queue is in the registry then a pointer to the name of the + * queue is returned. If the queue is not in the registry then NULL is + * returned. + */ +#if( configQUEUE_REGISTRY_SIZE > 0 ) + const char *pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/* + * Generic version of the function used to creaet a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Generic version of the function used to creaet a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Queue sets provide a mechanism to allow a task to block (pend) on a read + * operation from multiple queues or semaphores simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * A queue set must be explicitly created using a call to xQueueCreateSet() + * before it can be used. Once created, standard FreeRTOS queues and semaphores + * can be added to the set using calls to xQueueAddToSet(). + * xQueueSelectFromSet() is then used to determine which, if any, of the queues + * or semaphores contained in the set is in a state where a queue read or + * semaphore take operation would be successful. + * + * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: An additional 4 bytes of RAM is required for each space in a every + * queue added to a queue set. Therefore counting semaphores that have a high + * maximum count value should not be added to a queue set. + * + * Note 4: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param uxEventQueueLength Queue sets store events that occur on + * the queues and semaphores contained in the set. uxEventQueueLength specifies + * the maximum number of events that can be queued at once. To be absolutely + * certain that events are not lost uxEventQueueLength should be set to the + * total sum of the length of the queues added to the set, where binary + * semaphores and mutexes have a length of 1, and counting semaphores have a + * length set by their maximum count value. Examples: + * + If a queue set is to hold a queue of length 5, another queue of length 12, + * and a binary semaphore, then uxEventQueueLength should be set to + * (5 + 12 + 1), or 18. + * + If a queue set is to hold three binary semaphores then uxEventQueueLength + * should be set to (1 + 1 + 1 ), or 3. + * + If a queue set is to hold a counting semaphore that has a maximum count of + * 5, and a counting semaphore that has a maximum count of 3, then + * uxEventQueueLength should be set to (5 + 3), or 8. + * + * @return If the queue set is created successfully then a handle to the created + * queue set is returned. Otherwise NULL is returned. + */ +QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; + +/* + * Adds a queue or semaphore to a queue set that was previously created by a + * call to xQueueCreateSet(). + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being added to + * the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set to which the queue or semaphore + * is being added. + * + * @return If the queue or semaphore was successfully added to the queue set + * then pdPASS is returned. If the queue could not be successfully added to the + * queue set because it is already a member of a different queue set then pdFAIL + * is returned. + */ +BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * Removes a queue or semaphore from a queue set. A queue or semaphore can only + * be removed from a set if the queue or semaphore is empty. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being removed + * from the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set in which the queue or semaphore + * is included. + * + * @return If the queue or semaphore was successfully removed from the queue set + * then pdPASS is returned. If the queue was not in the queue set, or the + * queue (or semaphore) was not empty, then pdFAIL is returned. + */ +BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * xQueueSelectFromSet() selects from the members of a queue set a queue or + * semaphore that either contains data (in the case of a queue) or is available + * to take (in the case of a semaphore). xQueueSelectFromSet() effectively + * allows a task to block (pend) on a read operation on all the queues and + * semaphores in a queue set simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueSet The queue set on which the task will (potentially) block. + * + * @param xTicksToWait The maximum time, in ticks, that the calling task will + * remain in the Blocked state (with other tasks executing) to wait for a member + * of the queue set to be ready for a successful queue read or semaphore take + * operation. + * + * @return xQueueSelectFromSet() will return the handle of a queue (cast to + * a QueueSetMemberHandle_t type) contained in the queue set that contains data, + * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained + * in the queue set that is available, or NULL if no such queue or semaphore + * exists before before the specified block time expires. + */ +QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * A version of xQueueSelectFromSet() that can be used from an ISR. + */ +QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* Not public API functions. */ +void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; +void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + + +#ifdef __cplusplus +} +#endif + +#endif /* QUEUE_H */ + diff --git a/STM32F1/libraries/FreeRTOS900/utility/readme.txt b/STM32F1/libraries/FreeRTOS900/utility/readme.txt new file mode 100644 index 000000000..58480c56b --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/readme.txt @@ -0,0 +1,17 @@ +Each real time kernel port consists of three files that contain the core kernel +components and are common to every port, and one or more files that are +specific to a particular microcontroller and or compiler. + ++ The FreeRTOS/Source directory contains the three files that are common to +every port - list.c, queue.c and tasks.c. The kernel is contained within these +three files. croutine.c implements the optional co-routine functionality - which +is normally only used on very memory limited systems. + ++ The FreeRTOS/Source/Portable directory contains the files that are specific to +a particular microcontroller and or compiler. + ++ The FreeRTOS/Source/include directory contains the real time kernel header +files. + +See the readme file in the FreeRTOS/Source/Portable directory for more +information. \ No newline at end of file diff --git a/STM32F1/libraries/FreeRTOS900/utility/semphr.h b/STM32F1/libraries/FreeRTOS900/utility/semphr.h new file mode 100644 index 000000000..a674b02a4 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/semphr.h @@ -0,0 +1,1171 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include semphr.h" +#endif + +#include "queue.h" + +typedef QueueHandle_t SemaphoreHandle_t; + +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) +#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + + +/** + * semphr. h + *
    vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
    + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Macro that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
    +    // This is a macro so pass the variable in directly.
    +    vSemaphoreCreateBinary( xSemaphore );
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // The semaphore was created successfully.
    +        // The semaphore can now be used.
    +    }
    + }
    + 
    + * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define vSemaphoreCreateBinary( xSemaphore ) \ + { \ + ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + ( void ) xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } +#endif + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateBinary( void )
    + * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see http://www.freertos.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @return Handle to the created semaphore, or NULL if the memory required to + * hold the semaphore's data structures could not be allocated. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
    +    // This is a macro so pass the variable in directly.
    +    xSemaphore = xSemaphoreCreateBinary();
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // The semaphore was created successfully.
    +        // The semaphore can now be used.
    +    }
    + }
    + 
    + * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer )
    + * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * NOTE: In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see http://www.freertos.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the semaphore is created then a handle to the created semaphore is + * returned. If pxSemaphoreBuffer is NULL then NULL is returned. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore = NULL;
    + StaticSemaphore_t xSemaphoreBuffer;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
    +    // The semaphore's data structures will be placed in the xSemaphoreBuffer
    +    // variable, the address of which is passed into the function.  The
    +    // function's parameter is not NULL, so the function will not attempt any
    +    // dynamic memory allocation, and therefore the function will not return
    +    // return NULL.
    +    xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer );
    +
    +    // Rest of task code goes here.
    + }
    + 
    + * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic + * \ingroup Semaphores + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticSemaphore, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
    xSemaphoreTake(
    + *                   SemaphoreHandle_t xSemaphore,
    + *                   TickType_t xBlockTime
    + *               )
    + * + * Macro to obtain a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @param xSemaphore A handle to the semaphore being taken - obtained when + * the semaphore was created. + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. A block + * time of portMAX_DELAY can be used to block indefinitely (provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    + // A task that creates a semaphore.
    + void vATask( void * pvParameters )
    + {
    +    // Create the semaphore to guard a shared resource.
    +    xSemaphore = xSemaphoreCreateBinary();
    + }
    +
    + // A task that uses the semaphore.
    + void vAnotherTask( void * pvParameters )
    + {
    +    // ... Do other things.
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // See if we can obtain the semaphore.  If the semaphore is not available
    +        // wait 10 ticks to see if it becomes free.
    +        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
    +        {
    +            // We were able to obtain the semaphore and can now access the
    +            // shared resource.
    +
    +            // ...
    +
    +            // We have finished accessing the shared resource.  Release the
    +            // semaphore.
    +            xSemaphoreGive( xSemaphore );
    +        }
    +        else
    +        {
    +            // We could not obtain the semaphore and can therefore not access
    +            // the shared resource safely.
    +        }
    +    }
    + }
    + 
    + * \defgroup xSemaphoreTake xSemaphoreTake + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueGenericReceive( ( QueueHandle_t ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) + +/** + * semphr. h + * xSemaphoreTakeRecursive( + * SemaphoreHandle_t xMutex, + * TickType_t xBlockTime + * ) + * + * Macro to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: +
    + SemaphoreHandle_t xMutex = NULL;
    +
    + // A task that creates a mutex.
    + void vATask( void * pvParameters )
    + {
    +    // Create the mutex to guard a shared resource.
    +    xMutex = xSemaphoreCreateRecursiveMutex();
    + }
    +
    + // A task that uses the mutex.
    + void vAnotherTask( void * pvParameters )
    + {
    +    // ... Do other things.
    +
    +    if( xMutex != NULL )
    +    {
    +        // See if we can obtain the mutex.  If the mutex is not available
    +        // wait 10 ticks to see if it becomes free.
    +        if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
    +        {
    +            // We were able to obtain the mutex and can now access the
    +            // shared resource.
    +
    +            // ...
    +            // For some reason due to the nature of the code further calls to
    +			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
    +			// code these would not be just sequential calls as this would make
    +			// no sense.  Instead the calls are likely to be buried inside
    +			// a more complex call structure.
    +            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    +            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    +
    +            // The mutex has now been 'taken' three times, so will not be
    +			// available to another task until it has also been given back
    +			// three times.  Again it is unlikely that real code would have
    +			// these calls sequentially, but instead buried in a more complex
    +			// call structure.  This is just for illustrative purposes.
    +            xSemaphoreGiveRecursive( xMutex );
    +			xSemaphoreGiveRecursive( xMutex );
    +			xSemaphoreGiveRecursive( xMutex );
    +
    +			// Now the mutex can be taken by other tasks.
    +        }
    +        else
    +        {
    +            // We could not obtain the mutex and can therefore not access
    +            // the shared resource safely.
    +        }
    +    }
    + }
    + 
    + * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * \ingroup Semaphores + */ +#if( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) +#endif + +/** + * semphr. h + *
    xSemaphoreGive( SemaphoreHandle_t xSemaphore )
    + * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Create the semaphore to guard a shared resource.
    +    xSemaphore = vSemaphoreCreateBinary();
    +
    +    if( xSemaphore != NULL )
    +    {
    +        if( xSemaphoreGive( xSemaphore ) != pdTRUE )
    +        {
    +            // We would expect this call to fail because we cannot give
    +            // a semaphore without first "taking" it!
    +        }
    +
    +        // Obtain the semaphore - don't block if the semaphore is not
    +        // immediately available.
    +        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
    +        {
    +            // We now have the semaphore and can access the shared resource.
    +
    +            // ...
    +
    +            // We have finished accessing the shared resource so can free the
    +            // semaphore.
    +            if( xSemaphoreGive( xSemaphore ) != pdTRUE )
    +            {
    +                // We would not expect this call to fail because we must have
    +                // obtained the semaphore to get here.
    +            }
    +        }
    +    }
    + }
    + 
    + * \defgroup xSemaphoreGive xSemaphoreGive + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + *
    xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex )
    + * + * Macro to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: +
    + SemaphoreHandle_t xMutex = NULL;
    +
    + // A task that creates a mutex.
    + void vATask( void * pvParameters )
    + {
    +    // Create the mutex to guard a shared resource.
    +    xMutex = xSemaphoreCreateRecursiveMutex();
    + }
    +
    + // A task that uses the mutex.
    + void vAnotherTask( void * pvParameters )
    + {
    +    // ... Do other things.
    +
    +    if( xMutex != NULL )
    +    {
    +        // See if we can obtain the mutex.  If the mutex is not available
    +        // wait 10 ticks to see if it becomes free.
    +        if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )
    +        {
    +            // We were able to obtain the mutex and can now access the
    +            // shared resource.
    +
    +            // ...
    +            // For some reason due to the nature of the code further calls to
    +			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
    +			// code these would not be just sequential calls as this would make
    +			// no sense.  Instead the calls are likely to be buried inside
    +			// a more complex call structure.
    +            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    +            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    +
    +            // The mutex has now been 'taken' three times, so will not be
    +			// available to another task until it has also been given back
    +			// three times.  Again it is unlikely that real code would have
    +			// these calls sequentially, it would be more likely that the calls
    +			// to xSemaphoreGiveRecursive() would be called as a call stack
    +			// unwound.  This is just for demonstrative purposes.
    +            xSemaphoreGiveRecursive( xMutex );
    +			xSemaphoreGiveRecursive( xMutex );
    +			xSemaphoreGiveRecursive( xMutex );
    +
    +			// Now the mutex can be taken by other tasks.
    +        }
    +        else
    +        {
    +            // We could not obtain the mutex and can therefore not access
    +            // the shared resource safely.
    +        }
    +    }
    + }
    + 
    + * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * \ingroup Semaphores + */ +#if( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) +#endif + +/** + * semphr. h + *
    + xSemaphoreGiveFromISR(
    +                          SemaphoreHandle_t xSemaphore,
    +                          BaseType_t *pxHigherPriorityTaskWoken
    +                      )
    + * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: +
    + \#define LONG_TIME 0xffff
    + \#define TICKS_TO_WAIT	10
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    + // Repetitive task.
    + void vATask( void * pvParameters )
    + {
    +    for( ;; )
    +    {
    +        // We want this task to run every 10 ticks of a timer.  The semaphore
    +        // was created before this task was started.
    +
    +        // Block waiting for the semaphore to become available.
    +        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
    +        {
    +            // It is time to execute.
    +
    +            // ...
    +
    +            // We have finished our task.  Return to the top of the loop where
    +            // we will block on the semaphore until it is time to execute
    +            // again.  Note when using the semaphore for synchronisation with an
    +			// ISR in this manner there is no need to 'give' the semaphore back.
    +        }
    +    }
    + }
    +
    + // Timer ISR
    + void vTimerISR( void * pvParameters )
    + {
    + static uint8_t ucLocalTickCount = 0;
    + static BaseType_t xHigherPriorityTaskWoken;
    +
    +    // A timer tick has occurred.
    +
    +    // ... Do other time functions.
    +
    +    // Is it time for vATask () to run?
    +	xHigherPriorityTaskWoken = pdFALSE;
    +    ucLocalTickCount++;
    +    if( ucLocalTickCount >= TICKS_TO_WAIT )
    +    {
    +        // Unblock the task by releasing the semaphore.
    +        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
    +
    +        // Reset the count so we release the semaphore again in 10 ticks time.
    +        ucLocalTickCount = 0;
    +    }
    +
    +    if( xHigherPriorityTaskWoken != pdFALSE )
    +    {
    +        // We can force a context switch here.  Context switching from an
    +        // ISR uses port specific syntax.  Check the demo task for your port
    +        // to find the syntax required.
    +    }
    + }
    + 
    + * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + *
    + xSemaphoreTakeFromISR(
    +                          SemaphoreHandle_t xSemaphore,
    +                          BaseType_t *pxHigherPriorityTaskWoken
    +                      )
    + * + * Macro to take a semaphore from an ISR. The semaphore must have + * previously been created with a call to xSemaphoreCreateBinary() or + * xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR, however taking a semaphore from an ISR + * is not a common operation. It is likely to only be useful when taking a + * counting semaphore when an interrupt is obtaining an object from a resource + * pool (when the semaphore count indicates the number of resources available). + * + * @param xSemaphore A handle to the semaphore being taken. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully taken, otherwise + * pdFALSE + */ +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateMutex( void )
    + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * http://www.freertos.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return If the mutex was successfully created then a handle to the created + * semaphore is returned. If there was not enough heap to allocate the mutex + * data structures then NULL is returned. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
    +    // This is a macro so pass the variable in directly.
    +    xSemaphore = xSemaphoreCreateMutex();
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // The semaphore was created successfully.
    +        // The semaphore can now be used.
    +    }
    + }
    + 
    + * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) +#endif + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer )
    + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * http://www.freertos.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will be used to hold the mutex's data structure, removing the need for + * the memory to be allocated dynamically. + * + * @return If the mutex was successfully created then a handle to the created + * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    + StaticSemaphore_t xMutexBuffer;
    +
    + void vATask( void * pvParameters )
    + {
    +    // A mutex cannot be used before it has been created.  xMutexBuffer is
    +    // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is
    +    // attempted.
    +    xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer );
    +
    +    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
    +    // so there is no need to check it.
    + }
    + 
    + * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic + * \ingroup Semaphores + */ + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )
    + * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * http://www.freertos.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * SemaphoreHandle_t. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
    +    // This is a macro so pass the variable in directly.
    +    xSemaphore = xSemaphoreCreateRecursiveMutex();
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // The semaphore was created successfully.
    +        // The semaphore can now be used.
    +    }
    + }
    + 
    + * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex + * \ingroup Semaphores + */ +#if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) +#endif + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer )
    + * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * http://www.freertos.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the recursive mutex's data structure, + * removing the need for the memory to be allocated dynamically. + * + * @return If the recursive mutex was successfully created then a handle to the + * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is + * returned. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    + StaticSemaphore_t xMutexBuffer;
    +
    + void vATask( void * pvParameters )
    + {
    +    // A recursive semaphore cannot be used before it is created.  Here a
    +    // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic().
    +    // The address of xMutexBuffer is passed into the function, and will hold
    +    // the mutexes data structures - so no dynamic memory allocation will be
    +    // attempted.
    +    xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );
    +
    +    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
    +    // so there is no need to check it.
    + }
    + 
    + * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic + * \ingroup Semaphores + */ +#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount )
    + * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * http://www.freertos.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer can + * instead optionally provide the memory that will get used by the counting + * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting + * semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    +
    + void vATask( void * pvParameters )
    + {
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    +    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
    +    // The max value to which the semaphore can count should be 10, and the
    +    // initial value assigned to the count should be 0.
    +    xSemaphore = xSemaphoreCreateCounting( 10, 0 );
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // The semaphore was created successfully.
    +        // The semaphore can now be used.
    +    }
    + }
    + 
    + * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) +#endif + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer )
    + * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * http://www.freertos.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer must + * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a + * counting semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the counting semaphore was successfully created then a handle to + * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL + * then NULL is returned. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    + StaticSemaphore_t xSemaphoreBuffer;
    +
    + void vATask( void * pvParameters )
    + {
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    +    // Counting semaphore cannot be used before they have been created.  Create
    +    // a counting semaphore using xSemaphoreCreateCountingStatic().  The max
    +    // value to which the semaphore can count is 10, and the initial value
    +    // assigned to the count will be 0.  The address of xSemaphoreBuffer is
    +    // passed in and will be used to hold the semaphore structure, so no dynamic
    +    // memory allocation will be used.
    +    xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer );
    +
    +    // No memory allocation was attempted so xSemaphore cannot be NULL, so there
    +    // is no need to check its value.
    + }
    + 
    + * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic + * \ingroup Semaphores + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
    void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
    + * + * Delete a semaphore. This function must be used with care. For example, + * do not delete a mutex type semaphore if the mutex is held by a task. + * + * @param xSemaphore A handle to the semaphore to be deleted. + * + * \defgroup vSemaphoreDelete vSemaphoreDelete + * \ingroup Semaphores + */ +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + *
    TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );
    + * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + * Note: This is a good way of determining if the calling task is the mutex + * holder, but not a good way of determining the identity of the mutex holder as + * the holder may change between the function exiting and the returned value + * being tested. + */ +#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) + +/** + * semphr.h + *
    UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
    + * + * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) + +#endif /* SEMAPHORE_H */ + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/stdint.readme b/STM32F1/libraries/FreeRTOS900/utility/stdint.readme new file mode 100644 index 000000000..4414c29ed --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/stdint.readme @@ -0,0 +1,27 @@ + +#ifndef FREERTOS_STDINT +#define FREERTOS_STDINT + +/******************************************************************************* + * THIS IS NOT A FULL stdint.h IMPLEMENTATION - It only contains the definitions + * necessary to build the FreeRTOS code. It is provided to allow FreeRTOS to be + * built using compilers that do not provide their own stdint.h definition. + * + * To use this file: + * + * 1) Copy this file into the directory that contains your FreeRTOSConfig.h + * header file, as that directory will already be in the compilers include + * path. + * + * 2) Rename the copied file stdint.h. + * + */ + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned short uint16_t; +typedef long int32_t; +typedef unsigned long uint32_t; + +#endif /* FREERTOS_STDINT */ diff --git a/STM32F1/libraries/FreeRTOS900/utility/task.h b/STM32F1/libraries/FreeRTOS900/utility/task.h new file mode 100644 index 000000000..d0643c09e --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/task.h @@ -0,0 +1,2267 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef INC_TASK_H +#define INC_TASK_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include task.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + +#define tskKERNEL_VERSION_NUMBER "V9.0.0" +#define tskKERNEL_VERSION_MAJOR 9 +#define tskKERNEL_VERSION_MINOR 0 +#define tskKERNEL_VERSION_BUILD 0 + +/** + * task. h + * + * Type by which tasks are referenced. For example, a call to xTaskCreate + * returns (via a pointer parameter) an TaskHandle_t variable that can then + * be used as a parameter to vTaskDelete to delete the task. + * + * \defgroup TaskHandle_t TaskHandle_t + * \ingroup Tasks + */ +typedef void * TaskHandle_t; + +/* + * Defines the prototype to which the application task hook function must + * conform. + */ +typedef BaseType_t (*TaskHookFunction_t)( void * ); + +/* Task states returned by eTaskGetState. */ +typedef enum +{ + eRunning = 0, /* A task is querying the state of itself, so must be running. */ + eReady, /* The task being queried is in a read or pending ready list. */ + eBlocked, /* The task being queried is in the Blocked state. */ + eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ + eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ + eInvalid /* Used as an 'invalid state' value. */ +} eTaskState; + +/* Actions that can be performed when vTaskNotify() is called. */ +typedef enum +{ + eNoAction = 0, /* Notify the task without updating its notify value. */ + eSetBits, /* Set bits in the task's notification value. */ + eIncrement, /* Increment the task's notification value. */ + eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ + eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ +} eNotifyAction; + +/* + * Used internally only. + */ +typedef struct xTIME_OUT +{ + BaseType_t xOverflowCount; + TickType_t xTimeOnEntering; +} TimeOut_t; + +/* + * Defines the memory ranges allocated to the task when an MPU is used. + */ +typedef struct xMEMORY_REGION +{ + void *pvBaseAddress; + uint32_t ulLengthInBytes; + uint32_t ulParameters; +} MemoryRegion_t; + +/* + * Parameters required to create an MPU protected task. + */ +typedef struct xTASK_PARAMETERS +{ + TaskFunction_t pvTaskCode; + const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + uint16_t usStackDepth; + void *pvParameters; + UBaseType_t uxPriority; + StackType_t *puxStackBuffer; + MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; +} TaskParameters_t; + +/* Used with the uxTaskGetSystemState() function to return the state of each task +in the system. */ +typedef struct xTASK_STATUS +{ + TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ + const char *pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + UBaseType_t xTaskNumber; /* A number unique to the task. */ + eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ + UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ + UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ + uint32_t ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ + StackType_t *pxStackBase; /* Points to the lowest address of the task's stack area. */ + uint16_t usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ +} TaskStatus_t; + +/* Possible return values for eTaskConfirmSleepModeStatus(). */ +typedef enum +{ + eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPORESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ + eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ + eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ +} eSleepModeStatus; + +/** + * Defines the priority used by the idle task. This must not be modified. + * + * \ingroup TaskUtils + */ +#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) + +/** + * task. h + * + * Macro for forcing a context switch. + * + * \defgroup taskYIELD taskYIELD + * \ingroup SchedulerControl + */ +#define taskYIELD() portYIELD() + +/** + * task. h + * + * Macro to mark the start of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL + * \ingroup SchedulerControl + */ +#define taskENTER_CRITICAL() portENTER_CRITICAL() +#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + +/** + * task. h + * + * Macro to mark the end of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL + * \ingroup SchedulerControl + */ +#define taskEXIT_CRITICAL() portEXIT_CRITICAL() +#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) +/** + * task. h + * + * Macro to disable all maskable interrupts. + * + * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + +/** + * task. h + * + * Macro to enable microcontroller interrupts. + * + * \defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() + +/* Definitions returned by xTaskGetSchedulerState(). taskSCHEDULER_SUSPENDED is +0 to generate more optimal code when configASSERT() is defined as the constant +is used in assert() statements. */ +#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) +#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) +#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) + + +/*----------------------------------------------------------- + * TASK CREATION API + *----------------------------------------------------------*/ + +/** + * task. h + *
    + BaseType_t xTaskCreate(
    +							  TaskFunction_t pvTaskCode,
    +							  const char * const pcName,
    +							  uint16_t usStackDepth,
    +							  void *pvParameters,
    +							  UBaseType_t uxPriority,
    +							  TaskHandle_t *pvCreatedTask
    +						  );
    + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * http://www.freertos.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * See xTaskCreateStatic() for a version that does not use any dynamic memory + * allocation. + * + * xTaskCreate() can only be used to create a task that has unrestricted + * access to the entire microcontroller memory map. Systems that include MPU + * support can alternatively create an MPU constrained task using + * xTaskCreateRestricted(). + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pvCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: +
    + // Task to be created.
    + void vTaskCode( void * pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		 // Task code goes here.
    +	 }
    + }
    +
    + // Function that creates a task.
    + void vOtherFunction( void )
    + {
    + static uint8_t ucParameterToPass;
    + TaskHandle_t xHandle = NULL;
    +
    +	 // Create the task, storing the handle.  Note that the passed parameter ucParameterToPass
    +	 // must exist for the lifetime of the task, so in this case is declared static.  If it was just an
    +	 // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
    +	 // the new task attempts to access it.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
    +     configASSERT( xHandle );
    +
    +	 // Use the handle to delete the task.
    +     if( xHandle != NULL )
    +     {
    +	     vTaskDelete( xHandle );
    +     }
    + }
    +   
    + * \defgroup xTaskCreate xTaskCreate + * \ingroup Tasks + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint16_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/** + * task. h + *
    + TaskHandle_t xTaskCreateStatic( TaskFunction_t pvTaskCode,
    +								 const char * const pcName,
    +								 uint32_t ulStackDepth,
    +								 void *pvParameters,
    +								 UBaseType_t uxPriority,
    +								 StackType_t *pxStackBuffer,
    +								 StaticTask_t *pxTaskBuffer );
    + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * http://www.freertos.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. The maximum length of the string is defined by + * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h. + * + * @param ulStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 32-bits wide and ulStackDepth is defined as 100 then 400 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task will run. + * + * @param pxStackBuffer Must point to a StackType_t array that has at least + * ulStackDepth indexes - the array will then be used as the task's stack, + * removing the need for the stack to be allocated dynamically. + * + * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will + * then be used to hold the task's data structures, removing the need for the + * memory to be allocated dynamically. + * + * @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will + * be created and pdPASS is returned. If either pxStackBuffer or pxTaskBuffer + * are NULL then the task will not be created and + * errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY is returned. + * + * Example usage: +
    +
    +    // Dimensions the buffer that the task being created will use as its stack.
    +    // NOTE:  This is the number of words the stack will hold, not the number of
    +    // bytes.  For example, if each stack item is 32-bits, and this is set to 100,
    +    // then 400 bytes (100 * 32-bits) will be allocated.
    +    #define STACK_SIZE 200
    +
    +    // Structure that will hold the TCB of the task being created.
    +    StaticTask_t xTaskBuffer;
    +
    +    // Buffer that the task being created will use as its stack.  Note this is
    +    // an array of StackType_t variables.  The size of StackType_t is dependent on
    +    // the RTOS port.
    +    StackType_t xStack[ STACK_SIZE ];
    +
    +    // Function that implements the task being created.
    +    void vTaskCode( void * pvParameters )
    +    {
    +        // The parameter value is expected to be 1 as 1 is passed in the
    +        // pvParameters value in the call to xTaskCreateStatic().
    +        configASSERT( ( uint32_t ) pvParameters == 1UL );
    +
    +        for( ;; )
    +        {
    +            // Task code goes here.
    +        }
    +    }
    +
    +    // Function that creates a task.
    +    void vOtherFunction( void )
    +    {
    +        TaskHandle_t xHandle = NULL;
    +
    +        // Create the task without using any dynamic memory allocation.
    +        xHandle = xTaskCreateStatic(
    +                      vTaskCode,       // Function that implements the task.
    +                      "NAME",          // Text name for the task.
    +                      STACK_SIZE,      // Stack size in words, not bytes.
    +                      ( void * ) 1,    // Parameter passed into the task.
    +                      tskIDLE_PRIORITY,// Priority at which the task is created.
    +                      xStack,          // Array to use as the task's stack.
    +                      &xTaskBuffer );  // Variable to hold the task's data structure.
    +
    +        // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have
    +        // been created, and xHandle will be the task's handle.  Use the handle
    +        // to suspend the task.
    +        vTaskSuspend( xHandle );
    +    }
    +   
    + * \defgroup xTaskCreateStatic xTaskCreateStatic + * \ingroup Tasks + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * task. h + *
    + BaseType_t xTaskCreateRestricted( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );
    + * + * xTaskCreateRestricted() should only be used in systems that include an MPU + * implementation. + * + * Create a new task and add it to the list of tasks that are ready to run. + * The function parameters define the memory regions and associated access + * permissions allocated to the task. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: +
    +// Create an TaskParameters_t structure that defines the task to be created.
    +static const TaskParameters_t xCheckTaskParameters =
    +{
    +	vATask,		// pvTaskCode - the function that implements the task.
    +	"ATask",	// pcName - just a text name for the task to assist debugging.
    +	100,		// usStackDepth	- the stack size DEFINED IN WORDS.
    +	NULL,		// pvParameters - passed into the task function as the function parameters.
    +	( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.
    +	cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.
    +
    +	// xRegions - Allocate up to three separate memory regions for access by
    +	// the task, with appropriate access permissions.  Different processors have
    +	// different memory alignment requirements - refer to the FreeRTOS documentation
    +	// for full information.
    +	{
    +		// Base address					Length	Parameters
    +        { cReadWriteArray,				32,		portMPU_REGION_READ_WRITE },
    +        { cReadOnlyArray,				32,		portMPU_REGION_READ_ONLY },
    +        { cPrivilegedOnlyAccessArray,	128,	portMPU_REGION_PRIVILEGED_READ_WRITE }
    +	}
    +};
    +
    +int main( void )
    +{
    +TaskHandle_t xHandle;
    +
    +	// Create a task from the const structure defined above.  The task handle
    +	// is requested (the second parameter is not NULL) but in this case just for
    +	// demonstration purposes as its not actually used.
    +	xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );
    +
    +	// Start the scheduler.
    +	vTaskStartScheduler();
    +
    +	// Will only get here if there was insufficient memory to create the idle
    +	// and/or timer task.
    +	for( ;; );
    +}
    +   
    + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + *
    + void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions );
    + * + * Memory regions are assigned to a restricted task when the task is created by + * a call to xTaskCreateRestricted(). These regions can be redefined using + * vTaskAllocateMPURegions(). + * + * @param xTask The handle of the task being updated. + * + * @param xRegions A pointer to an MemoryRegion_t structure that contains the + * new memory region definitions. + * + * Example usage: +
    +// Define an array of MemoryRegion_t structures that configures an MPU region
    +// allowing read/write access for 1024 bytes starting at the beginning of the
    +// ucOneKByte array.  The other two of the maximum 3 definable regions are
    +// unused so set to zero.
    +static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] =
    +{
    +	// Base address		Length		Parameters
    +	{ ucOneKByte,		1024,		portMPU_REGION_READ_WRITE },
    +	{ 0,				0,			0 },
    +	{ 0,				0,			0 }
    +};
    +
    +void vATask( void *pvParameters )
    +{
    +	// This task was created such that it has access to certain regions of
    +	// memory as defined by the MPU configuration.  At some point it is
    +	// desired that these MPU regions are replaced with that defined in the
    +	// xAltRegions const struct above.  Use a call to vTaskAllocateMPURegions()
    +	// for this purpose.  NULL is used as the task handle to indicate that this
    +	// function should modify the MPU regions of the calling task.
    +	vTaskAllocateMPURegions( NULL, xAltRegions );
    +
    +	// Now the task can continue its function, but from this point on can only
    +	// access its stack and the ucOneKByte array (unless any other statically
    +	// defined or shared regions have been declared elsewhere).
    +}
    +   
    + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskDelete( TaskHandle_t xTask );
    + * + * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Remove a task from the RTOS real time kernel's management. The task being + * deleted will be removed from all ready, blocked, suspended and event lists. + * + * NOTE: The idle task is responsible for freeing the kernel allocated + * memory from tasks that have been deleted. It is therefore important that + * the idle task is not starved of microcontroller processing time if your + * application makes any calls to vTaskDelete (). Memory allocated by the + * task code is not automatically freed, and should be freed before the task + * is deleted. + * + * See the demo application file death.c for sample code that utilises + * vTaskDelete (). + * + * @param xTask The handle of the task to be deleted. Passing NULL will + * cause the calling task to be deleted. + * + * Example usage: +
    + void vOtherFunction( void )
    + {
    + TaskHandle_t xHandle;
    +
    +	 // Create the task, storing the handle.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    +
    +	 // Use the handle to delete the task.
    +	 vTaskDelete( xHandle );
    + }
    +   
    + * \defgroup vTaskDelete vTaskDelete + * \ingroup Tasks + */ +void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK CONTROL API + *----------------------------------------------------------*/ + +/** + * task. h + *
    void vTaskDelay( const TickType_t xTicksToDelay );
    + * + * Delay a task for a given number of ticks. The actual time that the + * task remains blocked depends on the tick rate. The constant + * portTICK_PERIOD_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * + * vTaskDelay() specifies a time at which the task wishes to unblock relative to + * the time at which vTaskDelay() is called. For example, specifying a block + * period of 100 ticks will cause the task to unblock 100 ticks after + * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method + * of controlling the frequency of a periodic task as the path taken through the + * code, as well as other task and interrupt activity, will effect the frequency + * at which vTaskDelay() gets called and therefore the time at which the task + * next executes. See vTaskDelayUntil() for an alternative API function designed + * to facilitate fixed frequency execution. It does this by specifying an + * absolute time (rather than a relative time) at which the calling task should + * unblock. + * + * @param xTicksToDelay The amount of time, in tick periods, that + * the calling task should block. + * + * Example usage: + + void vTaskFunction( void * pvParameters ) + { + // Block for 500ms. + const TickType_t xDelay = 500 / portTICK_PERIOD_MS; + + for( ;; ) + { + // Simply toggle the LED every 500ms, blocking between each toggle. + vToggleLED(); + vTaskDelay( xDelay ); + } + } + + * \defgroup vTaskDelay vTaskDelay + * \ingroup TaskCtrl + */ +void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement );
    + * + * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Delay a task until a specified time. This function can be used by periodic + * tasks to ensure a constant execution frequency. + * + * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will + * cause a task to block for the specified number of ticks from the time vTaskDelay () is + * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed + * execution frequency as the time between a task starting to execute and that task + * calling vTaskDelay () may not be fixed [the task may take a different path though the + * code between calls, or may get interrupted or preempted a different number of times + * each time it executes]. + * + * Whereas vTaskDelay () specifies a wake time relative to the time at which the function + * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to + * unblock. + * + * The constant portTICK_PERIOD_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the + * task was last unblocked. The variable must be initialised with the current time + * prior to its first use (see the example below). Following this the variable is + * automatically updated within vTaskDelayUntil (). + * + * @param xTimeIncrement The cycle time period. The task will be unblocked at + * time *pxPreviousWakeTime + xTimeIncrement. Calling vTaskDelayUntil with the + * same xTimeIncrement parameter value will cause the task to execute with + * a fixed interface period. + * + * Example usage: +
    + // Perform an action every 10 ticks.
    + void vTaskFunction( void * pvParameters )
    + {
    + TickType_t xLastWakeTime;
    + const TickType_t xFrequency = 10;
    +
    +	 // Initialise the xLastWakeTime variable with the current time.
    +	 xLastWakeTime = xTaskGetTickCount ();
    +	 for( ;; )
    +	 {
    +		 // Wait for the next cycle.
    +		 vTaskDelayUntil( &xLastWakeTime, xFrequency );
    +
    +		 // Perform action here.
    +	 }
    + }
    +   
    + * \defgroup vTaskDelayUntil vTaskDelayUntil + * \ingroup TaskCtrl + */ +void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    BaseType_t xTaskAbortDelay( TaskHandle_t xTask );
    + * + * INCLUDE_xTaskAbortDelay must be defined as 1 in FreeRTOSConfig.h for this + * function to be available. + * + * A task will enter the Blocked state when it is waiting for an event. The + * event it is waiting for can be a temporal event (waiting for a time), such + * as when vTaskDelay() is called, or an event on an object, such as when + * xQueueReceive() or ulTaskNotifyTake() is called. If the handle of a task + * that is in the Blocked state is used in a call to xTaskAbortDelay() then the + * task will leave the Blocked state, and return from whichever function call + * placed the task into the Blocked state. + * + * @param xTask The handle of the task to remove from the Blocked state. + * + * @return If the task referenced by xTask was not in the Blocked state then + * pdFAIL is returned. Otherwise pdPASS is returned. + * + * \defgroup xTaskAbortDelay xTaskAbortDelay + * \ingroup TaskCtrl + */ +BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );
    + * + * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the priority of any task. + * + * @param xTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of xTask. + * + * Example usage: +
    + void vAFunction( void )
    + {
    + TaskHandle_t xHandle;
    +
    +	 // Create a task, storing the handle.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    +
    +	 // ...
    +
    +	 // Use the handle to obtain the priority of the created task.
    +	 // It was created with tskIDLE_PRIORITY, but may have changed
    +	 // it itself.
    +	 if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )
    +	 {
    +		 // The task has changed it's priority.
    +	 }
    +
    +	 // ...
    +
    +	 // Is our priority higher than the created task?
    +	 if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) )
    +	 {
    +		 // Our priority (obtained using NULL handle) is higher.
    +	 }
    + }
    +   
    + * \defgroup uxTaskPriorityGet uxTaskPriorityGet + * \ingroup TaskCtrl + */ +UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask );
    + * + * A version of uxTaskPriorityGet() that can be used from an ISR. + */ +UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    eTaskState eTaskGetState( TaskHandle_t xTask );
    + * + * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the state of any task. States are encoded by the eTaskState + * enumerated type. + * + * @param xTask Handle of the task to be queried. + * + * @return The state of xTask at the time the function was called. Note the + * state of the task might change between the function being called, and the + * functions return value being tested by the calling task. + */ +eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
    + * + * configUSE_TRACE_FACILITY must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * Populates a TaskStatus_t structure with information about a task. + * + * @param xTask Handle of the task being queried. If xTask is NULL then + * information will be returned about the calling task. + * + * @param pxTaskStatus A pointer to the TaskStatus_t structure that will be + * filled with information about the task referenced by the handle passed using + * the xTask parameter. + * + * @xGetFreeStackSpace The TaskStatus_t structure contains a member to report + * the stack high water mark of the task being queried. Calculating the stack + * high water mark takes a relatively long time, and can make the system + * temporarily unresponsive - so the xGetFreeStackSpace parameter is provided to + * allow the high water mark checking to be skipped. The high watermark value + * will only be written to the TaskStatus_t structure if xGetFreeStackSpace is + * not set to pdFALSE; + * + * @param eState The TaskStatus_t structure contains a member to report the + * state of the task being queried. Obtaining the task state is not as fast as + * a simple assignment - so the eState parameter is provided to allow the state + * information to be omitted from the TaskStatus_t structure. To obtain state + * information then set eState to eInvalid - otherwise the value passed in + * eState will be reported as the task state in the TaskStatus_t structure. + * + * Example usage: +
    + void vAFunction( void )
    + {
    + TaskHandle_t xHandle;
    + TaskStatus_t xTaskDetails;
    +
    +    // Obtain the handle of a task from its name.
    +    xHandle = xTaskGetHandle( "Task_Name" );
    +
    +    // Check the handle is not NULL.
    +    configASSERT( xHandle );
    +
    +    // Use the handle to obtain further information about the task.
    +    vTaskGetInfo( xHandle,
    +                  &xTaskDetails,
    +                  pdTRUE, // Include the high water mark in xTaskDetails.
    +                  eInvalid ); // Include the task state in xTaskDetails.
    + }
    +   
    + * \defgroup vTaskGetInfo vTaskGetInfo + * \ingroup TaskCtrl + */ +void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
    + * + * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Set the priority of any task. + * + * A context switch will occur before the function returns if the priority + * being set is higher than the currently executing task. + * + * @param xTask Handle to the task for which the priority is being set. + * Passing a NULL handle results in the priority of the calling task being set. + * + * @param uxNewPriority The priority to which the task will be set. + * + * Example usage: +
    + void vAFunction( void )
    + {
    + TaskHandle_t xHandle;
    +
    +	 // Create a task, storing the handle.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    +
    +	 // ...
    +
    +	 // Use the handle to raise the priority of the created task.
    +	 vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
    +
    +	 // ...
    +
    +	 // Use a NULL handle to raise our priority to the same value.
    +	 vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
    + }
    +   
    + * \defgroup vTaskPrioritySet vTaskPrioritySet + * \ingroup TaskCtrl + */ +void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskSuspend( TaskHandle_t xTaskToSuspend );
    + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Suspend any task. When suspended a task will never get any microcontroller + * processing time, no matter what its priority. + * + * Calls to vTaskSuspend are not accumulative - + * i.e. calling vTaskSuspend () twice on the same task still only requires one + * call to vTaskResume () to ready the suspended task. + * + * @param xTaskToSuspend Handle to the task being suspended. Passing a NULL + * handle will cause the calling task to be suspended. + * + * Example usage: +
    + void vAFunction( void )
    + {
    + TaskHandle_t xHandle;
    +
    +	 // Create a task, storing the handle.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    +
    +	 // ...
    +
    +	 // Use the handle to suspend the created task.
    +	 vTaskSuspend( xHandle );
    +
    +	 // ...
    +
    +	 // The created task will not run during this period, unless
    +	 // another task calls vTaskResume( xHandle ).
    +
    +	 //...
    +
    +
    +	 // Suspend ourselves.
    +	 vTaskSuspend( NULL );
    +
    +	 // We cannot get here unless another task calls vTaskResume
    +	 // with our handle as the parameter.
    + }
    +   
    + * \defgroup vTaskSuspend vTaskSuspend + * \ingroup TaskCtrl + */ +void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskResume( TaskHandle_t xTaskToResume );
    + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Resumes a suspended task. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * vTaskResume (). + * + * @param xTaskToResume Handle to the task being readied. + * + * Example usage: +
    + void vAFunction( void )
    + {
    + TaskHandle_t xHandle;
    +
    +	 // Create a task, storing the handle.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    +
    +	 // ...
    +
    +	 // Use the handle to suspend the created task.
    +	 vTaskSuspend( xHandle );
    +
    +	 // ...
    +
    +	 // The created task will not run during this period, unless
    +	 // another task calls vTaskResume( xHandle ).
    +
    +	 //...
    +
    +
    +	 // Resume the suspended task ourselves.
    +	 vTaskResume( xHandle );
    +
    +	 // The created task will once again get microcontroller processing
    +	 // time in accordance with its priority within the system.
    + }
    +   
    + * \defgroup vTaskResume vTaskResume + * \ingroup TaskCtrl + */ +void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void xTaskResumeFromISR( TaskHandle_t xTaskToResume );
    + * + * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * An implementation of vTaskResume() that can be called from within an ISR. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * xTaskResumeFromISR (). + * + * xTaskResumeFromISR() should not be used to synchronise a task with an + * interrupt if there is a chance that the interrupt could arrive prior to the + * task being suspended - as this can lead to interrupts being missed. Use of a + * semaphore as a synchronisation mechanism would avoid this eventuality. + * + * @param xTaskToResume Handle to the task being readied. + * + * @return pdTRUE if resuming the task should result in a context switch, + * otherwise pdFALSE. This is used by the ISR to determine if a context switch + * may be required following the ISR. + * + * \defgroup vTaskResumeFromISR vTaskResumeFromISR + * \ingroup TaskCtrl + */ +BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * SCHEDULER CONTROL + *----------------------------------------------------------*/ + +/** + * task. h + *
    void vTaskStartScheduler( void );
    + * + * Starts the real time kernel tick processing. After calling the kernel + * has control over which tasks are executed and when. + * + * See the demo application file main.c for an example of creating + * tasks and starting the kernel. + * + * Example usage: +
    + void vAFunction( void )
    + {
    +	 // Create at least one task before starting the kernel.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
    +
    +	 // Start the real time kernel with preemption.
    +	 vTaskStartScheduler ();
    +
    +	 // Will not get here unless a task calls vTaskEndScheduler ()
    + }
    +   
    + * + * \defgroup vTaskStartScheduler vTaskStartScheduler + * \ingroup SchedulerControl + */ +void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskEndScheduler( void );
    + * + * NOTE: At the time of writing only the x86 real mode port, which runs on a PC + * in place of DOS, implements this function. + * + * Stops the real time kernel tick. All created tasks will be automatically + * deleted and multitasking (either preemptive or cooperative) will + * stop. Execution then resumes from the point where vTaskStartScheduler () + * was called, as if vTaskStartScheduler () had just returned. + * + * See the demo application file main. c in the demo/PC directory for an + * example that uses vTaskEndScheduler (). + * + * vTaskEndScheduler () requires an exit function to be defined within the + * portable layer (see vPortEndScheduler () in port. c for the PC port). This + * performs hardware specific operations such as stopping the kernel tick. + * + * vTaskEndScheduler () will cause all of the resources allocated by the + * kernel to be freed - but will not free resources allocated by application + * tasks. + * + * Example usage: +
    + void vTaskCode( void * pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		 // Task code goes here.
    +
    +		 // At some point we want to end the real time kernel processing
    +		 // so call ...
    +		 vTaskEndScheduler ();
    +	 }
    + }
    +
    + void vAFunction( void )
    + {
    +	 // Create at least one task before starting the kernel.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
    +
    +	 // Start the real time kernel with preemption.
    +	 vTaskStartScheduler ();
    +
    +	 // Will only get here when the vTaskCode () task has called
    +	 // vTaskEndScheduler ().  When we get here we are back to single task
    +	 // execution.
    + }
    +   
    + * + * \defgroup vTaskEndScheduler vTaskEndScheduler + * \ingroup SchedulerControl + */ +void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskSuspendAll( void );
    + * + * Suspends the scheduler without disabling interrupts. Context switches will + * not occur while the scheduler is suspended. + * + * After calling vTaskSuspendAll () the calling task will continue to execute + * without risk of being swapped out until a call to xTaskResumeAll () has been + * made. + * + * API functions that have the potential to cause a context switch (for example, + * vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler + * is suspended. + * + * Example usage: +
    + void vTask1( void * pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		 // Task code goes here.
    +
    +		 // ...
    +
    +		 // At some point the task wants to perform a long operation during
    +		 // which it does not want to get swapped out.  It cannot use
    +		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
    +		 // operation may cause interrupts to be missed - including the
    +		 // ticks.
    +
    +		 // Prevent the real time kernel swapping out the task.
    +		 vTaskSuspendAll ();
    +
    +		 // Perform the operation here.  There is no need to use critical
    +		 // sections as we have all the microcontroller processing time.
    +		 // During this time interrupts will still operate and the kernel
    +		 // tick count will be maintained.
    +
    +		 // ...
    +
    +		 // The operation is complete.  Restart the kernel.
    +		 xTaskResumeAll ();
    +	 }
    + }
    +   
    + * \defgroup vTaskSuspendAll vTaskSuspendAll + * \ingroup SchedulerControl + */ +void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    BaseType_t xTaskResumeAll( void );
    + * + * Resumes scheduler activity after it was suspended by a call to + * vTaskSuspendAll(). + * + * xTaskResumeAll() only resumes the scheduler. It does not unsuspend tasks + * that were previously suspended by a call to vTaskSuspend(). + * + * @return If resuming the scheduler caused a context switch then pdTRUE is + * returned, otherwise pdFALSE is returned. + * + * Example usage: +
    + void vTask1( void * pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		 // Task code goes here.
    +
    +		 // ...
    +
    +		 // At some point the task wants to perform a long operation during
    +		 // which it does not want to get swapped out.  It cannot use
    +		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
    +		 // operation may cause interrupts to be missed - including the
    +		 // ticks.
    +
    +		 // Prevent the real time kernel swapping out the task.
    +		 vTaskSuspendAll ();
    +
    +		 // Perform the operation here.  There is no need to use critical
    +		 // sections as we have all the microcontroller processing time.
    +		 // During this time interrupts will still operate and the real
    +		 // time kernel tick count will be maintained.
    +
    +		 // ...
    +
    +		 // The operation is complete.  Restart the kernel.  We want to force
    +		 // a context switch - but there is no point if resuming the scheduler
    +		 // caused a context switch already.
    +		 if( !xTaskResumeAll () )
    +		 {
    +			  taskYIELD ();
    +		 }
    +	 }
    + }
    +   
    + * \defgroup xTaskResumeAll xTaskResumeAll + * \ingroup SchedulerControl + */ +BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK UTILITIES + *----------------------------------------------------------*/ + +/** + * task. h + *
    TickType_t xTaskGetTickCount( void );
    + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * \defgroup xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    TickType_t xTaskGetTickCountFromISR( void );
    + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * This is a version of xTaskGetTickCount() that is safe to be called from an + * ISR - provided that TickType_t is the natural word size of the + * microcontroller being used or interrupt nesting is either not supported or + * not being used. + * + * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    uint16_t uxTaskGetNumberOfTasks( void );
    + * + * @return The number of tasks that the real time kernel is currently managing. + * This includes all ready, blocked and suspended tasks. A task that + * has been deleted but not yet freed by the idle task will also be + * included in the count. + * + * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks + * \ingroup TaskUtils + */ +UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    char *pcTaskGetName( TaskHandle_t xTaskToQuery );
    + * + * @return The text (human readable) name of the task referenced by the handle + * xTaskToQuery. A task can query its own name by either passing in its own + * handle, or by setting xTaskToQuery to NULL. + * + * \defgroup pcTaskGetName pcTaskGetName + * \ingroup TaskUtils + */ +char *pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + *
    TaskHandle_t xTaskGetHandle( const char *pcNameToQuery );
    + * + * NOTE: This function takes a relatively long time to complete and should be + * used sparingly. + * + * @return The handle of the task that has the human readable name pcNameToQuery. + * NULL is returned if no matching name is found. INCLUDE_xTaskGetHandle + * must be set to 1 in FreeRTOSConfig.h for pcTaskGetHandle() to be available. + * + * \defgroup pcTaskGetHandle pcTaskGetHandle + * \ingroup TaskUtils + */ +TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task.h + *
    UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );
    + * + * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* When using trace macros it is sometimes necessary to include task.h before +FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, +so the following two prototypes will cause a compilation error. This can be +fixed by simply guarding against the inclusion of these two prototypes unless +they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration +constant. */ +#ifdef configUSE_APPLICATION_TASK_TAG + #if configUSE_APPLICATION_TASK_TAG == 1 + /** + * task.h + *
    void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction );
    + * + * Sets pxHookFunction to be the task hook function used by the task xTask. + * Passing xTask as NULL has the effect of setting the calling tasks hook + * function. + */ + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; + + /** + * task.h + *
    void xTaskGetApplicationTaskTag( TaskHandle_t xTask );
    + * + * Returns the pxHookFunction value assigned to the task xTask. + */ + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ + +#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + + /* Each task contains an array of pointers that is dimensioned by the + configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. The + kernel does not use the pointers itself, so the application writer can use + the pointers for any purpose they wish. The following two functions are + used to set and query a pointer respectively. */ + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) PRIVILEGED_FUNCTION; + void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) PRIVILEGED_FUNCTION; + +#endif + +/** + * task.h + *
    BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );
    + * + * Calls the hook function associated with xTask. Passing xTask as NULL has + * the effect of calling the Running tasks (the calling task) hook function. + * + * pvParameter is passed to the hook function for the task to interpret as it + * wants. The return value is the value returned by the task hook function + * registered by the user. + */ +BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) PRIVILEGED_FUNCTION; + +/** + * xTaskGetIdleTaskHandle() is only available if + * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * Simply returns the handle of the idle task. It is not valid to call + * xTaskGetIdleTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for + * uxTaskGetSystemState() to be available. + * + * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in + * the system. TaskStatus_t structures contain, among other things, members + * for the task handle, task name, task priority, task state, and total amount + * of run time consumed by the task. See the TaskStatus_t structure + * definition in this file for the full member list. + * + * NOTE: This function is intended for debugging use only as its use results in + * the scheduler remaining suspended for an extended period. + * + * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. + * The array must contain at least one TaskStatus_t structure for each task + * that is under the control of the RTOS. The number of tasks under the control + * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. + * + * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray + * parameter. The size is specified as the number of indexes in the array, or + * the number of TaskStatus_t structures contained in the array, not by the + * number of bytes in the array. + * + * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in + * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the + * total run time (as defined by the run time stats clock, see + * http://www.freertos.org/rtos-run-time-stats.html) since the target booted. + * pulTotalRunTime can be set to NULL to omit the total run time information. + * + * @return The number of TaskStatus_t structures that were populated by + * uxTaskGetSystemState(). This should equal the number returned by the + * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed + * in the uxArraySize parameter was too small. + * + * Example usage: +
    +    // This example demonstrates how a human readable table of run time stats
    +	// information is generated from raw data provided by uxTaskGetSystemState().
    +	// The human readable table is written to pcWriteBuffer
    +	void vTaskGetRunTimeStats( char *pcWriteBuffer )
    +	{
    +	TaskStatus_t *pxTaskStatusArray;
    +	volatile UBaseType_t uxArraySize, x;
    +	uint32_t ulTotalRunTime, ulStatsAsPercentage;
    +
    +		// Make sure the write buffer does not contain a string.
    +		*pcWriteBuffer = 0x00;
    +
    +		// Take a snapshot of the number of tasks in case it changes while this
    +		// function is executing.
    +		uxArraySize = uxTaskGetNumberOfTasks();
    +
    +		// Allocate a TaskStatus_t structure for each task.  An array could be
    +		// allocated statically at compile time.
    +		pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );
    +
    +		if( pxTaskStatusArray != NULL )
    +		{
    +			// Generate raw status information about each task.
    +			uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime );
    +
    +			// For percentage calculations.
    +			ulTotalRunTime /= 100UL;
    +
    +			// Avoid divide by zero errors.
    +			if( ulTotalRunTime > 0 )
    +			{
    +				// For each populated position in the pxTaskStatusArray array,
    +				// format the raw data as human readable ASCII data
    +				for( x = 0; x < uxArraySize; x++ )
    +				{
    +					// What percentage of the total run time has the task used?
    +					// This will always be rounded down to the nearest integer.
    +					// ulTotalRunTimeDiv100 has already been divided by 100.
    +					ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;
    +
    +					if( ulStatsAsPercentage > 0UL )
    +					{
    +						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage );
    +					}
    +					else
    +					{
    +						// If the percentage is zero here then the task has
    +						// consumed less than 1% of the total run time.
    +						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter );
    +					}
    +
    +					pcWriteBuffer += strlen( ( char * ) pcWriteBuffer );
    +				}
    +			}
    +
    +			// The array is no longer needed, free the memory it consumes.
    +			vPortFree( pxTaskStatusArray );
    +		}
    +	}
    +	
    + */ +UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskList( char *pcWriteBuffer );
    + * + * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must + * both be defined as 1 for this function to be available. See the + * configuration section of the FreeRTOS.org website for more information. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or + * suspended ('S'). + * + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays task + * names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that might + * bloat the code size, use a lot of stack, and provide different results on + * different platforms. An alternative, tiny, third party, and limited + * functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly through a + * call to vTaskList(). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ASCII form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * \defgroup vTaskList vTaskList + * \ingroup TaskUtils + */ +void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + *
    void vTaskGetRunTimeStats( char *pcWriteBuffer );
    + * + * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS + * must both be defined as 1 for this function to be available. The application + * must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * Calling vTaskGetRunTimeStats() writes the total execution time of each + * task into a buffer, both as an absolute count value and as a percentage + * of the total system execution time. + * + * NOTE 2: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays the + * amount of time each task has spent in the Running state in both absolute and + * percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library function + * that might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, and + * limited functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() directly + * to get access to raw stats data, rather than indirectly through a call to + * vTaskGetRunTimeStats(). + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ASCII form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats + * \ingroup TaskUtils + */ +void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + *
    BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );
    + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNofify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * pulPreviousNotificationValue - + * Can be used to pass out the subject task's notification value before any + * bits are modified by the notify function. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotify xTaskNotify + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) PRIVILEGED_FUNCTION; +#define xTaskNotify( xTaskToNotify, ulValue, eAction ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL ) +#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) + +/** + * task. h + *
    BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );
    + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * A version of xTaskNotify() that can be used from an interrupt service routine + * (ISR). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNofify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should + * be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotify xTaskNotify + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) +#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + *
    BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );
    + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value + * will be cleared in the calling task's notification value before the task + * checks to see if any notifications are pending, and optionally blocks if no + * notifications are pending. Setting ulBitsToClearOnEntry to ULONG_MAX (if + * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have + * the effect of resetting the task's notification value to 0. Setting + * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged. + * + * @param ulBitsToClearOnExit If a notification is pending or received before + * the calling task exits the xTaskNotifyWait() function then the task's + * notification value (see the xTaskNotify() API function) is passed out using + * the pulNotificationValue parameter. Then any bits that are set in + * ulBitsToClearOnExit will be cleared in the task's notification value (note + * *pulNotificationValue is set before any bits are cleared). Setting + * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL + * (if limits.h is not included) will have the effect of resetting the task's + * notification value to 0 before the function exits. Setting + * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged + * when the function exits (in which case the value passed out in + * pulNotificationValue will match the task's notification value). + * + * @param pulNotificationValue Used to pass the task's notification value out + * of the function. Note the value passed out will not be effected by the + * clearing of any bits caused by ulBitsToClearOnExit being non-zero. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for a notification to be received, should a notification + * not already be pending when xTaskNotifyWait() was called. The task + * will not consume any processing time while it is in the Blocked state. This + * is specified in kernel ticks, the macro pdMS_TO_TICSK( value_in_ms ) can be + * used to convert a time specified in milliseconds to a time specified in + * ticks. + * + * @return If a notification was received (including notifications that were + * already pending when xTaskNotifyWait was called) then pdPASS is + * returned. Otherwise pdFAIL is returned. + * + * \defgroup xTaskNotifyWait xTaskNotifyWait + * \ingroup TaskNotifications + */ +BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
    + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro + * to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * xTaskNotifyGive() is a helper macro intended for use when task notifications + * are used as light weight and faster binary or counting semaphore equivalents. + * Actual FreeRTOS semaphores are given using the xSemaphoreGive() API function, + * the equivalent action that instead uses a task notification is + * xTaskNotifyGive(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotificationTake() API function rather than the + * xTaskNotifyWait() API function. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the + * eAction parameter set to eIncrement - so pdPASS is always returned. + * + * \defgroup xTaskNotifyGive xTaskNotifyGive + * \ingroup TaskNotifications + */ +#define xTaskNotifyGive( xTaskToNotify ) xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL ) + +/** + * task. h + *
    void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );
    + *
    + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro
    + * to be available.
    + *
    + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private
    + * "notification value", which is a 32-bit unsigned integer (uint32_t).
    + *
    + * A version of xTaskNotifyGive() that can be called from an interrupt service
    + * routine (ISR).
    + *
    + * Events can be sent to a task using an intermediary object.  Examples of such
    + * objects are queues, semaphores, mutexes and event groups.  Task notifications
    + * are a method of sending an event directly to a task without the need for such
    + * an intermediary object.
    + *
    + * A notification sent to a task can optionally perform an action, such as
    + * update, overwrite or increment the task's notification value.  In that way
    + * task notifications can be used to send data to a task, or be used as light
    + * weight and fast binary or counting semaphores.
    + *
    + * vTaskNotifyGiveFromISR() is intended for use when task notifications are
    + * used as light weight and faster binary or counting semaphore equivalents.
    + * Actual FreeRTOS semaphores are given from an ISR using the
    + * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses
    + * a task notification is vTaskNotifyGiveFromISR().
    + *
    + * When task notifications are being used as a binary or counting semaphore
    + * equivalent then the task being notified should wait for the notification
    + * using the ulTaskNotificationTake() API function rather than the
    + * xTaskNotifyWait() API function.
    + *
    + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details.
    + *
    + * @param xTaskToNotify The handle of the task being notified.  The handle to a
    + * task can be returned from the xTaskCreate() API function used to create the
    + * task, and the handle of the currently running task can be obtained by calling
    + * xTaskGetCurrentTaskHandle().
    + *
    + * @param pxHigherPriorityTaskWoken  vTaskNotifyGiveFromISR() will set
    + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the
    + * task to which the notification was sent to leave the Blocked state, and the
    + * unblocked task has a priority higher than the currently running task.  If
    + * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch
    + * should be requested before the interrupt is exited.  How a context switch is
    + * requested from an ISR is dependent on the port - see the documentation page
    + * for the port in use.
    + *
    + * \defgroup xTaskNotifyWait xTaskNotifyWait
    + * \ingroup TaskNotifications
    + */
    +void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
    +
    +/**
    + * task. h
    + * 
    uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
    + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * ulTaskNotifyTake() is intended for use when a task notification is used as a + * faster and lighter weight binary or counting semaphore alternative. Actual + * FreeRTOS semaphores are taken using the xSemaphoreTake() API function, the + * equivalent action that instead uses a task notification is + * ulTaskNotifyTake(). + * + * When a task is using its notification value as a binary or counting semaphore + * other tasks should send notifications to it using the xTaskNotifyGive() + * macro, or xTaskNotify() function with the eAction parameter set to + * eIncrement. + * + * ulTaskNotifyTake() can either clear the task's notification value to + * zero on exit, in which case the notification value acts like a binary + * semaphore, or decrement the task's notification value on exit, in which case + * the notification value acts like a counting semaphore. + * + * A task can use ulTaskNotifyTake() to [optionally] block to wait for a + * the task's notification value to be non-zero. The task does not consume any + * CPU time while it is in the Blocked state. + * + * Where as xTaskNotifyWait() will return when a notification is pending, + * ulTaskNotifyTake() will return when the task's notification value is + * not zero. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's + * notification value is decremented when the function exits. In this way the + * notification value acts like a counting semaphore. If xClearCountOnExit is + * not pdFALSE then the task's notification value is cleared to zero when the + * function exits. In this way the notification value acts like a binary + * semaphore. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for the task's notification value to be greater than zero, + * should the count not already be greater than zero when + * ulTaskNotifyTake() was called. The task will not consume any processing + * time while it is in the Blocked state. This is specified in kernel ticks, + * the macro pdMS_TO_TICSK( value_in_ms ) can be used to convert a time + * specified in milliseconds to a time specified in ticks. + * + * @return The task's notification count before it is either cleared to zero or + * decremented (see the xClearCountOnExit parameter). + * + * \defgroup ulTaskNotifyTake ulTaskNotifyTake + * \ingroup TaskNotifications + */ +uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
    + * + * If the notification state of the task referenced by the handle xTask is + * eNotified, then set the task's notification state to eNotWaitingNotification. + * The task's notification value is not altered. Set xTask to NULL to clear the + * notification state of the calling task. + * + * @return pdTRUE if the task's notification state was set to + * eNotWaitingNotification, otherwise pdFALSE. + * \defgroup xTaskNotifyStateClear xTaskNotifyStateClear + * \ingroup TaskNotifications + */ +BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ); + +/*----------------------------------------------------------- + * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES + *----------------------------------------------------------*/ + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Called from the real time kernel tick (either preemptive or cooperative), + * this increments the tick count and checks if any tasks that are blocked + * for a finite period required removing from a blocked list and placing on + * a ready list. If a non-zero value is returned then a context switch is + * required because either: + * + A task was removed from a blocked list because its timeout had expired, + * or + * + Time slicing is in use and there is a task of equal priority to the + * currently running task. + */ +BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes the calling task from the ready list and places it both + * on the list of tasks waiting for a particular event, and the + * list of delayed tasks. The task will be removed from both lists + * and replaced on the ready list should either the event occur (and + * there be no higher priority tasks waiting on the same event) or + * the delay period expires. + * + * The 'unordered' version replaces the event list item value with the + * xItemValue value, and inserts the list item at the end of the list. + * + * The 'ordered' version uses the existing event list item value (which is the + * owning tasks priority) to insert the list item into the event list is task + * priority order. + * + * @param pxEventList The list containing tasks that are blocked waiting + * for the event to occur. + * + * @param xItemValue The item value to use for the event list item when the + * event list is not ordered by task priority. + * + * @param xTicksToWait The maximum amount of time that the task should wait + * for the event to occur. This is specified in kernel ticks,the constant + * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time + * period. + */ +void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * This function performs nearly the same function as vTaskPlaceOnEventList(). + * The difference being that this function does not permit tasks to block + * indefinitely, whereas vTaskPlaceOnEventList() does. + * + */ +void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes a task from both the specified event list and the list of blocked + * tasks, and places it on a ready queue. + * + * xTaskRemoveFromEventList()/xTaskRemoveFromUnorderedEventList() will be called + * if either an event occurs to unblock a task, or the block timeout period + * expires. + * + * xTaskRemoveFromEventList() is used when the event list is in task priority + * order. It removes the list item from the head of the event list as that will + * have the highest priority owning task of all the tasks on the event list. + * xTaskRemoveFromUnorderedEventList() is used when the event list is not + * ordered and the event list items hold something other than the owning tasks + * priority. In this case the event list item value is updated to the value + * passed in the xItemValue parameter. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION; +BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Sets the pointer to the current TCB to the TCB of the highest priority task + * that is ready to run. + */ +void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; + +/* + * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY + * THE EVENT BITS MODULE. + */ +TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the calling task. + */ +TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; + +/* + * Capture the current time status for future reference. + */ +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/* + * Compare the time status now with that previously captured to see if the + * timeout has expired. + */ +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * Shortcut used by the queue implementation to prevent unnecessary call to + * taskYIELD(); + */ +void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; + +/* + * Returns the scheduler state as taskSCHEDULER_RUNNING, + * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. + */ +BaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; + +/* + * Raises the priority of the mutex holder to that of the calling task should + * the mutex holder have a priority less than the calling task. + */ +void vTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Set the priority of a task back to its proper priority in the case that it + * inherited a higher priority while it was holding a semaphore. + */ +BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Get the uxTCBNumber assigned to the task referenced by the xTask parameter. + */ +UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* + * Set the uxTaskNumber of the task referenced by the xTask parameter to + * uxHandle. + */ +void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * If tickless mode is being used, or a low power mode is implemented, then + * the tick interrupt will not execute during idle periods. When this is the + * case, the tick count value maintained by the scheduler needs to be kept up + * to date with the actual execution time by being skipped forward by a time + * equal to the idle period. + */ +void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; + +/* + * Only avilable when configUSE_TICKLESS_IDLE is set to 1. + * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port + * specific sleep function to determine if it is ok to proceed with the sleep, + * and if it is ok to proceed, if it is ok to sleep indefinitely. + * + * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only + * called with the scheduler suspended, not from within a critical section. It + * is therefore possible for an interrupt to request a context switch between + * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being + * entered. eTaskConfirmSleepModeStatus() should be called from a short + * critical section between the timer being stopped and the sleep mode being + * entered to ensure it is ok to proceed into the sleep mode. + */ +eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Increment the mutex held count when a mutex is + * taken and return the handle of the task that has taken the mutex. + */ +void *pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif +#endif /* INC_TASK_H */ + + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/tasks.c b/STM32F1/libraries/FreeRTOS900/utility/tasks.c new file mode 100644 index 000000000..6c261a651 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/tasks.c @@ -0,0 +1,4807 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "StackMacros.h" + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + +/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting +functions but without including stdio.h here. */ +#if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) + /* At the bottom of this file are two optional functions that can be used + to generate human readable text from the raw data generated by the + uxTaskGetSystemState() function. Note the formatting functions are provided + for convenience only, and are NOT considered part of the kernel. */ + #include +#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */ + +#if( configUSE_PREEMPTION == 0 ) + /* If the cooperative scheduler is being used then a yield should not be + performed just because a higher priority task has been woken. */ + #define taskYIELD_IF_USING_PREEMPTION() +#else + #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* Values that can be assigned to the ucNotifyState member of the TCB. */ +#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) +#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) +#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) + +/* + * The value used to fill the stack of a task when the task is created. This + * is used purely for checking the high water mark for tasks. + */ +#define tskSTACK_FILL_BYTE ( 0xa5U ) + +/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using +dynamically allocated RAM, in which case when any task is deleted it is known +that both the task's stack and TCB need to be freed. Sometimes the +FreeRTOSConfig.h settings only allow a task to be created using statically +allocated RAM, in which case when any task is deleted it is known that neither +the task's stack or TCB should be freed. Sometimes the FreeRTOSConfig.h +settings allow a task to be created using either statically or dynamically +allocated RAM, in which case a member of the TCB is used to record whether the +stack and/or TCB were allocated statically or dynamically, so when a task is +deleted the RAM that was allocated dynamically is freed again and no attempt is +made to free the RAM that was allocated statically. +tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a +task to be created using either statically or dynamically allocated RAM. Note +that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with +a statically allocated stack and a dynamically allocated TCB. */ +#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE ( ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) || ( portUSING_MPU_WRAPPERS == 1 ) ) +#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 ) +#define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 ) +#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 ) + +/* + * Macros used by vListTask to indicate which state a task is in. + */ +#define tskBLOCKED_CHAR ( 'B' ) +#define tskREADY_CHAR ( 'R' ) +#define tskDELETED_CHAR ( 'D' ) +#define tskSUSPENDED_CHAR ( 'S' ) + +/* + * Some kernel aware debuggers require the data the debugger needs access to be + * global, rather than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + + /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is + performed in a generic way that is not optimised to any particular + microcontroller architecture. */ + + /* uxTopReadyPriority holds the priority of the highest priority ready + state task. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) \ + { \ + if( ( uxPriority ) > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( uxPriority ); \ + } \ + } /* taskRECORD_READY_PRIORITY */ + + /*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority = uxTopReadyPriority; \ + \ + /* Find the highest priority queue that contains ready tasks. */ \ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \ + { \ + configASSERT( uxTopPriority ); \ + --uxTopPriority; \ + } \ + \ + /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \ + the same priority get an equal share of the processor time. */ \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + uxTopReadyPriority = uxTopPriority; \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK */ + + /*-----------------------------------------------------------*/ + + /* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as + they are only required when a port optimised method of task selection is + being used. */ + #define taskRESET_READY_PRIORITY( uxPriority ) + #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + +#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is + performed in a way that is tailored to the particular microcontroller + architecture being used. */ + + /* A port optimised version is provided. Call the port defined macros. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + + /*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority; \ + \ + /* Find the highest priority list that contains ready tasks. */ \ + portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ + configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK() */ + + /*-----------------------------------------------------------*/ + + /* A port optimised version is provided, call it only if the TCB being reset + is being referenced from a ready list. If it is referenced from a delayed + or suspended list then it won't be in a ready list. */ + #define taskRESET_READY_PRIORITY( uxPriority ) \ + { \ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ + { \ + portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ + } \ + } + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick +count overflows. */ +#define taskSWITCH_DELAYED_LISTS() \ +{ \ + List_t *pxTemp; \ + \ + /* The delayed tasks list should be empty when the lists are switched. */ \ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ + \ + pxTemp = pxDelayedTaskList; \ + pxDelayedTaskList = pxOverflowDelayedTaskList; \ + pxOverflowDelayedTaskList = pxTemp; \ + xNumOfOverflows++; \ + prvResetNextTaskUnblockTime(); \ +} + +/*-----------------------------------------------------------*/ + +/* + * Place the task represented by pxTCB into the appropriate ready list for + * the task. It is inserted at the end of the list. + */ +#define prvAddTaskToReadyList( pxTCB ) \ + traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ + taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ + vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \ + tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +/*-----------------------------------------------------------*/ + +/* + * Several functions take an TaskHandle_t parameter that can optionally be NULL, + * where NULL is used to indicate that the handle of the currently executing + * task should be used in place of the parameter. This macro simply checks to + * see if the parameter is NULL and returns a pointer to the appropriate TCB. + */ +#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( TCB_t * ) pxCurrentTCB : ( TCB_t * ) ( pxHandle ) ) + +/* The item value of the event list item is normally used to hold the priority +of the task to which it belongs (coded to allow it to be held in reverse +priority order). However, it is occasionally borrowed for other purposes. It +is important its value is not updated due to a task priority change while it is +being used for another purpose. The following bit definition is used to inform +the scheduler that the value should not be changed - in which case it is the +responsibility of whichever module is using the value to ensure it gets set back +to its original value when it is released. */ +#if( configUSE_16_BIT_TICKS == 1 ) + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U +#else + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL +#endif + +/* + * Task control block. A task control block (TCB) is allocated for each task, + * and stores task state information, including a pointer to the task's context + * (the task's run time environment, including register values) + */ +typedef struct tskTaskControlBlock +{ + volatile StackType_t *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + #endif + + ListItem_t xStateListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ + UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ + StackType_t *pxStack; /*< Points to the start of the stack. */ + char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + #if ( portSTACK_GROWTH > 0 ) + StackType_t *pxEndOfStack; /*< Points to the end of the stack on architectures where the stack grows up from low memory. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ + #endif + + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxMutexesHeld; + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t pxTaskTag; + #endif + + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + + #if( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + /* Allocate a Newlib reent structure that is specific to this task. + Note Newlib support has been included by popular demand, but is not + used by the FreeRTOS maintainers themselves. FreeRTOS is not + responsible for resulting newlib operation. User must be familiar with + newlib and must provide system-wide implementations of the necessary + stubs. Be warned that (at the time of writing) the current newlib design + implements a system-wide malloc() that must be provided with locks. */ + struct _reent xNewLib_reent; + #endif + + #if( configUSE_TASK_NOTIFICATIONS == 1 ) + volatile uint32_t ulNotifiedValue; + volatile uint8_t ucNotifyState; + #endif + + /* See the comments above the definition of + tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDelayAborted; + #endif + +} tskTCB; + +/* The old tskTCB name is maintained above then typedefed to the new TCB_t name +below to enable the use of older kernel aware debuggers. */ +typedef tskTCB TCB_t; + +/*lint -e956 A manual analysis and inspection has been used to determine which +static variables must be declared volatile. */ + +PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL; + +/* Lists for ready and blocked tasks. --------------------*/ +PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ + +#if( INCLUDE_vTaskDelete == 1 ) + + PRIVILEGED_DATA static List_t xTasksWaitingTermination; /*< Tasks that have been deleted - but their memory not yet freed. */ + PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U; + +#endif + +#if ( INCLUDE_vTaskSuspend == 1 ) + + PRIVILEGED_DATA static List_t xSuspendedTaskList; /*< Tasks that are currently suspended. */ + +#endif + +/* Other file private variables. --------------------------------*/ +PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) 0U; +PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile UBaseType_t uxPendedTicks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile BaseType_t xYieldPending = pdFALSE; +PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0; +PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */ +PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle = NULL; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ + +/* Context switches are held pending while the scheduler is suspended. Also, +interrupts must not manipulate the xStateListItem of a TCB, or any of the +lists the xStateListItem can be referenced from, if the scheduler is suspended. +If an interrupt needs to unblock a task while the scheduler is suspended then it +moves the task's event list item into the xPendingReadyList, ready for the +kernel to move the task from the pending ready list into the real ready list +when the scheduler is unsuspended. The pending ready list itself can only be +accessed from a critical section. */ +PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) pdFALSE; + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */ + PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */ + +#endif + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ + +/* Callback function prototypes. --------------------------*/ +#if( configCHECK_FOR_STACK_OVERFLOW > 0 ) + extern void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName ); +#endif + +#if( configUSE_TICK_HOOK > 0 ) + extern void vApplicationTickHook( void ); +#endif + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); +#endif + +/* File private functions. --------------------------------*/ + +/** + * Utility task that simply returns pdTRUE if the task referenced by xTask is + * currently in the Suspended state, or pdFALSE if the task referenced by xTask + * is in any other state. + */ +#if ( INCLUDE_vTaskSuspend == 1 ) + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +#endif /* INCLUDE_vTaskSuspend */ + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first task. + */ +static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION; + +/* + * The idle task, which as all tasks is implemented as a never ending loop. + * The idle task is automatically created and added to the ready lists upon + * creation of the first user task. + * + * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); + +/* + * Utility to free all memory allocated by the scheduler to hold a TCB, + * including the stack pointed to by the TCB. + * + * This does not free memory allocated by the task itself (i.e. memory + * allocated by calls to pvPortMalloc from within the tasks application code). + */ +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t *pxTCB ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Used only by the idle task. This checks to see if anything has been placed + * in the list of tasks waiting to be deleted. If so the task is cleaned up + * and its TCB deleted. + */ +static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; + +/* + * The currently executing task is entering the Blocked state. Add the task to + * either the current or the overflow delayed task list. + */ +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * Fills an TaskStatus_t structure with information on each task that is + * referenced from the pxList list (which may be a ready list, a delayed list, + * a suspended list, etc.). + * + * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM + * NORMAL APPLICATION CODE. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Searches pxList for a task with name pcNameToQuery - returning a handle to + * the task if it is found, or NULL if the task is not found. + */ +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t *prvSearchForNameWithinSingleList( List_t *pxList, const char pcNameToQuery[] ) PRIVILEGED_FUNCTION; + +#endif + +/* + * When a task is created, the stack of the task is filled with a known value. + * This function determines the 'high water mark' of the task stack by + * determining how much of the stack remains at the original preset value. + */ +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + + static uint16_t prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Return the amount of time, in ticks, that will pass before the kernel will + * next move a task from the Blocked state to the Running state. + * + * This conditional compilation should use inequality to 0, not equality to 1. + * This is to ensure portSUPPRESS_TICKS_AND_SLEEP() can be called when user + * defined low power mode implementations require configUSE_TICKLESS_IDLE to be + * set to a value other than 1. + */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Set xNextTaskUnblockTime to the time at which the next Blocked state task + * will exit the Blocked state. + */ +static void prvResetNextTaskUnblockTime( void ); + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + /* + * Helper function used to pad task names with spaces when printing out + * human readable tables of task information. + */ + static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Called after a Task_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t *pxNewTCB, + const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/* + * Called after a new task has been created and initialised to place the task + * under the control of the scheduler. + */ +static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + TCB_t *pxNewTCB; + TaskHandle_t xReturn; + + configASSERT( puxStackBuffer != NULL ); + configASSERT( pxTaskBuffer != NULL ); + + if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) ) + { + /* The memory used for the task's TCB and stack are passed into this + function - use them. */ + pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer; + + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL ); + prvAddNewTaskToReadyList( pxNewTCB ); + } + else + { + xReturn = NULL; + } + + return xReturn; + } + +#endif /* SUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( portUSING_MPU_WRAPPERS == 1 ) + + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) + { + TCB_t *pxNewTCB; + BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + + configASSERT( pxTaskDefinition->puxStackBuffer ); + + if( pxTaskDefinition->puxStackBuffer != NULL ) + { + /* Allocate space for the TCB. Where the memory comes from depends + on the implementation of the port malloc function and whether or + not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + + /* Tasks can be created statically or dynamically, so note + this task had a statically allocated stack in case it is + later deleted. The TCB was allocated dynamically. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY; + + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions ); + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + } + + return xReturn; + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint16_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + TCB_t *pxNewTCB; + BaseType_t xReturn; + + /* If the stack grows down then allocate the stack then the TCB so the stack + does not grow into the TCB. Likewise if the stack grows up then allocate + the TCB then the stack. */ + #if( portSTACK_GROWTH > 0 ) + { + /* Allocate space for the TCB. Where the memory comes from depends on + the implementation of the port malloc function and whether or not static + allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + /* Allocate space for the stack used by the task being created. + The base of the stack memory stored in the TCB so the task can + be deleted later if required. */ + pxNewTCB->pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } + } + } + #else /* portSTACK_GROWTH */ + { + StackType_t *pxStack; + + /* Allocate space for the stack used by the task being created. */ + pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + if( pxStack != NULL ) + { + /* Allocate space for the TCB. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e961 MISRA exception as the casts are only redundant for some paths. */ + + if( pxNewTCB != NULL ) + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxStack; + } + else + { + /* The stack cannot be used as the TCB was not created. Free + it again. */ + vPortFree( pxStack ); + } + } + else + { + pxNewTCB = NULL; + } + } + #endif /* portSTACK_GROWTH */ + + if( pxNewTCB != NULL ) + { + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + task was created dynamically in case it is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t *pxNewTCB, + const MemoryRegion_t * const xRegions ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ +StackType_t *pxTopOfStack; +UBaseType_t x; + + #if( portUSING_MPU_WRAPPERS == 1 ) + /* Should the task be created in privileged mode? */ + BaseType_t xRunPrivileged; + if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) + { + xRunPrivileged = pdTRUE; + } + else + { + xRunPrivileged = pdFALSE; + } + uxPriority &= ~portPRIVILEGE_BIT; + #endif /* portUSING_MPU_WRAPPERS == 1 */ + + /* Avoid dependency on memset() if it is not required. */ + #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + { + /* Fill the stack with a known value to assist debugging. */ + ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) ); + } + #endif /* ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) ) */ + + /* Calculate the top of stack address. This depends on whether the stack + grows from high memory to low (as per the 80x86) or vice versa. + portSTACK_GROWTH is used to make the result positive or negative as required + by the port. */ + #if( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); + pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. */ + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + } + #else /* portSTACK_GROWTH */ + { + pxTopOfStack = pxNewTCB->pxStack; + + /* Check the alignment of the stack buffer is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxNewTCB->pxStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + /* The other extreme of the stack space is required if stack checking is + performed. */ + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); + } + #endif /* portSTACK_GROWTH */ + + /* Store the task name in the TCB. */ + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + pxNewTCB->pcTaskName[ x ] = pcName[ x ]; + + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + configMAX_TASK_NAME_LEN characters just in case the memory after the + string is not accessible (extremely unlikely). */ + if( pcName[ x ] == 0x00 ) + { + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Ensure the name string is terminated in the case that the string length + was greater or equal to configMAX_TASK_NAME_LEN. */ + pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0'; + + /* This is used as an array index so must ensure it's not too large. First + remove the privilege bit if one is present. */ + if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxNewTCB->uxPriority = uxPriority; + #if ( configUSE_MUTEXES == 1 ) + { + pxNewTCB->uxBasePriority = uxPriority; + pxNewTCB->uxMutexesHeld = 0; + } + #endif /* configUSE_MUTEXES */ + + vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); + vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); + + /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get + back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + { + pxNewTCB->uxCriticalNesting = ( UBaseType_t ) 0U; + } + #endif /* portCRITICAL_NESTING_IN_TCB */ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + { + pxNewTCB->pxTaskTag = NULL; + } + #endif /* configUSE_APPLICATION_TASK_TAG */ + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxNewTCB->ulRunTimeCounter = 0UL; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + vPortStoreTaskMPUSettings( &( pxNewTCB->xMPUSettings ), xRegions, pxNewTCB->pxStack, ulStackDepth ); + } + #else + { + /* Avoid compiler warning about unreferenced parameter. */ + ( void ) xRegions; + } + #endif + + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + { + for( x = 0; x < ( UBaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS; x++ ) + { + pxNewTCB->pvThreadLocalStoragePointers[ x ] = NULL; + } + } + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + pxNewTCB->ulNotifiedValue = 0; + pxNewTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Initialise this task's Newlib reent structure. */ + _REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) ); + } + #endif + + #if( INCLUDE_xTaskAbortDelay == 1 ) + { + pxNewTCB->ucDelayAborted = pdFALSE; + } + #endif + + /* Initialize the TCB stack to look as if the task was already running, + but had been interrupted by the scheduler. The return address is set + to the start of the task function. Once the stack has been initialised + the top of stack variable is updated. */ + #if( portUSING_MPU_WRAPPERS == 1 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #else /* portUSING_MPU_WRAPPERS */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + } + #endif /* portUSING_MPU_WRAPPERS */ + + if( ( void * ) pxCreatedTask != NULL ) + { + /* Pass the handle out in an anonymous way. The handle can be used to + change the created task's priority, delete the created task, etc.*/ + *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) +{ + /* Ensure interrupts don't access the task lists while the lists are being + updated. */ + taskENTER_CRITICAL(); + { + uxCurrentNumberOfTasks++; + if( pxCurrentTCB == NULL ) + { + /* There are no other tasks, or all the other tasks are in + the suspended state - make this the current task. */ + pxCurrentTCB = pxNewTCB; + + if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) + { + /* This is the first task to be created so do the preliminary + initialisation required. We will not recover if this call + fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If the scheduler is not already running, make this task the + current task if it is the highest priority task to be created + so far. */ + if( xSchedulerRunning == pdFALSE ) + { + if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ) + { + pxCurrentTCB = pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + uxTaskNumber++; + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif /* configUSE_TRACE_FACILITY */ + traceTASK_CREATE( pxNewTCB ); + + prvAddTaskToReadyList( pxNewTCB ); + + portSETUP_TCB( pxNewTCB ); + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than the current task + then it should run now. */ + if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + void vTaskDelete( TaskHandle_t xTaskToDelete ) + { + TCB_t *pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the calling task that is + being deleted. */ + pxTCB = prvGetTCBFromHandle( xTaskToDelete ); + + /* Remove task from the ready list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Increment the uxTaskNumber also so kernel aware debuggers can + detect that the task lists need re-generating. This is done before + portPRE_TASK_DELETE_HOOK() as in the Windows port that macro will + not return. */ + uxTaskNumber++; + + if( pxTCB == pxCurrentTCB ) + { + /* A task is deleting itself. This cannot complete within the + task itself, as a context switch to another task is required. + Place the task in the termination list. The idle task will + check the termination list and free up any memory allocated by + the scheduler for the TCB and stack of the deleted task. */ + vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) ); + + /* Increment the ucTasksDeleted variable so the idle task knows + there is a task that has been deleted and that it should therefore + check the xTasksWaitingTermination list. */ + ++uxDeletedTasksWaitingCleanUp; + + /* The pre-delete hook is primarily for the Windows simulator, + in which Windows specific clean up operations are performed, + after which it is not possible to yield away from this task - + hence xYieldPending is used to latch that a context switch is + required. */ + portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending ); + } + else + { + --uxCurrentNumberOfTasks; + prvDeleteTCB( pxTCB ); + + /* Reset the next expected unblock time in case it referred to + the task that has just been deleted. */ + prvResetNextTaskUnblockTime(); + } + + traceTASK_DELETE( pxTCB ); + } + taskEXIT_CRITICAL(); + + /* Force a reschedule if it is the currently running task that has just + been deleted. */ + if( xSchedulerRunning != pdFALSE ) + { + if( pxTCB == pxCurrentTCB ) + { + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelayUntil == 1 ) + + void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) + { + TickType_t xTimeToWake; + BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE; + + configASSERT( pxPreviousWakeTime ); + configASSERT( ( xTimeIncrement > 0U ) ); + configASSERT( uxSchedulerSuspended == 0 ); + + vTaskSuspendAll(); + { + /* Minor optimisation. The tick count cannot change in this + block. */ + const TickType_t xConstTickCount = xTickCount; + + /* Generate the tick time at which the task wants to wake. */ + xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; + + if( xConstTickCount < *pxPreviousWakeTime ) + { + /* The tick count has overflowed since this function was + lasted called. In this case the only time we should ever + actually delay is if the wake time has also overflowed, + and the wake time is greater than the tick time. When this + is the case it is as if neither time had overflowed. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The tick time has not overflowed. In this case we will + delay if either the wake time has overflowed, and/or the + tick time is less than the wake time. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Update the wake time ready for the next call. */ + *pxPreviousWakeTime = xTimeToWake; + + if( xShouldDelay != pdFALSE ) + { + traceTASK_DELAY_UNTIL( xTimeToWake ); + + /* prvAddCurrentTaskToDelayedList() needs the block time, not + the time to wake, so subtract the current tick count. */ + prvAddCurrentTaskToDelayedList( xTimeToWake - xConstTickCount, pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + xAlreadyYielded = xTaskResumeAll(); + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskDelayUntil */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + + void vTaskDelay( const TickType_t xTicksToDelay ) + { + BaseType_t xAlreadyYielded = pdFALSE; + + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( TickType_t ) 0U ) + { + configASSERT( uxSchedulerSuspended == 0 ); + vTaskSuspendAll(); + { + traceTASK_DELAY(); + + /* A task that is removed from the event list while the + scheduler is suspended will not get placed in the ready + list or removed from the blocked list until the scheduler + is resumed. + + This task cannot be in an event list as it is the currently + executing task. */ + prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE ); + } + xAlreadyYielded = xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskDelay */ +/*-----------------------------------------------------------*/ + +#if( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) ) + + eTaskState eTaskGetState( TaskHandle_t xTask ) + { + eTaskState eReturn; + List_t *pxStateList; + const TCB_t * const pxTCB = ( TCB_t * ) xTask; + + configASSERT( pxTCB ); + + if( pxTCB == pxCurrentTCB ) + { + /* The task calling this function is querying its own state. */ + eReturn = eRunning; + } + else + { + taskENTER_CRITICAL(); + { + pxStateList = ( List_t * ) listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); + } + taskEXIT_CRITICAL(); + + if( ( pxStateList == pxDelayedTaskList ) || ( pxStateList == pxOverflowDelayedTaskList ) ) + { + /* The task being queried is referenced from one of the Blocked + lists. */ + eReturn = eBlocked; + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + else if( pxStateList == &xSuspendedTaskList ) + { + /* The task being queried is referenced from the suspended + list. Is it genuinely suspended or is it block + indefinitely? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) + { + eReturn = eSuspended; + } + else + { + eReturn = eBlocked; + } + } + #endif + + #if ( INCLUDE_vTaskDelete == 1 ) + else if( ( pxStateList == &xTasksWaitingTermination ) || ( pxStateList == NULL ) ) + { + /* The task being queried is referenced from the deleted + tasks list, or it is not referenced from any lists at + all. */ + eReturn = eDeleted; + } + #endif + + else /*lint !e525 Negative indentation is intended to make use of pre-processor clearer. */ + { + /* If the task is not in any other state, it must be in the + Ready (including pending ready) state. */ + eReturn = eReady; + } + } + + return eReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_eTaskGetState */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + UBaseType_t uxReturn; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the that + called uxTaskPriorityGet() that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL(); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + UBaseType_t uxReturn, uxSavedInterruptState; + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* If null is passed in here then it is the priority of the calling + task that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptState ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + + void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) + { + TCB_t *pxTCB; + UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry; + BaseType_t xYieldRequired = pdFALSE; + + configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) ); + + /* Ensure the new priority is valid. */ + if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the calling + task that is being changed. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); + + #if ( configUSE_MUTEXES == 1 ) + { + uxCurrentBasePriority = pxTCB->uxBasePriority; + } + #else + { + uxCurrentBasePriority = pxTCB->uxPriority; + } + #endif + + if( uxCurrentBasePriority != uxNewPriority ) + { + /* The priority change may have readied a task of higher + priority than the calling task. */ + if( uxNewPriority > uxCurrentBasePriority ) + { + if( pxTCB != pxCurrentTCB ) + { + /* The priority of a task other than the currently + running task is being raised. Is the priority being + raised above that of the running task? */ + if( uxNewPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The priority of the running task is being raised, + but the running task must already be the highest + priority task able to run so no yield is required. */ + } + } + else if( pxTCB == pxCurrentTCB ) + { + /* Setting the priority of the running task down means + there may now be another task of higher priority that + is ready to execute. */ + xYieldRequired = pdTRUE; + } + else + { + /* Setting the priority of any other task down does not + require a yield as the running task must be above the + new priority of the task being modified. */ + } + + /* Remember the ready list the task might be referenced from + before its uxPriority member is changed so the + taskRESET_READY_PRIORITY() macro can function correctly. */ + uxPriorityUsedOnEntry = pxTCB->uxPriority; + + #if ( configUSE_MUTEXES == 1 ) + { + /* Only change the priority being used if the task is not + currently using an inherited priority. */ + if( pxTCB->uxBasePriority == pxTCB->uxPriority ) + { + pxTCB->uxPriority = uxNewPriority; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The base priority gets set whatever. */ + pxTCB->uxBasePriority = uxNewPriority; + } + #else + { + pxTCB->uxPriority = uxNewPriority; + } + #endif + + /* Only reset the event list item value if the value is not + being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task is in the blocked or suspended list we need do + nothing more than change it's priority variable. However, if + the task is in a ready list it needs to be removed and placed + in the list appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* The task is currently in its ready list - remove before adding + it to it's new ready list. As we are in a critical section we + can do this even if the scheduler is suspended. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xYieldRequired != pdFALSE ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Remove compiler warning about unused variables when the port + optimised task selection is not being used. */ + ( void ) uxPriorityUsedOnEntry; + } + } + taskEXIT_CRITICAL(); + } + +#endif /* INCLUDE_vTaskPrioritySet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskSuspend( TaskHandle_t xTaskToSuspend ) + { + TCB_t *pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the running task that is + being suspended. */ + pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); + + traceTASK_SUSPEND( pxTCB ); + + /* Remove task from the ready/delayed list and place in the + suspended list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ); + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* Reset the next expected unblock time in case it referred to the + task that is now in the Suspended state. */ + taskENTER_CRITICAL(); + { + prvResetNextTaskUnblockTime(); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( pxTCB == pxCurrentTCB ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* The current task has just been suspended. */ + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + /* The scheduler is not running, but the task that was pointed + to by pxCurrentTCB has just been suspended and pxCurrentTCB + must be adjusted to point to a different task. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) + { + /* No other tasks are ready, so set pxCurrentTCB back to + NULL so when the next task is created pxCurrentTCB will + be set to point to it no matter what its relative priority + is. */ + pxCurrentTCB = NULL; + } + else + { + vTaskSwitchContext(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) + { + BaseType_t xReturn = pdFALSE; + const TCB_t * const pxTCB = ( TCB_t * ) xTask; + + /* Accesses xPendingReadyList so must be called from a critical + section. */ + + /* It does not make sense to check if the calling task is suspended. */ + configASSERT( xTask ); + + /* Is the task being resumed actually in the suspended list? */ + if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* Has the task already been resumed from within an ISR? */ + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE ) + { + /* Is it in the suspended list because it is in the Suspended + state, or because is is blocked with no timeout? */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) + { + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskResume( TaskHandle_t xTaskToResume ) + { + TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume; + + /* It does not make sense to resume the calling task. */ + configASSERT( xTaskToResume ); + + /* The parameter cannot be NULL as it is impossible to resume the + currently executing task. */ + if( ( pxTCB != NULL ) && ( pxTCB != pxCurrentTCB ) ) + { + taskENTER_CRITICAL(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME( pxTCB ); + + /* As we are in a critical section we can access the ready + lists even if the scheduler is suspended. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* We may have just resumed a higher priority task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* This yield may not cause the task just resumed to run, + but will leave the lists in the correct state for the + next yield. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) + { + BaseType_t xYieldRequired = pdFALSE; + TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToResume ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME_FROM_ISR( pxTCB ); + + /* Check the ready lists can be accessed. */ + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + /* Ready lists can be accessed so move the task from the + suspended list to the ready list directly. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed or ready lists cannot be accessed so the task + is held in the pending ready list until the scheduler is + unsuspended. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xYieldRequired; + } + +#endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ +/*-----------------------------------------------------------*/ + +void vTaskStartScheduler( void ) +{ +BaseType_t xReturn; + + /* Add the idle task at the lowest priority. */ + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t *pxIdleTaskTCBBuffer = NULL; + StackType_t *pxIdleTaskStackBuffer = NULL; + uint32_t ulIdleTaskStackSize; + + /* The Idle task is created using user provided RAM - obtain the + address of the RAM then create the idle task. */ + vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); + xIdleTaskHandle = xTaskCreateStatic( prvIdleTask, + "IDLE", + ulIdleTaskStackSize, + ( void * ) NULL, + ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), + pxIdleTaskStackBuffer, + pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + + if( xIdleTaskHandle != NULL ) + { + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + #else + { + /* The Idle task is being created using dynamically allocated RAM. */ + xReturn = xTaskCreate( prvIdleTask, + "IDLE", configMINIMAL_STACK_SIZE, + ( void * ) NULL, + ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), + &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + #if ( configUSE_TIMERS == 1 ) + { + if( xReturn == pdPASS ) + { + xReturn = xTimerCreateTimerTask(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TIMERS */ + + if( xReturn == pdPASS ) + { + /* Interrupts are turned off here, to ensure a tick does not occur + before or during the call to xPortStartScheduler(). The stacks of + the created tasks contain a status word with interrupts switched on + so interrupts will automatically get re-enabled when the first task + starts to run. */ + portDISABLE_INTERRUPTS(); + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + structure specific to the task that will run first. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + xNextTaskUnblockTime = portMAX_DELAY; + xSchedulerRunning = pdTRUE; + xTickCount = ( TickType_t ) 0U; + + /* If configGENERATE_RUN_TIME_STATS is defined then the following + macro must be defined to configure the timer/counter used to generate + the run time counter time base. */ + portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); + + /* Setting up the timer tick is hardware specific and thus in the + portable interface. */ + if( xPortStartScheduler() != pdFALSE ) + { + /* Should not reach here as if the scheduler is running the + function will not return. */ + } + else + { + /* Should only reach here if a task calls xTaskEndScheduler(). */ + } + } + else + { + /* This line will only be reached if the kernel could not be started, + because there was not enough FreeRTOS heap to create the idle task + or the timer task. */ + configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); + } + + /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, + meaning xIdleTaskHandle is not used anywhere else. */ + ( void ) xIdleTaskHandle; +} +/*-----------------------------------------------------------*/ + +void vTaskEndScheduler( void ) +{ + /* Stop the scheduler interrupts and call the portable scheduler end + routine so the original ISRs can be restored if necessary. The port + layer must ensure interrupts enable bit is left in the correct state. */ + portDISABLE_INTERRUPTS(); + xSchedulerRunning = pdFALSE; + vPortEndScheduler(); +} +/*----------------------------------------------------------*/ + +void vTaskSuspendAll( void ) +{ + /* A critical section is not required as the variable is of type + BaseType_t. Please read Richard Barry's reply in the following link to a + post in the FreeRTOS support forum before reporting this as a bug! - + http://goo.gl/wu4acr */ + ++uxSchedulerSuspended; +} +/*----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) + { + TickType_t xReturn; + UBaseType_t uxHigherPriorityReadyTasks = pdFALSE; + + /* uxHigherPriorityReadyTasks takes care of the case where + configUSE_PREEMPTION is 0, so there may be tasks above the idle priority + task that are in the Ready state, even though the idle task is + running. */ + #if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + { + if( uxTopReadyPriority > tskIDLE_PRIORITY ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #else + { + const UBaseType_t uxLeastSignificantBit = ( UBaseType_t ) 0x01; + + /* When port optimised task selection is used the uxTopReadyPriority + variable is used as a bit map. If bits other than the least + significant bit are set then there are tasks that have a priority + above the idle priority that are in the Ready state. This takes + care of the case where the co-operative scheduler is in use. */ + if( uxTopReadyPriority > uxLeastSignificantBit ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #endif + + if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY ) + { + xReturn = 0; + } + else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1 ) + { + /* There are other idle priority tasks in the ready state. If + time slicing is used then the very next tick interrupt must be + processed. */ + xReturn = 0; + } + else if( uxHigherPriorityReadyTasks != pdFALSE ) + { + /* There are tasks in the Ready state that have a priority above the + idle priority. This path can only be reached if + configUSE_PREEMPTION is 0. */ + xReturn = 0; + } + else + { + xReturn = xNextTaskUnblockTime - xTickCount; + } + + return xReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskResumeAll( void ) +{ +TCB_t *pxTCB = NULL; +BaseType_t xAlreadyYielded = pdFALSE; + + /* If uxSchedulerSuspended is zero then this function does not match a + previous call to vTaskSuspendAll(). */ + configASSERT( uxSchedulerSuspended ); + + /* It is possible that an ISR caused a task to be removed from an event + list while the scheduler was suspended. If this was the case then the + removed task will have been added to the xPendingReadyList. Once the + scheduler has been resumed it is safe to move all the pending ready + tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL(); + { + --uxSchedulerSuspended; + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) + { + /* Move any readied tasks from the pending list into the + appropriate ready list. */ + while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) + { + pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* If the moved task has a priority higher than the current + task then a yield must be performed. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( pxTCB != NULL ) + { + /* A task was unblocked while the scheduler was suspended, + which may have prevented the next unblock time from being + re-calculated, in which case re-calculate it now. Mainly + important for low power tickless implementations, where + this can prevent an unnecessary exit from low power + state. */ + prvResetNextTaskUnblockTime(); + } + + /* If any ticks occurred while the scheduler was suspended then + they should be processed now. This ensures the tick count does + not slip, and that any delayed tasks are resumed at the correct + time. */ + { + UBaseType_t uxPendedCounts = uxPendedTicks; /* Non-volatile copy. */ + + if( uxPendedCounts > ( UBaseType_t ) 0U ) + { + do + { + if( xTaskIncrementTick() != pdFALSE ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --uxPendedCounts; + } while( uxPendedCounts > ( UBaseType_t ) 0U ); + + uxPendedTicks = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( xYieldPending != pdFALSE ) + { + #if( configUSE_PREEMPTION != 0 ) + { + xAlreadyYielded = pdTRUE; + } + #endif + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xAlreadyYielded; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCount( void ) +{ +TickType_t xTicks; + + /* Critical section required if running on a 16 bit processor. */ + portTICK_TYPE_ENTER_CRITICAL(); + { + xTicks = xTickCount; + } + portTICK_TYPE_EXIT_CRITICAL(); + + return xTicks; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCountFromISR( void ) +{ +TickType_t xReturn; +UBaseType_t uxSavedInterruptStatus; + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = xTickCount; + } + portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxTaskGetNumberOfTasks( void ) +{ + /* A critical section is not required because the variables are of type + BaseType_t. */ + return uxCurrentNumberOfTasks; +} +/*-----------------------------------------------------------*/ + +char *pcTaskGetName( TaskHandle_t xTaskToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ +TCB_t *pxTCB; + + /* If null is passed in here then the name of the calling task is being + queried. */ + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + configASSERT( pxTCB ); + return &( pxTCB->pcTaskName[ 0 ] ); +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t *prvSearchForNameWithinSingleList( List_t *pxList, const char pcNameToQuery[] ) + { + TCB_t *pxNextTCB, *pxFirstTCB, *pxReturn = NULL; + UBaseType_t x; + char cNextChar; + + /* This function is called with the scheduler suspended. */ + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + + /* Check each character in the name looking for a match or + mismatch. */ + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + cNextChar = pxNextTCB->pcTaskName[ x ]; + + if( cNextChar != pcNameToQuery[ x ] ) + { + /* Characters didn't match. */ + break; + } + else if( cNextChar == 0x00 ) + { + /* Both strings terminated, a match must have been + found. */ + pxReturn = pxNextTCB; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( pxReturn != NULL ) + { + /* The handle has been found. */ + break; + } + + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return pxReturn; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t uxQueue = configMAX_PRIORITIES; + TCB_t* pxTCB; + + /* Task names will be truncated to configMAX_TASK_NAME_LEN - 1 bytes. */ + configASSERT( strlen( pcNameToQuery ) < configMAX_TASK_NAME_LEN ); + + vTaskSuspendAll(); + { + /* Search the ready lists. */ + do + { + uxQueue--; + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) &( pxReadyTasksLists[ uxQueue ] ), pcNameToQuery ); + + if( pxTCB != NULL ) + { + /* Found the handle. */ + break; + } + + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Search the delayed lists. */ + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxDelayedTaskList, pcNameToQuery ); + } + + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pcNameToQuery ); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the suspended list. */ + pxTCB = prvSearchForNameWithinSingleList( &xSuspendedTaskList, pcNameToQuery ); + } + } + #endif + + #if( INCLUDE_vTaskDelete == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the deleted list. */ + pxTCB = prvSearchForNameWithinSingleList( &xTasksWaitingTermination, pcNameToQuery ); + } + } + #endif + } + ( void ) xTaskResumeAll(); + + return ( TaskHandle_t ) pxTCB; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) + { + UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; + + vTaskSuspendAll(); + { + /* Is there a space in the array for each task in the system? */ + if( uxArraySize >= uxCurrentNumberOfTasks ) + { + /* Fill in an TaskStatus_t structure with information on each + task in the Ready state. */ + do + { + uxQueue--; + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ); + + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Fill in an TaskStatus_t structure with information on each + task in the Blocked state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ); + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ); + + #if( INCLUDE_vTaskDelete == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + each task that has been deleted but not yet cleaned up. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ); + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + each task in the Suspended state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ); + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1) + { + if( pulTotalRunTime != NULL ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); + #else + *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + } + } + #else + { + if( pulTotalRunTime != NULL ) + { + *pulTotalRunTime = 0; + } + } + #endif + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + + TaskHandle_t xTaskGetIdleTaskHandle( void ) + { + /* If xTaskGetIdleTaskHandle() is called before the scheduler has been + started, then xIdleTaskHandle will be NULL. */ + configASSERT( ( xIdleTaskHandle != NULL ) ); + return xIdleTaskHandle; + } + +#endif /* INCLUDE_xTaskGetIdleTaskHandle */ +/*----------------------------------------------------------*/ + +/* This conditional compilation should use inequality to 0, not equality to 1. +This is to ensure vTaskStepTick() is available when user defined low power mode +implementations require configUSE_TICKLESS_IDLE to be set to a value other than +1. */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + void vTaskStepTick( const TickType_t xTicksToJump ) + { + /* Correct the tick count value after a period during which the tick + was suppressed. Note this does *not* call the tick hook function for + each stepped tick. */ + configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); + xTickCount += xTicksToJump; + traceINCREASE_TICK_COUNT( xTicksToJump ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskAbortDelay == 1 ) + + BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) + { + TCB_t *pxTCB = ( TCB_t * ) xTask; + BaseType_t xReturn = pdFALSE; + + configASSERT( pxTCB ); + + vTaskSuspendAll(); + { + /* A task can only be prematurely removed from the Blocked state if + it is actually in the Blocked state. */ + if( eTaskGetState( xTask ) == eBlocked ) + { + /* Remove the reference to the task from the blocked list. An + interrupt won't touch the xStateListItem because the + scheduler is suspended. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove it from + the event list too. Interrupts can touch the event list item, + even though the scheduler is suspended, so a critical section + is used. */ + taskENTER_CRITICAL(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + pxTCB->ucDelayAborted = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + /* Place the unblocked task into the appropriate ready list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate context + switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should only be + performed if the unblocked task has a priority that is + equal to or higher than the currently executing task. */ + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Pend the yield to be performed when the scheduler + is unsuspended. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + xTaskResumeAll(); + + return xReturn; + } + +#endif /* INCLUDE_xTaskAbortDelay */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskIncrementTick( void ) +{ +TCB_t * pxTCB; +TickType_t xItemValue; +BaseType_t xSwitchRequired = pdFALSE; + + /* Called by the portable layer each time a tick interrupt occurs. + Increments the tick then checks to see if the new tick value will cause any + tasks to be unblocked. */ + traceTASK_INCREMENT_TICK( xTickCount ); + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + /* Minor optimisation. The tick count cannot change in this + block. */ + const TickType_t xConstTickCount = xTickCount + 1; + + /* Increment the RTOS tick, switching the delayed and overflowed + delayed lists if it wraps to 0. */ + xTickCount = xConstTickCount; + + if( xConstTickCount == ( TickType_t ) 0U ) + { + taskSWITCH_DELAYED_LISTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* See if this tick has made a timeout expire. Tasks are stored in + the queue in the order of their wake time - meaning once one task + has been found whose block time has not expired there is no need to + look any further down the list. */ + if( xConstTickCount >= xNextTaskUnblockTime ) + { + for( ;; ) + { + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The delayed list is empty. Set xNextTaskUnblockTime + to the maximum possible value so it is extremely + unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass + next time through. */ + xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + break; + } + else + { + /* The delayed list is not empty, get the value of the + item at the head of the delayed list. This is the time + at which the task at the head of the delayed list must + be removed from the Blocked state. */ + pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); + + if( xConstTickCount < xItemValue ) + { + /* It is not time to unblock this item yet, but the + item value is the time at which the task at the head + of the blocked list must be removed from the Blocked + state - so record the item value in + xNextTaskUnblockTime. */ + xNextTaskUnblockTime = xItemValue; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* It is time to remove the item from the Blocked state. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove + it from the event list. */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Place the unblocked task into the appropriate ready + list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate + context switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should + only be performed if the unblocked task has a + priority that is equal to or higher than the + currently executing task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + } + } + + /* Tasks of equal priority to the currently running task will share + processing time (time slice) if preemption is on, and the application + writer has not explicitly turned time slicing off. */ + #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ + + #if ( configUSE_TICK_HOOK == 1 ) + { + /* Guard against the tick hook being called when the pended tick + count is being unwound (when the scheduler is being unlocked). */ + if( uxPendedTicks == ( UBaseType_t ) 0U ) + { + vApplicationTickHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICK_HOOK */ + } + else + { + ++uxPendedTicks; + + /* The tick hook gets called at regular intervals, even if the + scheduler is locked. */ + #if ( configUSE_TICK_HOOK == 1 ) + { + vApplicationTickHook(); + } + #endif + } + + #if ( configUSE_PREEMPTION == 1 ) + { + if( xYieldPending != pdFALSE ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + + return xSwitchRequired; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) + { + TCB_t *xTCB; + + /* If xTask is NULL then it is the task hook of the calling task that is + getting set. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB; + } + else + { + xTCB = ( TCB_t * ) xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + xTCB->pxTaskTag = pxHookFunction; + taskEXIT_CRITICAL(); + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) + { + TCB_t *xTCB; + TaskHookFunction_t xReturn; + + /* If xTask is NULL then we are setting our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB; + } + else + { + xTCB = ( TCB_t * ) xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + { + xReturn = xTCB->pxTaskTag; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) + { + TCB_t *xTCB; + BaseType_t xReturn; + + /* If xTask is NULL then we are calling our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB; + } + else + { + xTCB = ( TCB_t * ) xTask; + } + + if( xTCB->pxTaskTag != NULL ) + { + xReturn = xTCB->pxTaskTag( pvParameter ); + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +void vTaskSwitchContext( void ) +{ + if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ) + { + /* The scheduler is currently suspended - do not allow a context + switch. */ + xYieldPending = pdTRUE; + } + else + { + xYieldPending = pdFALSE; + traceTASK_SWITCHED_OUT(); + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); + #else + ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Add the amount of time the task has been running to the + accumulated time so far. The time the task started running was + stored in ulTaskSwitchedInTime. Note that there is no overflow + protection here so count values are only valid until the timer + overflows. The guard against negative values is to protect + against suspect run time stat counter implementations - which + are provided by the application, not the kernel. */ + if( ulTotalRunTime > ulTaskSwitchedInTime ) + { + pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + ulTaskSwitchedInTime = ulTotalRunTime; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + /* Check for stack overflow, if configured. */ + taskCHECK_FOR_STACK_OVERFLOW(); + + /* Select a new task to run using either the generic C or port + optimised asm code. */ + taskSELECT_HIGHEST_PRIORITY_TASK(); + traceTASK_SWITCHED_IN(); + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + structure specific to this task. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + } +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) +{ + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */ + + /* Place the event list item of the TCB in the appropriate event list. + This is placed in the list in priority order so the highest priority task + is the first to be woken by the event. The queue that contains the event + list is locked, preventing simultaneous access from interrupts. */ + vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) +{ + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + the event groups implementation. */ + configASSERT( uxSchedulerSuspended != 0 ); + + /* Store the item value in the event list item. It is safe to access the + event list item here as interrupts won't access the event list item of a + task that is not in the Blocked state. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Place the event list item of the TCB at the end of the appropriate event + list. It is safe to access the event list here because it is part of an + event group implementation - and interrupts don't access event groups + directly (instead they access them indirectly by pending function calls to + the task level). */ + vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + + void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) + { + configASSERT( pxEventList ); + + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements - + it should be called with the scheduler suspended. */ + + + /* Place the event list item of the TCB in the appropriate event list. + In this case it is assume that this is the only task that is going to + be waiting on this event list, so the faster vListInsertEnd() function + can be used in place of vListInsert. */ + vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + /* If the task should block indefinitely then set the block time to a + value that will be recognised as an indefinite delay inside the + prvAddCurrentTaskToDelayedList() function. */ + if( xWaitIndefinitely != pdFALSE ) + { + xTicksToWait = portMAX_DELAY; + } + + traceTASK_DELAY_UNTIL( ( xTickCount + xTicksToWait ) ); + prvAddCurrentTaskToDelayedList( xTicksToWait, xWaitIndefinitely ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) +{ +TCB_t *pxUnblockedTCB; +BaseType_t xReturn; + + /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION. It can also be + called from a critical section within an ISR. */ + + /* The event list is sorted in priority order, so the first in the list can + be removed as it is known to be the highest priority. Remove the TCB from + the delayed list, and add it to the ready list. + + If an event is for a queue that is locked then this function will never + get called - the lock count on the queue will get modified instead. This + means exclusive access to the event list is guaranteed here. + + This function assumes that a check has already been made to ensure that + pxEventList is not empty. */ + pxUnblockedTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + configASSERT( pxUnblockedTCB ); + ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold this task + pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); + } + + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has a higher + priority than the calling task. This allows the calling task to know if + it should force a context switch now. */ + xReturn = pdTRUE; + + /* Mark that a yield is pending in case the user is not using the + "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + might be set to the blocked task's time out time. If the task is + unblocked for a reason other than a timeout xNextTaskUnblockTime is + normally left unchanged, because it is automatically reset to a new + value when the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter sleep mode + at the earliest possible time - so reset xNextTaskUnblockTime here to + ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) +{ +TCB_t *pxUnblockedTCB; +BaseType_t xReturn; + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + the event flags implementation. */ + configASSERT( uxSchedulerSuspended != pdFALSE ); + + /* Store the new item value in the event list. */ + listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Remove the event list form the event flag. Interrupts do not access + event flags. */ + pxUnblockedTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxEventListItem ); + configASSERT( pxUnblockedTCB ); + ( void ) uxListRemove( pxEventListItem ); + + /* Remove the task from the delayed list and add it to the ready list. The + scheduler is suspended so interrupts will not be accessing the ready + lists. */ + ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has + a higher priority than the calling task. This allows + the calling task to know if it should force a context + switch now. */ + xReturn = pdTRUE; + + /* Mark that a yield is pending in case the user is not using the + "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ + configASSERT( pxTimeOut ); + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; +} +/*-----------------------------------------------------------*/ + +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) +{ +BaseType_t xReturn; + + configASSERT( pxTimeOut ); + configASSERT( pxTicksToWait ); + + taskENTER_CRITICAL(); + { + /* Minor optimisation. The tick count cannot change in this block. */ + const TickType_t xConstTickCount = xTickCount; + + #if( INCLUDE_xTaskAbortDelay == 1 ) + if( pxCurrentTCB->ucDelayAborted != pdFALSE ) + { + /* The delay was aborted, which is not the same as a time out, + but has the same result. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + xReturn = pdTRUE; + } + else + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + if( *pxTicksToWait == portMAX_DELAY ) + { + /* If INCLUDE_vTaskSuspend is set to 1 and the block time + specified is the maximum block time then the task should block + indefinitely, and therefore never time out. */ + xReturn = pdFALSE; + } + else + #endif + + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */ + { + /* The tick count is greater than the time at which + vTaskSetTimeout() was called, but has also overflowed since + vTaskSetTimeOut() was called. It must have wrapped all the way + around and gone past again. This passed since vTaskSetTimeout() + was called. */ + xReturn = pdTRUE; + } + else if( ( ( TickType_t ) ( xConstTickCount - pxTimeOut->xTimeOnEntering ) ) < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */ + { + /* Not a genuine timeout. Adjust parameters for time remaining. */ + *pxTicksToWait -= ( xConstTickCount - pxTimeOut->xTimeOnEntering ); + vTaskSetTimeOutState( pxTimeOut ); + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskMissedYield( void ) +{ + xYieldPending = pdTRUE; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) + { + UBaseType_t uxReturn; + TCB_t *pxTCB; + + if( xTask != NULL ) + { + pxTCB = ( TCB_t * ) xTask; + uxReturn = pxTCB->uxTaskNumber; + } + else + { + uxReturn = 0U; + } + + return uxReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) + { + TCB_t *pxTCB; + + if( xTask != NULL ) + { + pxTCB = ( TCB_t * ) xTask; + pxTCB->uxTaskNumber = uxHandle; + } + } + +#endif /* configUSE_TRACE_FACILITY */ + +/* + * ----------------------------------------------------------- + * The Idle task. + * ---------------------------------------------------------- + * + * The portTASK_FUNCTION() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION( prvIdleTask, pvParameters ) +{ + /* Stop warnings. */ + ( void ) pvParameters; + + /** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THE + SCHEDULER IS STARTED. **/ + + for( ;; ) + { + /* See if any tasks have deleted themselves - if so then the idle task + is responsible for freeing the deleted task's TCB and stack. */ + prvCheckTasksWaitingTermination(); + + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + see if any other task has become available. If we are using + preemption we don't need to do this as any task becoming available + will automatically get the processor anyway. */ + taskYIELD(); + } + #endif /* configUSE_PREEMPTION */ + + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + timesliced. If a task that is sharing the idle priority is ready + to run then the idle task should yield before the end of the + timeslice. + + A critical region is not required here as we are just reading from + the list, and an occasional incorrect value will not matter. If + the ready list at the idle priority contains more than one task + then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) + { + taskYIELD(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ + + #if ( configUSE_IDLE_HOOK == 1 ) + { + extern void vApplicationIdleHook( void ); + + /* Call the user defined function from within the idle task. This + allows the application designer to add background functionality + without the overhead of a separate task. + NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationIdleHook(); + } + #endif /* configUSE_IDLE_HOOK */ + + /* This conditional compilation should use inequality to 0, not equality + to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when + user defined low power mode implementations require + configUSE_TICKLESS_IDLE to be set to a value other than 1. */ + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + TickType_t xExpectedIdleTime; + + /* It is not desirable to suspend then resume the scheduler on + each iteration of the idle task. Therefore, a preliminary + test of the expected idle time is performed without the + scheduler suspended. The result here is not necessarily + valid. */ + xExpectedIdleTime = prvGetExpectedIdleTime(); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + vTaskSuspendAll(); + { + /* Now the scheduler is suspended, the expected idle + time can be sampled again, and this time its value can + be used. */ + configASSERT( xNextTaskUnblockTime >= xTickCount ); + xExpectedIdleTime = prvGetExpectedIdleTime(); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + traceLOW_POWER_IDLE_BEGIN(); + portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); + traceLOW_POWER_IDLE_END(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICKLESS_IDLE */ + } +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TICKLESS_IDLE != 0 ) + + eSleepModeStatus eTaskConfirmSleepModeStatus( void ) + { + /* The idle task exists in addition to the application tasks. */ + const UBaseType_t uxNonApplicationTasks = 1; + eSleepModeStatus eReturn = eStandardSleep; + + if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 ) + { + /* A task was made ready while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xYieldPending != pdFALSE ) + { + /* A yield was pended while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else + { + /* If all the tasks are in the suspended list (which might mean they + have an infinite block time rather than actually being suspended) + then it is safe to turn all clocks off and just wait for external + interrupts. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) + { + eReturn = eNoTasksWaitingTimeout; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return eReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) + { + TCB_t *pxTCB; + + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + pxTCB = prvGetTCBFromHandle( xTaskToSet ); + pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; + } + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) + { + void *pvReturn = NULL; + TCB_t *pxTCB; + + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ]; + } + else + { + pvReturn = NULL; + } + + return pvReturn; + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, const MemoryRegion_t * const xRegions ) + { + TCB_t *pxTCB; + + /* If null is passed in here then we are modifying the MPU settings of + the calling task. */ + pxTCB = prvGetTCBFromHandle( xTaskToModify ); + + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseTaskLists( void ) +{ +UBaseType_t uxPriority; + + for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) + { + vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); + } + + vListInitialise( &xDelayedTaskList1 ); + vListInitialise( &xDelayedTaskList2 ); + vListInitialise( &xPendingReadyList ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( &xTasksWaitingTermination ); + } + #endif /* INCLUDE_vTaskDelete */ + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( &xSuspendedTaskList ); + } + #endif /* INCLUDE_vTaskSuspend */ + + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + pxOverflowDelayedTaskList = &xDelayedTaskList2; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTasksWaitingTermination( void ) +{ + + /** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/ + + #if ( INCLUDE_vTaskDelete == 1 ) + { + BaseType_t xListIsEmpty; + + /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called + too often in the idle task. */ + while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) + { + vTaskSuspendAll(); + { + xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); + } + ( void ) xTaskResumeAll(); + + if( xListIsEmpty == pdFALSE ) + { + TCB_t *pxTCB; + + taskENTER_CRITICAL(); + { + pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + --uxCurrentNumberOfTasks; + --uxDeletedTasksWaitingCleanUp; + } + taskEXIT_CRITICAL(); + + prvDeleteTCB( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #endif /* INCLUDE_vTaskDelete */ +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TRACE_FACILITY == 1 ) + + void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) + { + TCB_t *pxTCB; + + /* xTask is NULL then get the state of the calling task. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + pxTaskStatus->xHandle = ( TaskHandle_t ) pxTCB; + pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName [ 0 ] ); + pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority; + pxTaskStatus->pxStackBase = pxTCB->pxStack; + pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber; + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* If the task is in the suspended list then there is a chance it is + actually just blocked indefinitely - so really it should be reported as + being in the Blocked state. */ + if( pxTaskStatus->eCurrentState == eSuspended ) + { + vTaskSuspendAll(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + pxTaskStatus->eCurrentState = eBlocked; + } + } + xTaskResumeAll(); + } + } + #endif /* INCLUDE_vTaskSuspend */ + + #if ( configUSE_MUTEXES == 1 ) + { + pxTaskStatus->uxBasePriority = pxTCB->uxBasePriority; + } + #else + { + pxTaskStatus->uxBasePriority = 0; + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; + } + #else + { + pxTaskStatus->ulRunTimeCounter = 0; + } + #endif + + /* Obtaining the task state is a little fiddly, so is only done if the value + of eState passed into this function is eInvalid - otherwise the state is + just set to whatever is passed in. */ + if( eState != eInvalid ) + { + pxTaskStatus->eCurrentState = eState; + } + else + { + pxTaskStatus->eCurrentState = eTaskGetState( xTask ); + } + + /* Obtaining the stack space takes some time, so the xGetFreeStackSpace + parameter is provided to allow it to be skipped. */ + if( xGetFreeStackSpace != pdFALSE ) + { + #if ( portSTACK_GROWTH > 0 ) + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxEndOfStack ); + } + #else + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxStack ); + } + #endif + } + else + { + pxTaskStatus->usStackHighWaterMark = 0; + } + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) + { + volatile TCB_t *pxNextTCB, *pxFirstTCB; + UBaseType_t uxTask = 0; + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + + /* Populate an TaskStatus_t structure within the + pxTaskStatusArray array for each task that is referenced from + pxList. See the definition of TaskStatus_t in task.h for the + meaning of each TaskStatus_t structure member. */ + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState ); + uxTask++; + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + + static uint16_t prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) + { + uint32_t ulCount = 0U; + + while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE ) + { + pucStackByte -= portSTACK_GROWTH; + ulCount++; + } + + ulCount /= ( uint32_t ) sizeof( StackType_t ); /*lint !e961 Casting is not redundant on smaller architectures. */ + + return ( uint16_t ) ulCount; + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + + UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + uint8_t *pucEndOfStack; + UBaseType_t uxReturn; + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t *pxTCB ) + { + /* This call is required specifically for the TriCore port. It must be + above the vPortFree() calls. The call is also used by ports/demos that + want to allocate and clean RAM statically. */ + portCLEAN_UP_TCB( pxTCB ); + + /* Free up the memory allocated by the scheduler for the task. It is up + to the task to free any memory allocated at the application level. */ + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + _reclaim_reent( &( pxTCB->xNewLib_reent ) ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) + { + /* The task can only have been allocated dynamically - free both + the stack and TCB. */ + vPortFree( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + #elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE == 1 ) + { + /* The task could have been allocated statically or dynamically, so + check what was statically allocated before trying to free the + memory. */ + if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) + { + /* Both the stack and TCB were allocated dynamically, so both + must be freed. */ + vPortFree( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) + { + /* Only the stack was statically allocated, so the TCB is the + only memory that must be freed. */ + vPortFree( pxTCB ); + } + else + { + /* Neither the stack nor the TCB were allocated dynamically, so + nothing needs to be freed. */ + configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ) + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +static void prvResetNextTaskUnblockTime( void ) +{ +TCB_t *pxTCB; + + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The new current delayed list is empty. Set xNextTaskUnblockTime to + the maximum possible value so it is extremely unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass until + there is an item in the delayed list. */ + xNextTaskUnblockTime = portMAX_DELAY; + } + else + { + /* The new current delayed list is not empty, get the value of + the item at the head of the delayed list. This is the time at + which the task at the head of the delayed list should be removed + from the Blocked state. */ + ( pxTCB ) = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); + xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) ); + } +} +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + + TaskHandle_t xTaskGetCurrentTaskHandle( void ) + { + TaskHandle_t xReturn; + + /* A critical section is not required as this is not called from + an interrupt and the current TCB will always be the same for any + individual execution thread. */ + xReturn = pxCurrentTCB; + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + + BaseType_t xTaskGetSchedulerState( void ) + { + BaseType_t xReturn; + + if( xSchedulerRunning == pdFALSE ) + { + xReturn = taskSCHEDULER_NOT_STARTED; + } + else + { + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + xReturn = taskSCHEDULER_RUNNING; + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + } + } + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder; + + /* If the mutex was given back by an interrupt while the queue was + locked then the mutex holder might now be NULL. */ + if( pxMutexHolder != NULL ) + { + /* If the holder of the mutex has a priority below the priority of + the task attempting to obtain the mutex then it will temporarily + inherit the priority of the task attempting to obtain the mutex. */ + if( pxTCB->uxPriority < pxCurrentTCB->uxPriority ) + { + /* Adjust the mutex holder state to account for its new + priority. Only reset the event list item value if the value is + not being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task being modified is in the ready state it will need + to be moved into a new list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Inherit the priority before being moved into the new list. */ + pxTCB->uxPriority = pxCurrentTCB->uxPriority; + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* Just inherit the priority. */ + pxTCB->uxPriority = pxCurrentTCB->uxPriority; + } + + traceTASK_PRIORITY_INHERIT( pxTCB, pxCurrentTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder; + BaseType_t xReturn = pdFALSE; + + if( pxMutexHolder != NULL ) + { + /* A task can only have an inherited priority if it holds the mutex. + If the mutex is held by a task then it cannot be given from an + interrupt, and if a mutex is given by the holding task then it must + be the running state task. */ + configASSERT( pxTCB == pxCurrentTCB ); + + configASSERT( pxTCB->uxMutexesHeld ); + ( pxTCB->uxMutexesHeld )--; + + /* Has the holder of the mutex inherited the priority of another + task? */ + if( pxTCB->uxPriority != pxTCB->uxBasePriority ) + { + /* Only disinherit if no other mutexes are held. */ + if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) + { + /* A task can only have an inherited priority if it holds + the mutex. If the mutex is held by a task then it cannot be + given from an interrupt, and if a mutex is given by the + holding task then it must be the running state task. Remove + the holding task from the ready list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Disinherit the priority before adding the task into the + new ready list. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + pxTCB->uxPriority = pxTCB->uxBasePriority; + + /* Reset the event list item value. It cannot be in use for + any other purpose if this task is running, and it must be + running to give back the mutex. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + prvAddTaskToReadyList( pxTCB ); + + /* Return true to indicate that a context switch is required. + This is only actually required in the corner case whereby + multiple mutexes were held and the mutexes were given back + in an order different to that in which they were taken. + If a context switch did not occur when the first mutex was + returned, even if a task was waiting on it, then a context + switch should occur when the last mutex is returned whether + a task is waiting on it or not. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskEnterCritical( void ) + { + portDISABLE_INTERRUPTS(); + + if( xSchedulerRunning != pdFALSE ) + { + ( pxCurrentTCB->uxCriticalNesting )++; + + /* This is not the interrupt safe version of the enter critical + function so assert() if it is being called from an interrupt + context. Only API functions that end in "FromISR" can be used in an + interrupt. Only assert if the critical nesting count is 1 to + protect against recursive calls if the assert function also uses a + critical section. */ + if( pxCurrentTCB->uxCriticalNesting == 1 ) + { + portASSERT_IF_IN_ISR(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskExitCritical( void ) + { + if( xSchedulerRunning != pdFALSE ) + { + if( pxCurrentTCB->uxCriticalNesting > 0U ) + { + ( pxCurrentTCB->uxCriticalNesting )--; + + if( pxCurrentTCB->uxCriticalNesting == 0U ) + { + portENABLE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) + { + size_t x; + + /* Start by copying the entire string. */ + strcpy( pcBuffer, pcTaskName ); + + /* Pad the end of the string with spaces to ensure columns line up when + printed out. */ + for( x = strlen( pcBuffer ); x < ( size_t ) ( configMAX_TASK_NAME_LEN - 1 ); x++ ) + { + pcBuffer[ x ] = ' '; + } + + /* Terminate. */ + pcBuffer[ x ] = 0x00; + + /* Return the new end of string. */ + return &( pcBuffer[ x ] ); + } + +#endif /* ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + void vTaskList( char * pcWriteBuffer ) + { + TaskStatus_t *pxTaskStatusArray; + volatile UBaseType_t uxArraySize, x; + char cStatus; + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that + * displays task names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that + * might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, + * and limited functionality implementation of sprintf() is provided in + * many of the FreeRTOS/Demo sub-directories in a file called + * printf-stdarg.c (note printf-stdarg.c does not provide a full + * snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskList(). + */ + + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! if + configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); + + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + switch( pxTaskStatusArray[ x ].eCurrentState ) + { + case eReady: cStatus = tskREADY_CHAR; + break; + + case eBlocked: cStatus = tskBLOCKED_CHAR; + break; + + case eSuspended: cStatus = tskSUSPENDED_CHAR; + break; + + case eDeleted: cStatus = tskDELETED_CHAR; + break; + + default: /* Should not get here, but it is included + to prevent static checking errors. */ + cStatus = 0x00; + break; + } + + /* Write the task name to the string, padding with spaces so it + can be printed in tabular form more easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + /* Write the rest of the string. */ + sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); + pcWriteBuffer += strlen( pcWriteBuffer ); + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + void vTaskGetRunTimeStats( char *pcWriteBuffer ) + { + TaskStatus_t *pxTaskStatusArray; + volatile UBaseType_t uxArraySize, x; + uint32_t ulTotalTime, ulStatsAsPercentage; + + #if( configUSE_TRACE_FACILITY != 1 ) + { + #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats(). + } + #endif + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part + * of the uxTaskGetSystemState() output into a human readable table that + * displays the amount of time each task has spent in the Running state + * in both absolute and percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library + * function that might bloat the code size, use a lot of stack, and + * provide different results on different platforms. An alternative, + * tiny, third party, and limited functionality implementation of + * sprintf() is provided in many of the FreeRTOS/Demo sub-directories in + * a file called printf-stdarg.c (note printf-stdarg.c does not provide + * a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskGetRunTimeStats(). + */ + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! If + configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); + + /* For percentage calculations. */ + ulTotalTime /= 100UL; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > 0 ) + { + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + /* What percentage of the total run time has the task used? + This will always be rounded down to the nearest integer. + ulTotalRunTimeDiv100 has already been divided by 100. */ + ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; + + /* Write the task name to the string, padding with + spaces so it can be printed in tabular form more + easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); + } + #endif + } + else + { + /* If the percentage is zero here then the task has + consumed less than 1% of the total run time. */ + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #endif + } + + pcWriteBuffer += strlen( pcWriteBuffer ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*-----------------------------------------------------------*/ + +TickType_t uxTaskResetEventItemValue( void ) +{ +TickType_t uxReturn; + + uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ) ); + + /* Reset the event list item to its normal value - so it can be used with + queues and semaphores. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void *pvTaskIncrementMutexHeldCount( void ) + { + /* If xSemaphoreCreateMutex() is called before any tasks have been created + then pxCurrentTCB will be NULL. */ + if( pxCurrentTCB != NULL ) + { + ( pxCurrentTCB->uxMutexesHeld )++; + } + + return pxCurrentTCB; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) + { + uint32_t ulReturn; + + taskENTER_CRITICAL(); + { + /* Only block if the notification count is not already non-zero. */ + if( pxCurrentTCB->ulNotifiedValue == 0UL ) + { + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + traceTASK_NOTIFY_TAKE_BLOCK(); + + /* All ports are written to allow a yield in a critical + section (some will yield immediately, others wait until the + critical section exits) - but it is not something that + application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_TAKE(); + ulReturn = pxCurrentTCB->ulNotifiedValue; + + if( ulReturn != 0UL ) + { + if( xClearCountOnExit != pdFALSE ) + { + pxCurrentTCB->ulNotifiedValue = 0UL; + } + else + { + pxCurrentTCB->ulNotifiedValue = ulReturn - 1; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxCurrentTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + /* Only block if a notification is not already pending. */ + if( pxCurrentTCB->ucNotifyState != taskNOTIFICATION_RECEIVED ) + { + /* Clear bits in the task's notification value as bits may get + set by the notifying task or interrupt. This can be used to + clear the value to zero. */ + pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnEntry; + + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + traceTASK_NOTIFY_WAIT_BLOCK(); + + /* All ports are written to allow a yield in a critical + section (some will yield immediately, others wait until the + critical section exits) - but it is not something that + application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_WAIT(); + + if( pulNotificationValue != NULL ) + { + /* Output the current notification value, which may or may not + have changed. */ + *pulNotificationValue = pxCurrentTCB->ulNotifiedValue; + } + + /* If ucNotifyValue is set then either the task never entered the + blocked state (because a notification was already pending) or the + task unblocked because of a notification. Otherwise the task + unblocked because of a timeout. */ + if( pxCurrentTCB->ucNotifyState == taskWAITING_NOTIFICATION ) + { + /* A notification was not received. */ + xReturn = pdFALSE; + } + else + { + /* A notification was already pending or a notification was + received while the task was waiting. */ + pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnExit; + xReturn = pdTRUE; + } + + pxCurrentTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) + { + TCB_t * pxTCB; + BaseType_t xReturn = pdPASS; + uint8_t ucOriginalNotifyState; + + configASSERT( xTaskToNotify ); + pxTCB = ( TCB_t * ) xTaskToNotify; + + taskENTER_CRITICAL(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState; + + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits : + pxTCB->ulNotifiedValue |= ulValue; + break; + + case eIncrement : + ( pxTCB->ulNotifiedValue )++; + break; + + case eSetValueWithOverwrite : + pxTCB->ulNotifiedValue = ulValue; + break; + + case eSetValueWithoutOverwrite : + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + break; + + case eNoAction: + /* The task is being notified without its notify value being + updated. */ + break; + } + + traceTASK_NOTIFY(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked waiting for a notification then + xNextTaskUnblockTime might be set to the blocked task's time + out time. If the task is unblocked for a reason other than + a timeout xNextTaskUnblockTime is normally left unchanged, + because it will automatically get reset to a new value when + the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter + sleep mode at the earliest possible time - so reset + xNextTaskUnblockTime here to ensure it is updated at the + earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + BaseType_t xReturn = pdPASS; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = ( TCB_t * ) xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState; + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits : + pxTCB->ulNotifiedValue |= ulValue; + break; + + case eIncrement : + ( pxTCB->ulNotifiedValue )++; + break; + + case eSetValueWithOverwrite : + pxTCB->ulNotifiedValue = ulValue; + break; + + case eSetValueWithoutOverwrite : + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + break; + + case eNoAction : + /* The task is being notified without its notify value being + updated. */ + break; + } + + traceTASK_NOTIFY_FROM_ISR(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + this task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + /* Mark that a yield is pending in case the user is not + using the "xHigherPriorityTaskWoken" parameter to an ISR + safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = ( TCB_t * ) xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + ucOriginalNotifyState = pxTCB->ucNotifyState; + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + + /* 'Giving' is equivalent to incrementing a count in a counting + semaphore. */ + ( pxTCB->ulNotifiedValue )++; + + traceTASK_NOTIFY_GIVE_FROM_ISR(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + this task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + /* Mark that a yield is pending in case the user is not + using the "xHigherPriorityTaskWoken" parameter in an ISR + safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ + +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + BaseType_t xReturn; + + /* If null is passed in here then it is the calling task that is having + its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + taskENTER_CRITICAL(); + { + if( pxTCB->ucNotifyState == taskNOTIFICATION_RECEIVED ) + { + pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + + +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely ) +{ +TickType_t xTimeToWake; +const TickType_t xConstTickCount = xTickCount; + + #if( INCLUDE_xTaskAbortDelay == 1 ) + { + /* About to enter a delayed list, so ensure the ucDelayAborted flag is + reset to pdFALSE so it can be detected as having been set to pdTRUE + when the task leaves the Blocked state. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + } + #endif + + /* Remove the task from the ready list before adding it to the blocked list + as the same list item is used for both lists. */ + if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* The current task must be in a ready list, so there is no need to + check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) ) + { + /* Add the task to the suspended task list instead of a delayed task + list to ensure it is not woken by a timing event. It will block + indefinitely. */ + vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* Calculate the time at which the task should be woken if the event + does not occur. This may overflow but this doesn't matter, the + kernel will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow + list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list + is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the + head of the list of blocked tasks then xNextTaskUnblockTime + needs to be updated too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be woken if the event + does not occur. This may overflow but this doesn't matter, the kernel + will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the head of the + list of blocked tasks then xNextTaskUnblockTime needs to be updated + too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */ + ( void ) xCanBlockIndefinitely; + } + #endif /* INCLUDE_vTaskSuspend */ +} + + +#ifdef FREERTOS_MODULE_TEST + #include "tasks_test_access_functions.h" +#endif + diff --git a/STM32F1/libraries/FreeRTOS900/utility/timers.c b/STM32F1/libraries/FreeRTOS900/utility/timers.c new file mode 100644 index 000000000..d4a821a26 --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/timers.c @@ -0,0 +1,1092 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" + +#if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 ) + #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. +#endif + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. This #if is closed at the very bottom +of this file. If you want to include software timer functionality then ensure +configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#if ( configUSE_TIMERS == 1 ) + +/* Misc definitions. */ +#define tmrNO_DELAY ( TickType_t ) 0U + +/* The definition of the timers themselves. */ +typedef struct tmrTimerControl +{ + const char *pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + ListItem_t xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ + TickType_t xTimerPeriodInTicks;/*<< How quickly and often the timer expires. */ + UBaseType_t uxAutoReload; /*<< Set to pdTRUE if the timer should be automatically restarted once expired. Set to pdFALSE if the timer is, in effect, a one-shot timer. */ + void *pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ + TimerCallbackFunction_t pxCallbackFunction; /*<< The function that will be called when the timer expires. */ + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTimerNumber; /*<< An ID assigned by trace tools such as FreeRTOS+Trace */ + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*<< Set to pdTRUE if the timer was created statically so no attempt is made to free the memory again if the timer is later deleted. */ + #endif +} xTIMER; + +/* The old xTIMER name is maintained above then typedefed to the new Timer_t +name below to enable the use of older kernel aware debuggers. */ +typedef xTIMER Timer_t; + +/* The definition of messages that can be sent and received on the timer queue. +Two types of message can be queued - messages that manipulate a software timer, +and messages that request the execution of a non-timer related callback. The +two message types are defined in two separate structures, xTimerParametersType +and xCallbackParametersType respectively. */ +typedef struct tmrTimerParameters +{ + TickType_t xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + Timer_t * pxTimer; /*<< The timer to which the command will be applied. */ +} TimerParameter_t; + + +typedef struct tmrCallbackParameters +{ + PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */ + void *pvParameter1; /* << The value that will be used as the callback functions first parameter. */ + uint32_t ulParameter2; /* << The value that will be used as the callback functions second parameter. */ +} CallbackParameters_t; + +/* The structure that contains the two message types, along with an identifier +that is used to determine which message type is valid. */ +typedef struct tmrTimerQueueMessage +{ + BaseType_t xMessageID; /*<< The command being sent to the timer service task. */ + union + { + TimerParameter_t xTimerParameters; + + /* Don't include xCallbackParameters if it is not going to be used as + it makes the structure (and therefore the timer queue) larger. */ + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + CallbackParameters_t xCallbackParameters; + #endif /* INCLUDE_xTimerPendFunctionCall */ + } u; +} DaemonTaskMessage_t; + +/*lint -e956 A manual analysis and inspection has been used to determine which +static variables must be declared volatile. */ + +/* The list in which active timers are stored. Timers are referenced in expire +time order, with the nearest expiry time at the front of the list. Only the +timer service task is allowed to access these lists. */ +PRIVILEGED_DATA static List_t xActiveTimerList1; +PRIVILEGED_DATA static List_t xActiveTimerList2; +PRIVILEGED_DATA static List_t *pxCurrentTimerList; +PRIVILEGED_DATA static List_t *pxOverflowTimerList; + +/* A queue that is used to send commands to the timer service task. */ +PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; +PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + /* If static allocation is supported then the application must provide the + following callback function - which enables the application to optionally + provide the memory that will be used by the timer task as the task's stack + and TCB. */ + extern void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ); + +#endif + +/* + * Initialise the infrastructure used by the timer service task if it has not + * been initialised already. + */ +static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; + +/* + * The timer service task (daemon). Timer functionality is controlled by this + * task. Other tasks communicate with the timer service task using the + * xTimerQueue queue. + */ +static void prvTimerTask( void *pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Called by the timer service task to interpret and process a command it + * received on the timer queue. + */ +static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; + +/* + * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, + * depending on if the expire time causes a timer counter overflow. + */ +static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) PRIVILEGED_FUNCTION; + +/* + * An active timer has reached its expire time. Reload the timer if it is an + * auto reload timer, then call its callback. + */ +static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * The tick count has overflowed. Switch the timer lists after ensuring the + * current timer list does not still reference some timers. + */ +static void prvSwitchTimerLists( void ) PRIVILEGED_FUNCTION; + +/* + * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE + * if a tick count overflow occurred since prvSampleTimeNow() was last called. + */ +static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; + +/* + * If the timer list contains any active timers then return the expire time of + * the timer that will expire first and set *pxListWasEmpty to false. If the + * timer list does not contain any timers then return 0 and set *pxListWasEmpty + * to pdTRUE. + */ +static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * If a timer has expired, process it. Otherwise, block the timer service task + * until either a timer does expire or a command is received. + */ +static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * Called after a Timer_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewTimer( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t *pxNewTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +/*-----------------------------------------------------------*/ + +BaseType_t xTimerCreateTimerTask( void ) +{ +BaseType_t xReturn = pdFAIL; + + /* This function is called when the scheduler is started if + configUSE_TIMERS is set to 1. Check that the infrastructure used by the + timer service task has been created/initialised. If timers have already + been created then the initialisation will already have been performed. */ + prvCheckForValidListAndQueue(); + + if( xTimerQueue != NULL ) + { + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t *pxTimerTaskTCBBuffer = NULL; + StackType_t *pxTimerTaskStackBuffer = NULL; + uint32_t ulTimerTaskStackSize; + + vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize ); + xTimerTaskHandle = xTaskCreateStatic( prvTimerTask, + "Tmr Svc", + ulTimerTaskStackSize, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + pxTimerTaskStackBuffer, + pxTimerTaskTCBBuffer ); + + if( xTimerTaskHandle != NULL ) + { + xReturn = pdPASS; + } + } + #else + { + xReturn = xTaskCreate( prvTimerTask, + "Tmr Svc", + configTIMER_TASK_STACK_DEPTH, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + &xTimerTaskHandle ); + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + configASSERT( xReturn ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreate( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + Timer_t *pxNewTimer; + + pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); + + if( pxNewTimer != NULL ) + { + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Timers can be created statically or dynamically, so note this + timer was created dynamically in case the timer is later + deleted. */ + pxNewTimer->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + + return pxNewTimer; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t *pxTimerBuffer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + Timer_t *pxNewTimer; + + #if( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + variable of type StaticTimer_t equals the size of the real timer + structures. */ + volatile size_t xSize = sizeof( StaticTimer_t ); + configASSERT( xSize == sizeof( Timer_t ) ); + } + #endif /* configASSERT_DEFINED */ + + /* A pointer to a StaticTimer_t structure MUST be provided, use it. */ + configASSERT( pxTimerBuffer ); + pxNewTimer = ( Timer_t * ) pxTimerBuffer; /*lint !e740 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + + if( pxNewTimer != NULL ) + { + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + + #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Timers can be created statically or dynamically so note this + timer was created statically in case it is later deleted. */ + pxNewTimer->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + + return pxNewTimer; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewTimer( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t *pxNewTimer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ + /* 0 is not a valid value for xTimerPeriodInTicks. */ + configASSERT( ( xTimerPeriodInTicks > 0 ) ); + + if( pxNewTimer != NULL ) + { + /* Ensure the infrastructure used by the timer service task has been + created/initialised. */ + prvCheckForValidListAndQueue(); + + /* Initialise the timer structure members using the function + parameters. */ + pxNewTimer->pcTimerName = pcTimerName; + pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; + pxNewTimer->uxAutoReload = uxAutoReload; + pxNewTimer->pvTimerID = pvTimerID; + pxNewTimer->pxCallbackFunction = pxCallbackFunction; + vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); + traceTIMER_CREATE( pxNewTimer ); + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) +{ +BaseType_t xReturn = pdFAIL; +DaemonTaskMessage_t xMessage; + + configASSERT( xTimer ); + + /* Send a message to the timer service task to perform a particular action + on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; + xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer; + + if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ) + { + if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + } + else + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); + } + } + else + { + xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + } + + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) +{ + /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been + started, then xTimerTaskHandle will be NULL. */ + configASSERT( ( xTimerTaskHandle != NULL ) ); + return xTimerTaskHandle; +} +/*-----------------------------------------------------------*/ + +TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) +{ +Timer_t *pxTimer = ( Timer_t * ) xTimer; + + configASSERT( xTimer ); + return pxTimer->xTimerPeriodInTicks; +} +/*-----------------------------------------------------------*/ + +TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) +{ +Timer_t * pxTimer = ( Timer_t * ) xTimer; +TickType_t xReturn; + + configASSERT( xTimer ); + xReturn = listGET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ) ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +const char * pcTimerGetName( TimerHandle_t xTimer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ +Timer_t *pxTimer = ( Timer_t * ) xTimer; + + configASSERT( xTimer ); + return pxTimer->pcTimerName; +} +/*-----------------------------------------------------------*/ + +static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) +{ +BaseType_t xResult; +Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Remove the timer from the list of active timers. A check has already + been performed to ensure the list is not empty. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); + + /* If the timer is an auto reload timer then calculate the next + expiry time and re-insert the timer in the list of active timers. */ + if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE ) + { + /* The timer is inserted into a list using a time relative to anything + other than the current time. It will therefore be inserted into the + correct list relative to the time this task thinks it is now. */ + if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) != pdFALSE ) + { + /* The timer expired before it was added to the active timer + list. Reload it now. */ + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Call the timer callback. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); +} +/*-----------------------------------------------------------*/ + +static void prvTimerTask( void *pvParameters ) +{ +TickType_t xNextExpireTime; +BaseType_t xListWasEmpty; + + /* Just to avoid compiler warnings. */ + ( void ) pvParameters; + + #if( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 ) + { + extern void vApplicationDaemonTaskStartupHook( void ); + + /* Allow the application writer to execute some code in the context of + this task at the point the task starts executing. This is useful if the + application includes initialisation code that would benefit from + executing after the scheduler has been started. */ + vApplicationDaemonTaskStartupHook(); + } + #endif /* configUSE_DAEMON_TASK_STARTUP_HOOK */ + + for( ;; ) + { + /* Query the timers list to see if it contains any timers, and if so, + obtain the time at which the next timer will expire. */ + xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); + + /* If a timer has expired, process it. Otherwise, block this task + until either a timer does expire, or a command is received. */ + prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); + + /* Empty the command queue. */ + prvProcessReceivedCommands(); + } +} +/*-----------------------------------------------------------*/ + +static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) +{ +TickType_t xTimeNow; +BaseType_t xTimerListsWereSwitched; + + vTaskSuspendAll(); + { + /* Obtain the time now to make an assessment as to whether the timer + has expired or not. If obtaining the time causes the lists to switch + then don't process this timer as any timers that remained in the list + when the lists were switched will have been processed within the + prvSampleTimeNow() function. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + if( xTimerListsWereSwitched == pdFALSE ) + { + /* The tick count has not overflowed, has the timer expired? */ + if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) + { + ( void ) xTaskResumeAll(); + prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); + } + else + { + /* The tick count has not overflowed, and the next expire + time has not been reached yet. This task should therefore + block to wait for the next expire time or a command to be + received - whichever comes first. The following line cannot + be reached unless xNextExpireTime > xTimeNow, except in the + case when the current timer list is empty. */ + if( xListWasEmpty != pdFALSE ) + { + /* The current timer list is empty - is the overflow list + also empty? */ + xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList ); + } + + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty ); + + if( xTaskResumeAll() == pdFALSE ) + { + /* Yield to wait for either a command to arrive, or the + block time to expire. If a command arrived between the + critical section being exited and this yield then the yield + will not cause the task to block. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + ( void ) xTaskResumeAll(); + } + } +} +/*-----------------------------------------------------------*/ + +static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) +{ +TickType_t xNextExpireTime; + + /* Timers are listed in expiry time order, with the head of the list + referencing the task that will expire first. Obtain the time at which + the timer with the nearest expiry time will expire. If there are no + active timers then just set the next expire time to 0. That will cause + this task to unblock when the tick count overflows, at which point the + timer lists will be switched and the next expiry time can be + re-assessed. */ + *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); + if( *pxListWasEmpty == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + } + else + { + /* Ensure the task unblocks when the tick count rolls over. */ + xNextExpireTime = ( TickType_t ) 0U; + } + + return xNextExpireTime; +} +/*-----------------------------------------------------------*/ + +static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) +{ +TickType_t xTimeNow; +PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */ + + xTimeNow = xTaskGetTickCount(); + + if( xTimeNow < xLastTime ) + { + prvSwitchTimerLists(); + *pxTimerListsWereSwitched = pdTRUE; + } + else + { + *pxTimerListsWereSwitched = pdFALSE; + } + + xLastTime = xTimeNow; + + return xTimeNow; +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) +{ +BaseType_t xProcessTimerNow = pdFALSE; + + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + + if( xNextExpiryTime <= xTimeNow ) + { + /* Has the expiry time elapsed between the command to start/reset a + timer was issued, and the time the command was processed? */ + if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + { + /* The time between a command being issued and the command being + processed actually exceeds the timers period. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); + } + } + else + { + if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) + { + /* If, since the command was issued, the tick count has overflowed + but the expiry time has not, then the timer must have already passed + its expiry time and should be processed immediately. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + } + + return xProcessTimerNow; +} +/*-----------------------------------------------------------*/ + +static void prvProcessReceivedCommands( void ) +{ +DaemonTaskMessage_t xMessage; +Timer_t *pxTimer; +BaseType_t xTimerListsWereSwitched, xResult; +TickType_t xTimeNow; + + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */ + { + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + { + /* Negative commands are pended function calls rather than timer + commands. */ + if( xMessage.xMessageID < ( BaseType_t ) 0 ) + { + const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters ); + + /* The timer uses the xCallbackParameters member to request a + callback be executed. Check the callback is not NULL. */ + configASSERT( pxCallback ); + + /* Call the function. */ + pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* INCLUDE_xTimerPendFunctionCall */ + + /* Commands that are positive are timer commands rather than pended + function calls. */ + if( xMessage.xMessageID >= ( BaseType_t ) 0 ) + { + /* The messages uses the xTimerParameters member to work on a + software timer. */ + pxTimer = xMessage.u.xTimerParameters.pxTimer; + + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) + { + /* The timer is in a list, remove it. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue ); + + /* In this case the xTimerListsWereSwitched parameter is not used, but + it must be present in the function call. prvSampleTimeNow() must be + called after the message is received from xTimerQueue so there is no + possibility of a higher priority task adding a message to the message + queue with a time that is ahead of the timer daemon task (because it + pre-empted the timer daemon task after the xTimeNow value was set). */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START : + case tmrCOMMAND_START_FROM_ISR : + case tmrCOMMAND_RESET : + case tmrCOMMAND_RESET_FROM_ISR : + case tmrCOMMAND_START_DONT_TRACE : + /* Start or restart a timer. */ + if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE ) + { + /* The timer expired before it was added to the active + timer list. Process it now. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + traceTIMER_EXPIRED( pxTimer ); + + if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE ) + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + break; + + case tmrCOMMAND_STOP : + case tmrCOMMAND_STOP_FROM_ISR : + /* The timer has already been removed from the active list. + There is nothing to do here. */ + break; + + case tmrCOMMAND_CHANGE_PERIOD : + case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR : + pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + + /* The new period does not really have a reference, and can + be longer or shorter than the old one. The command time is + therefore set to the current time, and as the period cannot + be zero the next expiry time can only be in the future, + meaning (unlike for the xTimerStart() case above) there is + no fail case that needs to be handled here. */ + ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); + break; + + case tmrCOMMAND_DELETE : + /* The timer has already been removed from the active list, + just free up the memory if the memory was dynamically + allocated. */ + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The timer can only have been allocated dynamically - + free it again. */ + vPortFree( pxTimer ); + } + #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The timer could have been allocated statically or + dynamically, so check before attempting to free the + memory. */ + if( pxTimer->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxTimer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + break; + + default : + /* Don't expect to get here. */ + break; + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvSwitchTimerLists( void ) +{ +TickType_t xNextExpireTime, xReloadTime; +List_t *pxTemp; +Timer_t *pxTimer; +BaseType_t xResult; + + /* The tick count has overflowed. The timer lists must be switched. + If there are any timers still referenced from the current timer list + then they must have expired and should be processed before the lists + are switched. */ + while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Remove the timer from the list. */ + pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); + + /* Execute its callback, then send a command to restart the timer if + it is an auto-reload timer. It cannot be restarted here as the lists + have not yet been switched. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + + if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE ) + { + /* Calculate the reload value, and if the reload value results in + the timer going into the same timer list then it has already expired + and the timer should be re-inserted into the current list so it is + processed again within this loop. Otherwise a command should be sent + to restart the timer to ensure it is only inserted into a list after + the lists have been swapped. */ + xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ); + if( xReloadTime > xNextExpireTime ) + { + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + else + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxTemp = pxCurrentTimerList; + pxCurrentTimerList = pxOverflowTimerList; + pxOverflowTimerList = pxTemp; +} +/*-----------------------------------------------------------*/ + +static void prvCheckForValidListAndQueue( void ) +{ + /* Check that the list from which active timers are referenced, and the + queue used to communicate with the timer service, have been + initialised. */ + taskENTER_CRITICAL(); + { + if( xTimerQueue == NULL ) + { + vListInitialise( &xActiveTimerList1 ); + vListInitialise( &xActiveTimerList2 ); + pxCurrentTimerList = &xActiveTimerList1; + pxOverflowTimerList = &xActiveTimerList2; + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* The timer queue is allocated statically in case + configSUPPORT_DYNAMIC_ALLOCATION is 0. */ + static StaticQueue_t xStaticTimerQueue; + static uint8_t ucStaticTimerQueueStorage[ configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ]; + + xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue ); + } + #else + { + xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) ); + } + #endif + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + if( xTimerQueue != NULL ) + { + vQueueAddToRegistry( xTimerQueue, "TmrQ" ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configQUEUE_REGISTRY_SIZE */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) +{ +BaseType_t xTimerIsInActiveList; +Timer_t *pxTimer = ( Timer_t * ) xTimer; + + configASSERT( xTimer ); + + /* Is the timer in the list of active timers? */ + taskENTER_CRITICAL(); + { + /* Checking to see if it is in the NULL list in effect checks to see if + it is referenced from either the current or the overflow timer lists in + one go, but the logic has to be reversed, hence the '!'. */ + xTimerIsInActiveList = ( BaseType_t ) !( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) ); + } + taskEXIT_CRITICAL(); + + return xTimerIsInActiveList; +} /*lint !e818 Can't be pointer to const due to the typedef. */ +/*-----------------------------------------------------------*/ + +void *pvTimerGetTimerID( const TimerHandle_t xTimer ) +{ +Timer_t * const pxTimer = ( Timer_t * ) xTimer; +void *pvReturn; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pvReturn = pxTimer->pvTimerID; + } + taskEXIT_CRITICAL(); + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) +{ +Timer_t * const pxTimer = ( Timer_t * ) xTimer; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pxTimer->pvTimerID = pvNewID; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +#if( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* Complete the message with the function parameters and post it to the + daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + + tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + +#endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + +#if( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* This function can only be called after a timer has been created or + after the scheduler has been started because, until then, the timer + queue does not exist. */ + configASSERT( xTimerQueue ); + + /* Complete the message with the function parameters and post it to the + daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + + tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + +#endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. If you want to include software timer +functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#endif /* configUSE_TIMERS == 1 */ + + + diff --git a/STM32F1/libraries/FreeRTOS900/utility/timers.h b/STM32F1/libraries/FreeRTOS900/utility/timers.h new file mode 100644 index 000000000..798c955bb --- /dev/null +++ b/STM32F1/libraries/FreeRTOS900/utility/timers.h @@ -0,0 +1,1314 @@ +/* + FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef TIMERS_H +#define TIMERS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include timers.h" +#endif + +/*lint -e537 This headers are only multiply included if the application code +happens to also be including task.h. */ +#include "task.h" +/*lint +e537 */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + +/* IDs for commands that can be sent/received on the timer queue. These are to +be used solely through the macros that make up the public software timer API, +as defined below. The commands that are sent from interrupts must use the +highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task +or interrupt version of the queue send function should be used. */ +#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) +#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) +#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) +#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) +#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) +#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) +#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) +#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) + +#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) +#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) +#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) + + +/** + * Type by which software timers are referenced. For example, a call to + * xTimerCreate() returns an TimerHandle_t variable that can then be used to + * reference the subject timer in calls to other software timer API functions + * (for example, xTimerStart(), xTimerReset(), etc.). + */ +typedef void * TimerHandle_t; + +/* + * Defines the prototype to which timer callback functions must conform. + */ +typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer ); + +/* + * Defines the prototype to which functions used with the + * xTimerPendFunctionCallFromISR() function must conform. + */ +typedef void (*PendedFunction_t)( void *, uint32_t ); + +/** + * TimerHandle_t xTimerCreate( const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * http://www.freertos.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @return If the timer is successfully created then a handle to the newly + * created timer is returned. If the timer cannot be created (because either + * there is insufficient FreeRTOS heap remaining to allocate the timer + * structures, or the timer period was set to 0) then NULL is returned. + * + * Example usage: + * @verbatim + * #define NUM_TIMERS 5 + * + * // An array to hold handles to the created timers. + * TimerHandle_t xTimers[ NUM_TIMERS ]; + * + * // An array to hold a count of the number of times each timer expires. + * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 }; + * + * // Define a callback function that will be used by multiple timer instances. + * // The callback function does nothing but count the number of times the + * // associated timer expires, and stop the timer once the timer has expired + * // 10 times. + * void vTimerCallback( TimerHandle_t pxTimer ) + * { + * int32_t lArrayIndex; + * const int32_t xMaxExpiryCountBeforeStopping = 10; + * + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); + * + * // Which timer expired? + * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); + * + * // Increment the number of times that pxTimer has expired. + * lExpireCounters[ lArrayIndex ] += 1; + * + * // If the timer has expired 10 times then stop it from running. + * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) + * { + * // Do not use a block time if calling a timer API function from a + * // timer callback function, as doing so could cause a deadlock! + * xTimerStop( pxTimer, 0 ); + * } + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start some timers. Starting the timers before the scheduler + * // has been started means the timers will start running immediately that + * // the scheduler starts. + * for( x = 0; x < NUM_TIMERS; x++ ) + * { + * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. + * ( 100 * x ), // The timer period in ticks. + * pdTRUE, // The timers will auto-reload themselves when they expire. + * ( void * ) x, // Assign each timer a unique id equal to its array index. + * vTimerCallback // Each timer calls the same callback when it expires. + * ); + * + * if( xTimers[ x ] == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreate( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/** + * TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction, + * StaticTimer_t *pxTimerBuffer ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * http://www.freertos.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which + * will be then be used to hold the software timer's data structures, removing + * the need for the memory to be allocated dynamically. + * + * @return If the timer is created then a handle to the created timer is + * returned. If pxTimerBuffer was NULL then NULL is returned. + * + * Example usage: + * @verbatim + * + * // The buffer used to hold the software timer's data structure. + * static StaticTimer_t xTimerBuffer; + * + * // A variable that will be incremented by the software timer's callback + * // function. + * UBaseType_t uxVariableToIncrement = 0; + * + * // A software timer callback function that increments a variable passed to + * // it when the software timer was created. After the 5th increment the + * // callback function stops the software timer. + * static void prvTimerCallback( TimerHandle_t xExpiredTimer ) + * { + * UBaseType_t *puxVariableToIncrement; + * BaseType_t xReturned; + * + * // Obtain the address of the variable to increment from the timer ID. + * puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer ); + * + * // Increment the variable to show the timer callback has executed. + * ( *puxVariableToIncrement )++; + * + * // If this callback has executed the required number of times, stop the + * // timer. + * if( *puxVariableToIncrement == 5 ) + * { + * // This is called from a timer callback so must not block. + * xTimerStop( xExpiredTimer, staticDONT_BLOCK ); + * } + * } + * + * + * void main( void ) + * { + * // Create the software time. xTimerCreateStatic() has an extra parameter + * // than the normal xTimerCreate() API function. The parameter is a pointer + * // to the StaticTimer_t structure that will hold the software timer + * // structure. If the parameter is passed as NULL then the structure will be + * // allocated dynamically, just as if xTimerCreate() had been called. + * xTimer = xTimerCreateStatic( "T1", // Text name for the task. Helps debugging only. Not used by FreeRTOS. + * xTimerPeriod, // The period of the timer in ticks. + * pdTRUE, // This is an auto-reload timer. + * ( void * ) &uxVariableToIncrement, // A variable incremented by the software timer's callback function + * prvTimerCallback, // The function to execute when the timer expires. + * &xTimerBuffer ); // The buffer that will hold the software timer structure. + * + * // The scheduler has not started yet so a block time is not used. + * xReturned = xTimerStart( xTimer, 0 ); + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t *pxTimerBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * void *pvTimerGetTimerID( TimerHandle_t xTimer ); + * + * Returns the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer, and by calling the + * vTimerSetTimerID() API function. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being queried. + * + * @return The ID assigned to the timer being queried. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); + * + * Sets the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being updated. + * + * @param pvNewID The ID to assign to the timer. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ); + * + * Queries a timer to see if it is active or dormant. + * + * A timer will be dormant if: + * 1) It has been created but not started, or + * 2) It is an expired one-shot timer that has not been restarted. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param xTimer The timer being queried. + * + * @return pdFALSE will be returned if the timer is dormant. A value other than + * pdFALSE will be returned if the timer is active. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is active, do something. + * } + * else + * { + * // xTimer is not active, do something else. + * } + * } + * @endverbatim + */ +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ); + * + * Simply returns the handle of the timer service/daemon task. It it not valid + * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStart() starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerStart() has equivalent functionality + * to the xTimerReset() API function. + * + * Starting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerStart() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerStart() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerStart() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() + * to be available. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the start command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStart() was called. xTicksToWait is ignored if xTimerStart() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStop() stops a timer that was previously started using either of the + * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), + * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. + * + * Stopping a timer ensures the timer is not in the active state. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() + * to be available. + * + * @param xTimer The handle of the timer being stopped. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the stop command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStop() was called. xTicksToWait is ignored if xTimerStop() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStop( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerChangePeriod() changes the period of a timer that was previously + * created using the xTimerCreate() API function. + * + * xTimerChangePeriod() can be called to change the period of an active or + * dormant state timer. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerChangePeriod() to be available. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the change period command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerChangePeriod() was called. xTicksToWait is ignored if + * xTimerChangePeriod() is called before the scheduler is started. + * + * @return pdFAIL will be returned if the change period command could not be + * sent to the timer command queue even after xTicksToWait ticks had passed. + * pdPASS will be returned if the command was successfully sent to the timer + * command queue. When the command is actually processed will depend on the + * priority of the timer service/daemon task relative to other tasks in the + * system. The timer service/daemon task priority is set by the + * configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. If the timer + * // referenced by xTimer is already active when it is called, then the timer + * // is deleted. If the timer referenced by xTimer is not active when it is + * // called, then the period of the timer is set to 500ms and the timer is + * // started. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is already active - delete it. + * xTimerDelete( xTimer ); + * } + * else + * { + * // xTimer is not active, change its period to 500ms. This will also + * // cause the timer to start. Block for a maximum of 100 ticks if the + * // change period command cannot immediately be sent to the timer + * // command queue. + * if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS ) + * { + * // The command was successfully sent. + * } + * else + * { + * // The command could not be sent, even after waiting for 100 ticks + * // to pass. Take appropriate action here. + * } + * } + * } + * @endverbatim + */ + #define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerDelete() deletes a timer that was previously created using the + * xTimerCreate() API function. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerDelete() to be available. + * + * @param xTimer The handle of the timer being deleted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the delete command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerDelete() was called. xTicksToWait is ignored if xTimerDelete() + * is called before the scheduler is started. + * + * @return pdFAIL will be returned if the delete command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerChangePeriod() API function example usage scenario. + */ +#define xTimerDelete( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerReset() re-starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerReset() will cause the timer to + * re-evaluate its expiry time so that it is relative to when xTimerReset() was + * called. If the timer was in the dormant state then xTimerReset() has + * equivalent functionality to the xTimerStart() API function. + * + * Resetting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerReset() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerReset() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerReset() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() + * to be available. + * + * @param xTimer The handle of the timer being reset/started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the reset command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerReset() was called. xTicksToWait is ignored if xTimerReset() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer. + * + * TimerHandle_t xBacklightTimer = NULL; + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press event handler. + * void vKeyPressEventHandler( char cKey ) + * { + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. Wait 10 ticks for the command to be successfully sent + * // if it cannot be sent immediately. + * vSetBacklightState( BACKLIGHT_ON ); + * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start the one-shot timer that is responsible for turning + * // the back-light off if no keys are pressed within a 5 second period. + * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. + * ( 5000 / portTICK_PERIOD_MS), // The timer period in ticks. + * pdFALSE, // The timer is a one-shot timer. + * 0, // The id is not used by the callback so can take any value. + * vBacklightTimerCallback // The callback function that switches the LCD back-light off. + * ); + * + * if( xBacklightTimer == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timer running as it has already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#define xTimerReset( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStart() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStartFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStartFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStartFromISR() function. If + * xTimerStartFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerStartFromISR() is actually called. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then restart the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The start command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStop() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being stopped. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStopFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStopFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStopFromISR() function. If + * xTimerStopFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the timer should be simply stopped. + * + * // The interrupt service routine that stops the timer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - simply stop the timer. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The stop command was not executed successfully. Take appropriate + * // action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerChangePeriod() that can be called from an interrupt + * service routine. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerChangePeriodFromISR() writes a message to the + * timer command queue, so has the potential to transition the timer service/ + * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() + * causes the timer service/daemon task to leave the Blocked state, and the + * timer service/daemon task has a priority equal to or greater than the + * currently executing task (the task that was interrupted), then + * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the + * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets + * this value to pdTRUE then a context switch should be performed before the + * interrupt exits. + * + * @return pdFAIL will be returned if the command to change the timers period + * could not be sent to the timer command queue. pdPASS will be returned if the + * command was successfully sent to the timer command queue. When the command + * is actually processed will depend on the priority of the timer service/daemon + * task relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the period of xTimer should be changed to 500ms. + * + * // The interrupt service routine that changes the period of xTimer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - change the period of xTimer to 500ms. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The command to change the timers period was not executed + * // successfully. Take appropriate action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerReset() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer that is to be started, reset, or + * restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerResetFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerResetFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerResetFromISR() function. If + * xTimerResetFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerResetFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + + +/** + * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * + * Used from application interrupt service routines to defer the execution of a + * function to the RTOS daemon task (the timer service task, hence this function + * is implemented in timers.c and is prefixed with 'Timer'). + * + * Ideally an interrupt service routine (ISR) is kept as short as possible, but + * sometimes an ISR either has a lot of processing to do, or needs to perform + * processing that is not deterministic. In these cases + * xTimerPendFunctionCallFromISR() can be used to defer processing of a function + * to the RTOS daemon task. + * + * A mechanism is provided that allows the interrupt to return directly to the + * task that will subsequently execute the pended callback function. This + * allows the callback function to execute contiguously in time with the + * interrupt - just as if the callback had executed in the interrupt itself. + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task (which is set using + * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of + * the currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE within + * xTimerPendFunctionCallFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + * Example usage: + * @verbatim + * + * // The callback function that will execute in the context of the daemon task. + * // Note callback functions must all use this same prototype. + * void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 ) + * { + * BaseType_t xInterfaceToService; + * + * // The interface that requires servicing is passed in the second + * // parameter. The first parameter is not used in this case. + * xInterfaceToService = ( BaseType_t ) ulParameter2; + * + * // ...Perform the processing here... + * } + * + * // An ISR that receives data packets from multiple interfaces + * void vAnISR( void ) + * { + * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; + * + * // Query the hardware to determine which interface needs processing. + * xInterfaceToService = prvCheckInterfaces(); + * + * // The actual processing is to be deferred to a task. Request the + * // vProcessInterface() callback function is executed, passing in the + * // number of the interface that needs processing. The interface to + * // service is passed in the second parameter. The first parameter is + * // not used in this case. + * xHigherPriorityTaskWoken = pdFALSE; + * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); + * + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and will + * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to + * // the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * + * } + * @endverbatim + */ +BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + + /** + * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * TickType_t xTicksToWait ); + * + * + * Used to defer the execution of a function to the RTOS daemon task (the timer + * service task, hence this function is implemented in timers.c and is prefixed + * with 'Timer'). + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param xTicksToWait Calling this function will result in a message being + * sent to the timer daemon task on a queue. xTicksToWait is the amount of + * time the calling task should remain in the Blocked state (so not using any + * processing time) for space to become available on the timer queue if the + * queue is found to be full. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + */ +BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * const char * const pcTimerGetName( TimerHandle_t xTimer ); + * + * Returns the name that was assigned to a timer when the timer was created. + * + * @param xTimer The handle of the timer being queried. + * + * @return The name assigned to the timer specified by the xTimer parameter. + */ +const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * TickType_t xTimerGetPeriod( TimerHandle_t xTimer ); + * + * Returns the period of a timer. + * + * @param xTimer The handle of the timer being queried. + * + * @return The period of the timer in ticks. + */ +TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** +* TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ); +* +* Returns the time in ticks at which the timer will expire. If this is less +* than the current tick count then the expiry time has overflowed from the +* current time. +* +* @param xTimer The handle of the timer being queried. +* +* @return If the timer is running then the time in ticks at which the timer +* will next expire is returned. If the timer is not running then the return +* value is undefined. +*/ +TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/* + * Functions beyond this part are not part of the public API and are intended + * for use by the kernel only. + */ +BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif +#endif /* TIMERS_H */ + + + From e7abad654e8ca03a86502c3b5a27f5411660060e Mon Sep 17 00:00:00 2001 From: victorpv Date: Sun, 26 Mar 2017 14:33:48 -0500 Subject: [PATCH 045/307] Timer DMA functions. Adding 2 functions to enable and disable Timer peripheral DMA requests on update event. --- STM32F1/system/libmaple/include/libmaple/timer.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/STM32F1/system/libmaple/include/libmaple/timer.h b/STM32F1/system/libmaple/include/libmaple/timer.h index 59b340320..28b6c95ce 100644 --- a/STM32F1/system/libmaple/include/libmaple/timer.h +++ b/STM32F1/system/libmaple/include/libmaple/timer.h @@ -785,6 +785,22 @@ static inline void timer_dma_disable_trg_req(timer_dev *dev) { *bb_perip(&(dev->regs).gen->DIER, TIMER_DIER_TDE_BIT) = 0; } +/** + * @brief Enable a timer's update DMA request + * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL + */ +static inline void timer_dma_enable_upd_req(timer_dev *dev) { + *bb_perip(&(dev->regs).gen->DIER, TIMER_DIER_UDE_BIT) = 1; +} + +/** + * @brief Disable a timer's update DMA request + * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL + */ +static inline void timer_dma_disable_upd_req(timer_dev *dev) { + *bb_perip(&(dev->regs).gen->DIER, TIMER_DIER_UDE_BIT) = 0; +} + /** * @brief Enable a timer channel's DMA request. * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL From 83e5f4832206f1924168c217df0c7bff1b06dad7 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Thu, 13 Apr 2017 22:34:37 +0200 Subject: [PATCH 046/307] remove "deprecated" flag from dma_setup_transfer remove deprecated flag --- STM32F1/cores/maple/libmaple/dma_f1.c | 1 - STM32F1/system/libmaple/stm32f1/include/series/dma.h | 1 - 2 files changed, 2 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/dma_f1.c b/STM32F1/cores/maple/libmaple/dma_f1.c index 6400d1533..c7c3c0072 100644 --- a/STM32F1/cores/maple/libmaple/dma_f1.c +++ b/STM32F1/cores/maple/libmaple/dma_f1.c @@ -341,7 +341,6 @@ void dma_set_per_addr(dma_dev *dev, dma_channel channel, __io void *addr) { * @see dma_attach_interrupt() * @see dma_enable() */ -__deprecated void dma_setup_transfer(dma_dev *dev, dma_channel channel, __io void *peripheral_address, diff --git a/STM32F1/system/libmaple/stm32f1/include/series/dma.h b/STM32F1/system/libmaple/stm32f1/include/series/dma.h index bedb6028e..ff6185795 100644 --- a/STM32F1/system/libmaple/stm32f1/include/series/dma.h +++ b/STM32F1/system/libmaple/stm32f1/include/series/dma.h @@ -559,7 +559,6 @@ typedef enum dma_mode_flags { * * (It's not possible to fully configure a DMA stream on F2 with just * this information, so this interface is too tied to the F1.) */ -__deprecated void dma_setup_transfer(dma_dev *dev, dma_channel channel, __io void *peripheral_address, From 3d775ac3c5abe061945f0821489c20d7e4606f71 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 14 Apr 2017 00:04:32 +0200 Subject: [PATCH 047/307] added variant black_f4 + cleanup old F1 anf F2 definitions --- STM32F4/boards.txt | 28 +++++++++ STM32F4/cores/maple/boards.cpp | 12 ++-- STM32F4/cores/maple/boards.h | 2 + STM32F4/cores/maple/io.h | 9 ++- .../cores/maple/libmaple/HardwareSerial.cpp | 2 +- STM32F4/cores/maple/libmaple/adc.c | 12 ++-- STM32F4/cores/maple/libmaple/adc.h | 48 +++++--------- STM32F4/cores/maple/libmaple/dma.h | 7 +-- STM32F4/cores/maple/libmaple/exti.h | 4 -- STM32F4/cores/maple/libmaple/gpio.h | 7 +-- STM32F4/cores/maple/libmaple/libmaple.h | 11 +++- STM32F4/cores/maple/libmaple/libmaple_types.h | 12 ++-- STM32F4/cores/maple/libmaple/rcc.h | 7 +-- STM32F4/cores/maple/libmaple/rules.mk | 22 ------- STM32F4/cores/maple/libmaple/stm32.h | 63 +------------------ STM32F4/cores/maple/libmaple/timer.h | 19 ++---- STM32F4/cores/maple/libmaple/usart.h | 6 +- .../cores/maple/libmaple/usbF4/VCP/usb_conf.h | 4 ++ .../maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c | 2 +- STM32F4/cores/maple/libmaple/usbF4/usb.c | 2 +- STM32F4/cores/maple/wirish.h | 1 - STM32F4/cores/maple/wirish_analog.cpp | 2 - STM32F4/cores/maple/wirish_digital.cpp | 14 ++--- STM32F4/cores/maple/wirish_types.h | 15 +++++ STM32F4/platform.txt | 8 +-- 25 files changed, 122 insertions(+), 197 deletions(-) diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 7577d1949..3ff182c7b 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -29,6 +29,34 @@ discovery_f407.build.error_led_port=GPIOD discovery_f407.build.error_led_pin=14 discovery_f407.build.board=STM32DiscoveryF407 +############################################################## +black_f407vet6.name=STM32 Black F407VET6 + +black_f407vet6.upload.tool=stlink_upload +black_f407vet6.upload.protocol=stlink + +black_f407vet6.upload.file_type=bin +black_f407vet6.upload.ram.maximum_size=65535 +black_f407vet6.upload.flash.maximum_size=514288 +black_f407vet6.upload.maximum_size=514288 + +#black_f407vet6.upload.usbID=0483:3748 +#black_f407vet6.upload.altID=1 +#black_f407vet6.upload.auto_reset=true + +black_f407vet6.build.mcu=cortex-m4 +black_f407vet6.build.f_cpu=168000000L +black_f407vet6.build.core=maple +black_f407vet6.build.extra_flags=-mthumb -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_black_f4 +black_f407vet6.build.ldscript=ld/jtag.ld +black_f407vet6.build.variant=black_f407vet6 +black_f407vet6.build.variant_system_lib=lib_f407.a +black_f407vet6.build.vect=VECT_TAB_BASE +black_f407vet6.build.density=STM32_HIGH_DENSITY +black_f407vet6.build.error_led_port=GPIOA +black_f407vet6.build.error_led_pin=7 +black_f407vet6.build.board=STM32BlackF407VET6 + ############################################################## stm32f4stamp.name=STM32F4Stamp F405 diff --git a/STM32F4/cores/maple/boards.cpp b/STM32F4/cores/maple/boards.cpp index a85657163..f9bfd5a31 100644 --- a/STM32F4/cores/maple/boards.cpp +++ b/STM32F4/cores/maple/boards.cpp @@ -41,9 +41,7 @@ #include "adc.h" #include "timer.h" #include "usb.h" -#ifdef STM32F2 -//#include "usbF4.h" -#endif + static void setupFlash(void); static void setupClocks(void); @@ -59,7 +57,7 @@ void init(void) { systick_init(SYSTICK_RELOAD_VAL); gpio_init_all(); -#ifdef STM32F2 +#ifdef STM32F4 rcc_clk_enable(RCC_SYSCFG); #else afio_init(); @@ -84,11 +82,13 @@ bool boardUsesPin(uint8 pin) { } static void setupFlash(void) { +/* #ifndef STM32F2 // for F2 and F4 CPUs this is done in SetupClock...(), e.g. in SetupClock168MHz() flash_enable_prefetch(); flash_set_latency(FLASH_WAIT_STATE_2); #endif +*/ } /* @@ -121,8 +121,8 @@ static void setupNVIC() { static void adcDefaultConfig(const adc_dev* dev); static void setupADC() { -#ifdef STM32F2 - setupADC_F2(); +#ifdef STM32F4 + setupADC_F4(); #else rcc_set_prescaler(RCC_PRESCALER_ADC, RCC_ADCPRE_PCLK_DIV_6); #endif diff --git a/STM32F4/cores/maple/boards.h b/STM32F4/cores/maple/boards.h index 00d07cddb..5e0aae3b8 100644 --- a/STM32F4/cores/maple/boards.h +++ b/STM32F4/cores/maple/boards.h @@ -140,6 +140,8 @@ bool boardUsesPin(uint8 pin); #include "aeroquad32mini.h" #elif defined(BOARD_discovery_f4) #include "discovery_f4.h" +#elif defined(BOARD_black_f4) +#include "black_f4.h" #elif defined(BOARD_freeflight) #include "freeflight.h" #else diff --git a/STM32F4/cores/maple/io.h b/STM32F4/cores/maple/io.h index df1ab969e..d4d1c25cd 100644 --- a/STM32F4/cores/maple/io.h +++ b/STM32F4/cores/maple/io.h @@ -33,6 +33,7 @@ #ifndef _IO_H_ #define _IO_H_ +#include #include "gpio.h" #include "adc.h" @@ -179,9 +180,11 @@ static inline void toggleLED() { * accomplished portably over all LeafLabs boards by calling * pinMode(BOARD_BUTTON_PIN, INPUT). * + * @param button - one of available on-board buttons (up to 3 for black F4) + * * @see pinMode() */ -uint8 isButtonPressed(); +uint8 isButtonPressed(uint8_t button); /** * Wait until the button is pressed and released, timing out if no @@ -195,12 +198,14 @@ uint8 isButtonPressed(); * button is pressed. If timeout_millis is left out (or 0), wait * forever. * + * @param button - one of available on-board buttons (up to 3 for black F4) + * * @return true, if the button was pressed; false, if the timeout was * reached. * * @see pinMode() */ -uint8 waitForButtonPress(uint32 timeout_millis=0); +uint8 waitForButtonPress(uint8_t button, uint32 timeout_millis=0); /** * Shift out a byte of data, one bit at a time. diff --git a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp index 59ce71d11..475116b17 100644 --- a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp +++ b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp @@ -92,7 +92,7 @@ void HardwareSerial::begin(uint32 baud) { const stm32_pin_info *txi = &PIN_MAP[tx_pin]; const stm32_pin_info *rxi = &PIN_MAP[rx_pin]; -#ifdef STM32F2 +#ifdef STM32F4 // int af = 7<<8; if (usart_device == UART4 || usart_device == UART5) { gpio_set_af_mode(txi->gpio_device, txi->gpio_bit, 8); diff --git a/STM32F4/cores/maple/libmaple/adc.c b/STM32F4/cores/maple/libmaple/adc.c index aeeb43c0e..b803f29cb 100644 --- a/STM32F4/cores/maple/libmaple/adc.c +++ b/STM32F4/cores/maple/libmaple/adc.c @@ -74,7 +74,7 @@ const adc_dev *ADC3 = &adc3; */ void adc_init(const adc_dev *dev) { rcc_clk_enable(dev->clk_id); -#ifdef STM32F2 +#ifdef STM32F4 if(dev->clk_id == RCC_ADC1) { rcc_reset_dev(dev->clk_id); } @@ -136,7 +136,9 @@ void adc_set_sample_rate(const adc_dev *dev, adc_smp_rate smp_rate) { * @brief Calibrate an ADC peripheral * @param dev adc device */ -void adc_calibrate(const adc_dev *dev) { +void adc_calibrate(const adc_dev *dev) +{ +/* #ifndef STM32F2 __io uint32 *rstcal_bit = bb_perip(&(dev->regs->CR2), 3); __io uint32 *cal_bit = bb_perip(&(dev->regs->CR2), 2); @@ -149,6 +151,7 @@ void adc_calibrate(const adc_dev *dev) { while (*cal_bit) ; #endif +*/ } /** @@ -171,8 +174,8 @@ uint16 adc_read(const adc_dev *dev, uint8 channel) { return (uint16)(regs->DR & ADC_DR_DATA); } -void setupADC_F2() { -#ifdef STM32F2 +void setupADC_F4(void) +{ uint32 tmpreg1 = 0; tmpreg1 = ADC_COMMON->CCR; @@ -196,5 +199,4 @@ void setupADC_F2() { /* Write to ADC CCR */ ADC_COMMON->CCR = tmpreg1; -#endif } diff --git a/STM32F4/cores/maple/libmaple/adc.h b/STM32F4/cores/maple/libmaple/adc.h index 3a40d4c58..7a395102d 100644 --- a/STM32F4/cores/maple/libmaple/adc.h +++ b/STM32F4/cores/maple/libmaple/adc.h @@ -42,17 +42,15 @@ extern "C"{ #endif -#ifdef STM32F2 - typedef struct - { - __io uint32 CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __io uint32 CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __io uint32 CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ - } ADC_Common_TypeDef; +typedef struct +{ + __io uint32 CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __io uint32 CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __io uint32 CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; #define ADC_COMMON ((ADC_Common_TypeDef *) 0x40012300) -#endif /** ADC register map type. */ typedef struct adc_reg_map { @@ -94,23 +92,12 @@ extern const adc_dev *ADC3; * Register map base pointers */ -#ifdef STM32F2 - /** ADC1 register map base pointer. */ - #define ADC1_BASE ((struct adc_reg_map*)0x40012000) - /** ADC2 register map base pointer. */ - #define ADC2_BASE ((struct adc_reg_map*)0x40012100) - /** ADC3 register map base pointer. */ - #define ADC3_BASE ((struct adc_reg_map*)0x40012200) -#else - /** ADC1 register map base pointer. */ - #define ADC1_BASE ((struct adc_reg_map*)0x40012400) - /** ADC2 register map base pointer. */ - #define ADC2_BASE ((struct adc_reg_map*)0x40012800) - #ifdef STM32_HIGH_DENSITY - /** ADC3 register map base pointer. */ - #define ADC3_BASE ((struct adc_reg_map*)0x40013C00) - #endif -#endif +/** ADC1 register map base pointer. */ +#define ADC1_BASE ((struct adc_reg_map*)0x40012000) +/** ADC2 register map base pointer. */ +#define ADC2_BASE ((struct adc_reg_map*)0x40012100) +/** ADC3 register map base pointer. */ +#define ADC3_BASE ((struct adc_reg_map*)0x40012200) /* * Register bit definitions @@ -167,17 +154,10 @@ extern const adc_dev *ADC3; #define ADC_CR2_JEXTTRIG_BIT 15 #define ADC_CR2_EXTTRIG_BIT 20 #define ADC_CR2_TSEREFE_BIT 23 -#ifdef STM32F2 #define ADC_CR2_JSWSTART_BIT 22 #define ADC_CR2_SWSTART_BIT 30 #define ADC_CR2_EXTSEL (0x0F000000) #define ADC_CR2_JEXTSEL (0x000F0000) -#else -#define ADC_CR2_JSWSTART_BIT 21 -#define ADC_CR2_SWSTART_BIT 22 -#define ADC_CR2_EXTSEL (0x000E0000) -#define ADC_CR2_JEXTSEL (0x00007000) -#endif @@ -388,7 +368,7 @@ static inline void adc_disable_all(void) { adc_foreach(adc_disable); } -void setupADC_F2(); +extern void setupADC_F4(void); #ifdef __cplusplus } // extern "C" diff --git a/STM32F4/cores/maple/libmaple/dma.h b/STM32F4/cores/maple/libmaple/dma.h index a965c036f..420adf8a4 100644 --- a/STM32F4/cores/maple/libmaple/dma.h +++ b/STM32F4/cores/maple/libmaple/dma.h @@ -30,9 +30,4 @@ * @brief Direct Memory Access peripheral support */ -#ifdef STM32F2 -#include "dmaF2.h" -#include -#else -#include "dmaF1.h" -#endif +#include "dmaF4.h" diff --git a/STM32F4/cores/maple/libmaple/exti.h b/STM32F4/cores/maple/libmaple/exti.h index bac8adcf4..063f2d7f1 100644 --- a/STM32F4/cores/maple/libmaple/exti.h +++ b/STM32F4/cores/maple/libmaple/exti.h @@ -52,11 +52,7 @@ typedef struct exti_reg_map { } exti_reg_map; /** EXTI register map base pointer */ -#ifdef STM32F2 #define EXTI_BASE ((struct exti_reg_map*)0x40013C00) -#else -#define EXTI_BASE ((struct exti_reg_map*)0x40010400) -#endif /** External interrupt trigger mode */ typedef enum exti_trigger_mode { diff --git a/STM32F4/cores/maple/libmaple/gpio.h b/STM32F4/cores/maple/libmaple/gpio.h index 4d42386c1..f065c7190 100644 --- a/STM32F4/cores/maple/libmaple/gpio.h +++ b/STM32F4/cores/maple/libmaple/gpio.h @@ -31,8 +31,5 @@ * (AFIO) prototypes, defines, and inlined access functions. */ -#ifdef STM32F2 -#include "gpioF2.h" -#else -#include "gpioF1.h" -#endif + +#include "gpioF4.h" diff --git a/STM32F4/cores/maple/libmaple/libmaple.h b/STM32F4/cores/maple/libmaple/libmaple.h index 10c6c0c00..20a57bc6f 100644 --- a/STM32F4/cores/maple/libmaple/libmaple.h +++ b/STM32F4/cores/maple/libmaple/libmaple.h @@ -42,19 +42,24 @@ * * FIXME this has no business being here */ +/* #if defined(MCU_STM32F103VE) || defined(MCU_STM32F205VE) || defined(MCU_STM32F406VG) - /* e.g., Aeroquad32 */ - #define USER_ADDR_ROM 0x08010000 /* ala42 */ + // e.g., Aeroquad32 + #define USER_ADDR_ROM 0x08010000 // ala42 #define USER_ADDR_RAM 0x20000C00 #define STACK_TOP 0x20000800 #elif defined(BOARD_freeflight) +*/ #define USER_ADDR_ROM 0x08000000 -#define USER_ADDR_RAM 0x20000000 +#define USER_ADDR_RAM 0x20000C00 #define STACK_TOP 0x20000800 +/* #else #define USER_ADDR_ROM 0x08005000 #define USER_ADDR_RAM 0x20000C00 #define STACK_TOP 0x20000800 #endif +*/ + #endif diff --git a/STM32F4/cores/maple/libmaple/libmaple_types.h b/STM32F4/cores/maple/libmaple/libmaple_types.h index 332ded176..e20e3274f 100644 --- a/STM32F4/cores/maple/libmaple/libmaple_types.h +++ b/STM32F4/cores/maple/libmaple/libmaple_types.h @@ -46,12 +46,14 @@ typedef long long int64; typedef void (*voidFuncPtr)(void); #define __io volatile -#define __attr_flash __attribute__((section (".USER_FLASH"))) - -#define __always_inline inline __attribute__((always_inline)) - +#ifndef __attr_flash + #define __attr_flash __attribute__((section (".USER_FLASH"))) +#endif +#ifndef __always_inline + #define __always_inline inline __attribute__((always_inline)) +#endif #ifndef NULL -#define NULL 0 + #define NULL 0 #endif #endif diff --git a/STM32F4/cores/maple/libmaple/rcc.h b/STM32F4/cores/maple/libmaple/rcc.h index 6317cbdb8..75e2d3d7a 100644 --- a/STM32F4/cores/maple/libmaple/rcc.h +++ b/STM32F4/cores/maple/libmaple/rcc.h @@ -29,8 +29,5 @@ * @brief reset and clock control definitions and prototypes */ -#ifdef STM32F2 -#include "rccF2.h" -#else -#include "rccF1.h" -#endif + +#include "rccF4.h" diff --git a/STM32F4/cores/maple/libmaple/rules.mk b/STM32F4/cores/maple/libmaple/rules.mk index c4924dc86..eb8d96d26 100644 --- a/STM32F4/cores/maple/libmaple/rules.mk +++ b/STM32F4/cores/maple/libmaple/rules.mk @@ -3,17 +3,11 @@ sp := $(sp).x dirstack_$(sp) := $(d) d := $(dir) BUILDDIRS += $(BUILD_PATH)/$(d) -ifneq ($(MCU_FAMILY), STM32F2) -BUILDDIRS += $(BUILD_PATH)/$(d)/usb -BUILDDIRS += $(BUILD_PATH)/$(d)/usb/usb_lib -LIBMAPLE_INCLUDES := -I$(LIBMAPLE_PATH) -I$(LIBMAPLE_PATH)/usb -I$(LIBMAPLE_PATH)/usb/usb_lib -else BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/STM32_USB_Device_Library/Core/src BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/STM32_USB_Device_Library/Class/cdc/src BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/STM32_USB_OTG_Driver/src BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/VCP LIBMAPLE_INCLUDES := -I$(LIBMAPLE_PATH) -I$(LIBMAPLE_PATH)/usbF4 -endif # Local flags @@ -42,18 +36,6 @@ cSRCS_$(d) := adc.c \ usart.c \ util.c -ifneq ($(MCU_FAMILY), STM32F2) - cSRCS_$(d) += \ - usb/descriptors.c \ - usb/usb.c \ - usb/usb_callbacks.c \ - usb/usb_hardware.c \ - usb/usb_lib/usb_core.c \ - usb/usb_lib/usb_init.c \ - usb/usb_lib/usb_int.c \ - usb/usb_lib/usb_mem.c \ - usb/usb_lib/usb_regs.c -else V=1 cSRCS_$(d) += \ usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c \ @@ -69,11 +51,7 @@ else usbF4/VCP/usbd_usr.c \ usbF4/usb.c \ usbF4/VCP/misc.c -endif -ifneq ($(MCU_FAMILY), STM32F2) - cSRCS_$(d) += bkp.c -endif sSRCS_$(d) := exc.S diff --git a/STM32F4/cores/maple/libmaple/stm32.h b/STM32F4/cores/maple/libmaple/stm32.h index 0d4deaa41..3921788e7 100644 --- a/STM32F4/cores/maple/libmaple/stm32.h +++ b/STM32F4/cores/maple/libmaple/stm32.h @@ -138,69 +138,8 @@ #endif -#if defined(MCU_STM32F103RB) - /* e.g., LeafLabs Maple */ - #define STM32_NR_GPIO_PORTS 4 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20005000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103ZE) - /* e.g., LeafLabs Maple Native */ - - #define STM32_NR_GPIO_PORTS 7 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103CB) - /* e.g., LeafLabs Maple Mini */ - - /* This STM32_NR_GPIO_PORTS value is not, strictly speaking, true. - * But only pins 0 and 1 exist, and they're used for OSC on the - * Mini, so we'll live with this for now. */ - #define STM32_NR_GPIO_PORTS 3 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20005000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103RE) - /* e.g., LeafLabs Maple RET6 edition */ - - #define STM32_NR_GPIO_PORTS 4 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103VE) - /* e.g., LeafLabs Maple Native */ - - #define STM32_NR_GPIO_PORTS 5 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F205VE) - #define STM32_TICKS_PER_US 120 - #define STM32_NR_GPIO_PORTS 5 - #define STM32_DELAY_US_MULT (STM32_TICKS_PER_US/3) - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F406VG) +#if defined( STM32F4 ) #define STM32_TICKS_PER_US 168 #define STM32_NR_GPIO_PORTS 5 #define STM32_DELAY_US_MULT (STM32_TICKS_PER_US/3) diff --git a/STM32F4/cores/maple/libmaple/timer.h b/STM32F4/cores/maple/libmaple/timer.h index fce6345b2..79b7d2996 100644 --- a/STM32F4/cores/maple/libmaple/timer.h +++ b/STM32F4/cores/maple/libmaple/timer.h @@ -113,13 +113,8 @@ typedef struct timer_bas_reg_map { } timer_bas_reg_map; -#ifdef STM32F2 - /** Timer 1 register map base pointer */ - #define TIMER1_BASE ((struct timer_adv_reg_map*)0x40010000) -#else - /** Timer 1 register map base pointer */ - #define TIMER1_BASE ((struct timer_adv_reg_map*)0x40012C00) -#endif +/** Timer 1 register map base pointer */ +#define TIMER1_BASE ((struct timer_adv_reg_map*)0x40010000) /** Timer 2 register map base pointer */ #define TIMER2_BASE ((struct timer_gen_reg_map*)0x40000000) /** Timer 3 register map base pointer */ @@ -133,14 +128,8 @@ typedef struct timer_bas_reg_map { #define TIMER6_BASE ((struct timer_bas_reg_map*)0x40001000) /** Timer 7 register map base pointer */ #define TIMER7_BASE ((struct timer_bas_reg_map*)0x40001400) - -#ifdef STM32F2 - /** Timer 8 register map base pointer */ - #define TIMER8_BASE ((struct timer_adv_reg_map*)0x40010400) -#else - /** Timer 8 register map base pointer */ - #define TIMER8_BASE ((struct timer_adv_reg_map*)0x40013400) -#endif +/** Timer 8 register map base pointer */ +#define TIMER8_BASE ((struct timer_adv_reg_map*)0x40010400) #endif /* diff --git a/STM32F4/cores/maple/libmaple/usart.h b/STM32F4/cores/maple/libmaple/usart.h index 3f7c88590..282293a17 100644 --- a/STM32F4/cores/maple/libmaple/usart.h +++ b/STM32F4/cores/maple/libmaple/usart.h @@ -62,11 +62,7 @@ typedef struct usart_reg_map { } usart_reg_map; /** USART1 register map base pointer */ -#ifdef STM32F2 - #define USART1_BASE ((struct usart_reg_map*)0x40011000) -#else - #define USART1_BASE ((struct usart_reg_map*)0x40013800) -#endif +#define USART1_BASE ((struct usart_reg_map*)0x40011000) /** USART2 register map base pointer */ #define USART2_BASE ((struct usart_reg_map*)0x40004400) /** USART3 register map base pointer */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h index 61b0ac50c..fd45f4db3 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h @@ -173,7 +173,9 @@ typedef unsigned char u8; #elif defined (__ICCARM__) /* IAR Compiler */ #define __packed __packed #elif defined ( __GNUC__ ) /* GNU Compiler */ + #ifndef __packed #define __packed __attribute__ ((__packed__)) + #endif #elif defined (__TASKING__) /* TASKING Compiler */ #define __packed __unaligned #endif /* __CC_ARM */ @@ -206,7 +208,9 @@ typedef unsigned char u8; #elif defined (__ICCARM__) /* IAR Compiler */ #define __packed __packed #elif defined ( __GNUC__ ) /* GNU Compiler */ + #ifndef __packed #define __packed __attribute__ ((__packed__)) + #endif #elif defined (__TASKING__) /* TASKING Compiler */ #define __packed __unaligned #endif /* __CC_ARM */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c index b13260ee5..28a2d1ff2 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c @@ -255,7 +255,7 @@ typedef struct { void systemHardReset(void) { SCB_TypeDef* rSCB = (SCB_TypeDef *) SCB_BASE; - typedef void (*funcPtr)(void); + //typedef void (*funcPtr)(void); // not used /* Reset */ rSCB->AIRCR = (u32)AIRCR_RESET_REQ; diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.c b/STM32F4/cores/maple/libmaple/usbF4/usb.c index 2c0672f6a..263e76f84 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.c +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.c @@ -3,7 +3,7 @@ #include "usbd_desc.h" #include "usb.h" #include -#include +#include #include USB_OTG_CORE_HANDLE USB_OTG_dev; diff --git a/STM32F4/cores/maple/wirish.h b/STM32F4/cores/maple/wirish.h index 4aca74c0b..a9068e7a7 100644 --- a/STM32F4/cores/maple/wirish.h +++ b/STM32F4/cores/maple/wirish.h @@ -46,7 +46,6 @@ #include "wirish_math.h" #include "wirish_time.h" #include -#include "HardwareSPI.h" #include "HardwareSerial.h" #include "HardwareTimer.h" #include "usb_serial.h" diff --git a/STM32F4/cores/maple/wirish_analog.cpp b/STM32F4/cores/maple/wirish_analog.cpp index 63b5eb2d0..4e920e7c7 100644 --- a/STM32F4/cores/maple/wirish_analog.cpp +++ b/STM32F4/cores/maple/wirish_analog.cpp @@ -28,9 +28,7 @@ * @brief Arduino-compatible ADC implementation. */ -#include "libmaple.h" #include "wirish.h" -#include "io.h" /* Assumes that the ADC has been initialized and that the pin is set * to INPUT_ANALOG */ diff --git a/STM32F4/cores/maple/wirish_digital.cpp b/STM32F4/cores/maple/wirish_digital.cpp index a8b3ad811..da180dcb4 100644 --- a/STM32F4/cores/maple/wirish_digital.cpp +++ b/STM32F4/cores/maple/wirish_digital.cpp @@ -29,7 +29,7 @@ */ #include "wirish.h" -#include "io.h" + void pinMode(uint8 pin, WiringPinMode mode) { gpio_pin_mode outputMode; @@ -111,21 +111,21 @@ void togglePin(uint8 pin) { #define BUTTON_DEBOUNCE_DELAY 1 -uint8 isButtonPressed() { - if (digitalRead(BOARD_BUTTON_PIN)) { +uint8 isButtonPressed(uint8_t button) { + if (digitalRead(button)) { delay(BUTTON_DEBOUNCE_DELAY); - while (digitalRead(BOARD_BUTTON_PIN)) + while (digitalRead(button)) ; return true; } return false; } -uint8 waitForButtonPress(uint32 timeout) { +uint8 waitForButtonPress(uint8_t button, uint32 timeout) { uint32 start = millis(); uint32 time; if (timeout == 0) { - while (!isButtonPressed()) + while (!isButtonPressed(button)) ; return true; } @@ -136,6 +136,6 @@ uint8 waitForButtonPress(uint32 timeout) { time - start > timeout) { return false; } - } while (!isButtonPressed()); + } while (!isButtonPressed(button)); return true; } diff --git a/STM32F4/cores/maple/wirish_types.h b/STM32F4/cores/maple/wirish_types.h index a3c260a73..2d6d6a9a6 100644 --- a/STM32F4/cores/maple/wirish_types.h +++ b/STM32F4/cores/maple/wirish_types.h @@ -48,6 +48,20 @@ * @brief Stores STM32-specific information related to a given Maple pin. * @see PIN_MAP */ +#ifdef BOARD_black_f4 +// restructure members to build consecutive pairs +typedef struct stm32_pin_info { + gpio_dev *gpio_device; /**< Maple pin's GPIO device */ + uint8 gpio_bit; /**< Pin's GPIO port bit. */ + timer_dev *timer_device; /**< Pin's timer device, if any. */ + uint8 timer_channel; /**< Timer channel, or 0 if none. */ + const adc_dev *adc_device; /**< ADC device, if any. */ + uint8 adc_channel; /**< Pin ADC channel, or ADCx if none. */ + uint8 filler; +} stm32_pin_info; + +#else + typedef struct stm32_pin_info { gpio_dev *gpio_device; /**< Maple pin's GPIO device */ timer_dev *timer_device; /**< Pin's timer device, if any. */ @@ -58,6 +72,7 @@ typedef struct stm32_pin_info { uint8 filler; } stm32_pin_info; +#endif /** * Variable attribute, instructs the linker to place the marked * variable in Flash instead of RAM. */ diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index 99ae55549..b32f283dc 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -12,13 +12,13 @@ version=0.1.0 compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g -Os -Wall -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ compiler.c.elf.flags=-Os -Wl,--gc-sections compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g -Os -Wall -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy @@ -44,12 +44,10 @@ compiler.ar.extra_flags= compiler.elf2hex.extra_flags= - ##compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/stm32f1/include/series" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" #compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" - -compiler.libs.c.flags="-I{build.core.path}/libmaple" -I{build.core.path}/libmaple/usbF4 -I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Core/inc -I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc -I{build.core.path}/libmaple/usbF4/STM32_USB_OTG_Driver/inc -I{build.core.path}/libmaple/usbF4/VCP +compiler.libs.c.flags=-I{build.core.path} -I{build.core.path}/libmaple -I{build.core.path}/libmaple/usbF4 -I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Core/inc -I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc -I{build.core.path}/libmaple/usbF4/STM32_USB_OTG_Driver/inc -I{build.core.path}/libmaple/usbF4/VCP From 065f58684dfb4ee6728b7a40c58f06b6380911a7 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 14 Apr 2017 19:26:18 +0200 Subject: [PATCH 048/307] added black F4 variant files + activated USB interface --- STM32F4/cores/maple/libmaple/dmaF4.c | 241 ++++++ STM32F4/cores/maple/libmaple/dmaF4.h | 270 +++++++ STM32F4/cores/maple/libmaple/gpioF4.c | 224 ++++++ STM32F4/cores/maple/libmaple/gpioF4.h | 550 ++++++++++++++ STM32F4/cores/maple/libmaple/rccF4.c | 707 ++++++++++++++++++ STM32F4/cores/maple/libmaple/rccF4.h | 642 ++++++++++++++++ STM32F4/variants/black_f407vet6/black_f4.cpp | 264 +++++++ STM32F4/variants/black_f407vet6/black_f4.h | 130 ++++ STM32F4/variants/black_f407vet6/ld/common.inc | 219 ++++++ .../variants/black_f407vet6/ld/extra_libs.inc | 7 + STM32F4/variants/black_f407vet6/ld/flash.ld | 20 + STM32F4/variants/black_f407vet6/ld/jtag.ld | 20 + STM32F4/variants/black_f407vet6/ld/names.inc | 78 ++ STM32F4/variants/black_f407vet6/ld/ram.ld | 19 + .../black_f407vet6/ld/vector_symbols.inc | 78 ++ .../variants/black_f407vet6/pins_arduino.h | 6 + STM32F4/variants/black_f407vet6/stm32_isrs.S | 323 ++++++++ .../black_f407vet6/stm32_vector_table.S | 113 +++ STM32F4/variants/black_f407vet6/variant.h | 21 + .../variants/black_f407vet6/wirish/start.S | 57 ++ .../variants/black_f407vet6/wirish/start_c.c | 95 +++ 21 files changed, 4084 insertions(+) create mode 100644 STM32F4/cores/maple/libmaple/dmaF4.c create mode 100644 STM32F4/cores/maple/libmaple/dmaF4.h create mode 100644 STM32F4/cores/maple/libmaple/gpioF4.c create mode 100644 STM32F4/cores/maple/libmaple/gpioF4.h create mode 100644 STM32F4/cores/maple/libmaple/rccF4.c create mode 100644 STM32F4/cores/maple/libmaple/rccF4.h create mode 100644 STM32F4/variants/black_f407vet6/black_f4.cpp create mode 100644 STM32F4/variants/black_f407vet6/black_f4.h create mode 100644 STM32F4/variants/black_f407vet6/ld/common.inc create mode 100644 STM32F4/variants/black_f407vet6/ld/extra_libs.inc create mode 100644 STM32F4/variants/black_f407vet6/ld/flash.ld create mode 100644 STM32F4/variants/black_f407vet6/ld/jtag.ld create mode 100644 STM32F4/variants/black_f407vet6/ld/names.inc create mode 100644 STM32F4/variants/black_f407vet6/ld/ram.ld create mode 100644 STM32F4/variants/black_f407vet6/ld/vector_symbols.inc create mode 100644 STM32F4/variants/black_f407vet6/pins_arduino.h create mode 100644 STM32F4/variants/black_f407vet6/stm32_isrs.S create mode 100644 STM32F4/variants/black_f407vet6/stm32_vector_table.S create mode 100644 STM32F4/variants/black_f407vet6/variant.h create mode 100644 STM32F4/variants/black_f407vet6/wirish/start.S create mode 100644 STM32F4/variants/black_f407vet6/wirish/start_c.c diff --git a/STM32F4/cores/maple/libmaple/dmaF4.c b/STM32F4/cores/maple/libmaple/dmaF4.c new file mode 100644 index 000000000..4b530aff8 --- /dev/null +++ b/STM32F4/cores/maple/libmaple/dmaF4.c @@ -0,0 +1,241 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Michael Hope. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +#ifdef STM32F4 + +/** + * @file dmaF4.c + * @brief Direct Memory Access peripheral support + */ + +#include "dma.h" +#include "bitband.h" +#include "util.h" + +/* + * Devices + */ + +static dma_dev dma1 = { + .regs = DMA1_BASE, + .clk_id = RCC_DMA1, + .handlers = {{ .handler = NULL, .irq_line = 11 }, + { .handler = NULL, .irq_line = 12 }, + { .handler = NULL, .irq_line = 13 }, + { .handler = NULL, .irq_line = 14 }, + { .handler = NULL, .irq_line = 15 }, + { .handler = NULL, .irq_line = 16 }, + { .handler = NULL, .irq_line = 17 }, + { .handler = NULL, .irq_line = 47 }} +}; +/** DMA1 device */ +dma_dev *DMA1 = &dma1; + +static dma_dev dma2 = { + .regs = DMA2_BASE, + .clk_id = RCC_DMA2, + .handlers = {{ .handler = NULL, .irq_line = 56 }, + { .handler = NULL, .irq_line = 57 }, + { .handler = NULL, .irq_line = 58 }, + { .handler = NULL, .irq_line = 59 }, + { .handler = NULL, .irq_line = 60 }, + { .handler = NULL, .irq_line = 68 }, + { .handler = NULL, .irq_line = 69 }, + { .handler = NULL, .irq_line = 70 }} /* !@#$ */ +}; +/** DMA2 device */ +dma_dev *DMA2 = &dma2; + + +/* + * Convenience routines + */ + +/** + * @brief Initialize a DMA device. + * @param dev Device to initialize. + */ +void dma_init(dma_dev *dev) { + rcc_clk_enable(dev->clk_id); +} + +/** + * @brief Attach an interrupt to a DMA transfer. + * + * Interrupts are enabled using appropriate mode flags in + * dma_setup_transfer(). + * + * @param dev DMA device + * @param stream Stream to attach handler to + * @param handler Interrupt handler to call when channel interrupt fires. + * @see dma_setup_transfer() + * @see dma_detach_interrupt() + */ +void dma_attach_interrupt(dma_dev *dev, + dma_stream stream, + void (*handler)(void)) { + dev->handlers[stream].handler = handler; + nvic_irq_enable(dev->handlers[stream].irq_line); +} + +/** + * @brief Detach a DMA transfer interrupt handler. + * + * After calling this function, the given channel's interrupts will be + * disabled. + * + * @param dev DMA device + * @param stream Stream whose handler to detach + * @sideeffect Clears interrupt enable bits in the channel's CCR register. + * @see dma_attach_interrupt() + */ +void dma_detach_interrupt(dma_dev *dev, dma_stream stream) { + nvic_irq_disable(dev->handlers[stream].irq_line); + dev->handlers[stream].handler = NULL; +} + +void dma_clear_isr_bits(dma_dev *dev, dma_stream stream) { + switch (stream) { + case 0: + dev->regs->LIFCR|=0x0000003d; + break; + case 1: + dev->regs->LIFCR|=0x00000f40; + break; + case 2: + dev->regs->LIFCR|=0x003d0000; + break; + case 3: + dev->regs->LIFCR|=0x0f400000; + break; + case 4: + dev->regs->HIFCR|=0x0000003d; + break; + case 5: + dev->regs->HIFCR|=0x00000f40; + break; + case 6: + dev->regs->HIFCR|=0x003d0000; + break; + case 7: + dev->regs->HIFCR|=0x0f400000; + break; + } +} + +/* + * IRQ handlers + */ + +static inline void dispatch_handler(dma_dev *dev, dma_stream stream) { + void (*handler)(void) = dev->handlers[stream].handler; + if (handler) { + handler(); + dma_clear_isr_bits(dev, stream); /* in case handler doesn't */ + } +} + +//void __irq_dma1_stream0(void) { +void __irq_dma1_channel1(void) { + dispatch_handler(DMA1, DMA_STREAM0); +} + +//void __irq_dma1_stream1(void) { +void __irq_dma1_channel2(void) { + dispatch_handler(DMA1, DMA_STREAM1); +} + +//void __irq_dma1_stream2(void) { +void __irq_dma1_channel3(void) { + dispatch_handler(DMA1, DMA_STREAM2); +} + +//void __irq_dma1_stream3(void) { +void __irq_dma1_channel4(void) { + dispatch_handler(DMA1, DMA_STREAM3); +} + +//void __irq_dma1_stream4(void) { +void __irq_dma1_channel5(void) { + dispatch_handler(DMA1, DMA_STREAM4); +} + +//void __irq_dma1_stream5(void) { +void __irq_dma1_channel6(void) { + dispatch_handler(DMA1, DMA_STREAM5); +} + +//void __irq_dma1_stream6(void) { +void __irq_dma1_channel7(void) { + dispatch_handler(DMA1, DMA_STREAM6); +} + +//void __irq_dma1_stream7(void) { +void __irq_adc3(void) { + dispatch_handler(DMA1, DMA_STREAM7); +} + +//void __irq_dma2_stream0(void) { +void __irq_dma2_channel1(void) { + dispatch_handler(DMA2, DMA_STREAM0); +} + +//void __irq_dma2_stream1(void) { +void __irq_dma2_channel2(void) { + dispatch_handler(DMA2, DMA_STREAM1); +} + +//void __irq_dma2_stream2(void) { +void __irq_dma2_channel3(void) { + dispatch_handler(DMA2, DMA_STREAM2); +} + +//void __irq_dma2_stream3(void) { +void __irq_dma2_channel4_5(void) { + dispatch_handler(DMA2, DMA_STREAM3); +} + +//void __irq_dma2_stream4(void) { +void __irq_DMA2_Stream4_IRQHandler(void) { + dispatch_handler(DMA2, DMA_STREAM4); +} + +//void __irq_dma2_stream5(void) { +void __irq_DMA2_Stream5_IRQHandler(void) { + dispatch_handler(DMA2, DMA_STREAM5); +} + +//void __irq_dma2_stream6(void) { +void __irq_DMA2_Stream6_IRQHandler(void) { + dispatch_handler(DMA2, DMA_STREAM6); +} + +//void __irq_dma2_stream7(void) { +void __irq_DMA2_Stream7_IRQHandler(void) { + dispatch_handler(DMA2, DMA_STREAM7); +} + +#endif diff --git a/STM32F4/cores/maple/libmaple/dmaF4.h b/STM32F4/cores/maple/libmaple/dmaF4.h new file mode 100644 index 000000000..6f7086f36 --- /dev/null +++ b/STM32F4/cores/maple/libmaple/dmaF4.h @@ -0,0 +1,270 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Michael Hope. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file dma.h + * + * @author Marti Bolivar ; + * Original implementation by Michael Hope + * + * @brief Direct Memory Access peripheral support + */ + +/* + * See /notes/dma.txt for more information. + */ + +#ifndef _DMA_H_ +#define _DMA_H_ + +#include "libmaple_types.h" +#include "rcc.h" +#include "nvic.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +/* + * Register maps + */ + +/** + * @brief DMA stream type. + * + */ +typedef struct dma_stream_t { + __io uint32 CR; /**< Stream configuration register */ + __io uint32 NDTR; /**< Stream number of data register */ + __io uint32 PAR; /**< Stream peripheral address register */ + __io uint32 M0AR; /**< Stream memory address register 0 */ + __io uint32 M1AR; /**< Stream memory address register 1 */ + __io uint32 FCR; /**< Stream FIFO configuration register */ +} dma_stream_t; +/** + * @brief DMA register map type. + * + */ +typedef struct dma_reg_map { + __io uint32 LISR; /**< Low interrupt status register */ + __io uint32 HISR; /**< High interrupt status register */ + __io uint32 LIFCR; /**< Low interrupt flag clear register */ + __io uint32 HIFCR; /**< High interrupt flag clear register */ + dma_stream_t STREAM[8]; +} dma_reg_map; + +/** DMA controller register map base pointers */ +#define DMA1_BASE ((struct dma_reg_map*)0x40026000) +#define DMA2_BASE ((struct dma_reg_map*)0x40026400) + +/* + * Register bit definitions + */ + +/* Channel configuration register */ + +#define DMA_CR_CH0 (0x0 << 25) +#define DMA_CR_CH1 (0x1 << 25) +#define DMA_CR_CH2 (0x2 << 25) +#define DMA_CR_CH3 (0x3 << 25) +#define DMA_CR_CH4 (0x4 << 25) +#define DMA_CR_CH5 (0x5 << 25) +#define DMA_CR_CH6 (0x6 << 25) +#define DMA_CR_CH7 (0x7 << 25) +#define DMA_CR_MBURST0 (0x0 << 23) +#define DMA_CR_MBURST4 (0x1 << 23) +#define DMA_CR_MBURST8 (0x2 << 23) +#define DMA_CR_MBURST16 (0x3 << 23) +#define DMA_CR_PBURST0 (0x0 << 21) +#define DMA_CR_PBURST4 (0x1 << 21) +#define DMA_CR_PBURST8 (0x2 << 21) +#define DMA_CR_PBURST16 (0x3 << 21) +#define DMA_CR_CT0 (0x0 << 19) +#define DMA_CR_CT1 (0x1 << 19) +#define DMA_CR_DBM (0x1 << 18) + +#define DMA_CR_PL_LOW (0x0 << 16) +#define DMA_CR_PL_MEDIUM (0x1 << 16) +#define DMA_CR_PL_HIGH (0x2 << 16) +#define DMA_CR_PL_VERY_HIGH (0x3 << 16) +#define DMA_CR_PL_MASK (0x3 << 16) + +#define DMA_CR_PINCOS (0x1 << 15) + +#define DMA_CR_MSIZE_8BITS (0x0 << 13) +#define DMA_CR_MSIZE_16BITS (0x1 << 13) +#define DMA_CR_MSIZE_32BITS (0x2 << 13) + +#define DMA_CR_PSIZE_8BITS (0x0 << 11) +#define DMA_CR_PSIZE_16BITS (0x1 << 11) +#define DMA_CR_PSIZE_32BITS (0x2 << 11) + +#define DMA_CR_MINC (0x1 << 10) +#define DMA_CR_PINC (0x1 << 9) +#define DMA_CR_CIRC (0x1 << 8) +#define DMA_CR_DIR_P2M (0x0 << 6) +#define DMA_CR_DIR_M2P (0x1 << 6) +#define DMA_CR_DIR_M2M (0x2 << 6) + +#define DMA_CR_PFCTRL (0x1 << 5) +#define DMA_CR_TCIE (0x1 << 4) +#define DMA_CR_HTIE (0x1 << 3) +#define DMA_CR_TEIE (0x1 << 2) +#define DMA_CR_DMEIE (0x1 << 1) +#define DMA_CR_EN (0x1) + +/* + * Devices + */ + +/** Encapsulates state related to a DMA channel interrupt. */ +typedef struct dma_handler_config { + void (*handler)(void); /**< User-specified channel interrupt + handler */ + nvic_irq_num irq_line; /**< Channel's NVIC interrupt number */ +} dma_handler_config; + +/** DMA device type */ +typedef struct dma_dev { + dma_reg_map *regs; /**< Register map */ + rcc_clk_id clk_id; /**< Clock ID */ + dma_handler_config handlers[]; /**< + * @brief IRQ handlers and NVIC numbers. + * + * @see dma_attach_interrupt() + * @see dma_detach_interrupt() + */ +} dma_dev; + +extern dma_dev *DMA1; +extern dma_dev *DMA2; + +/* + * Convenience functions + */ + +void dma_init(dma_dev *dev); + +/** Flags for DMA transfer configuration. */ +typedef enum dma_mode_flags { + DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ + DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ + DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ + DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ + DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ + DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ + DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ + DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ +} dma_mode_flags; + +/** Source and destination transfer sizes. */ +typedef enum dma_xfer_size { + DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ + DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ + DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ +} dma_xfer_size; + +/** DMA channel */ +typedef enum dma_stream { + DMA_STREAM0 = 0, /**< Stream 0 */ + DMA_STREAM1 = 1, /**< Stream 1 */ + DMA_STREAM2 = 2, /**< Stream 2 */ + DMA_STREAM3 = 3, /**< Stream 3 */ + DMA_STREAM4 = 4, /**< Stream 4 */ + DMA_STREAM5 = 5, /**< Stream 5 */ + DMA_STREAM6 = 6, /**< Stream 6 */ + DMA_STREAM7 = 7, /**< Stream 7 */ +} dma_stream; + +static inline void dma_setup_transfer(dma_dev *dev, + dma_stream stream, + __io void *peripheral_address, + __io void *memory_address0, + __io void *memory_address1, + uint32 flags, + uint32 fifo_flags) { + dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; // disable + dev->regs->STREAM[stream].PAR = (uint32)peripheral_address; + dev->regs->STREAM[stream].M0AR = (uint32)memory_address0; + dev->regs->STREAM[stream].M1AR = (uint32)memory_address1; + dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits + dev->regs->STREAM[stream].CR = flags & 0x0feffffe; // mask out reserved and enable +} + +static inline void dma_set_num_transfers(dma_dev *dev, + dma_stream stream, + uint16 num_transfers) { + dev->regs->STREAM[stream].NDTR = num_transfers; +} + +void dma_attach_interrupt(dma_dev *dev, + dma_stream stream, + void (*handler)(void)); + +void dma_detach_interrupt(dma_dev *dev, dma_stream stream); + +static inline void dma_enable(dma_dev *dev, dma_stream stream) { + dev->regs->STREAM[stream].CR |= DMA_CR_EN; +} + +static inline void dma_disable(dma_dev *dev, dma_stream stream) { + dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; +} + +/** + * @brief Check if a DMA stream is enabled + * @param dev DMA device + * @param stream Stream whose enabled bit to check. + */ +static inline uint8 dma_is_stream_enabled(dma_dev *dev, dma_stream stream) { + return (uint8)(dev->regs->STREAM[stream].CR & DMA_CR_EN); +} + +/** + * @brief Get the ISR status bits for a DMA stream. + * + * The bits are returned right-aligned, in the following order: + * transfer error flag, half-transfer flag, transfer complete flag, + * global interrupt flag. + * + * @param dev DMA device + * @param stream Stream whose ISR bits to return. + */ +uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream); + +/** + * @brief Clear the ISR status bits for a given DMA stream. + * + * @param dev DMA device + * @param stream Stream whose ISR bits to clear. + */ +void dma_clear_isr_bits(dma_dev *dev, dma_stream stream); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/STM32F4/cores/maple/libmaple/gpioF4.c b/STM32F4/cores/maple/libmaple/gpioF4.c new file mode 100644 index 000000000..ba166f538 --- /dev/null +++ b/STM32F4/cores/maple/libmaple/gpioF4.c @@ -0,0 +1,224 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + + #ifdef STM32F4 + +/** + * @file gpio.c + * @brief GPIO initialization routine + */ + +#include "gpio.h" +#include "rcc.h" + +/* + * GPIO devices + */ + +gpio_dev gpioa = { + .regs = GPIOA_BASE, + .clk_id = RCC_GPIOA, + .exti_port = AFIO_EXTI_PA, +}; +/** GPIO port A device. */ +gpio_dev* const GPIOA = &gpioa; + +gpio_dev gpiob = { + .regs = GPIOB_BASE, + .clk_id = RCC_GPIOB, + .exti_port = AFIO_EXTI_PB, +}; +/** GPIO port B device. */ +gpio_dev* const GPIOB = &gpiob; + +gpio_dev gpioc = { + .regs = GPIOC_BASE, + .clk_id = RCC_GPIOC, + .exti_port = AFIO_EXTI_PC, +}; +/** GPIO port C device. */ +gpio_dev* const GPIOC = &gpioc; + +gpio_dev gpiod = { + .regs = GPIOD_BASE, + .clk_id = RCC_GPIOD, + .exti_port = AFIO_EXTI_PD, +}; +/** GPIO port D device. */ +gpio_dev* const GPIOD = &gpiod; + +#ifdef STM32_HIGH_DENSITY +gpio_dev gpioe = { + .regs = GPIOE_BASE, + .clk_id = RCC_GPIOE, + .exti_port = AFIO_EXTI_PE, +}; +/** GPIO port E device. */ +gpio_dev* const GPIOE = &gpioe; + +gpio_dev gpiof = { + .regs = GPIOF_BASE, + .clk_id = RCC_GPIOF, + .exti_port = AFIO_EXTI_PF, +}; +/** GPIO port F device. */ +gpio_dev* const GPIOF = &gpiof; + +gpio_dev gpiog = { + .regs = GPIOG_BASE, + .clk_id = RCC_GPIOG, + .exti_port = AFIO_EXTI_PG, +}; +/** GPIO port G device. */ +gpio_dev* const GPIOG = &gpiog; +#endif + +/* + * GPIO convenience routines + */ + +/** + * Initialize a GPIO device. + * + * Enables the clock for and resets the given device. + * + * @param dev GPIO device to initialize. + */ +void gpio_init(gpio_dev *dev) { + rcc_clk_enable(dev->clk_id); + rcc_reset_dev(dev->clk_id); +} + +/** + * Initialize and reset all available GPIO devices. + */ +void gpio_init_all(void) { + gpio_init(GPIOA); + gpio_init(GPIOB); + gpio_init(GPIOC); + gpio_init(GPIOD); + +#ifdef STM32_HIGH_DENSITY + gpio_init(GPIOE); + gpio_init(GPIOF); + gpio_init(GPIOG); +#endif + +#ifdef ARDUINO_STM32F4_NETDUINO2PLUS + // PA8 Output the Master Clock MCO1 + gpio_set_af_mode(GPIOA, 8, 0); + gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + // PB4 as alternate MISO Input + gpio_set_af_mode(GPIOB, 4, 5); + // PA5 as alternate SCK Output + gpio_set_af_mode(GPIOA, 5, 5); + // PA7 as alternate MOSI Output + gpio_set_af_mode(GPIOA, 7, 5); +#endif +} + +/** + * Set the mode of a GPIO pin. + * + * @param dev GPIO device. + * @param pin Pin on the device whose mode to set, 0--15. + * @param mode General purpose or alternate function mode to set the pin to. + * @see gpio_pin_mode + */ +void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { + gpio_reg_map *regs = dev->regs; + + //regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 8) & 15) << (4*(pin&7))); + //gpio_set_af_mode(dev, pin, mode>>8); + + regs->MODER = (regs->MODER & ~( 3 << (2*pin))) | (((mode >> 0) & 3) << (2*pin)); + regs->PUPDR = (regs->PUPDR & ~( 3 << (2*pin))) | (((mode >> 2) & 3) << (2*pin)); + regs->OSPEEDR = (regs->OSPEEDR & ~( 3 << (2*pin))) | (((mode >> 4) & 3) << (2*pin)); + regs->OTYPER = (regs->OTYPER & ~( 1 << (1*pin))) | (((mode >> 6) & 1) << (1*pin)); +} + +/** + * Set the alternate function mode of a GPIO pin. + * + * @param dev GPIO device. + * @param pin Pin on the device whose mode to set, 0--15. + * @param mode alternate function mode to set the pin to. + * @see gpio_pin_mode + */ +void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode) { + gpio_reg_map *regs = dev->regs; + + regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 0) & 15) << (4*(pin&7))); +} + +/* + * AFIO + */ + +/** + * @brief Initialize the AFIO clock, and reset the AFIO registers. + */ +void afio_init(void) { + //rcc_clk_enable(RCC_AFIO); + //rcc_reset_dev(RCC_AFIO); +} + +#define AFIO_EXTI_SEL_MASK 0xF + +/** + * @brief Select a source input for an external interrupt. + * + * @param exti External interrupt. + * @param gpio_port Port which contains pin to use as source input. + * @see afio_exti_num + * @see afio_exti_port + */ +void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port) { + __io uint32 *exti_cr = &SYSCFG_BASE->EXTICR1 + exti / 4; + uint32 shift = 4 * (exti % 4); + uint32 cr = *exti_cr; + + cr &= ~(AFIO_EXTI_SEL_MASK << shift); + cr |= gpio_port << shift; + *exti_cr = cr; +} + +/** + * @brief Perform an alternate function remap. + * @param remapping Remapping to perform. + */ +#if 0 +void afio_remap(afio_remap_peripheral remapping) { + if (remapping & AFIO_REMAP_USE_MAPR2) { + remapping &= ~AFIO_REMAP_USE_MAPR2; + AFIO_BASE->MAPR2 |= remapping; + } else { + AFIO_BASE->MAPR |= remapping; + } +} +#endif + +#endif diff --git a/STM32F4/cores/maple/libmaple/gpioF4.h b/STM32F4/cores/maple/libmaple/gpioF4.h new file mode 100644 index 000000000..91bd67be3 --- /dev/null +++ b/STM32F4/cores/maple/libmaple/gpioF4.h @@ -0,0 +1,550 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*****************************************************************************/ + +/** + * @file gpio.h + * + * @brief General purpose I/O (GPIO) and Alternate Function I/O + * (AFIO) prototypes, defines, and inlined access functions. + */ + +#ifndef _GPIO_H_ +#define _GPIO_H_ + +#include "libmaple.h" +#include "rcc.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +/* + * GPIO register maps and devices + */ + +/** GPIO register map type */ +typedef struct gpio_reg_map { + __io uint32 MODER; /*!< GPIO port mode register, Address offset: 0x00 */ + __io uint32 OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ + __io uint32 OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ + __io uint32 PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + __io uint32 IDR; /*!< GPIO port input data register, Address offset: 0x10 */ + __io uint32 ODR; /*!< GPIO port output data register, Address offset: 0x14 */ + __io uint16 BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */ + __io uint16 BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */ + __io uint32 LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ + __io uint32 AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x24-0x28 */ +} gpio_reg_map; + + + +/** + * @brief External interrupt line port selector. + * + * Used to determine which GPIO port to map an external interrupt line + * onto. */ +/* (See AFIO sections, below) */ +typedef enum afio_exti_port { + AFIO_EXTI_PA, /**< Use port A (PAx) pin. */ + AFIO_EXTI_PB, /**< Use port B (PBx) pin. */ + AFIO_EXTI_PC, /**< Use port C (PCx) pin. */ + AFIO_EXTI_PD, /**< Use port D (PDx) pin. */ +#ifdef STM32_HIGH_DENSITY + AFIO_EXTI_PE, /**< Use port E (PEx) pin. */ + AFIO_EXTI_PF, /**< Use port F (PFx) pin. */ + AFIO_EXTI_PG, /**< Use port G (PGx) pin. */ +#endif +} afio_exti_port; + +/** GPIO device type */ +typedef struct gpio_dev { + gpio_reg_map *regs; /**< Register map */ + rcc_clk_id clk_id; /**< RCC clock information */ + afio_exti_port exti_port; /**< AFIO external interrupt port value */ +} gpio_dev; + +extern gpio_dev gpioa; +extern gpio_dev* const GPIOA; +extern gpio_dev gpiob; +extern gpio_dev* const GPIOB; +extern gpio_dev gpioc; +extern gpio_dev* const GPIOC; +extern gpio_dev gpiod; +extern gpio_dev* const GPIOD; +#ifdef STM32_HIGH_DENSITY +extern gpio_dev gpioe; +extern gpio_dev* const GPIOE; +extern gpio_dev gpiof; +extern gpio_dev* const GPIOF; +extern gpio_dev gpiog; +extern gpio_dev* const GPIOG; +#endif + +/** GPIO port register map base pointer */ +#define GPIOA_BASE ((struct gpio_reg_map*)0x40020000) +#define GPIOB_BASE ((struct gpio_reg_map*)0x40020400) +#define GPIOC_BASE ((struct gpio_reg_map*)0x40020800) +#define GPIOD_BASE ((struct gpio_reg_map*)0x40020C00) +#ifdef STM32_HIGH_DENSITY +#define GPIOE_BASE ((struct gpio_reg_map*)0x40021000) +#define GPIOF_BASE ((struct gpio_reg_map*)0x40021400) +#define GPIOG_BASE ((struct gpio_reg_map*)0x40021800) +#endif + +/* + * GPIO register bit definitions + */ + +#define GPIO_MODE_INPUT 0 +#define GPIO_MODE_OUTPUT 1 +#define GPIO_MODE_AF 2 +#define GPIO_MODE_ANALOG 3 + +#define GPIO_PUPD_INPUT_FLOATING (0 << 2) +#define GPIO_PUPD_INPUT_PU (1 << 2) +#define GPIO_PUPD_INPUT_PD (2 << 2) + +#define GPIO_OSPEED_2MHZ (0 << 4) +#define GPIO_OSPEED_25MHZ (1 << 4) +#define GPIO_OSPEED_50MHZ (2 << 4) +#define GPIO_OSPEED_100MHZ (3 << 4) + +#define GPIO_OTYPE_PP (0 << 6) +#define GPIO_OTYPE_OD (1 << 6) + +/* +MODER +00: Input (reset state) +01: General purpose output mode +10: Alternate function mode +11: Analog mode + +OTYPER +0: Output push-pull (reset state) +1: Output open-drain + +OSPEEDR +00: 2 MHz Low speed +01: 25 MHz Medium speed +10: 50 MHz Fast speed +11: 100 MHz High speed on 30 pF (80 MHz Output max speed on 15 pF) + +PUPDR +00: No pull-up, pull-down +01: Pull-up +10: Pull-down + +AFRL 4 bit AF00-AF15 +AFRH 4 bit AF00-AF15 +*/ + +/** + * @brief GPIO Pin modes. + * + * These only allow for 50MHZ max output speeds; if you want slower, + * use direct register access. + */ +typedef enum gpio_pin_mode { + GPIO_OUTPUT_PP = (GPIO_MODE_OUTPUT | GPIO_OTYPE_PP | + GPIO_OSPEED_50MHZ), /**< Output push-pull. */ + GPIO_OUTPUT_OD = (GPIO_MODE_OUTPUT | GPIO_OTYPE_OD | + GPIO_OSPEED_50MHZ), /**< Output open-drain. */ + GPIO_AF_OUTPUT_PP = (GPIO_MODE_AF | GPIO_OTYPE_PP | + GPIO_OSPEED_50MHZ), /**< Alternate function + output push-pull. */ + GPIO_AF_OUTPUT_OD = (GPIO_MODE_AF | GPIO_OTYPE_OD | + GPIO_OSPEED_50MHZ), /**< Alternate function + output open drain. */ + GPIO_INPUT_ANALOG = (GPIO_MODE_ANALOG), /**< Analog input. */ + GPIO_INPUT_FLOATING = (GPIO_MODE_INPUT | + GPIO_PUPD_INPUT_FLOATING), /**< Input floating. */ + GPIO_INPUT_PD = (GPIO_MODE_INPUT | + GPIO_PUPD_INPUT_PD), /**< Input pull-down. */ + GPIO_INPUT_PU = (GPIO_MODE_INPUT | + GPIO_PUPD_INPUT_PU), /**< Input pull-up. */ + GPIO_AF_INPUT_PD = (GPIO_MODE_AF | + GPIO_PUPD_INPUT_PD), /**< Input pull-down. */ + GPIO_BIGNUMBER = 0xfff +} gpio_pin_mode; + +/* + * GPIO Convenience routines + */ + +void gpio_init(gpio_dev *dev); +void gpio_init_all(void); +void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode); +void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode); + +/** + * @brief Get a GPIO port's corresponding afio_exti_port. + * @param dev GPIO device whose afio_exti_port to return. + */ +static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { + return dev->exti_port; +} + +/** + * Set or reset a GPIO pin. + * + * Pin must have previously been configured to output mode. + * + * @param dev GPIO device whose pin to set. + * @param pin Pin on to set or reset + * @param val If true, set the pin. If false, reset the pin. + */ +static inline void gpio_write_bit(gpio_dev *dev, uint8 pin, uint8 val) { + if (val) { + dev->regs->BSRRL = BIT(pin); + } else { + dev->regs->BSRRH = BIT(pin); + } +} + +/** + * Determine whether or not a GPIO pin is set. + * + * Pin must have previously been configured to input mode. + * + * @param dev GPIO device whose pin to test. + * @param pin Pin on dev to test. + * @return True if the pin is set, false otherwise. + */ +static inline uint32 gpio_read_bit(gpio_dev *dev, uint8 pin) { + return dev->regs->IDR & BIT(pin); +} + +/** + * Toggle a pin configured as output push-pull. + * @param dev GPIO device. + * @param pin Pin on dev to toggle. + */ +static inline void gpio_toggle_bit(gpio_dev *dev, uint8 pin) { + dev->regs->ODR = dev->regs->ODR ^ BIT(pin); +} + +/* + * AFIO register map + */ + +/** AFIO register map */ +typedef struct syscfg_reg_map { + __io uint32 MEMRM; /**< memory remap register */ + __io uint32 PMC; /**< peripheral mode configuration register */ + __io uint32 EXTICR1; /**< External interrupt configuration register 1. */ + __io uint32 EXTICR2; /**< External interrupt configuration register 2. */ + __io uint32 EXTICR3; /**< External interrupt configuration register 3. */ + __io uint32 EXTICR4; /**< External interrupt configuration register 4. */ + __io uint32 CMPCR; /**< Compensation cell control register */ +} syscfg_reg_map; + +/** AFIO register map base pointer. */ +#define SYSCFG_BASE ((struct syscfg_reg_map *)0x40013800) + +/* + * AFIO register bit definitions + */ + +/* Event control register */ + +#define AFIO_EVCR_EVOE (0x1 << 7) +#define AFIO_EVCR_PORT_PA (0x0 << 4) +#define AFIO_EVCR_PORT_PB (0x1 << 4) +#define AFIO_EVCR_PORT_PC (0x2 << 4) +#define AFIO_EVCR_PORT_PD (0x3 << 4) +#define AFIO_EVCR_PORT_PE (0x4 << 4) +#define AFIO_EVCR_PIN_0 0x0 +#define AFIO_EVCR_PIN_1 0x1 +#define AFIO_EVCR_PIN_2 0x2 +#define AFIO_EVCR_PIN_3 0x3 +#define AFIO_EVCR_PIN_4 0x4 +#define AFIO_EVCR_PIN_5 0x5 +#define AFIO_EVCR_PIN_6 0x6 +#define AFIO_EVCR_PIN_7 0x7 +#define AFIO_EVCR_PIN_8 0x8 +#define AFIO_EVCR_PIN_9 0x9 +#define AFIO_EVCR_PIN_10 0xA +#define AFIO_EVCR_PIN_11 0xB +#define AFIO_EVCR_PIN_12 0xC +#define AFIO_EVCR_PIN_13 0xD +#define AFIO_EVCR_PIN_14 0xE +#define AFIO_EVCR_PIN_15 0xF + +/* AF remap and debug I/O configuration register */ + +#define AFIO_MAPR_SWJ_CFG (0x7 << 24) +#define AFIO_MAPR_SWJ_CFG_FULL_SWJ (0x0 << 24) +#define AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST (0x1 << 24) +#define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24) +#define AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW (0x4 << 24) +#define AFIO_MAPR_ADC2_ETRGREG_REMAP BIT(20) +#define AFIO_MAPR_ADC2_ETRGINJ_REMAP BIT(19) +#define AFIO_MAPR_ADC1_ETRGREG_REMAP BIT(18) +#define AFIO_MAPR_ADC1_ETRGINJ_REMAP BIT(17) +#define AFIO_MAPR_TIM5CH4_IREMAP BIT(16) +#define AFIO_MAPR_PD01_REMAP BIT(15) +#define AFIO_MAPR_CAN_REMAP (0x3 << 13) +#define AFIO_MAPR_CAN_REMAP_NONE (0x0 << 13) +#define AFIO_MAPR_CAN_REMAP_PB8_PB9 (0x2 << 13) +#define AFIO_MAPR_CAN_REMAP_PD0_PD1 (0x3 << 13) +#define AFIO_MAPR_TIM4_REMAP BIT(12) +#define AFIO_MAPR_TIM3_REMAP (0x3 << 10) +#define AFIO_MAPR_TIM3_REMAP_NONE (0x0 << 10) +#define AFIO_MAPR_TIM3_REMAP_PARTIAL (0x2 << 10) +#define AFIO_MAPR_TIM3_REMAP_FULL (0x3 << 10) +#define AFIO_MAPR_TIM2_REMAP (0x3 << 8) +#define AFIO_MAPR_TIM2_REMAP_NONE (0x0 << 8) +#define AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3 (0x1 << 8) +#define AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11 (0x2 << 8) +#define AFIO_MAPR_TIM2_REMAP_FULL (0x3 << 8) +#define AFIO_MAPR_TIM1_REMAP (0x3 << 6) +#define AFIO_MAPR_TIM1_REMAP_NONE (0x0 << 6) +#define AFIO_MAPR_TIM1_REMAP_PARTIAL (0x1 << 6) +#define AFIO_MAPR_TIM1_REMAP_FULL (0x3 << 6) +#define AFIO_MAPR_USART3_REMAP (0x3 << 4) +#define AFIO_MAPR_USART3_REMAP_NONE (0x0 << 4) +#define AFIO_MAPR_USART3_REMAP_PARTIAL (0x1 << 4) +#define AFIO_MAPR_USART3_REMAP_FULL (0x3 << 4) +#define AFIO_MAPR_USART2_REMAP BIT(3) +#define AFIO_MAPR_USART1_REMAP BIT(2) +#define AFIO_MAPR_I2C1_REMAP BIT(1) +#define AFIO_MAPR_SPI1_REMAP BIT(0) + +/* External interrupt configuration register 1 */ + +#define AFIO_EXTICR1_EXTI3 (0xF << 12) +#define AFIO_EXTICR1_EXTI3_PA (0x0 << 12) +#define AFIO_EXTICR1_EXTI3_PB (0x1 << 12) +#define AFIO_EXTICR1_EXTI3_PC (0x2 << 12) +#define AFIO_EXTICR1_EXTI3_PD (0x3 << 12) +#define AFIO_EXTICR1_EXTI3_PE (0x4 << 12) +#define AFIO_EXTICR1_EXTI3_PF (0x5 << 12) +#define AFIO_EXTICR1_EXTI3_PG (0x6 << 12) +#define AFIO_EXTICR1_EXTI2 (0xF << 8) +#define AFIO_EXTICR1_EXTI2_PA (0x0 << 8) +#define AFIO_EXTICR1_EXTI2_PB (0x1 << 8) +#define AFIO_EXTICR1_EXTI2_PC (0x2 << 8) +#define AFIO_EXTICR1_EXTI2_PD (0x3 << 8) +#define AFIO_EXTICR1_EXTI2_PE (0x4 << 8) +#define AFIO_EXTICR1_EXTI2_PF (0x5 << 8) +#define AFIO_EXTICR1_EXTI2_PG (0x6 << 8) +#define AFIO_EXTICR1_EXTI1 (0xF << 4) +#define AFIO_EXTICR1_EXTI1_PA (0x0 << 4) +#define AFIO_EXTICR1_EXTI1_PB (0x1 << 4) +#define AFIO_EXTICR1_EXTI1_PC (0x2 << 4) +#define AFIO_EXTICR1_EXTI1_PD (0x3 << 4) +#define AFIO_EXTICR1_EXTI1_PE (0x4 << 4) +#define AFIO_EXTICR1_EXTI1_PF (0x5 << 4) +#define AFIO_EXTICR1_EXTI1_PG (0x6 << 4) +#define AFIO_EXTICR1_EXTI0 0xF +#define AFIO_EXTICR1_EXTI0_PA 0x0 +#define AFIO_EXTICR1_EXTI0_PB 0x1 +#define AFIO_EXTICR1_EXTI0_PC 0x2 +#define AFIO_EXTICR1_EXTI0_PD 0x3 +#define AFIO_EXTICR1_EXTI0_PE 0x4 +#define AFIO_EXTICR1_EXTI0_PF 0x5 +#define AFIO_EXTICR1_EXTI0_PG 0x6 + +/* External interrupt configuration register 2 */ + +#define AFIO_EXTICR2_EXTI7 (0xF << 12) +#define AFIO_EXTICR2_EXTI7_PA (0x0 << 12) +#define AFIO_EXTICR2_EXTI7_PB (0x1 << 12) +#define AFIO_EXTICR2_EXTI7_PC (0x2 << 12) +#define AFIO_EXTICR2_EXTI7_PD (0x3 << 12) +#define AFIO_EXTICR2_EXTI7_PE (0x4 << 12) +#define AFIO_EXTICR2_EXTI7_PF (0x5 << 12) +#define AFIO_EXTICR2_EXTI7_PG (0x6 << 12) +#define AFIO_EXTICR2_EXTI6 (0xF << 8) +#define AFIO_EXTICR2_EXTI6_PA (0x0 << 8) +#define AFIO_EXTICR2_EXTI6_PB (0x1 << 8) +#define AFIO_EXTICR2_EXTI6_PC (0x2 << 8) +#define AFIO_EXTICR2_EXTI6_PD (0x3 << 8) +#define AFIO_EXTICR2_EXTI6_PE (0x4 << 8) +#define AFIO_EXTICR2_EXTI6_PF (0x5 << 8) +#define AFIO_EXTICR2_EXTI6_PG (0x6 << 8) +#define AFIO_EXTICR2_EXTI5 (0xF << 4) +#define AFIO_EXTICR2_EXTI5_PA (0x0 << 4) +#define AFIO_EXTICR2_EXTI5_PB (0x1 << 4) +#define AFIO_EXTICR2_EXTI5_PC (0x2 << 4) +#define AFIO_EXTICR2_EXTI5_PD (0x3 << 4) +#define AFIO_EXTICR2_EXTI5_PE (0x4 << 4) +#define AFIO_EXTICR2_EXTI5_PF (0x5 << 4) +#define AFIO_EXTICR2_EXTI5_PG (0x6 << 4) +#define AFIO_EXTICR2_EXTI4 0xF +#define AFIO_EXTICR2_EXTI4_PA 0x0 +#define AFIO_EXTICR2_EXTI4_PB 0x1 +#define AFIO_EXTICR2_EXTI4_PC 0x2 +#define AFIO_EXTICR2_EXTI4_PD 0x3 +#define AFIO_EXTICR2_EXTI4_PE 0x4 +#define AFIO_EXTICR2_EXTI4_PF 0x5 +#define AFIO_EXTICR2_EXTI4_PG 0x6 + +/* AF remap and debug I/O configuration register 2 */ + +#define AFIO_MAPR2_FSMC_NADV BIT(10) +#define AFIO_MAPR2_TIM14_REMAP BIT(9) +#define AFIO_MAPR2_TIM13_REMAP BIT(8) +#define AFIO_MAPR2_TIM11_REMAP BIT(7) +#define AFIO_MAPR2_TIM10_REMAP BIT(6) +#define AFIO_MAPR2_TIM9_REMAP BIT(5) + +/* + * AFIO convenience routines + */ + +void afio_init(void); + +/** + * External interrupt line numbers. + */ +typedef enum afio_exti_num { + AFIO_EXTI_0, /**< External interrupt line 0. */ + AFIO_EXTI_1, /**< External interrupt line 1. */ + AFIO_EXTI_2, /**< External interrupt line 2. */ + AFIO_EXTI_3, /**< External interrupt line 3. */ + AFIO_EXTI_4, /**< External interrupt line 4. */ + AFIO_EXTI_5, /**< External interrupt line 5. */ + AFIO_EXTI_6, /**< External interrupt line 6. */ + AFIO_EXTI_7, /**< External interrupt line 7. */ + AFIO_EXTI_8, /**< External interrupt line 8. */ + AFIO_EXTI_9, /**< External interrupt line 9. */ + AFIO_EXTI_10, /**< External interrupt line 10. */ + AFIO_EXTI_11, /**< External interrupt line 11. */ + AFIO_EXTI_12, /**< External interrupt line 12. */ + AFIO_EXTI_13, /**< External interrupt line 13. */ + AFIO_EXTI_14, /**< External interrupt line 14. */ + AFIO_EXTI_15, /**< External interrupt line 15. */ +} afio_exti_num; + +void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port); + +/* HACK: Use upper bit to denote MAPR2, Bit 31 is reserved and + * not used in either MAPR or MAPR2 */ +#define AFIO_REMAP_USE_MAPR2 (1 << 31) + +/** + * @brief Available peripheral remaps. + * @see afio_remap() + */ +typedef enum afio_remap_peripheral { + AFIO_REMAP_ADC2_ETRGREG = AFIO_MAPR_ADC2_ETRGREG_REMAP, /**< + ADC 2 external trigger regular conversion remapping */ + AFIO_REMAP_ADC2_ETRGINJ = AFIO_MAPR_ADC2_ETRGINJ_REMAP, /**< + ADC 2 external trigger injected conversion remapping */ + AFIO_REMAP_ADC1_ETRGREG = AFIO_MAPR_ADC1_ETRGREG_REMAP, /**< + ADC 1 external trigger regular conversion remapping */ + AFIO_REMAP_ADC1_ETRGINJ = AFIO_MAPR_ADC1_ETRGINJ_REMAP, /**< + ADC 1 external trigger injected conversion remapping */ + AFIO_REMAP_TIM5CH4_I = AFIO_MAPR_TIM5CH4_IREMAP, /**< + Timer 5 channel 4 internal remapping */ + AFIO_REMAP_PD01 = AFIO_MAPR_PD01_REMAP, /**< + Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ + AFIO_REMAP_CAN_1 = AFIO_MAPR_CAN_REMAP_PB8_PB9, /**< + CAN alternate function remapping 1 (RX on PB8, TX on PB9) */ + AFIO_REMAP_CAN_2 = AFIO_MAPR_CAN_REMAP_PD0_PD1, /**< + CAN alternate function remapping 2 (RX on PD0, TX on PD1) */ + AFIO_REMAP_TIM4 = AFIO_MAPR_TIM4_REMAP, /**< + Timer 4 remapping */ + AFIO_REMAP_TIM3_PARTIAL = AFIO_MAPR_TIM3_REMAP_PARTIAL, /**< + Timer 3 partial remapping */ + AFIO_REMAP_TIM3_FULL = AFIO_MAPR_TIM3_REMAP_FULL, /**< + Timer 3 full remapping */ + AFIO_REMAP_TIM2_PARTIAL_1 = AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3, /**< + Timer 2 partial remapping 1 (CH1 and ETR on PA15, CH2 on PB3, CH3 + on PA2, CH4 on PA3) */ + AFIO_REMAP_TIM2_PARTIAL_2 = AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11, /**< + Timer 2 partial remapping 2 (CH1 and ETR on PA0, CH2 on PA1, CH3 + on PB10, CH4 on PB11) */ + AFIO_REMAP_TIM2_FULL = AFIO_MAPR_TIM2_REMAP_FULL, /**< + Timer 2 full remapping */ + AFIO_REMAP_USART2 = AFIO_MAPR_USART2_REMAP, /**< + USART 2 remapping */ + AFIO_REMAP_USART1 = AFIO_MAPR_USART1_REMAP, /**< + USART 1 remapping */ + AFIO_REMAP_I2C1 = AFIO_MAPR_I2C1_REMAP, /**< + I2C 1 remapping */ + AFIO_REMAP_SPI1 = AFIO_MAPR_SPI1_REMAP, /**< + SPI 1 remapping */ + AFIO_REMAP_FSMC_NADV = (AFIO_MAPR2_FSMC_NADV | + AFIO_REMAP_USE_MAPR2), /**< + NADV signal not connected */ + AFIO_REMAP_TIM14 = (AFIO_MAPR2_TIM14_REMAP | + AFIO_REMAP_USE_MAPR2), /**< + Timer 14 remapping */ + AFIO_REMAP_TIM13 = (AFIO_MAPR2_TIM13_REMAP | + AFIO_REMAP_USE_MAPR2), /**< + Timer 13 remapping */ + AFIO_REMAP_TIM11 = (AFIO_MAPR2_TIM11_REMAP | + AFIO_REMAP_USE_MAPR2), /**< + Timer 11 remapping */ + AFIO_REMAP_TIM10 = (AFIO_MAPR2_TIM10_REMAP | + AFIO_REMAP_USE_MAPR2), /**< + Timer 10 remapping */ + AFIO_REMAP_TIM9 = (AFIO_MAPR2_TIM9_REMAP | + AFIO_REMAP_USE_MAPR2) /**< + Timer 9 */ +} afio_remap_peripheral; + +void afio_remap(afio_remap_peripheral p); + +/** + * @brief Debug port configuration + * + * Used to configure the behavior of JTAG and Serial Wire (SW) debug + * ports and their associated GPIO pins. + * + * @see afio_cfg_debug_ports() + */ +typedef enum afio_debug_cfg { + AFIO_DEBUG_FULL_SWJ = AFIO_MAPR_SWJ_CFG_FULL_SWJ, /**< + Full Serial Wire and JTAG debug */ + AFIO_DEBUG_FULL_SWJ_NO_NJRST = AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST, /**< + Full Serial Wire and JTAG, but no NJTRST. */ + AFIO_DEBUG_SW_ONLY = AFIO_MAPR_SWJ_CFG_NO_JTAG_SW, /**< + Serial Wire debug only (JTAG-DP disabled, + SW-DP enabled) */ + AFIO_DEBUG_NONE = AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW /**< + No debug; all JTAG and SW pins are free + for use as GPIOs. */ +} afio_debug_cfg; + +/** + * @brief Enable or disable the JTAG and SW debug ports. + * @param config Desired debug port configuration + * @see afio_debug_cfg + */ +static inline void afio_cfg_debug_ports(afio_debug_cfg config) { + //__io uint32 *mapr = &AFIO_BASE->MAPR; + //*mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; +} + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/STM32F4/cores/maple/libmaple/rccF4.c b/STM32F4/cores/maple/libmaple/rccF4.c new file mode 100644 index 000000000..dd2ea2648 --- /dev/null +++ b/STM32F4/cores/maple/libmaple/rccF4.c @@ -0,0 +1,707 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +#ifdef STM32F4 + +/** + * @file rcc.c + * @brief Implements pretty much only the basic clock setup on the + * stm32, clock enable/disable and peripheral reset commands. + */ + +#include "libmaple.h" +#include "flash.h" +#include "gpio.h" +#include "rcc.h" +#include "bitband.h" + +#define APB1 RCC_APB1 +#define APB2 RCC_APB2 +#define AHB1 RCC_AHB1 +#define AHB2 RCC_AHB2 +#define AHB3 RCC_AHB3 + +struct rcc_dev_info { + const rcc_clk_domain clk_domain; + const uint8 line_num; +}; + +static uint32 rcc_dev_clk_speed_table[AHB3]; + +/* Device descriptor table, maps rcc_clk_id onto bus and enable/reset + * register bit numbers. */ +static const struct rcc_dev_info rcc_dev_table[] = { + [RCC_GPIOA] = { .clk_domain = AHB1, .line_num = 0 }, //* + [RCC_GPIOB] = { .clk_domain = AHB1, .line_num = 1 }, //* + [RCC_GPIOC] = { .clk_domain = AHB1, .line_num = 2 }, //* + [RCC_GPIOD] = { .clk_domain = AHB1, .line_num = 3 }, //* + +// [RCC_AFIO] = { .clk_domain = APB2, .line_num = 0 }, + [RCC_ADC1] = { .clk_domain = APB2, .line_num = 8 }, //* + [RCC_ADC2] = { .clk_domain = APB2, .line_num = 9 }, //* + [RCC_ADC3] = { .clk_domain = APB2, .line_num = 10 }, //* + [RCC_USART1] = { .clk_domain = APB2, .line_num = 4 }, //* + [RCC_USART2] = { .clk_domain = APB1, .line_num = 17 }, //unchanged + [RCC_USART3] = { .clk_domain = APB1, .line_num = 18 }, //unchanged + [RCC_TIMER1] = { .clk_domain = APB2, .line_num = 0 }, //* + [RCC_TIMER2] = { .clk_domain = APB1, .line_num = 0 }, //unchanged + [RCC_TIMER3] = { .clk_domain = APB1, .line_num = 1 }, //unchanged + [RCC_TIMER4] = { .clk_domain = APB1, .line_num = 2 }, //unchanged + [RCC_SPI1] = { .clk_domain = APB2, .line_num = 12 }, //unchanged + [RCC_SPI2] = { .clk_domain = APB1, .line_num = 14 }, //unchanged + [RCC_DMA1] = { .clk_domain = AHB1, .line_num = 21 }, //* + [RCC_PWR] = { .clk_domain = APB1, .line_num = 28}, //unchanged + [RCC_BKP] = { .clk_domain = AHB1, .line_num = 18}, //* + [RCC_I2C1] = { .clk_domain = APB1, .line_num = 21 }, //unchanged + [RCC_I2C2] = { .clk_domain = APB1, .line_num = 22 }, //unchanged + [RCC_CRC] = { .clk_domain = AHB1, .line_num = 12}, //* +// [RCC_FLITF] = { .clk_domain = AHB, .line_num = 4}, +// [RCC_SRAM] = { .clk_domain = AHB, .line_num = 2}, + + [RCC_GPIOE] = { .clk_domain = AHB1, .line_num = 4 }, //* + [RCC_GPIOF] = { .clk_domain = AHB1, .line_num = 5 }, //* + [RCC_GPIOG] = { .clk_domain = AHB1, .line_num = 6 }, //* + [RCC_UART4] = { .clk_domain = APB1, .line_num = 19 }, //unchanged + [RCC_UART5] = { .clk_domain = APB1, .line_num = 20 }, //unchanged + [RCC_TIMER5] = { .clk_domain = APB1, .line_num = 3 }, //unchanged + [RCC_TIMER6] = { .clk_domain = APB1, .line_num = 4 }, //unchanged + [RCC_TIMER7] = { .clk_domain = APB1, .line_num = 5 }, //unchanged + [RCC_TIMER8] = { .clk_domain = APB2, .line_num = 1 }, //* + [RCC_FSMC] = { .clk_domain = AHB3, .line_num = 0 }, //* + [RCC_DAC] = { .clk_domain = APB1, .line_num = 29 }, //unchanged + [RCC_DMA2] = { .clk_domain = AHB1, .line_num = 22 }, //* + [RCC_SDIO] = { .clk_domain = APB2, .line_num = 11 }, //* + [RCC_SPI3] = { .clk_domain = APB1, .line_num = 15 }, //unchanged + [RCC_TIMER9] = { .clk_domain = APB2, .line_num = 16 }, //* + [RCC_TIMER10] = { .clk_domain = APB2, .line_num = 17 }, //* + [RCC_TIMER11] = { .clk_domain = APB2, .line_num = 18 }, //* + [RCC_TIMER12] = { .clk_domain = APB1, .line_num = 6 }, //unchanged + [RCC_TIMER13] = { .clk_domain = APB1, .line_num = 7 }, //unchanged + [RCC_TIMER14] = { .clk_domain = APB1, .line_num = 8 }, //unchanged + [RCC_USBFS] = { .clk_domain = AHB2, .line_num = 7 }, //* + [RCC_SYSCFG] = { .clk_domain = APB2, .line_num = 14 }, //* + [RCC_SPI4] = { .clk_domain = APB1, .line_num = 15 }, +}; + +/** + * @brief Initialize the clock control system. Initializes the system + * clock source to use the PLL driven by an external oscillator + * @param sysclk_src system clock source, must be PLL + * @param pll_src pll clock source, must be HSE + * @param pll_mul pll multiplier + */ + +#define HSE_STARTUP_TIMEOUT ((uint16)0x0500) /*!< Time out for HSE start up */ +#define RCC_CFGR_HPRE_DIV1 ((uint32)0x00000000) /*!< SYSCLK not divided */ +#define RCC_CFGR_PPRE1_DIV2 ((uint32)0x00001000) /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE1_DIV4 ((uint32)0x00001400) /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE2_DIV1 ((uint32)0x00000000) /*!< HCLK not divided */ +#define RCC_CFGR_PPRE2_DIV2 ((uint32)0x00008000) /*!< HCLK divided by 2 */ + +#define RCC_PLLCFGR_PLLSRC_HSE ((uint32)0x00400000) + +/******************* Bits definition for FLASH_ACR register *****************/ +//#define FLASH_ACR_LATENCY ((uint32_t)0x00000007) +#define FLASH_ACR_LATENCY_0WS ((uint32)0x00000000) +#define FLASH_ACR_LATENCY_1WS ((uint32)0x00000001) +#define FLASH_ACR_LATENCY_2WS ((uint32)0x00000002) +#define FLASH_ACR_LATENCY_3WS ((uint32)0x00000003) +#define FLASH_ACR_LATENCY_4WS ((uint32)0x00000004) +#define FLASH_ACR_LATENCY_5WS ((uint32)0x00000005) +#define FLASH_ACR_LATENCY_6WS ((uint32)0x00000006) +#define FLASH_ACR_LATENCY_7WS ((uint32)0x00000007) + +#define FLASH_ACR_PRFTEN ((uint32)0x00000100) +#define FLASH_ACR_ICEN ((uint32)0x00000200) +#define FLASH_ACR_DCEN ((uint32)0x00000400) +#define FLASH_ACR_ICRST ((uint32)0x00000800) +#define FLASH_ACR_DCRST ((uint32)0x00001000) +#define FLASH_ACR_BYTE0_ADDRESS ((uint32)0x40023C00) +#define FLASH_ACR_BYTE2_ADDRESS ((uint32)0x40023C03) + +typedef struct +{ + __io uint32 CR; /*!< PWR power control register, Address offset: 0x00 */ + __io uint32 CSR; /*!< PWR power control/status register, Address offset: 0x04 */ +} PWR_TypeDef; + +#define PWR_BASE (0x40007000) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define PWR_CR_VOS ((uint16)0x4000) /*!< Regulator voltage scaling output selection */ + +typedef struct +{ + __io uint32 ACR; /*!< FLASH access control register, Address offset: 0x00 */ + __io uint32 KEYR; /*!< FLASH key register, Address offset: 0x04 */ + __io uint32 OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ + __io uint32 SR; /*!< FLASH status register, Address offset: 0x0C */ + __io uint32 CR; /*!< FLASH control register, Address offset: 0x10 */ + __io uint32 OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ +} FLASH_TypeDef; + +#define FLASH_R_BASE (0x40023C00) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define RESET 0 + +typedef uint32 uint32_t; + +void InitMCO1() +{ + rcc_reg_map *RCC = RCC_BASE; + // Turn MCO1 Master Clock Output mode + RCC->CFGR &= RCC_CFGR_MCO1_RESET_MASK; + RCC->CFGR |= RCC_CFGR_MCO1Source_HSE | RCC_CFGR_MCO1Div_1; + // PA8 Output the Master Clock MCO1 + gpio_set_af_mode(GPIOA, 8, 0); + gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); +} + + +void SetupClock72MHz() +{ + uint32_t SystemCoreClock = 72000000; + + /******************************************************************************/ + /* PLL (clocked by HSE) used as System clock source */ + /******************************************************************************/ + /************************* PLL Parameters *************************************/ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ + int PLL_M = 4; + int PLL_N = 216; + + /* SYSCLK = PLL_VCO / PLL_P */ + int PLL_P = 6; + + /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ + int PLL_Q = 9; + + + uint32 StartUpCounter = 0, HSEStatus = 0; + rcc_reg_map *RCC = RCC_BASE; + + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Select regulator voltage output Scale 2 mode, System frequency up to 144 MHz */ + RCC->APB1ENR |= RCC_APB1ENR_PWREN; + PWR->CR &= (uint32_t)~(PWR_CR_VOS); + + /* HCLK = SYSCLK / 1*/ + RCC->CFGR |= RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK / 1*/ + RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK / 2*/ + RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; + + // save bus clock values + rcc_dev_clk_speed_table[RCC_AHB1] = (SystemCoreClock/1); + rcc_dev_clk_speed_table[RCC_APB2] = (SystemCoreClock/1); + rcc_dev_clk_speed_table[RCC_APB1] = (SystemCoreClock/2); + + /* Configure the main PLL */ + RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | + (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); + + /* Enable the main PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till the main PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ + FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS; + + /* Select the main PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= RCC_CFGR_SW_PLL; + + /* Wait till the main PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } +} + + +void SetupClock120MHz() +{ + uint32_t SystemCoreClock = 120000000; + + /******************************************************************************/ + /* PLL (clocked by HSE) used as System clock source */ + /******************************************************************************/ + /************************* PLL Parameters *************************************/ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ + int PLL_M = 8; + int PLL_N = 240; + + /* SYSCLK = PLL_VCO / PLL_P */ + int PLL_P = 2; + + /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ + int PLL_Q = 5; + + + uint32 StartUpCounter = 0, HSEStatus = 0; + rcc_reg_map *RCC = RCC_BASE; + + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Select regulator voltage output Scale 2 mode, System frequency up to 144 MHz */ + RCC->APB1ENR |= RCC_APB1ENR_PWREN; + PWR->CR &= (uint32_t)~(PWR_CR_VOS); + + /* HCLK = SYSCLK / 1*/ + RCC->CFGR |= RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK / 2*/ + RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; + + /* PCLK1 = HCLK / 4*/ + RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; + + // save bus clock values + rcc_dev_clk_speed_table[RCC_AHB1] = (SystemCoreClock/1); + rcc_dev_clk_speed_table[RCC_APB2] = (SystemCoreClock/2); + rcc_dev_clk_speed_table[RCC_APB1] = (SystemCoreClock/4); + + /* Configure the main PLL */ + RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | + (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); + + /* Enable the main PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till the main PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ + FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_3WS; + + /* Select the main PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= RCC_CFGR_SW_PLL; + + /* Wait till the main PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } +} + + +void SetupClock168MHz() +{ + uint32_t SystemCoreClock = 168000000; + + /******************************************************************************/ + /* PLL (clocked by HSE) used as System clock source */ + /******************************************************************************/ + /************************* PLL Parameters *************************************/ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ +#ifdef ARDUINO_STM32F4_NETDUINO2PLUS + int PLL_M = 25; // The NETDUINO has a 25MHz external oscillator +#else + int PLL_M = 8; +#endif + int PLL_N = 336; + + /* SYSCLK = PLL_VCO / PLL_P */ + int PLL_P = 2; + + /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ + int PLL_Q = 7; + + + uint32 StartUpCounter = 0, HSEStatus = 0; + rcc_reg_map *RCC = RCC_BASE; + +#ifdef ARDUINO_STM32F4_NETDUINO2PLUS + InitMCO1(); +#endif + + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */ + RCC->APB1ENR |= RCC_APB1ENR_PWREN; + PWR->CR |= PWR_CR_VOS; + + /* HCLK = SYSCLK / 1*/ + RCC->CFGR |= RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK / 2*/ + RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; + + /* PCLK1 = HCLK / 4*/ + RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; + + // save bus clock values + rcc_dev_clk_speed_table[RCC_AHB1] = (SystemCoreClock/1); + rcc_dev_clk_speed_table[RCC_APB2] = (SystemCoreClock/2); + rcc_dev_clk_speed_table[RCC_APB1] = (SystemCoreClock/4); + + /* Configure the main PLL */ + RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | + (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); + + /* Enable the main PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till the main PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ + FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; + + /* Select the main PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= RCC_CFGR_SW_PLL; + + /* Wait till the main PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } +} + + +void rcc_clk_init(rcc_sysclk_src sysclk_src, + rcc_pllsrc pll_src, + rcc_pll_multiplier pll_mul) { + + //SetupClock72MHz(); +#if STM32_TICKS_PER_US == 168 + SetupClock168MHz(); +#endif +#if STM32_TICKS_PER_US == 120 + SetupClock120MHz(); +#endif +#if STM32_TICKS_PER_US == 72 + SetupClock72MHz(); +#endif +} + + + + +#define PLL_M 8 +#define PLL_N 240 +/* SYSCLK = PLL_VCO / PLL_P */ +#define PLL_P 2 + +/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ +#define PLL_Q 5 + + +void rcc_clk_init2(rcc_sysclk_src sysclk_src, + rcc_pllsrc pll_src, + rcc_pll_multiplier pll_mul) { + +/******************************************************************************/ +/* PLL (clocked by HSE) used as System clock source */ +/******************************************************************************/ + uint32 StartUpCounter = 0, HSEStatus = 0; + rcc_reg_map *pRCC = RCC_BASE; + + /* Enable HSE */ + pRCC->CR |= RCC_CR_HSEON; + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = pRCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((pRCC->CR & RCC_CR_HSERDY) != 0) + { + HSEStatus = 0x01; + } + else + { + HSEStatus = 0x00; + } + + if (HSEStatus == 0x01) + { + /* HCLK = SYSCLK / 1*/ + pRCC->CFGR |= RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK / 2*/ + pRCC->CFGR |= RCC_CFGR_PPRE2_DIV2; + + /* PCLK1 = HCLK / 4*/ + pRCC->CFGR |= RCC_CFGR_PPRE1_DIV4; + + /* Configure the main PLL */ + pRCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | + (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); + + /* Enable the main PLL */ + pRCC->CR |= RCC_CR_PLLON; + + /* Wait till the main PLL is ready */ + while((pRCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ + ((FLASH_TypeDef*)FLASH)->ACR = FLASH_ACR_PRFTEN |FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_3WS; + + /* Select the main PLL as system clock source */ + pRCC->CFGR &= ~RCC_CFGR_SW; + pRCC->CFGR |= RCC_CFGR_SW_PLL; + + /* Wait till the main PLL is used as system clock source */ + while ((pRCC->CFGR & RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } + +#if 0 + uint32 cfgr = 0; + uint32 cr; + + /* Assume that we're going to clock the chip off the PLL, fed by + * the HSE */ + ASSERT(sysclk_src == RCC_CLKSRC_PLL && + pll_src == RCC_PLLSRC_HSE); + + RCC_BASE->CFGR = pll_src | pll_mul; + + /* Turn on the HSE */ + cr = RCC_BASE->CR; + cr |= RCC_CR_HSEON; + RCC_BASE->CR = cr; + while (!(RCC_BASE->CR & RCC_CR_HSERDY)) + ; + + /* Now the PLL */ + cr |= RCC_CR_PLLON; + RCC_BASE->CR = cr; + while (!(RCC_BASE->CR & RCC_CR_PLLRDY)) + ; + + /* Finally, let's switch over to the PLL */ + cfgr &= ~RCC_CFGR_SW; + cfgr |= RCC_CFGR_SW_PLL; + RCC_BASE->CFGR = cfgr; + while ((RCC_BASE->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) + ; +#endif +} + +/** + * @brief Turn on the clock line on a peripheral + * @param id Clock ID of the peripheral to turn on. + */ +void rcc_clk_enable(rcc_clk_id id) { + static const __io uint32* enable_regs[] = { + [APB1] = &RCC_BASE->APB1ENR, + [APB2] = &RCC_BASE->APB2ENR, + [AHB1] = &RCC_BASE->AHB1ENR, + [AHB2] = &RCC_BASE->AHB2ENR, + [AHB3] = &RCC_BASE->AHB3ENR, + }; + + rcc_clk_domain clk_domain = rcc_dev_clk(id); + __io uint32* enr = (__io uint32*)enable_regs[clk_domain]; + uint8 lnum = rcc_dev_table[id].line_num; + + bb_peri_set_bit(enr, lnum, 1); +} + +/** + * @brief Turn on the clock line on a peripheral + * @param id Clock ID of the peripheral to turn on. + */ +void rcc_clk_disable(rcc_clk_id id) { + static const __io uint32* enable_regs[] = { + [APB1] = &RCC_BASE->APB1ENR, + [APB2] = &RCC_BASE->APB2ENR, + [AHB1] = &RCC_BASE->AHB1ENR, + [AHB2] = &RCC_BASE->AHB2ENR, + [AHB3] = &RCC_BASE->AHB3ENR, + }; + + rcc_clk_domain clk_domain = rcc_dev_clk(id); + __io uint32* enr = (__io uint32*)enable_regs[clk_domain]; + uint8 lnum = rcc_dev_table[id].line_num; + + bb_peri_set_bit(enr, lnum, 0); +} + +/** + * @brief Reset a peripheral. + * @param id Clock ID of the peripheral to reset. + */ +void rcc_reset_dev(rcc_clk_id id) { + static const __io uint32* reset_regs[] = { + [APB1] = &RCC_BASE->APB1RSTR, + [APB2] = &RCC_BASE->APB2RSTR, + [AHB1] = &RCC_BASE->AHB1RSTR, + [AHB2] = &RCC_BASE->AHB2RSTR, + [AHB3] = &RCC_BASE->AHB3RSTR, + }; + + rcc_clk_domain clk_domain = rcc_dev_clk(id); + __io void* addr = (__io void*)reset_regs[clk_domain]; + uint8 lnum = rcc_dev_table[id].line_num; + + bb_peri_set_bit(addr, lnum, 1); + bb_peri_set_bit(addr, lnum, 0); +} + +/** + * @brief Get a peripheral's clock domain + * @param id Clock ID of the peripheral whose clock domain to return + * @return Clock source for the given clock ID + */ +rcc_clk_domain rcc_dev_clk(rcc_clk_id id) { + return rcc_dev_table[id].clk_domain; +} + +/** + * @brief Get a peripheral's clock domain speed + * @param id Clock ID of the peripheral whose clock domain speed to return + * @return Clock speed for the given clock ID + */ +uint32 rcc_dev_clk_speed(rcc_clk_id id) { + return rcc_dev_clk_speed_table[rcc_dev_clk(id)]; +} + +/** + * @brief Get a peripheral's timer clock domain speed + * @param id Clock ID of the peripheral whose clock domain speed to return + * @return Clock speed for the given clock ID + */ +uint32 rcc_dev_timer_clk_speed(rcc_clk_id id) { + return 2*rcc_dev_clk_speed(id); +} + +/** + * @brief Set the divider on a peripheral prescaler + * @param prescaler prescaler to set + * @param divider prescaler divider + */ +void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) { +#if 0 + static const uint32 masks[] = { + [RCC_PRESCALER_AHB] = RCC_CFGR_HPRE, + [RCC_PRESCALER_APB1] = RCC_CFGR_PPRE1, + [RCC_PRESCALER_APB2] = RCC_CFGR_PPRE2, + [RCC_PRESCALER_USB] = RCC_CFGR_USBPRE, + [RCC_PRESCALER_ADC] = RCC_CFGR_ADCPRE, + }; + + uint32 cfgr = RCC_BASE->CFGR; + cfgr &= ~masks[prescaler]; + cfgr |= divider; + RCC_BASE->CFGR = cfgr; +#endif +} + +#endif diff --git a/STM32F4/cores/maple/libmaple/rccF4.h b/STM32F4/cores/maple/libmaple/rccF4.h new file mode 100644 index 000000000..99c5ff25d --- /dev/null +++ b/STM32F4/cores/maple/libmaple/rccF4.h @@ -0,0 +1,642 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file rcc.h + * @brief reset and clock control definitions and prototypes + */ + +#include "libmaple_types.h" +#include "bitband.h" + +#ifndef _RCC_H_ +#define _RCC_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +/** RCC register map type */ +typedef struct +{ + __io uint32 CR; /*!< RCC clock control register, Address offset: 0x00 */ + __io uint32 PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ + __io uint32 CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ + __io uint32 CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ + __io uint32 AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ + __io uint32 AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ + __io uint32 AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ + uint32 RESERVED0; /*!< Reserved, 0x1C */ + __io uint32 APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ + __io uint32 APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ + uint32 RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ + __io uint32 AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ + __io uint32 AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ + __io uint32 AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ + uint32 RESERVED2; /*!< Reserved, 0x3C */ + __io uint32 APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ + __io uint32 APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ + uint32 RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ + __io uint32 AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ + __io uint32 AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ + __io uint32 AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ + uint32 RESERVED4; /*!< Reserved, 0x5C */ + __io uint32 APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ + __io uint32 APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ + uint32 RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ + __io uint32 BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ + __io uint32 CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ + uint32 RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ + __io uint32 SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ + __io uint32 PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ +} rcc_reg_map; + +/** RCC register map base pointer */ +//#define RCC_BASE ((struct rcc_reg_map*)0x40021000) +#define RCC_BASE ((rcc_reg_map*)0x40023800) + +/* + * Register bit definitions + */ + +/* Clock control register */ + +#define RCC_CR_PLLRDY_BIT 25 +#define RCC_CR_PLLON_BIT 24 +#define RCC_CR_CSSON_BIT 19 +#define RCC_CR_HSEBYP_BIT 18 +#define RCC_CR_HSERDY_BIT 17 +#define RCC_CR_HSEON_BIT 16 +#define RCC_CR_HSIRDY_BIT 1 +#define RCC_CR_HSION_BIT 0 + +#define RCC_CR_PLLRDY BIT(RCC_CR_PLLRDY_BIT) +#define RCC_CR_PLLON BIT(RCC_CR_PLLON_BIT) +#define RCC_CR_CSSON BIT(RCC_CR_CSSON_BIT) +#define RCC_CR_HSEBYP BIT(RCC_CR_HSEBYP_BIT) +#define RCC_CR_HSERDY BIT(RCC_CR_HSERDY_BIT) +#define RCC_CR_HSEON BIT(RCC_CR_HSEON_BIT) +#define RCC_CR_HSICAL (0xFF << 8) +#define RCC_CR_HSITRIM (0x1F << 3) +#define RCC_CR_HSIRDY BIT(RCC_CR_HSIRDY_BIT) +#define RCC_CR_HSION BIT(RCC_CR_HSION_BIT) + +/* Clock configuration register */ + +#define RCC_CFGR_USBPRE_BIT 22 +#define RCC_CFGR_PLLXTPRE_BIT 17 +#define RCC_CFGR_PLLSRC_BIT 16 + +#define RCC_CFGR_MCO (0x3 << 24) +#define RCC_CFGR_USBPRE BIT(RCC_CFGR_USBPRE_BIT) +#define RCC_CFGR_PLLMUL (0xF << 18) +#define RCC_CFGR_PLLXTPRE BIT(RCC_CFGR_PLLXTPRE_BIT) +#define RCC_CFGR_PLLSRC BIT(RCC_CFGR_PLLSRC_BIT) +#define RCC_CFGR_ADCPRE (0x3 << 14) +#define RCC_CFGR_PPRE2 (0x7 << 11) +#define RCC_CFGR_PPRE1 (0x7 << 8) +#define RCC_CFGR_HPRE (0xF << 4) +#define RCC_CFGR_SWS (0x3 << 2) +#define RCC_CFGR_SWS_PLL (0x2 << 2) +#define RCC_CFGR_SWS_HSE (0x1 << 2) +#define RCC_CFGR_SW 0x3 +#define RCC_CFGR_SW_PLL 0x2 +#define RCC_CFGR_SW_HSE 0x1 + +#define RCC_CFGR_MCO1Source_HSI ((uint32_t)0x00000000) +#define RCC_CFGR_MCO1Source_LSE ((uint32_t)0x00200000) +#define RCC_CFGR_MCO1Source_HSE ((uint32_t)0x00400000) +#define RCC_CFGR_MCO1Source_PLLCLK ((uint32_t)0x00600000) +#define RCC_CFGR_MCO1Div_1 ((uint32_t)0x00000000) +#define RCC_CFGR_MCO1Div_2 ((uint32_t)0x04000000) +#define RCC_CFGR_MCO1Div_3 ((uint32_t)0x05000000) +#define RCC_CFGR_MCO1Div_4 ((uint32_t)0x06000000) +#define RCC_CFGR_MCO1Div_5 ((uint32_t)0x07000000) +#define RCC_CFGR_MCO1_RESET_MASK ((uint32_t)0xF89FFFFF) + +/* Clock interrupt register */ + +#define RCC_CIR_CSSC_BIT 23 +#define RCC_CIR_PLLRDYC_BIT 20 +#define RCC_CIR_HSERDYC_BIT 19 +#define RCC_CIR_HSIRDYC_BIT 18 +#define RCC_CIR_LSERDYC_BIT 17 +#define RCC_CIR_LSIRDYC_BIT 16 +#define RCC_CIR_PLLRDYIE_BIT 12 +#define RCC_CIR_HSERDYIE_BIT 11 +#define RCC_CIR_HSIRDYIE_BIT 10 +#define RCC_CIR_LSERDYIE_BIT 9 +#define RCC_CIR_LSIRDYIE_BIT 8 +#define RCC_CIR_CSSF_BIT 7 +#define RCC_CIR_PLLRDYF_BIT 4 +#define RCC_CIR_HSERDYF_BIT 3 +#define RCC_CIR_HSIRDYF_BIT 2 +#define RCC_CIR_LSERDYF_BIT 1 +#define RCC_CIR_LSIRDYF_BIT 0 + +#define RCC_CIR_CSSC BIT(RCC_CIR_CSSC_BIT) +#define RCC_CIR_PLLRDYC BIT(RCC_CIR_PLLRDYC_BIT) +#define RCC_CIR_HSERDYC BIT(RCC_CIR_HSERDYC_BIT) +#define RCC_CIR_HSIRDYC BIT(RCC_CIR_HSIRDYC_BIT) +#define RCC_CIR_LSERDYC BIT(RCC_CIR_LSERDYC_BIT) +#define RCC_CIR_LSIRDYC BIT(RCC_CIR_LSIRDYC_BIT) +#define RCC_CIR_PLLRDYIE BIT(RCC_CIR_PLLRDYIE_BIT) +#define RCC_CIR_HSERDYIE BIT(RCC_CIR_HSERDYIE_BIT) +#define RCC_CIR_HSIRDYIE BIT(RCC_CIR_HSIRDYIE_BIT) +#define RCC_CIR_LSERDYIE BIT(RCC_CIR_LSERDYIE_BIT) +#define RCC_CIR_LSIRDYIE BIT(RCC_CIR_LSIRDYIE_BIT) +#define RCC_CIR_CSSF BIT(RCC_CIR_CSSF_BIT) +#define RCC_CIR_PLLRDYF BIT(RCC_CIR_PLLRDYF_BIT) +#define RCC_CIR_HSERDYF BIT(RCC_CIR_HSERDYF_BIT) +#define RCC_CIR_HSIRDYF BIT(RCC_CIR_HSIRDYF_BIT) +#define RCC_CIR_LSERDYF BIT(RCC_CIR_LSERDYF_BIT) +#define RCC_CIR_LSIRDYF BIT(RCC_CIR_LSIRDYF_BIT) + +/* APB2 peripheral reset register */ + +#define RCC_APB2RSTR_TIM11RST_BIT 21 +#define RCC_APB2RSTR_TIM10RST_BIT 20 +#define RCC_APB2RSTR_TIM9RST_BIT 19 +#define RCC_APB2RSTR_ADC3RST_BIT 15 +#define RCC_APB2RSTR_USART1RST_BIT 14 +#define RCC_APB2RSTR_TIM8RST_BIT 13 +#define RCC_APB2RSTR_SPI1RST_BIT 12 +#define RCC_APB2RSTR_TIM1RST_BIT 11 +#define RCC_APB2RSTR_ADC2RST_BIT 10 +#define RCC_APB2RSTR_ADC1RST_BIT 9 +#define RCC_APB2RSTR_IOPGRST_BIT 8 +#define RCC_APB2RSTR_IOPFRST_BIT 7 +#define RCC_APB2RSTR_IOPERST_BIT 6 +#define RCC_APB2RSTR_IOPDRST_BIT 5 +#define RCC_APB2RSTR_IOPCRST_BIT 4 +#define RCC_APB2RSTR_IOPBRST_BIT 3 +#define RCC_APB2RSTR_IOPARST_BIT 2 +#define RCC_APB2RSTR_AFIORST_BIT 0 + +#define RCC_APB2RSTR_TIM11RST BIT(RCC_APB2RSTR_TIM11RST_BIT) +#define RCC_APB2RSTR_TIM10RST BIT(RCC_APB2RSTR_TIM10RST_BIT) +#define RCC_APB2RSTR_TIM9RST BIT(RCC_APB2RSTR_TIM9RST_BIT) +#define RCC_APB2RSTR_ADC3RST BIT(RCC_APB2RSTR_ADC3RST_BIT) +#define RCC_APB2RSTR_USART1RST BIT(RCC_APB2RSTR_USART1RST_BIT) +#define RCC_APB2RSTR_TIM8RST BIT(RCC_APB2RSTR_TIM8RST_BIT) +#define RCC_APB2RSTR_SPI1RST BIT(RCC_APB2RSTR_SPI1RST_BIT) +#define RCC_APB2RSTR_TIM1RST BIT(RCC_APB2RSTR_TIM1RST_BIT) +#define RCC_APB2RSTR_ADC2RST BIT(RCC_APB2RSTR_ADC2RST_BIT) +#define RCC_APB2RSTR_ADC1RST BIT(RCC_APB2RSTR_ADC1RST_BIT) +#define RCC_APB2RSTR_IOPGRST BIT(RCC_APB2RSTR_IOPGRST_BIT) +#define RCC_APB2RSTR_IOPFRST BIT(RCC_APB2RSTR_IOPFRST_BIT) +#define RCC_APB2RSTR_IOPERST BIT(RCC_APB2RSTR_IOPERST_BIT) +#define RCC_APB2RSTR_IOPDRST BIT(RCC_APB2RSTR_IOPDRST_BIT) +#define RCC_APB2RSTR_IOPCRST BIT(RCC_APB2RSTR_IOPCRST_BIT) +#define RCC_APB2RSTR_IOPBRST BIT(RCC_APB2RSTR_IOPBRST_BIT) +#define RCC_APB2RSTR_IOPARST BIT(RCC_APB2RSTR_IOPARST_BIT) +#define RCC_APB2RSTR_AFIORST BIT(RCC_APB2RSTR_AFIORST_BIT) + +/* APB1 peripheral reset register */ + +#define RCC_APB1RSTR_DACRST_BIT 29 +#define RCC_APB1RSTR_PWRRST_BIT 28 +#define RCC_APB1RSTR_BKPRST_BIT 27 +#define RCC_APB1RSTR_CANRST_BIT 25 +#define RCC_APB1RSTR_USBRST_BIT 23 +#define RCC_APB1RSTR_I2C2RST_BIT 22 +#define RCC_APB1RSTR_I2C1RST_BIT 21 +#define RCC_APB1RSTR_UART5RST_BIT 20 +#define RCC_APB1RSTR_UART4RST_BIT 19 +#define RCC_APB1RSTR_USART3RST_BIT 18 +#define RCC_APB1RSTR_USART2RST_BIT 17 +#define RCC_APB1RSTR_SPI3RST_BIT 15 +#define RCC_APB1RSTR_SPI2RST_BIT 14 +#define RCC_APB1RSTR_WWDRST_BIT 11 +#define RCC_APB1RSTR_TIM14RST_BIT 8 +#define RCC_APB1RSTR_TIM13RST_BIT 7 +#define RCC_APB1RSTR_TIM12RST_BIT 6 +#define RCC_APB1RSTR_TIM7RST_BIT 5 +#define RCC_APB1RSTR_TIM6RST_BIT 4 +#define RCC_APB1RSTR_TIM5RST_BIT 3 +#define RCC_APB1RSTR_TIM4RST_BIT 2 +#define RCC_APB1RSTR_TIM3RST_BIT 1 +#define RCC_APB1RSTR_TIM2RST_BIT 0 + +#define RCC_APB1RSTR_DACRST BIT(RCC_APB1RSTR_DACRST_BIT) +#define RCC_APB1RSTR_PWRRST BIT(RCC_APB1RSTR_PWRRST_BIT) +#define RCC_APB1RSTR_BKPRST BIT(RCC_APB1RSTR_BKPRST_BIT) +#define RCC_APB1RSTR_CANRST BIT(RCC_APB1RSTR_CANRST_BIT) +#define RCC_APB1RSTR_USBRST BIT(RCC_APB1RSTR_USBRST_BIT) +#define RCC_APB1RSTR_I2C2RST BIT(RCC_APB1RSTR_I2C2RST_BIT) +#define RCC_APB1RSTR_I2C1RST BIT(RCC_APB1RSTR_I2C1RST_BIT) +#define RCC_APB1RSTR_UART5RST BIT(RCC_APB1RSTR_UART5RST_BIT) +#define RCC_APB1RSTR_UART4RST BIT(RCC_APB1RSTR_UART4RST_BIT) +#define RCC_APB1RSTR_USART3RST BIT(RCC_APB1RSTR_USART3RST_BIT) +#define RCC_APB1RSTR_USART2RST BIT(RCC_APB1RSTR_USART2RST_BIT) +#define RCC_APB1RSTR_SPI3RST BIT(RCC_APB1RSTR_SPI3RST_BIT) +#define RCC_APB1RSTR_SPI2RST BIT(RCC_APB1RSTR_SPI2RST_BIT) +#define RCC_APB1RSTR_WWDRST BIT(RCC_APB1RSTR_WWDRST_BIT) +#define RCC_APB1RSTR_TIM14RST BIT(RCC_APB1RSTR_TIM14RST_BIT) +#define RCC_APB1RSTR_TIM13RST BIT(RCC_APB1RSTR_TIM13RST_BIT) +#define RCC_APB1RSTR_TIM12RST BIT(RCC_APB1RSTR_TIM12RST_BIT) +#define RCC_APB1RSTR_TIM7RST BIT(RCC_APB1RSTR_TIM7RST_BIT) +#define RCC_APB1RSTR_TIM6RST BIT(RCC_APB1RSTR_TIM6RST_BIT) +#define RCC_APB1RSTR_TIM5RST BIT(RCC_APB1RSTR_TIM5RST_BIT) +#define RCC_APB1RSTR_TIM4RST BIT(RCC_APB1RSTR_TIM4RST_BIT) +#define RCC_APB1RSTR_TIM3RST BIT(RCC_APB1RSTR_TIM3RST_BIT) +#define RCC_APB1RSTR_TIM2RST BIT(RCC_APB1RSTR_TIM2RST_BIT) + +/* AHB peripheral clock enable register */ + +#define RCC_AHBENR_SDIOEN_BIT 10 +#define RCC_AHBENR_FSMCEN_BIT 8 +#define RCC_AHBENR_CRCEN_BIT 7 +#define RCC_AHBENR_FLITFEN_BIT 4 +#define RCC_AHBENR_SRAMEN_BIT 2 +#define RCC_AHBENR_DMA2EN_BIT 1 +#define RCC_AHBENR_DMA1EN_BIT 0 + +#define RCC_AHBENR_SDIOEN BIT(RCC_AHBENR_SDIOEN_BIT) +#define RCC_AHBENR_FSMCEN BIT(RCC_AHBENR_FSMCEN_BIT) +#define RCC_AHBENR_CRCEN BIT(RCC_AHBENR_CRCEN_BIT) +#define RCC_AHBENR_FLITFEN BIT(RCC_AHBENR_FLITFEN_BIT) +#define RCC_AHBENR_SRAMEN BIT(RCC_AHBENR_SRAMEN_BIT) +#define RCC_AHBENR_DMA2EN BIT(RCC_AHBENR_DMA2EN_BIT) +#define RCC_AHBENR_DMA1EN BIT(RCC_AHBENR_DMA1EN_BIT) + +/* APB2 peripheral clock enable register */ + +#define RCC_APB2ENR_TIM11EN_BIT 21 +#define RCC_APB2ENR_TIM10EN_BIT 20 +#define RCC_APB2ENR_TIM9EN_BIT 19 +#define RCC_APB2ENR_ADC3EN_BIT 15 +#define RCC_APB2ENR_USART1EN_BIT 14 +#define RCC_APB2ENR_TIM8EN_BIT 13 +#define RCC_APB2ENR_SPI1EN_BIT 12 +#define RCC_APB2ENR_TIM1EN_BIT 11 +#define RCC_APB2ENR_ADC2EN_BIT 10 +#define RCC_APB2ENR_ADC1EN_BIT 9 +#define RCC_APB2ENR_IOPGEN_BIT 8 +#define RCC_APB2ENR_IOPFEN_BIT 7 +#define RCC_APB2ENR_IOPEEN_BIT 6 +#define RCC_APB2ENR_IOPDEN_BIT 5 +#define RCC_APB2ENR_IOPCEN_BIT 4 +#define RCC_APB2ENR_IOPBEN_BIT 3 +#define RCC_APB2ENR_IOPAEN_BIT 2 +#define RCC_APB2ENR_AFIOEN_BIT 0 + +#define RCC_APB2ENR_TIM11EN BIT(RCC_APB2ENR_TIM11EN_BIT) +#define RCC_APB2ENR_TIM10EN BIT(RCC_APB2ENR_TIM10EN_BIT) +#define RCC_APB2ENR_TIM9EN BIT(RCC_APB2ENR_TIM9EN_BIT) +#define RCC_APB2ENR_ADC3EN BIT(RCC_APB2ENR_ADC3EN_BIT) +#define RCC_APB2ENR_USART1EN BIT(RCC_APB2ENR_USART1EN_BIT) +#define RCC_APB2ENR_TIM8EN BIT(RCC_APB2ENR_TIM8EN_BIT) +#define RCC_APB2ENR_SPI1EN BIT(RCC_APB2ENR_SPI1EN_BIT) +#define RCC_APB2ENR_TIM1EN BIT(RCC_APB2ENR_TIM1EN_BIT) +#define RCC_APB2ENR_ADC2EN BIT(RCC_APB2ENR_ADC2EN_BIT) +#define RCC_APB2ENR_ADC1EN BIT(RCC_APB2ENR_ADC1EN_BIT) +#define RCC_APB2ENR_IOPGEN BIT(RCC_APB2ENR_IOPGEN_BIT) +#define RCC_APB2ENR_IOPFEN BIT(RCC_APB2ENR_IOPFEN_BIT) +#define RCC_APB2ENR_IOPEEN BIT(RCC_APB2ENR_IOPEEN_BIT) +#define RCC_APB2ENR_IOPDEN BIT(RCC_APB2ENR_IOPDEN_BIT) +#define RCC_APB2ENR_IOPCEN BIT(RCC_APB2ENR_IOPCEN_BIT) +#define RCC_APB2ENR_IOPBEN BIT(RCC_APB2ENR_IOPBEN_BIT) +#define RCC_APB2ENR_IOPAEN BIT(RCC_APB2ENR_IOPAEN_BIT) +#define RCC_APB2ENR_AFIOEN BIT(RCC_APB2ENR_AFIOEN_BIT) + +/* APB1 peripheral clock enable register */ + +#define RCC_APB1ENR_DACEN_BIT 29 +#define RCC_APB1ENR_PWREN_BIT 28 +#define RCC_APB1ENR_BKPEN_BIT 27 +#define RCC_APB1ENR_CANEN_BIT 25 +#define RCC_APB1ENR_USBEN_BIT 23 +#define RCC_APB1ENR_I2C2EN_BIT 22 +#define RCC_APB1ENR_I2C1EN_BIT 21 +#define RCC_APB1ENR_UART5EN_BIT 20 +#define RCC_APB1ENR_UART4EN_BIT 19 +#define RCC_APB1ENR_USART3EN_BIT 18 +#define RCC_APB1ENR_USART2EN_BIT 17 +#define RCC_APB1ENR_SPI3EN_BIT 15 +#define RCC_APB1ENR_SPI2EN_BIT 14 +#define RCC_APB1ENR_WWDEN_BIT 11 +#define RCC_APB1ENR_TIM14EN_BIT 8 +#define RCC_APB1ENR_TIM13EN_BIT 7 +#define RCC_APB1ENR_TIM12EN_BIT 6 +#define RCC_APB1ENR_TIM7EN_BIT 5 +#define RCC_APB1ENR_TIM6EN_BIT 4 +#define RCC_APB1ENR_TIM5EN_BIT 3 +#define RCC_APB1ENR_TIM4EN_BIT 2 +#define RCC_APB1ENR_TIM3EN_BIT 1 +#define RCC_APB1ENR_TIM2EN_BIT 0 + +#define RCC_APB1ENR_DACEN BIT(RCC_APB1ENR_DACEN_BIT) +#define RCC_APB1ENR_PWREN BIT(RCC_APB1ENR_PWREN_BIT) +#define RCC_APB1ENR_BKPEN BIT(RCC_APB1ENR_BKPEN_BIT) +#define RCC_APB1ENR_CANEN BIT(RCC_APB1ENR_CANEN_BIT) +#define RCC_APB1ENR_USBEN BIT(RCC_APB1ENR_USBEN_BIT) +#define RCC_APB1ENR_I2C2EN BIT(RCC_APB1ENR_I2C2EN_BIT) +#define RCC_APB1ENR_I2C1EN BIT(RCC_APB1ENR_I2C1EN_BIT) +#define RCC_APB1ENR_UART5EN BIT(RCC_APB1ENR_UART5EN_BIT) +#define RCC_APB1ENR_UART4EN BIT(RCC_APB1ENR_UART4EN_BIT) +#define RCC_APB1ENR_USART3EN BIT(RCC_APB1ENR_USART3EN_BIT) +#define RCC_APB1ENR_USART2EN BIT(RCC_APB1ENR_USART2EN_BIT) +#define RCC_APB1ENR_SPI3EN BIT(RCC_APB1ENR_SPI3EN_BIT) +#define RCC_APB1ENR_SPI2EN BIT(RCC_APB1ENR_SPI2EN_BIT) +#define RCC_APB1ENR_WWDEN BIT(RCC_APB1ENR_WWDEN_BIT) +#define RCC_APB1ENR_TIM14EN BIT(RCC_APB1ENR_TIM14EN_BIT) +#define RCC_APB1ENR_TIM13EN BIT(RCC_APB1ENR_TIM13EN_BIT) +#define RCC_APB1ENR_TIM12EN BIT(RCC_APB1ENR_TIM12EN_BIT) +#define RCC_APB1ENR_TIM7EN BIT(RCC_APB1ENR_TIM7EN_BIT) +#define RCC_APB1ENR_TIM6EN BIT(RCC_APB1ENR_TIM6EN_BIT) +#define RCC_APB1ENR_TIM5EN BIT(RCC_APB1ENR_TIM5EN_BIT) +#define RCC_APB1ENR_TIM4EN BIT(RCC_APB1ENR_TIM4EN_BIT) +#define RCC_APB1ENR_TIM3EN BIT(RCC_APB1ENR_TIM3EN_BIT) +#define RCC_APB1ENR_TIM2EN BIT(RCC_APB1ENR_TIM2EN_BIT) + +/* Backup domain control register */ + +#define RCC_BDCR_BDRST_BIT 16 +#define RCC_BDCR_RTCEN_BIT 15 +#define RCC_BDCR_LSEBYP_BIT 2 +#define RCC_BDCR_LSERDY_BIT 1 +#define RCC_BDCR_LSEON_BIT 0 + +#define RCC_BDCR_BDRST BIT(RCC_BDCR_BDRST_BIT) +#define RCC_BDCR_RTCEN BIT(RCC_BDCR_RTC_BIT) +#define RCC_BDCR_RTCSEL (0x3 << 8) +#define RCC_BDCR_RTCSEL_NONE (0x0 << 8) +#define RCC_BDCR_RTCSEL_LSE (0x1 << 8) +#define RCC_BDCR_RTCSEL_LSI (0x2 << 8) +#define RCC_BDCR_RTCSEL_HSE (0x3 << 8) +#define RCC_BDCR_LSEBYP BIT(RCC_BDCR_LSEBYP_BIT) +#define RCC_BDCR_LSERDY BIT(RCC_BDCR_LSERDY_BIT) +#define RCC_BDCR_LSEON BIT(RCC_BDCR_LSEON_BIT) + +/* Control/status register */ + +#define RCC_CSR_LPWRRSTF_BIT 31 +#define RCC_CSR_WWDGRSTF_BIT 30 +#define RCC_CSR_IWDGRSTF_BIT 29 +#define RCC_CSR_SFTRSTF_BIT 28 +#define RCC_CSR_PORRSTF_BIT 27 +#define RCC_CSR_PINRSTF_BIT 26 +#define RCC_CSR_RMVF_BIT 24 +#define RCC_CSR_LSIRDY_BIT 1 +#define RCC_CSR_LSION_BIT 0 + +#define RCC_CSR_LPWRRSTF BIT(RCC_CSR_LPWRRSTF_BIT) +#define RCC_CSR_WWDGRSTF BIT(RCC_CSR_WWDGRSTF_BIT) +#define RCC_CSR_IWDGRSTF BIT(RCC_CSR_IWDGRSTF_BIT) +#define RCC_CSR_SFTRSTF BIT(RCC_CSR_SFTRSTF_BIT) +#define RCC_CSR_PORRSTF BIT(RCC_CSR_PORRSTF_BIT) +#define RCC_CSR_PINRSTF BIT(RCC_CSR_PINRSTF_BIT) +#define RCC_CSR_RMVF BIT(RCC_CSR_RMVF_BIT) +#define RCC_CSR_LSIRDY BIT(RCC_CSR_LSIRDY_BIT) +#define RCC_CSR_LSION BIT(RCC_CSR_LSION_BIT) + +/* + * Convenience routines + */ + +/** + * SYSCLK sources + * @see rcc_clk_init() + */ +typedef enum rcc_sysclk_src { + RCC_CLKSRC_HSI = 0x0, + RCC_CLKSRC_HSE = 0x1, + RCC_CLKSRC_PLL = 0x2, +} rcc_sysclk_src; + +/** + * PLL entry clock source + * @see rcc_clk_init() + */ +typedef enum rcc_pllsrc { + RCC_PLLSRC_HSE = (0x1 << 16), + RCC_PLLSRC_HSI_DIV_2 = (0x0 << 16) +} rcc_pllsrc; + +/** + * PLL multipliers + * @see rcc_clk_init() + */ +typedef enum rcc_pll_multiplier { + RCC_PLLMUL_2 = (0x0 << 18), + RCC_PLLMUL_3 = (0x1 << 18), + RCC_PLLMUL_4 = (0x2 << 18), + RCC_PLLMUL_5 = (0x3 << 18), + RCC_PLLMUL_6 = (0x4 << 18), + RCC_PLLMUL_7 = (0x5 << 18), + RCC_PLLMUL_8 = (0x6 << 18), + RCC_PLLMUL_9 = (0x7 << 18), + RCC_PLLMUL_10 = (0x8 << 18), + RCC_PLLMUL_11 = (0x9 << 18), + RCC_PLLMUL_12 = (0xA << 18), + RCC_PLLMUL_13 = (0xB << 18), + RCC_PLLMUL_14 = (0xC << 18), + RCC_PLLMUL_15 = (0xD << 18), + RCC_PLLMUL_16 = (0xE << 18), +} rcc_pll_multiplier; + +/** + * @brief Identifies bus and clock line for a peripheral. + * + * Also generally useful as a unique identifier for that peripheral + * (or its corresponding device struct). + */ +typedef enum rcc_clk_id { + RCC_GPIOA, + RCC_GPIOB, + RCC_GPIOC, + RCC_GPIOD, +// RCC_AFIO, + RCC_ADC1, + RCC_ADC2, + RCC_ADC3, + RCC_USART1, + RCC_USART2, + RCC_USART3, + RCC_TIMER1, + RCC_TIMER2, + RCC_TIMER3, + RCC_TIMER4, + RCC_SPI1, + RCC_SPI2, + RCC_DMA1, + RCC_PWR, + RCC_BKP, + RCC_I2C1, + RCC_I2C2, + RCC_CRC, +// RCC_FLITF, +// RCC_SRAM, + RCC_GPIOE, + RCC_GPIOF, + RCC_GPIOG, + RCC_UART4, + RCC_UART5, + RCC_TIMER5, + RCC_TIMER6, + RCC_TIMER7, + RCC_TIMER8, + RCC_FSMC, + RCC_DAC, + RCC_DMA2, + RCC_SDIO, + RCC_SPI3, + RCC_TIMER9, + RCC_TIMER10, + RCC_TIMER11, + RCC_TIMER12, + RCC_TIMER13, + RCC_TIMER14, + RCC_USBFS, + RCC_SYSCFG, + RCC_SPI4 +} rcc_clk_id; + +void rcc_clk_init(rcc_sysclk_src sysclk_src, + rcc_pllsrc pll_src, + rcc_pll_multiplier pll_mul); +void rcc_clk_disable(rcc_clk_id device); +void rcc_clk_enable(rcc_clk_id device); +void rcc_reset_dev(rcc_clk_id device); + +void SetupClock72MHz(); +void SetupClock120MHz(); +void SetupClock168MHz(); + +typedef enum rcc_clk_domain { + RCC_APB1, + RCC_APB2, + RCC_AHB1, + RCC_AHB2, + RCC_AHB3 +} rcc_clk_domain; + +rcc_clk_domain rcc_dev_clk(rcc_clk_id device); + +uint32 rcc_dev_clk_speed(rcc_clk_id id); +uint32 rcc_dev_timer_clk_speed(rcc_clk_id id); + +/** + * Prescaler identifiers + * @see rcc_set_prescaler() + */ +typedef enum rcc_prescaler { + RCC_PRESCALER_AHB, + RCC_PRESCALER_APB1, + RCC_PRESCALER_APB2, + RCC_PRESCALER_USB, + RCC_PRESCALER_ADC +} rcc_prescaler; + +/** + * ADC prescaler dividers + * @see rcc_set_prescaler() + */ +typedef enum rcc_adc_divider { + RCC_ADCPRE_PCLK_DIV_2 = 0x0 << 14, + RCC_ADCPRE_PCLK_DIV_4 = 0x1 << 14, + RCC_ADCPRE_PCLK_DIV_6 = 0x2 << 14, + RCC_ADCPRE_PCLK_DIV_8 = 0x3 << 14, +} rcc_adc_divider; + +/** + * APB1 prescaler dividers + * @see rcc_set_prescaler() + */ +typedef enum rcc_apb1_divider { + RCC_APB1_HCLK_DIV_1 = 0x0 << 8, + RCC_APB1_HCLK_DIV_2 = 0x4 << 8, + RCC_APB1_HCLK_DIV_4 = 0x5 << 8, + RCC_APB1_HCLK_DIV_8 = 0x6 << 8, + RCC_APB1_HCLK_DIV_16 = 0x7 << 8, +} rcc_apb1_divider; + +/** + * APB2 prescaler dividers + * @see rcc_set_prescaler() + */ +typedef enum rcc_apb2_divider { + RCC_APB2_HCLK_DIV_1 = 0x0 << 11, + RCC_APB2_HCLK_DIV_2 = 0x4 << 11, + RCC_APB2_HCLK_DIV_4 = 0x5 << 11, + RCC_APB2_HCLK_DIV_8 = 0x6 << 11, + RCC_APB2_HCLK_DIV_16 = 0x7 << 11, +} rcc_apb2_divider; + +/** + * AHB prescaler dividers + * @see rcc_set_prescaler() + */ +typedef enum rcc_ahb_divider { + RCC_AHB_SYSCLK_DIV_1 = 0x0 << 4, + RCC_AHB_SYSCLK_DIV_2 = 0x8 << 4, + RCC_AHB_SYSCLK_DIV_4 = 0x9 << 4, + RCC_AHB_SYSCLK_DIV_8 = 0xA << 4, + RCC_AHB_SYSCLK_DIV_16 = 0xB << 4, + RCC_AHB_SYSCLK_DIV_32 = 0xC << 4, + RCC_AHB_SYSCLK_DIV_64 = 0xD << 4, + RCC_AHB_SYSCLK_DIV_128 = 0xD << 4, + RCC_AHB_SYSCLK_DIV_256 = 0xE << 4, + RCC_AHB_SYSCLK_DIV_512 = 0xF << 4, +} rcc_ahb_divider; + +void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider); + + +/** + * @brief Start the low speed internal oscillatior + */ +static inline void rcc_start_lsi(void) { + *bb_perip(&RCC_BASE->CSR, RCC_CSR_LSION_BIT) = 1; + while (*bb_perip(&RCC_BASE->CSR, RCC_CSR_LSIRDY_BIT) == 0); +} + +/* FIXME [0.0.13] Just have data point to an rcc_pll_multiplier! */ +/** + * @brief Start the low speed external oscillatior + */ +static inline void rcc_start_lse(void) { + bb_peri_set_bit(&RCC_BASE->BDCR, RCC_BDCR_LSEBYP_BIT, 0); + bb_peri_set_bit(&RCC_BASE->BDCR, RCC_BDCR_LSEON_BIT, 1); + while (bb_peri_get_bit(&RCC_BASE->BDCR, RCC_BDCR_LSERDY_BIT ) == 0); +} + +/* + * Deprecated bits. + */ +static inline void rcc_start_hse(void) { // Added to support RTClock +// *bb_perip(&RCC_BASE->CR, RCC_CR_HSEON_BIT) = 1; + while (bb_peri_get_bit(&RCC_BASE->CR, RCC_CR_HSERDY_BIT) == 0); +} + + + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/STM32F4/variants/black_f407vet6/black_f4.cpp b/STM32F4/variants/black_f407vet6/black_f4.cpp new file mode 100644 index 000000000..78d37aafc --- /dev/null +++ b/STM32F4/variants/black_f407vet6/black_f4.cpp @@ -0,0 +1,264 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file black_f4.cpp + * @author ala42 + * @brief black_f4 board file. + */ + +#ifdef BOARD_black_f4 + +#include "black_f4.h" + +//#include "fsmc.h" +#include "gpio.h" +#include "rcc.h" +#include "timer.h" + +#include "wirish_types.h" + +// Pins reserved for the on-board hardware +#define USB_DM_PIN BOARD_USB_DM_PIN // PA11 +#define USB_DP_PIN BOARD_USB_DP_PIN // PA12 + +#define FLASH_CS_PIN PB0 +#define FLASH_CLK_PIN BOARD_SPI3_SCK_PIN // PB3 +#define FLASH_DO_PIN BOARD_SPI3_MISO_PIN // PB4 +#define FLASH_DI_PIN BOARD_SPI3_MOSI_PIN // PB5 + +#define NRF24_CLK_PIN BOARD_SPI3_SCK_PIN // PB3 +#define NRF24_DO_PIN BOARD_SPI3_MISO_PIN // PB4 +#define NRF24_DI_PIN BOARD_SPI3_MOSI_PIN // PB5 +#define NRF24_CE_PIN PB6 +#define NRF24_CS_PIN PB7 +#define NRF24_IRQ_PIN PB8 + +// SD card, SDIO mode +#define SD_DAT0 BOARD_SDIO_D0 // PC8 +#define SD_DAT1 BOARD_SDIO_D1 // PC9 +#define SD_DAT2 BOARD_SDIO_D2 // PC10 +#define SD_DAT3 BOARD_SDIO_D3 // PC11 +#define SD_CLK BOARD_SDIO_CK // PC12 +#define SD_CMD BOARD_SDIO_CMD // PD2 +// SD card, SPI mode, only usable with software SPI +#define SD_DI BOARD_SDIO_CMD // PD2 +#define SD_DO BOARD_SDIO_D0 // PC8 +#define SD_CS BOARD_SDIO_D3 // PC11 +#define SD_SCLK BOARD_SDIO_CK // PC12 + +//static void initSRAMChip(void); +/*****************************************************************************/ +// Alternate functions, see DocID022152 Rev 8, Table 9. +/*****************************************************************************/ +void boardInit(void) { +/* // remap TIMER8 to PC6-9 + gpio_set_af_mode(GPIOC, 6, 3); + gpio_set_af_mode(GPIOC, 7, 3); + gpio_set_af_mode(GPIOC, 8, 3); + gpio_set_af_mode(GPIOC, 9, 3); + + // remap TIMER1 to PE9,11,13,14 + gpio_set_af_mode(GPIOE, 9, 1); + gpio_set_af_mode(GPIOE, 11, 1); + gpio_set_af_mode(GPIOE, 13, 1); + gpio_set_af_mode(GPIOE, 14, 1); + + // remap TIMER3 to PB4,5,0,1 + gpio_set_af_mode(GPIOB, 4, 2); + gpio_set_af_mode(GPIOB, 5, 2); + gpio_set_af_mode(GPIOB, 0, 2); + gpio_set_af_mode(GPIOB, 1, 2); + + //gpio_set_af_mode(GPIOA, 2, 7); + //gpio_set_af_mode(GPIOA, 3, 7); +*/ + return; +} + +/* +typedef struct stm32_pin_info { + gpio_dev *gpio_device; // Maple pin's GPIO device + uint8 gpio_bit; // Pin's GPIO port bit. + timer_dev *timer_device; // Pin's timer device, if any. + uint8 timer_channel; // Timer channel, or 0 if none. + const adc_dev *adc_device; // ADC device, if any. + uint8 adc_channel; // Pin ADC channel, or ADCx if none. +} stm32_pin_info; +*/ + +extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { // LQFP100 package pin + {GPIOA, 0, TIMER5, 1, ADC1, 0}, // D00/PA0 | 23 | USART2_CTS | UART4_TX | ETH_MII_CRS | TIM2_CH1_ETR | TIM5_CH1 | TIM8_ETR | ADC123_IN0/WKUP + {GPIOA, 1, TIMER5, 2, ADC1, 1}, // D01/PA1 | 24 | USART2_RTS | UART4_RX | ETH_RMII_REF_CLK | ETH_MII_RX_CLK | TIM5_CH2 | TIM2_CH2 | ADC123_IN1 + {GPIOA, 2, TIMER5, 3, ADC1, 2}, // D02/PA2 | 25 | USART2_TX | TIM5_CH3 | TIM9_CH1 | TIM2_CH3 | ETH_MDIO | ADC123_IN2 + {GPIOA, 3, TIMER5, 4, ADC1, 3}, // D03/PA3 | 26 | USART2_RX | TIM5_CH4 | TIM9_CH2 | TIM2_CH4 | OTG_HS_ULPI_D0 | ETH_MII_COL | ADC123_IN3 + {GPIOA, 4, NULL, 0, ADC1, 4}, // D04/PA4 | 29 | SPI1_NSS | SPI3_NSS | USART2_CK | DCMI_HSYNC | OTG_HS_SOF | I2S3_WS | ADC12_IN4 / DAC_OUT1 + {GPIOA, 5, NULL, 0, ADC1, 5}, // D05/PA5 | 30 | SPI1_SCK | OTG_HS_ULPI_CK | TIM2_CH1_ETR | TIM8_CH1N | ADC12_IN5 / DAC_OUT2 + {GPIOA, 6, NULL, 1, ADC1, 6}, // D06/PA6 | 31 | SPI1_MISO | TIM8_BKIN | TIM13_CH1 | DCMI_PIXCLK | TIM3_CH1 | TIM1_BKIN | ADC12_IN6 + {GPIOA, 7, NULL, 0, ADC1, 7}, // D07/PA7 | 32 | SPI1_MOSI | TIM8_CH1N | TIM14_CH1 | TIM3_CH2 | ETH_MII_RX_DV | TIM1_CH1N / ETH_RMII_CRS_DV | ADC12_IN7 + {GPIOA, 8, NULL, 0, NULL, ADCx}, // D08/PA8 | 67 | MCO1 | USART1_CK | TIM1_CH1 | I2C3_SCL | OTG_FS_SOF + {GPIOA, 9, NULL, 0, NULL, ADCx}, // D09/PA9 | 68 | USART1_TX | TIM1_CH2 | I2C3_SMBA | DCMI_D0 + {GPIOA, 10, NULL, 0, NULL, ADCx}, // D10/PA10 | 69 | USART1_RX | TIM1_CH3 | OTG_FS_ID | DCMI_D1 + {GPIOA, 11, NULL, 0, NULL, ADCx}, // D11/PA11 | 70 | USART1_CTS | CAN1_RX | TIM1_CH4 | OTG_FS_DM + {GPIOA, 12, NULL, 0, NULL, ADCx}, // D12/PA12 | 71 | USART1_RTS | CAN1_TX | TIM1_ETR | OTG_FS_DP + {GPIOA, 13, NULL, 0, NULL, ADCx}, // D13/PA13 | 72 | JTMS-SWDIO + {GPIOA, 14, NULL, 0, NULL, ADCx}, // D14/PA14 | 76 | JTCK-SWCLK + {GPIOA, 15, TIMER2, 1, NULL, ADCx}, // D15/PA15 | 77 | JTDI | SPI3_NSS | I2S3_WS | TIM2_CH1_ETR | SPI1_NSS + + {GPIOB, 0, TIMER3, 3, ADC1, 8}, // D16/PB0 | 35 | TIM3_CH3 | TIM8_CH2N | OTG_HS_ULPI_D1 | ETH_MII_RXD2 | TIM1_CH2N | ADC12_IN8 + {GPIOB, 1, TIMER3, 4, ADC1, 9}, // D17/PB1 | 36 | TIM3_CH4 | TIM8_CH3N | OTG_HS_ULPI_D2 | ETH_MII_RXD3 | TIM1_CH3N | ADC12_IN9 + {GPIOB, 2, NULL, 0, NULL, ADCx}, // D18/PB2 | 37 | BOOT1 + {GPIOB, 3, TIMER2, 2, NULL, ADCx}, // D19/PB3 | 89 | JTDO | TRACESWO | SPI3_SCK | I2S3_CK | TIM2_CH2 | SPI1_SCK + {GPIOB, 4, TIMER3, 1, NULL, ADCx}, // D20/PB4 | 90 | NJTRST | SPI3_MISO | TIM3_CH1 | SPI1_MISO | I2S3ext_SD + {GPIOB, 5, TIMER3, 2, NULL, ADCx}, // D21/PB5 | 91 | I2C1_SMBA | CAN2_RX | OTG_HS_ULPI_D7 | ETH_PPS_OUT | TIM3_CH2 | SPI1_MOSI | SPI3_MOSI | DCMI_D10 | I2S3_SD + {GPIOB, 6, NULL, 0, NULL, ADCx}, // D22/PB6 | 92 | I2C1_SCL | TIM4_CH1 | CAN2_TX | DCMI_D5 | USART1_TX + {GPIOB, 7, NULL, 0, NULL, ADCx}, // D23/PB7 | 93 | I2C1_SDA | FSMC_NL | DCMI_VSYNC | USART1_RX | TIM4_CH2 + {GPIOB, 8, NULL, 0, NULL, ADCx}, // D24/PB8 | 95 | TIM4_CH3 | SDIO_D4 | TIM10_CH1 | DCMI_D6 | ETH_MII_TXD3 | I2C1_SCL | CAN1_RX + {GPIOB, 9, NULL, 0, NULL, ADCx}, // D25/PB9 | 96 | SPI2_NSS | I2S2_WS | TIM4_CH4 | TIM11_CH1 | SDIO_D5 | DCMI_D7 | I2C1_SDA | CAN1_TX + {GPIOB, 10, NULL, 0, NULL, ADCx}, // D26/PB10 | 47 | SPI2_SCK | I2S2_CK | I2C2_SCL | USART3_TX | OTG_HS_ULPI_D3 | ETH_MII_RX_ER | TIM2_CH3 + {GPIOB, 11, NULL, 0, NULL, ADCx}, // D27/PB11 | 48 | I2C2_SDA | USART3_RX | OTG_HS_ULPI_D4 | ETH_RMII_TX_EN | ETH_MII_TX_EN | TIM2_CH4 + {GPIOB, 12, NULL, 0, NULL, ADCx}, // D28/PB12 | 51 | SPI2_NSS | I2S2_WS | I2C2_SMBA | USART3_CK | TIM1_BKIN | CAN2_RX | OTG_HS_ULPI_D5 | ETH_RMII_TXD0 | ETH_MII_TXD0 | OTG_HS_ID + {GPIOB, 13, NULL, 0, NULL, ADCx}, // D29/PB13 | 52 | SPI2_SCK | I2S2_CK | USART3_CTS | TIM1_CH1N | CAN2_TX | OTG_HS_ULPI_D6 | ETH_RMII_TXD1 | ETH_MII_TXD1 + {GPIOB, 14, NULL, 0, NULL, ADCx}, // D30/PB14 | 53 | SPI2_MISO | TIM1_CH2N | TIM12_CH1 | OTG_HS_DM | USART3_RTS | TIM8_CH2N | I2S2ext_SD + {GPIOB, 15, NULL, 0, NULL, ADCx}, // D31/PB15 | 54 | SPI2_MOSI | I2S2_SD | TIM1_CH3N | TIM8_CH3N | TIM12_CH2 | OTG_HS_DP + + {GPIOC, 0, NULL, 0, ADC1, 10}, // D32/PC0 | 15 | OTG_HS_ULPI_STP | ADC123_IN10 + {GPIOC, 1, NULL, 0, ADC1, 11}, // D33/PC1 | 16 | ETH_MDC | ADC123_IN11 + {GPIOC, 2, NULL, 0, ADC1, 12}, // D34/PC2 | 17 | SPI2_MISO | OTG_HS_ULPI_DIR | ETH_MII_TXD2 | I2S2ext_SD | ADC123_IN12 + {GPIOC, 3, NULL, 0, ADC1, 13}, // D35/PC3 | 18 | SPI2_MOSI | I2S2_SD | OTG_HS_ULPI_NXT | ETH_MII_TX_CLK | ADC123_IN13 + {GPIOC, 4, NULL, 0, ADC1, 14}, // D36/PC4 | 33 | ETH_RMII_RX_D0 | ETH_MII_RX_D0 | ADC12_IN14 + {GPIOC, 5, NULL, 0, ADC1, 15}, // D37/PC5 | 34 | ETH_RMII_RX_D1 | ETH_MII_RX_D1 | ADC12_IN15 + {GPIOC, 6, TIMER8, 1, NULL, ADCx}, // D38/PC6 | 63 | I2S2_MCK | TIM8_CH1/SDIO_D6 | USART6_TX | DCMI_D0/TIM3_CH1 + {GPIOC, 7, TIMER8, 2, NULL, ADCx}, // D39/PC7 | 64 | I2S3_MCK | TIM8_CH2/SDIO_D7 | USART6_RX | DCMI_D1/TIM3_CH2 + {GPIOC, 8, TIMER8, 3, NULL, ADCx}, // D40/PC8 | 65 | TIM8_CH3 | SDIO_D0 | TIM3_CH3 | USART6_CK | DCMI_D2 + {GPIOC, 9, TIMER8, 4, NULL, ADCx}, // D41/PC9 | 66 | I2S_CKIN | MCO2 | TIM8_CH4 | SDIO_D1 | I2C3_SDA | DCMI_D3 | TIM3_CH4 + {GPIOC, 10, NULL, 0, NULL, ADCx}, // D42/PC10 | 78 | SPI3_SCK | I2S3_CK | UART4_TX | SDIO_D2 | DCMI_D8 | USART3_TX + {GPIOC, 11, NULL, 0, NULL, ADCx}, // D43/PC11 | 79 | UART4_RX | SPI3_MISO | SDIO_D3 | DCMI_D4 | USART3_RX | I2S3ext_SD + {GPIOC, 12, NULL, 0, NULL, ADCx}, // D44/PC12 | 80 | UART5_TX | SDIO_CK | DCMI_D9 | SPI3_MOSI | I2S3_SD | USART3_CK + {GPIOC, 13, NULL, 0, NULL, ADCx}, // D45/PC13 | 7 | RTC_OUT, RTC_TAMP1, RTC_TS + {GPIOC, 14, NULL, 0, NULL, ADCx}, // D46/PC14 | 8 | OSC32_IN + {GPIOC, 15, NULL, 0, NULL, ADCx}, // D47/PC15 | 9 | OSC32_OUT + + {GPIOD, 0, NULL, 0, NULL, ADCx}, // D48/PD0 | 81 | FSMC_D2 | CAN1_RX + {GPIOD, 1, NULL, 0, NULL, ADCx}, // D49/PD1 | 82 | FSMC_D3 | CAN1_TX + {GPIOD, 2, NULL, 0, NULL, ADCx}, // D50/PD2 | 83 | TIM3_ETR | UART5_RX | SDIO_CMD | DCMI_D11 + {GPIOD, 3, NULL, 0, NULL, ADCx}, // D51/PD3 | 84 | FSMC_CLK | USART2_CTS + {GPIOD, 4, NULL, 0, NULL, ADCx}, // D52/PD4 | 85 | FSMC_NOE | USART2_RTS + {GPIOD, 5, NULL, 0, NULL, ADCx}, // D53/PD5 | 86 | FSMC_NWE | USART2_TX + {GPIOD, 6, NULL, 0, NULL, ADCx}, // D54/PD6 | 87 | FSMC_NWAIT | USART2_RX + {GPIOD, 7, NULL, 0, NULL, ADCx}, // D55/PD7 | 88 | USART2_CK | FSMC_NE1 | FSMC_NCE2 + {GPIOD, 8, NULL, 0, NULL, ADCx}, // D56/PD8 | 55 | FSMC_D13 | USART3_TX + {GPIOD, 9, NULL, 0, NULL, ADCx}, // D57/PD9 | 56 | FSMC_D14 | USART3_RX + {GPIOD, 10, NULL, 0, NULL, ADCx}, // D58/PD10 | 57 | FSMC_D15 | USART3_CK + {GPIOD, 11, NULL, 0, NULL, ADCx}, // D59/PD11 | 58 | FSMC_CLE | FSMC_A16 | USART3_CTS + {GPIOD, 12, TIMER4, 1, NULL, ADCx}, // D60/PD12 | 59 | FSMC_ALE | FSMC_A17 | TIM4_CH1 | USART3_RTS // remap in + {GPIOD, 13, TIMER4, 2, NULL, ADCx}, // D61/PD13 | 60 | FSMC_A18 | TIM4_CH2 // remap in + {GPIOD, 14, TIMER4, 3, NULL, ADCx}, // D62/PD14 | 61 | FSMC_D0 | TIM4_CH3 // remap in + {GPIOD, 15, TIMER4, 4, NULL, ADCx}, // D63/PD15 | 62 | FSMC_D1 | TIM4_CH4 // remap in + + {GPIOE, 0, NULL, 0, NULL, ADCx}, // D64/PE0 | 97 | TIM4_ETR | FSMC_NBL0 | DCMI_D2 + {GPIOE, 1, NULL, 0, NULL, ADCx}, // D65/PE1 | 98 | FSMC_NBL1 | DCMI_D3 + {GPIOE, 2, NULL, 0, NULL, ADCx}, // D66/PE2 | 1 | TRACECLK | FSMC_A23 | ETH_MII_TXD3 + {GPIOE, 3, NULL, 0, NULL, ADCx}, // D67/PE3 | 2 | TRACED0 | FSMC_A19 + {GPIOE, 4, NULL, 0, NULL, ADCx}, // D68/PE4 | 3 | TRACED1 | FSMC_A20 | DCMI_D4 + {GPIOE, 5, NULL, 0, NULL, ADCx}, // D69/PE5 | 4 | TRACED2 | FSMC_A21 | TIM9_CH1 / DCMI_D6 + {GPIOE, 6, NULL, 0, NULL, ADCx}, // D70/PE6 | 5 | TRACED3 | FSMC_A22 | TIM9_CH2 / DCMI_D7 + {GPIOE, 7, NULL, 0, NULL, ADCx}, // D71/PE7 | 38 | FSMC_D4 | TIM1_ETR + {GPIOE, 8, NULL, 0, NULL, ADCx}, // D72/PE8 | 39 | FSMC_D5 | TIM1_CH1N + {GPIOE, 9, TIMER1, 1, NULL, ADCx}, // D73/PE9 | 40 | FSMC_D6 | TIM1_CH1 // remap in + {GPIOE, 10, NULL, 0, NULL, ADCx}, // D74/PE10 | 41 | FSMC_D7 | TIM1_CH2N + {GPIOE, 11, TIMER1, 2, NULL, ADCx}, // D75/PE11 | 42 | FSMC_D8 | TIM1_CH2 // remap in + {GPIOE, 12, NULL, 0, NULL, ADCx}, // D76/PE12 | 43 | FSMC_D9 | TIM1_CH3N + {GPIOE, 13, TIMER1, 3, NULL, ADCx}, // D77/PE13 | 44 | FSMC_D10 | TIM1_CH3 // remap in + {GPIOE, 14, TIMER1, 4, NULL, ADCx}, // D78/PE14 | 45 | FSMC_D11 | TIM1_CH4 // remap in + {GPIOE, 15, NULL, 0, NULL, ADCx}, // D79/PE15 | 46 | FSMC_D12 | TIM1_BKIN +#if 0 + {GPIOF, 0, NULL, 0, NULL, ADCx}, // D80/PF0 + {GPIOF, 1, NULL, 0, NULL, ADCx}, // D81/PF1 + {GPIOF, 2, NULL, 0, NULL, ADCx}, // D82/PF2 + {GPIOF, 3, NULL, 0, NULL, ADCx}, // D83/PF3 + {GPIOF, 4, NULL, 0, NULL, ADCx}, // D84/PF4 + {GPIOF, 5, NULL, 0, NULL, ADCx}, // D85/PF5 + {GPIOF, 6, NULL, 0, NULL, ADCx}, // D86/PF6 + {GPIOF, 7, NULL, 0, NULL, ADCx}, // D87/PF7 + {GPIOF, 8, NULL, 0, NULL, ADCx}, // D88/PF8 + {GPIOF, 9, NULL, 0, NULL, ADCx}, // D89/PF9 + {GPIOF, 10, NULL, 0, NULL, ADCx}, // D90/PF10 + {GPIOF, 11, NULL, 0, NULL, ADCx}, // D91/PF11 + {GPIOF, 12, NULL, 0, NULL, ADCx}, // D92/PF12 + {GPIOF, 13, NULL, 0, NULL, ADCx}, // D93/PF13 + {GPIOF, 14, NULL, 0, NULL, ADCx}, // D94/PF14 + {GPIOF, 15, NULL, 0, NULL, ADCx}, // D95/PF15 + + {GPIOG, 0, NULL, 0, NULL, ADCx}, // D96/PG0 + {GPIOG, 1, NULL, 0, NULL, ADCx}, // D97/PG1 + {GPIOG, 2, NULL, 0, NULL, ADCx}, // D98/PG2 + {GPIOG, 3, NULL, 0, NULL, ADCx}, // D99/PG3 + {GPIOG, 4, NULL, 0, NULL, ADCx}, // D100/PG4 + {GPIOG, 5, NULL, 0, NULL, ADCx}, // D101/PG5 + {GPIOG, 6, NULL, 0, NULL, ADCx}, // D102/PG6 + {GPIOG, 7, NULL, 0, NULL, ADCx}, // D103/PG7 + {GPIOG, 8, NULL, 0, NULL, ADCx}, // D104/PG8 + {GPIOG, 9, NULL, 0, NULL, ADCx}, // D105/PG9 + {GPIOG, 10, NULL, 0, NULL, ADCx}, // D106/PG10 + {GPIOG, 11, NULL, 0, NULL, ADCx}, // D107/PG11 + {GPIOG, 12, NULL, 0, NULL, ADCx}, // D108/PG12 + {GPIOG, 13, NULL, 0, NULL, ADCx}, // D109/PG13 + {GPIOG, 14, NULL, 0, NULL, ADCx}, // D110/PG14 + {GPIOG, 15, NULL, 0, NULL, ADCx} // D111/PG15 +#endif +}; +/* to be defined +extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { + 0, 1, 2, 3, 15, 16, 17, 19, 20, 21, 38, 39, 49, 41, 60, 61, 62, 63, 73, 75, 77, 78 +}; +*/ +extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = { + PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PB0, PB1, PC0, PC1, PC2, PC3, PC4, PC5 +}; + +extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { + BOARD_LED_PIN, BOARD_LED2_PIN, BOARD_BUTTON1_PIN, BOARD_BUTTON2_PIN, BOARD_BUTTON2_PIN, + BOARD_JTMS_SWDIO_PIN, BOARD_JTCK_SWCLK_PIN, + FLASH_CS_PIN, FLASH_CLK_PIN, FLASH_DO_PIN, FLASH_DI_PIN, + NRF24_CE_PIN, NRF24_CS_PIN, NRF24_IRQ_PIN, + BOARD_SDIO_D0, BOARD_SDIO_D1, BOARD_SDIO_D2, BOARD_SDIO_D3, BOARD_SDIO_CK, BOARD_SDIO_CMD, + USB_DM_PIN, USB_DP_PIN +}; +/* +static void initSRAMChip(void) { + fsmc_nor_psram_reg_map *regs = FSMC_NOR_PSRAM1_BASE; + + fsmc_sram_init_gpios(); + rcc_clk_enable(RCC_FSMC); + + regs->BCR = (FSMC_BCR_WREN | FSMC_BCR_MWID_16BITS | FSMC_BCR_MTYP_SRAM | + FSMC_BCR_MBKEN); + fsmc_nor_psram_set_addset(regs, 0); + fsmc_nor_psram_set_datast(regs, 3); +} +*/ +#endif diff --git a/STM32F4/variants/black_f407vet6/black_f4.h b/STM32F4/variants/black_f407vet6/black_f4.h new file mode 100644 index 000000000..6f5d3dac7 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/black_f4.h @@ -0,0 +1,130 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file black_f4.h + * @author Marti Bolivar + * @brief Private include file for Maple Native in boards.h + * + * See maple.h for more information on these definitions. + */ + +#ifndef _BOARD_BLACK_F4_H_ +#define _BOARD_BLACK_F4_H_ + +#define Port2Pin(port, bit) ((port-'A')*16+bit) + +#define CYCLES_PER_MICROSECOND 168 + + +#undef STM32_PCLK1 +#undef STM32_PCLK2 +#define STM32_PCLK1 (CYCLES_PER_MICROSECOND*1000000/4) +#define STM32_PCLK2 (CYCLES_PER_MICROSECOND*1000000/2) + +#define SYSTICK_RELOAD_VAL (CYCLES_PER_MICROSECOND*1000-1) + +#define BOARD_USB_DM_PIN PA11 +#define BOARD_USB_DP_PIN PA12 + +#define BOARD_LED_PIN PA6 //Port2Pin('A', 6) +#define BOARD_LED2_PIN PA7 //Port2Pin('A', 7) +#define BOARD_BUTTON1_PIN PA0 //Port2Pin('A', 0) +#define BOARD_BUTTON2_PIN PE4 //Port2Pin('E', 4) +#define BOARD_BUTTON3_PIN PE3 //Port2Pin('E', 3) + +#define BOARD_NR_USARTS 5 +#define BOARD_USART1_TX_PIN PA9 //Port2Pin('A', 9) +#define BOARD_USART1_RX_PIN PA10 //Port2Pin('A',10) +#define BOARD_USART2_TX_PIN PA2 //Port2Pin('A', 2) +#define BOARD_USART2_RX_PIN PA3 //Port2Pin('A', 3) +#define BOARD_USART3_TX_PIN PB10 //Port2Pin('B',10) +#define BOARD_USART3_RX_PIN PB11 //Port2Pin('B',11) +#define BOARD_UART4_TX_PIN PA0 //Port2Pin('A', 0) +#define BOARD_UART4_RX_PIN PA1 //Port2Pin('A', 1) +#define BOARD_UART5_TX_PIN PC12 //Port2Pin('C',12) +#define BOARD_UART5_RX_PIN PD2 //Port2Pin('D', 2) + +#define BOARD_NR_SPI 3 +#define BOARD_SPI1_NSS_PIN PA4 //Port2Pin('A', 4) +#define BOARD_SPI1_SCK_PIN PA5 //Port2Pin('A', 5) +#define BOARD_SPI1_MISO_PIN PA6 //Port2Pin('A', 6) +#define BOARD_SPI1_MOSI_PIN PA7 //Port2Pin('A', 7) +#define BOARD_SPI1A_NSS_PIN PA15 //Port2Pin('A',15) +#define BOARD_SPI1A_SCK_PIN PB3 //Port2Pin('B', 3) +#define BOARD_SPI1A_MISO_PIN PB4 //Port2Pin('B', 4) +#define BOARD_SPI1A_MOSI_PIN PB5 //Port2Pin('B', 5) + +#define BOARD_SPI2_NSS_PIN PB12 //Port2Pin('B',12) +#define BOARD_SPI2_SCK_PIN PB13 //Port2Pin('B',13) +#define BOARD_SPI2_MISO_PIN PB14 //Port2Pin('B',14) +#define BOARD_SPI2_MOSI_PIN PB15 //Port2Pin('B',15) +#define BOARD_SPI2A_NSS_PIN PB9 //Port2Pin('B', 9) +#define BOARD_SPI2A_SCK_PIN PB10 //Port2Pin('B',10) +#define BOARD_SPI2A_MISO_PIN PC2 //Port2Pin('C', 2) +#define BOARD_SPI2A_MOSI_PIN pc3 //Port2Pin('C', 3) + +#define BOARD_SPI3_NSS_PIN PA15 //Port2Pin('A',15) +#define BOARD_SPI3_SCK_PIN PB3 //Port2Pin('B', 3) +#define BOARD_SPI3_MISO_PIN PB4 //Port2Pin('B', 4) +#define BOARD_SPI3_MOSI_PIN PB5 //Port2Pin('B', 5) +/* overlap with the SDIO interface for SD card +#define BOARD_SPI3A_NSS_PIN Port2Pin('A', 4) +#define BOARD_SPI3A_SCK_PIN Port2Pin('C',10) +#define BOARD_SPI3A_MISO_PIN Port2Pin('C',11) +#define BOARD_SPI3A_MOSI_PIN Port2Pin('C',12) +*/ +#define BOARD_SDIO_D0 PC8 //Port2Pin('C', 8) +#define BOARD_SDIO_D1 PC9 //Port2Pin('C', 9) +#define BOARD_SDIO_D2 PC10 //Port2Pin('C',10) +#define BOARD_SDIO_D3 PC11 //Port2Pin('C',11) +#define BOARD_SDIO_CK PC12 //Port2Pin('C',12) +#define BOARD_SDIO_CMD PD2 //Port2Pin('D', 2) + +#define BOARD_NR_GPIO_PINS 80 +#define BOARD_NR_PWM_PINS 22 +#define BOARD_NR_ADC_PINS 16 +#define BOARD_NR_USED_PINS 22 +#define BOARD_JTMS_SWDIO_PIN PA13 //Port2Pin('A',13) +#define BOARD_JTCK_SWCLK_PIN PA14 //Port2Pin('A',14) +#define BOARD_JTDI_PIN PA15 //Port2Pin('A',15) +#define BOARD_JTDO_PIN PB3 //Port2Pin('B', 3) +#define BOARD_NJTRST_PIN PB4 //Port2Pin('B', 4) + + +enum { +PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, +PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, +PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, +PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7,PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15, +PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15, +#if 0 +PF0,PF1,PF2,PF3,PF4,PF5,PF6,PF7,PF8,PF9,PF10,PF11,PF12,PF13,PF14,PF15, +PG0,PG1,PG2,PG3,PG4,PG5,PG6,PG7,PG8,PG9,PG10,PG11,PG12,PG13,PG14,PG15 +#endif +}; + +#endif diff --git a/STM32F4/variants/black_f407vet6/ld/common.inc b/STM32F4/variants/black_f407vet6/ld/common.inc new file mode 100644 index 000000000..f5a0f5b6e --- /dev/null +++ b/STM32F4/variants/black_f407vet6/ld/common.inc @@ -0,0 +1,219 @@ +/* + * Linker script for libmaple. + * + * Original author "lanchon" from ST forums, with modifications by LeafLabs. + */ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") + +/* + * Configure other libraries we want in the link. + * + * libgcc, libc, and libm are common across supported toolchains. + * However, some toolchains require additional archives which aren't + * present everywhere (e.g. ARM's gcc-arm-embedded releases). + * + * To hack around this, we let the build system specify additional + * archives by putting the right extra_libs.inc (in a directory under + * toolchains/) in our search path. + */ +GROUP(libgcc.a libc.a libm.a) +INCLUDE extra_libs.inc + +/* + * These force the linker to search for vector table symbols. + * + * These symbols vary by STM32 family (and also within families). + * It's up to the build system to configure the link's search path + * properly for the target MCU. + */ +INCLUDE vector_symbols.inc + +/* STM32 vector table. */ +EXTERN(__stm32_vector_table) + +/* C runtime initialization function. */ +EXTERN(start_c) + +/* main entry point */ +EXTERN(main) + +/* Initial stack pointer value. */ +EXTERN(__msp_init) +PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram)); + +/* Reset vector and chip reset entry point */ +EXTERN(__start__) +ENTRY(__start__) +PROVIDE(__exc_reset = __start__); + +/* Heap boundaries, for libmaple */ +EXTERN(_lm_heap_start); +EXTERN(_lm_heap_end); + +SECTIONS +{ + .text : + { + __text_start__ = .; + /* + * STM32 vector table. Leave this here. Yes, really. + */ + *(.stm32.interrupt_vector) + + /* + * Program code and vague linking + */ + *(.text .text.* .gnu.linkonce.t.*) + *(.plt) + *(.gnu.warning) + *(.glue_7t) *(.glue_7) *(.vfp11_veneer) + + *(.ARM.extab* .gnu.linkonce.armextab.*) + *(.gcc_except_table) + *(.eh_frame_hdr) + *(.eh_frame) + + . = ALIGN(4); + KEEP(*(.init)) + + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + } > REGION_TEXT + + /* + * End of text + */ + .text.align : + { + . = ALIGN(8); + __text_end__ = .; + } > REGION_TEXT + + /* + * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI + */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > REGION_RODATA + __exidx_end = .; + + /* + * .data + */ + .data : + { + . = ALIGN(8); + __data_start__ = .; + + *(.got.plt) *(.got) + *(.data .data.* .gnu.linkonce.d.*) + + . = ALIGN(8); + __data_end__ = .; + } > REGION_DATA AT> REGION_RODATA + + /* + * Read-only data + */ + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + /* .USER_FLASH: We allow users to allocate into Flash here */ + *(.USER_FLASH) + /* ROM image configuration; for C startup */ + . = ALIGN(4); + _lm_rom_img_cfgp = .; + LONG(LOADADDR(.data)); + /* + * Heap: Linker scripts may choose a custom heap by overriding + * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in + * internal SRAM, beginning after .bss, and growing towards + * the stack. + * + * I'm shoving these here naively; there's probably a cleaner way + * to go about this. [mbolivar] + */ + _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; + _lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init; + } > REGION_RODATA + + /* + * .bss + */ + .bss : + { + . = ALIGN(8); + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + . = ALIGN (8); + __bss_end__ = .; + _end = __bss_end__; + } > REGION_BSS + + /* + * Debugging sections + */ + .stab 0 (NOLOAD) : { *(.stab) } + .stabstr 0 (NOLOAD) : { *(.stabstr) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/STM32F4/variants/black_f407vet6/ld/extra_libs.inc b/STM32F4/variants/black_f407vet6/ld/extra_libs.inc new file mode 100644 index 000000000..dd2c84fa4 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/ld/extra_libs.inc @@ -0,0 +1,7 @@ +/* + * Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi- + * releases (https://launchpad.net/gcc-arm-embedded/). + */ + +/* This is for the provided newlib. */ +GROUP(libnosys.a) diff --git a/STM32F4/variants/black_f407vet6/ld/flash.ld b/STM32F4/variants/black_f407vet6/ld/flash.ld new file mode 100644 index 000000000..c753a786c --- /dev/null +++ b/STM32F4/variants/black_f407vet6/ld/flash.ld @@ -0,0 +1,20 @@ +/* + * Discovery F4 (STM32F407VGT6, high density) linker script for + * Flash builds. + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 125K + rom (rx) : ORIGIN = 0x08010000, LENGTH = 960K /* ala42 */ +} + +/* GROUP(libcs4_stm32_high_density.a) */ + +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +_FLASH_BUILD = 1; +INCLUDE common.inc diff --git a/STM32F4/variants/black_f407vet6/ld/jtag.ld b/STM32F4/variants/black_f407vet6/ld/jtag.ld new file mode 100644 index 000000000..fe70f68dc --- /dev/null +++ b/STM32F4/variants/black_f407vet6/ld/jtag.ld @@ -0,0 +1,20 @@ +/* + * STM32F4xx high density linker script for + * JTAG (bare metal, no bootloader) builds. + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K +} + +/* GROUP(libcs3_stm32_high_density.a) */ + +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +_FLASH_BUILD = 1; +INCLUDE common.inc diff --git a/STM32F4/variants/black_f407vet6/ld/names.inc b/STM32F4/variants/black_f407vet6/ld/names.inc new file mode 100644 index 000000000..6d7ff6e94 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/ld/names.inc @@ -0,0 +1,78 @@ +EXTERN(__cs3_stack) +EXTERN(__cs3_reset) +EXTERN(__exc_nmi) +EXTERN(__exc_hardfault) +EXTERN(__exc_memmanage) +EXTERN(__exc_busfault) +EXTERN(__exc_usagefault) +EXTERN(__stm32reservedexception7) +EXTERN(__stm32reservedexception8) +EXTERN(__stm32reservedexception9) +EXTERN(__stm32reservedexception10) +EXTERN(__exc_svc) +EXTERN(__exc_debug_monitor) +EXTERN(__stm32reservedexception13) +EXTERN(__exc_pendsv) +EXTERN(__exc_systick) + +EXTERN(__irq_wwdg) +EXTERN(__irq_pvd) +EXTERN(__irq_tamper) +EXTERN(__irq_rtc) +EXTERN(__irq_flash) +EXTERN(__irq_rcc) +EXTERN(__irq_exti0) +EXTERN(__irq_exti1) +EXTERN(__irq_exti2) +EXTERN(__irq_exti3) +EXTERN(__irq_exti4) +EXTERN(__irq_dma1_channel1) +EXTERN(__irq_dma1_channel2) +EXTERN(__irq_dma1_channel3) +EXTERN(__irq_dma1_channel4) +EXTERN(__irq_dma1_channel5) +EXTERN(__irq_dma1_channel6) +EXTERN(__irq_dma1_channel7) +EXTERN(__irq_adc) +EXTERN(__irq_usb_hp_can_tx) +EXTERN(__irq_usb_lp_can_rx0) +EXTERN(__irq_can_rx1) +EXTERN(__irq_can_sce) +EXTERN(__irq_exti9_5) +EXTERN(__irq_tim1_brk) +EXTERN(__irq_tim1_up) +EXTERN(__irq_tim1_trg_com) +EXTERN(__irq_tim1_cc) +EXTERN(__irq_tim2) +EXTERN(__irq_tim3) +EXTERN(__irq_tim4) +EXTERN(__irq_i2c1_ev) +EXTERN(__irq_i2c1_er) +EXTERN(__irq_i2c2_ev) +EXTERN(__irq_i2c2_er) +EXTERN(__irq_spi1) +EXTERN(__irq_spi2) +EXTERN(__irq_usart1) +EXTERN(__irq_usart2) +EXTERN(__irq_usart3) +EXTERN(__irq_exti15_10) +EXTERN(__irq_rtcalarm) +EXTERN(__irq_usbwakeup) + +EXTERN(__irq_tim8_brk) +EXTERN(__irq_tim8_up) +EXTERN(__irq_tim8_trg_com) +EXTERN(__irq_tim8_cc) +EXTERN(__irq_adc3) +EXTERN(__irq_fsmc) +EXTERN(__irq_sdio) +EXTERN(__irq_tim5) +EXTERN(__irq_spi3) +EXTERN(__irq_uart4) +EXTERN(__irq_uart5) +EXTERN(__irq_tim6) +EXTERN(__irq_tim7) +EXTERN(__irq_dma2_channel1) +EXTERN(__irq_dma2_channel2) +EXTERN(__irq_dma2_channel3) +EXTERN(__irq_dma2_channel4_5) diff --git a/STM32F4/variants/black_f407vet6/ld/ram.ld b/STM32F4/variants/black_f407vet6/ld/ram.ld new file mode 100644 index 000000000..b57060c92 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/ld/ram.ld @@ -0,0 +1,19 @@ +/* + * aeroquad32 (STM32F103VET6, high density) linker script for + * RAM builds. + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K + rom (rx) : ORIGIN = 0x08010000, LENGTH = 0K /* ala42 */ +} + +GROUP(libcs3_stm32_high_density.a) + +REGION_ALIAS("REGION_TEXT", ram); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", ram); + +INCLUDE common.inc diff --git a/STM32F4/variants/black_f407vet6/ld/vector_symbols.inc b/STM32F4/variants/black_f407vet6/ld/vector_symbols.inc new file mode 100644 index 000000000..f8519bba4 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/ld/vector_symbols.inc @@ -0,0 +1,78 @@ +EXTERN(__msp_init) +EXTERN(__exc_reset) +EXTERN(__exc_nmi) +EXTERN(__exc_hardfault) +EXTERN(__exc_memmanage) +EXTERN(__exc_busfault) +EXTERN(__exc_usagefault) +EXTERN(__stm32reservedexception7) +EXTERN(__stm32reservedexception8) +EXTERN(__stm32reservedexception9) +EXTERN(__stm32reservedexception10) +EXTERN(__exc_svc) +EXTERN(__exc_debug_monitor) +EXTERN(__stm32reservedexception13) +EXTERN(__exc_pendsv) +EXTERN(__exc_systick) + +EXTERN(__irq_wwdg) +EXTERN(__irq_pvd) +EXTERN(__irq_tamper) +EXTERN(__irq_rtc) +EXTERN(__irq_flash) +EXTERN(__irq_rcc) +EXTERN(__irq_exti0) +EXTERN(__irq_exti1) +EXTERN(__irq_exti2) +EXTERN(__irq_exti3) +EXTERN(__irq_exti4) +EXTERN(__irq_dma1_channel1) +EXTERN(__irq_dma1_channel2) +EXTERN(__irq_dma1_channel3) +EXTERN(__irq_dma1_channel4) +EXTERN(__irq_dma1_channel5) +EXTERN(__irq_dma1_channel6) +EXTERN(__irq_dma1_channel7) +EXTERN(__irq_adc) +EXTERN(__irq_usb_hp_can_tx) +EXTERN(__irq_usb_lp_can_rx0) +EXTERN(__irq_can_rx1) +EXTERN(__irq_can_sce) +EXTERN(__irq_exti9_5) +EXTERN(__irq_tim1_brk) +EXTERN(__irq_tim1_up) +EXTERN(__irq_tim1_trg_com) +EXTERN(__irq_tim1_cc) +EXTERN(__irq_tim2) +EXTERN(__irq_tim3) +EXTERN(__irq_tim4) +EXTERN(__irq_i2c1_ev) +EXTERN(__irq_i2c1_er) +EXTERN(__irq_i2c2_ev) +EXTERN(__irq_i2c2_er) +EXTERN(__irq_spi1) +EXTERN(__irq_spi2) +EXTERN(__irq_usart1) +EXTERN(__irq_usart2) +EXTERN(__irq_usart3) +EXTERN(__irq_exti15_10) +EXTERN(__irq_rtcalarm) +EXTERN(__irq_usbwakeup) + +EXTERN(__irq_tim8_brk) +EXTERN(__irq_tim8_up) +EXTERN(__irq_tim8_trg_com) +EXTERN(__irq_tim8_cc) +EXTERN(__irq_adc3) +EXTERN(__irq_fsmc) +EXTERN(__irq_sdio) +EXTERN(__irq_tim5) +EXTERN(__irq_spi3) +EXTERN(__irq_uart4) +EXTERN(__irq_uart5) +EXTERN(__irq_tim6) +EXTERN(__irq_tim7) +EXTERN(__irq_dma2_channel1) +EXTERN(__irq_dma2_channel2) +EXTERN(__irq_dma2_channel3) +EXTERN(__irq_dma2_channel4_5) diff --git a/STM32F4/variants/black_f407vet6/pins_arduino.h b/STM32F4/variants/black_f407vet6/pins_arduino.h new file mode 100644 index 000000000..3052f2eb2 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/pins_arduino.h @@ -0,0 +1,6 @@ + + + + +// API compatibility +#include "variant.h" \ No newline at end of file diff --git a/STM32F4/variants/black_f407vet6/stm32_isrs.S b/STM32F4/variants/black_f407vet6/stm32_isrs.S new file mode 100644 index 000000000..34e515c08 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/stm32_isrs.S @@ -0,0 +1,323 @@ +/* STM32 ISR weak declarations */ + + .thumb + +/* Default handler for all non-overridden interrupts and exceptions */ + .globl __default_handler + .type __default_handler, %function + +__default_handler: + b . + + .weak __exc_nmi + .globl __exc_nmi + .set __exc_nmi, __default_handler + .weak __exc_hardfault + .globl __exc_hardfault + .set __exc_hardfault, __default_handler + .weak __exc_memmanage + .globl __exc_memmanage + .set __exc_memmanage, __default_handler + .weak __exc_busfault + .globl __exc_busfault + .set __exc_busfault, __default_handler + .weak __exc_usagefault + .globl __exc_usagefault + .set __exc_usagefault, __default_handler + .weak __stm32reservedexception7 + .globl __stm32reservedexception7 + .set __stm32reservedexception7, __default_handler + .weak __stm32reservedexception8 + .globl __stm32reservedexception8 + .set __stm32reservedexception8, __default_handler + .weak __stm32reservedexception9 + .globl __stm32reservedexception9 + .set __stm32reservedexception9, __default_handler + .weak __stm32reservedexception10 + .globl __stm32reservedexception10 + .set __stm32reservedexception10, __default_handler + .weak __exc_svc + .globl __exc_svc + .set __exc_svc, __default_handler + .weak __exc_debug_monitor + .globl __exc_debug_monitor + .set __exc_debug_monitor, __default_handler + .weak __stm32reservedexception13 + .globl __stm32reservedexception13 + .set __stm32reservedexception13, __default_handler + .weak __exc_pendsv + .globl __exc_pendsv + .set __exc_pendsv, __default_handler + .weak __exc_systick + .globl __exc_systick + .set __exc_systick, __default_handler + .weak __irq_wwdg + .globl __irq_wwdg + .set __irq_wwdg, __default_handler + .weak __irq_pvd + .globl __irq_pvd + .set __irq_pvd, __default_handler + .weak __irq_tamper + .globl __irq_tamper + .set __irq_tamper, __default_handler + .weak __irq_rtc + .globl __irq_rtc + .set __irq_rtc, __default_handler + .weak __irq_flash + .globl __irq_flash + .set __irq_flash, __default_handler + .weak __irq_rcc + .globl __irq_rcc + .set __irq_rcc, __default_handler + .weak __irq_exti0 + .globl __irq_exti0 + .set __irq_exti0, __default_handler + .weak __irq_exti1 + .globl __irq_exti1 + .set __irq_exti1, __default_handler + .weak __irq_exti2 + .globl __irq_exti2 + .set __irq_exti2, __default_handler + .weak __irq_exti3 + .globl __irq_exti3 + .set __irq_exti3, __default_handler + .weak __irq_exti4 + .globl __irq_exti4 + .set __irq_exti4, __default_handler + .weak __irq_dma1_channel1 + .globl __irq_dma1_channel1 + .set __irq_dma1_channel1, __default_handler + .weak __irq_dma1_channel2 + .globl __irq_dma1_channel2 + .set __irq_dma1_channel2, __default_handler + .weak __irq_dma1_channel3 + .globl __irq_dma1_channel3 + .set __irq_dma1_channel3, __default_handler + .weak __irq_dma1_channel4 + .globl __irq_dma1_channel4 + .set __irq_dma1_channel4, __default_handler + .weak __irq_dma1_channel5 + .globl __irq_dma1_channel5 + .set __irq_dma1_channel5, __default_handler + .weak __irq_dma1_channel6 + .globl __irq_dma1_channel6 + .set __irq_dma1_channel6, __default_handler + .weak __irq_dma1_channel7 + .globl __irq_dma1_channel7 + .set __irq_dma1_channel7, __default_handler + .weak __irq_adc + .globl __irq_adc + .set __irq_adc, __default_handler + .weak __irq_usb_hp_can_tx + .globl __irq_usb_hp_can_tx + .set __irq_usb_hp_can_tx, __default_handler + .weak __irq_usb_lp_can_rx0 + .globl __irq_usb_lp_can_rx0 + .set __irq_usb_lp_can_rx0, __default_handler + .weak __irq_can_rx1 + .globl __irq_can_rx1 + .set __irq_can_rx1, __default_handler + .weak __irq_can_sce + .globl __irq_can_sce + .set __irq_can_sce, __default_handler + .weak __irq_exti9_5 + .globl __irq_exti9_5 + .set __irq_exti9_5, __default_handler + .weak __irq_tim1_brk + .globl __irq_tim1_brk + .set __irq_tim1_brk, __default_handler + .weak __irq_tim1_up + .globl __irq_tim1_up + .set __irq_tim1_up, __default_handler + .weak __irq_tim1_trg_com + .globl __irq_tim1_trg_com + .set __irq_tim1_trg_com, __default_handler + .weak __irq_tim1_cc + .globl __irq_tim1_cc + .set __irq_tim1_cc, __default_handler + .weak __irq_tim2 + .globl __irq_tim2 + .set __irq_tim2, __default_handler + .weak __irq_tim3 + .globl __irq_tim3 + .set __irq_tim3, __default_handler + .weak __irq_tim4 + .globl __irq_tim4 + .set __irq_tim4, __default_handler + .weak __irq_i2c1_ev + .globl __irq_i2c1_ev + .set __irq_i2c1_ev, __default_handler + .weak __irq_i2c1_er + .globl __irq_i2c1_er + .set __irq_i2c1_er, __default_handler + .weak __irq_i2c2_ev + .globl __irq_i2c2_ev + .set __irq_i2c2_ev, __default_handler + .weak __irq_i2c2_er + .globl __irq_i2c2_er + .set __irq_i2c2_er, __default_handler + .weak __irq_spi1 + .globl __irq_spi1 + .set __irq_spi1, __default_handler + .weak __irq_spi2 + .globl __irq_spi2 + .set __irq_spi2, __default_handler + .weak __irq_usart1 + .globl __irq_usart1 + .set __irq_usart1, __default_handler + .weak __irq_usart2 + .globl __irq_usart2 + .set __irq_usart2, __default_handler + .weak __irq_usart3 + .globl __irq_usart3 + .set __irq_usart3, __default_handler + .weak __irq_exti15_10 + .globl __irq_exti15_10 + .set __irq_exti15_10, __default_handler + .weak __irq_rtcalarm + .globl __irq_rtcalarm + .set __irq_rtcalarm, __default_handler + .weak __irq_usbwakeup + .globl __irq_usbwakeup + .set __irq_usbwakeup, __default_handler +#if defined (STM32_HIGH_DENSITY) + .weak __irq_tim8_brk + .globl __irq_tim8_brk + .set __irq_tim8_brk, __default_handler + .weak __irq_tim8_up + .globl __irq_tim8_up + .set __irq_tim8_up, __default_handler + .weak __irq_tim8_trg_com + .globl __irq_tim8_trg_com + .set __irq_tim8_trg_com, __default_handler + .weak __irq_tim8_cc + .globl __irq_tim8_cc + .set __irq_tim8_cc, __default_handler + .weak __irq_adc3 + .globl __irq_adc3 + .set __irq_adc3, __default_handler + .weak __irq_fsmc + .globl __irq_fsmc + .set __irq_fsmc, __default_handler + .weak __irq_sdio + .globl __irq_sdio + .set __irq_sdio, __default_handler + .weak __irq_tim5 + .globl __irq_tim5 + .set __irq_tim5, __default_handler + .weak __irq_spi3 + .globl __irq_spi3 + .set __irq_spi3, __default_handler + .weak __irq_uart4 + .globl __irq_uart4 + .set __irq_uart4, __default_handler + .weak __irq_uart5 + .globl __irq_uart5 + .set __irq_uart5, __default_handler + .weak __irq_tim6 + .globl __irq_tim6 + .set __irq_tim6, __default_handler + .weak __irq_tim7 + .globl __irq_tim7 + .set __irq_tim7, __default_handler + .weak __irq_dma2_channel1 + .globl __irq_dma2_channel1 + .set __irq_dma2_channel1, __default_handler + .weak __irq_dma2_channel2 + .globl __irq_dma2_channel2 + .set __irq_dma2_channel2, __default_handler + .weak __irq_dma2_channel3 + .globl __irq_dma2_channel3 + .set __irq_dma2_channel3, __default_handler + .weak __irq_dma2_channel4_5 + .globl __irq_dma2_channel4_5 + .set __irq_dma2_channel4_5, __default_handler +#endif /* STM32_HIGH_DENSITY */ + + .weak __irq_DMA2_Stream4_IRQHandler + .globl __irq_DMA2_Stream4_IRQHandler + .set __irq_DMA2_Stream4_IRQHandler, __default_handler + + .weak __irq_ETH_IRQHandler + .globl __irq_ETH_IRQHandler + .set __irq_ETH_IRQHandler, __default_handler + + .weak __irq_ETH_WKUP_IRQHandler + .globl __irq_ETH_WKUP_IRQHandler + .set __irq_ETH_WKUP_IRQHandler, __default_handler + + .weak __irq_CAN2_TX_IRQHandler + .globl __irq_CAN2_TX_IRQHandler + .set __irq_CAN2_TX_IRQHandler, __default_handler + + .weak __irq_CAN2_RX0_IRQHandler + .globl __irq_CAN2_RX0_IRQHandler + .set __irq_CAN2_RX0_IRQHandler, __default_handler + + .weak __irq_CAN2_RX1_IRQHandler + .globl __irq_CAN2_RX1_IRQHandler + .set __irq_CAN2_RX1_IRQHandler, __default_handler + + .weak __irq_CAN2_SCE_IRQHandler + .globl __irq_CAN2_SCE_IRQHandler + .set __irq_CAN2_SCE_IRQHandler, __default_handler + + .weak __irq_OTG_FS_IRQHandler + .globl __irq_OTG_FS_IRQHandler + .set __irq_OTG_FS_IRQHandler, __default_handler + + .weak __irq_DMA2_Stream5_IRQHandler + .globl __irq_DMA2_Stream5_IRQHandler + .set __irq_DMA2_Stream5_IRQHandler, __default_handler + + .weak __irq_DMA2_Stream6_IRQHandler + .globl __irq_DMA2_Stream6_IRQHandler + .set __irq_DMA2_Stream6_IRQHandler, __default_handler + + .weak __irq_DMA2_Stream7_IRQHandler + .globl __irq_DMA2_Stream7_IRQHandler + .set __irq_DMA2_Stream7_IRQHandler, __default_handler + + .weak __irq_USART6_IRQHandler + .globl __irq_USART6_IRQHandler + .set __irq_USART6_IRQHandler, __default_handler + + .weak __irq_I2C3_EV_IRQHandler + .globl __irq_I2C3_EV_IRQHandler + .set __irq_I2C3_EV_IRQHandler, __default_handler + + .weak __irq_I2C3_ER_IRQHandler + .globl __irq_I2C3_ER_IRQHandler + .set __irq_I2C3_ER_IRQHandler, __default_handler + + .weak __irq_OTG_HS_EP1_OUT_IRQHandler + .globl __irq_OTG_HS_EP1_OUT_IRQHandler + .set __irq_OTG_HS_EP1_OUT_IRQHandler, __default_handler + + .weak __irq_OTG_HS_EP1_IN_IRQHandler + .globl __irq_OTG_HS_EP1_IN_IRQHandler + .set __irq_OTG_HS_EP1_IN_IRQHandler, __default_handler + + .weak __irq_OTG_HS_WKUP_IRQHandler + .globl __irq_OTG_HS_WKUP_IRQHandler + .set __irq_OTG_HS_WKUP_IRQHandler, __default_handler + + .weak __irq_OTG_HS_IRQHandler + .globl __irq_OTG_HS_IRQHandler + .set __irq_OTG_HS_IRQHandler, __default_handler + + .weak __irq_DCMI_IRQHandler + .globl __irq_DCMI_IRQHandler + .set __irq_DCMI_IRQHandler, __default_handler + + .weak __irq_CRYP_IRQHandler + .globl __irq_CRYP_IRQHandler + .set __irq_CRYP_IRQHandler, __default_handler + + .weak __irq_HASH_RNG_IRQHandler + .globl __irq_HASH_RNG_IRQHandler + .set __irq_HASH_RNG_IRQHandler, __default_handler + + .weak __irq_FPU_IRQHandler + .globl __irq_FPU_IRQHandler + .set __irq_FPU_IRQHandler, __default_handler diff --git a/STM32F4/variants/black_f407vet6/stm32_vector_table.S b/STM32F4/variants/black_f407vet6/stm32_vector_table.S new file mode 100644 index 000000000..9f08d6669 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/stm32_vector_table.S @@ -0,0 +1,113 @@ +/* STM32 vector table */ + + .section ".stm32.interrupt_vector" + + .globl __stm32_vector_table + .type __stm32_vector_table, %object + +__stm32_vector_table: +/* CM3 core interrupts */ + .long __msp_init + .long __exc_reset + .long __exc_nmi + .long __exc_hardfault + .long __exc_memmanage + .long __exc_busfault + .long __exc_usagefault + .long __stm32reservedexception7 + .long __stm32reservedexception8 + .long __stm32reservedexception9 + .long __stm32reservedexception10 + .long __exc_svc + .long __exc_debug_monitor + .long __stm32reservedexception13 + .long __exc_pendsv + .long __exc_systick +/* Peripheral interrupts */ + .long __irq_wwdg + .long __irq_pvd + .long __irq_tamper + .long __irq_rtc + .long __irq_flash + .long __irq_rcc + .long __irq_exti0 + .long __irq_exti1 + .long __irq_exti2 + .long __irq_exti3 + .long __irq_exti4 + .long __irq_dma1_channel1 + .long __irq_dma1_channel2 + .long __irq_dma1_channel3 + .long __irq_dma1_channel4 + .long __irq_dma1_channel5 + .long __irq_dma1_channel6 + .long __irq_dma1_channel7 + .long __irq_adc + .long __irq_usb_hp_can_tx + .long __irq_usb_lp_can_rx0 + .long __irq_can_rx1 + .long __irq_can_sce + .long __irq_exti9_5 + .long __irq_tim1_brk + .long __irq_tim1_up + .long __irq_tim1_trg_com + .long __irq_tim1_cc + .long __irq_tim2 + .long __irq_tim3 + .long __irq_tim4 + .long __irq_i2c1_ev + .long __irq_i2c1_er + .long __irq_i2c2_ev + .long __irq_i2c2_er + .long __irq_spi1 + .long __irq_spi2 + .long __irq_usart1 + .long __irq_usart2 + .long __irq_usart3 + .long __irq_exti15_10 + .long __irq_rtcalarm + .long __irq_usbwakeup +#if defined (STM32_HIGH_DENSITY) + .long __irq_tim8_brk + .long __irq_tim8_up + .long __irq_tim8_trg_com + .long __irq_tim8_cc + .long __irq_adc3 + .long __irq_fsmc + .long __irq_sdio + .long __irq_tim5 + .long __irq_spi3 + .long __irq_uart4 + .long __irq_uart5 + .long __irq_tim6 + .long __irq_tim7 + .long __irq_dma2_channel1 + .long __irq_dma2_channel2 + .long __irq_dma2_channel3 + .long __irq_dma2_channel4_5 +#endif /* STM32_HIGH_DENSITY */ + + .long __irq_DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .long __irq_ETH_IRQHandler /* Ethernet */ + .long __irq_ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .long __irq_CAN2_TX_IRQHandler /* CAN2 TX */ + .long __irq_CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .long __irq_CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .long __irq_CAN2_SCE_IRQHandler /* CAN2 SCE */ + .long __irq_OTG_FS_IRQHandler /* USB OTG FS */ + .long __irq_DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .long __irq_DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .long __irq_DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .long __irq_USART6_IRQHandler /* USART6 */ + .long __irq_I2C3_EV_IRQHandler /* I2C3 event */ + .long __irq_I2C3_ER_IRQHandler /* I2C3 error */ + .long __irq_OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .long __irq_OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .long __irq_OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .long __irq_OTG_HS_IRQHandler /* USB OTG HS */ + .long __irq_DCMI_IRQHandler /* DCMI */ + .long __irq_CRYP_IRQHandler /* CRYP crypto */ + .long __irq_HASH_RNG_IRQHandler /* Hash and Rng */ + .long __irq_FPU_IRQHandler /* FPU */ + + .size __stm32_vector_table, . - __stm32_vector_table diff --git a/STM32F4/variants/black_f407vet6/variant.h b/STM32F4/variants/black_f407vet6/variant.h new file mode 100644 index 000000000..cd0a96de4 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/variant.h @@ -0,0 +1,21 @@ +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + + +#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) +#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) +#define portOutputRegister(port) ( &(port->regs->ODR) ) +#define portInputRegister(port) ( &(port->regs->IDR) ) + +#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) ) +#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) ) + +#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) ) + +static const uint8_t SS = BOARD_SPI1_NSS_PIN; +static const uint8_t SS1 = BOARD_SPI2_NSS_PIN; +static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; +static const uint8_t MISO = BOARD_SPI1_MISO_PIN; +static const uint8_t SCK = BOARD_SPI1_SCK_PIN; + +#endif /* _VARIANT_ARDUINO_STM32_ */ \ No newline at end of file diff --git a/STM32F4/variants/black_f407vet6/wirish/start.S b/STM32F4/variants/black_f407vet6/wirish/start.S new file mode 100644 index 000000000..8b181aa99 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/wirish/start.S @@ -0,0 +1,57 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + + .text + .code 16 + .thumb_func + + .globl __start__ + .type __start__, %function +__start__: + .fnstart + ldr r1,=__msp_init + mov sp,r1 + ldr r1,=start_c + bx r1 + .pool + .cantunwind + .fnend diff --git a/STM32F4/variants/black_f407vet6/wirish/start_c.c b/STM32F4/variants/black_f407vet6/wirish/start_c.c new file mode 100644 index 000000000..655fefb88 --- /dev/null +++ b/STM32F4/variants/black_f407vet6/wirish/start_c.c @@ -0,0 +1,95 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * Copyright (c) 2006, 2007 CodeSourcery Inc + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +extern void __libc_init_array(void); + +extern int main(int, char**, char**); + +extern void exit(int) __attribute__((noreturn, weak)); + +/* The linker must ensure that these are at least 4-byte aligned. */ +extern char __data_start__, __data_end__; +extern char __bss_start__, __bss_end__; + +struct rom_img_cfg { + int *img_start; +}; + +extern char _lm_rom_img_cfgp; + +void __attribute__((noreturn)) start_c(void) { + struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; + int *src = img_cfg->img_start; + int *dst = (int*)&__data_start__; + int exit_code; + + /* Initialize .data, if necessary. */ + if (src != dst) { + int *end = (int*)&__data_end__; + while (dst < end) { + *dst++ = *src++; + } + } + + /* Zero .bss. */ + dst = (int*)&__bss_start__; + while (dst < (int*)&__bss_end__) { + *dst++ = 0; + } + + /* Run initializers. */ + __libc_init_array(); + + /* Jump to main. */ + exit_code = main(0, 0, 0); + if (exit) { + exit(exit_code); + } + + /* If exit is NULL, make sure we don't return. */ + for (;;) + continue; +} From 5c9dc5ebfcfbaed297c66fae38b3b41f6fe9fc9d Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sat, 15 Apr 2017 12:35:06 +0200 Subject: [PATCH 049/307] renamed target from "black" to generic f407v + removed unused files --- STM32F4/boards.txt | 52 +- STM32F4/cores/maple/boards.cpp | 2 +- STM32F4/cores/maple/boards.h | 4 +- STM32F4/cores/maple/io.h | 4 +- STM32F4/cores/maple/libmaple/HardwareSPI.cpp | 424 ----------- STM32F4/cores/maple/libmaple/HardwareSPI.h | 279 ------- STM32F4/cores/maple/libmaple/dmaF1.c | 383 ---------- STM32F4/cores/maple/libmaple/dmaF1.h | 453 ----------- STM32F4/cores/maple/libmaple/dmaF2.c | 241 ------ STM32F4/cores/maple/libmaple/dmaF2.h | 270 ------- STM32F4/cores/maple/libmaple/gpio.c | 36 - STM32F4/cores/maple/libmaple/gpioF1.c | 200 ----- STM32F4/cores/maple/libmaple/gpioF1.h | 530 ------------- STM32F4/cores/maple/libmaple/gpioF2.c | 224 ------ STM32F4/cores/maple/libmaple/gpioF2.h | 550 -------------- STM32F4/cores/maple/libmaple/rcc.c | 37 - STM32F4/cores/maple/libmaple/rccF1.c | 233 ------ STM32F4/cores/maple/libmaple/rccF1.h | 572 -------------- STM32F4/cores/maple/libmaple/rccF2.c | 707 ------------------ STM32F4/cores/maple/libmaple/rccF2.h | 642 ---------------- STM32F4/cores/maple/libmaple/usbF4/usb.c | 4 +- STM32F4/cores/maple/wirish_types.h | 2 +- .../black_f4.h.old} | 2 +- .../generic_f407v.cpp} | 8 +- .../variants/generic_f407v/generic_f407v.h | 130 ++++ .../ld/common.inc | 0 .../ld/extra_libs.inc | 0 .../ld/flash.ld | 0 .../ld/jtag.ld | 0 .../ld/names.inc | 0 .../ld/ram.ld | 0 .../ld/vector_symbols.inc | 0 .../pins_arduino.h | 0 .../stm32_isrs.S | 0 .../stm32_vector_table.S | 0 .../variant.h | 0 .../wirish/start.S | 0 .../wirish/start_c.c | 0 38 files changed, 169 insertions(+), 5820 deletions(-) delete mode 100644 STM32F4/cores/maple/libmaple/HardwareSPI.cpp delete mode 100644 STM32F4/cores/maple/libmaple/HardwareSPI.h delete mode 100644 STM32F4/cores/maple/libmaple/dmaF1.c delete mode 100644 STM32F4/cores/maple/libmaple/dmaF1.h delete mode 100644 STM32F4/cores/maple/libmaple/dmaF2.c delete mode 100644 STM32F4/cores/maple/libmaple/dmaF2.h delete mode 100644 STM32F4/cores/maple/libmaple/gpio.c delete mode 100644 STM32F4/cores/maple/libmaple/gpioF1.c delete mode 100644 STM32F4/cores/maple/libmaple/gpioF1.h delete mode 100644 STM32F4/cores/maple/libmaple/gpioF2.c delete mode 100644 STM32F4/cores/maple/libmaple/gpioF2.h delete mode 100644 STM32F4/cores/maple/libmaple/rcc.c delete mode 100644 STM32F4/cores/maple/libmaple/rccF1.c delete mode 100644 STM32F4/cores/maple/libmaple/rccF1.h delete mode 100644 STM32F4/cores/maple/libmaple/rccF2.c delete mode 100644 STM32F4/cores/maple/libmaple/rccF2.h rename STM32F4/variants/{black_f407vet6/black_f4.h => generic_f407v/black_f4.h.old} (99%) rename STM32F4/variants/{black_f407vet6/black_f4.cpp => generic_f407v/generic_f407v.cpp} (99%) create mode 100644 STM32F4/variants/generic_f407v/generic_f407v.h rename STM32F4/variants/{black_f407vet6 => generic_f407v}/ld/common.inc (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/ld/extra_libs.inc (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/ld/flash.ld (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/ld/jtag.ld (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/ld/names.inc (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/ld/ram.ld (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/ld/vector_symbols.inc (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/pins_arduino.h (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/stm32_isrs.S (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/stm32_vector_table.S (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/variant.h (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/wirish/start.S (100%) rename STM32F4/variants/{black_f407vet6 => generic_f407v}/wirish/start_c.c (100%) diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 3ff182c7b..df9f2b41a 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -30,32 +30,32 @@ discovery_f407.build.error_led_pin=14 discovery_f407.build.board=STM32DiscoveryF407 ############################################################## -black_f407vet6.name=STM32 Black F407VET6 - -black_f407vet6.upload.tool=stlink_upload -black_f407vet6.upload.protocol=stlink - -black_f407vet6.upload.file_type=bin -black_f407vet6.upload.ram.maximum_size=65535 -black_f407vet6.upload.flash.maximum_size=514288 -black_f407vet6.upload.maximum_size=514288 - -#black_f407vet6.upload.usbID=0483:3748 -#black_f407vet6.upload.altID=1 -#black_f407vet6.upload.auto_reset=true - -black_f407vet6.build.mcu=cortex-m4 -black_f407vet6.build.f_cpu=168000000L -black_f407vet6.build.core=maple -black_f407vet6.build.extra_flags=-mthumb -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_black_f4 -black_f407vet6.build.ldscript=ld/jtag.ld -black_f407vet6.build.variant=black_f407vet6 -black_f407vet6.build.variant_system_lib=lib_f407.a -black_f407vet6.build.vect=VECT_TAB_BASE -black_f407vet6.build.density=STM32_HIGH_DENSITY -black_f407vet6.build.error_led_port=GPIOA -black_f407vet6.build.error_led_pin=7 -black_f407vet6.build.board=STM32BlackF407VET6 +generic_f407v.name=Generic STM32F407V series + +generic_f407v.upload.tool=stlink_upload +generic_f407v.upload.protocol=stlink + +generic_f407v.upload.file_type=bin +generic_f407v.upload.ram.maximum_size=131072 +generic_f407v.upload.flash.maximum_size=514288 +generic_f407v.upload.maximum_size=514288 + +#generic_f407v.upload.usbID=0483:3748 +#generic_f407v.upload.altID=1 +#generic_f407v.upload.auto_reset=true + +generic_f407v.build.mcu=cortex-m4 +generic_f407v.build.f_cpu=168000000L +generic_f407v.build.core=maple +generic_f407v.build.extra_flags=-mthumb -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_generic_f407v +generic_f407v.build.ldscript=ld/jtag.ld +generic_f407v.build.variant=generic_f407v +generic_f407v.build.variant_system_lib=lib_f407.a +generic_f407v.build.vect=VECT_TAB_BASE +generic_f407v.build.density=STM32_HIGH_DENSITY +generic_f407v.build.error_led_port=GPIOA +generic_f407v.build.error_led_pin=7 +generic_f407v.build.board=STM32GenericF407VET6 ############################################################## stm32f4stamp.name=STM32F4Stamp F405 diff --git a/STM32F4/cores/maple/boards.cpp b/STM32F4/cores/maple/boards.cpp index f9bfd5a31..c8ba97894 100644 --- a/STM32F4/cores/maple/boards.cpp +++ b/STM32F4/cores/maple/boards.cpp @@ -67,7 +67,7 @@ void init(void) { setupADC(); setupTimers(); - //setupUSB(); + setupUSB(); } /* You could farm this out to the files in boards/ if e.g. it takes diff --git a/STM32F4/cores/maple/boards.h b/STM32F4/cores/maple/boards.h index 5e0aae3b8..e123341ed 100644 --- a/STM32F4/cores/maple/boards.h +++ b/STM32F4/cores/maple/boards.h @@ -140,8 +140,8 @@ bool boardUsesPin(uint8 pin); #include "aeroquad32mini.h" #elif defined(BOARD_discovery_f4) #include "discovery_f4.h" -#elif defined(BOARD_black_f4) -#include "black_f4.h" +#elif defined(BOARD_generic_f407v) +#include "generic_f407v.h" #elif defined(BOARD_freeflight) #include "freeflight.h" #else diff --git a/STM32F4/cores/maple/io.h b/STM32F4/cores/maple/io.h index d4d1c25cd..1208be63f 100644 --- a/STM32F4/cores/maple/io.h +++ b/STM32F4/cores/maple/io.h @@ -180,7 +180,7 @@ static inline void toggleLED() { * accomplished portably over all LeafLabs boards by calling * pinMode(BOARD_BUTTON_PIN, INPUT). * - * @param button - one of available on-board buttons (up to 3 for black F4) + * @param button - one of available on-board buttons (up to 3 for generic F4) * * @see pinMode() */ @@ -198,7 +198,7 @@ uint8 isButtonPressed(uint8_t button); * button is pressed. If timeout_millis is left out (or 0), wait * forever. * - * @param button - one of available on-board buttons (up to 3 for black F4) + * @param button - one of available on-board buttons (up to 3 for generic F4) * * @return true, if the button was pressed; false, if the timeout was * reached. diff --git a/STM32F4/cores/maple/libmaple/HardwareSPI.cpp b/STM32F4/cores/maple/libmaple/HardwareSPI.cpp deleted file mode 100644 index a5b4711be..000000000 --- a/STM32F4/cores/maple/libmaple/HardwareSPI.cpp +++ /dev/null @@ -1,424 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @author Marti Bolivar - * @brief Wirish SPI implementation. - */ - -#include "HardwareSPI.h" - -#include "timer.h" -#include "util.h" -#include "rcc.h" - -#include "wirish.h" -#include "boards.h" - -struct spi_pins { - uint8 nss; - uint8 sck; - uint8 miso; - uint8 mosi; -}; - -static const spi_pins* dev_to_spi_pins(spi_dev *dev); - -static void enable_device(spi_dev *dev, - bool as_master, - SPIFrequency frequency, - spi_cfg_flag endianness, - spi_mode mode); - -static const spi_pins board_spi_pins[] __FLASH__ = { - {BOARD_SPI1_NSS_PIN, - BOARD_SPI1_SCK_PIN, - BOARD_SPI1_MISO_PIN, - BOARD_SPI1_MOSI_PIN}, -#ifdef BOARD_SPI2_NSS_PIN - {BOARD_SPI2_NSS_PIN, - BOARD_SPI2_SCK_PIN, - BOARD_SPI2_MISO_PIN, - BOARD_SPI2_MOSI_PIN}, -#endif -#ifdef STM32_HIGH_DENSITY - {BOARD_SPI3B_NSS_PIN, - BOARD_SPI3B_SCK_PIN, - BOARD_SPI3B_MISO_PIN, - BOARD_SPI3B_MOSI_PIN}, -#endif -#ifdef STM32F4 - {BOARD_SPI3B_NSS_PIN, - BOARD_SPI3B_SCK_PIN, - BOARD_SPI3B_MISO_PIN, - BOARD_SPI3B_MOSI_PIN}, -#endif -}; - - -/* - * Constructor - */ - -HardwareSPI::HardwareSPI(uint32 spi_num) { - switch (spi_num) { - case 1: - this->spi_d = SPI1; - break; - case 2: - this->spi_d = SPI2; - break; -#ifdef STM32_HIGH_DENSITY - case 3: - this->spi_d = SPI3; - break; -#endif -#ifdef STM32F4 -// case 4: -// this->spi_d = SPI4; -// break; -#endif - default: - ASSERT(0); - } -} - -/* - * Set up/tear down - */ - -void HardwareSPI::begin(SPIFrequency frequency, uint32 bitOrder, uint32 mode) { - if (mode >= 4) { - ASSERT(0); - return; - } - spi_cfg_flag end = bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB; - spi_mode m = (spi_mode)mode; - enable_device(this->spi_d, true, frequency, end, m); -} - -void HardwareSPI::begin(void) { - this->begin(SPI_1_125MHZ, MSBFIRST, 0); -} - -void HardwareSPI::beginSlave(uint32 bitOrder, uint32 mode) { - if (mode >= 4) { - ASSERT(0); - return; - } - spi_cfg_flag end = bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB; - spi_mode m = (spi_mode)mode; - enable_device(this->spi_d, false, (SPIFrequency)0, end, m); -} - -void HardwareSPI::beginSlave(void) { - this->beginSlave(MSBFIRST, 0); -} - - -/* -void HardwareSPI::beginTransaction(uint8_t pin, SPISettings settings) -{ -// this->begin(settings.clock, settings.bitOrder, settings.dataMode); - this->begin(SPI_1_125MHZ, settings.bitOrder, settings.dataMode); -} -*/ - -void HardwareSPI::end(void) { - if (!spi_is_enabled(this->spi_d)) { - return; - } - - // Follows RM0008's sequence for disabling a SPI in master/slave - // full duplex mode. - while (spi_is_rx_nonempty(this->spi_d)) { - // FIXME [0.1.0] remove this once you have an interrupt based driver - volatile uint16 rx __attribute__((unused)) = spi_rx_reg(this->spi_d); - } - while (!spi_is_tx_empty(this->spi_d)) - ; - while (spi_is_busy(this->spi_d)) - ; - spi_peripheral_disable(this->spi_d); -} - -/* - * I/O - */ - -uint8 HardwareSPI::read(void) { - uint8 buf[1]; - this->read(buf, 1); - return buf[0]; -} - -void HardwareSPI::read(uint8 *buf, uint32 len) { - uint32 rxed = 0; - while (rxed < len) { - while (!spi_is_rx_nonempty(this->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(this->spi_d); - } -} - -#if 0 -void HardwareSPI::readMaster(uint8 *buf, uint32 len) { - uint32 rxed = 0; - while (rxed < len) { - spi_tx_reg(this->spi_d, 0xff); - while (!spi_is_rx_nonempty(this->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(this->spi_d); - buf[rxed++] = this->spi_d->regs->DR; - } -} -#endif -void HardwareSPI::readMaster(uint8 *buf, uint32 len) { - spi_reg_map *r = this->spi_d->regs; - uint32 rxed = 0; - while (rxed < len) { - r->DR = 0xff; - while (!(r->SR & SPI_SR_RXNE)) - ; - buf[rxed++] = r->DR; - } -} - - -void HardwareSPI::waitReady() { - while (!spi_is_rx_nonempty(this->spi_d)) - ; -} - -void HardwareSPI::write(uint8 byte) { - this->write(&byte, 1); -} - -void HardwareSPI::write(const uint8 *data, uint32 length) { - uint32 txed = 0; - while (txed < length) { - txed += spi_tx(this->spi_d, data + txed, length - txed); - } -} - -uint8 HardwareSPI::transfer(uint8 byte) { - this->write(byte); - return this->read(); -} - -/* - * Pin accessors - */ - -uint8 HardwareSPI::misoPin(void) { - return dev_to_spi_pins(this->spi_d)->miso; -} - -uint8 HardwareSPI::mosiPin(void) { - return dev_to_spi_pins(this->spi_d)->mosi; -} - -uint8 HardwareSPI::sckPin(void) { - return dev_to_spi_pins(this->spi_d)->sck; -} - -uint8 HardwareSPI::nssPin(void) { - return dev_to_spi_pins(this->spi_d)->nss; -} - -/* - * Deprecated functions - */ - -uint8 HardwareSPI::send(uint8 data) { - uint8 buf[] = {data}; - return this->send(buf, 1); -} - -#if 1 -uint8 HardwareSPI::send(const uint8 *buf, uint32 len) { - uint32 txed = 0; - uint8 ret = 0; - while (txed < len) { - this->write(buf[txed++]); - ret = this->read(); - } - return ret; -} -#else -// this does not work for an unknown reason -uint8 HardwareSPI::send(const uint8 *buf, uint32 len) { - volatile uint32 *dr = &(this->spi_d->regs->DR); - volatile uint32 *sr = &(this->spi_d->regs->SR); - uint32 txed = 0; - uint32 rx=0; - while (txed < len) { - //while (!(*sr & SPI_SR_TXE)) - // ; - //*dr = buf[txed++]; - this->write(buf[txed++]); - - while (!(*sr & SPI_SR_RXNE)) - ; - rx = *dr; - //rx = this->read(); - } - - return rx; -} -#endif - -uint8 HardwareSPI::recv(void) { - return this->read(); -} - -/* - * Auxiliary functions - */ - -static void configure_gpios(spi_dev *dev, bool as_master); -static spi_baud_rate determine_baud_rate(spi_dev *dev, SPIFrequency freq); - -static const spi_pins* dev_to_spi_pins(spi_dev *dev) { - switch (dev->clk_id) { - case RCC_SPI1: return board_spi_pins; - case RCC_SPI2: return board_spi_pins + 1; -#ifdef STM32_HIGH_DENSITY - case RCC_SPI3: return board_spi_pins + 2; -#endif -#ifdef STM32F4 - case RCC_SPI4: return board_spi_pins + 3; -#endif - default: return NULL; - } -} - -/* Enables the device in master or slave full duplex mode. If you - * change this code, you must ensure that appropriate changes are made - * to HardwareSPI::end(). */ -static void enable_device(spi_dev *dev, - bool as_master, - SPIFrequency freq, - spi_cfg_flag endianness, - spi_mode mode) { - spi_baud_rate baud = determine_baud_rate(dev, freq); - uint32 cfg_flags = (endianness | SPI_DFF_8_BIT | SPI_SW_SLAVE | - (as_master ? SPI_SOFT_SS : 0)); - - spi_init(dev); - configure_gpios(dev, as_master); - if (as_master) { - spi_master_enable(dev, baud, mode, cfg_flags); - } else { - spi_slave_enable(dev, mode, cfg_flags); - } -} - -static void disable_pwm(const stm32_pin_info *i) { - if (i->timer_device) { - timer_set_mode(i->timer_device, i->timer_channel, TIMER_DISABLED); - } -} - -static void configure_gpios(spi_dev *dev, bool as_master) { - const spi_pins *pins = dev_to_spi_pins(dev); - - if (!pins) { - return; - } - - const stm32_pin_info *nssi = (pins->nss >= 0) ? &PIN_MAP[pins->nss] : NULL; - const stm32_pin_info *scki = &PIN_MAP[pins->sck]; - const stm32_pin_info *misoi = &PIN_MAP[pins->miso]; - const stm32_pin_info *mosii = &PIN_MAP[pins->mosi]; - - if(nssi) { - disable_pwm(nssi); - } - disable_pwm(scki); - disable_pwm(misoi); - disable_pwm(mosii); - -#ifdef STM32F4 - if(dev->clk_id <= RCC_SPI2) { - if(nssi) { - if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 5); - } - } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 5); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 5); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 5); - } else { - if(nssi) { - if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 6); - } - } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 6); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 6); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 6); - } -#endif - - if(nssi) { - spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, - scki->gpio_device, scki->gpio_bit, - misoi->gpio_device, misoi->gpio_bit, - mosii->gpio_device, mosii->gpio_bit); - } else { - spi_config_gpios(dev, as_master, NULL, -1, - scki->gpio_device, scki->gpio_bit, - misoi->gpio_device, misoi->gpio_bit, - mosii->gpio_device, mosii->gpio_bit); - } -} - -static const spi_baud_rate baud_rates[MAX_SPI_FREQS] __FLASH__ = { - SPI_BAUD_PCLK_DIV_2, - SPI_BAUD_PCLK_DIV_4, - SPI_BAUD_PCLK_DIV_8, - SPI_BAUD_PCLK_DIV_16, - SPI_BAUD_PCLK_DIV_32, - SPI_BAUD_PCLK_DIV_64, - SPI_BAUD_PCLK_DIV_128, - SPI_BAUD_PCLK_DIV_256, -}; - -/* - * Note: This assumes you're on a LeafLabs-style board - * (CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). - */ -static spi_baud_rate determine_baud_rate(spi_dev *dev, SPIFrequency freq) { - if (rcc_dev_clk(dev->clk_id) == RCC_APB2 && freq == SPI_140_625KHZ) { - /* APB2 peripherals are too fast for 140.625 KHz */ - ASSERT(0); - return (spi_baud_rate)~0; - } - return (rcc_dev_clk(dev->clk_id) == RCC_APB2 ? - baud_rates[freq + 1] : - baud_rates[freq]); -} diff --git a/STM32F4/cores/maple/libmaple/HardwareSPI.h b/STM32F4/cores/maple/libmaple/HardwareSPI.h deleted file mode 100644 index 327f29da1..000000000 --- a/STM32F4/cores/maple/libmaple/HardwareSPI.h +++ /dev/null @@ -1,279 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file HardwareSPI.h - * @brief High-level SPI interface - * - * This is a "bare essentials" polling driver for now. - */ - -/* TODO [0.1.0] Remove deprecated methods. */ - -#include "libmaple_types.h" -#include "spi.h" - -#include "boards.h" -#include "wirish.h" - -#ifndef _HARDWARESPI_H_ -#define _HARDWARESPI_H_ - -/** - * @brief Defines the possible SPI communication speeds. - */ -typedef enum SPIFrequency { - SPI_18MHZ = 0, /**< 18 MHz */ - SPI_9MHZ = 1, /**< 9 MHz */ - SPI_4_5MHZ = 2, /**< 4.5 MHz */ - SPI_2_25MHZ = 3, /**< 2.25 MHz */ - SPI_1_125MHZ = 4, /**< 1.125 MHz */ - SPI_562_500KHZ = 5, /**< 562.500 KHz */ - SPI_281_250KHZ = 6, /**< 281.250 KHz */ - SPI_140_625KHZ = 7, /**< 140.625 KHz */ -} SPIFrequency; - -#define MAX_SPI_FREQS 8 - -#if CYCLES_PER_MICROSECOND != 72 -/* TODO [0.2.0?] something smarter than this */ -//#warning "Unexpected clock speed; SPI frequency calculation will be incorrect" -#endif - - -//#define BOARD_SPI_DEFAULT_SS PC13 -#define BOARD_SPI_DEFAULT_SS PB0 -#define SPI_MODE0 SPI_MODE_0 -#define SPI_MODE1 SPI_MODE_1 -#define SPI_MODE2 SPI_MODE_2 -#define SPI_MODE3 SPI_MODE_3 - -/* -class SPISettings { -public: - SPISettings(uint32 clock, BitOrder bitOrder, uint8 dataMode) { - if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, dataMode); - } else { - init_MightInline(clock, bitOrder, dataMode); - } - } - SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } -private: - void init_MightInline(uint32 clock, BitOrder bitOrder, uint8 dataMode) { - init_AlwaysInline(clock, bitOrder, dataMode); - } - void init_AlwaysInline(uint32 clock, BitOrder bitOrder, uint8 dataMode) __attribute__((__always_inline__)) { - this->clock = clock; - this->bitOrder = bitOrder; - this->dataMode = dataMode; - } - uint32 clock; - BitOrder bitOrder; - uint8 dataMode; - friend class HardwareSPI; -}; -*/ - - -/** - * @brief Wirish SPI interface. - * - * This implementation uses software slave management, so the caller - * is responsible for controlling the slave select line. - */ -class HardwareSPI { -public: - /** - * @param spiPortNumber Number of the SPI port to manage. - */ - HardwareSPI(uint32 spiPortNumber); - - /* - * Set up/tear down - */ - - /** - * @brief Turn on a SPI port and set its GPIO pin modes for use as master. - * - * SPI port is enabled in full duplex mode, with software slave management. - * - * @param frequency Communication frequency - * @param bitOrder Either LSBFIRST (little-endian) or MSBFIRST (big-endian) - * @param mode SPI mode to use, one of SPI_MODE_0, SPI_MODE_1, - * SPI_MODE_2, and SPI_MODE_3. - */ - void begin(SPIFrequency frequency, uint32 bitOrder, uint32 mode); - - /** - * @brief Equivalent to begin(SPI_1_125MHZ, MSBFIRST, 0). - */ - void begin(void); - - /** - * @brief Turn on a SPI port and set its GPIO pin modes for use as a slave. - * - * SPI port is enabled in full duplex mode, with software slave management. - * - * @param bitOrder Either LSBFIRST (little-endian) or MSBFIRST(big-endian) - * @param mode SPI mode to use - */ - void beginSlave(uint32 bitOrder, uint32 mode); - - /** - * @brief Equivalent to beginSlave(MSBFIRST, 0). - */ - void beginSlave(void); - - /** - * @brief Disables the SPI port, but leaves its GPIO pin modes unchanged. - */ - void end(void); - - /* - * I/O - */ - - /** - * @brief Return the next unread byte. - * - * If there is no unread byte waiting, this function will block - * until one is received. - */ - uint8 read(void); - - /** - * @brief Read length bytes, storing them into buffer. - * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This - * function will block until the desired number of - * bytes have been read. - */ - void read(uint8 *buffer, uint32 length); - - /** - * @brief Read length bytes, storing them into buffer. - * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This - * function will block until the desired number of - * bytes have been read. - */ - void readMaster(uint8 *buffer, uint32 length); - - - void waitReady(); - /** - * @brief Transmit a byte. - * @param data Byte to transmit. - */ - void write(uint8 data); - - /** - * @brief Transmit multiple bytes. - * @param buffer Bytes to transmit. - * @param length Number of bytes in buffer to transmit. - */ - void write(const uint8 *buffer, uint32 length); - - /** - * @brief Transmit a byte, then return the next unread byte. - * - * This function transmits before receiving. - * - * @param data Byte to transmit. - * @return Next unread byte. - */ - uint8 transfer(uint8 data); - - /* - * Pin accessors - */ - - /** - * @brief Return the number of the MISO (master in, slave out) pin - */ - uint8 misoPin(void); - - /** - * @brief Return the number of the MOSI (master out, slave in) pin - */ - uint8 mosiPin(void); - - /** - * @brief Return the number of the SCK (serial clock) pin - */ - uint8 sckPin(void); - - /** - * @brief Return the number of the NSS (slave select) pin - */ - uint8 nssPin(void); - - /* -- The following methods are deprecated --------------------------- */ - - /** - * @brief Deprecated. - * - * Use HardwareSPI::transfer() instead. - * - * @see HardwareSPI::transfer() - */ - uint8 send(uint8 data); - - /** - * @brief Deprecated. - * - * Use HardwareSPI::write() in combination with - * HardwareSPI::read() (or HardwareSPI::transfer()) instead. - * - * @see HardwareSPI::write() - * @see HardwareSPI::read() - * @see HardwareSPI::transfer() - */ - uint8 send(const uint8 *data, uint32 length); - - /** - * @brief Deprecated. - * - * Use HardwareSPI::read() instead. - * - * @see HardwareSPI::read() - */ - uint8 recv(void); - -// void beginTransaction(SPISettings settings) { beginTransaction(BOARD_SPI_DEFAULT_SS, settings); } -// void beginTransaction(uint8 pin, SPISettings settings); - void endTransaction(void) { } - -private: - spi_dev *spi_d; -}; - - -extern HardwareSPI SPI; - -#endif - diff --git a/STM32F4/cores/maple/libmaple/dmaF1.c b/STM32F4/cores/maple/libmaple/dmaF1.c deleted file mode 100644 index f8ddb2d22..000000000 --- a/STM32F4/cores/maple/libmaple/dmaF1.c +++ /dev/null @@ -1,383 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -#ifdef STM32F1 - -/** - * @file dma.c - * @author Marti Bolivar ; - * Original implementation by Michael Hope - * @brief Direct Memory Access peripheral support - */ - -#include "dma.h" -#include "bitband.h" -#include "util.h" - -/* - * Devices - */ - -static dma_dev dma1 = { - .regs = DMA1_BASE, - .clk_id = RCC_DMA1, - .handlers = {{ .handler = NULL, .irq_line = NVIC_DMA_CH1 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH2 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH3 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH4 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH5 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH6 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH7 }} -}; -/** DMA1 device */ -dma_dev *DMA1 = &dma1; - -#ifdef STM32_HIGH_DENSITY -static dma_dev dma2 = { - .regs = DMA2_BASE, - .clk_id = RCC_DMA2, - .handlers = {{ .handler = NULL, .irq_line = NVIC_DMA2_CH1 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH2 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH3 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH_4_5 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH_4_5 }} /* !@#$ */ -}; -/** DMA2 device */ -dma_dev *DMA2 = &dma2; -#endif - -/* - * Convenience routines - */ - -/** - * @brief Initialize a DMA device. - * @param dev Device to initialize. - */ -void dma_init(dma_dev *dev) { - rcc_clk_enable(dev->clk_id); -} - -/** - * @brief Set up a DMA transfer. - * - * The channel will be disabled before being reconfigured. The - * transfer will have low priority by default. You may choose another - * priority before the transfer begins using dma_set_priority(), as - * well as performing any other configuration you desire. When the - * channel is configured to your liking, enable it using dma_enable(). - * - * @param dev DMA device. - * @param channel DMA channel. - * @param peripheral_address Base address of peripheral data register - * involved in the transfer. - * @param peripheral_size Peripheral data transfer size. - * @param memory_address Base memory address involved in the transfer. - * @param memory_size Memory data transfer size. - * @param mode Logical OR of dma_mode_flags - * @sideeffect Disables the given DMA channel. - * @see dma_xfer_size - * @see dma_mode_flags - * @see dma_set_num_transfers() - * @see dma_set_priority() - * @see dma_attach_interrupt() - * @see dma_enable() - */ -void dma_setup_transfer(dma_dev *dev, - dma_channel channel, - __io void *peripheral_address, - dma_xfer_size peripheral_size, - __io void *memory_address, - dma_xfer_size memory_size, - uint32 mode) { - dma_channel_reg_map *channel_regs = dma_channel_regs(dev, channel); - - dma_disable(dev, channel); /* can't write to CMAR/CPAR otherwise */ - channel_regs->CCR = (memory_size << 10) | (peripheral_size << 8) | mode; - channel_regs->CMAR = (uint32)memory_address; - channel_regs->CPAR = (uint32)peripheral_address; -} - -/** - * @brief Set the number of data to be transferred on a DMA channel. - * - * You may not call this function while the channel is enabled. - * - * @param dev DMA device - * @param channel Channel through which the transfer occurs. - * @param num_transfers - */ -void dma_set_num_transfers(dma_dev *dev, - dma_channel channel, - uint16 num_transfers) { - dma_channel_reg_map *channel_regs; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - channel_regs = dma_channel_regs(dev, channel); - channel_regs->CNDTR = num_transfers; -} - -/** - * @brief Set the priority of a DMA transfer. - * - * You may not call this function while the channel is enabled. - * - * @param dev DMA device - * @param channel DMA channel - * @param priority priority to set. - */ -void dma_set_priority(dma_dev *dev, - dma_channel channel, - dma_priority priority) { - dma_channel_reg_map *channel_regs; - uint32 ccr; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - channel_regs = dma_channel_regs(dev, channel); - ccr = channel_regs->CCR; - ccr &= ~DMA_CCR_PL; - ccr |= priority; - channel_regs->CCR = ccr; -} - -/** - * @brief Attach an interrupt to a DMA transfer. - * - * Interrupts are enabled using appropriate mode flags in - * dma_setup_transfer(). - * - * @param dev DMA device - * @param channel Channel to attach handler to - * @param handler Interrupt handler to call when channel interrupt fires. - * @see dma_setup_transfer() - * @see dma_get_irq_cause() - * @see dma_detach_interrupt() - */ -void dma_attach_interrupt(dma_dev *dev, - dma_channel channel, - void (*handler)(void)) { - dev->handlers[channel - 1].handler = handler; - nvic_irq_enable(dev->handlers[channel - 1].irq_line); -} - -/** - * @brief Detach a DMA transfer interrupt handler. - * - * After calling this function, the given channel's interrupts will be - * disabled. - * - * @param dev DMA device - * @param channel Channel whose handler to detach - * @sideeffect Clears interrupt enable bits in the channel's CCR register. - * @see dma_attach_interrupt() - */ -void dma_detach_interrupt(dma_dev *dev, dma_channel channel) { - /* Don't use nvic_irq_disable()! Think about DMA2 channels 4 and 5. */ - dma_channel_regs(dev, channel)->CCR &= ~0xF; - dev->handlers[channel - 1].handler = NULL; -} - -/** - * @brief Discover the reason why a DMA interrupt was called. - * - * You may only call this function within an attached interrupt - * handler for the given channel. - * - * This function resets the internal DMA register state which encodes - * the cause of the interrupt; consequently, it can only be called - * once per interrupt handler invocation. - * - * @param dev DMA device - * @param channel Channel whose interrupt is being handled. - * @return Reason why the interrupt fired. - * @sideeffect Clears channel status flags in dev->regs->ISR. - * @see dma_attach_interrupt() - * @see dma_irq_cause - */ -dma_irq_cause dma_get_irq_cause(dma_dev *dev, dma_channel channel) { - uint8 status_bits = dma_get_isr_bits(dev, channel); - - /* If the channel global interrupt flag is cleared, then - * something's very wrong. */ - ASSERT(status_bits & BIT(0)); - - dma_clear_isr_bits(dev, channel); - - /* ISR flags get set even if the corresponding interrupt enable - * bits in the channel's configuration register are cleared, so we - * can't use a switch here. - * - * Don't change the order of these if statements. */ - if (status_bits & BIT(3)) { - return DMA_TRANSFER_ERROR; - } else if (status_bits & BIT(1)) { - return DMA_TRANSFER_COMPLETE; - } else if (status_bits & BIT(2)) { - return DMA_TRANSFER_HALF_COMPLETE; - } else if (status_bits & BIT(0)) { - /* Shouldn't happen (unless someone messed up an IFCR write). */ - throb(); - } -#if DEBUG_LEVEL < DEBUG_ALL - else { - /* We shouldn't have been called, but the debug level is too - * low for the above ASSERT() to have had any effect. In - * order to fail fast, mimic the DMA controller's behavior - * when an error occurs. */ - dma_disable(dev, channel); - } -#endif - return DMA_TRANSFER_ERROR; -} - -/** - * @brief Enable a DMA channel. - * @param dev DMA device - * @param channel Channel to enable - */ -void dma_enable(dma_dev *dev, dma_channel channel) { - dma_channel_reg_map *chan_regs = dma_channel_regs(dev, channel); - bb_peri_set_bit(&chan_regs->CCR, DMA_CCR_EN_BIT, 1); -} - -/** - * @brief Disable a DMA channel. - * @param dev DMA device - * @param channel Channel to disable - */ -void dma_disable(dma_dev *dev, dma_channel channel) { - dma_channel_reg_map *chan_regs = dma_channel_regs(dev, channel); - bb_peri_set_bit(&chan_regs->CCR, DMA_CCR_EN_BIT, 0); -} - -/** - * @brief Set the base memory address where data will be read from or - * written to. - * - * You must not call this function while the channel is enabled. - * - * If the DMA memory size is 16 bits, the address is automatically - * aligned to a half-word. If the DMA memory size is 32 bits, the - * address is aligned to a word. - * - * @param dev DMA Device - * @param channel Channel whose base memory address to set. - * @param addr Memory base address to use. - */ -void dma_set_mem_addr(dma_dev *dev, dma_channel channel, __io void *addr) { - dma_channel_reg_map *chan_regs; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - chan_regs = dma_channel_regs(dev, channel); - chan_regs->CMAR = (uint32)addr; -} - -/** - * @brief Set the base peripheral address where data will be read from - * or written to. - * - * You must not call this function while the channel is enabled. - * - * If the DMA peripheral size is 16 bits, the address is automatically - * aligned to a half-word. If the DMA peripheral size is 32 bits, the - * address is aligned to a word. - * - * @param dev DMA Device - * @param channel Channel whose peripheral data register base address to set. - * @param addr Peripheral memory base address to use. - */ -void dma_set_per_addr(dma_dev *dev, dma_channel channel, __io void *addr) { - dma_channel_reg_map *chan_regs; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - chan_regs = dma_channel_regs(dev, channel); - chan_regs->CPAR = (uint32)addr; -} - -/* - * IRQ handlers - */ - -static inline void dispatch_handler(dma_dev *dev, dma_channel channel) { - void (*handler)(void) = dev->handlers[channel - 1].handler; - if (handler) { - handler(); - dma_clear_isr_bits(dev, channel); /* in case handler doesn't */ - } -} - -void __irq_dma1_channel1(void) { - dispatch_handler(DMA1, DMA_CH1); -} - -void __irq_dma1_channel2(void) { - dispatch_handler(DMA1, DMA_CH2); -} - -void __irq_dma1_channel3(void) { - dispatch_handler(DMA1, DMA_CH3); -} - -void __irq_dma1_channel4(void) { - dispatch_handler(DMA1, DMA_CH4); -} - -void __irq_dma1_channel5(void) { - dispatch_handler(DMA1, DMA_CH5); -} - -void __irq_dma1_channel6(void) { - dispatch_handler(DMA1, DMA_CH6); -} - -void __irq_dma1_channel7(void) { - dispatch_handler(DMA1, DMA_CH7); -} - -#ifdef STM32_HIGH_DENSITY -void __irq_dma2_channel1(void) { - dispatch_handler(DMA2, DMA_CH1); -} - -void __irq_dma2_channel2(void) { - dispatch_handler(DMA2, DMA_CH2); -} - -void __irq_dma2_channel3(void) { - dispatch_handler(DMA2, DMA_CH3); -} - -void __irq_dma2_channel4_5(void) { - dispatch_handler(DMA2, DMA_CH4); - dispatch_handler(DMA2, DMA_CH5); -} -#endif - -#endif \ No newline at end of file diff --git a/STM32F4/cores/maple/libmaple/dmaF1.h b/STM32F4/cores/maple/libmaple/dmaF1.h deleted file mode 100644 index 6e8087f49..000000000 --- a/STM32F4/cores/maple/libmaple/dmaF1.h +++ /dev/null @@ -1,453 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file dma.h - * - * @author Marti Bolivar ; - * Original implementation by Michael Hope - * - * @brief Direct Memory Access peripheral support - */ - -/* - * See /notes/dma.txt for more information. - */ - -#ifndef _DMA_H_ -#define _DMA_H_ - -#include "libmaple_types.h" -#include "rcc.h" -#include "nvic.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Register maps - */ - -/** - * @brief DMA register map type. - * - * Note that DMA controller 2 (register map base pointer DMA2_BASE) - * only supports channels 1--5. - */ -typedef struct dma_reg_map { - __io uint32 ISR; /**< Interrupt status register */ - __io uint32 IFCR; /**< Interrupt flag clear register */ - __io uint32 CCR1; /**< Channel 1 configuration register */ - __io uint32 CNDTR1; /**< Channel 1 number of data register */ - __io uint32 CPAR1; /**< Channel 1 peripheral address register */ - __io uint32 CMAR1; /**< Channel 1 memory address register */ - const uint32 RESERVED1; /**< Reserved. */ - __io uint32 CCR2; /**< Channel 2 configuration register */ - __io uint32 CNDTR2; /**< Channel 2 number of data register */ - __io uint32 CPAR2; /**< Channel 2 peripheral address register */ - __io uint32 CMAR2; /**< Channel 2 memory address register */ - const uint32 RESERVED2; /**< Reserved. */ - __io uint32 CCR3; /**< Channel 3 configuration register */ - __io uint32 CNDTR3; /**< Channel 3 number of data register */ - __io uint32 CPAR3; /**< Channel 3 peripheral address register */ - __io uint32 CMAR3; /**< Channel 3 memory address register */ - const uint32 RESERVED3; /**< Reserved. */ - __io uint32 CCR4; /**< Channel 4 configuration register */ - __io uint32 CNDTR4; /**< Channel 4 number of data register */ - __io uint32 CPAR4; /**< Channel 4 peripheral address register */ - __io uint32 CMAR4; /**< Channel 4 memory address register */ - const uint32 RESERVED4; /**< Reserved. */ - __io uint32 CCR5; /**< Channel 5 configuration register */ - __io uint32 CNDTR5; /**< Channel 5 number of data register */ - __io uint32 CPAR5; /**< Channel 5 peripheral address register */ - __io uint32 CMAR5; /**< Channel 5 memory address register */ - const uint32 RESERVED5; /**< Reserved. */ - __io uint32 CCR6; /**< Channel 6 configuration register */ - __io uint32 CNDTR6; /**< Channel 6 number of data register */ - __io uint32 CPAR6; /**< Channel 6 peripheral address register */ - __io uint32 CMAR6; /**< Channel 6 memory address register */ - const uint32 RESERVED6; /**< Reserved. */ - __io uint32 CCR7; /**< Channel 7 configuration register */ - __io uint32 CNDTR7; /**< Channel 7 number of data register */ - __io uint32 CPAR7; /**< Channel 7 peripheral address register */ - __io uint32 CMAR7; /**< Channel 7 memory address register */ - const uint32 RESERVED7; /**< Reserved. */ -} dma_reg_map; - -/** DMA controller 1 register map base pointer */ -#define DMA1_BASE ((struct dma_reg_map*)0x40020000) - -#ifdef STM32_HIGH_DENSITY -/** DMA controller 2 register map base pointer */ -#define DMA2_BASE ((struct dma_reg_map*)0x40020400) -#endif - -/* - * Register bit definitions - */ - -/* Interrupt status register */ - -#define DMA_ISR_TEIF7_BIT 27 -#define DMA_ISR_HTIF7_BIT 26 -#define DMA_ISR_TCIF7_BIT 25 -#define DMA_ISR_GIF7_BIT 24 -#define DMA_ISR_TEIF6_BIT 23 -#define DMA_ISR_HTIF6_BIT 22 -#define DMA_ISR_TCIF6_BIT 21 -#define DMA_ISR_GIF6_BIT 20 -#define DMA_ISR_TEIF5_BIT 19 -#define DMA_ISR_HTIF5_BIT 18 -#define DMA_ISR_TCIF5_BIT 17 -#define DMA_ISR_GIF5_BIT 16 -#define DMA_ISR_TEIF4_BIT 15 -#define DMA_ISR_HTIF4_BIT 14 -#define DMA_ISR_TCIF4_BIT 13 -#define DMA_ISR_GIF4_BIT 12 -#define DMA_ISR_TEIF3_BIT 11 -#define DMA_ISR_HTIF3_BIT 10 -#define DMA_ISR_TCIF3_BIT 9 -#define DMA_ISR_GIF3_BIT 8 -#define DMA_ISR_TEIF2_BIT 7 -#define DMA_ISR_HTIF2_BIT 6 -#define DMA_ISR_TCIF2_BIT 5 -#define DMA_ISR_GIF2_BIT 4 -#define DMA_ISR_TEIF1_BIT 3 -#define DMA_ISR_HTIF1_BIT 2 -#define DMA_ISR_TCIF1_BIT 1 -#define DMA_ISR_GIF1_BIT 0 - -#define DMA_ISR_TEIF7 BIT(DMA_ISR_TEIF7_BIT) -#define DMA_ISR_HTIF7 BIT(DMA_ISR_HTIF7_BIT) -#define DMA_ISR_TCIF7 BIT(DMA_ISR_TCIF7_BIT) -#define DMA_ISR_GIF7 BIT(DMA_ISR_GIF7_BIT) -#define DMA_ISR_TEIF6 BIT(DMA_ISR_TEIF6_BIT) -#define DMA_ISR_HTIF6 BIT(DMA_ISR_HTIF6_BIT) -#define DMA_ISR_TCIF6 BIT(DMA_ISR_TCIF6_BIT) -#define DMA_ISR_GIF6 BIT(DMA_ISR_GIF6_BIT) -#define DMA_ISR_TEIF5 BIT(DMA_ISR_TEIF5_BIT) -#define DMA_ISR_HTIF5 BIT(DMA_ISR_HTIF5_BIT) -#define DMA_ISR_TCIF5 BIT(DMA_ISR_TCIF5_BIT) -#define DMA_ISR_GIF5 BIT(DMA_ISR_GIF5_BIT) -#define DMA_ISR_TEIF4 BIT(DMA_ISR_TEIF4_BIT) -#define DMA_ISR_HTIF4 BIT(DMA_ISR_HTIF4_BIT) -#define DMA_ISR_TCIF4 BIT(DMA_ISR_TCIF4_BIT) -#define DMA_ISR_GIF4 BIT(DMA_ISR_GIF4_BIT) -#define DMA_ISR_TEIF3 BIT(DMA_ISR_TEIF3_BIT) -#define DMA_ISR_HTIF3 BIT(DMA_ISR_HTIF3_BIT) -#define DMA_ISR_TCIF3 BIT(DMA_ISR_TCIF3_BIT) -#define DMA_ISR_GIF3 BIT(DMA_ISR_GIF3_BIT) -#define DMA_ISR_TEIF2 BIT(DMA_ISR_TEIF2_BIT) -#define DMA_ISR_HTIF2 BIT(DMA_ISR_HTIF2_BIT) -#define DMA_ISR_TCIF2 BIT(DMA_ISR_TCIF2_BIT) -#define DMA_ISR_GIF2 BIT(DMA_ISR_GIF2_BIT) -#define DMA_ISR_TEIF1 BIT(DMA_ISR_TEIF1_BIT) -#define DMA_ISR_HTIF1 BIT(DMA_ISR_HTIF1_BIT) -#define DMA_ISR_TCIF1 BIT(DMA_ISR_TCIF1_BIT) -#define DMA_ISR_GIF1 BIT(DMA_ISR_GIF1_BIT) - -/* Interrupt flag clear register */ - -#define DMA_IFCR_CTEIF7_BIT 27 -#define DMA_IFCR_CHTIF7_BIT 26 -#define DMA_IFCR_CTCIF7_BIT 25 -#define DMA_IFCR_CGIF7_BIT 24 -#define DMA_IFCR_CTEIF6_BIT 23 -#define DMA_IFCR_CHTIF6_BIT 22 -#define DMA_IFCR_CTCIF6_BIT 21 -#define DMA_IFCR_CGIF6_BIT 20 -#define DMA_IFCR_CTEIF5_BIT 19 -#define DMA_IFCR_CHTIF5_BIT 18 -#define DMA_IFCR_CTCIF5_BIT 17 -#define DMA_IFCR_CGIF5_BIT 16 -#define DMA_IFCR_CTEIF4_BIT 15 -#define DMA_IFCR_CHTIF4_BIT 14 -#define DMA_IFCR_CTCIF4_BIT 13 -#define DMA_IFCR_CGIF4_BIT 12 -#define DMA_IFCR_CTEIF3_BIT 11 -#define DMA_IFCR_CHTIF3_BIT 10 -#define DMA_IFCR_CTCIF3_BIT 9 -#define DMA_IFCR_CGIF3_BIT 8 -#define DMA_IFCR_CTEIF2_BIT 7 -#define DMA_IFCR_CHTIF2_BIT 6 -#define DMA_IFCR_CTCIF2_BIT 5 -#define DMA_IFCR_CGIF2_BIT 4 -#define DMA_IFCR_CTEIF1_BIT 3 -#define DMA_IFCR_CHTIF1_BIT 2 -#define DMA_IFCR_CTCIF1_BIT 1 -#define DMA_IFCR_CGIF1_BIT 0 - -#define DMA_IFCR_CTEIF7 BIT(DMA_IFCR_CTEIF7_BIT) -#define DMA_IFCR_CHTIF7 BIT(DMA_IFCR_CHTIF7_BIT) -#define DMA_IFCR_CTCIF7 BIT(DMA_IFCR_CTCIF7_BIT) -#define DMA_IFCR_CGIF7 BIT(DMA_IFCR_CGIF7_BIT) -#define DMA_IFCR_CTEIF6 BIT(DMA_IFCR_CTEIF6_BIT) -#define DMA_IFCR_CHTIF6 BIT(DMA_IFCR_CHTIF6_BIT) -#define DMA_IFCR_CTCIF6 BIT(DMA_IFCR_CTCIF6_BIT) -#define DMA_IFCR_CGIF6 BIT(DMA_IFCR_CGIF6_BIT) -#define DMA_IFCR_CTEIF5 BIT(DMA_IFCR_CTEIF5_BIT) -#define DMA_IFCR_CHTIF5 BIT(DMA_IFCR_CHTIF5_BIT) -#define DMA_IFCR_CTCIF5 BIT(DMA_IFCR_CTCIF5_BIT) -#define DMA_IFCR_CGIF5 BIT(DMA_IFCR_CGIF5_BIT) -#define DMA_IFCR_CTEIF4 BIT(DMA_IFCR_CTEIF4_BIT) -#define DMA_IFCR_CHTIF4 BIT(DMA_IFCR_CHTIF4_BIT) -#define DMA_IFCR_CTCIF4 BIT(DMA_IFCR_CTCIF4_BIT) -#define DMA_IFCR_CGIF4 BIT(DMA_IFCR_CGIF4_BIT) -#define DMA_IFCR_CTEIF3 BIT(DMA_IFCR_CTEIF3_BIT) -#define DMA_IFCR_CHTIF3 BIT(DMA_IFCR_CHTIF3_BIT) -#define DMA_IFCR_CTCIF3 BIT(DMA_IFCR_CTCIF3_BIT) -#define DMA_IFCR_CGIF3 BIT(DMA_IFCR_CGIF3_BIT) -#define DMA_IFCR_CTEIF2 BIT(DMA_IFCR_CTEIF2_BIT) -#define DMA_IFCR_CHTIF2 BIT(DMA_IFCR_CHTIF2_BIT) -#define DMA_IFCR_CTCIF2 BIT(DMA_IFCR_CTCIF2_BIT) -#define DMA_IFCR_CGIF2 BIT(DMA_IFCR_CGIF2_BIT) -#define DMA_IFCR_CTEIF1 BIT(DMA_IFCR_CTEIF1_BIT) -#define DMA_IFCR_CHTIF1 BIT(DMA_IFCR_CHTIF1_BIT) -#define DMA_IFCR_CTCIF1 BIT(DMA_IFCR_CTCIF1_BIT) -#define DMA_IFCR_CGIF1 BIT(DMA_IFCR_CGIF1_BIT) - -/* Channel configuration register */ - -#define DMA_CCR_MEM2MEM_BIT 14 -#define DMA_CCR_MINC_BIT 7 -#define DMA_CCR_PINC_BIT 6 -#define DMA_CCR_CIRC_BIT 5 -#define DMA_CCR_DIR_BIT 4 -#define DMA_CCR_TEIE_BIT 3 -#define DMA_CCR_HTIE_BIT 2 -#define DMA_CCR_TCIE_BIT 1 -#define DMA_CCR_EN_BIT 0 - -#define DMA_CCR_MEM2MEM BIT(DMA_CCR_MEM2MEM_BIT) -#define DMA_CCR_PL (0x3 << 12) -#define DMA_CCR_PL_LOW (0x0 << 12) -#define DMA_CCR_PL_MEDIUM (0x1 << 12) -#define DMA_CCR_PL_HIGH (0x2 << 12) -#define DMA_CCR_PL_VERY_HIGH (0x3 << 12) -#define DMA_CCR_MSIZE (0x3 << 10) -#define DMA_CCR_MSIZE_8BITS (0x0 << 10) -#define DMA_CCR_MSIZE_16BITS (0x1 << 10) -#define DMA_CCR_MSIZE_32BITS (0x2 << 10) -#define DMA_CCR_PSIZE (0x3 << 8) -#define DMA_CCR_PSIZE_8BITS (0x0 << 8) -#define DMA_CCR_PSIZE_16BITS (0x1 << 8) -#define DMA_CCR_PSIZE_32BITS (0x2 << 8) -#define DMA_CCR_MINC BIT(DMA_CCR_MINC_BIT) -#define DMA_CCR_PINC BIT(DMA_CCR_PINC_BIT) -#define DMA_CCR_CIRC BIT(DMA_CCR_CIRC_BIT) -#define DMA_CCR_DIR BIT(DMA_CCR_DIR_BIT) -#define DMA_CCR_TEIE BIT(DMA_CCR_TEIE_BIT) -#define DMA_CCR_HTIE BIT(DMA_CCR_HTIE_BIT) -#define DMA_CCR_TCIE BIT(DMA_CCR_TCIE_BIT) -#define DMA_CCR_EN BIT(DMA_CCR_EN_BIT) - -/* - * Devices - */ - -/** Encapsulates state related to a DMA channel interrupt. */ -typedef struct dma_handler_config { - void (*handler)(void); /**< User-specified channel interrupt - handler */ - nvic_irq_num irq_line; /**< Channel's NVIC interrupt number */ -} dma_handler_config; - -/** DMA device type */ -typedef struct dma_dev { - dma_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< Clock ID */ - dma_handler_config handlers[]; /**< - * @brief IRQ handlers and NVIC numbers. - * - * @see dma_attach_interrupt() - * @see dma_detach_interrupt() - */ -} dma_dev; - -extern dma_dev *DMA1; -#ifdef STM32_HIGH_DENSITY -extern dma_dev *DMA2; -#endif - -/* - * Convenience functions - */ - -void dma_init(dma_dev *dev); - -/** Flags for DMA transfer configuration. */ -typedef enum dma_mode_flags { - DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ - DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ - DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ - DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ - DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ - DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ - DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ - DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ -} dma_mode_flags; - -/** Source and destination transfer sizes. */ -typedef enum dma_xfer_size { - DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ - DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ - DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ -} dma_xfer_size; - -/** DMA channel */ -typedef enum dma_channel { - DMA_CH1 = 1, /**< Channel 1 */ - DMA_CH2 = 2, /**< Channel 2 */ - DMA_CH3 = 3, /**< Channel 3 */ - DMA_CH4 = 4, /**< Channel 4 */ - DMA_CH5 = 5, /**< Channel 5 */ - DMA_CH6 = 6, /**< Channel 6 */ - DMA_CH7 = 7, /**< Channel 7 */ -} dma_channel; - -void dma_setup_transfer(dma_dev *dev, - dma_channel channel, - __io void *peripheral_address, - dma_xfer_size peripheral_size, - __io void *memory_address, - dma_xfer_size memory_size, - uint32 mode); - -void dma_set_num_transfers(dma_dev *dev, - dma_channel channel, - uint16 num_transfers); - -/** DMA transfer priority. */ -typedef enum dma_priority { - DMA_PRIORITY_LOW = DMA_CCR_PL_LOW, /**< Low priority */ - DMA_PRIORITY_MEDIUM = DMA_CCR_PL_MEDIUM, /**< Medium priority */ - DMA_PRIORITY_HIGH = DMA_CCR_PL_HIGH, /**< High priority */ - DMA_PRIORITY_VERY_HIGH = DMA_CCR_PL_VERY_HIGH /**< Very high priority */ -} dma_priority; - -void dma_set_priority(dma_dev *dev, - dma_channel channel, - dma_priority priority); - -void dma_attach_interrupt(dma_dev *dev, - dma_channel channel, - void (*handler)(void)); -void dma_detach_interrupt(dma_dev *dev, dma_channel channel); - -/** - * Encodes the reason why a DMA interrupt was called. - * @see dma_get_irq_cause() - */ -typedef enum dma_irq_cause { - DMA_TRANSFER_COMPLETE, /**< Transfer is complete. */ - DMA_TRANSFER_HALF_COMPLETE, /**< Transfer is half complete. */ - DMA_TRANSFER_ERROR, /**< Error occurred during transfer. */ -} dma_irq_cause; - -dma_irq_cause dma_get_irq_cause(dma_dev *dev, dma_channel channel); - -void dma_enable(dma_dev *dev, dma_channel channel); -void dma_disable(dma_dev *dev, dma_channel channel); - -void dma_set_mem_addr(dma_dev *dev, dma_channel channel, __io void *address); -void dma_set_per_addr(dma_dev *dev, dma_channel channel, __io void *address); - -/** - * @brief DMA channel register map type. - * - * Provides access to an individual channel's registers. - */ -typedef struct dma_channel_reg_map { - __io uint32 CCR; /**< Channel configuration register */ - __io uint32 CNDTR; /**< Channel number of data register */ - __io uint32 CPAR; /**< Channel peripheral address register */ - __io uint32 CMAR; /**< Channel memory address register */ -} dma_channel_reg_map; - -#define DMA_CHANNEL_NREGS 5 - -/** - * @brief Obtain a pointer to an individual DMA channel's registers. - * - * For example, dma_channel_regs(DMA1, DMA_CH1)->CCR is DMA1_BASE->CCR1. - * - * @param dev DMA device - * @param channel DMA channel whose channel register map to obtain. - */ -static inline dma_channel_reg_map* dma_channel_regs(dma_dev *dev, - dma_channel channel) { - __io uint32 *ccr1 = &dev->regs->CCR1; - return (dma_channel_reg_map*)(ccr1 + DMA_CHANNEL_NREGS * (channel - 1)); -} - -/** - * @brief Check if a DMA channel is enabled - * @param dev DMA device - * @param channel Channel whose enabled bit to check. - */ -static inline uint8 dma_is_channel_enabled(dma_dev *dev, dma_channel channel) { - return (uint8)(dma_channel_regs(dev, channel)->CCR & DMA_CCR_EN); -} - -/** - * @brief Get the ISR status bits for a DMA channel. - * - * The bits are returned right-aligned, in the following order: - * transfer error flag, half-transfer flag, transfer complete flag, - * global interrupt flag. - * - * If you're attempting to figure out why a DMA interrupt fired; you - * may find dma_get_irq_cause() more convenient. - * - * @param dev DMA device - * @param channel Channel whose ISR bits to return. - * @see dma_get_irq_cause(). - */ -static inline uint8 dma_get_isr_bits(dma_dev *dev, dma_channel channel) { - uint8 shift = (channel - 1) * 4; - return (dev->regs->ISR >> shift) & 0xF; -} - -/** - * @brief Clear the ISR status bits for a given DMA channel. - * - * If you're attempting to clean up after yourself in a DMA interrupt, - * you may find dma_get_irq_cause() more convenient. - * - * @param dev DMA device - * @param channel Channel whose ISR bits to clear. - * @see dma_get_irq_cause() - */ -static inline void dma_clear_isr_bits(dma_dev *dev, dma_channel channel) { - dev->regs->IFCR = BIT(4 * (channel - 1)); -} - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/dmaF2.c b/STM32F4/cores/maple/libmaple/dmaF2.c deleted file mode 100644 index 0911e584a..000000000 --- a/STM32F4/cores/maple/libmaple/dmaF2.c +++ /dev/null @@ -1,241 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - - #ifdef STM32F2 - -/** - * @file dmaF2.c - * @brief Direct Memory Access peripheral support - */ - -#include "dma.h" -#include "bitband.h" -#include "util.h" - -/* - * Devices - */ - -static dma_dev dma1 = { - .regs = DMA1_BASE, - .clk_id = RCC_DMA1, - .handlers = {{ .handler = NULL, .irq_line = 11 }, - { .handler = NULL, .irq_line = 12 }, - { .handler = NULL, .irq_line = 13 }, - { .handler = NULL, .irq_line = 14 }, - { .handler = NULL, .irq_line = 15 }, - { .handler = NULL, .irq_line = 16 }, - { .handler = NULL, .irq_line = 17 }, - { .handler = NULL, .irq_line = 47 }} -}; -/** DMA1 device */ -dma_dev *DMA1 = &dma1; - -static dma_dev dma2 = { - .regs = DMA2_BASE, - .clk_id = RCC_DMA2, - .handlers = {{ .handler = NULL, .irq_line = 56 }, - { .handler = NULL, .irq_line = 57 }, - { .handler = NULL, .irq_line = 58 }, - { .handler = NULL, .irq_line = 59 }, - { .handler = NULL, .irq_line = 60 }, - { .handler = NULL, .irq_line = 68 }, - { .handler = NULL, .irq_line = 69 }, - { .handler = NULL, .irq_line = 70 }} /* !@#$ */ -}; -/** DMA2 device */ -dma_dev *DMA2 = &dma2; - - -/* - * Convenience routines - */ - -/** - * @brief Initialize a DMA device. - * @param dev Device to initialize. - */ -void dma_init(dma_dev *dev) { - rcc_clk_enable(dev->clk_id); -} - -/** - * @brief Attach an interrupt to a DMA transfer. - * - * Interrupts are enabled using appropriate mode flags in - * dma_setup_transfer(). - * - * @param dev DMA device - * @param stream Stream to attach handler to - * @param handler Interrupt handler to call when channel interrupt fires. - * @see dma_setup_transfer() - * @see dma_detach_interrupt() - */ -void dma_attach_interrupt(dma_dev *dev, - dma_stream stream, - void (*handler)(void)) { - dev->handlers[stream].handler = handler; - nvic_irq_enable(dev->handlers[stream].irq_line); -} - -/** - * @brief Detach a DMA transfer interrupt handler. - * - * After calling this function, the given channel's interrupts will be - * disabled. - * - * @param dev DMA device - * @param stream Stream whose handler to detach - * @sideeffect Clears interrupt enable bits in the channel's CCR register. - * @see dma_attach_interrupt() - */ -void dma_detach_interrupt(dma_dev *dev, dma_stream stream) { - nvic_irq_disable(dev->handlers[stream].irq_line); - dev->handlers[stream].handler = NULL; -} - -void dma_clear_isr_bits(dma_dev *dev, dma_stream stream) { - switch (stream) { - case 0: - dev->regs->LIFCR|=0x0000003d; - break; - case 1: - dev->regs->LIFCR|=0x00000f40; - break; - case 2: - dev->regs->LIFCR|=0x003d0000; - break; - case 3: - dev->regs->LIFCR|=0x0f400000; - break; - case 4: - dev->regs->HIFCR|=0x0000003d; - break; - case 5: - dev->regs->HIFCR|=0x00000f40; - break; - case 6: - dev->regs->HIFCR|=0x003d0000; - break; - case 7: - dev->regs->HIFCR|=0x0f400000; - break; - } -} - -/* - * IRQ handlers - */ - -static inline void dispatch_handler(dma_dev *dev, dma_stream stream) { - void (*handler)(void) = dev->handlers[stream].handler; - if (handler) { - handler(); - dma_clear_isr_bits(dev, stream); /* in case handler doesn't */ - } -} - -//void __irq_dma1_stream0(void) { -void __irq_dma1_channel1(void) { - dispatch_handler(DMA1, DMA_STREAM0); -} - -//void __irq_dma1_stream1(void) { -void __irq_dma1_channel2(void) { - dispatch_handler(DMA1, DMA_STREAM1); -} - -//void __irq_dma1_stream2(void) { -void __irq_dma1_channel3(void) { - dispatch_handler(DMA1, DMA_STREAM2); -} - -//void __irq_dma1_stream3(void) { -void __irq_dma1_channel4(void) { - dispatch_handler(DMA1, DMA_STREAM3); -} - -//void __irq_dma1_stream4(void) { -void __irq_dma1_channel5(void) { - dispatch_handler(DMA1, DMA_STREAM4); -} - -//void __irq_dma1_stream5(void) { -void __irq_dma1_channel6(void) { - dispatch_handler(DMA1, DMA_STREAM5); -} - -//void __irq_dma1_stream6(void) { -void __irq_dma1_channel7(void) { - dispatch_handler(DMA1, DMA_STREAM6); -} - -//void __irq_dma1_stream7(void) { -void __irq_adc3(void) { - dispatch_handler(DMA1, DMA_STREAM7); -} - -//void __irq_dma2_stream0(void) { -void __irq_dma2_channel1(void) { - dispatch_handler(DMA2, DMA_STREAM0); -} - -//void __irq_dma2_stream1(void) { -void __irq_dma2_channel2(void) { - dispatch_handler(DMA2, DMA_STREAM1); -} - -//void __irq_dma2_stream2(void) { -void __irq_dma2_channel3(void) { - dispatch_handler(DMA2, DMA_STREAM2); -} - -//void __irq_dma2_stream3(void) { -void __irq_dma2_channel4_5(void) { - dispatch_handler(DMA2, DMA_STREAM3); -} - -//void __irq_dma2_stream4(void) { -void __irq_DMA2_Stream4_IRQHandler(void) { - dispatch_handler(DMA2, DMA_STREAM4); -} - -//void __irq_dma2_stream5(void) { -void __irq_DMA2_Stream5_IRQHandler(void) { - dispatch_handler(DMA2, DMA_STREAM5); -} - -//void __irq_dma2_stream6(void) { -void __irq_DMA2_Stream6_IRQHandler(void) { - dispatch_handler(DMA2, DMA_STREAM6); -} - -//void __irq_dma2_stream7(void) { -void __irq_DMA2_Stream7_IRQHandler(void) { - dispatch_handler(DMA2, DMA_STREAM7); -} - -#endif diff --git a/STM32F4/cores/maple/libmaple/dmaF2.h b/STM32F4/cores/maple/libmaple/dmaF2.h deleted file mode 100644 index 6f7086f36..000000000 --- a/STM32F4/cores/maple/libmaple/dmaF2.h +++ /dev/null @@ -1,270 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file dma.h - * - * @author Marti Bolivar ; - * Original implementation by Michael Hope - * - * @brief Direct Memory Access peripheral support - */ - -/* - * See /notes/dma.txt for more information. - */ - -#ifndef _DMA_H_ -#define _DMA_H_ - -#include "libmaple_types.h" -#include "rcc.h" -#include "nvic.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Register maps - */ - -/** - * @brief DMA stream type. - * - */ -typedef struct dma_stream_t { - __io uint32 CR; /**< Stream configuration register */ - __io uint32 NDTR; /**< Stream number of data register */ - __io uint32 PAR; /**< Stream peripheral address register */ - __io uint32 M0AR; /**< Stream memory address register 0 */ - __io uint32 M1AR; /**< Stream memory address register 1 */ - __io uint32 FCR; /**< Stream FIFO configuration register */ -} dma_stream_t; -/** - * @brief DMA register map type. - * - */ -typedef struct dma_reg_map { - __io uint32 LISR; /**< Low interrupt status register */ - __io uint32 HISR; /**< High interrupt status register */ - __io uint32 LIFCR; /**< Low interrupt flag clear register */ - __io uint32 HIFCR; /**< High interrupt flag clear register */ - dma_stream_t STREAM[8]; -} dma_reg_map; - -/** DMA controller register map base pointers */ -#define DMA1_BASE ((struct dma_reg_map*)0x40026000) -#define DMA2_BASE ((struct dma_reg_map*)0x40026400) - -/* - * Register bit definitions - */ - -/* Channel configuration register */ - -#define DMA_CR_CH0 (0x0 << 25) -#define DMA_CR_CH1 (0x1 << 25) -#define DMA_CR_CH2 (0x2 << 25) -#define DMA_CR_CH3 (0x3 << 25) -#define DMA_CR_CH4 (0x4 << 25) -#define DMA_CR_CH5 (0x5 << 25) -#define DMA_CR_CH6 (0x6 << 25) -#define DMA_CR_CH7 (0x7 << 25) -#define DMA_CR_MBURST0 (0x0 << 23) -#define DMA_CR_MBURST4 (0x1 << 23) -#define DMA_CR_MBURST8 (0x2 << 23) -#define DMA_CR_MBURST16 (0x3 << 23) -#define DMA_CR_PBURST0 (0x0 << 21) -#define DMA_CR_PBURST4 (0x1 << 21) -#define DMA_CR_PBURST8 (0x2 << 21) -#define DMA_CR_PBURST16 (0x3 << 21) -#define DMA_CR_CT0 (0x0 << 19) -#define DMA_CR_CT1 (0x1 << 19) -#define DMA_CR_DBM (0x1 << 18) - -#define DMA_CR_PL_LOW (0x0 << 16) -#define DMA_CR_PL_MEDIUM (0x1 << 16) -#define DMA_CR_PL_HIGH (0x2 << 16) -#define DMA_CR_PL_VERY_HIGH (0x3 << 16) -#define DMA_CR_PL_MASK (0x3 << 16) - -#define DMA_CR_PINCOS (0x1 << 15) - -#define DMA_CR_MSIZE_8BITS (0x0 << 13) -#define DMA_CR_MSIZE_16BITS (0x1 << 13) -#define DMA_CR_MSIZE_32BITS (0x2 << 13) - -#define DMA_CR_PSIZE_8BITS (0x0 << 11) -#define DMA_CR_PSIZE_16BITS (0x1 << 11) -#define DMA_CR_PSIZE_32BITS (0x2 << 11) - -#define DMA_CR_MINC (0x1 << 10) -#define DMA_CR_PINC (0x1 << 9) -#define DMA_CR_CIRC (0x1 << 8) -#define DMA_CR_DIR_P2M (0x0 << 6) -#define DMA_CR_DIR_M2P (0x1 << 6) -#define DMA_CR_DIR_M2M (0x2 << 6) - -#define DMA_CR_PFCTRL (0x1 << 5) -#define DMA_CR_TCIE (0x1 << 4) -#define DMA_CR_HTIE (0x1 << 3) -#define DMA_CR_TEIE (0x1 << 2) -#define DMA_CR_DMEIE (0x1 << 1) -#define DMA_CR_EN (0x1) - -/* - * Devices - */ - -/** Encapsulates state related to a DMA channel interrupt. */ -typedef struct dma_handler_config { - void (*handler)(void); /**< User-specified channel interrupt - handler */ - nvic_irq_num irq_line; /**< Channel's NVIC interrupt number */ -} dma_handler_config; - -/** DMA device type */ -typedef struct dma_dev { - dma_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< Clock ID */ - dma_handler_config handlers[]; /**< - * @brief IRQ handlers and NVIC numbers. - * - * @see dma_attach_interrupt() - * @see dma_detach_interrupt() - */ -} dma_dev; - -extern dma_dev *DMA1; -extern dma_dev *DMA2; - -/* - * Convenience functions - */ - -void dma_init(dma_dev *dev); - -/** Flags for DMA transfer configuration. */ -typedef enum dma_mode_flags { - DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ - DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ - DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ - DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ - DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ - DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ - DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ - DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ -} dma_mode_flags; - -/** Source and destination transfer sizes. */ -typedef enum dma_xfer_size { - DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ - DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ - DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ -} dma_xfer_size; - -/** DMA channel */ -typedef enum dma_stream { - DMA_STREAM0 = 0, /**< Stream 0 */ - DMA_STREAM1 = 1, /**< Stream 1 */ - DMA_STREAM2 = 2, /**< Stream 2 */ - DMA_STREAM3 = 3, /**< Stream 3 */ - DMA_STREAM4 = 4, /**< Stream 4 */ - DMA_STREAM5 = 5, /**< Stream 5 */ - DMA_STREAM6 = 6, /**< Stream 6 */ - DMA_STREAM7 = 7, /**< Stream 7 */ -} dma_stream; - -static inline void dma_setup_transfer(dma_dev *dev, - dma_stream stream, - __io void *peripheral_address, - __io void *memory_address0, - __io void *memory_address1, - uint32 flags, - uint32 fifo_flags) { - dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; // disable - dev->regs->STREAM[stream].PAR = (uint32)peripheral_address; - dev->regs->STREAM[stream].M0AR = (uint32)memory_address0; - dev->regs->STREAM[stream].M1AR = (uint32)memory_address1; - dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits - dev->regs->STREAM[stream].CR = flags & 0x0feffffe; // mask out reserved and enable -} - -static inline void dma_set_num_transfers(dma_dev *dev, - dma_stream stream, - uint16 num_transfers) { - dev->regs->STREAM[stream].NDTR = num_transfers; -} - -void dma_attach_interrupt(dma_dev *dev, - dma_stream stream, - void (*handler)(void)); - -void dma_detach_interrupt(dma_dev *dev, dma_stream stream); - -static inline void dma_enable(dma_dev *dev, dma_stream stream) { - dev->regs->STREAM[stream].CR |= DMA_CR_EN; -} - -static inline void dma_disable(dma_dev *dev, dma_stream stream) { - dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; -} - -/** - * @brief Check if a DMA stream is enabled - * @param dev DMA device - * @param stream Stream whose enabled bit to check. - */ -static inline uint8 dma_is_stream_enabled(dma_dev *dev, dma_stream stream) { - return (uint8)(dev->regs->STREAM[stream].CR & DMA_CR_EN); -} - -/** - * @brief Get the ISR status bits for a DMA stream. - * - * The bits are returned right-aligned, in the following order: - * transfer error flag, half-transfer flag, transfer complete flag, - * global interrupt flag. - * - * @param dev DMA device - * @param stream Stream whose ISR bits to return. - */ -uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream); - -/** - * @brief Clear the ISR status bits for a given DMA stream. - * - * @param dev DMA device - * @param stream Stream whose ISR bits to clear. - */ -void dma_clear_isr_bits(dma_dev *dev, dma_stream stream); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/gpio.c b/STM32F4/cores/maple/libmaple/gpio.c deleted file mode 100644 index 3792220e3..000000000 --- a/STM32F4/cores/maple/libmaple/gpio.c +++ /dev/null @@ -1,36 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file gpio.c - * @brief GPIO initialization routine - */ - -// #ifdef STM32F2 -// #include "gpioF2.c" -// #else -// #include "gpioF1.c" -// #endif diff --git a/STM32F4/cores/maple/libmaple/gpioF1.c b/STM32F4/cores/maple/libmaple/gpioF1.c deleted file mode 100644 index 846b7542a..000000000 --- a/STM32F4/cores/maple/libmaple/gpioF1.c +++ /dev/null @@ -1,200 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -#ifdef STM32F1 - -/** - * @file gpio.c - * @brief GPIO initialization routine - */ - -#include "gpio.h" -#include "rcc.h" - -/* - * GPIO devices - */ - -gpio_dev gpioa = { - .regs = GPIOA_BASE, - .clk_id = RCC_GPIOA, - .exti_port = AFIO_EXTI_PA, -}; -/** GPIO port A device. */ -gpio_dev* const GPIOA = &gpioa; - -gpio_dev gpiob = { - .regs = GPIOB_BASE, - .clk_id = RCC_GPIOB, - .exti_port = AFIO_EXTI_PB, -}; -/** GPIO port B device. */ -gpio_dev* const GPIOB = &gpiob; - -gpio_dev gpioc = { - .regs = GPIOC_BASE, - .clk_id = RCC_GPIOC, - .exti_port = AFIO_EXTI_PC, -}; -/** GPIO port C device. */ -gpio_dev* const GPIOC = &gpioc; - -gpio_dev gpiod = { - .regs = GPIOD_BASE, - .clk_id = RCC_GPIOD, - .exti_port = AFIO_EXTI_PD, -}; -/** GPIO port D device. */ -gpio_dev* const GPIOD = &gpiod; - -#ifdef STM32_HIGH_DENSITY -gpio_dev gpioe = { - .regs = GPIOE_BASE, - .clk_id = RCC_GPIOE, - .exti_port = AFIO_EXTI_PE, -}; -/** GPIO port E device. */ -gpio_dev* const GPIOE = &gpioe; - -gpio_dev gpiof = { - .regs = GPIOF_BASE, - .clk_id = RCC_GPIOF, - .exti_port = AFIO_EXTI_PF, -}; -/** GPIO port F device. */ -gpio_dev* const GPIOF = &gpiof; - -gpio_dev gpiog = { - .regs = GPIOG_BASE, - .clk_id = RCC_GPIOG, - .exti_port = AFIO_EXTI_PG, -}; -/** GPIO port G device. */ -gpio_dev* const GPIOG = &gpiog; -#endif - -/* - * GPIO convenience routines - */ - -/** - * Initialize a GPIO device. - * - * Enables the clock for and resets the given device. - * - * @param dev GPIO device to initialize. - */ -void gpio_init(gpio_dev *dev) { - rcc_clk_enable(dev->clk_id); - rcc_reset_dev(dev->clk_id); -} - -/** - * Initialize and reset all available GPIO devices. - */ -void gpio_init_all(void) { - gpio_init(GPIOA); - gpio_init(GPIOB); - gpio_init(GPIOC); - gpio_init(GPIOD); -#ifdef STM32_HIGH_DENSITY - gpio_init(GPIOE); - gpio_init(GPIOF); - gpio_init(GPIOG); -#endif -} - -/** - * Set the mode of a GPIO pin. - * - * @param dev GPIO device. - * @param pin Pin on the device whose mode to set, 0--15. - * @param mode General purpose or alternate function mode to set the pin to. - * @see gpio_pin_mode - */ -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { - gpio_reg_map *regs = dev->regs; - __io uint32 *cr = ®s->CRL + (pin >> 3); - uint32 shift = (pin & 0x7) * 4; - uint32 tmp = *cr; - - tmp &= ~(0xF << shift); - tmp |= (mode == GPIO_INPUT_PU ? GPIO_INPUT_PD : mode) << shift; - *cr = tmp; - - if (mode == GPIO_INPUT_PD) { - regs->ODR &= ~BIT(pin); - } else if (mode == GPIO_INPUT_PU) { - regs->ODR |= BIT(pin); - } -} - -/* - * AFIO - */ - -/** - * @brief Initialize the AFIO clock, and reset the AFIO registers. - */ -void afio_init(void) { - rcc_clk_enable(RCC_AFIO); - rcc_reset_dev(RCC_AFIO); -} - -#define AFIO_EXTI_SEL_MASK 0xF - -/** - * @brief Select a source input for an external interrupt. - * - * @param exti External interrupt. - * @param gpio_port Port which contains pin to use as source input. - * @see afio_exti_num - * @see afio_exti_port - */ -void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port) { - __io uint32 *exti_cr = &AFIO_BASE->EXTICR1 + exti / 4; - uint32 shift = 4 * (exti % 4); - uint32 cr = *exti_cr; - - cr &= ~(AFIO_EXTI_SEL_MASK << shift); - cr |= gpio_port << shift; - *exti_cr = cr; -} - -/** - * @brief Perform an alternate function remap. - * @param remapping Remapping to perform. - */ -void afio_remap(afio_remap_peripheral remapping) { - if (remapping & AFIO_REMAP_USE_MAPR2) { - remapping &= ~AFIO_REMAP_USE_MAPR2; - AFIO_BASE->MAPR2 |= remapping; - } else { - AFIO_BASE->MAPR |= remapping; - } -} - -#endif diff --git a/STM32F4/cores/maple/libmaple/gpioF1.h b/STM32F4/cores/maple/libmaple/gpioF1.h deleted file mode 100644 index c69efb417..000000000 --- a/STM32F4/cores/maple/libmaple/gpioF1.h +++ /dev/null @@ -1,530 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. -*****************************************************************************/ - -/** - * @file gpio.h - * - * @brief General purpose I/O (GPIO) and Alternate Function I/O - * (AFIO) prototypes, defines, and inlined access functions. - */ - -#ifndef _GPIO_H_ -#define _GPIO_H_ - -#include "libmaple.h" -#include "rcc.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * GPIO register maps and devices - */ - -/** GPIO register map type */ -typedef struct gpio_reg_map { - __io uint32 CRL; /**< Port configuration register low */ - __io uint32 CRH; /**< Port configuration register high */ - __io uint32 IDR; /**< Port input data register */ - __io uint32 ODR; /**< Port output data register */ - __io uint32 BSRR; /**< Port bit set/reset register */ - __io uint32 BRR; /**< Port bit reset register */ - __io uint32 LCKR; /**< Port configuration lock register */ -} gpio_reg_map; - -/** - * @brief External interrupt line port selector. - * - * Used to determine which GPIO port to map an external interrupt line - * onto. */ -/* (See AFIO sections, below) */ -typedef enum afio_exti_port { - AFIO_EXTI_PA, /**< Use port A (PAx) pin. */ - AFIO_EXTI_PB, /**< Use port B (PBx) pin. */ - AFIO_EXTI_PC, /**< Use port C (PCx) pin. */ - AFIO_EXTI_PD, /**< Use port D (PDx) pin. */ -#ifdef STM32_HIGH_DENSITY - AFIO_EXTI_PE, /**< Use port E (PEx) pin. */ - AFIO_EXTI_PF, /**< Use port F (PFx) pin. */ - AFIO_EXTI_PG, /**< Use port G (PGx) pin. */ -#endif -} afio_exti_port; - -/** GPIO device type */ -typedef struct gpio_dev { - gpio_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< RCC clock information */ - afio_exti_port exti_port; /**< AFIO external interrupt port value */ -} gpio_dev; - -extern gpio_dev gpioa; -extern gpio_dev* const GPIOA; -extern gpio_dev gpiob; -extern gpio_dev* const GPIOB; -extern gpio_dev gpioc; -extern gpio_dev* const GPIOC; -extern gpio_dev gpiod; -extern gpio_dev* const GPIOD; -#ifdef STM32_HIGH_DENSITY -extern gpio_dev gpioe; -extern gpio_dev* const GPIOE; -extern gpio_dev gpiof; -extern gpio_dev* const GPIOF; -extern gpio_dev gpiog; -extern gpio_dev* const GPIOG; -#endif - -/** GPIO port A register map base pointer */ -#define GPIOA_BASE ((struct gpio_reg_map*)0x40010800) -/** GPIO port B register map base pointer */ -#define GPIOB_BASE ((struct gpio_reg_map*)0x40010C00) -/** GPIO port C register map base pointer */ -#define GPIOC_BASE ((struct gpio_reg_map*)0x40011000) -/** GPIO port D register map base pointer */ -#define GPIOD_BASE ((struct gpio_reg_map*)0x40011400) -#ifdef STM32_HIGH_DENSITY -/** GPIO port E register map base pointer */ -#define GPIOE_BASE ((struct gpio_reg_map*)0x40011800) -/** GPIO port F register map base pointer */ -#define GPIOF_BASE ((struct gpio_reg_map*)0x40011C00) -/** GPIO port G register map base pointer */ -#define GPIOG_BASE ((struct gpio_reg_map*)0x40012000) -#endif - -/* - * GPIO register bit definitions - */ - -/* Control registers, low and high */ - -#define GPIO_CR_CNF (0x3 << 2) -#define GPIO_CR_CNF_INPUT_ANALOG (0x0 << 2) -#define GPIO_CR_CNF_INPUT_FLOATING (0x1 << 2) -#define GPIO_CR_CNF_INPUT_PU_PD (0x2 << 2) -#define GPIO_CR_CNF_OUTPUT_PP (0x0 << 2) -#define GPIO_CR_CNF_OUTPUT_OD (0x1 << 2) -#define GPIO_CR_CNF_AF_OUTPUT_PP (0x2 << 2) -#define GPIO_CR_CNF_AF_OUTPUT_OD (0x3 << 2) -#define GPIO_CR_MODE 0x3 -#define GPIO_CR_MODE_INPUT 0x0 -#define GPIO_CR_MODE_OUTPUT_10MHZ 0x1 -#define GPIO_CR_MODE_OUTPUT_2MHZ 0x2 -#define GPIO_CR_MODE_OUTPUT_50MHZ 0x3 - -/** - * @brief GPIO Pin modes. - * - * These only allow for 50MHZ max output speeds; if you want slower, - * use direct register access. - */ -typedef enum gpio_pin_mode { - GPIO_OUTPUT_PP = (GPIO_CR_CNF_OUTPUT_PP | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Output push-pull. */ - GPIO_OUTPUT_OD = (GPIO_CR_CNF_OUTPUT_OD | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Output open-drain. */ - GPIO_AF_OUTPUT_PP = (GPIO_CR_CNF_AF_OUTPUT_PP | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Alternate function - output push-pull. */ - GPIO_AF_OUTPUT_OD = (GPIO_CR_CNF_AF_OUTPUT_OD | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Alternate function - output open drain. */ - GPIO_INPUT_ANALOG = (GPIO_CR_CNF_INPUT_ANALOG | - GPIO_CR_MODE_INPUT), /**< Analog input. */ - GPIO_INPUT_FLOATING = (GPIO_CR_CNF_INPUT_FLOATING | - GPIO_CR_MODE_INPUT), /**< Input floating. */ - GPIO_INPUT_PD = (GPIO_CR_CNF_INPUT_PU_PD | - GPIO_CR_MODE_INPUT), /**< Input pull-down. */ - GPIO_AF_INPUT_PD = (GPIO_INPUT_PD), /**< Input pull-down. */ - GPIO_INPUT_PU /**< Input pull-up. */ - - - /* GPIO_INPUT_PU treated as a special case, for ODR twiddling */ -} gpio_pin_mode; - -/* - * GPIO Convenience routines - */ - -void gpio_init(gpio_dev *dev); -void gpio_init_all(void); -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode); - -/** - * @brief Get a GPIO port's corresponding afio_exti_port. - * @param dev GPIO device whose afio_exti_port to return. - */ -static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { - return dev->exti_port; -} - -/** - * Set or reset a GPIO pin. - * - * Pin must have previously been configured to output mode. - * - * @param dev GPIO device whose pin to set. - * @param pin Pin on to set or reset - * @param val If true, set the pin. If false, reset the pin. - */ -static inline void gpio_write_bit(gpio_dev *dev, uint8 pin, uint8 val) { - if (val) { - dev->regs->BSRR = BIT(pin); - } else { - dev->regs->BRR = BIT(pin); - } -} - -/** - * Determine whether or not a GPIO pin is set. - * - * Pin must have previously been configured to input mode. - * - * @param dev GPIO device whose pin to test. - * @param pin Pin on dev to test. - * @return True if the pin is set, false otherwise. - */ -static inline uint32 gpio_read_bit(gpio_dev *dev, uint8 pin) { - return dev->regs->IDR & BIT(pin); -} - -/** - * Toggle a pin configured as output push-pull. - * @param dev GPIO device. - * @param pin Pin on dev to toggle. - */ -static inline void gpio_toggle_bit(gpio_dev *dev, uint8 pin) { - dev->regs->ODR = dev->regs->ODR ^ BIT(pin); -} - -/* - * AFIO register map - */ - -/** AFIO register map */ -typedef struct afio_reg_map { - __io uint32 EVCR; /**< Event control register. */ - __io uint32 MAPR; /**< AF remap and debug I/O configuration - register. */ - __io uint32 EXTICR1; /**< External interrupt configuration - register 1. */ - __io uint32 EXTICR2; /**< External interrupt configuration - register 2. */ - __io uint32 EXTICR3; /**< External interrupt configuration - register 3. */ - __io uint32 EXTICR4; /**< External interrupt configuration - register 4. */ - __io uint32 MAPR2; /**< AF remap and debug I/O configuration - register 2. */ -} afio_reg_map; - -/** AFIO register map base pointer. */ -#define AFIO_BASE ((struct afio_reg_map *)0x40010000) - -/* - * AFIO register bit definitions - */ - -/* Event control register */ - -#define AFIO_EVCR_EVOE (0x1 << 7) -#define AFIO_EVCR_PORT_PA (0x0 << 4) -#define AFIO_EVCR_PORT_PB (0x1 << 4) -#define AFIO_EVCR_PORT_PC (0x2 << 4) -#define AFIO_EVCR_PORT_PD (0x3 << 4) -#define AFIO_EVCR_PORT_PE (0x4 << 4) -#define AFIO_EVCR_PIN_0 0x0 -#define AFIO_EVCR_PIN_1 0x1 -#define AFIO_EVCR_PIN_2 0x2 -#define AFIO_EVCR_PIN_3 0x3 -#define AFIO_EVCR_PIN_4 0x4 -#define AFIO_EVCR_PIN_5 0x5 -#define AFIO_EVCR_PIN_6 0x6 -#define AFIO_EVCR_PIN_7 0x7 -#define AFIO_EVCR_PIN_8 0x8 -#define AFIO_EVCR_PIN_9 0x9 -#define AFIO_EVCR_PIN_10 0xA -#define AFIO_EVCR_PIN_11 0xB -#define AFIO_EVCR_PIN_12 0xC -#define AFIO_EVCR_PIN_13 0xD -#define AFIO_EVCR_PIN_14 0xE -#define AFIO_EVCR_PIN_15 0xF - -/* AF remap and debug I/O configuration register */ - -#define AFIO_MAPR_SWJ_CFG (0x7 << 24) -#define AFIO_MAPR_SWJ_CFG_FULL_SWJ (0x0 << 24) -#define AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST (0x1 << 24) -#define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24) -#define AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW (0x4 << 24) -#define AFIO_MAPR_ADC2_ETRGREG_REMAP BIT(20) -#define AFIO_MAPR_ADC2_ETRGINJ_REMAP BIT(19) -#define AFIO_MAPR_ADC1_ETRGREG_REMAP BIT(18) -#define AFIO_MAPR_ADC1_ETRGINJ_REMAP BIT(17) -#define AFIO_MAPR_TIM5CH4_IREMAP BIT(16) -#define AFIO_MAPR_PD01_REMAP BIT(15) -#define AFIO_MAPR_CAN_REMAP (0x3 << 13) -#define AFIO_MAPR_CAN_REMAP_NONE (0x0 << 13) -#define AFIO_MAPR_CAN_REMAP_PB8_PB9 (0x2 << 13) -#define AFIO_MAPR_CAN_REMAP_PD0_PD1 (0x3 << 13) -#define AFIO_MAPR_TIM4_REMAP BIT(12) -#define AFIO_MAPR_TIM3_REMAP (0x3 << 10) -#define AFIO_MAPR_TIM3_REMAP_NONE (0x0 << 10) -#define AFIO_MAPR_TIM3_REMAP_PARTIAL (0x2 << 10) -#define AFIO_MAPR_TIM3_REMAP_FULL (0x3 << 10) -#define AFIO_MAPR_TIM2_REMAP (0x3 << 8) -#define AFIO_MAPR_TIM2_REMAP_NONE (0x0 << 8) -#define AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3 (0x1 << 8) -#define AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11 (0x2 << 8) -#define AFIO_MAPR_TIM2_REMAP_FULL (0x3 << 8) -#define AFIO_MAPR_TIM1_REMAP (0x3 << 6) -#define AFIO_MAPR_TIM1_REMAP_NONE (0x0 << 6) -#define AFIO_MAPR_TIM1_REMAP_PARTIAL (0x1 << 6) -#define AFIO_MAPR_TIM1_REMAP_FULL (0x3 << 6) -#define AFIO_MAPR_USART3_REMAP (0x3 << 4) -#define AFIO_MAPR_USART3_REMAP_NONE (0x0 << 4) -#define AFIO_MAPR_USART3_REMAP_PARTIAL (0x1 << 4) -#define AFIO_MAPR_USART3_REMAP_FULL (0x3 << 4) -#define AFIO_MAPR_USART2_REMAP BIT(3) -#define AFIO_MAPR_USART1_REMAP BIT(2) -#define AFIO_MAPR_I2C1_REMAP BIT(1) -#define AFIO_MAPR_SPI1_REMAP BIT(0) - -/* External interrupt configuration register 1 */ - -#define AFIO_EXTICR1_EXTI3 (0xF << 12) -#define AFIO_EXTICR1_EXTI3_PA (0x0 << 12) -#define AFIO_EXTICR1_EXTI3_PB (0x1 << 12) -#define AFIO_EXTICR1_EXTI3_PC (0x2 << 12) -#define AFIO_EXTICR1_EXTI3_PD (0x3 << 12) -#define AFIO_EXTICR1_EXTI3_PE (0x4 << 12) -#define AFIO_EXTICR1_EXTI3_PF (0x5 << 12) -#define AFIO_EXTICR1_EXTI3_PG (0x6 << 12) -#define AFIO_EXTICR1_EXTI2 (0xF << 8) -#define AFIO_EXTICR1_EXTI2_PA (0x0 << 8) -#define AFIO_EXTICR1_EXTI2_PB (0x1 << 8) -#define AFIO_EXTICR1_EXTI2_PC (0x2 << 8) -#define AFIO_EXTICR1_EXTI2_PD (0x3 << 8) -#define AFIO_EXTICR1_EXTI2_PE (0x4 << 8) -#define AFIO_EXTICR1_EXTI2_PF (0x5 << 8) -#define AFIO_EXTICR1_EXTI2_PG (0x6 << 8) -#define AFIO_EXTICR1_EXTI1 (0xF << 4) -#define AFIO_EXTICR1_EXTI1_PA (0x0 << 4) -#define AFIO_EXTICR1_EXTI1_PB (0x1 << 4) -#define AFIO_EXTICR1_EXTI1_PC (0x2 << 4) -#define AFIO_EXTICR1_EXTI1_PD (0x3 << 4) -#define AFIO_EXTICR1_EXTI1_PE (0x4 << 4) -#define AFIO_EXTICR1_EXTI1_PF (0x5 << 4) -#define AFIO_EXTICR1_EXTI1_PG (0x6 << 4) -#define AFIO_EXTICR1_EXTI0 0xF -#define AFIO_EXTICR1_EXTI0_PA 0x0 -#define AFIO_EXTICR1_EXTI0_PB 0x1 -#define AFIO_EXTICR1_EXTI0_PC 0x2 -#define AFIO_EXTICR1_EXTI0_PD 0x3 -#define AFIO_EXTICR1_EXTI0_PE 0x4 -#define AFIO_EXTICR1_EXTI0_PF 0x5 -#define AFIO_EXTICR1_EXTI0_PG 0x6 - -/* External interrupt configuration register 2 */ - -#define AFIO_EXTICR2_EXTI7 (0xF << 12) -#define AFIO_EXTICR2_EXTI7_PA (0x0 << 12) -#define AFIO_EXTICR2_EXTI7_PB (0x1 << 12) -#define AFIO_EXTICR2_EXTI7_PC (0x2 << 12) -#define AFIO_EXTICR2_EXTI7_PD (0x3 << 12) -#define AFIO_EXTICR2_EXTI7_PE (0x4 << 12) -#define AFIO_EXTICR2_EXTI7_PF (0x5 << 12) -#define AFIO_EXTICR2_EXTI7_PG (0x6 << 12) -#define AFIO_EXTICR2_EXTI6 (0xF << 8) -#define AFIO_EXTICR2_EXTI6_PA (0x0 << 8) -#define AFIO_EXTICR2_EXTI6_PB (0x1 << 8) -#define AFIO_EXTICR2_EXTI6_PC (0x2 << 8) -#define AFIO_EXTICR2_EXTI6_PD (0x3 << 8) -#define AFIO_EXTICR2_EXTI6_PE (0x4 << 8) -#define AFIO_EXTICR2_EXTI6_PF (0x5 << 8) -#define AFIO_EXTICR2_EXTI6_PG (0x6 << 8) -#define AFIO_EXTICR2_EXTI5 (0xF << 4) -#define AFIO_EXTICR2_EXTI5_PA (0x0 << 4) -#define AFIO_EXTICR2_EXTI5_PB (0x1 << 4) -#define AFIO_EXTICR2_EXTI5_PC (0x2 << 4) -#define AFIO_EXTICR2_EXTI5_PD (0x3 << 4) -#define AFIO_EXTICR2_EXTI5_PE (0x4 << 4) -#define AFIO_EXTICR2_EXTI5_PF (0x5 << 4) -#define AFIO_EXTICR2_EXTI5_PG (0x6 << 4) -#define AFIO_EXTICR2_EXTI4 0xF -#define AFIO_EXTICR2_EXTI4_PA 0x0 -#define AFIO_EXTICR2_EXTI4_PB 0x1 -#define AFIO_EXTICR2_EXTI4_PC 0x2 -#define AFIO_EXTICR2_EXTI4_PD 0x3 -#define AFIO_EXTICR2_EXTI4_PE 0x4 -#define AFIO_EXTICR2_EXTI4_PF 0x5 -#define AFIO_EXTICR2_EXTI4_PG 0x6 - -/* AF remap and debug I/O configuration register 2 */ - -#define AFIO_MAPR2_FSMC_NADV BIT(10) -#define AFIO_MAPR2_TIM14_REMAP BIT(9) -#define AFIO_MAPR2_TIM13_REMAP BIT(8) -#define AFIO_MAPR2_TIM11_REMAP BIT(7) -#define AFIO_MAPR2_TIM10_REMAP BIT(6) -#define AFIO_MAPR2_TIM9_REMAP BIT(5) - -/* - * AFIO convenience routines - */ - -void afio_init(void); - -/** - * External interrupt line numbers. - */ -typedef enum afio_exti_num { - AFIO_EXTI_0, /**< External interrupt line 0. */ - AFIO_EXTI_1, /**< External interrupt line 1. */ - AFIO_EXTI_2, /**< External interrupt line 2. */ - AFIO_EXTI_3, /**< External interrupt line 3. */ - AFIO_EXTI_4, /**< External interrupt line 4. */ - AFIO_EXTI_5, /**< External interrupt line 5. */ - AFIO_EXTI_6, /**< External interrupt line 6. */ - AFIO_EXTI_7, /**< External interrupt line 7. */ - AFIO_EXTI_8, /**< External interrupt line 8. */ - AFIO_EXTI_9, /**< External interrupt line 9. */ - AFIO_EXTI_10, /**< External interrupt line 10. */ - AFIO_EXTI_11, /**< External interrupt line 11. */ - AFIO_EXTI_12, /**< External interrupt line 12. */ - AFIO_EXTI_13, /**< External interrupt line 13. */ - AFIO_EXTI_14, /**< External interrupt line 14. */ - AFIO_EXTI_15, /**< External interrupt line 15. */ -} afio_exti_num; - -void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port); - -/* HACK: Use upper bit to denote MAPR2, Bit 31 is reserved and - * not used in either MAPR or MAPR2 */ -#define AFIO_REMAP_USE_MAPR2 (1 << 31) - -/** - * @brief Available peripheral remaps. - * @see afio_remap() - */ -typedef enum afio_remap_peripheral { - AFIO_REMAP_ADC2_ETRGREG = AFIO_MAPR_ADC2_ETRGREG_REMAP, /**< - ADC 2 external trigger regular conversion remapping */ - AFIO_REMAP_ADC2_ETRGINJ = AFIO_MAPR_ADC2_ETRGINJ_REMAP, /**< - ADC 2 external trigger injected conversion remapping */ - AFIO_REMAP_ADC1_ETRGREG = AFIO_MAPR_ADC1_ETRGREG_REMAP, /**< - ADC 1 external trigger regular conversion remapping */ - AFIO_REMAP_ADC1_ETRGINJ = AFIO_MAPR_ADC1_ETRGINJ_REMAP, /**< - ADC 1 external trigger injected conversion remapping */ - AFIO_REMAP_TIM5CH4_I = AFIO_MAPR_TIM5CH4_IREMAP, /**< - Timer 5 channel 4 internal remapping */ - AFIO_REMAP_PD01 = AFIO_MAPR_PD01_REMAP, /**< - Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ - AFIO_REMAP_CAN_1 = AFIO_MAPR_CAN_REMAP_PB8_PB9, /**< - CAN alternate function remapping 1 (RX on PB8, TX on PB9) */ - AFIO_REMAP_CAN_2 = AFIO_MAPR_CAN_REMAP_PD0_PD1, /**< - CAN alternate function remapping 2 (RX on PD0, TX on PD1) */ - AFIO_REMAP_TIM4 = AFIO_MAPR_TIM4_REMAP, /**< - Timer 4 remapping */ - AFIO_REMAP_TIM3_PARTIAL = AFIO_MAPR_TIM3_REMAP_PARTIAL, /**< - Timer 3 partial remapping */ - AFIO_REMAP_TIM3_FULL = AFIO_MAPR_TIM3_REMAP_FULL, /**< - Timer 3 full remapping */ - AFIO_REMAP_TIM2_PARTIAL_1 = AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3, /**< - Timer 2 partial remapping 1 (CH1 and ETR on PA15, CH2 on PB3, CH3 - on PA2, CH4 on PA3) */ - AFIO_REMAP_TIM2_PARTIAL_2 = AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11, /**< - Timer 2 partial remapping 2 (CH1 and ETR on PA0, CH2 on PA1, CH3 - on PB10, CH4 on PB11) */ - AFIO_REMAP_TIM2_FULL = AFIO_MAPR_TIM2_REMAP_FULL, /**< - Timer 2 full remapping */ - AFIO_REMAP_USART2 = AFIO_MAPR_USART2_REMAP, /**< - USART 2 remapping */ - AFIO_REMAP_USART1 = AFIO_MAPR_USART1_REMAP, /**< - USART 1 remapping */ - AFIO_REMAP_I2C1 = AFIO_MAPR_I2C1_REMAP, /**< - I2C 1 remapping */ - AFIO_REMAP_SPI1 = AFIO_MAPR_SPI1_REMAP, /**< - SPI 1 remapping */ - AFIO_REMAP_FSMC_NADV = (AFIO_MAPR2_FSMC_NADV | - AFIO_REMAP_USE_MAPR2), /**< - NADV signal not connected */ - AFIO_REMAP_TIM14 = (AFIO_MAPR2_TIM14_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 14 remapping */ - AFIO_REMAP_TIM13 = (AFIO_MAPR2_TIM13_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 13 remapping */ - AFIO_REMAP_TIM11 = (AFIO_MAPR2_TIM11_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 11 remapping */ - AFIO_REMAP_TIM10 = (AFIO_MAPR2_TIM10_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 10 remapping */ - AFIO_REMAP_TIM9 = (AFIO_MAPR2_TIM9_REMAP | - AFIO_REMAP_USE_MAPR2) /**< - Timer 9 */ -} afio_remap_peripheral; - -void afio_remap(afio_remap_peripheral p); - -/** - * @brief Debug port configuration - * - * Used to configure the behavior of JTAG and Serial Wire (SW) debug - * ports and their associated GPIO pins. - * - * @see afio_cfg_debug_ports() - */ -typedef enum afio_debug_cfg { - AFIO_DEBUG_FULL_SWJ = AFIO_MAPR_SWJ_CFG_FULL_SWJ, /**< - Full Serial Wire and JTAG debug */ - AFIO_DEBUG_FULL_SWJ_NO_NJRST = AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST, /**< - Full Serial Wire and JTAG, but no NJTRST. */ - AFIO_DEBUG_SW_ONLY = AFIO_MAPR_SWJ_CFG_NO_JTAG_SW, /**< - Serial Wire debug only (JTAG-DP disabled, - SW-DP enabled) */ - AFIO_DEBUG_NONE = AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW /**< - No debug; all JTAG and SW pins are free - for use as GPIOs. */ -} afio_debug_cfg; - -/** - * @brief Enable or disable the JTAG and SW debug ports. - * @param config Desired debug port configuration - * @see afio_debug_cfg - */ -static inline void afio_cfg_debug_ports(afio_debug_cfg config) { - __io uint32 *mapr = &AFIO_BASE->MAPR; - *mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; -} - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/STM32F4/cores/maple/libmaple/gpioF2.c b/STM32F4/cores/maple/libmaple/gpioF2.c deleted file mode 100644 index b04c7e9d6..000000000 --- a/STM32F4/cores/maple/libmaple/gpioF2.c +++ /dev/null @@ -1,224 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - - #ifdef STM32F2 - -/** - * @file gpio.c - * @brief GPIO initialization routine - */ - -#include "gpio.h" -#include "rcc.h" - -/* - * GPIO devices - */ - -gpio_dev gpioa = { - .regs = GPIOA_BASE, - .clk_id = RCC_GPIOA, - .exti_port = AFIO_EXTI_PA, -}; -/** GPIO port A device. */ -gpio_dev* const GPIOA = &gpioa; - -gpio_dev gpiob = { - .regs = GPIOB_BASE, - .clk_id = RCC_GPIOB, - .exti_port = AFIO_EXTI_PB, -}; -/** GPIO port B device. */ -gpio_dev* const GPIOB = &gpiob; - -gpio_dev gpioc = { - .regs = GPIOC_BASE, - .clk_id = RCC_GPIOC, - .exti_port = AFIO_EXTI_PC, -}; -/** GPIO port C device. */ -gpio_dev* const GPIOC = &gpioc; - -gpio_dev gpiod = { - .regs = GPIOD_BASE, - .clk_id = RCC_GPIOD, - .exti_port = AFIO_EXTI_PD, -}; -/** GPIO port D device. */ -gpio_dev* const GPIOD = &gpiod; - -#ifdef STM32_HIGH_DENSITY -gpio_dev gpioe = { - .regs = GPIOE_BASE, - .clk_id = RCC_GPIOE, - .exti_port = AFIO_EXTI_PE, -}; -/** GPIO port E device. */ -gpio_dev* const GPIOE = &gpioe; - -gpio_dev gpiof = { - .regs = GPIOF_BASE, - .clk_id = RCC_GPIOF, - .exti_port = AFIO_EXTI_PF, -}; -/** GPIO port F device. */ -gpio_dev* const GPIOF = &gpiof; - -gpio_dev gpiog = { - .regs = GPIOG_BASE, - .clk_id = RCC_GPIOG, - .exti_port = AFIO_EXTI_PG, -}; -/** GPIO port G device. */ -gpio_dev* const GPIOG = &gpiog; -#endif - -/* - * GPIO convenience routines - */ - -/** - * Initialize a GPIO device. - * - * Enables the clock for and resets the given device. - * - * @param dev GPIO device to initialize. - */ -void gpio_init(gpio_dev *dev) { - rcc_clk_enable(dev->clk_id); - rcc_reset_dev(dev->clk_id); -} - -/** - * Initialize and reset all available GPIO devices. - */ -void gpio_init_all(void) { - gpio_init(GPIOA); - gpio_init(GPIOB); - gpio_init(GPIOC); - gpio_init(GPIOD); - -#ifdef STM32_HIGH_DENSITY - gpio_init(GPIOE); - gpio_init(GPIOF); - gpio_init(GPIOG); -#endif - -#ifdef ARDUINO_STM32F4_NETDUINO2PLUS - // PA8 Output the Master Clock MCO1 - gpio_set_af_mode(GPIOA, 8, 0); - gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); - // PB4 as alternate MISO Input - gpio_set_af_mode(GPIOB, 4, 5); - // PA5 as alternate SCK Output - gpio_set_af_mode(GPIOA, 5, 5); - // PA7 as alternate MOSI Output - gpio_set_af_mode(GPIOA, 7, 5); -#endif -} - -/** - * Set the mode of a GPIO pin. - * - * @param dev GPIO device. - * @param pin Pin on the device whose mode to set, 0--15. - * @param mode General purpose or alternate function mode to set the pin to. - * @see gpio_pin_mode - */ -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { - gpio_reg_map *regs = dev->regs; - - //regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 8) & 15) << (4*(pin&7))); - //gpio_set_af_mode(dev, pin, mode>>8); - - regs->MODER = (regs->MODER & ~( 3 << (2*pin))) | (((mode >> 0) & 3) << (2*pin)); - regs->PUPDR = (regs->PUPDR & ~( 3 << (2*pin))) | (((mode >> 2) & 3) << (2*pin)); - regs->OSPEEDR = (regs->OSPEEDR & ~( 3 << (2*pin))) | (((mode >> 4) & 3) << (2*pin)); - regs->OTYPER = (regs->OTYPER & ~( 1 << (1*pin))) | (((mode >> 6) & 1) << (1*pin)); -} - -/** - * Set the alternate function mode of a GPIO pin. - * - * @param dev GPIO device. - * @param pin Pin on the device whose mode to set, 0--15. - * @param mode alternate function mode to set the pin to. - * @see gpio_pin_mode - */ -void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode) { - gpio_reg_map *regs = dev->regs; - - regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 0) & 15) << (4*(pin&7))); -} - -/* - * AFIO - */ - -/** - * @brief Initialize the AFIO clock, and reset the AFIO registers. - */ -void afio_init(void) { - //rcc_clk_enable(RCC_AFIO); - //rcc_reset_dev(RCC_AFIO); -} - -#define AFIO_EXTI_SEL_MASK 0xF - -/** - * @brief Select a source input for an external interrupt. - * - * @param exti External interrupt. - * @param gpio_port Port which contains pin to use as source input. - * @see afio_exti_num - * @see afio_exti_port - */ -void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port) { - __io uint32 *exti_cr = &SYSCFG_BASE->EXTICR1 + exti / 4; - uint32 shift = 4 * (exti % 4); - uint32 cr = *exti_cr; - - cr &= ~(AFIO_EXTI_SEL_MASK << shift); - cr |= gpio_port << shift; - *exti_cr = cr; -} - -/** - * @brief Perform an alternate function remap. - * @param remapping Remapping to perform. - */ -#if 0 -void afio_remap(afio_remap_peripheral remapping) { - if (remapping & AFIO_REMAP_USE_MAPR2) { - remapping &= ~AFIO_REMAP_USE_MAPR2; - AFIO_BASE->MAPR2 |= remapping; - } else { - AFIO_BASE->MAPR |= remapping; - } -} -#endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/gpioF2.h b/STM32F4/cores/maple/libmaple/gpioF2.h deleted file mode 100644 index 91bd67be3..000000000 --- a/STM32F4/cores/maple/libmaple/gpioF2.h +++ /dev/null @@ -1,550 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. -*****************************************************************************/ - -/** - * @file gpio.h - * - * @brief General purpose I/O (GPIO) and Alternate Function I/O - * (AFIO) prototypes, defines, and inlined access functions. - */ - -#ifndef _GPIO_H_ -#define _GPIO_H_ - -#include "libmaple.h" -#include "rcc.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * GPIO register maps and devices - */ - -/** GPIO register map type */ -typedef struct gpio_reg_map { - __io uint32 MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __io uint32 OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __io uint32 OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __io uint32 PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __io uint32 IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __io uint32 ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __io uint16 BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */ - __io uint16 BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */ - __io uint32 LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __io uint32 AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x24-0x28 */ -} gpio_reg_map; - - - -/** - * @brief External interrupt line port selector. - * - * Used to determine which GPIO port to map an external interrupt line - * onto. */ -/* (See AFIO sections, below) */ -typedef enum afio_exti_port { - AFIO_EXTI_PA, /**< Use port A (PAx) pin. */ - AFIO_EXTI_PB, /**< Use port B (PBx) pin. */ - AFIO_EXTI_PC, /**< Use port C (PCx) pin. */ - AFIO_EXTI_PD, /**< Use port D (PDx) pin. */ -#ifdef STM32_HIGH_DENSITY - AFIO_EXTI_PE, /**< Use port E (PEx) pin. */ - AFIO_EXTI_PF, /**< Use port F (PFx) pin. */ - AFIO_EXTI_PG, /**< Use port G (PGx) pin. */ -#endif -} afio_exti_port; - -/** GPIO device type */ -typedef struct gpio_dev { - gpio_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< RCC clock information */ - afio_exti_port exti_port; /**< AFIO external interrupt port value */ -} gpio_dev; - -extern gpio_dev gpioa; -extern gpio_dev* const GPIOA; -extern gpio_dev gpiob; -extern gpio_dev* const GPIOB; -extern gpio_dev gpioc; -extern gpio_dev* const GPIOC; -extern gpio_dev gpiod; -extern gpio_dev* const GPIOD; -#ifdef STM32_HIGH_DENSITY -extern gpio_dev gpioe; -extern gpio_dev* const GPIOE; -extern gpio_dev gpiof; -extern gpio_dev* const GPIOF; -extern gpio_dev gpiog; -extern gpio_dev* const GPIOG; -#endif - -/** GPIO port register map base pointer */ -#define GPIOA_BASE ((struct gpio_reg_map*)0x40020000) -#define GPIOB_BASE ((struct gpio_reg_map*)0x40020400) -#define GPIOC_BASE ((struct gpio_reg_map*)0x40020800) -#define GPIOD_BASE ((struct gpio_reg_map*)0x40020C00) -#ifdef STM32_HIGH_DENSITY -#define GPIOE_BASE ((struct gpio_reg_map*)0x40021000) -#define GPIOF_BASE ((struct gpio_reg_map*)0x40021400) -#define GPIOG_BASE ((struct gpio_reg_map*)0x40021800) -#endif - -/* - * GPIO register bit definitions - */ - -#define GPIO_MODE_INPUT 0 -#define GPIO_MODE_OUTPUT 1 -#define GPIO_MODE_AF 2 -#define GPIO_MODE_ANALOG 3 - -#define GPIO_PUPD_INPUT_FLOATING (0 << 2) -#define GPIO_PUPD_INPUT_PU (1 << 2) -#define GPIO_PUPD_INPUT_PD (2 << 2) - -#define GPIO_OSPEED_2MHZ (0 << 4) -#define GPIO_OSPEED_25MHZ (1 << 4) -#define GPIO_OSPEED_50MHZ (2 << 4) -#define GPIO_OSPEED_100MHZ (3 << 4) - -#define GPIO_OTYPE_PP (0 << 6) -#define GPIO_OTYPE_OD (1 << 6) - -/* -MODER -00: Input (reset state) -01: General purpose output mode -10: Alternate function mode -11: Analog mode - -OTYPER -0: Output push-pull (reset state) -1: Output open-drain - -OSPEEDR -00: 2 MHz Low speed -01: 25 MHz Medium speed -10: 50 MHz Fast speed -11: 100 MHz High speed on 30 pF (80 MHz Output max speed on 15 pF) - -PUPDR -00: No pull-up, pull-down -01: Pull-up -10: Pull-down - -AFRL 4 bit AF00-AF15 -AFRH 4 bit AF00-AF15 -*/ - -/** - * @brief GPIO Pin modes. - * - * These only allow for 50MHZ max output speeds; if you want slower, - * use direct register access. - */ -typedef enum gpio_pin_mode { - GPIO_OUTPUT_PP = (GPIO_MODE_OUTPUT | GPIO_OTYPE_PP | - GPIO_OSPEED_50MHZ), /**< Output push-pull. */ - GPIO_OUTPUT_OD = (GPIO_MODE_OUTPUT | GPIO_OTYPE_OD | - GPIO_OSPEED_50MHZ), /**< Output open-drain. */ - GPIO_AF_OUTPUT_PP = (GPIO_MODE_AF | GPIO_OTYPE_PP | - GPIO_OSPEED_50MHZ), /**< Alternate function - output push-pull. */ - GPIO_AF_OUTPUT_OD = (GPIO_MODE_AF | GPIO_OTYPE_OD | - GPIO_OSPEED_50MHZ), /**< Alternate function - output open drain. */ - GPIO_INPUT_ANALOG = (GPIO_MODE_ANALOG), /**< Analog input. */ - GPIO_INPUT_FLOATING = (GPIO_MODE_INPUT | - GPIO_PUPD_INPUT_FLOATING), /**< Input floating. */ - GPIO_INPUT_PD = (GPIO_MODE_INPUT | - GPIO_PUPD_INPUT_PD), /**< Input pull-down. */ - GPIO_INPUT_PU = (GPIO_MODE_INPUT | - GPIO_PUPD_INPUT_PU), /**< Input pull-up. */ - GPIO_AF_INPUT_PD = (GPIO_MODE_AF | - GPIO_PUPD_INPUT_PD), /**< Input pull-down. */ - GPIO_BIGNUMBER = 0xfff -} gpio_pin_mode; - -/* - * GPIO Convenience routines - */ - -void gpio_init(gpio_dev *dev); -void gpio_init_all(void); -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode); -void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode); - -/** - * @brief Get a GPIO port's corresponding afio_exti_port. - * @param dev GPIO device whose afio_exti_port to return. - */ -static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { - return dev->exti_port; -} - -/** - * Set or reset a GPIO pin. - * - * Pin must have previously been configured to output mode. - * - * @param dev GPIO device whose pin to set. - * @param pin Pin on to set or reset - * @param val If true, set the pin. If false, reset the pin. - */ -static inline void gpio_write_bit(gpio_dev *dev, uint8 pin, uint8 val) { - if (val) { - dev->regs->BSRRL = BIT(pin); - } else { - dev->regs->BSRRH = BIT(pin); - } -} - -/** - * Determine whether or not a GPIO pin is set. - * - * Pin must have previously been configured to input mode. - * - * @param dev GPIO device whose pin to test. - * @param pin Pin on dev to test. - * @return True if the pin is set, false otherwise. - */ -static inline uint32 gpio_read_bit(gpio_dev *dev, uint8 pin) { - return dev->regs->IDR & BIT(pin); -} - -/** - * Toggle a pin configured as output push-pull. - * @param dev GPIO device. - * @param pin Pin on dev to toggle. - */ -static inline void gpio_toggle_bit(gpio_dev *dev, uint8 pin) { - dev->regs->ODR = dev->regs->ODR ^ BIT(pin); -} - -/* - * AFIO register map - */ - -/** AFIO register map */ -typedef struct syscfg_reg_map { - __io uint32 MEMRM; /**< memory remap register */ - __io uint32 PMC; /**< peripheral mode configuration register */ - __io uint32 EXTICR1; /**< External interrupt configuration register 1. */ - __io uint32 EXTICR2; /**< External interrupt configuration register 2. */ - __io uint32 EXTICR3; /**< External interrupt configuration register 3. */ - __io uint32 EXTICR4; /**< External interrupt configuration register 4. */ - __io uint32 CMPCR; /**< Compensation cell control register */ -} syscfg_reg_map; - -/** AFIO register map base pointer. */ -#define SYSCFG_BASE ((struct syscfg_reg_map *)0x40013800) - -/* - * AFIO register bit definitions - */ - -/* Event control register */ - -#define AFIO_EVCR_EVOE (0x1 << 7) -#define AFIO_EVCR_PORT_PA (0x0 << 4) -#define AFIO_EVCR_PORT_PB (0x1 << 4) -#define AFIO_EVCR_PORT_PC (0x2 << 4) -#define AFIO_EVCR_PORT_PD (0x3 << 4) -#define AFIO_EVCR_PORT_PE (0x4 << 4) -#define AFIO_EVCR_PIN_0 0x0 -#define AFIO_EVCR_PIN_1 0x1 -#define AFIO_EVCR_PIN_2 0x2 -#define AFIO_EVCR_PIN_3 0x3 -#define AFIO_EVCR_PIN_4 0x4 -#define AFIO_EVCR_PIN_5 0x5 -#define AFIO_EVCR_PIN_6 0x6 -#define AFIO_EVCR_PIN_7 0x7 -#define AFIO_EVCR_PIN_8 0x8 -#define AFIO_EVCR_PIN_9 0x9 -#define AFIO_EVCR_PIN_10 0xA -#define AFIO_EVCR_PIN_11 0xB -#define AFIO_EVCR_PIN_12 0xC -#define AFIO_EVCR_PIN_13 0xD -#define AFIO_EVCR_PIN_14 0xE -#define AFIO_EVCR_PIN_15 0xF - -/* AF remap and debug I/O configuration register */ - -#define AFIO_MAPR_SWJ_CFG (0x7 << 24) -#define AFIO_MAPR_SWJ_CFG_FULL_SWJ (0x0 << 24) -#define AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST (0x1 << 24) -#define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24) -#define AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW (0x4 << 24) -#define AFIO_MAPR_ADC2_ETRGREG_REMAP BIT(20) -#define AFIO_MAPR_ADC2_ETRGINJ_REMAP BIT(19) -#define AFIO_MAPR_ADC1_ETRGREG_REMAP BIT(18) -#define AFIO_MAPR_ADC1_ETRGINJ_REMAP BIT(17) -#define AFIO_MAPR_TIM5CH4_IREMAP BIT(16) -#define AFIO_MAPR_PD01_REMAP BIT(15) -#define AFIO_MAPR_CAN_REMAP (0x3 << 13) -#define AFIO_MAPR_CAN_REMAP_NONE (0x0 << 13) -#define AFIO_MAPR_CAN_REMAP_PB8_PB9 (0x2 << 13) -#define AFIO_MAPR_CAN_REMAP_PD0_PD1 (0x3 << 13) -#define AFIO_MAPR_TIM4_REMAP BIT(12) -#define AFIO_MAPR_TIM3_REMAP (0x3 << 10) -#define AFIO_MAPR_TIM3_REMAP_NONE (0x0 << 10) -#define AFIO_MAPR_TIM3_REMAP_PARTIAL (0x2 << 10) -#define AFIO_MAPR_TIM3_REMAP_FULL (0x3 << 10) -#define AFIO_MAPR_TIM2_REMAP (0x3 << 8) -#define AFIO_MAPR_TIM2_REMAP_NONE (0x0 << 8) -#define AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3 (0x1 << 8) -#define AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11 (0x2 << 8) -#define AFIO_MAPR_TIM2_REMAP_FULL (0x3 << 8) -#define AFIO_MAPR_TIM1_REMAP (0x3 << 6) -#define AFIO_MAPR_TIM1_REMAP_NONE (0x0 << 6) -#define AFIO_MAPR_TIM1_REMAP_PARTIAL (0x1 << 6) -#define AFIO_MAPR_TIM1_REMAP_FULL (0x3 << 6) -#define AFIO_MAPR_USART3_REMAP (0x3 << 4) -#define AFIO_MAPR_USART3_REMAP_NONE (0x0 << 4) -#define AFIO_MAPR_USART3_REMAP_PARTIAL (0x1 << 4) -#define AFIO_MAPR_USART3_REMAP_FULL (0x3 << 4) -#define AFIO_MAPR_USART2_REMAP BIT(3) -#define AFIO_MAPR_USART1_REMAP BIT(2) -#define AFIO_MAPR_I2C1_REMAP BIT(1) -#define AFIO_MAPR_SPI1_REMAP BIT(0) - -/* External interrupt configuration register 1 */ - -#define AFIO_EXTICR1_EXTI3 (0xF << 12) -#define AFIO_EXTICR1_EXTI3_PA (0x0 << 12) -#define AFIO_EXTICR1_EXTI3_PB (0x1 << 12) -#define AFIO_EXTICR1_EXTI3_PC (0x2 << 12) -#define AFIO_EXTICR1_EXTI3_PD (0x3 << 12) -#define AFIO_EXTICR1_EXTI3_PE (0x4 << 12) -#define AFIO_EXTICR1_EXTI3_PF (0x5 << 12) -#define AFIO_EXTICR1_EXTI3_PG (0x6 << 12) -#define AFIO_EXTICR1_EXTI2 (0xF << 8) -#define AFIO_EXTICR1_EXTI2_PA (0x0 << 8) -#define AFIO_EXTICR1_EXTI2_PB (0x1 << 8) -#define AFIO_EXTICR1_EXTI2_PC (0x2 << 8) -#define AFIO_EXTICR1_EXTI2_PD (0x3 << 8) -#define AFIO_EXTICR1_EXTI2_PE (0x4 << 8) -#define AFIO_EXTICR1_EXTI2_PF (0x5 << 8) -#define AFIO_EXTICR1_EXTI2_PG (0x6 << 8) -#define AFIO_EXTICR1_EXTI1 (0xF << 4) -#define AFIO_EXTICR1_EXTI1_PA (0x0 << 4) -#define AFIO_EXTICR1_EXTI1_PB (0x1 << 4) -#define AFIO_EXTICR1_EXTI1_PC (0x2 << 4) -#define AFIO_EXTICR1_EXTI1_PD (0x3 << 4) -#define AFIO_EXTICR1_EXTI1_PE (0x4 << 4) -#define AFIO_EXTICR1_EXTI1_PF (0x5 << 4) -#define AFIO_EXTICR1_EXTI1_PG (0x6 << 4) -#define AFIO_EXTICR1_EXTI0 0xF -#define AFIO_EXTICR1_EXTI0_PA 0x0 -#define AFIO_EXTICR1_EXTI0_PB 0x1 -#define AFIO_EXTICR1_EXTI0_PC 0x2 -#define AFIO_EXTICR1_EXTI0_PD 0x3 -#define AFIO_EXTICR1_EXTI0_PE 0x4 -#define AFIO_EXTICR1_EXTI0_PF 0x5 -#define AFIO_EXTICR1_EXTI0_PG 0x6 - -/* External interrupt configuration register 2 */ - -#define AFIO_EXTICR2_EXTI7 (0xF << 12) -#define AFIO_EXTICR2_EXTI7_PA (0x0 << 12) -#define AFIO_EXTICR2_EXTI7_PB (0x1 << 12) -#define AFIO_EXTICR2_EXTI7_PC (0x2 << 12) -#define AFIO_EXTICR2_EXTI7_PD (0x3 << 12) -#define AFIO_EXTICR2_EXTI7_PE (0x4 << 12) -#define AFIO_EXTICR2_EXTI7_PF (0x5 << 12) -#define AFIO_EXTICR2_EXTI7_PG (0x6 << 12) -#define AFIO_EXTICR2_EXTI6 (0xF << 8) -#define AFIO_EXTICR2_EXTI6_PA (0x0 << 8) -#define AFIO_EXTICR2_EXTI6_PB (0x1 << 8) -#define AFIO_EXTICR2_EXTI6_PC (0x2 << 8) -#define AFIO_EXTICR2_EXTI6_PD (0x3 << 8) -#define AFIO_EXTICR2_EXTI6_PE (0x4 << 8) -#define AFIO_EXTICR2_EXTI6_PF (0x5 << 8) -#define AFIO_EXTICR2_EXTI6_PG (0x6 << 8) -#define AFIO_EXTICR2_EXTI5 (0xF << 4) -#define AFIO_EXTICR2_EXTI5_PA (0x0 << 4) -#define AFIO_EXTICR2_EXTI5_PB (0x1 << 4) -#define AFIO_EXTICR2_EXTI5_PC (0x2 << 4) -#define AFIO_EXTICR2_EXTI5_PD (0x3 << 4) -#define AFIO_EXTICR2_EXTI5_PE (0x4 << 4) -#define AFIO_EXTICR2_EXTI5_PF (0x5 << 4) -#define AFIO_EXTICR2_EXTI5_PG (0x6 << 4) -#define AFIO_EXTICR2_EXTI4 0xF -#define AFIO_EXTICR2_EXTI4_PA 0x0 -#define AFIO_EXTICR2_EXTI4_PB 0x1 -#define AFIO_EXTICR2_EXTI4_PC 0x2 -#define AFIO_EXTICR2_EXTI4_PD 0x3 -#define AFIO_EXTICR2_EXTI4_PE 0x4 -#define AFIO_EXTICR2_EXTI4_PF 0x5 -#define AFIO_EXTICR2_EXTI4_PG 0x6 - -/* AF remap and debug I/O configuration register 2 */ - -#define AFIO_MAPR2_FSMC_NADV BIT(10) -#define AFIO_MAPR2_TIM14_REMAP BIT(9) -#define AFIO_MAPR2_TIM13_REMAP BIT(8) -#define AFIO_MAPR2_TIM11_REMAP BIT(7) -#define AFIO_MAPR2_TIM10_REMAP BIT(6) -#define AFIO_MAPR2_TIM9_REMAP BIT(5) - -/* - * AFIO convenience routines - */ - -void afio_init(void); - -/** - * External interrupt line numbers. - */ -typedef enum afio_exti_num { - AFIO_EXTI_0, /**< External interrupt line 0. */ - AFIO_EXTI_1, /**< External interrupt line 1. */ - AFIO_EXTI_2, /**< External interrupt line 2. */ - AFIO_EXTI_3, /**< External interrupt line 3. */ - AFIO_EXTI_4, /**< External interrupt line 4. */ - AFIO_EXTI_5, /**< External interrupt line 5. */ - AFIO_EXTI_6, /**< External interrupt line 6. */ - AFIO_EXTI_7, /**< External interrupt line 7. */ - AFIO_EXTI_8, /**< External interrupt line 8. */ - AFIO_EXTI_9, /**< External interrupt line 9. */ - AFIO_EXTI_10, /**< External interrupt line 10. */ - AFIO_EXTI_11, /**< External interrupt line 11. */ - AFIO_EXTI_12, /**< External interrupt line 12. */ - AFIO_EXTI_13, /**< External interrupt line 13. */ - AFIO_EXTI_14, /**< External interrupt line 14. */ - AFIO_EXTI_15, /**< External interrupt line 15. */ -} afio_exti_num; - -void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port); - -/* HACK: Use upper bit to denote MAPR2, Bit 31 is reserved and - * not used in either MAPR or MAPR2 */ -#define AFIO_REMAP_USE_MAPR2 (1 << 31) - -/** - * @brief Available peripheral remaps. - * @see afio_remap() - */ -typedef enum afio_remap_peripheral { - AFIO_REMAP_ADC2_ETRGREG = AFIO_MAPR_ADC2_ETRGREG_REMAP, /**< - ADC 2 external trigger regular conversion remapping */ - AFIO_REMAP_ADC2_ETRGINJ = AFIO_MAPR_ADC2_ETRGINJ_REMAP, /**< - ADC 2 external trigger injected conversion remapping */ - AFIO_REMAP_ADC1_ETRGREG = AFIO_MAPR_ADC1_ETRGREG_REMAP, /**< - ADC 1 external trigger regular conversion remapping */ - AFIO_REMAP_ADC1_ETRGINJ = AFIO_MAPR_ADC1_ETRGINJ_REMAP, /**< - ADC 1 external trigger injected conversion remapping */ - AFIO_REMAP_TIM5CH4_I = AFIO_MAPR_TIM5CH4_IREMAP, /**< - Timer 5 channel 4 internal remapping */ - AFIO_REMAP_PD01 = AFIO_MAPR_PD01_REMAP, /**< - Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ - AFIO_REMAP_CAN_1 = AFIO_MAPR_CAN_REMAP_PB8_PB9, /**< - CAN alternate function remapping 1 (RX on PB8, TX on PB9) */ - AFIO_REMAP_CAN_2 = AFIO_MAPR_CAN_REMAP_PD0_PD1, /**< - CAN alternate function remapping 2 (RX on PD0, TX on PD1) */ - AFIO_REMAP_TIM4 = AFIO_MAPR_TIM4_REMAP, /**< - Timer 4 remapping */ - AFIO_REMAP_TIM3_PARTIAL = AFIO_MAPR_TIM3_REMAP_PARTIAL, /**< - Timer 3 partial remapping */ - AFIO_REMAP_TIM3_FULL = AFIO_MAPR_TIM3_REMAP_FULL, /**< - Timer 3 full remapping */ - AFIO_REMAP_TIM2_PARTIAL_1 = AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3, /**< - Timer 2 partial remapping 1 (CH1 and ETR on PA15, CH2 on PB3, CH3 - on PA2, CH4 on PA3) */ - AFIO_REMAP_TIM2_PARTIAL_2 = AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11, /**< - Timer 2 partial remapping 2 (CH1 and ETR on PA0, CH2 on PA1, CH3 - on PB10, CH4 on PB11) */ - AFIO_REMAP_TIM2_FULL = AFIO_MAPR_TIM2_REMAP_FULL, /**< - Timer 2 full remapping */ - AFIO_REMAP_USART2 = AFIO_MAPR_USART2_REMAP, /**< - USART 2 remapping */ - AFIO_REMAP_USART1 = AFIO_MAPR_USART1_REMAP, /**< - USART 1 remapping */ - AFIO_REMAP_I2C1 = AFIO_MAPR_I2C1_REMAP, /**< - I2C 1 remapping */ - AFIO_REMAP_SPI1 = AFIO_MAPR_SPI1_REMAP, /**< - SPI 1 remapping */ - AFIO_REMAP_FSMC_NADV = (AFIO_MAPR2_FSMC_NADV | - AFIO_REMAP_USE_MAPR2), /**< - NADV signal not connected */ - AFIO_REMAP_TIM14 = (AFIO_MAPR2_TIM14_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 14 remapping */ - AFIO_REMAP_TIM13 = (AFIO_MAPR2_TIM13_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 13 remapping */ - AFIO_REMAP_TIM11 = (AFIO_MAPR2_TIM11_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 11 remapping */ - AFIO_REMAP_TIM10 = (AFIO_MAPR2_TIM10_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 10 remapping */ - AFIO_REMAP_TIM9 = (AFIO_MAPR2_TIM9_REMAP | - AFIO_REMAP_USE_MAPR2) /**< - Timer 9 */ -} afio_remap_peripheral; - -void afio_remap(afio_remap_peripheral p); - -/** - * @brief Debug port configuration - * - * Used to configure the behavior of JTAG and Serial Wire (SW) debug - * ports and their associated GPIO pins. - * - * @see afio_cfg_debug_ports() - */ -typedef enum afio_debug_cfg { - AFIO_DEBUG_FULL_SWJ = AFIO_MAPR_SWJ_CFG_FULL_SWJ, /**< - Full Serial Wire and JTAG debug */ - AFIO_DEBUG_FULL_SWJ_NO_NJRST = AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST, /**< - Full Serial Wire and JTAG, but no NJTRST. */ - AFIO_DEBUG_SW_ONLY = AFIO_MAPR_SWJ_CFG_NO_JTAG_SW, /**< - Serial Wire debug only (JTAG-DP disabled, - SW-DP enabled) */ - AFIO_DEBUG_NONE = AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW /**< - No debug; all JTAG and SW pins are free - for use as GPIOs. */ -} afio_debug_cfg; - -/** - * @brief Enable or disable the JTAG and SW debug ports. - * @param config Desired debug port configuration - * @see afio_debug_cfg - */ -static inline void afio_cfg_debug_ports(afio_debug_cfg config) { - //__io uint32 *mapr = &AFIO_BASE->MAPR; - //*mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; -} - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/STM32F4/cores/maple/libmaple/rcc.c b/STM32F4/cores/maple/libmaple/rcc.c deleted file mode 100644 index b3cb9c5d1..000000000 --- a/STM32F4/cores/maple/libmaple/rcc.c +++ /dev/null @@ -1,37 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file rcc.c - * @brief Implements pretty much only the basic clock setup on the - * stm32, clock enable/disable and peripheral reset commands. - */ - -// #ifdef STM32F2 -// #include "rccF2.c" -// #else -// #include "rccF1.c" -// #endif diff --git a/STM32F4/cores/maple/libmaple/rccF1.c b/STM32F4/cores/maple/libmaple/rccF1.c deleted file mode 100644 index 9eb56b872..000000000 --- a/STM32F4/cores/maple/libmaple/rccF1.c +++ /dev/null @@ -1,233 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - - #ifdef STM32F1 - -/** - * @file rcc.c - * @brief Implements pretty much only the basic clock setup on the - * stm32, clock enable/disable and peripheral reset commands. - */ - -#include "libmaple.h" -#include "flash.h" -#include "rcc.h" -#include "bitband.h" - -#define APB1 RCC_APB1 -#define APB2 RCC_APB2 -#define AHB RCC_AHB - -struct rcc_dev_info { - const rcc_clk_domain clk_domain; - const uint8 line_num; -}; - -/* Device descriptor table, maps rcc_clk_id onto bus and enable/reset - * register bit numbers. */ -static const struct rcc_dev_info rcc_dev_table[] = { - [RCC_GPIOA] = { .clk_domain = APB2, .line_num = 2 }, - [RCC_GPIOB] = { .clk_domain = APB2, .line_num = 3 }, - [RCC_GPIOC] = { .clk_domain = APB2, .line_num = 4 }, - [RCC_GPIOD] = { .clk_domain = APB2, .line_num = 5 }, - [RCC_AFIO] = { .clk_domain = APB2, .line_num = 0 }, - [RCC_ADC1] = { .clk_domain = APB2, .line_num = 9 }, - [RCC_ADC2] = { .clk_domain = APB2, .line_num = 10 }, - [RCC_ADC3] = { .clk_domain = APB2, .line_num = 15 }, - [RCC_USART1] = { .clk_domain = APB2, .line_num = 14 }, - [RCC_USART2] = { .clk_domain = APB1, .line_num = 17 }, - [RCC_USART3] = { .clk_domain = APB1, .line_num = 18 }, - [RCC_TIMER1] = { .clk_domain = APB2, .line_num = 11 }, - [RCC_TIMER2] = { .clk_domain = APB1, .line_num = 0 }, - [RCC_TIMER3] = { .clk_domain = APB1, .line_num = 1 }, - [RCC_TIMER4] = { .clk_domain = APB1, .line_num = 2 }, - [RCC_SPI1] = { .clk_domain = APB2, .line_num = 12 }, - [RCC_SPI2] = { .clk_domain = APB1, .line_num = 14 }, - [RCC_DMA1] = { .clk_domain = AHB, .line_num = 0 }, - [RCC_PWR] = { .clk_domain = APB1, .line_num = 28}, - [RCC_BKP] = { .clk_domain = APB1, .line_num = 27}, - [RCC_I2C1] = { .clk_domain = APB1, .line_num = 21 }, - [RCC_I2C2] = { .clk_domain = APB1, .line_num = 22 }, - [RCC_CRC] = { .clk_domain = AHB, .line_num = 6}, - [RCC_FLITF] = { .clk_domain = AHB, .line_num = 4}, - [RCC_SRAM] = { .clk_domain = AHB, .line_num = 2}, -#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) - [RCC_GPIOE] = { .clk_domain = APB2, .line_num = 6 }, - [RCC_GPIOF] = { .clk_domain = APB2, .line_num = 7 }, - [RCC_GPIOG] = { .clk_domain = APB2, .line_num = 8 }, - [RCC_UART4] = { .clk_domain = APB1, .line_num = 19 }, - [RCC_UART5] = { .clk_domain = APB1, .line_num = 20 }, - [RCC_TIMER5] = { .clk_domain = APB1, .line_num = 3 }, - [RCC_TIMER6] = { .clk_domain = APB1, .line_num = 4 }, - [RCC_TIMER7] = { .clk_domain = APB1, .line_num = 5 }, - [RCC_TIMER8] = { .clk_domain = APB2, .line_num = 13 }, - [RCC_FSMC] = { .clk_domain = AHB, .line_num = 8 }, - [RCC_DAC] = { .clk_domain = APB1, .line_num = 29 }, - [RCC_DMA2] = { .clk_domain = AHB, .line_num = 1 }, - [RCC_SDIO] = { .clk_domain = AHB, .line_num = 10 }, - [RCC_SPI3] = { .clk_domain = APB1, .line_num = 15 }, -#endif -#ifdef STM32_XL_DENSITY - [RCC_TIMER9] = { .clk_domain = APB2, .line_num = 19 }, - [RCC_TIMER10] = { .clk_domain = APB2, .line_num = 20 }, - [RCC_TIMER11] = { .clk_domain = APB2, .line_num = 21 }, - [RCC_TIMER12] = { .clk_domain = APB1, .line_num = 6 }, - [RCC_TIMER13] = { .clk_domain = APB1, .line_num = 7 }, - [RCC_TIMER14] = { .clk_domain = APB1, .line_num = 8 }, -#endif -}; - -/** - * @brief Initialize the clock control system. Initializes the system - * clock source to use the PLL driven by an external oscillator - * @param sysclk_src system clock source, must be PLL - * @param pll_src pll clock source, must be HSE - * @param pll_mul pll multiplier - */ -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul) { - uint32 cfgr = 0; - uint32 cr; - - /* Assume that we're going to clock the chip off the PLL, fed by - * the HSE */ - ASSERT(sysclk_src == RCC_CLKSRC_PLL && - pll_src == RCC_PLLSRC_HSE); - - RCC_BASE->CFGR = pll_src | pll_mul; - - /* Turn on the HSE */ - cr = RCC_BASE->CR; - cr |= RCC_CR_HSEON; - RCC_BASE->CR = cr; - while (!(RCC_BASE->CR & RCC_CR_HSERDY)) - ; - - /* Now the PLL */ - cr |= RCC_CR_PLLON; - RCC_BASE->CR = cr; - while (!(RCC_BASE->CR & RCC_CR_PLLRDY)) - ; - - /* Finally, let's switch over to the PLL */ - cfgr &= ~RCC_CFGR_SW; - cfgr |= RCC_CFGR_SW_PLL; - RCC_BASE->CFGR = cfgr; - while ((RCC_BASE->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) - ; -} - -/** - * @brief Turn on the clock line on a peripheral - * @param id Clock ID of the peripheral to turn on. - */ -void rcc_clk_enable(rcc_clk_id id) { - static const __io uint32* enable_regs[] = { - [APB1] = &RCC_BASE->APB1ENR, - [APB2] = &RCC_BASE->APB2ENR, - [AHB] = &RCC_BASE->AHBENR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io uint32* enr = (__io uint32*)enable_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(enr, lnum, 1); -} - -/** - * @brief Reset a peripheral. - * @param id Clock ID of the peripheral to reset. - */ -void rcc_reset_dev(rcc_clk_id id) { - static const __io uint32* reset_regs[] = { - [APB1] = &RCC_BASE->APB1RSTR, - [APB2] = &RCC_BASE->APB2RSTR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io void* addr = (__io void*)reset_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(addr, lnum, 1); - bb_peri_set_bit(addr, lnum, 0); -} - -/** - * @brief Get a peripheral's clock domain - * @param id Clock ID of the peripheral whose clock domain to return - * @return Clock source for the given clock ID - */ -rcc_clk_domain rcc_dev_clk(rcc_clk_id id) { - return rcc_dev_table[id].clk_domain; -} - -/** - * @brief Get a peripheral's clock domain speed - * @param id Clock ID of the peripheral whose clock domain speed to return - * @return Clock speed for the given clock ID - */ -uint32 rcc_dev_clk_speed(rcc_clk_id id) { - static const uint32 rcc_dev_clk_speed_table[] = { - [RCC_AHB] = 72000000, - [RCC_APB1] = 36000000, - [RCC_APB2] = 72000000 - }; - return rcc_dev_clk_speed_table[rcc_dev_clk(id)]; -} - -/** - * @brief Get a peripheral's timer clock domain speed - * @param id Clock ID of the peripheral whose clock domain speed to return - * @return Clock speed for the given clock ID - */ -uint32 rcc_dev_timer_clk_speed(rcc_clk_id id) { - return rcc_dev_clk_speed(RCC_APB2); // 72 MHz for all counter -} - -/** - * @brief Set the divider on a peripheral prescaler - * @param prescaler prescaler to set - * @param divider prescaler divider - */ -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) { - static const uint32 masks[] = { - [RCC_PRESCALER_AHB] = RCC_CFGR_HPRE, - [RCC_PRESCALER_APB1] = RCC_CFGR_PPRE1, - [RCC_PRESCALER_APB2] = RCC_CFGR_PPRE2, - [RCC_PRESCALER_USB] = RCC_CFGR_USBPRE, - [RCC_PRESCALER_ADC] = RCC_CFGR_ADCPRE, - }; - - uint32 cfgr = RCC_BASE->CFGR; - cfgr &= ~masks[prescaler]; - cfgr |= divider; - RCC_BASE->CFGR = cfgr; -} - - -#endif diff --git a/STM32F4/cores/maple/libmaple/rccF1.h b/STM32F4/cores/maple/libmaple/rccF1.h deleted file mode 100644 index dd79704d8..000000000 --- a/STM32F4/cores/maple/libmaple/rccF1.h +++ /dev/null @@ -1,572 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file rcc.h - * @brief reset and clock control definitions and prototypes - */ - -#include "libmaple_types.h" - -#ifndef _RCC_H_ -#define _RCC_H_ - -#ifdef __cplusplus -extern "C"{ -#endif - -/** RCC register map type */ -typedef struct rcc_reg_map { - __io uint32 CR; /**< Clock control register */ - __io uint32 CFGR; /**< Clock configuration register */ - __io uint32 CIR; /**< Clock interrupt register */ - __io uint32 APB2RSTR; /**< APB2 peripheral reset register */ - __io uint32 APB1RSTR; /**< APB1 peripheral reset register */ - __io uint32 AHBENR; /**< AHB peripheral clock enable register */ - __io uint32 APB2ENR; /**< APB2 peripheral clock enable register */ - __io uint32 APB1ENR; /**< APB1 peripheral clock enable register */ - __io uint32 BDCR; /**< Backup domain control register */ - __io uint32 CSR; /**< Control/status register */ -} rcc_reg_map; - -/** RCC register map base pointer */ -#define RCC_BASE ((struct rcc_reg_map*)0x40021000) - -/* - * Register bit definitions - */ - -/* Clock control register */ - -#define RCC_CR_PLLRDY_BIT 25 -#define RCC_CR_PLLON_BIT 24 -#define RCC_CR_CSSON_BIT 19 -#define RCC_CR_HSEBYP_BIT 18 -#define RCC_CR_HSERDY_BIT 17 -#define RCC_CR_HSEON_BIT 16 -#define RCC_CR_HSIRDY_BIT 1 -#define RCC_CR_HSION_BIT 0 - -#define RCC_CR_PLLRDY BIT(RCC_CR_PLLRDY_BIT) -#define RCC_CR_PLLON BIT(RCC_CR_PLLON_BIT) -#define RCC_CR_CSSON BIT(RCC_CR_CSSON_BIT) -#define RCC_CR_HSEBYP BIT(RCC_CR_HSEBYP_BIT) -#define RCC_CR_HSERDY BIT(RCC_CR_HSERDY_BIT) -#define RCC_CR_HSEON BIT(RCC_CR_HSEON_BIT) -#define RCC_CR_HSICAL (0xFF << 8) -#define RCC_CR_HSITRIM (0x1F << 3) -#define RCC_CR_HSIRDY BIT(RCC_CR_HSIRDY_BIT) -#define RCC_CR_HSION BIT(RCC_CR_HSION_BIT) - -/* Clock configuration register */ - -#define RCC_CFGR_USBPRE_BIT 22 -#define RCC_CFGR_PLLXTPRE_BIT 17 -#define RCC_CFGR_PLLSRC_BIT 16 - -#define RCC_CFGR_MCO (0x3 << 24) -#define RCC_CFGR_USBPRE BIT(RCC_CFGR_USBPRE_BIT) -#define RCC_CFGR_PLLMUL (0xF << 18) -#define RCC_CFGR_PLLXTPRE BIT(RCC_CFGR_PLLXTPRE_BIT) -#define RCC_CFGR_PLLSRC BIT(RCC_CFGR_PLLSRC_BIT) -#define RCC_CFGR_ADCPRE (0x3 << 14) -#define RCC_CFGR_PPRE2 (0x7 << 11) -#define RCC_CFGR_PPRE1 (0x7 << 8) -#define RCC_CFGR_HPRE (0xF << 4) -#define RCC_CFGR_SWS (0x3 << 2) -#define RCC_CFGR_SWS_PLL (0x2 << 2) -#define RCC_CFGR_SWS_HSE (0x1 << 2) -#define RCC_CFGR_SW 0x3 -#define RCC_CFGR_SW_PLL 0x2 -#define RCC_CFGR_SW_HSE 0x1 - -/* Clock interrupt register */ - -#define RCC_CIR_CSSC_BIT 23 -#define RCC_CIR_PLLRDYC_BIT 20 -#define RCC_CIR_HSERDYC_BIT 19 -#define RCC_CIR_HSIRDYC_BIT 18 -#define RCC_CIR_LSERDYC_BIT 17 -#define RCC_CIR_LSIRDYC_BIT 16 -#define RCC_CIR_PLLRDYIE_BIT 12 -#define RCC_CIR_HSERDYIE_BIT 11 -#define RCC_CIR_HSIRDYIE_BIT 10 -#define RCC_CIR_LSERDYIE_BIT 9 -#define RCC_CIR_LSIRDYIE_BIT 8 -#define RCC_CIR_CSSF_BIT 7 -#define RCC_CIR_PLLRDYF_BIT 4 -#define RCC_CIR_HSERDYF_BIT 3 -#define RCC_CIR_HSIRDYF_BIT 2 -#define RCC_CIR_LSERDYF_BIT 1 -#define RCC_CIR_LSIRDYF_BIT 0 - -#define RCC_CIR_CSSC BIT(RCC_CIR_CSSC_BIT) -#define RCC_CIR_PLLRDYC BIT(RCC_CIR_PLLRDYC_BIT) -#define RCC_CIR_HSERDYC BIT(RCC_CIR_HSERDYC_BIT) -#define RCC_CIR_HSIRDYC BIT(RCC_CIR_HSIRDYC_BIT) -#define RCC_CIR_LSERDYC BIT(RCC_CIR_LSERDYC_BIT) -#define RCC_CIR_LSIRDYC BIT(RCC_CIR_LSIRDYC_BIT) -#define RCC_CIR_PLLRDYIE BIT(RCC_CIR_PLLRDYIE_BIT) -#define RCC_CIR_HSERDYIE BIT(RCC_CIR_HSERDYIE_BIT) -#define RCC_CIR_HSIRDYIE BIT(RCC_CIR_HSIRDYIE_BIT) -#define RCC_CIR_LSERDYIE BIT(RCC_CIR_LSERDYIE_BIT) -#define RCC_CIR_LSIRDYIE BIT(RCC_CIR_LSIRDYIE_BIT) -#define RCC_CIR_CSSF BIT(RCC_CIR_CSSF_BIT) -#define RCC_CIR_PLLRDYF BIT(RCC_CIR_PLLRDYF_BIT) -#define RCC_CIR_HSERDYF BIT(RCC_CIR_HSERDYF_BIT) -#define RCC_CIR_HSIRDYF BIT(RCC_CIR_HSIRDYF_BIT) -#define RCC_CIR_LSERDYF BIT(RCC_CIR_LSERDYF_BIT) -#define RCC_CIR_LSIRDYF BIT(RCC_CIR_LSIRDYF_BIT) - -/* APB2 peripheral reset register */ - -#define RCC_APB2RSTR_TIM11RST_BIT 21 -#define RCC_APB2RSTR_TIM10RST_BIT 20 -#define RCC_APB2RSTR_TIM9RST_BIT 19 -#define RCC_APB2RSTR_ADC3RST_BIT 15 -#define RCC_APB2RSTR_USART1RST_BIT 14 -#define RCC_APB2RSTR_TIM8RST_BIT 13 -#define RCC_APB2RSTR_SPI1RST_BIT 12 -#define RCC_APB2RSTR_TIM1RST_BIT 11 -#define RCC_APB2RSTR_ADC2RST_BIT 10 -#define RCC_APB2RSTR_ADC1RST_BIT 9 -#define RCC_APB2RSTR_IOPGRST_BIT 8 -#define RCC_APB2RSTR_IOPFRST_BIT 7 -#define RCC_APB2RSTR_IOPERST_BIT 6 -#define RCC_APB2RSTR_IOPDRST_BIT 5 -#define RCC_APB2RSTR_IOPCRST_BIT 4 -#define RCC_APB2RSTR_IOPBRST_BIT 3 -#define RCC_APB2RSTR_IOPARST_BIT 2 -#define RCC_APB2RSTR_AFIORST_BIT 0 - -#define RCC_APB2RSTR_TIM11RST BIT(RCC_APB2RSTR_TIM11RST_BIT) -#define RCC_APB2RSTR_TIM10RST BIT(RCC_APB2RSTR_TIM10RST_BIT) -#define RCC_APB2RSTR_TIM9RST BIT(RCC_APB2RSTR_TIM9RST_BIT) -#define RCC_APB2RSTR_ADC3RST BIT(RCC_APB2RSTR_ADC3RST_BIT) -#define RCC_APB2RSTR_USART1RST BIT(RCC_APB2RSTR_USART1RST_BIT) -#define RCC_APB2RSTR_TIM8RST BIT(RCC_APB2RSTR_TIM8RST_BIT) -#define RCC_APB2RSTR_SPI1RST BIT(RCC_APB2RSTR_SPI1RST_BIT) -#define RCC_APB2RSTR_TIM1RST BIT(RCC_APB2RSTR_TIM1RST_BIT) -#define RCC_APB2RSTR_ADC2RST BIT(RCC_APB2RSTR_ADC2RST_BIT) -#define RCC_APB2RSTR_ADC1RST BIT(RCC_APB2RSTR_ADC1RST_BIT) -#define RCC_APB2RSTR_IOPGRST BIT(RCC_APB2RSTR_IOPGRST_BIT) -#define RCC_APB2RSTR_IOPFRST BIT(RCC_APB2RSTR_IOPFRST_BIT) -#define RCC_APB2RSTR_IOPERST BIT(RCC_APB2RSTR_IOPERST_BIT) -#define RCC_APB2RSTR_IOPDRST BIT(RCC_APB2RSTR_IOPDRST_BIT) -#define RCC_APB2RSTR_IOPCRST BIT(RCC_APB2RSTR_IOPCRST_BIT) -#define RCC_APB2RSTR_IOPBRST BIT(RCC_APB2RSTR_IOPBRST_BIT) -#define RCC_APB2RSTR_IOPARST BIT(RCC_APB2RSTR_IOPARST_BIT) -#define RCC_APB2RSTR_AFIORST BIT(RCC_APB2RSTR_AFIORST_BIT) - -/* APB1 peripheral reset register */ - -#define RCC_APB1RSTR_DACRST_BIT 29 -#define RCC_APB1RSTR_PWRRST_BIT 28 -#define RCC_APB1RSTR_BKPRST_BIT 27 -#define RCC_APB1RSTR_CANRST_BIT 25 -#define RCC_APB1RSTR_USBRST_BIT 23 -#define RCC_APB1RSTR_I2C2RST_BIT 22 -#define RCC_APB1RSTR_I2C1RST_BIT 21 -#define RCC_APB1RSTR_UART5RST_BIT 20 -#define RCC_APB1RSTR_UART4RST_BIT 19 -#define RCC_APB1RSTR_USART3RST_BIT 18 -#define RCC_APB1RSTR_USART2RST_BIT 17 -#define RCC_APB1RSTR_SPI3RST_BIT 15 -#define RCC_APB1RSTR_SPI2RST_BIT 14 -#define RCC_APB1RSTR_WWDRST_BIT 11 -#define RCC_APB1RSTR_TIM14RST_BIT 8 -#define RCC_APB1RSTR_TIM13RST_BIT 7 -#define RCC_APB1RSTR_TIM12RST_BIT 6 -#define RCC_APB1RSTR_TIM7RST_BIT 5 -#define RCC_APB1RSTR_TIM6RST_BIT 4 -#define RCC_APB1RSTR_TIM5RST_BIT 3 -#define RCC_APB1RSTR_TIM4RST_BIT 2 -#define RCC_APB1RSTR_TIM3RST_BIT 1 -#define RCC_APB1RSTR_TIM2RST_BIT 0 - -#define RCC_APB1RSTR_DACRST BIT(RCC_APB1RSTR_DACRST_BIT) -#define RCC_APB1RSTR_PWRRST BIT(RCC_APB1RSTR_PWRRST_BIT) -#define RCC_APB1RSTR_BKPRST BIT(RCC_APB1RSTR_BKPRST_BIT) -#define RCC_APB1RSTR_CANRST BIT(RCC_APB1RSTR_CANRST_BIT) -#define RCC_APB1RSTR_USBRST BIT(RCC_APB1RSTR_USBRST_BIT) -#define RCC_APB1RSTR_I2C2RST BIT(RCC_APB1RSTR_I2C2RST_BIT) -#define RCC_APB1RSTR_I2C1RST BIT(RCC_APB1RSTR_I2C1RST_BIT) -#define RCC_APB1RSTR_UART5RST BIT(RCC_APB1RSTR_UART5RST_BIT) -#define RCC_APB1RSTR_UART4RST BIT(RCC_APB1RSTR_UART4RST_BIT) -#define RCC_APB1RSTR_USART3RST BIT(RCC_APB1RSTR_USART3RST_BIT) -#define RCC_APB1RSTR_USART2RST BIT(RCC_APB1RSTR_USART2RST_BIT) -#define RCC_APB1RSTR_SPI3RST BIT(RCC_APB1RSTR_SPI3RST_BIT) -#define RCC_APB1RSTR_SPI2RST BIT(RCC_APB1RSTR_SPI2RST_BIT) -#define RCC_APB1RSTR_WWDRST BIT(RCC_APB1RSTR_WWDRST_BIT) -#define RCC_APB1RSTR_TIM14RST BIT(RCC_APB1RSTR_TIM14RST_BIT) -#define RCC_APB1RSTR_TIM13RST BIT(RCC_APB1RSTR_TIM13RST_BIT) -#define RCC_APB1RSTR_TIM12RST BIT(RCC_APB1RSTR_TIM12RST_BIT) -#define RCC_APB1RSTR_TIM7RST BIT(RCC_APB1RSTR_TIM7RST_BIT) -#define RCC_APB1RSTR_TIM6RST BIT(RCC_APB1RSTR_TIM6RST_BIT) -#define RCC_APB1RSTR_TIM5RST BIT(RCC_APB1RSTR_TIM5RST_BIT) -#define RCC_APB1RSTR_TIM4RST BIT(RCC_APB1RSTR_TIM4RST_BIT) -#define RCC_APB1RSTR_TIM3RST BIT(RCC_APB1RSTR_TIM3RST_BIT) -#define RCC_APB1RSTR_TIM2RST BIT(RCC_APB1RSTR_TIM2RST_BIT) - -/* AHB peripheral clock enable register */ - -#define RCC_AHBENR_SDIOEN_BIT 10 -#define RCC_AHBENR_FSMCEN_BIT 8 -#define RCC_AHBENR_CRCEN_BIT 7 -#define RCC_AHBENR_FLITFEN_BIT 4 -#define RCC_AHBENR_SRAMEN_BIT 2 -#define RCC_AHBENR_DMA2EN_BIT 1 -#define RCC_AHBENR_DMA1EN_BIT 0 - -#define RCC_AHBENR_SDIOEN BIT(RCC_AHBENR_SDIOEN_BIT) -#define RCC_AHBENR_FSMCEN BIT(RCC_AHBENR_FSMCEN_BIT) -#define RCC_AHBENR_CRCEN BIT(RCC_AHBENR_CRCEN_BIT) -#define RCC_AHBENR_FLITFEN BIT(RCC_AHBENR_FLITFEN_BIT) -#define RCC_AHBENR_SRAMEN BIT(RCC_AHBENR_SRAMEN_BIT) -#define RCC_AHBENR_DMA2EN BIT(RCC_AHBENR_DMA2EN_BIT) -#define RCC_AHBENR_DMA1EN BIT(RCC_AHBENR_DMA1EN_BIT) - -/* APB2 peripheral clock enable register */ - -#define RCC_APB2ENR_TIM11EN_BIT 21 -#define RCC_APB2ENR_TIM10EN_BIT 20 -#define RCC_APB2ENR_TIM9EN_BIT 19 -#define RCC_APB2ENR_ADC3EN_BIT 15 -#define RCC_APB2ENR_USART1EN_BIT 14 -#define RCC_APB2ENR_TIM8EN_BIT 13 -#define RCC_APB2ENR_SPI1EN_BIT 12 -#define RCC_APB2ENR_TIM1EN_BIT 11 -#define RCC_APB2ENR_ADC2EN_BIT 10 -#define RCC_APB2ENR_ADC1EN_BIT 9 -#define RCC_APB2ENR_IOPGEN_BIT 8 -#define RCC_APB2ENR_IOPFEN_BIT 7 -#define RCC_APB2ENR_IOPEEN_BIT 6 -#define RCC_APB2ENR_IOPDEN_BIT 5 -#define RCC_APB2ENR_IOPCEN_BIT 4 -#define RCC_APB2ENR_IOPBEN_BIT 3 -#define RCC_APB2ENR_IOPAEN_BIT 2 -#define RCC_APB2ENR_AFIOEN_BIT 0 - -#define RCC_APB2ENR_TIM11EN BIT(RCC_APB2ENR_TIM11EN_BIT) -#define RCC_APB2ENR_TIM10EN BIT(RCC_APB2ENR_TIM10EN_BIT) -#define RCC_APB2ENR_TIM9EN BIT(RCC_APB2ENR_TIM9EN_BIT) -#define RCC_APB2ENR_ADC3EN BIT(RCC_APB2ENR_ADC3EN_BIT) -#define RCC_APB2ENR_USART1EN BIT(RCC_APB2ENR_USART1EN_BIT) -#define RCC_APB2ENR_TIM8EN BIT(RCC_APB2ENR_TIM8EN_BIT) -#define RCC_APB2ENR_SPI1EN BIT(RCC_APB2ENR_SPI1EN_BIT) -#define RCC_APB2ENR_TIM1EN BIT(RCC_APB2ENR_TIM1EN_BIT) -#define RCC_APB2ENR_ADC2EN BIT(RCC_APB2ENR_ADC2EN_BIT) -#define RCC_APB2ENR_ADC1EN BIT(RCC_APB2ENR_ADC1EN_BIT) -#define RCC_APB2ENR_IOPGEN BIT(RCC_APB2ENR_IOPGEN_BIT) -#define RCC_APB2ENR_IOPFEN BIT(RCC_APB2ENR_IOPFEN_BIT) -#define RCC_APB2ENR_IOPEEN BIT(RCC_APB2ENR_IOPEEN_BIT) -#define RCC_APB2ENR_IOPDEN BIT(RCC_APB2ENR_IOPDEN_BIT) -#define RCC_APB2ENR_IOPCEN BIT(RCC_APB2ENR_IOPCEN_BIT) -#define RCC_APB2ENR_IOPBEN BIT(RCC_APB2ENR_IOPBEN_BIT) -#define RCC_APB2ENR_IOPAEN BIT(RCC_APB2ENR_IOPAEN_BIT) -#define RCC_APB2ENR_AFIOEN BIT(RCC_APB2ENR_AFIOEN_BIT) - -/* APB1 peripheral clock enable register */ - -#define RCC_APB1ENR_DACEN_BIT 29 -#define RCC_APB1ENR_PWREN_BIT 28 -#define RCC_APB1ENR_BKPEN_BIT 27 -#define RCC_APB1ENR_CANEN_BIT 25 -#define RCC_APB1ENR_USBEN_BIT 23 -#define RCC_APB1ENR_I2C2EN_BIT 22 -#define RCC_APB1ENR_I2C1EN_BIT 21 -#define RCC_APB1ENR_UART5EN_BIT 20 -#define RCC_APB1ENR_UART4EN_BIT 19 -#define RCC_APB1ENR_USART3EN_BIT 18 -#define RCC_APB1ENR_USART2EN_BIT 17 -#define RCC_APB1ENR_SPI3EN_BIT 15 -#define RCC_APB1ENR_SPI2EN_BIT 14 -#define RCC_APB1ENR_WWDEN_BIT 11 -#define RCC_APB1ENR_TIM14EN_BIT 8 -#define RCC_APB1ENR_TIM13EN_BIT 7 -#define RCC_APB1ENR_TIM12EN_BIT 6 -#define RCC_APB1ENR_TIM7EN_BIT 5 -#define RCC_APB1ENR_TIM6EN_BIT 4 -#define RCC_APB1ENR_TIM5EN_BIT 3 -#define RCC_APB1ENR_TIM4EN_BIT 2 -#define RCC_APB1ENR_TIM3EN_BIT 1 -#define RCC_APB1ENR_TIM2EN_BIT 0 - -#define RCC_APB1ENR_DACEN BIT(RCC_APB1ENR_DACEN_BIT) -#define RCC_APB1ENR_PWREN BIT(RCC_APB1ENR_PWREN_BIT) -#define RCC_APB1ENR_BKPEN BIT(RCC_APB1ENR_BKPEN_BIT) -#define RCC_APB1ENR_CANEN BIT(RCC_APB1ENR_CANEN_BIT) -#define RCC_APB1ENR_USBEN BIT(RCC_APB1ENR_USBEN_BIT) -#define RCC_APB1ENR_I2C2EN BIT(RCC_APB1ENR_I2C2EN_BIT) -#define RCC_APB1ENR_I2C1EN BIT(RCC_APB1ENR_I2C1EN_BIT) -#define RCC_APB1ENR_UART5EN BIT(RCC_APB1ENR_UART5EN_BIT) -#define RCC_APB1ENR_UART4EN BIT(RCC_APB1ENR_UART4EN_BIT) -#define RCC_APB1ENR_USART3EN BIT(RCC_APB1ENR_USART3EN_BIT) -#define RCC_APB1ENR_USART2EN BIT(RCC_APB1ENR_USART2EN_BIT) -#define RCC_APB1ENR_SPI3EN BIT(RCC_APB1ENR_SPI3EN_BIT) -#define RCC_APB1ENR_SPI2EN BIT(RCC_APB1ENR_SPI2EN_BIT) -#define RCC_APB1ENR_WWDEN BIT(RCC_APB1ENR_WWDEN_BIT) -#define RCC_APB1ENR_TIM14EN BIT(RCC_APB1ENR_TIM14EN_BIT) -#define RCC_APB1ENR_TIM13EN BIT(RCC_APB1ENR_TIM13EN_BIT) -#define RCC_APB1ENR_TIM12EN BIT(RCC_APB1ENR_TIM12EN_BIT) -#define RCC_APB1ENR_TIM7EN BIT(RCC_APB1ENR_TIM7EN_BIT) -#define RCC_APB1ENR_TIM6EN BIT(RCC_APB1ENR_TIM6EN_BIT) -#define RCC_APB1ENR_TIM5EN BIT(RCC_APB1ENR_TIM5EN_BIT) -#define RCC_APB1ENR_TIM4EN BIT(RCC_APB1ENR_TIM4EN_BIT) -#define RCC_APB1ENR_TIM3EN BIT(RCC_APB1ENR_TIM3EN_BIT) -#define RCC_APB1ENR_TIM2EN BIT(RCC_APB1ENR_TIM2EN_BIT) - -/* Backup domain control register */ - -#define RCC_BDCR_BDRST_BIT 16 -#define RCC_BDCR_RTCEN_BIT 15 -#define RCC_BDCR_LSEBYP_BIT 2 -#define RCC_BDCR_LSERDY_BIT 1 -#define RCC_BDCR_LSEON_BIT 0 - -#define RCC_BDCR_BDRST BIT(RCC_BDCR_BDRST_BIT) -#define RCC_BDCR_RTCEN BIT(RCC_BDCR_RTC_BIT) -#define RCC_BDCR_RTCSEL (0x3 << 8) -#define RCC_BDCR_RTCSEL_NONE (0x0 << 8) -#define RCC_BDCR_RTCSEL_LSE (0x1 << 8) -#define RCC_BDCR_RTCSEL_HSE (0x3 << 8) -#define RCC_BDCR_LSEBYP BIT(RCC_BDCR_LSEBYP_BIT) -#define RCC_BDCR_LSERDY BIT(RCC_BDCR_LSERDY_BIT) -#define RCC_BDCR_LSEON BIT(RCC_BDCR_LSEON_BIT) - -/* Control/status register */ - -#define RCC_CSR_LPWRRSTF_BIT 31 -#define RCC_CSR_WWDGRSTF_BIT 30 -#define RCC_CSR_IWDGRSTF_BIT 29 -#define RCC_CSR_SFTRSTF_BIT 28 -#define RCC_CSR_PORRSTF_BIT 27 -#define RCC_CSR_PINRSTF_BIT 26 -#define RCC_CSR_RMVF_BIT 24 -#define RCC_CSR_LSIRDY_BIT 1 -#define RCC_CSR_LSION_BIT 0 - -#define RCC_CSR_LPWRRSTF BIT(RCC_CSR_LPWRRSTF_BIT) -#define RCC_CSR_WWDGRSTF BIT(RCC_CSR_WWDGRSTF_BIT) -#define RCC_CSR_IWDGRSTF BIT(RCC_CSR_IWDGRSTF_BIT) -#define RCC_CSR_SFTRSTF BIT(RCC_CSR_SFTRSTF_BIT) -#define RCC_CSR_PORRSTF BIT(RCC_CSR_PORRSTF_BIT) -#define RCC_CSR_PINRSTF BIT(RCC_CSR_PINRSTF_BIT) -#define RCC_CSR_RMVF BIT(RCC_CSR_RMVF_BIT) -#define RCC_CSR_LSIRDY BIT(RCC_CSR_LSIRDY_BIT) -#define RCC_CSR_LSION BIT(RCC_CSR_LSION_BIT) - -/* - * Convenience routines - */ - -/** - * SYSCLK sources - * @see rcc_clk_init() - */ -typedef enum rcc_sysclk_src { - RCC_CLKSRC_HSI = 0x0, - RCC_CLKSRC_HSE = 0x1, - RCC_CLKSRC_PLL = 0x2, -} rcc_sysclk_src; - -/** - * PLL entry clock source - * @see rcc_clk_init() - */ -typedef enum rcc_pllsrc { - RCC_PLLSRC_HSE = (0x1 << 16), - RCC_PLLSRC_HSI_DIV_2 = (0x0 << 16) -} rcc_pllsrc; - -/** - * PLL multipliers - * @see rcc_clk_init() - */ -typedef enum rcc_pll_multiplier { - RCC_PLLMUL_2 = (0x0 << 18), - RCC_PLLMUL_3 = (0x1 << 18), - RCC_PLLMUL_4 = (0x2 << 18), - RCC_PLLMUL_5 = (0x3 << 18), - RCC_PLLMUL_6 = (0x4 << 18), - RCC_PLLMUL_7 = (0x5 << 18), - RCC_PLLMUL_8 = (0x6 << 18), - RCC_PLLMUL_9 = (0x7 << 18), - RCC_PLLMUL_10 = (0x8 << 18), - RCC_PLLMUL_11 = (0x9 << 18), - RCC_PLLMUL_12 = (0xA << 18), - RCC_PLLMUL_13 = (0xB << 18), - RCC_PLLMUL_14 = (0xC << 18), - RCC_PLLMUL_15 = (0xD << 18), - RCC_PLLMUL_16 = (0xE << 18), -} rcc_pll_multiplier; - -/** - * @brief Identifies bus and clock line for a peripheral. - * - * Also generally useful as a unique identifier for that peripheral - * (or its corresponding device struct). - */ -typedef enum rcc_clk_id { - RCC_GPIOA, - RCC_GPIOB, - RCC_GPIOC, - RCC_GPIOD, - RCC_AFIO, - RCC_ADC1, - RCC_ADC2, - RCC_ADC3, - RCC_USART1, - RCC_USART2, - RCC_USART3, - RCC_TIMER1, - RCC_TIMER2, - RCC_TIMER3, - RCC_TIMER4, - RCC_SPI1, - RCC_SPI2, - RCC_DMA1, - RCC_PWR, - RCC_BKP, - RCC_I2C1, - RCC_I2C2, - RCC_CRC, - RCC_FLITF, - RCC_SRAM, -#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) - RCC_GPIOE, - RCC_GPIOF, - RCC_GPIOG, - RCC_UART4, - RCC_UART5, - RCC_TIMER5, - RCC_TIMER6, - RCC_TIMER7, - RCC_TIMER8, - RCC_FSMC, - RCC_DAC, - RCC_DMA2, - RCC_SDIO, - RCC_SPI3, -#endif -#ifdef STM32_XL_DENSITY - RCC_TIMER9, - RCC_TIMER10, - RCC_TIMER11, - RCC_TIMER12, - RCC_TIMER13, - RCC_TIMER14, -#endif -} rcc_clk_id; - -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul); -void rcc_clk_enable(rcc_clk_id device); -void rcc_reset_dev(rcc_clk_id device); - -typedef enum rcc_clk_domain { - RCC_APB1, - RCC_APB2, - RCC_AHB -} rcc_clk_domain; - -rcc_clk_domain rcc_dev_clk(rcc_clk_id device); - -uint32 rcc_dev_clk_speed(rcc_clk_id id); -uint32 rcc_dev_timer_clk_speed(rcc_clk_id id); - -/** - * Prescaler identifiers - * @see rcc_set_prescaler() - */ -typedef enum rcc_prescaler { - RCC_PRESCALER_AHB, - RCC_PRESCALER_APB1, - RCC_PRESCALER_APB2, - RCC_PRESCALER_USB, - RCC_PRESCALER_ADC -} rcc_prescaler; - -/** - * ADC prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_adc_divider { - RCC_ADCPRE_PCLK_DIV_2 = 0x0 << 14, - RCC_ADCPRE_PCLK_DIV_4 = 0x1 << 14, - RCC_ADCPRE_PCLK_DIV_6 = 0x2 << 14, - RCC_ADCPRE_PCLK_DIV_8 = 0x3 << 14, -} rcc_adc_divider; - -/** - * APB1 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb1_divider { - RCC_APB1_HCLK_DIV_1 = 0x0 << 8, - RCC_APB1_HCLK_DIV_2 = 0x4 << 8, - RCC_APB1_HCLK_DIV_4 = 0x5 << 8, - RCC_APB1_HCLK_DIV_8 = 0x6 << 8, - RCC_APB1_HCLK_DIV_16 = 0x7 << 8, -} rcc_apb1_divider; - -/** - * APB2 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb2_divider { - RCC_APB2_HCLK_DIV_1 = 0x0 << 11, - RCC_APB2_HCLK_DIV_2 = 0x4 << 11, - RCC_APB2_HCLK_DIV_4 = 0x5 << 11, - RCC_APB2_HCLK_DIV_8 = 0x6 << 11, - RCC_APB2_HCLK_DIV_16 = 0x7 << 11, -} rcc_apb2_divider; - -/** - * AHB prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_ahb_divider { - RCC_AHB_SYSCLK_DIV_1 = 0x0 << 4, - RCC_AHB_SYSCLK_DIV_2 = 0x8 << 4, - RCC_AHB_SYSCLK_DIV_4 = 0x9 << 4, - RCC_AHB_SYSCLK_DIV_8 = 0xA << 4, - RCC_AHB_SYSCLK_DIV_16 = 0xB << 4, - RCC_AHB_SYSCLK_DIV_32 = 0xC << 4, - RCC_AHB_SYSCLK_DIV_64 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_128 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_256 = 0xE << 4, - RCC_AHB_SYSCLK_DIV_512 = 0xF << 4, -} rcc_ahb_divider; - -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/rccF2.c b/STM32F4/cores/maple/libmaple/rccF2.c deleted file mode 100644 index 691393a8d..000000000 --- a/STM32F4/cores/maple/libmaple/rccF2.c +++ /dev/null @@ -1,707 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - - #ifdef STM32F2 - -/** - * @file rcc.c - * @brief Implements pretty much only the basic clock setup on the - * stm32, clock enable/disable and peripheral reset commands. - */ - -#include "libmaple.h" -#include "flash.h" -#include "gpio.h" -#include "rcc.h" -#include "bitband.h" - -#define APB1 RCC_APB1 -#define APB2 RCC_APB2 -#define AHB1 RCC_AHB1 -#define AHB2 RCC_AHB2 -#define AHB3 RCC_AHB3 - -struct rcc_dev_info { - const rcc_clk_domain clk_domain; - const uint8 line_num; -}; - -static uint32 rcc_dev_clk_speed_table[AHB3]; - -/* Device descriptor table, maps rcc_clk_id onto bus and enable/reset - * register bit numbers. */ -static const struct rcc_dev_info rcc_dev_table[] = { - [RCC_GPIOA] = { .clk_domain = AHB1, .line_num = 0 }, //* - [RCC_GPIOB] = { .clk_domain = AHB1, .line_num = 1 }, //* - [RCC_GPIOC] = { .clk_domain = AHB1, .line_num = 2 }, //* - [RCC_GPIOD] = { .clk_domain = AHB1, .line_num = 3 }, //* - -// [RCC_AFIO] = { .clk_domain = APB2, .line_num = 0 }, - [RCC_ADC1] = { .clk_domain = APB2, .line_num = 8 }, //* - [RCC_ADC2] = { .clk_domain = APB2, .line_num = 9 }, //* - [RCC_ADC3] = { .clk_domain = APB2, .line_num = 10 }, //* - [RCC_USART1] = { .clk_domain = APB2, .line_num = 4 }, //* - [RCC_USART2] = { .clk_domain = APB1, .line_num = 17 }, //unchanged - [RCC_USART3] = { .clk_domain = APB1, .line_num = 18 }, //unchanged - [RCC_TIMER1] = { .clk_domain = APB2, .line_num = 0 }, //* - [RCC_TIMER2] = { .clk_domain = APB1, .line_num = 0 }, //unchanged - [RCC_TIMER3] = { .clk_domain = APB1, .line_num = 1 }, //unchanged - [RCC_TIMER4] = { .clk_domain = APB1, .line_num = 2 }, //unchanged - [RCC_SPI1] = { .clk_domain = APB2, .line_num = 12 }, //unchanged - [RCC_SPI2] = { .clk_domain = APB1, .line_num = 14 }, //unchanged - [RCC_DMA1] = { .clk_domain = AHB1, .line_num = 21 }, //* - [RCC_PWR] = { .clk_domain = APB1, .line_num = 28}, //unchanged - [RCC_BKP] = { .clk_domain = AHB1, .line_num = 18}, //* - [RCC_I2C1] = { .clk_domain = APB1, .line_num = 21 }, //unchanged - [RCC_I2C2] = { .clk_domain = APB1, .line_num = 22 }, //unchanged - [RCC_CRC] = { .clk_domain = AHB1, .line_num = 12}, //* -// [RCC_FLITF] = { .clk_domain = AHB, .line_num = 4}, -// [RCC_SRAM] = { .clk_domain = AHB, .line_num = 2}, - - [RCC_GPIOE] = { .clk_domain = AHB1, .line_num = 4 }, //* - [RCC_GPIOF] = { .clk_domain = AHB1, .line_num = 5 }, //* - [RCC_GPIOG] = { .clk_domain = AHB1, .line_num = 6 }, //* - [RCC_UART4] = { .clk_domain = APB1, .line_num = 19 }, //unchanged - [RCC_UART5] = { .clk_domain = APB1, .line_num = 20 }, //unchanged - [RCC_TIMER5] = { .clk_domain = APB1, .line_num = 3 }, //unchanged - [RCC_TIMER6] = { .clk_domain = APB1, .line_num = 4 }, //unchanged - [RCC_TIMER7] = { .clk_domain = APB1, .line_num = 5 }, //unchanged - [RCC_TIMER8] = { .clk_domain = APB2, .line_num = 1 }, //* - [RCC_FSMC] = { .clk_domain = AHB3, .line_num = 0 }, //* - [RCC_DAC] = { .clk_domain = APB1, .line_num = 29 }, //unchanged - [RCC_DMA2] = { .clk_domain = AHB1, .line_num = 22 }, //* - [RCC_SDIO] = { .clk_domain = APB2, .line_num = 11 }, //* - [RCC_SPI3] = { .clk_domain = APB1, .line_num = 15 }, //unchanged - [RCC_TIMER9] = { .clk_domain = APB2, .line_num = 16 }, //* - [RCC_TIMER10] = { .clk_domain = APB2, .line_num = 17 }, //* - [RCC_TIMER11] = { .clk_domain = APB2, .line_num = 18 }, //* - [RCC_TIMER12] = { .clk_domain = APB1, .line_num = 6 }, //unchanged - [RCC_TIMER13] = { .clk_domain = APB1, .line_num = 7 }, //unchanged - [RCC_TIMER14] = { .clk_domain = APB1, .line_num = 8 }, //unchanged - [RCC_USBFS] = { .clk_domain = AHB2, .line_num = 7 }, //* - [RCC_SYSCFG] = { .clk_domain = APB2, .line_num = 14 }, //* - [RCC_SPI4] = { .clk_domain = APB1, .line_num = 15 }, -}; - -/** - * @brief Initialize the clock control system. Initializes the system - * clock source to use the PLL driven by an external oscillator - * @param sysclk_src system clock source, must be PLL - * @param pll_src pll clock source, must be HSE - * @param pll_mul pll multiplier - */ - -#define HSE_STARTUP_TIMEOUT ((uint16)0x0500) /*!< Time out for HSE start up */ -#define RCC_CFGR_HPRE_DIV1 ((uint32)0x00000000) /*!< SYSCLK not divided */ -#define RCC_CFGR_PPRE1_DIV2 ((uint32)0x00001000) /*!< HCLK divided by 2 */ -#define RCC_CFGR_PPRE1_DIV4 ((uint32)0x00001400) /*!< HCLK divided by 4 */ -#define RCC_CFGR_PPRE2_DIV1 ((uint32)0x00000000) /*!< HCLK not divided */ -#define RCC_CFGR_PPRE2_DIV2 ((uint32)0x00008000) /*!< HCLK divided by 2 */ - -#define RCC_PLLCFGR_PLLSRC_HSE ((uint32)0x00400000) - -/******************* Bits definition for FLASH_ACR register *****************/ -//#define FLASH_ACR_LATENCY ((uint32_t)0x00000007) -#define FLASH_ACR_LATENCY_0WS ((uint32)0x00000000) -#define FLASH_ACR_LATENCY_1WS ((uint32)0x00000001) -#define FLASH_ACR_LATENCY_2WS ((uint32)0x00000002) -#define FLASH_ACR_LATENCY_3WS ((uint32)0x00000003) -#define FLASH_ACR_LATENCY_4WS ((uint32)0x00000004) -#define FLASH_ACR_LATENCY_5WS ((uint32)0x00000005) -#define FLASH_ACR_LATENCY_6WS ((uint32)0x00000006) -#define FLASH_ACR_LATENCY_7WS ((uint32)0x00000007) - -#define FLASH_ACR_PRFTEN ((uint32)0x00000100) -#define FLASH_ACR_ICEN ((uint32)0x00000200) -#define FLASH_ACR_DCEN ((uint32)0x00000400) -#define FLASH_ACR_ICRST ((uint32)0x00000800) -#define FLASH_ACR_DCRST ((uint32)0x00001000) -#define FLASH_ACR_BYTE0_ADDRESS ((uint32)0x40023C00) -#define FLASH_ACR_BYTE2_ADDRESS ((uint32)0x40023C03) - -typedef struct -{ - __io uint32 CR; /*!< PWR power control register, Address offset: 0x00 */ - __io uint32 CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -#define PWR_BASE (0x40007000) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define PWR_CR_VOS ((uint16)0x4000) /*!< Regulator voltage scaling output selection */ - -typedef struct -{ - __io uint32 ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __io uint32 KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __io uint32 OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __io uint32 SR; /*!< FLASH status register, Address offset: 0x0C */ - __io uint32 CR; /*!< FLASH control register, Address offset: 0x10 */ - __io uint32 OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ -} FLASH_TypeDef; - -#define FLASH_R_BASE (0x40023C00) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define RESET 0 - -typedef uint32 uint32_t; - -void InitMCO1() -{ - rcc_reg_map *RCC = RCC_BASE; - // Turn MCO1 Master Clock Output mode - RCC->CFGR &= RCC_CFGR_MCO1_RESET_MASK; - RCC->CFGR |= RCC_CFGR_MCO1Source_HSE | RCC_CFGR_MCO1Div_1; - // PA8 Output the Master Clock MCO1 - gpio_set_af_mode(GPIOA, 8, 0); - gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); -} - - -void SetupClock72MHz() -{ - uint32_t SystemCoreClock = 72000000; - - /******************************************************************************/ - /* PLL (clocked by HSE) used as System clock source */ - /******************************************************************************/ - /************************* PLL Parameters *************************************/ - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ - int PLL_M = 4; - int PLL_N = 216; - - /* SYSCLK = PLL_VCO / PLL_P */ - int PLL_P = 6; - - /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ - int PLL_Q = 9; - - - uint32 StartUpCounter = 0, HSEStatus = 0; - rcc_reg_map *RCC = RCC_BASE; - - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Select regulator voltage output Scale 2 mode, System frequency up to 144 MHz */ - RCC->APB1ENR |= RCC_APB1ENR_PWREN; - PWR->CR &= (uint32_t)~(PWR_CR_VOS); - - /* HCLK = SYSCLK / 1*/ - RCC->CFGR |= RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK / 1*/ - RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK / 2*/ - RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; - - // save bus clock values - rcc_dev_clk_speed_table[RCC_AHB1] = (SystemCoreClock/1); - rcc_dev_clk_speed_table[RCC_APB2] = (SystemCoreClock/1); - rcc_dev_clk_speed_table[RCC_APB1] = (SystemCoreClock/2); - - /* Configure the main PLL */ - RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | - (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); - - /* Enable the main PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till the main PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ - FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS; - - /* Select the main PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= RCC_CFGR_SW_PLL; - - /* Wait till the main PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} - - -void SetupClock120MHz() -{ - uint32_t SystemCoreClock = 120000000; - - /******************************************************************************/ - /* PLL (clocked by HSE) used as System clock source */ - /******************************************************************************/ - /************************* PLL Parameters *************************************/ - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ - int PLL_M = 8; - int PLL_N = 240; - - /* SYSCLK = PLL_VCO / PLL_P */ - int PLL_P = 2; - - /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ - int PLL_Q = 5; - - - uint32 StartUpCounter = 0, HSEStatus = 0; - rcc_reg_map *RCC = RCC_BASE; - - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Select regulator voltage output Scale 2 mode, System frequency up to 144 MHz */ - RCC->APB1ENR |= RCC_APB1ENR_PWREN; - PWR->CR &= (uint32_t)~(PWR_CR_VOS); - - /* HCLK = SYSCLK / 1*/ - RCC->CFGR |= RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK / 2*/ - RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; - - /* PCLK1 = HCLK / 4*/ - RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; - - // save bus clock values - rcc_dev_clk_speed_table[RCC_AHB1] = (SystemCoreClock/1); - rcc_dev_clk_speed_table[RCC_APB2] = (SystemCoreClock/2); - rcc_dev_clk_speed_table[RCC_APB1] = (SystemCoreClock/4); - - /* Configure the main PLL */ - RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | - (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); - - /* Enable the main PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till the main PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ - FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_3WS; - - /* Select the main PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= RCC_CFGR_SW_PLL; - - /* Wait till the main PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} - - -void SetupClock168MHz() -{ - uint32_t SystemCoreClock = 168000000; - - /******************************************************************************/ - /* PLL (clocked by HSE) used as System clock source */ - /******************************************************************************/ - /************************* PLL Parameters *************************************/ - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ -#ifdef ARDUINO_STM32F4_NETDUINO2PLUS - int PLL_M = 25; // The NETDUINO has a 25MHz external oscillator -#else - int PLL_M = 8; -#endif - int PLL_N = 336; - - /* SYSCLK = PLL_VCO / PLL_P */ - int PLL_P = 2; - - /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ - int PLL_Q = 7; - - - uint32 StartUpCounter = 0, HSEStatus = 0; - rcc_reg_map *RCC = RCC_BASE; - -#ifdef ARDUINO_STM32F4_NETDUINO2PLUS - InitMCO1(); -#endif - - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */ - RCC->APB1ENR |= RCC_APB1ENR_PWREN; - PWR->CR |= PWR_CR_VOS; - - /* HCLK = SYSCLK / 1*/ - RCC->CFGR |= RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK / 2*/ - RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; - - /* PCLK1 = HCLK / 4*/ - RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; - - // save bus clock values - rcc_dev_clk_speed_table[RCC_AHB1] = (SystemCoreClock/1); - rcc_dev_clk_speed_table[RCC_APB2] = (SystemCoreClock/2); - rcc_dev_clk_speed_table[RCC_APB1] = (SystemCoreClock/4); - - /* Configure the main PLL */ - RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | - (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); - - /* Enable the main PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till the main PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ - FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; - - /* Select the main PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= RCC_CFGR_SW_PLL; - - /* Wait till the main PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} - - -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul) { - - //SetupClock72MHz(); -#if STM32_TICKS_PER_US == 168 - SetupClock168MHz(); -#endif -#if STM32_TICKS_PER_US == 120 - SetupClock120MHz(); -#endif -#if STM32_TICKS_PER_US == 72 - SetupClock72MHz(); -#endif -} - - - - -#define PLL_M 8 -#define PLL_N 240 -/* SYSCLK = PLL_VCO / PLL_P */ -#define PLL_P 2 - -/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ -#define PLL_Q 5 - - -void rcc_clk_init2(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul) { - -/******************************************************************************/ -/* PLL (clocked by HSE) used as System clock source */ -/******************************************************************************/ - uint32 StartUpCounter = 0, HSEStatus = 0; - rcc_reg_map *pRCC = RCC_BASE; - - /* Enable HSE */ - pRCC->CR |= RCC_CR_HSEON; - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = pRCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((pRCC->CR & RCC_CR_HSERDY) != 0) - { - HSEStatus = 0x01; - } - else - { - HSEStatus = 0x00; - } - - if (HSEStatus == 0x01) - { - /* HCLK = SYSCLK / 1*/ - pRCC->CFGR |= RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK / 2*/ - pRCC->CFGR |= RCC_CFGR_PPRE2_DIV2; - - /* PCLK1 = HCLK / 4*/ - pRCC->CFGR |= RCC_CFGR_PPRE1_DIV4; - - /* Configure the main PLL */ - pRCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | - (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); - - /* Enable the main PLL */ - pRCC->CR |= RCC_CR_PLLON; - - /* Wait till the main PLL is ready */ - while((pRCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ - ((FLASH_TypeDef*)FLASH)->ACR = FLASH_ACR_PRFTEN |FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_3WS; - - /* Select the main PLL as system clock source */ - pRCC->CFGR &= ~RCC_CFGR_SW; - pRCC->CFGR |= RCC_CFGR_SW_PLL; - - /* Wait till the main PLL is used as system clock source */ - while ((pRCC->CFGR & RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } - -#if 0 - uint32 cfgr = 0; - uint32 cr; - - /* Assume that we're going to clock the chip off the PLL, fed by - * the HSE */ - ASSERT(sysclk_src == RCC_CLKSRC_PLL && - pll_src == RCC_PLLSRC_HSE); - - RCC_BASE->CFGR = pll_src | pll_mul; - - /* Turn on the HSE */ - cr = RCC_BASE->CR; - cr |= RCC_CR_HSEON; - RCC_BASE->CR = cr; - while (!(RCC_BASE->CR & RCC_CR_HSERDY)) - ; - - /* Now the PLL */ - cr |= RCC_CR_PLLON; - RCC_BASE->CR = cr; - while (!(RCC_BASE->CR & RCC_CR_PLLRDY)) - ; - - /* Finally, let's switch over to the PLL */ - cfgr &= ~RCC_CFGR_SW; - cfgr |= RCC_CFGR_SW_PLL; - RCC_BASE->CFGR = cfgr; - while ((RCC_BASE->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) - ; -#endif -} - -/** - * @brief Turn on the clock line on a peripheral - * @param id Clock ID of the peripheral to turn on. - */ -void rcc_clk_enable(rcc_clk_id id) { - static const __io uint32* enable_regs[] = { - [APB1] = &RCC_BASE->APB1ENR, - [APB2] = &RCC_BASE->APB2ENR, - [AHB1] = &RCC_BASE->AHB1ENR, - [AHB2] = &RCC_BASE->AHB2ENR, - [AHB3] = &RCC_BASE->AHB3ENR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io uint32* enr = (__io uint32*)enable_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(enr, lnum, 1); -} - -/** - * @brief Turn on the clock line on a peripheral - * @param id Clock ID of the peripheral to turn on. - */ -void rcc_clk_disable(rcc_clk_id id) { - static const __io uint32* enable_regs[] = { - [APB1] = &RCC_BASE->APB1ENR, - [APB2] = &RCC_BASE->APB2ENR, - [AHB1] = &RCC_BASE->AHB1ENR, - [AHB2] = &RCC_BASE->AHB2ENR, - [AHB3] = &RCC_BASE->AHB3ENR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io uint32* enr = (__io uint32*)enable_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(enr, lnum, 0); -} - -/** - * @brief Reset a peripheral. - * @param id Clock ID of the peripheral to reset. - */ -void rcc_reset_dev(rcc_clk_id id) { - static const __io uint32* reset_regs[] = { - [APB1] = &RCC_BASE->APB1RSTR, - [APB2] = &RCC_BASE->APB2RSTR, - [AHB1] = &RCC_BASE->AHB1RSTR, - [AHB2] = &RCC_BASE->AHB2RSTR, - [AHB3] = &RCC_BASE->AHB3RSTR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io void* addr = (__io void*)reset_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(addr, lnum, 1); - bb_peri_set_bit(addr, lnum, 0); -} - -/** - * @brief Get a peripheral's clock domain - * @param id Clock ID of the peripheral whose clock domain to return - * @return Clock source for the given clock ID - */ -rcc_clk_domain rcc_dev_clk(rcc_clk_id id) { - return rcc_dev_table[id].clk_domain; -} - -/** - * @brief Get a peripheral's clock domain speed - * @param id Clock ID of the peripheral whose clock domain speed to return - * @return Clock speed for the given clock ID - */ -uint32 rcc_dev_clk_speed(rcc_clk_id id) { - return rcc_dev_clk_speed_table[rcc_dev_clk(id)]; -} - -/** - * @brief Get a peripheral's timer clock domain speed - * @param id Clock ID of the peripheral whose clock domain speed to return - * @return Clock speed for the given clock ID - */ -uint32 rcc_dev_timer_clk_speed(rcc_clk_id id) { - return 2*rcc_dev_clk_speed(id); -} - -/** - * @brief Set the divider on a peripheral prescaler - * @param prescaler prescaler to set - * @param divider prescaler divider - */ -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) { -#if 0 - static const uint32 masks[] = { - [RCC_PRESCALER_AHB] = RCC_CFGR_HPRE, - [RCC_PRESCALER_APB1] = RCC_CFGR_PPRE1, - [RCC_PRESCALER_APB2] = RCC_CFGR_PPRE2, - [RCC_PRESCALER_USB] = RCC_CFGR_USBPRE, - [RCC_PRESCALER_ADC] = RCC_CFGR_ADCPRE, - }; - - uint32 cfgr = RCC_BASE->CFGR; - cfgr &= ~masks[prescaler]; - cfgr |= divider; - RCC_BASE->CFGR = cfgr; -#endif -} - -#endif diff --git a/STM32F4/cores/maple/libmaple/rccF2.h b/STM32F4/cores/maple/libmaple/rccF2.h deleted file mode 100644 index 99c5ff25d..000000000 --- a/STM32F4/cores/maple/libmaple/rccF2.h +++ /dev/null @@ -1,642 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file rcc.h - * @brief reset and clock control definitions and prototypes - */ - -#include "libmaple_types.h" -#include "bitband.h" - -#ifndef _RCC_H_ -#define _RCC_H_ - -#ifdef __cplusplus -extern "C"{ -#endif - -/** RCC register map type */ -typedef struct -{ - __io uint32 CR; /*!< RCC clock control register, Address offset: 0x00 */ - __io uint32 PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __io uint32 CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __io uint32 CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __io uint32 AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __io uint32 AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __io uint32 AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32 RESERVED0; /*!< Reserved, 0x1C */ - __io uint32 APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __io uint32 APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32 RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __io uint32 AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __io uint32 AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __io uint32 AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32 RESERVED2; /*!< Reserved, 0x3C */ - __io uint32 APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __io uint32 APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32 RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __io uint32 AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __io uint32 AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __io uint32 AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32 RESERVED4; /*!< Reserved, 0x5C */ - __io uint32 APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __io uint32 APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32 RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __io uint32 BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __io uint32 CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32 RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __io uint32 SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __io uint32 PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ -} rcc_reg_map; - -/** RCC register map base pointer */ -//#define RCC_BASE ((struct rcc_reg_map*)0x40021000) -#define RCC_BASE ((rcc_reg_map*)0x40023800) - -/* - * Register bit definitions - */ - -/* Clock control register */ - -#define RCC_CR_PLLRDY_BIT 25 -#define RCC_CR_PLLON_BIT 24 -#define RCC_CR_CSSON_BIT 19 -#define RCC_CR_HSEBYP_BIT 18 -#define RCC_CR_HSERDY_BIT 17 -#define RCC_CR_HSEON_BIT 16 -#define RCC_CR_HSIRDY_BIT 1 -#define RCC_CR_HSION_BIT 0 - -#define RCC_CR_PLLRDY BIT(RCC_CR_PLLRDY_BIT) -#define RCC_CR_PLLON BIT(RCC_CR_PLLON_BIT) -#define RCC_CR_CSSON BIT(RCC_CR_CSSON_BIT) -#define RCC_CR_HSEBYP BIT(RCC_CR_HSEBYP_BIT) -#define RCC_CR_HSERDY BIT(RCC_CR_HSERDY_BIT) -#define RCC_CR_HSEON BIT(RCC_CR_HSEON_BIT) -#define RCC_CR_HSICAL (0xFF << 8) -#define RCC_CR_HSITRIM (0x1F << 3) -#define RCC_CR_HSIRDY BIT(RCC_CR_HSIRDY_BIT) -#define RCC_CR_HSION BIT(RCC_CR_HSION_BIT) - -/* Clock configuration register */ - -#define RCC_CFGR_USBPRE_BIT 22 -#define RCC_CFGR_PLLXTPRE_BIT 17 -#define RCC_CFGR_PLLSRC_BIT 16 - -#define RCC_CFGR_MCO (0x3 << 24) -#define RCC_CFGR_USBPRE BIT(RCC_CFGR_USBPRE_BIT) -#define RCC_CFGR_PLLMUL (0xF << 18) -#define RCC_CFGR_PLLXTPRE BIT(RCC_CFGR_PLLXTPRE_BIT) -#define RCC_CFGR_PLLSRC BIT(RCC_CFGR_PLLSRC_BIT) -#define RCC_CFGR_ADCPRE (0x3 << 14) -#define RCC_CFGR_PPRE2 (0x7 << 11) -#define RCC_CFGR_PPRE1 (0x7 << 8) -#define RCC_CFGR_HPRE (0xF << 4) -#define RCC_CFGR_SWS (0x3 << 2) -#define RCC_CFGR_SWS_PLL (0x2 << 2) -#define RCC_CFGR_SWS_HSE (0x1 << 2) -#define RCC_CFGR_SW 0x3 -#define RCC_CFGR_SW_PLL 0x2 -#define RCC_CFGR_SW_HSE 0x1 - -#define RCC_CFGR_MCO1Source_HSI ((uint32_t)0x00000000) -#define RCC_CFGR_MCO1Source_LSE ((uint32_t)0x00200000) -#define RCC_CFGR_MCO1Source_HSE ((uint32_t)0x00400000) -#define RCC_CFGR_MCO1Source_PLLCLK ((uint32_t)0x00600000) -#define RCC_CFGR_MCO1Div_1 ((uint32_t)0x00000000) -#define RCC_CFGR_MCO1Div_2 ((uint32_t)0x04000000) -#define RCC_CFGR_MCO1Div_3 ((uint32_t)0x05000000) -#define RCC_CFGR_MCO1Div_4 ((uint32_t)0x06000000) -#define RCC_CFGR_MCO1Div_5 ((uint32_t)0x07000000) -#define RCC_CFGR_MCO1_RESET_MASK ((uint32_t)0xF89FFFFF) - -/* Clock interrupt register */ - -#define RCC_CIR_CSSC_BIT 23 -#define RCC_CIR_PLLRDYC_BIT 20 -#define RCC_CIR_HSERDYC_BIT 19 -#define RCC_CIR_HSIRDYC_BIT 18 -#define RCC_CIR_LSERDYC_BIT 17 -#define RCC_CIR_LSIRDYC_BIT 16 -#define RCC_CIR_PLLRDYIE_BIT 12 -#define RCC_CIR_HSERDYIE_BIT 11 -#define RCC_CIR_HSIRDYIE_BIT 10 -#define RCC_CIR_LSERDYIE_BIT 9 -#define RCC_CIR_LSIRDYIE_BIT 8 -#define RCC_CIR_CSSF_BIT 7 -#define RCC_CIR_PLLRDYF_BIT 4 -#define RCC_CIR_HSERDYF_BIT 3 -#define RCC_CIR_HSIRDYF_BIT 2 -#define RCC_CIR_LSERDYF_BIT 1 -#define RCC_CIR_LSIRDYF_BIT 0 - -#define RCC_CIR_CSSC BIT(RCC_CIR_CSSC_BIT) -#define RCC_CIR_PLLRDYC BIT(RCC_CIR_PLLRDYC_BIT) -#define RCC_CIR_HSERDYC BIT(RCC_CIR_HSERDYC_BIT) -#define RCC_CIR_HSIRDYC BIT(RCC_CIR_HSIRDYC_BIT) -#define RCC_CIR_LSERDYC BIT(RCC_CIR_LSERDYC_BIT) -#define RCC_CIR_LSIRDYC BIT(RCC_CIR_LSIRDYC_BIT) -#define RCC_CIR_PLLRDYIE BIT(RCC_CIR_PLLRDYIE_BIT) -#define RCC_CIR_HSERDYIE BIT(RCC_CIR_HSERDYIE_BIT) -#define RCC_CIR_HSIRDYIE BIT(RCC_CIR_HSIRDYIE_BIT) -#define RCC_CIR_LSERDYIE BIT(RCC_CIR_LSERDYIE_BIT) -#define RCC_CIR_LSIRDYIE BIT(RCC_CIR_LSIRDYIE_BIT) -#define RCC_CIR_CSSF BIT(RCC_CIR_CSSF_BIT) -#define RCC_CIR_PLLRDYF BIT(RCC_CIR_PLLRDYF_BIT) -#define RCC_CIR_HSERDYF BIT(RCC_CIR_HSERDYF_BIT) -#define RCC_CIR_HSIRDYF BIT(RCC_CIR_HSIRDYF_BIT) -#define RCC_CIR_LSERDYF BIT(RCC_CIR_LSERDYF_BIT) -#define RCC_CIR_LSIRDYF BIT(RCC_CIR_LSIRDYF_BIT) - -/* APB2 peripheral reset register */ - -#define RCC_APB2RSTR_TIM11RST_BIT 21 -#define RCC_APB2RSTR_TIM10RST_BIT 20 -#define RCC_APB2RSTR_TIM9RST_BIT 19 -#define RCC_APB2RSTR_ADC3RST_BIT 15 -#define RCC_APB2RSTR_USART1RST_BIT 14 -#define RCC_APB2RSTR_TIM8RST_BIT 13 -#define RCC_APB2RSTR_SPI1RST_BIT 12 -#define RCC_APB2RSTR_TIM1RST_BIT 11 -#define RCC_APB2RSTR_ADC2RST_BIT 10 -#define RCC_APB2RSTR_ADC1RST_BIT 9 -#define RCC_APB2RSTR_IOPGRST_BIT 8 -#define RCC_APB2RSTR_IOPFRST_BIT 7 -#define RCC_APB2RSTR_IOPERST_BIT 6 -#define RCC_APB2RSTR_IOPDRST_BIT 5 -#define RCC_APB2RSTR_IOPCRST_BIT 4 -#define RCC_APB2RSTR_IOPBRST_BIT 3 -#define RCC_APB2RSTR_IOPARST_BIT 2 -#define RCC_APB2RSTR_AFIORST_BIT 0 - -#define RCC_APB2RSTR_TIM11RST BIT(RCC_APB2RSTR_TIM11RST_BIT) -#define RCC_APB2RSTR_TIM10RST BIT(RCC_APB2RSTR_TIM10RST_BIT) -#define RCC_APB2RSTR_TIM9RST BIT(RCC_APB2RSTR_TIM9RST_BIT) -#define RCC_APB2RSTR_ADC3RST BIT(RCC_APB2RSTR_ADC3RST_BIT) -#define RCC_APB2RSTR_USART1RST BIT(RCC_APB2RSTR_USART1RST_BIT) -#define RCC_APB2RSTR_TIM8RST BIT(RCC_APB2RSTR_TIM8RST_BIT) -#define RCC_APB2RSTR_SPI1RST BIT(RCC_APB2RSTR_SPI1RST_BIT) -#define RCC_APB2RSTR_TIM1RST BIT(RCC_APB2RSTR_TIM1RST_BIT) -#define RCC_APB2RSTR_ADC2RST BIT(RCC_APB2RSTR_ADC2RST_BIT) -#define RCC_APB2RSTR_ADC1RST BIT(RCC_APB2RSTR_ADC1RST_BIT) -#define RCC_APB2RSTR_IOPGRST BIT(RCC_APB2RSTR_IOPGRST_BIT) -#define RCC_APB2RSTR_IOPFRST BIT(RCC_APB2RSTR_IOPFRST_BIT) -#define RCC_APB2RSTR_IOPERST BIT(RCC_APB2RSTR_IOPERST_BIT) -#define RCC_APB2RSTR_IOPDRST BIT(RCC_APB2RSTR_IOPDRST_BIT) -#define RCC_APB2RSTR_IOPCRST BIT(RCC_APB2RSTR_IOPCRST_BIT) -#define RCC_APB2RSTR_IOPBRST BIT(RCC_APB2RSTR_IOPBRST_BIT) -#define RCC_APB2RSTR_IOPARST BIT(RCC_APB2RSTR_IOPARST_BIT) -#define RCC_APB2RSTR_AFIORST BIT(RCC_APB2RSTR_AFIORST_BIT) - -/* APB1 peripheral reset register */ - -#define RCC_APB1RSTR_DACRST_BIT 29 -#define RCC_APB1RSTR_PWRRST_BIT 28 -#define RCC_APB1RSTR_BKPRST_BIT 27 -#define RCC_APB1RSTR_CANRST_BIT 25 -#define RCC_APB1RSTR_USBRST_BIT 23 -#define RCC_APB1RSTR_I2C2RST_BIT 22 -#define RCC_APB1RSTR_I2C1RST_BIT 21 -#define RCC_APB1RSTR_UART5RST_BIT 20 -#define RCC_APB1RSTR_UART4RST_BIT 19 -#define RCC_APB1RSTR_USART3RST_BIT 18 -#define RCC_APB1RSTR_USART2RST_BIT 17 -#define RCC_APB1RSTR_SPI3RST_BIT 15 -#define RCC_APB1RSTR_SPI2RST_BIT 14 -#define RCC_APB1RSTR_WWDRST_BIT 11 -#define RCC_APB1RSTR_TIM14RST_BIT 8 -#define RCC_APB1RSTR_TIM13RST_BIT 7 -#define RCC_APB1RSTR_TIM12RST_BIT 6 -#define RCC_APB1RSTR_TIM7RST_BIT 5 -#define RCC_APB1RSTR_TIM6RST_BIT 4 -#define RCC_APB1RSTR_TIM5RST_BIT 3 -#define RCC_APB1RSTR_TIM4RST_BIT 2 -#define RCC_APB1RSTR_TIM3RST_BIT 1 -#define RCC_APB1RSTR_TIM2RST_BIT 0 - -#define RCC_APB1RSTR_DACRST BIT(RCC_APB1RSTR_DACRST_BIT) -#define RCC_APB1RSTR_PWRRST BIT(RCC_APB1RSTR_PWRRST_BIT) -#define RCC_APB1RSTR_BKPRST BIT(RCC_APB1RSTR_BKPRST_BIT) -#define RCC_APB1RSTR_CANRST BIT(RCC_APB1RSTR_CANRST_BIT) -#define RCC_APB1RSTR_USBRST BIT(RCC_APB1RSTR_USBRST_BIT) -#define RCC_APB1RSTR_I2C2RST BIT(RCC_APB1RSTR_I2C2RST_BIT) -#define RCC_APB1RSTR_I2C1RST BIT(RCC_APB1RSTR_I2C1RST_BIT) -#define RCC_APB1RSTR_UART5RST BIT(RCC_APB1RSTR_UART5RST_BIT) -#define RCC_APB1RSTR_UART4RST BIT(RCC_APB1RSTR_UART4RST_BIT) -#define RCC_APB1RSTR_USART3RST BIT(RCC_APB1RSTR_USART3RST_BIT) -#define RCC_APB1RSTR_USART2RST BIT(RCC_APB1RSTR_USART2RST_BIT) -#define RCC_APB1RSTR_SPI3RST BIT(RCC_APB1RSTR_SPI3RST_BIT) -#define RCC_APB1RSTR_SPI2RST BIT(RCC_APB1RSTR_SPI2RST_BIT) -#define RCC_APB1RSTR_WWDRST BIT(RCC_APB1RSTR_WWDRST_BIT) -#define RCC_APB1RSTR_TIM14RST BIT(RCC_APB1RSTR_TIM14RST_BIT) -#define RCC_APB1RSTR_TIM13RST BIT(RCC_APB1RSTR_TIM13RST_BIT) -#define RCC_APB1RSTR_TIM12RST BIT(RCC_APB1RSTR_TIM12RST_BIT) -#define RCC_APB1RSTR_TIM7RST BIT(RCC_APB1RSTR_TIM7RST_BIT) -#define RCC_APB1RSTR_TIM6RST BIT(RCC_APB1RSTR_TIM6RST_BIT) -#define RCC_APB1RSTR_TIM5RST BIT(RCC_APB1RSTR_TIM5RST_BIT) -#define RCC_APB1RSTR_TIM4RST BIT(RCC_APB1RSTR_TIM4RST_BIT) -#define RCC_APB1RSTR_TIM3RST BIT(RCC_APB1RSTR_TIM3RST_BIT) -#define RCC_APB1RSTR_TIM2RST BIT(RCC_APB1RSTR_TIM2RST_BIT) - -/* AHB peripheral clock enable register */ - -#define RCC_AHBENR_SDIOEN_BIT 10 -#define RCC_AHBENR_FSMCEN_BIT 8 -#define RCC_AHBENR_CRCEN_BIT 7 -#define RCC_AHBENR_FLITFEN_BIT 4 -#define RCC_AHBENR_SRAMEN_BIT 2 -#define RCC_AHBENR_DMA2EN_BIT 1 -#define RCC_AHBENR_DMA1EN_BIT 0 - -#define RCC_AHBENR_SDIOEN BIT(RCC_AHBENR_SDIOEN_BIT) -#define RCC_AHBENR_FSMCEN BIT(RCC_AHBENR_FSMCEN_BIT) -#define RCC_AHBENR_CRCEN BIT(RCC_AHBENR_CRCEN_BIT) -#define RCC_AHBENR_FLITFEN BIT(RCC_AHBENR_FLITFEN_BIT) -#define RCC_AHBENR_SRAMEN BIT(RCC_AHBENR_SRAMEN_BIT) -#define RCC_AHBENR_DMA2EN BIT(RCC_AHBENR_DMA2EN_BIT) -#define RCC_AHBENR_DMA1EN BIT(RCC_AHBENR_DMA1EN_BIT) - -/* APB2 peripheral clock enable register */ - -#define RCC_APB2ENR_TIM11EN_BIT 21 -#define RCC_APB2ENR_TIM10EN_BIT 20 -#define RCC_APB2ENR_TIM9EN_BIT 19 -#define RCC_APB2ENR_ADC3EN_BIT 15 -#define RCC_APB2ENR_USART1EN_BIT 14 -#define RCC_APB2ENR_TIM8EN_BIT 13 -#define RCC_APB2ENR_SPI1EN_BIT 12 -#define RCC_APB2ENR_TIM1EN_BIT 11 -#define RCC_APB2ENR_ADC2EN_BIT 10 -#define RCC_APB2ENR_ADC1EN_BIT 9 -#define RCC_APB2ENR_IOPGEN_BIT 8 -#define RCC_APB2ENR_IOPFEN_BIT 7 -#define RCC_APB2ENR_IOPEEN_BIT 6 -#define RCC_APB2ENR_IOPDEN_BIT 5 -#define RCC_APB2ENR_IOPCEN_BIT 4 -#define RCC_APB2ENR_IOPBEN_BIT 3 -#define RCC_APB2ENR_IOPAEN_BIT 2 -#define RCC_APB2ENR_AFIOEN_BIT 0 - -#define RCC_APB2ENR_TIM11EN BIT(RCC_APB2ENR_TIM11EN_BIT) -#define RCC_APB2ENR_TIM10EN BIT(RCC_APB2ENR_TIM10EN_BIT) -#define RCC_APB2ENR_TIM9EN BIT(RCC_APB2ENR_TIM9EN_BIT) -#define RCC_APB2ENR_ADC3EN BIT(RCC_APB2ENR_ADC3EN_BIT) -#define RCC_APB2ENR_USART1EN BIT(RCC_APB2ENR_USART1EN_BIT) -#define RCC_APB2ENR_TIM8EN BIT(RCC_APB2ENR_TIM8EN_BIT) -#define RCC_APB2ENR_SPI1EN BIT(RCC_APB2ENR_SPI1EN_BIT) -#define RCC_APB2ENR_TIM1EN BIT(RCC_APB2ENR_TIM1EN_BIT) -#define RCC_APB2ENR_ADC2EN BIT(RCC_APB2ENR_ADC2EN_BIT) -#define RCC_APB2ENR_ADC1EN BIT(RCC_APB2ENR_ADC1EN_BIT) -#define RCC_APB2ENR_IOPGEN BIT(RCC_APB2ENR_IOPGEN_BIT) -#define RCC_APB2ENR_IOPFEN BIT(RCC_APB2ENR_IOPFEN_BIT) -#define RCC_APB2ENR_IOPEEN BIT(RCC_APB2ENR_IOPEEN_BIT) -#define RCC_APB2ENR_IOPDEN BIT(RCC_APB2ENR_IOPDEN_BIT) -#define RCC_APB2ENR_IOPCEN BIT(RCC_APB2ENR_IOPCEN_BIT) -#define RCC_APB2ENR_IOPBEN BIT(RCC_APB2ENR_IOPBEN_BIT) -#define RCC_APB2ENR_IOPAEN BIT(RCC_APB2ENR_IOPAEN_BIT) -#define RCC_APB2ENR_AFIOEN BIT(RCC_APB2ENR_AFIOEN_BIT) - -/* APB1 peripheral clock enable register */ - -#define RCC_APB1ENR_DACEN_BIT 29 -#define RCC_APB1ENR_PWREN_BIT 28 -#define RCC_APB1ENR_BKPEN_BIT 27 -#define RCC_APB1ENR_CANEN_BIT 25 -#define RCC_APB1ENR_USBEN_BIT 23 -#define RCC_APB1ENR_I2C2EN_BIT 22 -#define RCC_APB1ENR_I2C1EN_BIT 21 -#define RCC_APB1ENR_UART5EN_BIT 20 -#define RCC_APB1ENR_UART4EN_BIT 19 -#define RCC_APB1ENR_USART3EN_BIT 18 -#define RCC_APB1ENR_USART2EN_BIT 17 -#define RCC_APB1ENR_SPI3EN_BIT 15 -#define RCC_APB1ENR_SPI2EN_BIT 14 -#define RCC_APB1ENR_WWDEN_BIT 11 -#define RCC_APB1ENR_TIM14EN_BIT 8 -#define RCC_APB1ENR_TIM13EN_BIT 7 -#define RCC_APB1ENR_TIM12EN_BIT 6 -#define RCC_APB1ENR_TIM7EN_BIT 5 -#define RCC_APB1ENR_TIM6EN_BIT 4 -#define RCC_APB1ENR_TIM5EN_BIT 3 -#define RCC_APB1ENR_TIM4EN_BIT 2 -#define RCC_APB1ENR_TIM3EN_BIT 1 -#define RCC_APB1ENR_TIM2EN_BIT 0 - -#define RCC_APB1ENR_DACEN BIT(RCC_APB1ENR_DACEN_BIT) -#define RCC_APB1ENR_PWREN BIT(RCC_APB1ENR_PWREN_BIT) -#define RCC_APB1ENR_BKPEN BIT(RCC_APB1ENR_BKPEN_BIT) -#define RCC_APB1ENR_CANEN BIT(RCC_APB1ENR_CANEN_BIT) -#define RCC_APB1ENR_USBEN BIT(RCC_APB1ENR_USBEN_BIT) -#define RCC_APB1ENR_I2C2EN BIT(RCC_APB1ENR_I2C2EN_BIT) -#define RCC_APB1ENR_I2C1EN BIT(RCC_APB1ENR_I2C1EN_BIT) -#define RCC_APB1ENR_UART5EN BIT(RCC_APB1ENR_UART5EN_BIT) -#define RCC_APB1ENR_UART4EN BIT(RCC_APB1ENR_UART4EN_BIT) -#define RCC_APB1ENR_USART3EN BIT(RCC_APB1ENR_USART3EN_BIT) -#define RCC_APB1ENR_USART2EN BIT(RCC_APB1ENR_USART2EN_BIT) -#define RCC_APB1ENR_SPI3EN BIT(RCC_APB1ENR_SPI3EN_BIT) -#define RCC_APB1ENR_SPI2EN BIT(RCC_APB1ENR_SPI2EN_BIT) -#define RCC_APB1ENR_WWDEN BIT(RCC_APB1ENR_WWDEN_BIT) -#define RCC_APB1ENR_TIM14EN BIT(RCC_APB1ENR_TIM14EN_BIT) -#define RCC_APB1ENR_TIM13EN BIT(RCC_APB1ENR_TIM13EN_BIT) -#define RCC_APB1ENR_TIM12EN BIT(RCC_APB1ENR_TIM12EN_BIT) -#define RCC_APB1ENR_TIM7EN BIT(RCC_APB1ENR_TIM7EN_BIT) -#define RCC_APB1ENR_TIM6EN BIT(RCC_APB1ENR_TIM6EN_BIT) -#define RCC_APB1ENR_TIM5EN BIT(RCC_APB1ENR_TIM5EN_BIT) -#define RCC_APB1ENR_TIM4EN BIT(RCC_APB1ENR_TIM4EN_BIT) -#define RCC_APB1ENR_TIM3EN BIT(RCC_APB1ENR_TIM3EN_BIT) -#define RCC_APB1ENR_TIM2EN BIT(RCC_APB1ENR_TIM2EN_BIT) - -/* Backup domain control register */ - -#define RCC_BDCR_BDRST_BIT 16 -#define RCC_BDCR_RTCEN_BIT 15 -#define RCC_BDCR_LSEBYP_BIT 2 -#define RCC_BDCR_LSERDY_BIT 1 -#define RCC_BDCR_LSEON_BIT 0 - -#define RCC_BDCR_BDRST BIT(RCC_BDCR_BDRST_BIT) -#define RCC_BDCR_RTCEN BIT(RCC_BDCR_RTC_BIT) -#define RCC_BDCR_RTCSEL (0x3 << 8) -#define RCC_BDCR_RTCSEL_NONE (0x0 << 8) -#define RCC_BDCR_RTCSEL_LSE (0x1 << 8) -#define RCC_BDCR_RTCSEL_LSI (0x2 << 8) -#define RCC_BDCR_RTCSEL_HSE (0x3 << 8) -#define RCC_BDCR_LSEBYP BIT(RCC_BDCR_LSEBYP_BIT) -#define RCC_BDCR_LSERDY BIT(RCC_BDCR_LSERDY_BIT) -#define RCC_BDCR_LSEON BIT(RCC_BDCR_LSEON_BIT) - -/* Control/status register */ - -#define RCC_CSR_LPWRRSTF_BIT 31 -#define RCC_CSR_WWDGRSTF_BIT 30 -#define RCC_CSR_IWDGRSTF_BIT 29 -#define RCC_CSR_SFTRSTF_BIT 28 -#define RCC_CSR_PORRSTF_BIT 27 -#define RCC_CSR_PINRSTF_BIT 26 -#define RCC_CSR_RMVF_BIT 24 -#define RCC_CSR_LSIRDY_BIT 1 -#define RCC_CSR_LSION_BIT 0 - -#define RCC_CSR_LPWRRSTF BIT(RCC_CSR_LPWRRSTF_BIT) -#define RCC_CSR_WWDGRSTF BIT(RCC_CSR_WWDGRSTF_BIT) -#define RCC_CSR_IWDGRSTF BIT(RCC_CSR_IWDGRSTF_BIT) -#define RCC_CSR_SFTRSTF BIT(RCC_CSR_SFTRSTF_BIT) -#define RCC_CSR_PORRSTF BIT(RCC_CSR_PORRSTF_BIT) -#define RCC_CSR_PINRSTF BIT(RCC_CSR_PINRSTF_BIT) -#define RCC_CSR_RMVF BIT(RCC_CSR_RMVF_BIT) -#define RCC_CSR_LSIRDY BIT(RCC_CSR_LSIRDY_BIT) -#define RCC_CSR_LSION BIT(RCC_CSR_LSION_BIT) - -/* - * Convenience routines - */ - -/** - * SYSCLK sources - * @see rcc_clk_init() - */ -typedef enum rcc_sysclk_src { - RCC_CLKSRC_HSI = 0x0, - RCC_CLKSRC_HSE = 0x1, - RCC_CLKSRC_PLL = 0x2, -} rcc_sysclk_src; - -/** - * PLL entry clock source - * @see rcc_clk_init() - */ -typedef enum rcc_pllsrc { - RCC_PLLSRC_HSE = (0x1 << 16), - RCC_PLLSRC_HSI_DIV_2 = (0x0 << 16) -} rcc_pllsrc; - -/** - * PLL multipliers - * @see rcc_clk_init() - */ -typedef enum rcc_pll_multiplier { - RCC_PLLMUL_2 = (0x0 << 18), - RCC_PLLMUL_3 = (0x1 << 18), - RCC_PLLMUL_4 = (0x2 << 18), - RCC_PLLMUL_5 = (0x3 << 18), - RCC_PLLMUL_6 = (0x4 << 18), - RCC_PLLMUL_7 = (0x5 << 18), - RCC_PLLMUL_8 = (0x6 << 18), - RCC_PLLMUL_9 = (0x7 << 18), - RCC_PLLMUL_10 = (0x8 << 18), - RCC_PLLMUL_11 = (0x9 << 18), - RCC_PLLMUL_12 = (0xA << 18), - RCC_PLLMUL_13 = (0xB << 18), - RCC_PLLMUL_14 = (0xC << 18), - RCC_PLLMUL_15 = (0xD << 18), - RCC_PLLMUL_16 = (0xE << 18), -} rcc_pll_multiplier; - -/** - * @brief Identifies bus and clock line for a peripheral. - * - * Also generally useful as a unique identifier for that peripheral - * (or its corresponding device struct). - */ -typedef enum rcc_clk_id { - RCC_GPIOA, - RCC_GPIOB, - RCC_GPIOC, - RCC_GPIOD, -// RCC_AFIO, - RCC_ADC1, - RCC_ADC2, - RCC_ADC3, - RCC_USART1, - RCC_USART2, - RCC_USART3, - RCC_TIMER1, - RCC_TIMER2, - RCC_TIMER3, - RCC_TIMER4, - RCC_SPI1, - RCC_SPI2, - RCC_DMA1, - RCC_PWR, - RCC_BKP, - RCC_I2C1, - RCC_I2C2, - RCC_CRC, -// RCC_FLITF, -// RCC_SRAM, - RCC_GPIOE, - RCC_GPIOF, - RCC_GPIOG, - RCC_UART4, - RCC_UART5, - RCC_TIMER5, - RCC_TIMER6, - RCC_TIMER7, - RCC_TIMER8, - RCC_FSMC, - RCC_DAC, - RCC_DMA2, - RCC_SDIO, - RCC_SPI3, - RCC_TIMER9, - RCC_TIMER10, - RCC_TIMER11, - RCC_TIMER12, - RCC_TIMER13, - RCC_TIMER14, - RCC_USBFS, - RCC_SYSCFG, - RCC_SPI4 -} rcc_clk_id; - -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul); -void rcc_clk_disable(rcc_clk_id device); -void rcc_clk_enable(rcc_clk_id device); -void rcc_reset_dev(rcc_clk_id device); - -void SetupClock72MHz(); -void SetupClock120MHz(); -void SetupClock168MHz(); - -typedef enum rcc_clk_domain { - RCC_APB1, - RCC_APB2, - RCC_AHB1, - RCC_AHB2, - RCC_AHB3 -} rcc_clk_domain; - -rcc_clk_domain rcc_dev_clk(rcc_clk_id device); - -uint32 rcc_dev_clk_speed(rcc_clk_id id); -uint32 rcc_dev_timer_clk_speed(rcc_clk_id id); - -/** - * Prescaler identifiers - * @see rcc_set_prescaler() - */ -typedef enum rcc_prescaler { - RCC_PRESCALER_AHB, - RCC_PRESCALER_APB1, - RCC_PRESCALER_APB2, - RCC_PRESCALER_USB, - RCC_PRESCALER_ADC -} rcc_prescaler; - -/** - * ADC prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_adc_divider { - RCC_ADCPRE_PCLK_DIV_2 = 0x0 << 14, - RCC_ADCPRE_PCLK_DIV_4 = 0x1 << 14, - RCC_ADCPRE_PCLK_DIV_6 = 0x2 << 14, - RCC_ADCPRE_PCLK_DIV_8 = 0x3 << 14, -} rcc_adc_divider; - -/** - * APB1 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb1_divider { - RCC_APB1_HCLK_DIV_1 = 0x0 << 8, - RCC_APB1_HCLK_DIV_2 = 0x4 << 8, - RCC_APB1_HCLK_DIV_4 = 0x5 << 8, - RCC_APB1_HCLK_DIV_8 = 0x6 << 8, - RCC_APB1_HCLK_DIV_16 = 0x7 << 8, -} rcc_apb1_divider; - -/** - * APB2 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb2_divider { - RCC_APB2_HCLK_DIV_1 = 0x0 << 11, - RCC_APB2_HCLK_DIV_2 = 0x4 << 11, - RCC_APB2_HCLK_DIV_4 = 0x5 << 11, - RCC_APB2_HCLK_DIV_8 = 0x6 << 11, - RCC_APB2_HCLK_DIV_16 = 0x7 << 11, -} rcc_apb2_divider; - -/** - * AHB prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_ahb_divider { - RCC_AHB_SYSCLK_DIV_1 = 0x0 << 4, - RCC_AHB_SYSCLK_DIV_2 = 0x8 << 4, - RCC_AHB_SYSCLK_DIV_4 = 0x9 << 4, - RCC_AHB_SYSCLK_DIV_8 = 0xA << 4, - RCC_AHB_SYSCLK_DIV_16 = 0xB << 4, - RCC_AHB_SYSCLK_DIV_32 = 0xC << 4, - RCC_AHB_SYSCLK_DIV_64 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_128 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_256 = 0xE << 4, - RCC_AHB_SYSCLK_DIV_512 = 0xF << 4, -} rcc_ahb_divider; - -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider); - - -/** - * @brief Start the low speed internal oscillatior - */ -static inline void rcc_start_lsi(void) { - *bb_perip(&RCC_BASE->CSR, RCC_CSR_LSION_BIT) = 1; - while (*bb_perip(&RCC_BASE->CSR, RCC_CSR_LSIRDY_BIT) == 0); -} - -/* FIXME [0.0.13] Just have data point to an rcc_pll_multiplier! */ -/** - * @brief Start the low speed external oscillatior - */ -static inline void rcc_start_lse(void) { - bb_peri_set_bit(&RCC_BASE->BDCR, RCC_BDCR_LSEBYP_BIT, 0); - bb_peri_set_bit(&RCC_BASE->BDCR, RCC_BDCR_LSEON_BIT, 1); - while (bb_peri_get_bit(&RCC_BASE->BDCR, RCC_BDCR_LSERDY_BIT ) == 0); -} - -/* - * Deprecated bits. - */ -static inline void rcc_start_hse(void) { // Added to support RTClock -// *bb_perip(&RCC_BASE->CR, RCC_CR_HSEON_BIT) = 1; - while (bb_peri_get_bit(&RCC_BASE->CR, RCC_CR_HSERDY_BIT) == 0); -} - - - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.c b/STM32F4/cores/maple/libmaple/usbF4/usb.c index 263e76f84..c013f04de 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.c +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.c @@ -11,8 +11,8 @@ USB_OTG_CORE_HANDLE USB_OTG_dev; void setupUSB (void) { - #define USB_DISC_DEV GPIOD - #define USB_DISC_PIN 11 + #define USB_DISC_DEV GPIOA + #define USB_DISC_PIN 12 gpio_set_mode(USB_DISC_DEV, USB_DISC_PIN, GPIO_OUTPUT_OD); // ala42 #ifdef USB_DISC_OD diff --git a/STM32F4/cores/maple/wirish_types.h b/STM32F4/cores/maple/wirish_types.h index 2d6d6a9a6..55364ab45 100644 --- a/STM32F4/cores/maple/wirish_types.h +++ b/STM32F4/cores/maple/wirish_types.h @@ -48,7 +48,7 @@ * @brief Stores STM32-specific information related to a given Maple pin. * @see PIN_MAP */ -#ifdef BOARD_black_f4 +#ifdef BOARD_generic_f407v // restructure members to build consecutive pairs typedef struct stm32_pin_info { gpio_dev *gpio_device; /**< Maple pin's GPIO device */ diff --git a/STM32F4/variants/black_f407vet6/black_f4.h b/STM32F4/variants/generic_f407v/black_f4.h.old similarity index 99% rename from STM32F4/variants/black_f407vet6/black_f4.h rename to STM32F4/variants/generic_f407v/black_f4.h.old index 6f5d3dac7..20bb174c3 100644 --- a/STM32F4/variants/black_f407vet6/black_f4.h +++ b/STM32F4/variants/generic_f407v/black_f4.h.old @@ -121,7 +121,7 @@ PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7,PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15, PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15, -#if 0 +#if 0 // not available on LQFP100 package PF0,PF1,PF2,PF3,PF4,PF5,PF6,PF7,PF8,PF9,PF10,PF11,PF12,PF13,PF14,PF15, PG0,PG1,PG2,PG3,PG4,PG5,PG6,PG7,PG8,PG9,PG10,PG11,PG12,PG13,PG14,PG15 #endif diff --git a/STM32F4/variants/black_f407vet6/black_f4.cpp b/STM32F4/variants/generic_f407v/generic_f407v.cpp similarity index 99% rename from STM32F4/variants/black_f407vet6/black_f4.cpp rename to STM32F4/variants/generic_f407v/generic_f407v.cpp index 78d37aafc..119906476 100644 --- a/STM32F4/variants/black_f407vet6/black_f4.cpp +++ b/STM32F4/variants/generic_f407v/generic_f407v.cpp @@ -25,14 +25,14 @@ *****************************************************************************/ /** - * @file black_f4.cpp + * @file generic_f407v.cpp * @author ala42 - * @brief black_f4 board file. + * @brief generic_f407v board file. */ -#ifdef BOARD_black_f4 +#ifdef BOARD_generic_f407v -#include "black_f4.h" +#include "generic_f407v.h" //#include "fsmc.h" #include "gpio.h" diff --git a/STM32F4/variants/generic_f407v/generic_f407v.h b/STM32F4/variants/generic_f407v/generic_f407v.h new file mode 100644 index 000000000..15e93e457 --- /dev/null +++ b/STM32F4/variants/generic_f407v/generic_f407v.h @@ -0,0 +1,130 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file generic_f407v.h + * @author Marti Bolivar + * @brief Private include file for Maple Native in boards.h + * + * See maple.h for more information on these definitions. + */ + +#ifndef _BOARD_GENERIC_F407V_H_ +#define _BOARD_GENERIC_F407V_H_ + +#define Port2Pin(port, bit) ((port-'A')*16+bit) + +#define CYCLES_PER_MICROSECOND 168 + + +#undef STM32_PCLK1 +#undef STM32_PCLK2 +#define STM32_PCLK1 (CYCLES_PER_MICROSECOND*1000000/4) +#define STM32_PCLK2 (CYCLES_PER_MICROSECOND*1000000/2) + +#define SYSTICK_RELOAD_VAL (CYCLES_PER_MICROSECOND*1000-1) + +#define BOARD_USB_DM_PIN PA11 +#define BOARD_USB_DP_PIN PA12 + +#define BOARD_LED_PIN PA6 //Port2Pin('A', 6) +#define BOARD_LED2_PIN PA7 //Port2Pin('A', 7) +#define BOARD_BUTTON1_PIN PA0 //Port2Pin('A', 0) +#define BOARD_BUTTON2_PIN PE4 //Port2Pin('E', 4) +#define BOARD_BUTTON3_PIN PE3 //Port2Pin('E', 3) + +#define BOARD_NR_USARTS 5 +#define BOARD_USART1_TX_PIN PA9 //Port2Pin('A', 9) +#define BOARD_USART1_RX_PIN PA10 //Port2Pin('A',10) +#define BOARD_USART2_TX_PIN PA2 //Port2Pin('A', 2) +#define BOARD_USART2_RX_PIN PA3 //Port2Pin('A', 3) +#define BOARD_USART3_TX_PIN PB10 //Port2Pin('B',10) +#define BOARD_USART3_RX_PIN PB11 //Port2Pin('B',11) +#define BOARD_UART4_TX_PIN PA0 //Port2Pin('A', 0) +#define BOARD_UART4_RX_PIN PA1 //Port2Pin('A', 1) +#define BOARD_UART5_TX_PIN PC12 //Port2Pin('C',12) +#define BOARD_UART5_RX_PIN PD2 //Port2Pin('D', 2) + +#define BOARD_NR_SPI 3 +#define BOARD_SPI1_NSS_PIN PA4 //Port2Pin('A', 4) +#define BOARD_SPI1_SCK_PIN PA5 //Port2Pin('A', 5) +#define BOARD_SPI1_MISO_PIN PA6 //Port2Pin('A', 6) +#define BOARD_SPI1_MOSI_PIN PA7 //Port2Pin('A', 7) +#define BOARD_SPI1A_NSS_PIN PA15 //Port2Pin('A',15) +#define BOARD_SPI1A_SCK_PIN PB3 //Port2Pin('B', 3) +#define BOARD_SPI1A_MISO_PIN PB4 //Port2Pin('B', 4) +#define BOARD_SPI1A_MOSI_PIN PB5 //Port2Pin('B', 5) + +#define BOARD_SPI2_NSS_PIN PB12 //Port2Pin('B',12) +#define BOARD_SPI2_SCK_PIN PB13 //Port2Pin('B',13) +#define BOARD_SPI2_MISO_PIN PB14 //Port2Pin('B',14) +#define BOARD_SPI2_MOSI_PIN PB15 //Port2Pin('B',15) +#define BOARD_SPI2A_NSS_PIN PB9 //Port2Pin('B', 9) +#define BOARD_SPI2A_SCK_PIN PB10 //Port2Pin('B',10) +#define BOARD_SPI2A_MISO_PIN PC2 //Port2Pin('C', 2) +#define BOARD_SPI2A_MOSI_PIN pc3 //Port2Pin('C', 3) + +#define BOARD_SPI3_NSS_PIN PA15 //Port2Pin('A',15) +#define BOARD_SPI3_SCK_PIN PB3 //Port2Pin('B', 3) +#define BOARD_SPI3_MISO_PIN PB4 //Port2Pin('B', 4) +#define BOARD_SPI3_MOSI_PIN PB5 //Port2Pin('B', 5) +/* overlap with the SDIO interface for SD card +#define BOARD_SPI3A_NSS_PIN Port2Pin('A', 4) +#define BOARD_SPI3A_SCK_PIN Port2Pin('C',10) +#define BOARD_SPI3A_MISO_PIN Port2Pin('C',11) +#define BOARD_SPI3A_MOSI_PIN Port2Pin('C',12) +*/ +#define BOARD_SDIO_D0 PC8 //Port2Pin('C', 8) +#define BOARD_SDIO_D1 PC9 //Port2Pin('C', 9) +#define BOARD_SDIO_D2 PC10 //Port2Pin('C',10) +#define BOARD_SDIO_D3 PC11 //Port2Pin('C',11) +#define BOARD_SDIO_CK PC12 //Port2Pin('C',12) +#define BOARD_SDIO_CMD PD2 //Port2Pin('D', 2) + +#define BOARD_NR_GPIO_PINS 80 +#define BOARD_NR_PWM_PINS 22 +#define BOARD_NR_ADC_PINS 16 +#define BOARD_NR_USED_PINS 22 +#define BOARD_JTMS_SWDIO_PIN PA13 //Port2Pin('A',13) +#define BOARD_JTCK_SWCLK_PIN PA14 //Port2Pin('A',14) +#define BOARD_JTDI_PIN PA15 //Port2Pin('A',15) +#define BOARD_JTDO_PIN PB3 //Port2Pin('B', 3) +#define BOARD_NJTRST_PIN PB4 //Port2Pin('B', 4) + + +enum { +PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, +PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, +PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, +PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7,PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15, +PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15, +#if 0 // not available on LQFP100 package +PF0,PF1,PF2,PF3,PF4,PF5,PF6,PF7,PF8,PF9,PF10,PF11,PF12,PF13,PF14,PF15, +PG0,PG1,PG2,PG3,PG4,PG5,PG6,PG7,PG8,PG9,PG10,PG11,PG12,PG13,PG14,PG15 +#endif +}; + +#endif diff --git a/STM32F4/variants/black_f407vet6/ld/common.inc b/STM32F4/variants/generic_f407v/ld/common.inc similarity index 100% rename from STM32F4/variants/black_f407vet6/ld/common.inc rename to STM32F4/variants/generic_f407v/ld/common.inc diff --git a/STM32F4/variants/black_f407vet6/ld/extra_libs.inc b/STM32F4/variants/generic_f407v/ld/extra_libs.inc similarity index 100% rename from STM32F4/variants/black_f407vet6/ld/extra_libs.inc rename to STM32F4/variants/generic_f407v/ld/extra_libs.inc diff --git a/STM32F4/variants/black_f407vet6/ld/flash.ld b/STM32F4/variants/generic_f407v/ld/flash.ld similarity index 100% rename from STM32F4/variants/black_f407vet6/ld/flash.ld rename to STM32F4/variants/generic_f407v/ld/flash.ld diff --git a/STM32F4/variants/black_f407vet6/ld/jtag.ld b/STM32F4/variants/generic_f407v/ld/jtag.ld similarity index 100% rename from STM32F4/variants/black_f407vet6/ld/jtag.ld rename to STM32F4/variants/generic_f407v/ld/jtag.ld diff --git a/STM32F4/variants/black_f407vet6/ld/names.inc b/STM32F4/variants/generic_f407v/ld/names.inc similarity index 100% rename from STM32F4/variants/black_f407vet6/ld/names.inc rename to STM32F4/variants/generic_f407v/ld/names.inc diff --git a/STM32F4/variants/black_f407vet6/ld/ram.ld b/STM32F4/variants/generic_f407v/ld/ram.ld similarity index 100% rename from STM32F4/variants/black_f407vet6/ld/ram.ld rename to STM32F4/variants/generic_f407v/ld/ram.ld diff --git a/STM32F4/variants/black_f407vet6/ld/vector_symbols.inc b/STM32F4/variants/generic_f407v/ld/vector_symbols.inc similarity index 100% rename from STM32F4/variants/black_f407vet6/ld/vector_symbols.inc rename to STM32F4/variants/generic_f407v/ld/vector_symbols.inc diff --git a/STM32F4/variants/black_f407vet6/pins_arduino.h b/STM32F4/variants/generic_f407v/pins_arduino.h similarity index 100% rename from STM32F4/variants/black_f407vet6/pins_arduino.h rename to STM32F4/variants/generic_f407v/pins_arduino.h diff --git a/STM32F4/variants/black_f407vet6/stm32_isrs.S b/STM32F4/variants/generic_f407v/stm32_isrs.S similarity index 100% rename from STM32F4/variants/black_f407vet6/stm32_isrs.S rename to STM32F4/variants/generic_f407v/stm32_isrs.S diff --git a/STM32F4/variants/black_f407vet6/stm32_vector_table.S b/STM32F4/variants/generic_f407v/stm32_vector_table.S similarity index 100% rename from STM32F4/variants/black_f407vet6/stm32_vector_table.S rename to STM32F4/variants/generic_f407v/stm32_vector_table.S diff --git a/STM32F4/variants/black_f407vet6/variant.h b/STM32F4/variants/generic_f407v/variant.h similarity index 100% rename from STM32F4/variants/black_f407vet6/variant.h rename to STM32F4/variants/generic_f407v/variant.h diff --git a/STM32F4/variants/black_f407vet6/wirish/start.S b/STM32F4/variants/generic_f407v/wirish/start.S similarity index 100% rename from STM32F4/variants/black_f407vet6/wirish/start.S rename to STM32F4/variants/generic_f407v/wirish/start.S diff --git a/STM32F4/variants/black_f407vet6/wirish/start_c.c b/STM32F4/variants/generic_f407v/wirish/start_c.c similarity index 100% rename from STM32F4/variants/black_f407vet6/wirish/start_c.c rename to STM32F4/variants/generic_f407v/wirish/start_c.c From cbfb87222fec84af899c11d2da8195fe92ad098f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Giorgiogg=C3=AC?= Date: Tue, 18 Apr 2017 12:24:06 +0200 Subject: [PATCH 050/307] Fix indentation --- STM32F1/cores/maple/usb_serial.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/STM32F1/cores/maple/usb_serial.h b/STM32F1/cores/maple/usb_serial.h index 96bbefc25..c2de1c580 100644 --- a/STM32F1/cores/maple/usb_serial.h +++ b/STM32F1/cores/maple/usb_serial.h @@ -44,19 +44,19 @@ class USBSerial : public Stream { void begin(void); - // Roger Clark. Added dummy function so that existing Arduino sketches which specify baud rate will compile. - void begin(unsigned long); - void begin(unsigned long, uint8_t); + // Roger Clark. Added dummy function so that existing Arduino sketches which specify baud rate will compile. + void begin(unsigned long); + void begin(unsigned long, uint8_t); void end(void); - operator bool() { return true; } // Roger Clark. This is needed because in cardinfo.ino it does if (!Serial) . It seems to be a work around for the Leonardo that we needed to implement just to be compliant with the API + operator bool() { return true; } // Roger Clark. This is needed because in cardinfo.ino it does if (!Serial) . It seems to be a work around for the Leonardo that we needed to implement just to be compliant with the API virtual int available(void);// Changed to virtual uint32 read(uint8 * buf, uint32 len); - // uint8 read(void); + // uint8 read(void); - // Roger Clark. added functions to support Arduino 1.0 API + // Roger Clark. added functions to support Arduino 1.0 API virtual int peek(void); virtual int read(void); int availableForWrite(void); @@ -74,8 +74,7 @@ class USBSerial : public Stream { }; #ifdef SERIAL_USB - extern USBSerial Serial; + extern USBSerial Serial; #endif #endif - From 0be991b434abc14f7ec9c91252977b60350d263c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Giorgiogg=C3=AC?= Date: Tue, 18 Apr 2017 12:43:01 +0200 Subject: [PATCH 051/307] Update usb_serial.h --- STM32F1/cores/maple/usb_serial.h | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/STM32F1/cores/maple/usb_serial.h b/STM32F1/cores/maple/usb_serial.h index c2de1c580..ceb81e17b 100644 --- a/STM32F1/cores/maple/usb_serial.h +++ b/STM32F1/cores/maple/usb_serial.h @@ -49,8 +49,6 @@ class USBSerial : public Stream { void begin(unsigned long, uint8_t); void end(void); - operator bool() { return true; } // Roger Clark. This is needed because in cardinfo.ino it does if (!Serial) . It seems to be a work around for the Leonardo that we needed to implement just to be compliant with the API - virtual int available(void);// Changed to virtual uint32 read(uint8 * buf, uint32 len); @@ -69,8 +67,20 @@ class USBSerial : public Stream { uint8 getRTS(); uint8 getDTR(); - uint8 isConnected(); uint8 pending(); + + /* SukkoPera: This is the Arduino way to check if an USB CDC serial + * connection is open. + + * Used for instance in cardinfo.ino. + */ + operator bool(); + + /* Old libmaple way to check for serial connection. + * + * Deprecated, use the above. + */ + uint8 isConnected() { return (bool) *this; } }; #ifdef SERIAL_USB From 38525521fd9ea4713970073326c21b8e9c54c09b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Giorgiogg=C3=AC?= Date: Tue, 18 Apr 2017 12:44:10 +0200 Subject: [PATCH 052/307] Update usb_serial.cpp --- STM32F1/cores/maple/usb_serial.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index 5eaf70efb..2f7daddfd 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -178,10 +178,6 @@ uint8 USBSerial::pending(void) { return usb_cdcacm_get_pending(); } -uint8 USBSerial::isConnected(void) { - return usb_is_connected(USBLIB) && usb_is_configured(USBLIB) && usb_cdcacm_get_dtr(); -} - uint8 USBSerial::getDTR(void) { return usb_cdcacm_get_dtr(); } @@ -190,6 +186,10 @@ uint8 USBSerial::getRTS(void) { return usb_cdcacm_get_rts(); } +uint8 USBSerial::operator bool() { + return usb_is_connected(USBLIB) && usb_is_configured(USBLIB) && usb_cdcacm_get_dtr(); +} + #if BOARD_HAVE_SERIALUSB #ifdef SERIAL_USB USBSerial Serial; From 81b1b08b95695256f6253bd236c4ee4755eb0089 Mon Sep 17 00:00:00 2001 From: SukkoPera Date: Tue, 18 Apr 2017 23:25:36 +0200 Subject: [PATCH 053/307] Fix return type --- STM32F1/cores/maple/usb_serial.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index 2f7daddfd..85c70246f 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -186,7 +186,7 @@ uint8 USBSerial::getRTS(void) { return usb_cdcacm_get_rts(); } -uint8 USBSerial::operator bool() { +USBSerial::operator bool() { return usb_is_connected(USBLIB) && usb_is_configured(USBLIB) && usb_cdcacm_get_dtr(); } From 0590f27afaea2e007f7f5f672add36f462e509d1 Mon Sep 17 00:00:00 2001 From: Oleksandr Masliuchenko Date: Sat, 22 Apr 2017 16:27:30 +0300 Subject: [PATCH 054/307] Compiler warning fixed --- STM32F1/cores/maple/libmaple/gpio_f1.c | 1 - 1 file changed, 1 deletion(-) diff --git a/STM32F1/cores/maple/libmaple/gpio_f1.c b/STM32F1/cores/maple/libmaple/gpio_f1.c index ecd015d13..6de16f55a 100644 --- a/STM32F1/cores/maple/libmaple/gpio_f1.c +++ b/STM32F1/cores/maple/libmaple/gpio_f1.c @@ -142,7 +142,6 @@ gpio_pin_mode gpio_get_mode(gpio_dev *dev, uint8 pin) { gpio_reg_map *regs = dev->regs; __io uint32 *cr = ®s->CRL + (pin >> 3); uint32 shift = (pin & 0x7) * 4; - uint32 tmp = *cr; uint32 crMode = (*cr>>shift) & 0x0F; From 83c834091c99589ae18cb374975fe20454687b81 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Wed, 26 Apr 2017 23:19:20 +0200 Subject: [PATCH 055/307] reworked gpio pin handling functions --- STM32F4/boards.txt | 11 +++ STM32F4/cores/maple/boards.cpp | 4 + STM32F4/cores/maple/boards.h | 23 ++--- .../cores/maple/libmaple/HardwareSerial.cpp | 28 +++--- STM32F4/cores/maple/libmaple/HardwareSerial.h | 2 +- STM32F4/cores/maple/libmaple/dac.c | 4 +- STM32F4/cores/maple/libmaple/fsmc.c | 53 +++++----- STM32F4/cores/maple/libmaple/gpio.h | 99 ++++++++++++++++++- STM32F4/cores/maple/libmaple/gpioF4.c | 24 +++-- .../maple/libmaple/{gpioF4.h => gpio_def.h} | 76 ++------------ STM32F4/cores/maple/libmaple/i2c.c | 40 ++++---- STM32F4/cores/maple/libmaple/i2c.h | 2 +- STM32F4/cores/maple/libmaple/libmaple_types.h | 3 + STM32F4/cores/maple/libmaple/rccF4.c | 5 +- STM32F4/cores/maple/libmaple/spi.h | 12 +-- STM32F4/cores/maple/libmaple/spiF4.h | 11 --- STM32F4/cores/maple/libmaple/spi_f4.c | 26 +++-- .../cores/maple/libmaple/usbF4/VCP/usb_bsp.c | 16 +-- STM32F4/cores/maple/libmaple/usbF4/usb.c | 13 ++- STM32F4/cores/maple/libmaple/util.c | 6 +- STM32F4/cores/maple/usb_serial.cpp | 4 + STM32F4/cores/maple/usb_serial.h | 5 + STM32F4/cores/maple/wirish.h | 4 +- STM32F4/cores/maple/wirish_digital.cpp | 17 ++-- STM32F4/cores/maple/wirish_types.h | 9 +- STM32F4/platform.txt | 2 +- .../variants/generic_f407v/generic_f407v.h | 2 +- STM32F4/variants/generic_f407v/ld/jtag.ld | 2 +- 28 files changed, 275 insertions(+), 228 deletions(-) rename STM32F4/cores/maple/libmaple/{gpioF4.h => gpio_def.h} (91%) diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index df9f2b41a..04bfd0fd0 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -1,5 +1,7 @@ # +menu.usb_cfg=USB configuration + ############################################################## discovery_f407.name=STM32 Discovery F407 @@ -57,6 +59,15 @@ generic_f407v.build.error_led_port=GPIOA generic_f407v.build.error_led_pin=7 generic_f407v.build.board=STM32GenericF407VET6 +generic_f407v.menu.usb_cfg.usb_nc=USB inactive +generic_f407v.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC + +generic_f407v.menu.usb_cfg.usb_serial=USB serial (CDC) +generic_f407v.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB + +generic_f407v.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) +generic_f407v.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC + ############################################################## stm32f4stamp.name=STM32F4Stamp F405 diff --git a/STM32F4/cores/maple/boards.cpp b/STM32F4/cores/maple/boards.cpp index c8ba97894..fc453fece 100644 --- a/STM32F4/cores/maple/boards.cpp +++ b/STM32F4/cores/maple/boards.cpp @@ -41,6 +41,7 @@ #include "adc.h" #include "timer.h" #include "usb.h" +#include "usb_serial.h" static void setupFlash(void); @@ -67,7 +68,10 @@ void init(void) { setupADC(); setupTimers(); +#ifdef SERIAL_USB setupUSB(); + SerialUSB.begin(); +#endif } /* You could farm this out to the files in boards/ if e.g. it takes diff --git a/STM32F4/cores/maple/boards.h b/STM32F4/cores/maple/boards.h index e123341ed..50fd89d38 100644 --- a/STM32F4/cores/maple/boards.h +++ b/STM32F4/cores/maple/boards.h @@ -40,7 +40,6 @@ #define _BOARDS_H_ #include "libmaple.h" -#include "gpio.h" #include "timer.h" #include "wirish_types.h" @@ -55,9 +54,12 @@ enum { D32, D33, D34, D35, D36, D37, D38, D39, D40, D41, D42, D43, D44, D45, D46, D47, D48, D49, D50, D51, D52, D53, D54, D55, D56, D57, D58, D59, D60, D61, D62, D63, D64, D65, D66, D67, D68, D69, D70, D71, D72, D73, D74, D75, D76, +#if 0 // not available on LQFP100 package D77, D78, D79, D80, D81, D82, D83, D84, D85, D86, D87, D88, D89, D90, D91, D92, D93, D94, D95, D96, D97, D98, D99, D100, D101, D102, D103, D104, D105, - D106, D107, D108, D109, D110, D111, }; + D106, D107, D108, D109, D110, D111, +#endif // not available on LQFP100 package +}; /** * @brief Maps each Maple pin to a corresponding stm32_pin_info. @@ -115,26 +117,13 @@ extern void boardInit(void); * @return true if the given pin is in boardUsedPins, and false otherwise. * @see boardUsedPins */ -bool boardUsesPin(uint8 pin); +extern bool boardUsesPin(uint8 pin); /* Include the appropriate private header from boards/: */ /* FIXME HACK put boards/ before these paths once IDE uses make. */ -#ifdef BOARD_maple -#include "maple.h" -#elif defined(BOARD_maple_native) -#include "maple_native.h" -#elif defined(BOARD_maple_mini) -#include "maple_mini.h" -#elif defined(BOARD_maple_RET6) -/* - * **NOT** MAPLE REV6. This the **Maple RET6 EDITION**, which is a - * Maple with an STM32F103RET6 (...RET6) instead of an STM32F103RBT6 - * (...RBT6) on it. Maple Rev6 (as of March 2011) DOES NOT EXIST. - */ -#include "maple_RET6.h" -#elif defined(BOARD_aeroquad32) || defined(BOARD_aeroquad32f1) +#if defined(BOARD_aeroquad32) || defined(BOARD_aeroquad32f1) #include "aeroquad32.h" #elif defined(BOARD_aeroquad32mini) #include "aeroquad32mini.h" diff --git a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp index 475116b17..f9387d15a 100644 --- a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp +++ b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp @@ -56,19 +56,19 @@ #define RX5 BOARD_UART5_RX_PIN #endif -HardwareSerial Serial(USART1, TX1, RX1); +HardwareSerial Serial1(USART1, TX1, RX1); #ifdef TX2 -HardwareSerial Serial1(USART2, TX2, RX2); +HardwareSerial Serial2(USART2, TX2, RX2); #endif #ifdef TX3 -HardwareSerial Serial2(USART3, TX3, RX3); +HardwareSerial Serial3(USART3, TX3, RX3); #endif #if defined(STM32_HIGH_DENSITY) && !defined(BOARD_maple_RET6) -HardwareSerial Serial3(UART4, TX4, RX4); -HardwareSerial Serial4(UART5, TX5, RX5); +HardwareSerial Serial4(UART4, TX4, RX4); +HardwareSerial Serial5(UART5, TX5, RX5); #endif HardwareSerial::HardwareSerial(usart_dev *usart_device, @@ -90,25 +90,23 @@ void HardwareSerial::begin(uint32 baud) { return; } - const stm32_pin_info *txi = &PIN_MAP[tx_pin]; - const stm32_pin_info *rxi = &PIN_MAP[rx_pin]; #ifdef STM32F4 // int af = 7<<8; if (usart_device == UART4 || usart_device == UART5) { - gpio_set_af_mode(txi->gpio_device, txi->gpio_bit, 8); - gpio_set_af_mode(rxi->gpio_device, rxi->gpio_bit, 8); + gpio_set_af_mode(tx_pin, 8); + gpio_set_af_mode(rx_pin, 8); } else { - gpio_set_af_mode(txi->gpio_device, txi->gpio_bit, 7); - gpio_set_af_mode(rxi->gpio_device, rxi->gpio_bit, 7); + gpio_set_af_mode(tx_pin, 7); + gpio_set_af_mode(rx_pin, 7); } - gpio_set_mode(txi->gpio_device, txi->gpio_bit, (gpio_pin_mode)(GPIO_AF_OUTPUT_PP | GPIO_PUPD_INPUT_PU | 0x700)); - gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, (gpio_pin_mode)(GPIO_MODE_AF | GPIO_PUPD_INPUT_PU | 0x700)); + gpio_set_mode(tx_pin, (gpio_pin_mode)(GPIO_AF_OUTPUT_PP | GPIO_PUPD_INPUT_PU | 0x700)); + gpio_set_mode(rx_pin, (gpio_pin_mode)(GPIO_MODE_AF | GPIO_PUPD_INPUT_PU | 0x700)); //gpio_set_mode(txi->gpio_device, txi->gpio_bit, (gpio_pin_mode)(GPIO_PUPD_INPUT_PU)); //gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, (gpio_pin_mode)(GPIO_PUPD_INPUT_PU)); #else - gpio_set_mode(txi->gpio_device, txi->gpio_bit, GPIO_AF_OUTPUT_PP); - gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(tx_pin, GPIO_AF_OUTPUT_PP); + gpio_set_mode(rx_pin, GPIO_INPUT_FLOATING); #endif #if 0 if (txi->timer_device != NULL) { diff --git a/STM32F4/cores/maple/libmaple/HardwareSerial.h b/STM32F4/cores/maple/libmaple/HardwareSerial.h index c09fe54f1..d7e8a3d1f 100644 --- a/STM32F4/cores/maple/libmaple/HardwareSerial.h +++ b/STM32F4/cores/maple/libmaple/HardwareSerial.h @@ -75,12 +75,12 @@ class HardwareSerial : public Stream { uint8 rx_pin; }; -extern HardwareSerial Serial; extern HardwareSerial Serial1; extern HardwareSerial Serial2; #if defined(STM32_HIGH_DENSITY) && !defined(BOARD_maple_RET6) extern HardwareSerial Serial3; extern HardwareSerial Serial4; +extern HardwareSerial Serial5; #endif extern HardwareSerial &SerialDebug; #endif diff --git a/STM32F4/cores/maple/libmaple/dac.c b/STM32F4/cores/maple/libmaple/dac.c index 264e4e21a..3853f903c 100644 --- a/STM32F4/cores/maple/libmaple/dac.c +++ b/STM32F4/cores/maple/libmaple/dac.c @@ -126,11 +126,11 @@ void dac_enable_channel(const dac_dev *dev, uint8 channel) { */ switch (channel) { case 1: - gpio_set_mode(GPIOA, 4, GPIO_INPUT_ANALOG); + gpio_set_mode((uint8_t)PA4, GPIO_INPUT_ANALOG); dev->regs->CR |= DAC_CR_EN1; break; case 2: - gpio_set_mode(GPIOA, 5, GPIO_INPUT_ANALOG); + gpio_set_mode((uint8_t)PA5, GPIO_INPUT_ANALOG); dev->regs->CR |= DAC_CR_EN2; break; } diff --git a/STM32F4/cores/maple/libmaple/fsmc.c b/STM32F4/cores/maple/libmaple/fsmc.c index 06ca7df6a..42b0d77b4 100644 --- a/STM32F4/cores/maple/libmaple/fsmc.c +++ b/STM32F4/cores/maple/libmaple/fsmc.c @@ -39,27 +39,28 @@ */ void fsmc_sram_init_gpios(void) { /* Data lines... */ - gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD0, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD1, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD8, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD9, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD10, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD14, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD15, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE7, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE8, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE9, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE10, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE11, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE12, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE13, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE14, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE15, GPIO_AF_OUTPUT_PP); /* Address lines... */ - gpio_set_mode(GPIOD, 11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 13, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD11, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD12, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD13, GPIO_AF_OUTPUT_PP); +#if 0 // not available on LQFP package gpio_set_mode(GPIOF, 0, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 1, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 2, GPIO_AF_OUTPUT_PP); @@ -76,18 +77,20 @@ void fsmc_sram_init_gpios(void) { gpio_set_mode(GPIOG, 3, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 4, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 5, GPIO_AF_OUTPUT_PP); - +#endif // not available on LQFP package /* And control lines... */ - gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP); // NOE - gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP); // NWE + gpio_set_mode(PD4, GPIO_AF_OUTPUT_PP); // NOE + gpio_set_mode(PD5, GPIO_AF_OUTPUT_PP); // NWE - gpio_set_mode(GPIOD, 7, GPIO_AF_OUTPUT_PP); // NE1 + gpio_set_mode(PD7, GPIO_AF_OUTPUT_PP); // NE1 +#if 0 // not available on LQFP package gpio_set_mode(GPIOG, 9, GPIO_AF_OUTPUT_PP); // NE2 gpio_set_mode(GPIOG, 10, GPIO_AF_OUTPUT_PP); // NE3 gpio_set_mode(GPIOG, 12, GPIO_AF_OUTPUT_PP); // NE4 +#endif // not available on LQFP package - gpio_set_mode(GPIOE, 0, GPIO_AF_OUTPUT_PP); // NBL0 - gpio_set_mode(GPIOE, 1, GPIO_AF_OUTPUT_PP); // NBL1 + gpio_set_mode(PE0, GPIO_AF_OUTPUT_PP); // NBL0 + gpio_set_mode(PE1, GPIO_AF_OUTPUT_PP); // NBL1 } #endif /* STM32_HIGH_DENSITY */ diff --git a/STM32F4/cores/maple/libmaple/gpio.h b/STM32F4/cores/maple/libmaple/gpio.h index f065c7190..4c0ba7100 100644 --- a/STM32F4/cores/maple/libmaple/gpio.h +++ b/STM32F4/cores/maple/libmaple/gpio.h @@ -31,5 +31,102 @@ * (AFIO) prototypes, defines, and inlined access functions. */ +#ifndef _GPIO_H_ +#define _GPIO_H_ + +#include "libmaple.h" +#include "boards.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +/** + * @brief Get a GPIO port's corresponding afio_exti_port. + * @param dev GPIO device whose afio_exti_port to return. + */ +static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { + return dev->exti_port; +} + +/** + * Set or reset a GPIO pin. + * + * Pin must have previously been configured to output mode. + * + * @param dev GPIO device whose pin to set. + * @param pin Pin on to set or reset + * @param val If true, set the pin. If false, reset the pin. + */ +static inline void gpio_write_pin(uint8_t pin, uint8 val) { + if (val) { + (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(PIN_MAP[pin].gpio_bit); + } else { + (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(PIN_MAP[pin].gpio_bit); + } +} + +static inline void gpio_set_pin(uint8_t pin) { + (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(PIN_MAP[pin].gpio_bit); +} + +static inline void gpio_clear_pin(uint8_t pin) { + (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(PIN_MAP[pin].gpio_bit); +} + +/** + * Determine whether or not a GPIO pin is set. + * + * Pin must have previously been configured to input mode. + * + * @param dev GPIO device whose pin to test. + * @param pin Pin on dev to test. + * @return True if the pin is set, false otherwise. + */ +static inline uint32 gpio_read_pin(uint8_t pin) { + return (PIN_MAP[pin].gpio_device)->regs->IDR & BIT(PIN_MAP[pin].gpio_bit); +} + +/** + * Toggle a pin configured as output push-pull. + * @param dev GPIO device. + * @param pin Pin on dev to toggle. + */ +static inline void gpio_toggle_pin(uint8_t pin) { + (PIN_MAP[pin].gpio_device)->regs->ODR = (PIN_MAP[pin].gpio_device)->regs->ODR ^ BIT(PIN_MAP[pin].gpio_bit); +} + +/* + * GPIO Convenience routines + */ + +extern void gpio_init(gpio_dev *dev); +extern void gpio_init_all(void); +extern void gpio_set_mode(uint8_t pin, gpio_pin_mode mode); +extern void gpio_set_af_mode(uint8_t pin, int mode); + +/* + * AFIO convenience routines + */ + +extern void afio_init(void); +extern void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port); +extern void afio_remap(afio_remap_peripheral p); + +/** + * @brief Enable or disable the JTAG and SW debug ports. + * @param config Desired debug port configuration + * @see afio_debug_cfg + */ +static inline void afio_cfg_debug_ports(afio_debug_cfg config) { + //__io uint32 *mapr = &AFIO_BASE->MAPR; + //*mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; +} + +#ifdef __cplusplus +} +#endif + +#endif -#include "gpioF4.h" diff --git a/STM32F4/cores/maple/libmaple/gpioF4.c b/STM32F4/cores/maple/libmaple/gpioF4.c index ba166f538..0792e121d 100644 --- a/STM32F4/cores/maple/libmaple/gpioF4.c +++ b/STM32F4/cores/maple/libmaple/gpioF4.c @@ -24,7 +24,7 @@ * SOFTWARE. *****************************************************************************/ - #ifdef STM32F4 +#ifdef STM32F4 /** * @file gpio.c @@ -79,6 +79,7 @@ gpio_dev gpioe = { /** GPIO port E device. */ gpio_dev* const GPIOE = &gpioe; + #if 0 // not available on LQFP 100 package gpio_dev gpiof = { .regs = GPIOF_BASE, .clk_id = RCC_GPIOF, @@ -94,6 +95,7 @@ gpio_dev gpiog = { }; /** GPIO port G device. */ gpio_dev* const GPIOG = &gpiog; + #endif // not available on LQFP 100 package #endif /* @@ -122,9 +124,11 @@ void gpio_init_all(void) { gpio_init(GPIOD); #ifdef STM32_HIGH_DENSITY - gpio_init(GPIOE); - gpio_init(GPIOF); - gpio_init(GPIOG); + gpio_init(GPIOE); + #if 0 // not available on LQFP 100 package + gpio_init(GPIOF); + gpio_init(GPIOG); + #endif // not available on LQFP 100 package #endif #ifdef ARDUINO_STM32F4_NETDUINO2PLUS @@ -148,8 +152,9 @@ void gpio_init_all(void) { * @param mode General purpose or alternate function mode to set the pin to. * @see gpio_pin_mode */ -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { - gpio_reg_map *regs = dev->regs; +void gpio_set_mode(uint8_t io_pin, gpio_pin_mode mode) { + gpio_reg_map *regs = (PIN_MAP[io_pin].gpio_device)->regs; + uint8_t pin = PIN_MAP[io_pin].gpio_bit; //regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 8) & 15) << (4*(pin&7))); //gpio_set_af_mode(dev, pin, mode>>8); @@ -168,10 +173,11 @@ void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { * @param mode alternate function mode to set the pin to. * @see gpio_pin_mode */ -void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode) { - gpio_reg_map *regs = dev->regs; +void gpio_set_af_mode(uint8_t io_pin, int mode) { + gpio_reg_map *regs = (PIN_MAP[io_pin].gpio_device)->regs; + uint8_t pin = PIN_MAP[io_pin].gpio_bit; - regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 0) & 15) << (4*(pin&7))); + regs->AFR[pin>>3] = (regs->AFR[pin>>3] & ~(15 << (4*(pin&7)))) | (((mode >> 0) & 15) << (4*(pin&7))); } /* diff --git a/STM32F4/cores/maple/libmaple/gpioF4.h b/STM32F4/cores/maple/libmaple/gpio_def.h similarity index 91% rename from STM32F4/cores/maple/libmaple/gpioF4.h rename to STM32F4/cores/maple/libmaple/gpio_def.h index 91bd67be3..8b9e693ea 100644 --- a/STM32F4/cores/maple/libmaple/gpioF4.h +++ b/STM32F4/cores/maple/libmaple/gpio_def.h @@ -31,11 +31,12 @@ * (AFIO) prototypes, defines, and inlined access functions. */ -#ifndef _GPIO_H_ -#define _GPIO_H_ +#ifndef _GPIO_DEF_H_ +#define _GPIO_DEF_H_ #include "libmaple.h" #include "rcc.h" +#include "wirish_types.h" #ifdef __cplusplus extern "C"{ @@ -74,11 +75,14 @@ typedef enum afio_exti_port { AFIO_EXTI_PD, /**< Use port D (PDx) pin. */ #ifdef STM32_HIGH_DENSITY AFIO_EXTI_PE, /**< Use port E (PEx) pin. */ + #if 0 // not available on LQFP 100 package AFIO_EXTI_PF, /**< Use port F (PFx) pin. */ AFIO_EXTI_PG, /**< Use port G (PGx) pin. */ + #endif // not available on LQFP 100 package #endif } afio_exti_port; + /** GPIO device type */ typedef struct gpio_dev { gpio_reg_map *regs; /**< Register map */ @@ -97,10 +101,12 @@ extern gpio_dev* const GPIOD; #ifdef STM32_HIGH_DENSITY extern gpio_dev gpioe; extern gpio_dev* const GPIOE; + #if 0 // not available on LQFP 100 package extern gpio_dev gpiof; extern gpio_dev* const GPIOF; extern gpio_dev gpiog; extern gpio_dev* const GPIOG; + #endif // not available on LQFP 100 package #endif /** GPIO port register map base pointer */ @@ -110,8 +116,10 @@ extern gpio_dev* const GPIOG; #define GPIOD_BASE ((struct gpio_reg_map*)0x40020C00) #ifdef STM32_HIGH_DENSITY #define GPIOE_BASE ((struct gpio_reg_map*)0x40021000) + #if 0 // not available on LQFP 100 package #define GPIOF_BASE ((struct gpio_reg_map*)0x40021400) #define GPIOG_BASE ((struct gpio_reg_map*)0x40021800) + #endif // not available on LQFP 100 package #endif /* @@ -190,61 +198,6 @@ typedef enum gpio_pin_mode { GPIO_BIGNUMBER = 0xfff } gpio_pin_mode; -/* - * GPIO Convenience routines - */ - -void gpio_init(gpio_dev *dev); -void gpio_init_all(void); -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode); -void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode); - -/** - * @brief Get a GPIO port's corresponding afio_exti_port. - * @param dev GPIO device whose afio_exti_port to return. - */ -static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { - return dev->exti_port; -} - -/** - * Set or reset a GPIO pin. - * - * Pin must have previously been configured to output mode. - * - * @param dev GPIO device whose pin to set. - * @param pin Pin on to set or reset - * @param val If true, set the pin. If false, reset the pin. - */ -static inline void gpio_write_bit(gpio_dev *dev, uint8 pin, uint8 val) { - if (val) { - dev->regs->BSRRL = BIT(pin); - } else { - dev->regs->BSRRH = BIT(pin); - } -} - -/** - * Determine whether or not a GPIO pin is set. - * - * Pin must have previously been configured to input mode. - * - * @param dev GPIO device whose pin to test. - * @param pin Pin on dev to test. - * @return True if the pin is set, false otherwise. - */ -static inline uint32 gpio_read_bit(gpio_dev *dev, uint8 pin) { - return dev->regs->IDR & BIT(pin); -} - -/** - * Toggle a pin configured as output push-pull. - * @param dev GPIO device. - * @param pin Pin on dev to toggle. - */ -static inline void gpio_toggle_bit(gpio_dev *dev, uint8 pin) { - dev->regs->ODR = dev->regs->ODR ^ BIT(pin); -} /* * AFIO register map @@ -532,15 +485,6 @@ typedef enum afio_debug_cfg { for use as GPIOs. */ } afio_debug_cfg; -/** - * @brief Enable or disable the JTAG and SW debug ports. - * @param config Desired debug port configuration - * @see afio_debug_cfg - */ -static inline void afio_cfg_debug_ports(afio_debug_cfg config) { - //__io uint32 *mapr = &AFIO_BASE->MAPR; - //*mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; -} #ifdef __cplusplus } diff --git a/STM32F4/cores/maple/libmaple/i2c.c b/STM32F4/cores/maple/libmaple/i2c.c index e3f3199bc..a582ed056 100644 --- a/STM32F4/cores/maple/libmaple/i2c.c +++ b/STM32F4/cores/maple/libmaple/i2c.c @@ -41,9 +41,9 @@ static i2c_dev i2c_dev1 = { .regs = I2C1_BASE, - .gpio_port = &gpiob, - .sda_pin = 7, - .scl_pin = 6, + //.gpio_port = &gpiob, + .sda_pin = PB7, + .scl_pin = PB6, .clk_id = RCC_I2C1, .ev_nvic_line = NVIC_I2C1_EV, .er_nvic_line = NVIC_I2C1_ER, @@ -54,9 +54,9 @@ i2c_dev* const I2C1 = &i2c_dev1; static i2c_dev i2c_dev2 = { .regs = I2C2_BASE, - .gpio_port = &gpiob, - .sda_pin = 11, - .scl_pin = 10, + //.gpio_port = &gpiob, + .sda_pin = PB11, + .scl_pin = PB10, .clk_id = RCC_I2C2, .ev_nvic_line = NVIC_I2C2_EV, .er_nvic_line = NVIC_I2C2_ER, @@ -336,38 +336,38 @@ void __irq_i2c2_er(void) { */ void i2c_bus_reset(const i2c_dev *dev) { /* Release both lines */ - gpio_write_bit(dev->gpio_port, dev->scl_pin, 1); - gpio_write_bit(dev->gpio_port, dev->sda_pin, 1); - gpio_set_mode(dev->gpio_port, dev->scl_pin, GPIO_OUTPUT_OD); - gpio_set_mode(dev->gpio_port, dev->sda_pin, GPIO_OUTPUT_OD); + gpio_set_pin(dev->scl_pin); + gpio_set_pin(dev->sda_pin); + gpio_set_mode(dev->scl_pin, GPIO_OUTPUT_OD); + gpio_set_mode(dev->sda_pin, GPIO_OUTPUT_OD); /* * Make sure the bus is free by clocking it until any slaves release the * bus. */ - while (!gpio_read_bit(dev->gpio_port, dev->sda_pin)) { + while (!gpio_read_pin(dev->sda_pin)) { /* Wait for any clock stretching to finish */ - while (!gpio_read_bit(dev->gpio_port, dev->scl_pin)) + while (!gpio_read_pin(dev->scl_pin)) ; delay_us(10); /* Pull low */ - gpio_write_bit(dev->gpio_port, dev->scl_pin, 0); + gpio_clear_pin(dev->scl_pin); delay_us(10); /* Release high again */ - gpio_write_bit(dev->gpio_port, dev->scl_pin, 1); + gpio_set_pin(dev->scl_pin); delay_us(10); } /* Generate start then stop condition */ - gpio_write_bit(dev->gpio_port, dev->sda_pin, 0); + gpio_clear_pin(dev->sda_pin); delay_us(10); - gpio_write_bit(dev->gpio_port, dev->scl_pin, 0); + gpio_clear_pin(dev->scl_pin); delay_us(10); - gpio_write_bit(dev->gpio_port, dev->scl_pin, 1); + gpio_set_pin(dev->scl_pin); delay_us(10); - gpio_write_bit(dev->gpio_port, dev->sda_pin, 1); + gpio_set_pin(dev->sda_pin); } /** @@ -413,8 +413,8 @@ void i2c_master_enable(i2c_dev *dev, uint32 flags) { /* Turn on clock and set GPIO modes */ i2c_init(dev); - gpio_set_mode(dev->gpio_port, dev->sda_pin, GPIO_AF_OUTPUT_OD); - gpio_set_mode(dev->gpio_port, dev->scl_pin, GPIO_AF_OUTPUT_OD); + gpio_set_mode(dev->sda_pin, GPIO_AF_OUTPUT_OD); + gpio_set_mode(dev->scl_pin, GPIO_AF_OUTPUT_OD); /* I2C1 and I2C2 are fed from APB1, clocked at 36MHz */ i2c_set_input_clk(dev, I2C_CLK); diff --git a/STM32F4/cores/maple/libmaple/i2c.h b/STM32F4/cores/maple/libmaple/i2c.h index 4c60ad713..28819a35b 100644 --- a/STM32F4/cores/maple/libmaple/i2c.h +++ b/STM32F4/cores/maple/libmaple/i2c.h @@ -78,7 +78,7 @@ typedef struct i2c_msg { */ typedef struct i2c_dev { i2c_reg_map *regs; /**< Register map */ - gpio_dev *gpio_port; /**< SDA, SCL pins' GPIO port */ + //gpio_dev *gpio_port; /**< SDA, SCL pins' GPIO port */ uint8 sda_pin; /**< SDA bit on gpio_port */ uint8 scl_pin; /**< SCL bit on gpio_port */ rcc_clk_id clk_id; /**< RCC clock information */ diff --git a/STM32F4/cores/maple/libmaple/libmaple_types.h b/STM32F4/cores/maple/libmaple/libmaple_types.h index e20e3274f..d2e8673a1 100644 --- a/STM32F4/cores/maple/libmaple/libmaple_types.h +++ b/STM32F4/cores/maple/libmaple/libmaple_types.h @@ -33,6 +33,9 @@ #ifndef _LIBMAPLE_TYPES_H_ #define _LIBMAPLE_TYPES_H_ +#include +#include + typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; diff --git a/STM32F4/cores/maple/libmaple/rccF4.c b/STM32F4/cores/maple/libmaple/rccF4.c index dd2ea2648..c4ff30dc4 100644 --- a/STM32F4/cores/maple/libmaple/rccF4.c +++ b/STM32F4/cores/maple/libmaple/rccF4.c @@ -166,7 +166,6 @@ typedef struct #define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) #define RESET 0 -typedef uint32 uint32_t; void InitMCO1() { @@ -175,8 +174,8 @@ void InitMCO1() RCC->CFGR &= RCC_CFGR_MCO1_RESET_MASK; RCC->CFGR |= RCC_CFGR_MCO1Source_HSE | RCC_CFGR_MCO1Div_1; // PA8 Output the Master Clock MCO1 - gpio_set_af_mode(GPIOA, 8, 0); - gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_af_mode(PA8, 0); + gpio_set_mode(PA8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); } diff --git a/STM32F4/cores/maple/libmaple/spi.h b/STM32F4/cores/maple/libmaple/spi.h index 88739c584..043635289 100644 --- a/STM32F4/cores/maple/libmaple/spi.h +++ b/STM32F4/cores/maple/libmaple/spi.h @@ -230,14 +230,10 @@ struct gpio_dev; */ extern void spi_config_gpios(spi_dev *dev, uint8 as_master, - struct gpio_dev *nss_dev, - uint8 nss_bit, - struct gpio_dev *sck_dev, - uint8 sck_bit, - struct gpio_dev *miso_dev, - uint8 miso_bit, - struct gpio_dev *mosi_dev, - uint8 mosi_bit); + uint8 nss_pin, + uint8 sck_pin, + uint8 miso_pin, + uint8 mosi_pin); /** * @brief SPI mode configuration. diff --git a/STM32F4/cores/maple/libmaple/spiF4.h b/STM32F4/cores/maple/libmaple/spiF4.h index 3f5116442..d2ae557fe 100644 --- a/STM32F4/cores/maple/libmaple/spiF4.h +++ b/STM32F4/cores/maple/libmaple/spiF4.h @@ -62,17 +62,6 @@ extern struct spi_dev *SPI2; extern struct spi_dev *SPI3; #endif -/* - * Routines - */ - -/* spi_gpio_cfg(): Backwards compatibility shim to spi_config_gpios() */ -struct gpio_dev; -extern void spi_config_gpios(struct spi_dev*, uint8, - struct gpio_dev*, uint8, - struct gpio_dev*, uint8, - struct gpio_dev*, uint8, - struct gpio_dev*, uint8); #ifdef __cplusplus } diff --git a/STM32F4/cores/maple/libmaple/spi_f4.c b/STM32F4/cores/maple/libmaple/spi_f4.c index b9beb68d2..43f5092c6 100644 --- a/STM32F4/cores/maple/libmaple/spi_f4.c +++ b/STM32F4/cores/maple/libmaple/spi_f4.c @@ -56,25 +56,21 @@ spi_dev *SPI3 = &spi3; void spi_config_gpios(spi_dev *ignored, uint8 as_master, - gpio_dev *nss_dev, - uint8 nss_bit, - gpio_dev *sck_dev, - uint8 sck_bit, - gpio_dev *miso_dev, - uint8 miso_bit, - gpio_dev *mosi_dev, - uint8 mosi_bit) { + uint8 nss_pin, + uint8 sck_pin, + uint8 miso_pin, + uint8 mosi_pin) { if (as_master) { // gpio_set_mode(nss_dev, nss_bit, GPIO_AF_OUTPUT_PP); - gpio_set_mode(sck_dev, sck_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(sck_pin, GPIO_AF_OUTPUT_PP); // gpio_set_mode(comm_dev, miso_bit, GPIO_INPUT_FLOATING); - gpio_set_mode(miso_dev, miso_bit, GPIO_AF_INPUT_PD); - gpio_set_mode(mosi_dev, mosi_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(miso_pin, GPIO_AF_INPUT_PD); + gpio_set_mode(mosi_pin, GPIO_AF_OUTPUT_PP); } else { - gpio_set_mode(nss_dev, nss_bit, GPIO_INPUT_FLOATING); - gpio_set_mode(sck_dev, sck_bit, GPIO_INPUT_FLOATING); - gpio_set_mode(miso_dev, miso_bit, GPIO_AF_OUTPUT_PP); - gpio_set_mode(mosi_dev, mosi_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(nss_pin, GPIO_INPUT_FLOATING); + gpio_set_mode(sck_pin, GPIO_INPUT_FLOATING); + gpio_set_mode(miso_pin, GPIO_AF_OUTPUT_PP); + gpio_set_mode(mosi_pin, GPIO_INPUT_FLOATING); } } diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c index df23ccbd7..c402bbdfe 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c @@ -97,10 +97,10 @@ void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) { // ala42 #define GPIO_AF_OTG1_FS ((uint8_t)0xA) /* OTG_FS Alternate Function mapping */ - gpio_set_mode(GPIOA,11,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); - gpio_set_mode(GPIOA,12,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); - gpio_set_af_mode(GPIOA,11,GPIO_AF_OTG1_FS) ; // OTG_FS_DM - gpio_set_af_mode(GPIOA,12,GPIO_AF_OTG1_FS) ; // OTG_FS_DP + gpio_set_mode(BOARD_USB_DM_PIN,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_mode(BOARD_USB_DP_PIN,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_af_mode(BOARD_USB_DM_PIN,GPIO_AF_OTG1_FS) ; // OTG_FS_DM + gpio_set_af_mode(BOARD_USB_DP_PIN,GPIO_AF_OTG1_FS) ; // OTG_FS_DP #ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED gpio_set_mode(GPIOA, 8,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); gpio_set_af_mode(GPIOA, 8,GPIO_AF_OTG1_FS) ; // OTG_FS_SOF @@ -122,10 +122,10 @@ void USB_OTG_BSP_DeInit(USB_OTG_CORE_HANDLE *pdev) { // ala42 #define GPIO_AF0 ((uint8_t)0) /* OTG_FS Alternate Function mapping */ - gpio_set_mode(GPIOA,11, GPIO_MODE_INPUT); - gpio_set_mode(GPIOA,12, GPIO_MODE_INPUT); - gpio_set_af_mode(GPIOA,11,GPIO_AF0) ; // OTG_FS_DM - gpio_set_af_mode(GPIOA,12,GPIO_AF0) ; // OTG_FS_DP + gpio_set_mode(BOARD_USB_DM_PIN, GPIO_MODE_INPUT); + gpio_set_mode(BOARD_USB_DP_PIN, GPIO_MODE_INPUT); + gpio_set_af_mode(BOARD_USB_DM_PIN,GPIO_AF0) ; // OTG_FS_DM + gpio_set_af_mode(BOARD_USB_DP_PIN,GPIO_AF0) ; // OTG_FS_DP #ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED gpio_set_mode(GPIOA, 8,GPIO_MODE_INPUT); gpio_set_af_mode(GPIOA, 8,GPIO_AF0) ; // OTG_FS_SOF diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.c b/STM32F4/cores/maple/libmaple/usbF4/usb.c index c013f04de..49ddc062f 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.c +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.c @@ -5,23 +5,22 @@ #include #include #include +#include USB_OTG_CORE_HANDLE USB_OTG_dev; -void setupUSB (void) { - #define USB_DISC_DEV GPIOA - #define USB_DISC_PIN 12 - - gpio_set_mode(USB_DISC_DEV, USB_DISC_PIN, GPIO_OUTPUT_OD); // ala42 +void setupUSB (void) +{ + gpio_set_mode(BOARD_USB_DP_PIN, GPIO_OUTPUT_OD); // ala42 #ifdef USB_DISC_OD //gpio_set_mode(USB_DISC_DEV, USB_DISC_PIN, GPIO_OUTPUT_OD); // ala42 #else //gpio_set_mode(USB_DISC_DEV, USB_DISC_PIN, GPIO_OUTPUT_PP); // ala42 for active pull-up on disconnect pin #endif - gpio_write_bit(USB_DISC_DEV, USB_DISC_PIN,0); // ala42 + gpio_clear_pin(BOARD_USB_DP_PIN); // ala42 delay_us(200000); /* setup the apb1 clock for USB */ @@ -29,7 +28,7 @@ void setupUSB (void) { //pRCC->APB1ENR |= RCC_APB1ENR_USBEN; /* initialize the usb application */ - gpio_write_bit(USB_DISC_DEV, USB_DISC_PIN, 1); // ala42 // presents us to the host + gpio_set_pin(BOARD_USB_DP_PIN); // ala42 // presents us to the host USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, diff --git a/STM32F4/cores/maple/libmaple/util.c b/STM32F4/cores/maple/libmaple/util.c index 8c03e1865..8a745e87d 100644 --- a/STM32F4/cores/maple/libmaple/util.c +++ b/STM32F4/cores/maple/libmaple/util.c @@ -128,7 +128,7 @@ void throb(void) { uint32 TOP_CNT = 0x0800; uint32 i = 0; - gpio_set_mode(ERROR_LED_PORT, ERROR_LED_PIN, GPIO_OUTPUT_PP); + gpio_set_mode(ERROR_LED_PIN, GPIO_OUTPUT_PP); /* Error fade. */ while (1) { if (CC == TOP_CNT) { @@ -143,9 +143,9 @@ void throb(void) { } if (i < CC) { - gpio_write_bit(ERROR_LED_PORT, ERROR_LED_PIN, 1); + gpio_set_pin(ERROR_LED_PIN); } else { - gpio_write_bit(ERROR_LED_PORT, ERROR_LED_PIN, 0); + gpio_clear_pin(ERROR_LED_PIN); } i++; } diff --git a/STM32F4/cores/maple/usb_serial.cpp b/STM32F4/cores/maple/usb_serial.cpp index cc726c2e2..cfeb382ea 100644 --- a/STM32F4/cores/maple/usb_serial.cpp +++ b/STM32F4/cores/maple/usb_serial.cpp @@ -33,6 +33,8 @@ #include "wirish.h" #include "usb.h" +#ifdef SERIAL_USB + #define USB_TIMEOUT 50 USBSerial::USBSerial(void) { @@ -153,3 +155,5 @@ void USBSerial::disableBlockingTx(void) { } USBSerial SerialUSB; + +#endif diff --git a/STM32F4/cores/maple/usb_serial.h b/STM32F4/cores/maple/usb_serial.h index a551e9d4b..301dc4baf 100644 --- a/STM32F4/cores/maple/usb_serial.h +++ b/STM32F4/cores/maple/usb_serial.h @@ -33,6 +33,8 @@ #include "Stream.h" +#ifdef SERIAL_USB + /** * @brief Virtual serial terminal. */ @@ -68,3 +70,6 @@ extern USBSerial SerialUSB; #endif + +#endif + diff --git a/STM32F4/cores/maple/wirish.h b/STM32F4/cores/maple/wirish.h index a9068e7a7..7e94fb3a7 100644 --- a/STM32F4/cores/maple/wirish.h +++ b/STM32F4/cores/maple/wirish.h @@ -54,8 +54,8 @@ #define HIGH 0x1 #define LOW 0x0 -#define true 0x1 -#define false 0x0 +//#define true 0x1 +//#define false 0x0 #define lowByte(w) ((w) & 0xFF) diff --git a/STM32F4/cores/maple/wirish_digital.cpp b/STM32F4/cores/maple/wirish_digital.cpp index da180dcb4..4a656199b 100644 --- a/STM32F4/cores/maple/wirish_digital.cpp +++ b/STM32F4/cores/maple/wirish_digital.cpp @@ -72,7 +72,7 @@ void pinMode(uint8 pin, WiringPinMode mode) { return; } - gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, outputMode); + gpio_set_mode(pin, outputMode); if (PIN_MAP[pin].timer_device != NULL) { /* Enable/disable timer channels if we're switching into or @@ -84,29 +84,32 @@ void pinMode(uint8 pin, WiringPinMode mode) { } -uint32 digitalRead(uint8 pin) { +uint32 digitalRead(uint8 pin) +{ if (pin >= BOARD_NR_GPIO_PINS) { return 0; } - return gpio_read_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit) ? + return gpio_read_pin(pin) ? HIGH : LOW; } -void digitalWrite(uint8 pin, uint8 val) { +void digitalWrite(uint8 pin, uint8 val) +{ if (pin >= BOARD_NR_GPIO_PINS) { return; } - gpio_write_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, val); + gpio_write_pin(pin, val); } -void togglePin(uint8 pin) { +void togglePin(uint8 pin) +{ if (pin >= BOARD_NR_GPIO_PINS) { return; } - gpio_toggle_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit); + gpio_toggle_pin(pin); } #define BUTTON_DEBOUNCE_DELAY 1 diff --git a/STM32F4/cores/maple/wirish_types.h b/STM32F4/cores/maple/wirish_types.h index 55364ab45..95e524fee 100644 --- a/STM32F4/cores/maple/wirish_types.h +++ b/STM32F4/cores/maple/wirish_types.h @@ -30,14 +30,14 @@ * @brief Wirish library type definitions. */ +#ifndef _WIRISH_TYPES_H_ +#define _WIRISH_TYPES_H_ + #include "libmaple_types.h" -#include "gpio.h" +#include "gpio_def.h" #include "timer.h" #include "adc.h" -#ifndef _WIRISH_TYPES_H_ -#define _WIRISH_TYPES_H_ - /** * Invalid stm32_pin_info adc_channel value. * @see stm32_pin_info @@ -73,6 +73,7 @@ typedef struct stm32_pin_info { } stm32_pin_info; #endif + /** * Variable attribute, instructs the linker to place the marked * variable in Flash instead of RAM. */ diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index b32f283dc..5bfa22efe 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -64,7 +64,7 @@ compiler.libs.c.flags=-I{build.core.path} -I{build.core.path}/libmaple -I{build. # --------------------- ## Compile c files -recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" +recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {build.cpu_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" ## Compile c++ files recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {build.cpu_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" diff --git a/STM32F4/variants/generic_f407v/generic_f407v.h b/STM32F4/variants/generic_f407v/generic_f407v.h index 15e93e457..b9f034847 100644 --- a/STM32F4/variants/generic_f407v/generic_f407v.h +++ b/STM32F4/variants/generic_f407v/generic_f407v.h @@ -124,7 +124,7 @@ PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15, #if 0 // not available on LQFP100 package PF0,PF1,PF2,PF3,PF4,PF5,PF6,PF7,PF8,PF9,PF10,PF11,PF12,PF13,PF14,PF15, PG0,PG1,PG2,PG3,PG4,PG5,PG6,PG7,PG8,PG9,PG10,PG11,PG12,PG13,PG14,PG15 -#endif +#endif // not available on LQFP100 package }; #endif diff --git a/STM32F4/variants/generic_f407v/ld/jtag.ld b/STM32F4/variants/generic_f407v/ld/jtag.ld index fe70f68dc..1001db518 100644 --- a/STM32F4/variants/generic_f407v/ld/jtag.ld +++ b/STM32F4/variants/generic_f407v/ld/jtag.ld @@ -5,7 +5,7 @@ MEMORY { - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K } From 1d29d139677eb2b843deee4bea9183dad4c330b6 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Thu, 27 Apr 2017 18:22:18 +0200 Subject: [PATCH 056/307] The ssd1306_128x64_i2c_STM32 example would not build because of a missing swap() macro. --- STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp b/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp index c0c24a048..349203915 100644 --- a/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp +++ b/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp @@ -29,6 +29,10 @@ HardWire HWIRE(2,I2C_FAST_MODE); // I2c2 #include "Adafruit_GFX.h" #include "Adafruit_SSD1306_STM32.h" +#ifndef swap +#define swap(a, b) { int16_t t = a; a = b; b = t; } +#endif + // the memory buffer for the LCD static uint8_t buffer[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8] = { From 9dbcefdec34bb4e1038021dbc2a01ed20c23e509 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Wed, 3 May 2017 18:27:39 +0200 Subject: [PATCH 057/307] bugfix to include external libraries: reworked include paths + moved Arduino.h + updated SPI lib --- STM32F4/cores/maple/Arduino.h | 6 - STM32F4/cores/maple/Client.h | 5 +- STM32F4/cores/maple/HardwareTimer.h | 2 +- STM32F4/cores/maple/IPAddress.h | 4 +- STM32F4/cores/maple/Server.h | 4 +- STM32F4/cores/maple/Stream.h | 4 +- STM32F4/cores/maple/Udp.h | 4 +- STM32F4/cores/maple/WProgram.h | 7 +- STM32F4/cores/maple/WString.h | 7 +- STM32F4/cores/maple/bits.h | 5 + STM32F4/cores/maple/boards.cpp | 14 +- STM32F4/cores/maple/boards.h | 14 +- STM32F4/cores/maple/ext_interrupts.cpp | 4 +- STM32F4/cores/maple/ext_interrupts.h | 9 +- STM32F4/cores/maple/io.h | 4 +- STM32F4/cores/maple/itoa.h | 4 +- STM32F4/cores/maple/libmaple/gpioF4.c | 10 +- STM32F4/cores/maple/libmaple/gpio_def.h | 1 - STM32F4/cores/maple/libmaple/libmaple.h | 3 - STM32F4/cores/maple/libmaple/libmaple_types.h | 2 +- STM32F4/cores/maple/libmaple/spi.c | 39 +- STM32F4/cores/maple/libmaple/spi.h | 6 +- STM32F4/cores/maple/libmaple/spiF4.h | 4 +- .../Class/audio/inc/usbd_audio_core.h | 2 +- .../Class/cdc/inc/usbd_cdc_core.h | 3 +- .../Class/cdc/src/usbd_cdc_core.c | 7 +- .../Core/inc/usbd_core.h | 4 +- .../Core/inc/usbd_def.h | 2 +- .../Core/inc/usbd_req.h | 2 +- .../Core/src/usbd_core.c | 10 +- .../Core/src/usbd_ioreq.c | 2 +- .../Core/src/usbd_req.c | 6 +- .../usbF4/STM32_USB_OTG_Driver/inc/usb_core.h | 2 +- .../STM32_USB_OTG_Driver/inc/usb_defines.h | 2 +- .../usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h | 1 + .../usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h | 4 +- .../usbF4/STM32_USB_OTG_Driver/src/usb_core.c | 4 +- .../usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c | 4 +- .../STM32_USB_OTG_Driver/src/usb_dcd_int.c | 4 +- .../cores/maple/libmaple/usbF4/VCP/core_cm4.h | 2 +- STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c | 2 +- .../cores/maple/libmaple/usbF4/VCP/usb_bsp.c | 6 +- .../maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h | 2 +- .../maple/libmaple/usbF4/VCP/usbd_conf.h | 1 + .../maple/libmaple/usbF4/VCP/usbd_desc.c | 6 +- .../maple/libmaple/usbF4/VCP/usbd_desc.h | 2 +- .../cores/maple/libmaple/usbF4/VCP/usbd_usr.c | 4 +- STM32F4/cores/maple/libmaple/usbF4/usb.c | 20 +- STM32F4/cores/maple/libmaple/usbF4/usb.h | 2 +- STM32F4/cores/maple/libmaple/util.h | 5 +- STM32F4/cores/maple/pwm.cpp | 4 +- STM32F4/cores/maple/wirish.h | 13 +- STM32F4/cores/maple/wirish_constants.h | 4 +- STM32F4/cores/maple/wirish_debug.h | 7 +- STM32F4/cores/maple/wirish_math.h | 4 +- STM32F4/cores/maple/wirish_time.cpp | 6 +- STM32F4/cores/maple/wirish_time.h | 5 +- STM32F4/cores/maple/wirish_types.h | 7 +- STM32F4/libraries/SPI/library.properties | 1 + STM32F4/libraries/SPI/src/SPI.cpp | 452 +++++++++--------- STM32F4/libraries/SPI/src/SPI.h | 138 ++++-- STM32F4/platform.txt | 12 +- STM32F4/system/libmaple/Arduino.h | 46 ++ .../variants/generic_f407v/generic_f407v.cpp | 37 +- .../variants/generic_f407v/generic_f407v.h | 41 +- 65 files changed, 578 insertions(+), 472 deletions(-) delete mode 100644 STM32F4/cores/maple/Arduino.h create mode 100644 STM32F4/system/libmaple/Arduino.h diff --git a/STM32F4/cores/maple/Arduino.h b/STM32F4/cores/maple/Arduino.h deleted file mode 100644 index d02a50cba..000000000 --- a/STM32F4/cores/maple/Arduino.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef Arduino_h -#define Arduino_h -#include "WProgram.h" -#endif - -#include "variant.h" diff --git a/STM32F4/cores/maple/Client.h b/STM32F4/cores/maple/Client.h index b8e5d935f..57bedb8e0 100644 --- a/STM32F4/cores/maple/Client.h +++ b/STM32F4/cores/maple/Client.h @@ -17,8 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef client_h -#define client_h +#ifndef _CLIENT_H_ +#define _CLIENT_H_ + #include "Print.h" #include "Stream.h" #include "IPAddress.h" diff --git a/STM32F4/cores/maple/HardwareTimer.h b/STM32F4/cores/maple/HardwareTimer.h index 89e356499..c90356bf6 100644 --- a/STM32F4/cores/maple/HardwareTimer.h +++ b/STM32F4/cores/maple/HardwareTimer.h @@ -33,7 +33,7 @@ // TODO [0.1.0] Remove deprecated pieces, pick a better API -#include "timer.h" +#include /** Timer mode. */ typedef timer_mode TimerMode; diff --git a/STM32F4/cores/maple/IPAddress.h b/STM32F4/cores/maple/IPAddress.h index 271b24025..c6e06972a 100644 --- a/STM32F4/cores/maple/IPAddress.h +++ b/STM32F4/cores/maple/IPAddress.h @@ -17,8 +17,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef IPAddress_h -#define IPAddress_h +#ifndef _IPAddress_h_ +#define _IPAddress_h_ #include #include diff --git a/STM32F4/cores/maple/Server.h b/STM32F4/cores/maple/Server.h index 69e3e39fe..4a95c9f51 100644 --- a/STM32F4/cores/maple/Server.h +++ b/STM32F4/cores/maple/Server.h @@ -17,8 +17,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef server_h -#define server_h +#ifndef _SERVER_H_ +#define _SERVER_H_ #include "Print.h" diff --git a/STM32F4/cores/maple/Stream.h b/STM32F4/cores/maple/Stream.h index abdcd1768..870fbf0e5 100644 --- a/STM32F4/cores/maple/Stream.h +++ b/STM32F4/cores/maple/Stream.h @@ -19,8 +19,8 @@ parsing functions based on TextFinder library by Michael Margolis */ -#ifndef Stream_h -#define Stream_h +#ifndef _STREAM_H_ +#define _STREAM_H_ #include #include "Print.h" diff --git a/STM32F4/cores/maple/Udp.h b/STM32F4/cores/maple/Udp.h index dc5644b9d..1652cafc9 100644 --- a/STM32F4/cores/maple/Udp.h +++ b/STM32F4/cores/maple/Udp.h @@ -32,8 +32,8 @@ * bjoern@cs.stanford.edu 12/30/2008 */ -#ifndef udp_h -#define udp_h +#ifndef _UDP_H_ +#define _UDP_H_ #include #include diff --git a/STM32F4/cores/maple/WProgram.h b/STM32F4/cores/maple/WProgram.h index 2949a0a59..82b759a64 100644 --- a/STM32F4/cores/maple/WProgram.h +++ b/STM32F4/cores/maple/WProgram.h @@ -24,7 +24,12 @@ * SOFTWARE. *****************************************************************************/ -#include "wirish.h" +#ifndef _WPROGRAM_H_ +#define _WPROGRAM_H_ + +#include void setup(); void loop(); + +#endif \ No newline at end of file diff --git a/STM32F4/cores/maple/WString.h b/STM32F4/cores/maple/WString.h index 903857809..ec0eae7fb 100644 --- a/STM32F4/cores/maple/WString.h +++ b/STM32F4/cores/maple/WString.h @@ -19,8 +19,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef String_class_h -#define String_class_h +#ifndef _WSTRING_H_ +#define _WSTRING_H_ + #ifdef __cplusplus #include @@ -225,4 +226,4 @@ class StringSumHelper : public String }; #endif // __cplusplus -#endif // String_class_h +#endif // _WSTRING_H_ diff --git a/STM32F4/cores/maple/bits.h b/STM32F4/cores/maple/bits.h index 3e755b7f4..3e3eff1ec 100644 --- a/STM32F4/cores/maple/bits.h +++ b/STM32F4/cores/maple/bits.h @@ -27,4 +27,9 @@ /* Note: Use of this header file is deprecated. Use bit_constants.h instead. */ +#ifndef _BITS_H_ +#define _BITS_H_ + #include "bit_constants.h" + +#endif diff --git a/STM32F4/cores/maple/boards.cpp b/STM32F4/cores/maple/boards.cpp index fc453fece..0d55e9414 100644 --- a/STM32F4/cores/maple/boards.cpp +++ b/STM32F4/cores/maple/boards.cpp @@ -33,13 +33,13 @@ */ #include "boards.h" -#include "flash.h" -#include "rcc.h" -#include "nvic.h" -#include "systick.h" -#include "gpio.h" -#include "adc.h" -#include "timer.h" +#include +#include +#include +#include +#include +#include +#include #include "usb.h" #include "usb_serial.h" diff --git a/STM32F4/cores/maple/boards.h b/STM32F4/cores/maple/boards.h index 50fd89d38..d37bff4a5 100644 --- a/STM32F4/cores/maple/boards.h +++ b/STM32F4/cores/maple/boards.h @@ -39,10 +39,8 @@ #ifndef _BOARDS_H_ #define _BOARDS_H_ -#include "libmaple.h" -#include "timer.h" - -#include "wirish_types.h" +#include +#include /* Set of all possible pin names; not all boards have all these (note * that we use the Dx convention since all of the Maple's pins are @@ -151,4 +149,12 @@ extern bool boardUsesPin(uint8 pin); #define CLOCK_SPEED_MHZ CYCLES_PER_MICROSECOND #define CLOCK_SPEED_HZ (CLOCK_SPEED_MHZ * 1000000UL) +#ifndef SYSTICK_RELOAD_VAL +#define SYSTICK_RELOAD_VAL (1000 * CYCLES_PER_MICROSECOND - 1) +#endif + +#ifndef BOARD_BUTTON_PRESSED_LEVEL +#define BOARD_BUTTON_PRESSED_LEVEL HIGH +#endif + #endif diff --git a/STM32F4/cores/maple/ext_interrupts.cpp b/STM32F4/cores/maple/ext_interrupts.cpp index f014f1300..9e985485a 100644 --- a/STM32F4/cores/maple/ext_interrupts.cpp +++ b/STM32F4/cores/maple/ext_interrupts.cpp @@ -31,8 +31,8 @@ */ #include "boards.h" -#include "gpio.h" -#include "exti.h" +#include +#include #include "ext_interrupts.h" static inline exti_trigger_mode exti_out_mode(ExtIntTriggerMode mode); diff --git a/STM32F4/cores/maple/ext_interrupts.h b/STM32F4/cores/maple/ext_interrupts.h index b5c6f983b..fe215dceb 100644 --- a/STM32F4/cores/maple/ext_interrupts.h +++ b/STM32F4/cores/maple/ext_interrupts.h @@ -24,8 +24,8 @@ * SOFTWARE. *****************************************************************************/ -#include "libmaple_types.h" -#include "nvic.h" +#ifndef _EXT_INTERRUPTS_H_ +#define _EXT_INTERRUPTS_H_ /** * @file ext_interrupts.h @@ -33,8 +33,9 @@ * @brief Wiring-like external interrupt prototypes and types. */ -#ifndef _EXT_INTERRUPTS_H_ -#define _EXT_INTERRUPTS_H_ +#include +#include + /** * The kind of transition on an external pin which should trigger an diff --git a/STM32F4/cores/maple/io.h b/STM32F4/cores/maple/io.h index 1208be63f..aeaf0fd3a 100644 --- a/STM32F4/cores/maple/io.h +++ b/STM32F4/cores/maple/io.h @@ -34,8 +34,8 @@ #define _IO_H_ #include -#include "gpio.h" -#include "adc.h" +#include +#include #include "wirish_time.h" diff --git a/STM32F4/cores/maple/itoa.h b/STM32F4/cores/maple/itoa.h index 59af10947..09e8b2f8e 100644 --- a/STM32F4/cores/maple/itoa.h +++ b/STM32F4/cores/maple/itoa.h @@ -16,8 +16,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _ITOA_ -#define _ITOA_ +#ifndef _ITOA_H_ +#define _ITOA_H_ #ifdef __cplusplus extern "C"{ diff --git a/STM32F4/cores/maple/libmaple/gpioF4.c b/STM32F4/cores/maple/libmaple/gpioF4.c index 0792e121d..6fec61caa 100644 --- a/STM32F4/cores/maple/libmaple/gpioF4.c +++ b/STM32F4/cores/maple/libmaple/gpioF4.c @@ -159,10 +159,10 @@ void gpio_set_mode(uint8_t io_pin, gpio_pin_mode mode) { //regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 8) & 15) << (4*(pin&7))); //gpio_set_af_mode(dev, pin, mode>>8); - regs->MODER = (regs->MODER & ~( 3 << (2*pin))) | (((mode >> 0) & 3) << (2*pin)); - regs->PUPDR = (regs->PUPDR & ~( 3 << (2*pin))) | (((mode >> 2) & 3) << (2*pin)); - regs->OSPEEDR = (regs->OSPEEDR & ~( 3 << (2*pin))) | (((mode >> 4) & 3) << (2*pin)); - regs->OTYPER = (regs->OTYPER & ~( 1 << (1*pin))) | (((mode >> 6) & 1) << (1*pin)); + regs->MODER = (regs->MODER & ~( 3 << (pin<<1))) | (((mode >> 0) & 3) << (pin<<1)); + regs->PUPDR = (regs->PUPDR & ~( 3 << (pin<<1))) | (((mode >> 2) & 3) << (pin<<1)); + regs->OSPEEDR = (regs->OSPEEDR & ~( 3 << (pin<<1))) | (((mode >> 4) & 3) << (pin<<1)); + regs->OTYPER = (regs->OTYPER & ~( 1 << (pin<<1))) | (((mode >> 6) & 1) << (pin<<1)); } /** @@ -177,7 +177,7 @@ void gpio_set_af_mode(uint8_t io_pin, int mode) { gpio_reg_map *regs = (PIN_MAP[io_pin].gpio_device)->regs; uint8_t pin = PIN_MAP[io_pin].gpio_bit; - regs->AFR[pin>>3] = (regs->AFR[pin>>3] & ~(15 << (4*(pin&7)))) | (((mode >> 0) & 15) << (4*(pin&7))); + regs->AFR[pin>>3] = (regs->AFR[pin>>3] & ~(15 << ((pin&7)<<2))) | (((mode >> 0) & 15) << ((pin&7)<<2)); } /* diff --git a/STM32F4/cores/maple/libmaple/gpio_def.h b/STM32F4/cores/maple/libmaple/gpio_def.h index 8b9e693ea..e2176eacb 100644 --- a/STM32F4/cores/maple/libmaple/gpio_def.h +++ b/STM32F4/cores/maple/libmaple/gpio_def.h @@ -36,7 +36,6 @@ #include "libmaple.h" #include "rcc.h" -#include "wirish_types.h" #ifdef __cplusplus extern "C"{ diff --git a/STM32F4/cores/maple/libmaple/libmaple.h b/STM32F4/cores/maple/libmaple/libmaple.h index 20a57bc6f..8360ba390 100644 --- a/STM32F4/cores/maple/libmaple/libmaple.h +++ b/STM32F4/cores/maple/libmaple/libmaple.h @@ -32,10 +32,7 @@ #ifndef _LIBMAPLE_H_ #define _LIBMAPLE_H_ -#include "libmaple_types.h" -#include "stm32.h" #include "util.h" -#include "delay.h" /* * Where to put usercode, based on space reserved for bootloader. diff --git a/STM32F4/cores/maple/libmaple/libmaple_types.h b/STM32F4/cores/maple/libmaple/libmaple_types.h index d2e8673a1..8e765b435 100644 --- a/STM32F4/cores/maple/libmaple/libmaple_types.h +++ b/STM32F4/cores/maple/libmaple/libmaple_types.h @@ -34,7 +34,6 @@ #define _LIBMAPLE_TYPES_H_ #include -#include typedef unsigned char uint8; typedef unsigned short uint16; @@ -49,6 +48,7 @@ typedef long long int64; typedef void (*voidFuncPtr)(void); #define __io volatile +#define __IO volatile #ifndef __attr_flash #define __attr_flash __attribute__((section (".USER_FLASH"))) #endif diff --git a/STM32F4/cores/maple/libmaple/spi.c b/STM32F4/cores/maple/libmaple/spi.c index 194a82efe..4b274cb37 100644 --- a/STM32F4/cores/maple/libmaple/spi.c +++ b/STM32F4/cores/maple/libmaple/spi.c @@ -83,25 +83,29 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags) { } /** - * @brief Nonblocking SPI transmit. + * @brief Blocking SPI transmit. * @param dev SPI port to use for transmission * @param buf Buffer to transmit. The sizeof buf's elements are * inferred from dev's data frame format (i.e., are * correctly treated as 8-bit or 16-bit quantities). * @param len Maximum number of elements to transmit. - * @return Number of elements transmitted. */ -uint32 spi_tx(spi_dev *dev, const void *buf, uint32 len) { - uint32 txed = 0; - uint8 byte_frame = spi_dff(dev) == SPI_DFF_8_BIT; - while (spi_is_tx_empty(dev) && (txed < len)) { - if (byte_frame) { - dev->regs->DR = ((const uint8*)buf)[txed++]; - } else { - dev->regs->DR = ((const uint16*)buf)[txed++]; - } - } - return txed; +void spi_tx(spi_dev *dev, void *buf, uint32 len) +{ + spi_reg_map *regs = dev->regs; + if ( spi_dff(dev) == SPI_DFF_8_BIT ) { + uint8 * dp8 = (uint8*)buf; + while ( len-- ) { + while ( (regs->SR & SPI_SR_TXE)==0 ) ; //while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty + regs->DR = *dp8++; + } + } else { + uint16 * dp16 = (uint16*)buf; + while ( len-- ) { + while ( (regs->SR & SPI_SR_TXE)==0 ) ; //while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty + regs->DR = *dp16++; + } + } } /** @@ -157,8 +161,9 @@ void spi_rx_dma_disable(spi_dev *dev) { */ static void spi_reconfigure(spi_dev *dev, uint32 cr1_config) { - spi_irq_disable(dev, SPI_INTERRUPTS_ALL); - spi_peripheral_disable(dev); - dev->regs->CR1 = cr1_config; - spi_peripheral_enable(dev); +#define MASK (SPI_CR1_CRCEN|SPI_CR1_DFF) + spi_irq_disable(dev, SPI_INTERRUPTS_ALL); + if ( (dev->regs->CR1&MASK)!=(cr1_config&MASK) ) spi_peripheral_disable(dev); + dev->regs->CR1 = cr1_config; + spi_peripheral_enable(dev); } diff --git a/STM32F4/cores/maple/libmaple/spi.h b/STM32F4/cores/maple/libmaple/spi.h index 043635289..f96b462b5 100644 --- a/STM32F4/cores/maple/libmaple/spi.h +++ b/STM32F4/cores/maple/libmaple/spi.h @@ -219,13 +219,9 @@ struct gpio_dev; * * @param dev SPI device * @param as_master If true, configure as bus master; otherwise, as slave. - * @param nss_dev NSS pin's GPIO device * @param nss_bit NSS pin's GPIO bit on nss_dev - * @param sck_dev SCK pin's GPIO device * @param sck_bit SCK pin's GPIO bit on comm_dev - * @param miso_dev MISO pin's GPIO device * @param miso_bit MISO pin's GPIO bit on comm_dev - * @param mosi_dev MOSI pin's GPIO device * @param mosi_bit MOSI pin's GPIO bit on comm_dev */ extern void spi_config_gpios(spi_dev *dev, @@ -308,7 +304,7 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags); -uint32 spi_tx(spi_dev *dev, const void *buf, uint32 len); +void spi_tx(spi_dev *dev, void *buf, uint32 len); /** * @brief Call a function on each SPI port diff --git a/STM32F4/cores/maple/libmaple/spiF4.h b/STM32F4/cores/maple/libmaple/spiF4.h index d2ae557fe..cbdc91a73 100644 --- a/STM32F4/cores/maple/libmaple/spiF4.h +++ b/STM32F4/cores/maple/libmaple/spiF4.h @@ -31,8 +31,8 @@ * @brief STM32F1 SPI/I2S series header. */ -#ifndef _LIBMAPLE_STM32F1_SPI_H_ -#define _LIBMAPLE_STM32F1_SPI_H_ +#ifndef _LIBMAPLE_SPI_F4_H_ +#define _LIBMAPLE_SPI_F4_H_ #include diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h index f58ff0601..7ac987dcb 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h @@ -26,7 +26,7 @@ #include "usbd_ioreq.h" #include "usbd_req.h" -#include "usbd_desc.h" +#include diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h index 926f42e13..b1c8cc117 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h @@ -24,7 +24,8 @@ #ifndef __USB_CDC_CORE_H_ #define __USB_CDC_CORE_H_ -#include "usbd_ioreq.h" +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c index aac6776cd..8f97c5176 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c @@ -58,9 +58,10 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_core.h" -#include "usbd_desc.h" -#include "usbd_req.h" +#include +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h index b876856a3..063a30e69 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h @@ -24,9 +24,9 @@ #define __USBD_CORE_H /* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" +#include #include "usbd_def.h" -#include "usbd_conf.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h index a8c86710d..f2a31153a 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h @@ -24,7 +24,7 @@ #ifndef __USBD_DEF_H #define __USBD_DEF_H /* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h index 9aa9e44a3..f9849c6f9 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h @@ -27,7 +27,7 @@ /* Includes ------------------------------------------------------------------*/ #include "usbd_def.h" #include "usbd_core.h" -#include "usbd_conf.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c index af758427d..00bb25140 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c @@ -20,11 +20,11 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usbd_req.h" -#include "usbd_ioreq.h" -#include "usb_dcd_int.h" -#include "usb_bsp.h" +#include +#include +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c index 6964766bd..20ee5a0f1 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c @@ -20,7 +20,7 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c index f08d26c6c..5fc2e036c 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c @@ -20,9 +20,9 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" -#include "usbd_ioreq.h" -#include "usbd_desc.h" +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h index 82a09e15c..43c478126 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h @@ -24,7 +24,7 @@ #define __USB_CORE_H__ /* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" +#include #include "usb_regs.h" #include "usb_defines.h" diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h index 8c23d72d9..ee2c1a009 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h @@ -24,7 +24,7 @@ #define __USB_DEF_H__ /* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" +#include /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h index 54d61b827..1347f315d 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h @@ -23,6 +23,7 @@ #ifndef __USB_OTG__ #define __USB_OTG__ +#include "usb_core.h" /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h index cd71ddfaf..99f844e58 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h @@ -24,8 +24,8 @@ #define __USB_OTG_REGS_H__ /* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" - +#include +#include /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c index cb9eabc8c..1687afa7c 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_bsp.h" -#include "usb_core.h" +#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c index c3336cb84..dc9e53839 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" -#include "usb_bsp.h" +#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c index 3a49ede25..f9e561f14 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c @@ -20,12 +20,12 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_dcd_int.h" +#include typedef int IRQn_Type; #define __NVIC_PRIO_BITS 4 #define __Vendor_SysTickConfig 1 -#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h index 443665c70..ff5e9a6d4 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h @@ -141,7 +141,7 @@ #endif #include /*!< standard types definitions */ -#include /*!< Core Instruction Access */ +#include "core_cmInstr.h" /*!< Core Instruction Access */ //#include /*!< Core Function Access */ //#include /*!< Compiler specific SIMD Intrinsics */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c index 9f33150cf..15a715e87 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c @@ -80,7 +80,7 @@ typedef unsigned char u8; typedef int IRQn_Type; #define __NVIC_PRIO_BITS 4 #define __Vendor_SysTickConfig 1 -#include +#include "core_cm4.h" /** @addtogroup STM32F4xx_StdPeriph_Driver * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c index c402bbdfe..e794cb144 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c @@ -21,13 +21,13 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_bsp.h" +#include #include "usbd_conf.h" -#include +#include typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; #define OTG_FS_IRQn 67 //typedef unsigned char uint8_t; -#include +#include "misc.h" //#include "stm32f4_discovery.h" diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h index 67475e7a4..8398dbdbb 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h @@ -26,7 +26,7 @@ /* Includes ------------------------------------------------------------------*/ //#include "stm32f4xx.h" -#include "usbd_cdc_core.h" +#include #include "usbd_conf.h" diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h index 516a2fbb3..62a40c27c 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h @@ -25,6 +25,7 @@ /* Includes ------------------------------------------------------------------*/ //#include "stm32f4_discovery.h" +#include "usb_conf.h" /** @defgroup USB_CONF_Exported_Defines * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c index 537f2665c..0153858fc 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c @@ -20,11 +20,11 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" +#include #include "usbd_desc.h" -#include "usbd_req.h" +#include #include "usbd_conf.h" -#include "usb_regs.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h index ed999dc62..4ae998cee 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h @@ -25,7 +25,7 @@ #define __USB_DESC_H /* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c index 84e8d6a54..a16ce40c5 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_usr.h" -#include "usbd_ioreq.h" +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.c b/STM32F4/cores/maple/libmaple/usbF4/usb.c index 49ddc062f..385071982 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.c +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.c @@ -1,10 +1,14 @@ -#include "usbd_cdc_core.h" -#include "usbd_usr.h" -#include "usbd_desc.h" +#ifndef _USBF4_USB_H_ +#define _USBF4_USB_H_ + + +#include +#include +#include #include "usb.h" -#include -#include -#include +#include +#include +#include #include USB_OTG_CORE_HANDLE USB_OTG_dev; @@ -92,7 +96,7 @@ RESULT usbPowerOff(void) { void usbDsbISR(void) {}; -#include "usb_dcd_int.h" +#include void __irq_OTG_FS_IRQHandler(void) { USBD_OTG_ISR_Handler (&USB_OTG_dev); @@ -101,3 +105,5 @@ void __irq_OTG_FS_IRQHandler(void) void x__irq_usbwakeup(void) { } + +#endif diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.h b/STM32F4/cores/maple/libmaple/usbF4/usb.h index f09f2bd0c..ce1a5585f 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.h +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.h @@ -5,7 +5,7 @@ extern "C" { #endif -#include "usb_conf.h" +#include typedef enum _RESULT { diff --git a/STM32F4/cores/maple/libmaple/util.h b/STM32F4/cores/maple/libmaple/util.h index 62ad8af37..c5ed2de07 100644 --- a/STM32F4/cores/maple/libmaple/util.h +++ b/STM32F4/cores/maple/libmaple/util.h @@ -29,11 +29,12 @@ * @brief Miscellaneous utility macros and procedures. */ -#include "libmaple_types.h" - #ifndef _UTIL_H_ #define _UTIL_H_ +#include "libmaple_types.h" +#include "delay.h" + #ifdef __cplusplus extern "C"{ #endif diff --git a/STM32F4/cores/maple/pwm.cpp b/STM32F4/cores/maple/pwm.cpp index 1806348c2..c5f2ccbc6 100644 --- a/STM32F4/cores/maple/pwm.cpp +++ b/STM32F4/cores/maple/pwm.cpp @@ -28,8 +28,8 @@ * @brief Arduino-style PWM implementation. */ -#include "libmaple_types.h" -#include "timer.h" +#include +#include #include "boards.h" #include "pwm.h" diff --git a/STM32F4/cores/maple/wirish.h b/STM32F4/cores/maple/wirish.h index 7e94fb3a7..d9a17bfdd 100644 --- a/STM32F4/cores/maple/wirish.h +++ b/STM32F4/cores/maple/wirish.h @@ -34,9 +34,9 @@ #define _WIRISH_H_ #include -#include "libmaple.h" +#include +#include -#include "wirish_types.h" #include "boards.h" #include "io.h" #include "bits.h" @@ -44,9 +44,8 @@ #include "ext_interrupts.h" #include "wirish_debug.h" #include "wirish_math.h" -#include "wirish_time.h" #include -#include "HardwareSerial.h" +#include #include "HardwareTimer.h" #include "usb_serial.h" @@ -54,8 +53,10 @@ #define HIGH 0x1 #define LOW 0x0 -//#define true 0x1 -//#define false 0x0 +#ifndef true + #define true 0x1 + #define false 0x0 +#endif #define lowByte(w) ((w) & 0xFF) diff --git a/STM32F4/cores/maple/wirish_constants.h b/STM32F4/cores/maple/wirish_constants.h index 06a85ae8c..f39c0777e 100644 --- a/STM32F4/cores/maple/wirish_constants.h +++ b/STM32F4/cores/maple/wirish_constants.h @@ -1,5 +1,5 @@ -#ifndef _WIRING_CONSTANTS_ -#define _WIRING_CONSTANTS_ +#ifndef _WIRISH_CONSTANTS_H_ +#define _WIRISH_CONSTANTS_H_ #ifdef __cplusplus extern "C"{ diff --git a/STM32F4/cores/maple/wirish_debug.h b/STM32F4/cores/maple/wirish_debug.h index d4c0bab4d..d7dea2391 100644 --- a/STM32F4/cores/maple/wirish_debug.h +++ b/STM32F4/cores/maple/wirish_debug.h @@ -24,6 +24,9 @@ * SOFTWARE. *****************************************************************************/ +#ifndef _WIRISH_DEBUG_H_ +#define _WIRISH_DEBUG_H_ + /** * @file wirish_debug.h * @brief High level debug port configuration @@ -50,5 +53,7 @@ static inline void disableDebugPorts(void) { * @see disableDebugPorts() */ static inline void enableDebugPorts(void) { - afio_cfg_debug_ports(AFIO_DEBUG_FULL_SWJ); + afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY); //AFIO_DEBUG_FULL_SWJ); } + +#endif diff --git a/STM32F4/cores/maple/wirish_math.h b/STM32F4/cores/maple/wirish_math.h index a85b30ada..0b8b22260 100644 --- a/STM32F4/cores/maple/wirish_math.h +++ b/STM32F4/cores/maple/wirish_math.h @@ -29,8 +29,8 @@ * @brief Includes ; provides Arduino-compatible math routines. */ -#ifndef _WIRING_MATH_H_ -#define _WIRING_MATH_H_ +#ifndef _WIRISH_MATH_H_ +#define _WIRISH_MATH_H_ #include diff --git a/STM32F4/cores/maple/wirish_time.cpp b/STM32F4/cores/maple/wirish_time.cpp index 270da28ac..654c1a2d2 100644 --- a/STM32F4/cores/maple/wirish_time.cpp +++ b/STM32F4/cores/maple/wirish_time.cpp @@ -28,10 +28,10 @@ * @brief Delay implementation. */ -#include "libmaple.h" -#include "systick.h" +#include +#include #include "wirish_time.h" -#include "delay.h" +#include void delay(unsigned long ms) { uint32 i; diff --git a/STM32F4/cores/maple/wirish_time.h b/STM32F4/cores/maple/wirish_time.h index 20a2fbfc4..3a117863c 100644 --- a/STM32F4/cores/maple/wirish_time.h +++ b/STM32F4/cores/maple/wirish_time.h @@ -32,10 +32,9 @@ #ifndef __WIRISH_TIME_H_ #define __WIRISH_TIME_H_ -#include "libmaple.h" -#include "nvic.h" -#include "systick.h" #include "boards.h" +#include +#include #define US_PER_MS 1000 diff --git a/STM32F4/cores/maple/wirish_types.h b/STM32F4/cores/maple/wirish_types.h index 95e524fee..aea86fbd8 100644 --- a/STM32F4/cores/maple/wirish_types.h +++ b/STM32F4/cores/maple/wirish_types.h @@ -33,10 +33,9 @@ #ifndef _WIRISH_TYPES_H_ #define _WIRISH_TYPES_H_ -#include "libmaple_types.h" -#include "gpio_def.h" -#include "timer.h" -#include "adc.h" +#include +#include +#include /** * Invalid stm32_pin_info adc_channel value. diff --git a/STM32F4/libraries/SPI/library.properties b/STM32F4/libraries/SPI/library.properties index 6f20f0185..ba3a57704 100644 --- a/STM32F4/libraries/SPI/library.properties +++ b/STM32F4/libraries/SPI/library.properties @@ -7,3 +7,4 @@ paragraph=SPI for STM32F4 category=Communication url= architectures=STM32F4 +maintainer= \ No newline at end of file diff --git a/STM32F4/libraries/SPI/src/SPI.cpp b/STM32F4/libraries/SPI/src/SPI.cpp index 08fbbd5d7..baef0abf2 100644 --- a/STM32F4/libraries/SPI/src/SPI.cpp +++ b/STM32F4/libraries/SPI/src/SPI.cpp @@ -40,9 +40,7 @@ #include "wirish.h" #include "boards.h" -//#include "HardwareSerial.h" - -#if CYCLES_PER_MICROSECOND != 72 +#if CYCLES_PER_MICROSECOND != 168 /* TODO [0.2.0?] something smarter than this */ #warning "Unexpected clock speed; SPI frequency calculation will be incorrect" #endif @@ -91,77 +89,105 @@ static const spi_pins board_spi_pins[] __FLASH__ = { */ SPIClass::SPIClass(uint32 spi_num) { + + _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed + + switch (spi_num) { #if BOARD_NR_SPI >= 1 case 1: - this->spi_d = SPI1; + _currentSetting->spi_d = SPI1; break; #endif #if BOARD_NR_SPI >= 2 case 2: - this->spi_d = SPI2; + _currentSetting->spi_d = SPI2; break; #endif #if BOARD_NR_SPI >= 3 case 3: - this->spi_d = SPI3; + _currentSetting->spi_d = SPI3; break; #endif default: ASSERT(0); } - //pinMode(BOARD_SPI_DEFAULT_SS,OUTPUT); - - clockDivider = SPI_BAUD_PCLK_DIV_16; - dataMode = SPI_MODE0; + // Init things specific to each SPI device + // clock divider setup is a bit of hack, and needs to be improved at a later date. + _settings[0].spi_d = SPI1; + _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); +#ifdef SPI_DMA + _settings[0].spiDmaDev = DMA1; + _settings[0].spiTxDmaChannel = DMA_CH3; + _settings[0].spiRxDmaChannel = DMA_CH2; +#endif + _settings[1].spi_d = SPI2; + _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); +#ifdef SPI_DMA + _settings[1].spiDmaDev = DMA1; + _settings[1].spiTxDmaChannel = DMA_CH5; + _settings[1].spiRxDmaChannel = DMA_CH4; +#endif +#if BOARD_NR_SPI >= 3 + _settings[2].spi_d = SPI3; + _settings[2].clockDivider = determine_baud_rate(_settings[2].spi_d, _settings[2].clock); +#ifdef SPI_DMA + _settings[2].spiDmaDev = DMA2; + _settings[2].spiTxDmaChannel = DMA_CH2; + _settings[2].spiRxDmaChannel = DMA_CH1; +#endif +#endif + } /* * Set up/tear down */ - -void SPIClass::begin(void) { - - uint32 flags = ((bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE | SPI_SOFT_SS); - spi_init(spi_d); - configure_gpios(spi_d, 1); +void SPIClass::updateSettings(void) { + uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE | SPI_SOFT_SS); #ifdef SPI_DEBUG - Serial.print("spi_master_enable("); Serial.print(clockDivider); Serial.print(","); Serial.print(dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif - spi_master_enable(spi_d, (spi_baud_rate)clockDivider, (spi_mode)dataMode, flags); + spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags); +} + +void SPIClass::begin(void) { + spi_init(_currentSetting->spi_d); + configure_gpios(_currentSetting->spi_d, 1); + updateSettings(); +#ifdef SPI_USE_DMA_BUFFER + dmaSendBufferInit(); +#endif +//Serial.println("SPI class begin - end"); } void SPIClass::beginSlave(void) { - if (dataMode >= 4) { - ASSERT(0); - return; - } - uint32 flags = ((bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE); - spi_init(spi_d); - configure_gpios(spi_d, 0); + spi_init(_currentSetting->spi_d); + configure_gpios(_currentSetting->spi_d, 0); + uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_RX_ONLY); #ifdef SPI_DEBUG - Serial.print("spi_slave_enable("); Serial.print(dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + Serial.print("spi_slave_enable("); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif - spi_slave_enable(spi_d, (spi_mode)dataMode, flags); + spi_slave_enable(_currentSetting->spi_d, (spi_mode)_currentSetting->dataMode, flags); } void SPIClass::end(void) { - if (!spi_is_enabled(this->spi_d)) { + if (!spi_is_enabled(_currentSetting->spi_d)) { return; } // Follows RM0008's sequence for disabling a SPI in master/slave // full duplex mode. - while (spi_is_rx_nonempty(this->spi_d)) { + while (spi_is_rx_nonempty(_currentSetting->spi_d)) { // FIXME [0.1.0] remove this once you have an interrupt based driver - volatile uint16 rx __attribute__((unused)) = spi_rx_reg(this->spi_d); + volatile uint16 rx __attribute__((unused)) = spi_rx_reg(_currentSetting->spi_d); } - while (!spi_is_tx_empty(this->spi_d)) + while (!spi_is_tx_empty(_currentSetting->spi_d)) ; - while (spi_is_busy(this->spi_d)) + while (spi_is_busy(_currentSetting->spi_d)) ; - spi_peripheral_disable(this->spi_d); + spi_peripheral_disable(_currentSetting->spi_d); } /* Roger Clark added 3 functions */ @@ -170,8 +196,9 @@ void SPIClass::setClockDivider(uint32_t clockDivider) #ifdef SPI_DEBUG Serial.print("Clock divider set to "); Serial.println(clockDivider); #endif - this->clockDivider = clockDivider; - this->begin(); + _currentSetting->clockDivider = clockDivider; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_BR); + _currentSetting->spi_d->regs->CR1 = cr1 | (clockDivider & SPI_CR1_BR); } void SPIClass::setBitOrder(BitOrder bitOrder) @@ -179,8 +206,10 @@ void SPIClass::setBitOrder(BitOrder bitOrder) #ifdef SPI_DEBUG Serial.print("Bit order set to "); Serial.println(bitOrder); #endif - this->bitOrder = bitOrder; - this->begin(); + _currentSetting->bitOrder = bitOrder; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_LSBFIRST); + if ( bitOrder==LSBFIRST ) cr1 |= SPI_CR1_LSBFIRST; + _currentSetting->spi_d->regs->CR1 = cr1; } /* Victor Perez. Added to test changing datasize from 8 to 16 bit modes on the fly. @@ -189,11 +218,11 @@ void SPIClass::setBitOrder(BitOrder bitOrder) */ void SPIClass::setDataSize(uint32 datasize) { - uint32 cr1 = this->spi_d->regs->CR1; - datasize &= SPI_CR1_DFF; - cr1 &= ~(SPI_CR1_DFF); - cr1 |= datasize; - this->spi_d->regs->CR1 = cr1; + _currentSetting->dataSize = datasize; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF); + uint8 en = spi_is_enabled(_currentSetting->spi_d); + spi_peripheral_disable(_currentSetting->spi_d); + _currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF) | en; } void SPIClass::setDataMode(uint8_t dataMode) @@ -212,13 +241,11 @@ SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge On the STM32 it appears to be bit 1 - CPOL : Clock polarity - (This bit should not be changed when communication is ongoing) 0 : CLK to 0 when idle 1 : CLK to 1 when idle bit 0 - CPHA : Clock phase - (This bit should not be changed when communication is ongoing) 0 : The first clock transition is the first data capture edge 1 : The second clock transition is the first data capture edge @@ -228,10 +255,10 @@ If someone finds this is not the case or sees a logic error with this let me kno #ifdef SPI_DEBUG Serial.print("Data mode set to "); Serial.println(dataMode); #endif - this->dataMode = dataMode; - this->begin(); -} - + _currentSetting->dataMode = dataMode; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA); + _currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA)); +} void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) { @@ -243,29 +270,20 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) //digitalWrite(_SSPin,LOW); setBitOrder(settings.bitOrder); setDataMode(settings.dataMode); - setClockDivider(determine_baud_rate(spi_d, settings.clock)); + setDataSize(settings.dataSize); + setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); begin(); -#if 0 -// code from SAM core - uint8_t mode = interruptMode; - if (mode > 0) { - if (mode < 16) { - if (mode & 1) PIOA->PIO_IDR = interruptMask[0]; - if (mode & 2) PIOB->PIO_IDR = interruptMask[1]; - if (mode & 4) PIOC->PIO_IDR = interruptMask[2]; - if (mode & 8) PIOD->PIO_IDR = interruptMask[3]; - } else { - interruptSave = interruptsStatus(); - noInterrupts(); - } - } - uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL(pin); - bitOrder[ch] = settings.border; - SPI_ConfigureNPCS(spi, ch, settings.config); - //setBitOrder(pin, settings.border); - //setDataMode(pin, settings.datamode); - //setClockDivider(pin, settings.clockdiv); -#endif +} + +void SPIClass::beginTransactionSlave(SPISettings settings) +{ + #ifdef SPI_DEBUG + Serial.println(F("SPIClass::beginTransactionSlave")); + #endif + setBitOrder(settings.bitOrder); + setDataMode(settings.dataMode); + setDataSize(settings.dataSize); + beginSlave(); } void SPIClass::endTransaction(void) @@ -295,131 +313,127 @@ void SPIClass::endTransaction(void) * I/O */ -uint8 SPIClass::read(void) { - uint8 buf[1]; - this->read(buf, 1); - return buf[0]; +uint16 SPIClass::read(void) +{ + while ( spi_is_rx_nonempty(_currentSetting->spi_d)==0 ) ; + return (uint16)spi_rx_reg(_currentSetting->spi_d); } -void SPIClass::read(uint8 *buf, uint32 len) { - uint32 rxed = 0; - while (rxed < len) { - while (!spi_is_rx_nonempty(this->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(this->spi_d); +void SPIClass::read(uint8 *buf, uint32 len) +{ + spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. + spi_reg_map * regs = _currentSetting->spi_d->regs; + // start sequence + while ( (len--)>0) { + regs->DR = 0x00FF; // " write the data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while ( (regs->SR & SPI_SR_RXNE)==0 ) ; // wait till data is available in the Rx register + *buf++ = (uint8)(regs->DR); // read and store the received byte } } -void SPIClass::write(uint16 data) { - #ifdef SPI_DEBUG -// Serial.print("SPIClass::write("); Serial.print(data); Serial.println(")"); - #endif - // this->write(&data, 1); - +void SPIClass::write(uint16 data) +{ /* Added for 16bit data Victor Perez. Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) - * The original method, of calling write(*data, length) . + * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, + * by taking the Tx code from transfer(byte) * This almost doubles the speed of this function. */ - - spi_tx_reg(this->spi_d, data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_reg(_currentSetting->spi_d, data); // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) +//return; + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } -//void SPIClass::write(uint8 byte) { - // this->write(&byte, 1); +void SPIClass::write(uint16 data, uint32 n) +{ + // Added by stevstrong: Repeatedly send same data by the specified number of times + spi_reg_map * regs = _currentSetting->spi_d->regs; + while ( (n--)>0 ) { + regs->DR = data; // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + while ( (regs->SR & SPI_SR_TXE)==0 ) ; // wait till Tx empty + } + while ( (regs->SR & SPI_SR_BSY) != 0); // wait until BSY=0 before returning +} - /* Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) - * The original method, of calling write(*data, length) . - * This almost doubles the speed of this function. - */ - -// spi_tx_reg(this->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." -// while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." -// while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." -//} +void SPIClass::write(void *data, uint32 length) +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_tx(spi_d, (void*)data, length); // data can be array of bytes or words + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." +} -void SPIClass::write(const uint8 *data, uint32 length) { - #ifdef SPI_DEBUG - Serial.print("SPIClass::write(data, "); Serial.print(length); Serial.println(")"); - #endif - uint32 txed = 0; - while (txed < length) { - txed += spi_tx(this->spi_d, data + txed, length - txed); - } - while (spi_is_tx_empty(this->spi_d) == 0); // "4. After writing the last data item into the SPI_DR register, wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... then wait until BSY=0, this indicates that the transmission of the last data is complete." +uint8 SPIClass::transfer(uint8 byte) const +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, byte); // Write the data item to be transmitted into the SPI_DR register + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint8)spi_rx_reg(spi_d); // "... and read the last received data." } -uint8 SPIClass::transfer(uint8 byte) const { - #ifdef SPI_DEBUG -// Serial.print("SPIClass::transfer("); Serial.print(byte); Serial.println(")"); - #endif - uint8 b; - spi_tx_reg(this->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return b; +uint16_t SPIClass::transfer16(uint16_t wr_data) const +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint16)spi_rx_reg(spi_d); // "... and read the last received data." } + +#ifdef SPI_DMA /* Roger Clark and Victor Perez, 2015 * Performs a DMA SPI transfer with at least a receive buffer. -* If a TX buffer is not provided, FF is sent over and over for the lenght of the transfer. -* On exit TX buffer is not modified, and RX buffer cotains the received data. +* If a TX buffer is not provided, FF is sent over and over for the length of the transfer. +* On exit TX buffer is not modified, and RX buffer contains the received data. * Still in progress. */ -uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length) { +uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length) +{ if (length == 0) return 0; - uint8 b; - if (spi_is_rx_nonempty(this->spi_d) == 1) b = spi_rx_reg(this->spi_d); //Clear the RX buffer in case a byte is waiting on it. - dma1_ch3_Active=true; - dma_init(DMA1); - dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - + uint8 b = 0; + spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. +// dma1_ch3_Active=true; + dma_init(_currentSetting->spiDmaDev); +// dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); + // RX - spi_rx_dma_enable(SPI1); - dma_setup_transfer(DMA1, DMA_CH2, &SPI1->regs->DR, DMA_SIZE_8BITS, - receiveBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA - dma_set_num_transfers(DMA1, DMA_CH2, length); - + spi_rx_dma_enable(_currentSetting->spi_d); + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==SPI_DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); + // TX - spi_tx_dma_enable(SPI1); - if (!transmitBuf) { - static uint8_t ff = 0XFF; - transmitBuf = &ff; - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, (DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit FF repeatedly - } - else { - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit buffer DMA + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); + spi_tx_dma_enable(_currentSetting->spi_d); + if ( transmitBuf==0 ) { + static uint8_t ff = 0XFF; + transmitBuf = &ff; + flags ^= DMA_MINC_MODE; // remove increment mode } - dma_set_num_transfers(DMA1, DMA_CH3, length); + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - dma_enable(DMA1, DMA_CH2);// enable receive - dma_enable(DMA1, DMA_CH3);// enable transmit + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit -// while (dma1_ch3_Active); -// if (receiveBuf) { uint32_t m = millis(); - while (dma1_ch3_Active) { - if ((millis() - m) > 100) { - dma1_ch3_Active = 0; - b = 2; - break; - } + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - -// } - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(DMA1, DMA_CH3); - dma_disable(DMA1, DMA_CH2); - spi_rx_dma_disable(SPI1); - spi_tx_dma_disable(SPI1); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + spi_rx_dma_disable(_currentSetting->spi_d); // And disable generation of DMA request from the SPI port so other peripherals can use the channels + spi_tx_dma_disable(_currentSetting->spi_d); + //uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! return b; } @@ -427,56 +441,37 @@ uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length * Performs a DMA SPI send using a TX buffer. * On exit TX buffer is not modified. * Still in progress. +* 2016 - stevstrong - reworked to automatically detect bit size from SPI setting */ -uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { +uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) +{ if (length == 0) return 0; - uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - uint8 b; - dma1_ch3_Active=true; - dma_init(DMA1); - dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - + uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); + uint8 b = 0; + dma_init(_currentSetting->spiDmaDev); // TX - spi_tx_dma_enable(SPI1); - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, flags);// Transmit buffer DMA - dma_set_num_transfers(DMA1, DMA_CH3, length); - dma_enable(DMA1, DMA_CH3);// enable transmit - - while (dma1_ch3_Active); - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(DMA1, DMA_CH3); - spi_tx_dma_disable(SPI1); - return b; + spi_tx_dma_enable(_currentSetting->spi_d); + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==SPI_DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + + uint32_t m = millis(); + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + spi_tx_dma_disable(_currentSetting->spi_d); + //uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! + return b; } +#endif -uint8 SPIClass::dmaSend(uint16 *transmitBuf, uint16 length, bool minc) { - if (length == 0) return 0; - uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - uint8 b; - dma1_ch3_Active=true; - dma_init(DMA1); - dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - - // TX - spi_tx_dma_enable(SPI1); - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_16BITS, - transmitBuf, DMA_SIZE_16BITS, flags);// Transmit buffer DMA - dma_set_num_transfers(DMA1, DMA_CH3, length); - dma_enable(DMA1, DMA_CH3);// enable transmit - - while (dma1_ch3_Active); - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(DMA1, DMA_CH3); - spi_tx_dma_disable(SPI1); - return b; -} void SPIClass::attachInterrupt(void) { @@ -492,19 +487,19 @@ void SPIClass::detachInterrupt(void) { */ uint8 SPIClass::misoPin(void) { - return dev_to_spi_pins(this->spi_d)->miso; + return dev_to_spi_pins(_currentSetting->spi_d)->miso; } uint8 SPIClass::mosiPin(void) { - return dev_to_spi_pins(this->spi_d)->mosi; + return dev_to_spi_pins(_currentSetting->spi_d)->mosi; } uint8 SPIClass::sckPin(void) { - return dev_to_spi_pins(this->spi_d)->sck; + return dev_to_spi_pins(_currentSetting->spi_d)->sck; } uint8 SPIClass::nssPin(void) { - return dev_to_spi_pins(this->spi_d)->nss; + return dev_to_spi_pins(_currentSetting->spi_d)->nss; } /* @@ -585,29 +580,26 @@ static void configure_gpios(spi_dev *dev, bool as_master) { if(dev->clk_id <= RCC_SPI2) { if(nssi) { if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 5); + gpio_set_af_mode(pins->nss, 5); } } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 5); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 5); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 5); + gpio_set_af_mode(pins->sck, 5); + gpio_set_af_mode(pins->miso, 5); + gpio_set_af_mode(pins->mosi, 5); } else { if(nssi) { if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 6); + gpio_set_af_mode(pins->nss, 6); } } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 6); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 6); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 6); + gpio_set_af_mode(pins->sck, 6); + gpio_set_af_mode(pins->miso, 6); + gpio_set_af_mode(pins->mosi, 6); } #endif - spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, - scki->gpio_device, scki->gpio_bit, - misoi->gpio_device, misoi->gpio_bit, - mosii->gpio_device, mosii->gpio_bit); + spi_config_gpios(dev, as_master, pins->nss, pins->sck, pins->miso, pins->mosi); } static const spi_baud_rate baud_rates[8] __FLASH__ = { @@ -634,6 +626,8 @@ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { { case RCC_APB2: clock = STM32_PCLK2; break; // 72 Mhz case RCC_APB1: clock = STM32_PCLK1; break; // 36 Mhz + case RCC_AHB1: break; + default: break; } clock /= 2; i = 0; diff --git a/STM32F4/libraries/SPI/src/SPI.h b/STM32F4/libraries/SPI/src/SPI.h index 490d58b2e..1b01d9b25 100644 --- a/STM32F4/libraries/SPI/src/SPI.h +++ b/STM32F4/libraries/SPI/src/SPI.h @@ -34,16 +34,12 @@ /* TODO [0.1.0] Remove deprecated methods. */ - -#ifndef _SPI_H_INCLUDED -#define _SPI_H_INCLUDED +#ifndef _LIB_SPI_H_ +#define _LIB_SPI_H_ #include #include #include - -#include -#include #include // SPI_HAS_TRANSACTION means SPI has @@ -96,33 +92,61 @@ #define SPI_MODE2 SPI_MODE_2 #define SPI_MODE3 SPI_MODE_3 +#define SPI_DATA_SIZE_8BIT SPI_CR1_DFF_8_BIT +#define SPI_DATA_SIZE_16BIT SPI_CR1_DFF_16_BIT + class SPISettings { public: SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, dataMode); + init_AlwaysInline(clock, bitOrder, dataMode, SPI_DATA_SIZE_8BIT); + } else { + init_MightInline(clock, bitOrder, dataMode, SPI_DATA_SIZE_8BIT); + } + } + SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) { + if (__builtin_constant_p(clock)) { + init_AlwaysInline(clock, bitOrder, dataMode, dataSize); + } else { + init_MightInline(clock, bitOrder, dataMode, dataSize); + } + } + SPISettings(uint32_t clock) { + if (__builtin_constant_p(clock)) { + init_AlwaysInline(clock, MSBFIRST, SPI_MODE0, SPI_DATA_SIZE_8BIT); } else { - init_MightInline(clock, bitOrder, dataMode); + init_MightInline(clock, MSBFIRST, SPI_MODE0, SPI_DATA_SIZE_8BIT); } } - SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } + SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, SPI_DATA_SIZE_8BIT); } private: - void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { - init_AlwaysInline(clock, bitOrder, dataMode); + void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) { + init_AlwaysInline(clock, bitOrder, dataMode, dataSize); } - void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) __attribute__((__always_inline__)) { + void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) __attribute__((__always_inline__)) { this->clock = clock; this->bitOrder = bitOrder; this->dataMode = dataMode; + this->dataSize = dataSize; } uint32_t clock; BitOrder bitOrder; uint8_t dataMode; + uint32_t dataSize; + + spi_dev *spi_d; + //uint8_t _SSPin; + uint32_t clockDivider; +#ifdef SPI_DMA + dma_channel spiRxDmaChannel, spiTxDmaChannel; + dma_dev* spiDmaDev; +#endif + friend class SPIClass; }; -volatile static bool dma1_ch3_Active; + /** * @brief Wirish SPI interface. @@ -175,6 +199,8 @@ class SPIClass { void beginTransaction(uint8_t pin, SPISettings settings); void endTransaction(void); + void beginTransactionSlave(SPISettings settings); + void setClockDivider(uint32_t clockDivider); void setBitOrder(BitOrder bitOrder); void setDataMode(uint8_t dataMode); @@ -195,40 +221,40 @@ class SPIClass { */ /** - * @brief Return the next unread byte. + * @brief Return the next unread byte/word. * - * If there is no unread byte waiting, this function will block + * If there is no unread byte/word waiting, this function will block * until one is received. */ - uint8 read(void); + uint16 read(void); /** * @brief Read length bytes, storing them into buffer. * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This + * @param length Number of bytes to store in buffer. This * function will block until the desired number of * bytes have been read. */ void read(uint8 *buffer, uint32 length); /** - * @brief Transmit a byte. - * @param data Byte to transmit. + * @brief Transmit one byte/word. + * @param data to transmit. */ -// void write(uint8 data); - + void write(uint16 data); + /** - * @brief Transmit a half word. + * @brief Transmit one byte/word a specified number of times. * @param data to transmit. */ - void write(uint16 data); + void write(uint16 data, uint32 n); /** - * @brief Transmit multiple bytes. - * @param buffer Bytes to transmit. - * @param length Number of bytes in buffer to transmit. + * @brief Transmit multiple bytes/words. + * @param buffer Bytes/words to transmit. + * @param length Number of bytes/words in buffer to transmit. */ - void write(const uint8 *buffer, uint32 length); + void write(void * buffer, uint32 length); /** * @brief Transmit a byte, then return the next unread byte. @@ -239,9 +265,12 @@ class SPIClass { * @return Next unread byte. */ uint8 transfer(uint8 data) const; + uint16_t transfer16(uint16_t data) const; +#ifdef SPI_DMA /** * @brief Sets up a DMA Transfer for "length" bytes. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * * This function transmits and receives to buffers. * @@ -249,30 +278,19 @@ class SPIClass { * @param receiveBuf buffer Bytes to save received data. * @param length Number of bytes in buffer to transmit. */ - uint8 dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length); + uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); /** - * @brief Sets up a DMA Transmit for bytes. - * - * This function transmits and does not care about the RX fifo. - * - * @param transmitBuf buffer Bytes to transmit, - * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode, clear to use Circular mode. - */ - uint8 dmaSend(uint8 *transmitBuf, uint16 length, bool minc = 1); - - /** - * @brief Sets up a DMA Transmit for half words. - * SPI PERFIPHERAL MUST BE SET TO 16 BIT MODE BEFORE + * @brief Sets up a DMA Transmit for SPI 8 or 16 bit transfer mode. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * - * This function transmits and does not care about the RX fifo. + * This function only transmits and does not care about the RX fifo. * * @param data buffer half words to transmit, * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode (default if blank), clear to use Circular mode. */ - uint8 dmaSend(uint16 *transmitBuf, uint16 length, bool minc = 1); + uint8 dmaSend(void * transmitBuf, uint16 length, bool minc = 1); +#endif /* * Pin accessors @@ -304,7 +322,24 @@ class SPIClass { * @brief Get a pointer to the underlying libmaple spi_dev for * this HardwareSPI instance. */ - spi_dev* c_dev(void) { return this->spi_d; } + spi_dev* c_dev(void) { return _currentSetting->spi_d; } + + + spi_dev *dev(){ return _currentSetting->spi_d;} + + /** + * @brief Sets the number of the SPI peripheral to be used by + * this HardwareSPI instance. + * + * @param spi_num Number of the SPI port. 1-2 in low density devices + * or 1-3 in high density devices. + */ + + void setModule(int spi_num) + { + _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed + } + /* -- The following methods are deprecated --------------------------- */ @@ -338,12 +373,8 @@ class SPIClass { */ uint8 recv(void); - spi_dev *dev(){ return spi_d;} - - - private: - +/* static inline void DMA1_CH3_Event() { dma1_ch3_Active = 0; // dma_disable(DMA1, DMA_CH3); @@ -351,11 +382,18 @@ class SPIClass { // To Do. Need to wait for } +*/ + SPISettings _settings[BOARD_NR_SPI]; + SPISettings *_currentSetting; + + void updateSettings(void); + /* spi_dev *spi_d; uint8_t _SSPin; uint32_t clockDivider; uint8_t dataMode; BitOrder bitOrder; + */ }; diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index 5bfa22efe..2bb1946b0 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -8,8 +8,6 @@ version=0.1.0 # compiler variables # ---------------------- -#build.gcc_ver=gcc-arm-none-eabi-4.8.3-2014q1 - compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc compiler.c.flags=-c -g -Os -Wall -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} @@ -30,6 +28,8 @@ compiler.size.cmd=arm-none-eabi-size compiler.define=-DARDUINO= # this can be overriden in boards.txt +build.f_cpu=168000000L +build.mcu=cortex-m4 build.cpu_flags= build.hs_flag= build.common_flags=-mthumb -D__STM32F4__ @@ -44,10 +44,10 @@ compiler.ar.extra_flags= compiler.elf2hex.extra_flags= -##compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/stm32f1/include/series" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" -#compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" +##compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" +#compiler.libs.c.flags="-I{build.core.path}" "-I{build.core.path}/libmaple" "-I{build.core.path}/libmaple/usbF4" "-I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Core/inc" "-I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc" "-I{build.core.path}/libmaple/usbF4/STM32_USB_OTG_Driver/inc" "-I{build.core.path}/libmaple/usbF4/VCP" +compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.core.path}/libmaple/usbF4" -compiler.libs.c.flags=-I{build.core.path} -I{build.core.path}/libmaple -I{build.core.path}/libmaple/usbF4 -I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Core/inc -I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc -I{build.core.path}/libmaple/usbF4/STM32_USB_OTG_Driver/inc -I{build.core.path}/libmaple/usbF4/VCP @@ -71,7 +71,6 @@ recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -m ## Compile S files recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.S.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {build.cpu_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" -#recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" "{source_file}" -o "{object_file}" ## Create archives recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}" @@ -90,7 +89,6 @@ recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf ## Compute size recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf" -#recipe.size.regex=\.text\s+([0-9]+).* recipe.size.regex=^(?:\.text|\.rodata|\.ARM.exidx)\s+([0-9]+).* recipe.size.regex.data=^(?:\.data|\.bss|\.noinit)\s+([0-9]+).* diff --git a/STM32F4/system/libmaple/Arduino.h b/STM32F4/system/libmaple/Arduino.h new file mode 100644 index 000000000..cef8f089f --- /dev/null +++ b/STM32F4/system/libmaple/Arduino.h @@ -0,0 +1,46 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 LeafLabs LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +#ifndef _WIRISH_ARDUINO_H_ +#define _WIRISH_ARDUINO_H_ + +//#warning Include Arduino.h from system\libmaple + +#include "wirish.h" + +void setup(); +void loop(); +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus +void yield(void); +#ifdef __cplusplus +} +#endif // __cplusplus + +#include "variant.h" + +#endif diff --git a/STM32F4/variants/generic_f407v/generic_f407v.cpp b/STM32F4/variants/generic_f407v/generic_f407v.cpp index 119906476..a4a5ecbb4 100644 --- a/STM32F4/variants/generic_f407v/generic_f407v.cpp +++ b/STM32F4/variants/generic_f407v/generic_f407v.cpp @@ -35,40 +35,11 @@ #include "generic_f407v.h" //#include "fsmc.h" -#include "gpio.h" -#include "rcc.h" -#include "timer.h" +#include +#include +#include -#include "wirish_types.h" - -// Pins reserved for the on-board hardware -#define USB_DM_PIN BOARD_USB_DM_PIN // PA11 -#define USB_DP_PIN BOARD_USB_DP_PIN // PA12 - -#define FLASH_CS_PIN PB0 -#define FLASH_CLK_PIN BOARD_SPI3_SCK_PIN // PB3 -#define FLASH_DO_PIN BOARD_SPI3_MISO_PIN // PB4 -#define FLASH_DI_PIN BOARD_SPI3_MOSI_PIN // PB5 - -#define NRF24_CLK_PIN BOARD_SPI3_SCK_PIN // PB3 -#define NRF24_DO_PIN BOARD_SPI3_MISO_PIN // PB4 -#define NRF24_DI_PIN BOARD_SPI3_MOSI_PIN // PB5 -#define NRF24_CE_PIN PB6 -#define NRF24_CS_PIN PB7 -#define NRF24_IRQ_PIN PB8 - -// SD card, SDIO mode -#define SD_DAT0 BOARD_SDIO_D0 // PC8 -#define SD_DAT1 BOARD_SDIO_D1 // PC9 -#define SD_DAT2 BOARD_SDIO_D2 // PC10 -#define SD_DAT3 BOARD_SDIO_D3 // PC11 -#define SD_CLK BOARD_SDIO_CK // PC12 -#define SD_CMD BOARD_SDIO_CMD // PD2 -// SD card, SPI mode, only usable with software SPI -#define SD_DI BOARD_SDIO_CMD // PD2 -#define SD_DO BOARD_SDIO_D0 // PC8 -#define SD_CS BOARD_SDIO_D3 // PC11 -#define SD_SCLK BOARD_SDIO_CK // PC12 +#include //static void initSRAMChip(void); /*****************************************************************************/ diff --git a/STM32F4/variants/generic_f407v/generic_f407v.h b/STM32F4/variants/generic_f407v/generic_f407v.h index b9f034847..927f9cd9c 100644 --- a/STM32F4/variants/generic_f407v/generic_f407v.h +++ b/STM32F4/variants/generic_f407v/generic_f407v.h @@ -47,6 +47,8 @@ #define SYSTICK_RELOAD_VAL (CYCLES_PER_MICROSECOND*1000-1) +/*****************************************************************************/ +// Board pin definitions #define BOARD_USB_DM_PIN PA11 #define BOARD_USB_DP_PIN PA12 @@ -92,10 +94,10 @@ #define BOARD_SPI3_MISO_PIN PB4 //Port2Pin('B', 4) #define BOARD_SPI3_MOSI_PIN PB5 //Port2Pin('B', 5) /* overlap with the SDIO interface for SD card -#define BOARD_SPI3A_NSS_PIN Port2Pin('A', 4) -#define BOARD_SPI3A_SCK_PIN Port2Pin('C',10) -#define BOARD_SPI3A_MISO_PIN Port2Pin('C',11) -#define BOARD_SPI3A_MOSI_PIN Port2Pin('C',12) +#define BOARD_SPI3A_NSS_PIN PA4 //Port2Pin('A', 4) +#define BOARD_SPI3A_SCK_PIN PC10 //Port2Pin('C',10) +#define BOARD_SPI3A_MISO_PIN PC11 //Port2Pin('C',11) +#define BOARD_SPI3A_MOSI_PIN PC12 //Port2Pin('C',12) */ #define BOARD_SDIO_D0 PC8 //Port2Pin('C', 8) #define BOARD_SDIO_D1 PC9 //Port2Pin('C', 9) @@ -114,6 +116,37 @@ #define BOARD_JTDO_PIN PB3 //Port2Pin('B', 3) #define BOARD_NJTRST_PIN PB4 //Port2Pin('B', 4) +/*****************************************************************************/ +// Pins reserved for the on-board hardware +#define USB_DM_PIN BOARD_USB_DM_PIN // PA11 +#define USB_DP_PIN BOARD_USB_DP_PIN // PA12 + +#define FLASH_CS_PIN PB0 +#define FLASH_CLK_PIN BOARD_SPI3_SCK_PIN // PB3 +#define FLASH_DO_PIN BOARD_SPI3_MISO_PIN // PB4 +#define FLASH_DI_PIN BOARD_SPI3_MOSI_PIN // PB5 + +#define NRF24_CLK_PIN BOARD_SPI3_SCK_PIN // PB3 +#define NRF24_DO_PIN BOARD_SPI3_MISO_PIN // PB4 +#define NRF24_DI_PIN BOARD_SPI3_MOSI_PIN // PB5 +#define NRF24_CE_PIN PB6 +#define NRF24_CS_PIN PB7 +#define NRF24_IRQ_PIN PB8 + +// SD card, SDIO mode +#define SD_DAT0 BOARD_SDIO_D0 // PC8 +#define SD_DAT1 BOARD_SDIO_D1 // PC9 +#define SD_DAT2 BOARD_SDIO_D2 // PC10 +#define SD_DAT3 BOARD_SDIO_D3 // PC11 +#define SD_CLK BOARD_SDIO_CK // PC12 +#define SD_CMD BOARD_SDIO_CMD // PD2 +// SD card, SPI mode, only usable with software SPI +#define SD_DI BOARD_SDIO_CMD // PD2 +#define SD_DO BOARD_SDIO_D0 // PC8 +#define SD_CS BOARD_SDIO_D3 // PC11 +#define SD_SCLK BOARD_SDIO_CK // PC12 + +/*****************************************************************************/ enum { PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, From 483bbe17d3ddbe827a9c1ddd1197745f8b69a016 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Thu, 4 May 2017 17:18:11 +0200 Subject: [PATCH 058/307] corrected OTYPER register setting --- STM32F4/cores/maple/libmaple/gpioF4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F4/cores/maple/libmaple/gpioF4.c b/STM32F4/cores/maple/libmaple/gpioF4.c index 6fec61caa..fe3cc876f 100644 --- a/STM32F4/cores/maple/libmaple/gpioF4.c +++ b/STM32F4/cores/maple/libmaple/gpioF4.c @@ -162,7 +162,7 @@ void gpio_set_mode(uint8_t io_pin, gpio_pin_mode mode) { regs->MODER = (regs->MODER & ~( 3 << (pin<<1))) | (((mode >> 0) & 3) << (pin<<1)); regs->PUPDR = (regs->PUPDR & ~( 3 << (pin<<1))) | (((mode >> 2) & 3) << (pin<<1)); regs->OSPEEDR = (regs->OSPEEDR & ~( 3 << (pin<<1))) | (((mode >> 4) & 3) << (pin<<1)); - regs->OTYPER = (regs->OTYPER & ~( 1 << (pin<<1))) | (((mode >> 6) & 1) << (pin<<1)); + regs->OTYPER = (regs->OTYPER & ~( 1 << (pin<<0))) | (((mode >> 6) & 1) << (pin<<0)); } /** From 30d1bf490071c6beeeb3b6f1eb108f4450e0fdf6 Mon Sep 17 00:00:00 2001 From: syfre Date: Sat, 6 May 2017 23:02:54 +0200 Subject: [PATCH 059/307] Fix, add ADC_CR2_EXTTRIG to adc_set_extsel() to enable the external trigger mode --- STM32F1/cores/maple/libmaple/adc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/STM32F1/cores/maple/libmaple/adc.c b/STM32F1/cores/maple/libmaple/adc.c index 7c48ee41f..416cfaac5 100644 --- a/STM32F1/cores/maple/libmaple/adc.c +++ b/STM32F1/cores/maple/libmaple/adc.c @@ -59,6 +59,7 @@ void adc_set_extsel(adc_dev *dev, adc_extsel_event event) { uint32 cr2 = dev->regs->CR2; cr2 &= ~ADC_CR2_EXTSEL; cr2 |= event; + cr2 |= ADC_CR2_EXTTRIG; dev->regs->CR2 = cr2; } From 50e4d84db49dbe20d759f99614bb6d71ef8737e5 Mon Sep 17 00:00:00 2001 From: syfre Date: Sat, 6 May 2017 23:03:47 +0200 Subject: [PATCH 060/307] Add, setMasterModeTrGo to configure the TrGo mode Use to trigger the ADC on TIMx_TRGO --- STM32F1/cores/maple/HardwareTimer.cpp | 5 +++++ STM32F1/cores/maple/HardwareTimer.h | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/STM32F1/cores/maple/HardwareTimer.cpp b/STM32F1/cores/maple/HardwareTimer.cpp index 48d040037..ecd1b11cf 100644 --- a/STM32F1/cores/maple/HardwareTimer.cpp +++ b/STM32F1/cores/maple/HardwareTimer.cpp @@ -142,6 +142,11 @@ void HardwareTimer::refresh(void) { timer_generate_update(this->dev); } +void HardwareTimer::setMasterModeTrGo(uint32_t mode) { + this->dev->regs.bas->CR2 &= ~TIMER_CR2_MMS; + this->dev->regs.bas->CR2 |= mode; +} + /* CARLOS Changes to add encoder mode.*/ //direction of movement. (to be better described). diff --git a/STM32F1/cores/maple/HardwareTimer.h b/STM32F1/cores/maple/HardwareTimer.h index 45272ec0b..75601d0cb 100644 --- a/STM32F1/cores/maple/HardwareTimer.h +++ b/STM32F1/cores/maple/HardwareTimer.h @@ -209,6 +209,23 @@ class HardwareTimer { */ void refresh(void); + // SYFRE + /** + * @brief Set the Master mode TRGO signal + * These bits allow to select the information to be sent in master mode to slave timers for + * synchronization (TRGO). + * mode: + * TIMER_CR2_MMS_RESET + * TIMER_CR2_MMS_ENABLE + * TIMER_CR2_MMS_UPDATE + * TIMER_CR2_MMS_COMPARE_PULSE + * TIMER_CR2_MMS_COMPARE_OC1REF + * TIMER_CR2_MMS_COMPARE_OC2REF + * TIMER_CR2_MMS_COMPARE_OC3REF + * TIMER_CR2_MMS_COMPARE_OC4REF + */ + void setMasterModeTrGo(uint32_t mode); + //CARLOS. /* added these functions to make sense for the encoder mode. From d240a7efa737a4f4a7a8f053c4a3d1eb4da68841 Mon Sep 17 00:00:00 2001 From: syfre Date: Sat, 6 May 2017 23:04:11 +0200 Subject: [PATCH 061/307] Fix, compile error in enable_internal_reading() --- STM32F1/libraries/STM32ADC/src/utility/util_adc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/STM32ADC/src/utility/util_adc.c b/STM32F1/libraries/STM32ADC/src/utility/util_adc.c index 5d44939c9..e64b58e20 100644 --- a/STM32F1/libraries/STM32ADC/src/utility/util_adc.c +++ b/STM32F1/libraries/STM32ADC/src/utility/util_adc.c @@ -45,7 +45,7 @@ void enable_adc_irq(adc_dev* dev) {//ADC1 for now. Enable the reading of the internal variables (Temperature and Vref). */ void enable_internal_reading(adc_dev *dev) { - dev->regs->CR2 |= ADC_CR2_TSEREFE; + dev->regs->CR2 |= ADC_CR2_TSVREFE; } /* From c8df44228ced3ad7a08f0275ad7acc3458dede70 Mon Sep 17 00:00:00 2001 From: syfre Date: Sun, 7 May 2017 11:41:58 +0200 Subject: [PATCH 062/307] Add, SMT32ADC example, Single channel at fixed sample rate (timer) using circular buffer (DMA) --- ...ingleChannelAtSampleRateCircularBuffer.ino | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 STM32F1/libraries/STM32ADC/examples/SingleChannelAtSampleRateCircularBuffer/SingleChannelAtSampleRateCircularBuffer.ino diff --git a/STM32F1/libraries/STM32ADC/examples/SingleChannelAtSampleRateCircularBuffer/SingleChannelAtSampleRateCircularBuffer.ino b/STM32F1/libraries/STM32ADC/examples/SingleChannelAtSampleRateCircularBuffer/SingleChannelAtSampleRateCircularBuffer.ino new file mode 100644 index 000000000..e63fe3260 --- /dev/null +++ b/STM32F1/libraries/STM32ADC/examples/SingleChannelAtSampleRateCircularBuffer/SingleChannelAtSampleRateCircularBuffer.ino @@ -0,0 +1,87 @@ +#include +#include + +#define pinLED PC13 +#define pinOUT PB0 + +#define _SEND_BY_USB +#ifdef SEND_BY_USB +USBSerial usb; +#endif + +// Channels to be acquired. +// A0 (adc1 channel 1) +uint8 pins = 0; + +#define maxSamples 2000 +uint16_t buffer[maxSamples]; +uint16_t *buffers[2]; +uint8_t bufr; +uint8_t bufw; + +#define sampleFreqKhz 200 +#define samplePeriodus 1000 / sampleFreqKhz +#define ticksPerSecond 2 * sampleFreqKhz * 1000 / maxSamples + + +STM32ADC myADC(ADC1); + + +long ticks; +void TimerIRQ(void) { + ticks++; +} +void DmaIRQ(void) { + digitalWrite(pinOUT, ! digitalRead(pinOUT)); + bufw = (bufw+1)%2; + ticks++; +} + +void setup() { + + pinMode(pinLED, OUTPUT); + pinMode(pinOUT, OUTPUT); + pinMode(pins, INPUT_ANALOG); + + Serial.begin(115200); + Serial.println("START"); + + #ifdef SEND_BY_USB + usb.begin(); + while (!usb.isConnected()) ; + #endif + + ticks = 0; + bufr = 0; + bufw = 0; + buffers[0] = &buffer[0]; + buffers[1] = &buffer[maxSamples/2]; + + Timer3.setPeriod(samplePeriodus); + Timer3.setMasterModeTrGo(TIMER_CR2_MMS_UPDATE); + + myADC.calibrate(); + myADC.setSampleRate(ADC_SMPR_1_5); // ? + myADC.setPins(&pins, 1); + myADC.setDMA(buffer, maxSamples, (DMA_MINC_MODE | DMA_CIRC_MODE | DMA_HALF_TRNS | DMA_TRNS_CMPLT), DmaIRQ); + myADC.setTrigger(ADC_EXT_EV_TIM3_TRGO); + myADC.startConversion(); +} + +void loop() { + + if (bufr!=bufw) { + // process data + + #ifdef SEND_BY_USB + if (usb.isConnected()) usb.write((uint8_t *)buffers[bufr],maxSamples); // send it : (maxSamples /2 )*2 (bytes) + #endif + + bufr = (bufr+1)%2; + } + + if (ticks==ticksPerSecond) { + digitalWrite(pinLED, ! digitalRead(pinLED)); + ticks = 0; + } +} From 28fa836f4f65e6a25c2f7e34765116f283c4f6c7 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sun, 7 May 2017 15:09:15 +0200 Subject: [PATCH 063/307] PIN_MAP moved to flash --- STM32F4/cores/maple/ext_interrupts.cpp | 4 +- STM32F4/cores/maple/libmaple/adc.c | 21 +- STM32F4/cores/maple/libmaple/adc.h | 6 +- STM32F4/cores/maple/libmaple/gpio.h | 16 +- STM32F4/cores/maple/libmaple/gpioF4.c | 57 ++--- STM32F4/cores/maple/libmaple/gpio_def.h | 15 +- STM32F4/cores/maple/libmaple/spi.h | 1 - STM32F4/cores/maple/libmaple/timer.c | 16 +- STM32F4/cores/maple/usb_serial.cpp | 2 +- STM32F4/cores/maple/usb_serial.h | 12 +- STM32F4/cores/maple/wirish.h | 1 - STM32F4/cores/maple/wirish_types.h | 8 +- STM32F4/libraries/SPI/src/SPI.h | 1 - STM32F4/variants/generic_f407v/black_f4.h.old | 130 ----------- .../variants/generic_f407v/generic_f407v.cpp | 156 +------------ STM32F4/variants/generic_f407v/pin_map.c | 214 ++++++++++++++++++ 16 files changed, 286 insertions(+), 374 deletions(-) delete mode 100644 STM32F4/variants/generic_f407v/black_f4.h.old create mode 100644 STM32F4/variants/generic_f407v/pin_map.c diff --git a/STM32F4/cores/maple/ext_interrupts.cpp b/STM32F4/cores/maple/ext_interrupts.cpp index 9e985485a..7111d0c86 100644 --- a/STM32F4/cores/maple/ext_interrupts.cpp +++ b/STM32F4/cores/maple/ext_interrupts.cpp @@ -51,7 +51,7 @@ void attachInterrupt(uint8 pin, voidFuncPtr handler, ExtIntTriggerMode mode) { exti_trigger_mode outMode = exti_out_mode(mode); - exti_attach_interrupt((afio_exti_num)(PIN_MAP[pin].gpio_bit), + exti_attach_interrupt((afio_exti_num)(pin&0x0F), gpio_exti_port(PIN_MAP[pin].gpio_device), handler, outMode); @@ -66,7 +66,7 @@ void detachInterrupt(uint8 pin) { return; } - exti_detach_interrupt((afio_exti_num)(PIN_MAP[pin].gpio_bit)); + exti_detach_interrupt((afio_exti_num)(pin&0x0F)); } static inline exti_trigger_mode exti_out_mode(ExtIntTriggerMode mode) { diff --git a/STM32F4/cores/maple/libmaple/adc.c b/STM32F4/cores/maple/libmaple/adc.c index b803f29cb..0f4c02c3c 100644 --- a/STM32F4/cores/maple/libmaple/adc.c +++ b/STM32F4/cores/maple/libmaple/adc.c @@ -41,27 +41,24 @@ #include "rcc.h" #include "adc.h" -static adc_dev adc1 = { +/** ADC1 device. */ +const adc_dev ADC1 = { .regs = ADC1_BASE, .clk_id = RCC_ADC1 }; -/** ADC1 device. */ -const adc_dev *ADC1 = &adc1; -static adc_dev adc2 = { +/** ADC2 device. */ +const adc_dev ADC2 = { .regs = ADC2_BASE, .clk_id = RCC_ADC2 }; -/** ADC2 device. */ -const adc_dev *ADC2 = &adc2; #ifdef STM32_HIGH_DENSITY -adc_dev adc3 = { +/** ADC3 device. */ +const adc_dev ADC3 = { .regs = ADC3_BASE, .clk_id = RCC_ADC3 }; -/** ADC3 device. */ -const adc_dev *ADC3 = &adc3; #endif /** @@ -101,10 +98,10 @@ void adc_set_extsel(const adc_dev *dev, adc_extsel_event event) { * @param fn Function to call on each ADC device. */ void adc_foreach(void (*fn)(const adc_dev*)) { - fn(ADC1); - fn(ADC2); + fn(&ADC1); + fn(&ADC2); #ifdef STM32_HIGH_DENSITY - fn(ADC3); + fn(&ADC3); #endif } diff --git a/STM32F4/cores/maple/libmaple/adc.h b/STM32F4/cores/maple/libmaple/adc.h index 7a395102d..6fa61f5ea 100644 --- a/STM32F4/cores/maple/libmaple/adc.h +++ b/STM32F4/cores/maple/libmaple/adc.h @@ -82,10 +82,10 @@ typedef struct adc_dev { rcc_clk_id clk_id; /**< RCC clock information */ } adc_dev; -extern const adc_dev *ADC1; -extern const adc_dev *ADC2; +extern const adc_dev ADC1; +extern const adc_dev ADC2; #ifdef STM32_HIGH_DENSITY -extern const adc_dev *ADC3; +extern const adc_dev ADC3; #endif /* diff --git a/STM32F4/cores/maple/libmaple/gpio.h b/STM32F4/cores/maple/libmaple/gpio.h index 4c0ba7100..f1a141fee 100644 --- a/STM32F4/cores/maple/libmaple/gpio.h +++ b/STM32F4/cores/maple/libmaple/gpio.h @@ -46,7 +46,7 @@ extern "C"{ * @brief Get a GPIO port's corresponding afio_exti_port. * @param dev GPIO device whose afio_exti_port to return. */ -static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { +static inline afio_exti_port gpio_exti_port(const gpio_dev *dev) { return dev->exti_port; } @@ -61,18 +61,18 @@ static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { */ static inline void gpio_write_pin(uint8_t pin, uint8 val) { if (val) { - (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(PIN_MAP[pin].gpio_bit); + (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(pin&0x0F); } else { - (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(PIN_MAP[pin].gpio_bit); + (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(pin&0x0F); } } static inline void gpio_set_pin(uint8_t pin) { - (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(PIN_MAP[pin].gpio_bit); + (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(pin&0x0F); } static inline void gpio_clear_pin(uint8_t pin) { - (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(PIN_MAP[pin].gpio_bit); + (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(pin&0x0F); } /** @@ -85,7 +85,7 @@ static inline void gpio_clear_pin(uint8_t pin) { * @return True if the pin is set, false otherwise. */ static inline uint32 gpio_read_pin(uint8_t pin) { - return (PIN_MAP[pin].gpio_device)->regs->IDR & BIT(PIN_MAP[pin].gpio_bit); + return (PIN_MAP[pin].gpio_device)->regs->IDR & BIT(pin&0x0F); } /** @@ -94,14 +94,14 @@ static inline uint32 gpio_read_pin(uint8_t pin) { * @param pin Pin on dev to toggle. */ static inline void gpio_toggle_pin(uint8_t pin) { - (PIN_MAP[pin].gpio_device)->regs->ODR = (PIN_MAP[pin].gpio_device)->regs->ODR ^ BIT(PIN_MAP[pin].gpio_bit); + (PIN_MAP[pin].gpio_device)->regs->ODR = (PIN_MAP[pin].gpio_device)->regs->ODR ^ BIT(pin&0x0F); } /* * GPIO Convenience routines */ -extern void gpio_init(gpio_dev *dev); +extern void gpio_init(const gpio_dev *dev); extern void gpio_init_all(void); extern void gpio_set_mode(uint8_t pin, gpio_pin_mode mode); extern void gpio_set_af_mode(uint8_t pin, int mode); diff --git a/STM32F4/cores/maple/libmaple/gpioF4.c b/STM32F4/cores/maple/libmaple/gpioF4.c index fe3cc876f..67d3bea53 100644 --- a/STM32F4/cores/maple/libmaple/gpioF4.c +++ b/STM32F4/cores/maple/libmaple/gpioF4.c @@ -24,8 +24,6 @@ * SOFTWARE. *****************************************************************************/ -#ifdef STM32F4 - /** * @file gpio.c * @brief GPIO initialization routine @@ -38,64 +36,57 @@ * GPIO devices */ -gpio_dev gpioa = { +/** GPIO port A device. */ +const gpio_dev GPIOA = { .regs = GPIOA_BASE, .clk_id = RCC_GPIOA, .exti_port = AFIO_EXTI_PA, }; -/** GPIO port A device. */ -gpio_dev* const GPIOA = &gpioa; -gpio_dev gpiob = { +/** GPIO port B device. */ +const gpio_dev GPIOB = { .regs = GPIOB_BASE, .clk_id = RCC_GPIOB, .exti_port = AFIO_EXTI_PB, }; -/** GPIO port B device. */ -gpio_dev* const GPIOB = &gpiob; -gpio_dev gpioc = { +/** GPIO port C device. */ +const gpio_dev GPIOC = { .regs = GPIOC_BASE, .clk_id = RCC_GPIOC, .exti_port = AFIO_EXTI_PC, }; -/** GPIO port C device. */ -gpio_dev* const GPIOC = &gpioc; -gpio_dev gpiod = { +/** GPIO port D device. */ +const gpio_dev GPIOD = { .regs = GPIOD_BASE, .clk_id = RCC_GPIOD, .exti_port = AFIO_EXTI_PD, }; -/** GPIO port D device. */ -gpio_dev* const GPIOD = &gpiod; #ifdef STM32_HIGH_DENSITY -gpio_dev gpioe = { +/** GPIO port E device. */ +const gpio_dev GPIOE = { .regs = GPIOE_BASE, .clk_id = RCC_GPIOE, .exti_port = AFIO_EXTI_PE, }; -/** GPIO port E device. */ -gpio_dev* const GPIOE = &gpioe; #if 0 // not available on LQFP 100 package -gpio_dev gpiof = { +/** GPIO port F device. */ +const gpio_dev GPIOF = { .regs = GPIOF_BASE, .clk_id = RCC_GPIOF, .exti_port = AFIO_EXTI_PF, }; -/** GPIO port F device. */ -gpio_dev* const GPIOF = &gpiof; -gpio_dev gpiog = { +/** GPIO port G device. */ +const gpio_dev GPIOG = { .regs = GPIOG_BASE, .clk_id = RCC_GPIOG, .exti_port = AFIO_EXTI_PG, }; -/** GPIO port G device. */ -gpio_dev* const GPIOG = &gpiog; - #endif // not available on LQFP 100 package +#endif #endif /* @@ -109,7 +100,7 @@ gpio_dev* const GPIOG = &gpiog; * * @param dev GPIO device to initialize. */ -void gpio_init(gpio_dev *dev) { +void gpio_init(const gpio_dev *dev) { rcc_clk_enable(dev->clk_id); rcc_reset_dev(dev->clk_id); } @@ -118,13 +109,13 @@ void gpio_init(gpio_dev *dev) { * Initialize and reset all available GPIO devices. */ void gpio_init_all(void) { - gpio_init(GPIOA); - gpio_init(GPIOB); - gpio_init(GPIOC); - gpio_init(GPIOD); + gpio_init(&GPIOA); + gpio_init(&GPIOB); + gpio_init(&GPIOC); + gpio_init(&GPIOD); #ifdef STM32_HIGH_DENSITY - gpio_init(GPIOE); + gpio_init(&GPIOE); #if 0 // not available on LQFP 100 package gpio_init(GPIOF); gpio_init(GPIOG); @@ -154,7 +145,7 @@ void gpio_init_all(void) { */ void gpio_set_mode(uint8_t io_pin, gpio_pin_mode mode) { gpio_reg_map *regs = (PIN_MAP[io_pin].gpio_device)->regs; - uint8_t pin = PIN_MAP[io_pin].gpio_bit; + uint8_t pin = io_pin&0x0f; //regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 8) & 15) << (4*(pin&7))); //gpio_set_af_mode(dev, pin, mode>>8); @@ -175,7 +166,7 @@ void gpio_set_mode(uint8_t io_pin, gpio_pin_mode mode) { */ void gpio_set_af_mode(uint8_t io_pin, int mode) { gpio_reg_map *regs = (PIN_MAP[io_pin].gpio_device)->regs; - uint8_t pin = PIN_MAP[io_pin].gpio_bit; + uint8_t pin = io_pin&0x0F; regs->AFR[pin>>3] = (regs->AFR[pin>>3] & ~(15 << ((pin&7)<<2))) | (((mode >> 0) & 15) << ((pin&7)<<2)); } @@ -226,5 +217,3 @@ void afio_remap(afio_remap_peripheral remapping) { } } #endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/gpio_def.h b/STM32F4/cores/maple/libmaple/gpio_def.h index e2176eacb..cd1fb3843 100644 --- a/STM32F4/cores/maple/libmaple/gpio_def.h +++ b/STM32F4/cores/maple/libmaple/gpio_def.h @@ -89,17 +89,12 @@ typedef struct gpio_dev { afio_exti_port exti_port; /**< AFIO external interrupt port value */ } gpio_dev; -extern gpio_dev gpioa; -extern gpio_dev* const GPIOA; -extern gpio_dev gpiob; -extern gpio_dev* const GPIOB; -extern gpio_dev gpioc; -extern gpio_dev* const GPIOC; -extern gpio_dev gpiod; -extern gpio_dev* const GPIOD; +extern const gpio_dev GPIOA; +extern const gpio_dev GPIOB; +extern const gpio_dev GPIOC; +extern const gpio_dev GPIOD; #ifdef STM32_HIGH_DENSITY -extern gpio_dev gpioe; -extern gpio_dev* const GPIOE; +extern const gpio_dev GPIOE; #if 0 // not available on LQFP 100 package extern gpio_dev gpiof; extern gpio_dev* const GPIOF; diff --git a/STM32F4/cores/maple/libmaple/spi.h b/STM32F4/cores/maple/libmaple/spi.h index f96b462b5..abed68c12 100644 --- a/STM32F4/cores/maple/libmaple/spi.h +++ b/STM32F4/cores/maple/libmaple/spi.h @@ -213,7 +213,6 @@ typedef struct spi_dev { void spi_init(spi_dev *dev); -struct gpio_dev; /** * @brief Configure GPIO bit modes for use as a SPI port's pins. * diff --git a/STM32F4/cores/maple/libmaple/timer.c b/STM32F4/cores/maple/libmaple/timer.c index 83e9ace33..f8e55a185 100644 --- a/STM32F4/cores/maple/libmaple/timer.c +++ b/STM32F4/cores/maple/libmaple/timer.c @@ -44,7 +44,7 @@ /* Update only. */ #define NR_BAS_HANDLERS 1 -static timer_dev timer1 = { +timer_dev timer1 = { .regs = { .adv = TIMER1_BASE }, .clk_id = RCC_TIMER1, .type = TIMER_ADVANCED, @@ -53,7 +53,7 @@ static timer_dev timer1 = { /** Timer 1 device (advanced) */ timer_dev *TIMER1 = &timer1; -static timer_dev timer2 = { +timer_dev timer2 = { .regs = { .gen = TIMER2_BASE }, .clk_id = RCC_TIMER2, .type = TIMER_GENERAL, @@ -62,7 +62,7 @@ static timer_dev timer2 = { /** Timer 2 device (general-purpose) */ timer_dev *TIMER2 = &timer2; -static timer_dev timer3 = { +timer_dev timer3 = { .regs = { .gen = TIMER3_BASE }, .clk_id = RCC_TIMER3, .type = TIMER_GENERAL, @@ -71,7 +71,7 @@ static timer_dev timer3 = { /** Timer 3 device (general-purpose) */ timer_dev *TIMER3 = &timer3; -static timer_dev timer4 = { +timer_dev timer4 = { .regs = { .gen = TIMER4_BASE }, .clk_id = RCC_TIMER4, .type = TIMER_GENERAL, @@ -81,7 +81,7 @@ static timer_dev timer4 = { timer_dev *TIMER4 = &timer4; #ifdef STM32_HIGH_DENSITY -static timer_dev timer5 = { +timer_dev timer5 = { .regs = { .gen = TIMER5_BASE }, .clk_id = RCC_TIMER5, .type = TIMER_GENERAL, @@ -90,7 +90,7 @@ static timer_dev timer5 = { /** Timer 5 device (general-purpose) */ timer_dev *TIMER5 = &timer5; -static timer_dev timer6 = { +timer_dev timer6 = { .regs = { .bas = TIMER6_BASE }, .clk_id = RCC_TIMER6, .type = TIMER_BASIC, @@ -99,7 +99,7 @@ static timer_dev timer6 = { /** Timer 6 device (basic) */ timer_dev *TIMER6 = &timer6; -static timer_dev timer7 = { +timer_dev timer7 = { .regs = { .bas = TIMER7_BASE }, .clk_id = RCC_TIMER7, .type = TIMER_BASIC, @@ -108,7 +108,7 @@ static timer_dev timer7 = { /** Timer 7 device (basic) */ timer_dev *TIMER7 = &timer7; -static timer_dev timer8 = { +timer_dev timer8 = { .regs = { .adv = TIMER8_BASE }, .clk_id = RCC_TIMER8, .type = TIMER_ADVANCED, diff --git a/STM32F4/cores/maple/usb_serial.cpp b/STM32F4/cores/maple/usb_serial.cpp index cfeb382ea..fadcb91af 100644 --- a/STM32F4/cores/maple/usb_serial.cpp +++ b/STM32F4/cores/maple/usb_serial.cpp @@ -134,7 +134,7 @@ uint8 USBSerial::pending(void) { return usbGetPending(); } -uint8 USBSerial::isConnected(void) { +USBSerial::operator bool() { return usbIsConnected() && usbIsConfigured(); } diff --git a/STM32F4/cores/maple/usb_serial.h b/STM32F4/cores/maple/usb_serial.h index 301dc4baf..8eeed966a 100644 --- a/STM32F4/cores/maple/usb_serial.h +++ b/STM32F4/cores/maple/usb_serial.h @@ -59,7 +59,8 @@ class USBSerial : public Stream { uint8 getRTS(); uint8 getDTR(); - uint8 isConnected(); + operator bool(); + uint8 isConnected() { return (bool) *this; } uint8 pending(); void enableBlockingTx(void); @@ -67,9 +68,14 @@ class USBSerial : public Stream { }; extern USBSerial SerialUSB; +#define Serial SerialUSB -#endif +#else // _USB_SERIAL_H_ +#define Serial Serial1 -#endif +#endif // SERIAL_USB + + +#endif // _USB_SERIAL_H_ diff --git a/STM32F4/cores/maple/wirish.h b/STM32F4/cores/maple/wirish.h index d9a17bfdd..945e8fb94 100644 --- a/STM32F4/cores/maple/wirish.h +++ b/STM32F4/cores/maple/wirish.h @@ -58,7 +58,6 @@ #define false 0x0 #endif - #define lowByte(w) ((w) & 0xFF) #define highByte(w) (((w) >> 8) & 0xFF) #define bitRead(value, bit) (((value) >> (bit)) & 0x01) diff --git a/STM32F4/cores/maple/wirish_types.h b/STM32F4/cores/maple/wirish_types.h index aea86fbd8..6a8c85c3e 100644 --- a/STM32F4/cores/maple/wirish_types.h +++ b/STM32F4/cores/maple/wirish_types.h @@ -50,13 +50,11 @@ #ifdef BOARD_generic_f407v // restructure members to build consecutive pairs typedef struct stm32_pin_info { - gpio_dev *gpio_device; /**< Maple pin's GPIO device */ - uint8 gpio_bit; /**< Pin's GPIO port bit. */ - timer_dev *timer_device; /**< Pin's timer device, if any. */ + const gpio_dev * gpio_device; /**< Maple pin's GPIO device */ + timer_dev * timer_device; /**< Pin's timer device, if any. */ uint8 timer_channel; /**< Timer channel, or 0 if none. */ - const adc_dev *adc_device; /**< ADC device, if any. */ uint8 adc_channel; /**< Pin ADC channel, or ADCx if none. */ - uint8 filler; + const adc_dev *adc_device; /**< ADC device, if any. */ } stm32_pin_info; #else diff --git a/STM32F4/libraries/SPI/src/SPI.h b/STM32F4/libraries/SPI/src/SPI.h index 1b01d9b25..39a5a9eac 100644 --- a/STM32F4/libraries/SPI/src/SPI.h +++ b/STM32F4/libraries/SPI/src/SPI.h @@ -397,5 +397,4 @@ class SPIClass { }; -extern SPIClass SPI;//(1);// dummy params #endif diff --git a/STM32F4/variants/generic_f407v/black_f4.h.old b/STM32F4/variants/generic_f407v/black_f4.h.old deleted file mode 100644 index 20bb174c3..000000000 --- a/STM32F4/variants/generic_f407v/black_f4.h.old +++ /dev/null @@ -1,130 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file black_f4.h - * @author Marti Bolivar - * @brief Private include file for Maple Native in boards.h - * - * See maple.h for more information on these definitions. - */ - -#ifndef _BOARD_BLACK_F4_H_ -#define _BOARD_BLACK_F4_H_ - -#define Port2Pin(port, bit) ((port-'A')*16+bit) - -#define CYCLES_PER_MICROSECOND 168 - - -#undef STM32_PCLK1 -#undef STM32_PCLK2 -#define STM32_PCLK1 (CYCLES_PER_MICROSECOND*1000000/4) -#define STM32_PCLK2 (CYCLES_PER_MICROSECOND*1000000/2) - -#define SYSTICK_RELOAD_VAL (CYCLES_PER_MICROSECOND*1000-1) - -#define BOARD_USB_DM_PIN PA11 -#define BOARD_USB_DP_PIN PA12 - -#define BOARD_LED_PIN PA6 //Port2Pin('A', 6) -#define BOARD_LED2_PIN PA7 //Port2Pin('A', 7) -#define BOARD_BUTTON1_PIN PA0 //Port2Pin('A', 0) -#define BOARD_BUTTON2_PIN PE4 //Port2Pin('E', 4) -#define BOARD_BUTTON3_PIN PE3 //Port2Pin('E', 3) - -#define BOARD_NR_USARTS 5 -#define BOARD_USART1_TX_PIN PA9 //Port2Pin('A', 9) -#define BOARD_USART1_RX_PIN PA10 //Port2Pin('A',10) -#define BOARD_USART2_TX_PIN PA2 //Port2Pin('A', 2) -#define BOARD_USART2_RX_PIN PA3 //Port2Pin('A', 3) -#define BOARD_USART3_TX_PIN PB10 //Port2Pin('B',10) -#define BOARD_USART3_RX_PIN PB11 //Port2Pin('B',11) -#define BOARD_UART4_TX_PIN PA0 //Port2Pin('A', 0) -#define BOARD_UART4_RX_PIN PA1 //Port2Pin('A', 1) -#define BOARD_UART5_TX_PIN PC12 //Port2Pin('C',12) -#define BOARD_UART5_RX_PIN PD2 //Port2Pin('D', 2) - -#define BOARD_NR_SPI 3 -#define BOARD_SPI1_NSS_PIN PA4 //Port2Pin('A', 4) -#define BOARD_SPI1_SCK_PIN PA5 //Port2Pin('A', 5) -#define BOARD_SPI1_MISO_PIN PA6 //Port2Pin('A', 6) -#define BOARD_SPI1_MOSI_PIN PA7 //Port2Pin('A', 7) -#define BOARD_SPI1A_NSS_PIN PA15 //Port2Pin('A',15) -#define BOARD_SPI1A_SCK_PIN PB3 //Port2Pin('B', 3) -#define BOARD_SPI1A_MISO_PIN PB4 //Port2Pin('B', 4) -#define BOARD_SPI1A_MOSI_PIN PB5 //Port2Pin('B', 5) - -#define BOARD_SPI2_NSS_PIN PB12 //Port2Pin('B',12) -#define BOARD_SPI2_SCK_PIN PB13 //Port2Pin('B',13) -#define BOARD_SPI2_MISO_PIN PB14 //Port2Pin('B',14) -#define BOARD_SPI2_MOSI_PIN PB15 //Port2Pin('B',15) -#define BOARD_SPI2A_NSS_PIN PB9 //Port2Pin('B', 9) -#define BOARD_SPI2A_SCK_PIN PB10 //Port2Pin('B',10) -#define BOARD_SPI2A_MISO_PIN PC2 //Port2Pin('C', 2) -#define BOARD_SPI2A_MOSI_PIN pc3 //Port2Pin('C', 3) - -#define BOARD_SPI3_NSS_PIN PA15 //Port2Pin('A',15) -#define BOARD_SPI3_SCK_PIN PB3 //Port2Pin('B', 3) -#define BOARD_SPI3_MISO_PIN PB4 //Port2Pin('B', 4) -#define BOARD_SPI3_MOSI_PIN PB5 //Port2Pin('B', 5) -/* overlap with the SDIO interface for SD card -#define BOARD_SPI3A_NSS_PIN Port2Pin('A', 4) -#define BOARD_SPI3A_SCK_PIN Port2Pin('C',10) -#define BOARD_SPI3A_MISO_PIN Port2Pin('C',11) -#define BOARD_SPI3A_MOSI_PIN Port2Pin('C',12) -*/ -#define BOARD_SDIO_D0 PC8 //Port2Pin('C', 8) -#define BOARD_SDIO_D1 PC9 //Port2Pin('C', 9) -#define BOARD_SDIO_D2 PC10 //Port2Pin('C',10) -#define BOARD_SDIO_D3 PC11 //Port2Pin('C',11) -#define BOARD_SDIO_CK PC12 //Port2Pin('C',12) -#define BOARD_SDIO_CMD PD2 //Port2Pin('D', 2) - -#define BOARD_NR_GPIO_PINS 80 -#define BOARD_NR_PWM_PINS 22 -#define BOARD_NR_ADC_PINS 16 -#define BOARD_NR_USED_PINS 22 -#define BOARD_JTMS_SWDIO_PIN PA13 //Port2Pin('A',13) -#define BOARD_JTCK_SWCLK_PIN PA14 //Port2Pin('A',14) -#define BOARD_JTDI_PIN PA15 //Port2Pin('A',15) -#define BOARD_JTDO_PIN PB3 //Port2Pin('B', 3) -#define BOARD_NJTRST_PIN PB4 //Port2Pin('B', 4) - - -enum { -PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, -PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, -PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, -PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7,PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15, -PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15, -#if 0 // not available on LQFP100 package -PF0,PF1,PF2,PF3,PF4,PF5,PF6,PF7,PF8,PF9,PF10,PF11,PF12,PF13,PF14,PF15, -PG0,PG1,PG2,PG3,PG4,PG5,PG6,PG7,PG8,PG9,PG10,PG11,PG12,PG13,PG14,PG15 -#endif -}; - -#endif diff --git a/STM32F4/variants/generic_f407v/generic_f407v.cpp b/STM32F4/variants/generic_f407v/generic_f407v.cpp index a4a5ecbb4..c51ff9b55 100644 --- a/STM32F4/variants/generic_f407v/generic_f407v.cpp +++ b/STM32F4/variants/generic_f407v/generic_f407v.cpp @@ -34,12 +34,7 @@ #include "generic_f407v.h" -//#include "fsmc.h" -#include -#include -#include - -#include +#include "wirish_types.h" //static void initSRAMChip(void); /*****************************************************************************/ @@ -70,155 +65,6 @@ void boardInit(void) { return; } -/* -typedef struct stm32_pin_info { - gpio_dev *gpio_device; // Maple pin's GPIO device - uint8 gpio_bit; // Pin's GPIO port bit. - timer_dev *timer_device; // Pin's timer device, if any. - uint8 timer_channel; // Timer channel, or 0 if none. - const adc_dev *adc_device; // ADC device, if any. - uint8 adc_channel; // Pin ADC channel, or ADCx if none. -} stm32_pin_info; -*/ - -extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { // LQFP100 package pin - {GPIOA, 0, TIMER5, 1, ADC1, 0}, // D00/PA0 | 23 | USART2_CTS | UART4_TX | ETH_MII_CRS | TIM2_CH1_ETR | TIM5_CH1 | TIM8_ETR | ADC123_IN0/WKUP - {GPIOA, 1, TIMER5, 2, ADC1, 1}, // D01/PA1 | 24 | USART2_RTS | UART4_RX | ETH_RMII_REF_CLK | ETH_MII_RX_CLK | TIM5_CH2 | TIM2_CH2 | ADC123_IN1 - {GPIOA, 2, TIMER5, 3, ADC1, 2}, // D02/PA2 | 25 | USART2_TX | TIM5_CH3 | TIM9_CH1 | TIM2_CH3 | ETH_MDIO | ADC123_IN2 - {GPIOA, 3, TIMER5, 4, ADC1, 3}, // D03/PA3 | 26 | USART2_RX | TIM5_CH4 | TIM9_CH2 | TIM2_CH4 | OTG_HS_ULPI_D0 | ETH_MII_COL | ADC123_IN3 - {GPIOA, 4, NULL, 0, ADC1, 4}, // D04/PA4 | 29 | SPI1_NSS | SPI3_NSS | USART2_CK | DCMI_HSYNC | OTG_HS_SOF | I2S3_WS | ADC12_IN4 / DAC_OUT1 - {GPIOA, 5, NULL, 0, ADC1, 5}, // D05/PA5 | 30 | SPI1_SCK | OTG_HS_ULPI_CK | TIM2_CH1_ETR | TIM8_CH1N | ADC12_IN5 / DAC_OUT2 - {GPIOA, 6, NULL, 1, ADC1, 6}, // D06/PA6 | 31 | SPI1_MISO | TIM8_BKIN | TIM13_CH1 | DCMI_PIXCLK | TIM3_CH1 | TIM1_BKIN | ADC12_IN6 - {GPIOA, 7, NULL, 0, ADC1, 7}, // D07/PA7 | 32 | SPI1_MOSI | TIM8_CH1N | TIM14_CH1 | TIM3_CH2 | ETH_MII_RX_DV | TIM1_CH1N / ETH_RMII_CRS_DV | ADC12_IN7 - {GPIOA, 8, NULL, 0, NULL, ADCx}, // D08/PA8 | 67 | MCO1 | USART1_CK | TIM1_CH1 | I2C3_SCL | OTG_FS_SOF - {GPIOA, 9, NULL, 0, NULL, ADCx}, // D09/PA9 | 68 | USART1_TX | TIM1_CH2 | I2C3_SMBA | DCMI_D0 - {GPIOA, 10, NULL, 0, NULL, ADCx}, // D10/PA10 | 69 | USART1_RX | TIM1_CH3 | OTG_FS_ID | DCMI_D1 - {GPIOA, 11, NULL, 0, NULL, ADCx}, // D11/PA11 | 70 | USART1_CTS | CAN1_RX | TIM1_CH4 | OTG_FS_DM - {GPIOA, 12, NULL, 0, NULL, ADCx}, // D12/PA12 | 71 | USART1_RTS | CAN1_TX | TIM1_ETR | OTG_FS_DP - {GPIOA, 13, NULL, 0, NULL, ADCx}, // D13/PA13 | 72 | JTMS-SWDIO - {GPIOA, 14, NULL, 0, NULL, ADCx}, // D14/PA14 | 76 | JTCK-SWCLK - {GPIOA, 15, TIMER2, 1, NULL, ADCx}, // D15/PA15 | 77 | JTDI | SPI3_NSS | I2S3_WS | TIM2_CH1_ETR | SPI1_NSS - - {GPIOB, 0, TIMER3, 3, ADC1, 8}, // D16/PB0 | 35 | TIM3_CH3 | TIM8_CH2N | OTG_HS_ULPI_D1 | ETH_MII_RXD2 | TIM1_CH2N | ADC12_IN8 - {GPIOB, 1, TIMER3, 4, ADC1, 9}, // D17/PB1 | 36 | TIM3_CH4 | TIM8_CH3N | OTG_HS_ULPI_D2 | ETH_MII_RXD3 | TIM1_CH3N | ADC12_IN9 - {GPIOB, 2, NULL, 0, NULL, ADCx}, // D18/PB2 | 37 | BOOT1 - {GPIOB, 3, TIMER2, 2, NULL, ADCx}, // D19/PB3 | 89 | JTDO | TRACESWO | SPI3_SCK | I2S3_CK | TIM2_CH2 | SPI1_SCK - {GPIOB, 4, TIMER3, 1, NULL, ADCx}, // D20/PB4 | 90 | NJTRST | SPI3_MISO | TIM3_CH1 | SPI1_MISO | I2S3ext_SD - {GPIOB, 5, TIMER3, 2, NULL, ADCx}, // D21/PB5 | 91 | I2C1_SMBA | CAN2_RX | OTG_HS_ULPI_D7 | ETH_PPS_OUT | TIM3_CH2 | SPI1_MOSI | SPI3_MOSI | DCMI_D10 | I2S3_SD - {GPIOB, 6, NULL, 0, NULL, ADCx}, // D22/PB6 | 92 | I2C1_SCL | TIM4_CH1 | CAN2_TX | DCMI_D5 | USART1_TX - {GPIOB, 7, NULL, 0, NULL, ADCx}, // D23/PB7 | 93 | I2C1_SDA | FSMC_NL | DCMI_VSYNC | USART1_RX | TIM4_CH2 - {GPIOB, 8, NULL, 0, NULL, ADCx}, // D24/PB8 | 95 | TIM4_CH3 | SDIO_D4 | TIM10_CH1 | DCMI_D6 | ETH_MII_TXD3 | I2C1_SCL | CAN1_RX - {GPIOB, 9, NULL, 0, NULL, ADCx}, // D25/PB9 | 96 | SPI2_NSS | I2S2_WS | TIM4_CH4 | TIM11_CH1 | SDIO_D5 | DCMI_D7 | I2C1_SDA | CAN1_TX - {GPIOB, 10, NULL, 0, NULL, ADCx}, // D26/PB10 | 47 | SPI2_SCK | I2S2_CK | I2C2_SCL | USART3_TX | OTG_HS_ULPI_D3 | ETH_MII_RX_ER | TIM2_CH3 - {GPIOB, 11, NULL, 0, NULL, ADCx}, // D27/PB11 | 48 | I2C2_SDA | USART3_RX | OTG_HS_ULPI_D4 | ETH_RMII_TX_EN | ETH_MII_TX_EN | TIM2_CH4 - {GPIOB, 12, NULL, 0, NULL, ADCx}, // D28/PB12 | 51 | SPI2_NSS | I2S2_WS | I2C2_SMBA | USART3_CK | TIM1_BKIN | CAN2_RX | OTG_HS_ULPI_D5 | ETH_RMII_TXD0 | ETH_MII_TXD0 | OTG_HS_ID - {GPIOB, 13, NULL, 0, NULL, ADCx}, // D29/PB13 | 52 | SPI2_SCK | I2S2_CK | USART3_CTS | TIM1_CH1N | CAN2_TX | OTG_HS_ULPI_D6 | ETH_RMII_TXD1 | ETH_MII_TXD1 - {GPIOB, 14, NULL, 0, NULL, ADCx}, // D30/PB14 | 53 | SPI2_MISO | TIM1_CH2N | TIM12_CH1 | OTG_HS_DM | USART3_RTS | TIM8_CH2N | I2S2ext_SD - {GPIOB, 15, NULL, 0, NULL, ADCx}, // D31/PB15 | 54 | SPI2_MOSI | I2S2_SD | TIM1_CH3N | TIM8_CH3N | TIM12_CH2 | OTG_HS_DP - - {GPIOC, 0, NULL, 0, ADC1, 10}, // D32/PC0 | 15 | OTG_HS_ULPI_STP | ADC123_IN10 - {GPIOC, 1, NULL, 0, ADC1, 11}, // D33/PC1 | 16 | ETH_MDC | ADC123_IN11 - {GPIOC, 2, NULL, 0, ADC1, 12}, // D34/PC2 | 17 | SPI2_MISO | OTG_HS_ULPI_DIR | ETH_MII_TXD2 | I2S2ext_SD | ADC123_IN12 - {GPIOC, 3, NULL, 0, ADC1, 13}, // D35/PC3 | 18 | SPI2_MOSI | I2S2_SD | OTG_HS_ULPI_NXT | ETH_MII_TX_CLK | ADC123_IN13 - {GPIOC, 4, NULL, 0, ADC1, 14}, // D36/PC4 | 33 | ETH_RMII_RX_D0 | ETH_MII_RX_D0 | ADC12_IN14 - {GPIOC, 5, NULL, 0, ADC1, 15}, // D37/PC5 | 34 | ETH_RMII_RX_D1 | ETH_MII_RX_D1 | ADC12_IN15 - {GPIOC, 6, TIMER8, 1, NULL, ADCx}, // D38/PC6 | 63 | I2S2_MCK | TIM8_CH1/SDIO_D6 | USART6_TX | DCMI_D0/TIM3_CH1 - {GPIOC, 7, TIMER8, 2, NULL, ADCx}, // D39/PC7 | 64 | I2S3_MCK | TIM8_CH2/SDIO_D7 | USART6_RX | DCMI_D1/TIM3_CH2 - {GPIOC, 8, TIMER8, 3, NULL, ADCx}, // D40/PC8 | 65 | TIM8_CH3 | SDIO_D0 | TIM3_CH3 | USART6_CK | DCMI_D2 - {GPIOC, 9, TIMER8, 4, NULL, ADCx}, // D41/PC9 | 66 | I2S_CKIN | MCO2 | TIM8_CH4 | SDIO_D1 | I2C3_SDA | DCMI_D3 | TIM3_CH4 - {GPIOC, 10, NULL, 0, NULL, ADCx}, // D42/PC10 | 78 | SPI3_SCK | I2S3_CK | UART4_TX | SDIO_D2 | DCMI_D8 | USART3_TX - {GPIOC, 11, NULL, 0, NULL, ADCx}, // D43/PC11 | 79 | UART4_RX | SPI3_MISO | SDIO_D3 | DCMI_D4 | USART3_RX | I2S3ext_SD - {GPIOC, 12, NULL, 0, NULL, ADCx}, // D44/PC12 | 80 | UART5_TX | SDIO_CK | DCMI_D9 | SPI3_MOSI | I2S3_SD | USART3_CK - {GPIOC, 13, NULL, 0, NULL, ADCx}, // D45/PC13 | 7 | RTC_OUT, RTC_TAMP1, RTC_TS - {GPIOC, 14, NULL, 0, NULL, ADCx}, // D46/PC14 | 8 | OSC32_IN - {GPIOC, 15, NULL, 0, NULL, ADCx}, // D47/PC15 | 9 | OSC32_OUT - - {GPIOD, 0, NULL, 0, NULL, ADCx}, // D48/PD0 | 81 | FSMC_D2 | CAN1_RX - {GPIOD, 1, NULL, 0, NULL, ADCx}, // D49/PD1 | 82 | FSMC_D3 | CAN1_TX - {GPIOD, 2, NULL, 0, NULL, ADCx}, // D50/PD2 | 83 | TIM3_ETR | UART5_RX | SDIO_CMD | DCMI_D11 - {GPIOD, 3, NULL, 0, NULL, ADCx}, // D51/PD3 | 84 | FSMC_CLK | USART2_CTS - {GPIOD, 4, NULL, 0, NULL, ADCx}, // D52/PD4 | 85 | FSMC_NOE | USART2_RTS - {GPIOD, 5, NULL, 0, NULL, ADCx}, // D53/PD5 | 86 | FSMC_NWE | USART2_TX - {GPIOD, 6, NULL, 0, NULL, ADCx}, // D54/PD6 | 87 | FSMC_NWAIT | USART2_RX - {GPIOD, 7, NULL, 0, NULL, ADCx}, // D55/PD7 | 88 | USART2_CK | FSMC_NE1 | FSMC_NCE2 - {GPIOD, 8, NULL, 0, NULL, ADCx}, // D56/PD8 | 55 | FSMC_D13 | USART3_TX - {GPIOD, 9, NULL, 0, NULL, ADCx}, // D57/PD9 | 56 | FSMC_D14 | USART3_RX - {GPIOD, 10, NULL, 0, NULL, ADCx}, // D58/PD10 | 57 | FSMC_D15 | USART3_CK - {GPIOD, 11, NULL, 0, NULL, ADCx}, // D59/PD11 | 58 | FSMC_CLE | FSMC_A16 | USART3_CTS - {GPIOD, 12, TIMER4, 1, NULL, ADCx}, // D60/PD12 | 59 | FSMC_ALE | FSMC_A17 | TIM4_CH1 | USART3_RTS // remap in - {GPIOD, 13, TIMER4, 2, NULL, ADCx}, // D61/PD13 | 60 | FSMC_A18 | TIM4_CH2 // remap in - {GPIOD, 14, TIMER4, 3, NULL, ADCx}, // D62/PD14 | 61 | FSMC_D0 | TIM4_CH3 // remap in - {GPIOD, 15, TIMER4, 4, NULL, ADCx}, // D63/PD15 | 62 | FSMC_D1 | TIM4_CH4 // remap in - - {GPIOE, 0, NULL, 0, NULL, ADCx}, // D64/PE0 | 97 | TIM4_ETR | FSMC_NBL0 | DCMI_D2 - {GPIOE, 1, NULL, 0, NULL, ADCx}, // D65/PE1 | 98 | FSMC_NBL1 | DCMI_D3 - {GPIOE, 2, NULL, 0, NULL, ADCx}, // D66/PE2 | 1 | TRACECLK | FSMC_A23 | ETH_MII_TXD3 - {GPIOE, 3, NULL, 0, NULL, ADCx}, // D67/PE3 | 2 | TRACED0 | FSMC_A19 - {GPIOE, 4, NULL, 0, NULL, ADCx}, // D68/PE4 | 3 | TRACED1 | FSMC_A20 | DCMI_D4 - {GPIOE, 5, NULL, 0, NULL, ADCx}, // D69/PE5 | 4 | TRACED2 | FSMC_A21 | TIM9_CH1 / DCMI_D6 - {GPIOE, 6, NULL, 0, NULL, ADCx}, // D70/PE6 | 5 | TRACED3 | FSMC_A22 | TIM9_CH2 / DCMI_D7 - {GPIOE, 7, NULL, 0, NULL, ADCx}, // D71/PE7 | 38 | FSMC_D4 | TIM1_ETR - {GPIOE, 8, NULL, 0, NULL, ADCx}, // D72/PE8 | 39 | FSMC_D5 | TIM1_CH1N - {GPIOE, 9, TIMER1, 1, NULL, ADCx}, // D73/PE9 | 40 | FSMC_D6 | TIM1_CH1 // remap in - {GPIOE, 10, NULL, 0, NULL, ADCx}, // D74/PE10 | 41 | FSMC_D7 | TIM1_CH2N - {GPIOE, 11, TIMER1, 2, NULL, ADCx}, // D75/PE11 | 42 | FSMC_D8 | TIM1_CH2 // remap in - {GPIOE, 12, NULL, 0, NULL, ADCx}, // D76/PE12 | 43 | FSMC_D9 | TIM1_CH3N - {GPIOE, 13, TIMER1, 3, NULL, ADCx}, // D77/PE13 | 44 | FSMC_D10 | TIM1_CH3 // remap in - {GPIOE, 14, TIMER1, 4, NULL, ADCx}, // D78/PE14 | 45 | FSMC_D11 | TIM1_CH4 // remap in - {GPIOE, 15, NULL, 0, NULL, ADCx}, // D79/PE15 | 46 | FSMC_D12 | TIM1_BKIN -#if 0 - {GPIOF, 0, NULL, 0, NULL, ADCx}, // D80/PF0 - {GPIOF, 1, NULL, 0, NULL, ADCx}, // D81/PF1 - {GPIOF, 2, NULL, 0, NULL, ADCx}, // D82/PF2 - {GPIOF, 3, NULL, 0, NULL, ADCx}, // D83/PF3 - {GPIOF, 4, NULL, 0, NULL, ADCx}, // D84/PF4 - {GPIOF, 5, NULL, 0, NULL, ADCx}, // D85/PF5 - {GPIOF, 6, NULL, 0, NULL, ADCx}, // D86/PF6 - {GPIOF, 7, NULL, 0, NULL, ADCx}, // D87/PF7 - {GPIOF, 8, NULL, 0, NULL, ADCx}, // D88/PF8 - {GPIOF, 9, NULL, 0, NULL, ADCx}, // D89/PF9 - {GPIOF, 10, NULL, 0, NULL, ADCx}, // D90/PF10 - {GPIOF, 11, NULL, 0, NULL, ADCx}, // D91/PF11 - {GPIOF, 12, NULL, 0, NULL, ADCx}, // D92/PF12 - {GPIOF, 13, NULL, 0, NULL, ADCx}, // D93/PF13 - {GPIOF, 14, NULL, 0, NULL, ADCx}, // D94/PF14 - {GPIOF, 15, NULL, 0, NULL, ADCx}, // D95/PF15 - - {GPIOG, 0, NULL, 0, NULL, ADCx}, // D96/PG0 - {GPIOG, 1, NULL, 0, NULL, ADCx}, // D97/PG1 - {GPIOG, 2, NULL, 0, NULL, ADCx}, // D98/PG2 - {GPIOG, 3, NULL, 0, NULL, ADCx}, // D99/PG3 - {GPIOG, 4, NULL, 0, NULL, ADCx}, // D100/PG4 - {GPIOG, 5, NULL, 0, NULL, ADCx}, // D101/PG5 - {GPIOG, 6, NULL, 0, NULL, ADCx}, // D102/PG6 - {GPIOG, 7, NULL, 0, NULL, ADCx}, // D103/PG7 - {GPIOG, 8, NULL, 0, NULL, ADCx}, // D104/PG8 - {GPIOG, 9, NULL, 0, NULL, ADCx}, // D105/PG9 - {GPIOG, 10, NULL, 0, NULL, ADCx}, // D106/PG10 - {GPIOG, 11, NULL, 0, NULL, ADCx}, // D107/PG11 - {GPIOG, 12, NULL, 0, NULL, ADCx}, // D108/PG12 - {GPIOG, 13, NULL, 0, NULL, ADCx}, // D109/PG13 - {GPIOG, 14, NULL, 0, NULL, ADCx}, // D110/PG14 - {GPIOG, 15, NULL, 0, NULL, ADCx} // D111/PG15 -#endif -}; -/* to be defined -extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { - 0, 1, 2, 3, 15, 16, 17, 19, 20, 21, 38, 39, 49, 41, 60, 61, 62, 63, 73, 75, 77, 78 -}; -*/ -extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = { - PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PB0, PB1, PC0, PC1, PC2, PC3, PC4, PC5 -}; - -extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { - BOARD_LED_PIN, BOARD_LED2_PIN, BOARD_BUTTON1_PIN, BOARD_BUTTON2_PIN, BOARD_BUTTON2_PIN, - BOARD_JTMS_SWDIO_PIN, BOARD_JTCK_SWCLK_PIN, - FLASH_CS_PIN, FLASH_CLK_PIN, FLASH_DO_PIN, FLASH_DI_PIN, - NRF24_CE_PIN, NRF24_CS_PIN, NRF24_IRQ_PIN, - BOARD_SDIO_D0, BOARD_SDIO_D1, BOARD_SDIO_D2, BOARD_SDIO_D3, BOARD_SDIO_CK, BOARD_SDIO_CMD, - USB_DM_PIN, USB_DP_PIN -}; /* static void initSRAMChip(void) { fsmc_nor_psram_reg_map *regs = FSMC_NOR_PSRAM1_BASE; diff --git a/STM32F4/variants/generic_f407v/pin_map.c b/STM32F4/variants/generic_f407v/pin_map.c new file mode 100644 index 000000000..58eeca4be --- /dev/null +++ b/STM32F4/variants/generic_f407v/pin_map.c @@ -0,0 +1,214 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file generic_f407v.cpp + * @author ala42 + * @brief generic_f407v board file. + */ + +#ifdef BOARD_generic_f407v + +#ifdef __cplusplus +extern "C"{ +#endif + +//#include "generic_f407v.h" + +//#include "fsmc.h" +#include +#include +#include + +#include + +extern timer_dev timer1; +extern timer_dev timer2; +extern timer_dev timer3; +extern timer_dev timer4; +extern timer_dev timer5; +extern timer_dev timer6; +extern timer_dev timer7; +extern timer_dev timer8; +/* +typedef struct stm32_pin_info { + gpio_dev *gpio_device; // Maple pin's GPIO device + uint8 gpio_bit; // Pin's GPIO port bit. + timer_dev *timer_device; // Pin's timer device, if any. + uint8 timer_channel; // Timer channel, or 0 if none. + const adc_dev *adc_device; // ADC device, if any. + uint8 adc_channel; // Pin ADC channel, or ADCx if none. +} stm32_pin_info; +*/ +const stm32_pin_info PIN_MAP1[] = { // LQFP100 package pin + {&GPIOA, &timer5, 1, 0, &ADC1}, // D00/PA0 | 23 | USART2_CTS | UART4_TX | ETH_MII_CRS | TIM2_CH1_ETR | TIM5_CH1 | TIM8_ETR | ADC123_IN0/WKUP +}; + +const stm32_pin_info PIN_MAP[] = { // LQFP100 package pin + {&GPIOA, &timer5, 1, 0, &ADC1}, // D00/PA0 | 23 | USART2_CTS | UART4_TX | ETH_MII_CRS | TIM2_CH1_ETR | TIM5_CH1 | TIM8_ETR | ADC123_IN0/WKUP + {&GPIOA, &timer5, 2, 1, &ADC1}, // D01/PA1 | 24 | USART2_RTS | UART4_RX | ETH_RMII_REF_CLK | ETH_MII_RX_CLK | TIM5_CH2 | TIM2_CH2 | ADC123_IN1 + {&GPIOA, &timer5, 3, 2, &ADC1}, // D02/PA2 | 25 | USART2_TX | TIM5_CH3 | TIM9_CH1 | TIM2_CH3 | ETH_MDIO | ADC123_IN2 + {&GPIOA, &timer5, 4, 3, &ADC1}, // D03/PA3 | 26 | USART2_RX | TIM5_CH4 | TIM9_CH2 | TIM2_CH4 | OTG_HS_ULPI_D0 | ETH_MII_COL | ADC123_IN3 + {&GPIOA, NULL, 0, 4, &ADC1}, // D04/PA4 | 29 | SPI1_NSS | SPI3_NSS | USART2_CK | DCMI_HSYNC | OTG_HS_SOF | I2S3_WS | ADC12_IN4 / DAC_OUT1 + {&GPIOA, NULL, 0, 5, &ADC1}, // D05/PA5 | 30 | SPI1_SCK | OTG_HS_ULPI_CK | TIM2_CH1_ETR | TIM8_CH1N | ADC12_IN5 / DAC_OUT2 + {&GPIOA, NULL, 1, 6, &ADC1}, // D06/PA6 | 31 | SPI1_MISO | TIM8_BKIN | TIM13_CH1 | DCMI_PIXCLK | TIM3_CH1 | TIM1_BKIN | ADC12_IN6 + {&GPIOA, NULL, 0, 7, &ADC1}, // D07/PA7 | 32 | SPI1_MOSI | TIM8_CH1N | TIM14_CH1 | TIM3_CH2 | ETH_MII_RX_DV | TIM1_CH1N / ETH_RMII_CRS_DV | ADC12_IN7 + {&GPIOA, NULL, 0, ADCx, NULL}, // D08/PA8 | 67 | MCO1 | USART1_CK | TIM1_CH1 | I2C3_SCL | OTG_FS_SOF + {&GPIOA, NULL, 0, ADCx, NULL}, // D09/PA9 | 68 | USART1_TX | TIM1_CH2 | I2C3_SMBA | DCMI_D0 + {&GPIOA, NULL, 0, ADCx, NULL}, // D10/PA10 | 69 | USART1_RX | TIM1_CH3 | OTG_FS_ID | DCMI_D1 + {&GPIOA, NULL, 0, ADCx, NULL}, // D11/PA11 | 70 | USART1_CTS | CAN1_RX | TIM1_CH4 | OTG_FS_DM + {&GPIOA, NULL, 0, ADCx, NULL}, // D12/PA12 | 71 | USART1_RTS | CAN1_TX | TIM1_ETR | OTG_FS_DP + {&GPIOA, NULL, 0, ADCx, NULL}, // D13/PA13 | 72 | JTMS-SWDIO + {&GPIOA, NULL, 0, ADCx, NULL}, // D14/PA14 | 76 | JTCK-SWCLK + {&GPIOA, &timer2, 1, ADCx, NULL}, // D15/PA15 | 77 | JTDI | SPI3_NSS | I2S3_WS | TIM2_CH1_ETR | SPI1_NSS + + {&GPIOB, &timer3, 3, 8, &ADC1}, // D16/PB0 | 35 | TIM3_CH3 | TIM8_CH2N | OTG_HS_ULPI_D1 | ETH_MII_RXD2 | TIM1_CH2N | ADC12_IN8 + {&GPIOB, &timer3, 4, 9, &ADC1}, // D17/PB1 | 36 | TIM3_CH4 | TIM8_CH3N | OTG_HS_ULPI_D2 | ETH_MII_RXD3 | TIM1_CH3N | ADC12_IN9 + {&GPIOB, NULL, 0, ADCx, NULL}, // D18/PB2 | 37 | BOOT1 + {&GPIOB, &timer2, 2, ADCx, NULL}, // D19/PB3 | 89 | JTDO | TRACESWO | SPI3_SCK | I2S3_CK | TIM2_CH2 | SPI1_SCK + {&GPIOB, &timer3, 1, ADCx, NULL}, // D20/PB4 | 90 | NJTRST | SPI3_MISO | TIM3_CH1 | SPI1_MISO | I2S3ext_SD + {&GPIOB, &timer3, 2, ADCx, NULL}, // D21/PB5 | 91 | I2C1_SMBA | CAN2_RX | OTG_HS_ULPI_D7 | ETH_PPS_OUT | TIM3_CH2 | SPI1_MOSI | SPI3_MOSI | DCMI_D10 | I2S3_SD + {&GPIOB, NULL, 0, ADCx, NULL}, // D22/PB6 | 92 | I2C1_SCL | TIM4_CH1 | CAN2_TX | DCMI_D5 | USART1_TX + {&GPIOB, NULL, 0, ADCx, NULL}, // D23/PB7 | 93 | I2C1_SDA | FSMC_NL | DCMI_VSYNC | USART1_RX | TIM4_CH2 + {&GPIOB, NULL, 0, ADCx, NULL}, // D24/PB8 | 95 | TIM4_CH3 | SDIO_D4 | TIM10_CH1 | DCMI_D6 | ETH_MII_TXD3 | I2C1_SCL | CAN1_RX + {&GPIOB, NULL, 0, ADCx, NULL}, // D25/PB9 | 96 | SPI2_NSS | I2S2_WS | TIM4_CH4 | TIM11_CH1 | SDIO_D5 | DCMI_D7 | I2C1_SDA | CAN1_TX + {&GPIOB, NULL, 0, ADCx, NULL}, // D26/PB10 | 47 | SPI2_SCK | I2S2_CK | I2C2_SCL | USART3_TX | OTG_HS_ULPI_D3 | ETH_MII_RX_ER | TIM2_CH3 + {&GPIOB, NULL, 0, ADCx, NULL}, // D27/PB11 | 48 | I2C2_SDA | USART3_RX | OTG_HS_ULPI_D4 | ETH_RMII_TX_EN | ETH_MII_TX_EN | TIM2_CH4 + {&GPIOB, NULL, 0, ADCx, NULL}, // D28/PB12 | 51 | SPI2_NSS | I2S2_WS | I2C2_SMBA | USART3_CK | TIM1_BKIN | CAN2_RX | OTG_HS_ULPI_D5 | ETH_RMII_TXD0 | ETH_MII_TXD0 | OTG_HS_ID + {&GPIOB, NULL, 0, ADCx, NULL}, // D29/PB13 | 52 | SPI2_SCK | I2S2_CK | USART3_CTS | TIM1_CH1N | CAN2_TX | OTG_HS_ULPI_D6 | ETH_RMII_TXD1 | ETH_MII_TXD1 + {&GPIOB, NULL, 0, ADCx, NULL}, // D30/PB14 | 53 | SPI2_MISO | TIM1_CH2N | TIM12_CH1 | OTG_HS_DM | USART3_RTS | TIM8_CH2N | I2S2ext_SD + {&GPIOB, NULL, 0, ADCx, NULL}, // D31/PB15 | 54 | SPI2_MOSI | I2S2_SD | TIM1_CH3N | TIM8_CH3N | TIM12_CH2 | OTG_HS_DP + + {&GPIOC, NULL, 0, 10, &ADC1}, // D32/PC0 | 15 | OTG_HS_ULPI_STP | ADC123_IN10 + {&GPIOC, NULL, 0, 11, &ADC1}, // D33/PC1 | 16 | ETH_MDC | ADC123_IN11 + {&GPIOC, NULL, 0, 12, &ADC1}, // D34/PC2 | 17 | SPI2_MISO | OTG_HS_ULPI_DIR | ETH_MII_TXD2 | I2S2ext_SD | ADC123_IN12 + {&GPIOC, NULL, 0, 13, &ADC1}, // D35/PC3 | 18 | SPI2_MOSI | I2S2_SD | OTG_HS_ULPI_NXT | ETH_MII_TX_CLK | ADC123_IN13 + {&GPIOC, NULL, 0, 14, &ADC1}, // D36/PC4 | 33 | ETH_RMII_RX_D0 | ETH_MII_RX_D0 | ADC12_IN14 + {&GPIOC, NULL, 0, 15, &ADC1}, // D37/PC5 | 34 | ETH_RMII_RX_D1 | ETH_MII_RX_D1 | ADC12_IN15 + {&GPIOC, &timer8, 1, ADCx, NULL}, // D38/PC6 | 63 | I2S2_MCK | TIM8_CH1/SDIO_D6 | USART6_TX | DCMI_D0/TIM3_CH1 + {&GPIOC, &timer8, 2, ADCx, NULL}, // D39/PC7 | 64 | I2S3_MCK | TIM8_CH2/SDIO_D7 | USART6_RX | DCMI_D1/TIM3_CH2 + {&GPIOC, &timer8, 3, ADCx, NULL}, // D40/PC8 | 65 | TIM8_CH3 | SDIO_D0 | TIM3_CH3 | USART6_CK | DCMI_D2 + {&GPIOC, &timer8, 4, ADCx, NULL}, // D41/PC9 | 66 | I2S_CKIN | MCO2 | TIM8_CH4 | SDIO_D1 | I2C3_SDA | DCMI_D3 | TIM3_CH4 + {&GPIOC, NULL, 0, ADCx, NULL}, // D42/PC10 | 78 | SPI3_SCK | I2S3_CK | UART4_TX | SDIO_D2 | DCMI_D8 | USART3_TX + {&GPIOC, NULL, 0, ADCx, NULL}, // D43/PC11 | 79 | UART4_RX | SPI3_MISO | SDIO_D3 | DCMI_D4 | USART3_RX | I2S3ext_SD + {&GPIOC, NULL, 0, ADCx, NULL}, // D44/PC12 | 80 | UART5_TX | SDIO_CK | DCMI_D9 | SPI3_MOSI | I2S3_SD | USART3_CK + {&GPIOC, NULL, 0, ADCx, NULL}, // D45/PC13 | 7 | RTC_OUT, RTC_TAMP1, RTC_TS + {&GPIOC, NULL, 0, ADCx, NULL}, // D46/PC14 | 8 | OSC32_IN + {&GPIOC, NULL, 0, ADCx, NULL}, // D47/PC15 | 9 | OSC32_OUT + + {&GPIOD, NULL, 0, ADCx, NULL}, // D48/PD0 | 81 | FSMC_D2 | CAN1_RX + {&GPIOD, NULL, 0, ADCx, NULL}, // D49/PD1 | 82 | FSMC_D3 | CAN1_TX + {&GPIOD, NULL, 0, ADCx, NULL}, // D50/PD2 | 83 | TIM3_ETR | UART5_RX | SDIO_CMD | DCMI_D11 + {&GPIOD, NULL, 0, ADCx, NULL}, // D51/PD3 | 84 | FSMC_CLK | USART2_CTS + {&GPIOD, NULL, 0, ADCx, NULL}, // D52/PD4 | 85 | FSMC_NOE | USART2_RTS + {&GPIOD, NULL, 0, ADCx, NULL}, // D53/PD5 | 86 | FSMC_NWE | USART2_TX + {&GPIOD, NULL, 0, ADCx, NULL}, // D54/PD6 | 87 | FSMC_NWAIT | USART2_RX + {&GPIOD, NULL, 0, ADCx, NULL}, // D55/PD7 | 88 | USART2_CK | FSMC_NE1 | FSMC_NCE2 + {&GPIOD, NULL, 0, ADCx, NULL}, // D56/PD8 | 55 | FSMC_D13 | USART3_TX + {&GPIOD, NULL, 0, ADCx, NULL}, // D57/PD9 | 56 | FSMC_D14 | USART3_RX + {&GPIOD, NULL, 0, ADCx, NULL}, // D58/PD10 | 57 | FSMC_D15 | USART3_CK + {&GPIOD, NULL, 0, ADCx, NULL}, // D59/PD11 | 58 | FSMC_CLE | FSMC_A16 | USART3_CTS + {&GPIOD, &timer4, 1, ADCx, NULL}, // D60/PD12 | 59 | FSMC_ALE | FSMC_A17 | TIM4_CH1 | USART3_RTS // remap in + {&GPIOD, &timer4, 2, ADCx, NULL}, // D61/PD13 | 60 | FSMC_A18 | TIM4_CH2 // remap in + {&GPIOD, &timer4, 3, ADCx, NULL}, // D62/PD14 | 61 | FSMC_D0 | TIM4_CH3 // remap in + {&GPIOD, &timer4, 4, ADCx, NULL}, // D63/PD15 | 62 | FSMC_D1 | TIM4_CH4 // remap in + + {&GPIOE, NULL, 0, ADCx, NULL}, // D64/PE0 | 97 | TIM4_ETR | FSMC_NBL0 | DCMI_D2 + {&GPIOE, NULL, 0, ADCx, NULL}, // D65/PE1 | 98 | FSMC_NBL1 | DCMI_D3 + {&GPIOE, NULL, 0, ADCx, NULL}, // D66/PE2 | 1 | TRACECLK | FSMC_A23 | ETH_MII_TXD3 + {&GPIOE, NULL, 0, ADCx, NULL}, // D67/PE3 | 2 | TRACED0 | FSMC_A19 + {&GPIOE, NULL, 0, ADCx, NULL}, // D68/PE4 | 3 | TRACED1 | FSMC_A20 | DCMI_D4 + {&GPIOE, NULL, 0, ADCx, NULL}, // D69/PE5 | 4 | TRACED2 | FSMC_A21 | TIM9_CH1 / DCMI_D6 + {&GPIOE, NULL, 0, ADCx, NULL}, // D70/PE6 | 5 | TRACED3 | FSMC_A22 | TIM9_CH2 / DCMI_D7 + {&GPIOE, NULL, 0, ADCx, NULL}, // D71/PE7 | 38 | FSMC_D4 | TIM1_ETR + {&GPIOE, NULL, 0, ADCx, NULL}, // D72/PE8 | 39 | FSMC_D5 | TIM1_CH1N + {&GPIOE, &timer1, 1, ADCx, NULL}, // D73/PE9 | 40 | FSMC_D6 | TIM1_CH1 // remap in + {&GPIOE, NULL, 0, ADCx, NULL}, // D74/PE10 | 41 | FSMC_D7 | TIM1_CH2N + {&GPIOE, &timer1, 2, ADCx, NULL}, // D75/PE11 | 42 | FSMC_D8 | TIM1_CH2 // remap in + {&GPIOE, NULL, 0, ADCx, NULL}, // D76/PE12 | 43 | FSMC_D9 | TIM1_CH3N + {&GPIOE, &timer1, 3, ADCx, NULL}, // D77/PE13 | 44 | FSMC_D10 | TIM1_CH3 // remap in + {&GPIOE, &timer1, 4, ADCx, NULL}, // D78/PE14 | 45 | FSMC_D11 | TIM1_CH4 // remap in + {&GPIOE, NULL, 0, ADCx, NULL}, // D79/PE15 | 46 | FSMC_D12 | TIM1_BKIN +#if 0 + {GPIOF, 0, NULL, 0, NULL, ADCx}, // D80/PF0 + {GPIOF, 1, NULL, 0, NULL, ADCx}, // D81/PF1 + {GPIOF, 2, NULL, 0, NULL, ADCx}, // D82/PF2 + {GPIOF, 3, NULL, 0, NULL, ADCx}, // D83/PF3 + {GPIOF, 4, NULL, 0, NULL, ADCx}, // D84/PF4 + {GPIOF, 5, NULL, 0, NULL, ADCx}, // D85/PF5 + {GPIOF, 6, NULL, 0, NULL, ADCx}, // D86/PF6 + {GPIOF, 7, NULL, 0, NULL, ADCx}, // D87/PF7 + {GPIOF, 8, NULL, 0, NULL, ADCx}, // D88/PF8 + {GPIOF, 9, NULL, 0, NULL, ADCx}, // D89/PF9 + {GPIOF, 10, NULL, 0, NULL, ADCx}, // D90/PF10 + {GPIOF, 11, NULL, 0, NULL, ADCx}, // D91/PF11 + {GPIOF, 12, NULL, 0, NULL, ADCx}, // D92/PF12 + {GPIOF, 13, NULL, 0, NULL, ADCx}, // D93/PF13 + {GPIOF, 14, NULL, 0, NULL, ADCx}, // D94/PF14 + {GPIOF, 15, NULL, 0, NULL, ADCx}, // D95/PF15 + + {GPIOG, 0, NULL, 0, NULL, ADCx}, // D96/PG0 + {GPIOG, 1, NULL, 0, NULL, ADCx}, // D97/PG1 + {GPIOG, 2, NULL, 0, NULL, ADCx}, // D98/PG2 + {GPIOG, 3, NULL, 0, NULL, ADCx}, // D99/PG3 + {GPIOG, 4, NULL, 0, NULL, ADCx}, // D100/PG4 + {GPIOG, 5, NULL, 0, NULL, ADCx}, // D101/PG5 + {GPIOG, 6, NULL, 0, NULL, ADCx}, // D102/PG6 + {GPIOG, 7, NULL, 0, NULL, ADCx}, // D103/PG7 + {GPIOG, 8, NULL, 0, NULL, ADCx}, // D104/PG8 + {GPIOG, 9, NULL, 0, NULL, ADCx}, // D105/PG9 + {GPIOG, 10, NULL, 0, NULL, ADCx}, // D106/PG10 + {GPIOG, 11, NULL, 0, NULL, ADCx}, // D107/PG11 + {GPIOG, 12, NULL, 0, NULL, ADCx}, // D108/PG12 + {GPIOG, 13, NULL, 0, NULL, ADCx}, // D109/PG13 + {GPIOG, 14, NULL, 0, NULL, ADCx}, // D110/PG14 + {GPIOG, 15, NULL, 0, NULL, ADCx} // D111/PG15 +#endif +}; +/* to be defined +extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { + 0, 1, 2, 3, 15, 16, 17, 19, 20, 21, 38, 39, 49, 41, 60, 61, 62, 63, 73, 75, 77, 78 +}; +*/ +const uint8 boardADCPins[BOARD_NR_ADC_PINS] = { + PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PB0, PB1, PC0, PC1, PC2, PC3, PC4, PC5 +}; + +const uint8 boardUsedPins[BOARD_NR_USED_PINS] = { + BOARD_LED_PIN, BOARD_LED2_PIN, BOARD_BUTTON1_PIN, BOARD_BUTTON2_PIN, BOARD_BUTTON2_PIN, + BOARD_JTMS_SWDIO_PIN, BOARD_JTCK_SWCLK_PIN, + FLASH_CS_PIN, FLASH_CLK_PIN, FLASH_DO_PIN, FLASH_DI_PIN, + NRF24_CE_PIN, NRF24_CS_PIN, NRF24_IRQ_PIN, + BOARD_SDIO_D0, BOARD_SDIO_D1, BOARD_SDIO_D2, BOARD_SDIO_D3, BOARD_SDIO_CK, BOARD_SDIO_CMD, + USB_DM_PIN, USB_DP_PIN +}; + +#ifdef __cplusplus +} +#endif + + +#endif // BOARD_generic_f407v From 467c450449ded9a8f92710be817418611a5bb571 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 9 May 2017 14:35:13 +0200 Subject: [PATCH 064/307] revert removing SPI declaration (needed by SdFat lib) + remove unused lines --- STM32F4/libraries/SPI/src/SPI.h | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/STM32F4/libraries/SPI/src/SPI.h b/STM32F4/libraries/SPI/src/SPI.h index 39a5a9eac..78e70660a 100644 --- a/STM32F4/libraries/SPI/src/SPI.h +++ b/STM32F4/libraries/SPI/src/SPI.h @@ -37,6 +37,8 @@ #ifndef _LIB_SPI_H_ #define _LIB_SPI_H_ +//#define SPI_DMA // enable this to use DMA for SPI transfers + #include #include #include @@ -374,27 +376,12 @@ class SPIClass { uint8 recv(void); private: -/* - static inline void DMA1_CH3_Event() { - dma1_ch3_Active = 0; -// dma_disable(DMA1, DMA_CH3); -// dma_disable(DMA1, DMA_CH2); - - // To Do. Need to wait for - } -*/ SPISettings _settings[BOARD_NR_SPI]; SPISettings *_currentSetting; void updateSettings(void); - /* - spi_dev *spi_d; - uint8_t _SSPin; - uint32_t clockDivider; - uint8_t dataMode; - BitOrder bitOrder; - */ }; +extern SPIClass SPI; // needed bx SdFat(EX) lib #endif From e37d7eac483b5719f17264086c3c06ebea3f3ecf Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 9 May 2017 14:37:47 +0200 Subject: [PATCH 065/307] removed unused const array --- STM32F4/variants/generic_f407v/pin_map.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/STM32F4/variants/generic_f407v/pin_map.c b/STM32F4/variants/generic_f407v/pin_map.c index 58eeca4be..2189902d6 100644 --- a/STM32F4/variants/generic_f407v/pin_map.c +++ b/STM32F4/variants/generic_f407v/pin_map.c @@ -53,20 +53,16 @@ extern timer_dev timer5; extern timer_dev timer6; extern timer_dev timer7; extern timer_dev timer8; + /* typedef struct stm32_pin_info { gpio_dev *gpio_device; // Maple pin's GPIO device - uint8 gpio_bit; // Pin's GPIO port bit. timer_dev *timer_device; // Pin's timer device, if any. uint8 timer_channel; // Timer channel, or 0 if none. - const adc_dev *adc_device; // ADC device, if any. uint8 adc_channel; // Pin ADC channel, or ADCx if none. + const adc_dev *adc_device; // ADC device, if any. } stm32_pin_info; */ -const stm32_pin_info PIN_MAP1[] = { // LQFP100 package pin - {&GPIOA, &timer5, 1, 0, &ADC1}, // D00/PA0 | 23 | USART2_CTS | UART4_TX | ETH_MII_CRS | TIM2_CH1_ETR | TIM5_CH1 | TIM8_ETR | ADC123_IN0/WKUP -}; - const stm32_pin_info PIN_MAP[] = { // LQFP100 package pin {&GPIOA, &timer5, 1, 0, &ADC1}, // D00/PA0 | 23 | USART2_CTS | UART4_TX | ETH_MII_CRS | TIM2_CH1_ETR | TIM5_CH1 | TIM8_ETR | ADC123_IN0/WKUP {&GPIOA, &timer5, 2, 1, &ADC1}, // D01/PA1 | 24 | USART2_RTS | UART4_RX | ETH_RMII_REF_CLK | ETH_MII_RX_CLK | TIM5_CH2 | TIM2_CH2 | ADC123_IN1 From 59b71f1370229a180484903e65dca0514d5475e8 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 9 May 2017 17:00:27 +0200 Subject: [PATCH 066/307] improved block read routine --- STM32F4/libraries/SPI/src/SPI.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/STM32F4/libraries/SPI/src/SPI.cpp b/STM32F4/libraries/SPI/src/SPI.cpp index baef0abf2..2d2cc48b5 100644 --- a/STM32F4/libraries/SPI/src/SPI.cpp +++ b/STM32F4/libraries/SPI/src/SPI.cpp @@ -321,14 +321,32 @@ uint16 SPIClass::read(void) void SPIClass::read(uint8 *buf, uint32 len) { - spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. + if ( len == 0 ) return; + spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. spi_reg_map * regs = _currentSetting->spi_d->regs; +#if 1 + // start sequence: write byte 0 + regs->DR = 0x00FF; // write the first byte + // main loop + while ( (--len) ) { + while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag + noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data + regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register + *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. + interrupts(); // let systick do its job + } + // read remaining last byte + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register + *buf++ = (uint8)(regs->DR); // read and store the received byte +#else // start sequence while ( (len--)>0) { regs->DR = 0x00FF; // " write the data item to be transmitted into the SPI_DR register (this clears the TXE flag)." while ( (regs->SR & SPI_SR_RXNE)==0 ) ; // wait till data is available in the Rx register *buf++ = (uint8)(regs->DR); // read and store the received byte - } + } +#endif } void SPIClass::write(uint16 data) @@ -339,7 +357,6 @@ void SPIClass::write(uint16 data) * This almost doubles the speed of this function. */ spi_tx_reg(_currentSetting->spi_d, data); // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) -//return; while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } From 54cd854161ffe5d84cde14a3763b5abe68a30ae7 Mon Sep 17 00:00:00 2001 From: SukkoPera Date: Tue, 9 May 2017 23:16:10 +0200 Subject: [PATCH 067/307] Tag isConnected() with __attribute__(deprecated) --- STM32F1/cores/maple/usb_serial.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/cores/maple/usb_serial.h b/STM32F1/cores/maple/usb_serial.h index ceb81e17b..40745c15d 100644 --- a/STM32F1/cores/maple/usb_serial.h +++ b/STM32F1/cores/maple/usb_serial.h @@ -80,7 +80,7 @@ class USBSerial : public Stream { * * Deprecated, use the above. */ - uint8 isConnected() { return (bool) *this; } + uint8 isConnected() __attribute__((deprecated("Use !Serial instead"))) { return (bool) *this; } }; #ifdef SERIAL_USB From ad51f6f8f8888f528badcea133953f525fd1116b Mon Sep 17 00:00:00 2001 From: SukkoPera Date: Tue, 9 May 2017 23:16:47 +0200 Subject: [PATCH 068/307] Avoid usage of deprecated function --- STM32F1/cores/maple/usb_serial.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index 85c70246f..57b439f75 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -107,7 +107,7 @@ size_t n = 0; size_t USBSerial::write(const uint8 *buf, uint32 len) { size_t n = 0; - if (!this->isConnected() || !buf) { + if (!(bool) *this || !buf) { return 0; } From 59ebf2a818b803094ee2319021630440e3bc0daf Mon Sep 17 00:00:00 2001 From: stevstrong Date: Wed, 10 May 2017 20:48:14 +0200 Subject: [PATCH 069/307] improved SPI no DMA block read + added SPI DMA --- STM32F4/cores/maple/libmaple/dmaF4.c | 35 +++-------- STM32F4/cores/maple/libmaple/dmaF4.h | 72 +++++++++++++++++------ STM32F4/cores/maple/libmaple/dma_common.h | 12 +--- STM32F4/cores/maple/libmaple/spi_f4.c | 2 +- STM32F4/libraries/SPI/src/SPI.h | 8 ++- 5 files changed, 71 insertions(+), 58 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/dmaF4.c b/STM32F4/cores/maple/libmaple/dmaF4.c index 4b530aff8..add3d8e51 100644 --- a/STM32F4/cores/maple/libmaple/dmaF4.c +++ b/STM32F4/cores/maple/libmaple/dmaF4.c @@ -117,33 +117,16 @@ void dma_detach_interrupt(dma_dev *dev, dma_stream stream) { dev->handlers[stream].handler = NULL; } +const uint8 dma_isr_bits_shift[] = { 0, 6, 16, 22}; + +uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream) { + if ( stream&0xFC ) return ((dev->regs->HISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; + else return ((dev->regs->LISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; +} + void dma_clear_isr_bits(dma_dev *dev, dma_stream stream) { - switch (stream) { - case 0: - dev->regs->LIFCR|=0x0000003d; - break; - case 1: - dev->regs->LIFCR|=0x00000f40; - break; - case 2: - dev->regs->LIFCR|=0x003d0000; - break; - case 3: - dev->regs->LIFCR|=0x0f400000; - break; - case 4: - dev->regs->HIFCR|=0x0000003d; - break; - case 5: - dev->regs->HIFCR|=0x00000f40; - break; - case 6: - dev->regs->HIFCR|=0x003d0000; - break; - case 7: - dev->regs->HIFCR|=0x0f400000; - break; - } + if ( stream&0xFC ) dev->regs->HIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; + else dev->regs->LIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; } /* diff --git a/STM32F4/cores/maple/libmaple/dmaF4.h b/STM32F4/cores/maple/libmaple/dmaF4.h index 6f7086f36..757906c82 100644 --- a/STM32F4/cores/maple/libmaple/dmaF4.h +++ b/STM32F4/cores/maple/libmaple/dmaF4.h @@ -25,7 +25,7 @@ *****************************************************************************/ /** - * @file dma.h + * @file dmaF4.h * * @author Marti Bolivar ; * Original implementation by Michael Hope @@ -84,7 +84,7 @@ typedef struct dma_reg_map { * Register bit definitions */ -/* Channel configuration register */ +/* Stream configuration register */ #define DMA_CR_CH0 (0x0 << 25) #define DMA_CR_CH1 (0x1 << 25) @@ -136,6 +136,25 @@ typedef struct dma_reg_map { #define DMA_CR_DMEIE (0x1 << 1) #define DMA_CR_EN (0x1) +typedef enum dma_channel { + DMA_CH0 = DMA_CR_CH0, /**< Channel 0 */ + DMA_CH1 = DMA_CR_CH1, /**< Channel 1 */ + DMA_CH2 = DMA_CR_CH2, /**< Channel 2 */ + DMA_CH3 = DMA_CR_CH3, /**< Channel 3 */ + DMA_CH4 = DMA_CR_CH4, /**< Channel 4 */ + DMA_CH5 = DMA_CR_CH5, /**< Channel 5 */ + DMA_CH6 = DMA_CR_CH6, /**< Channel 6 */ + DMA_CH7 = DMA_CR_CH7, /**< Channel 7 */ +} dma_channel; + +/* Device interrupt status register flags */ + +#define DMA_ISR_TCIF (1 << 5) +#define DMA_ISR_HTIF (1 << 4) +#define DMA_ISR_TEIF (1 << 3) +#define DMA_ISR_DMEIF (1 << 2) +#define DMA_ISR_FEIF (1 << 0) + /* * Devices */ @@ -166,25 +185,35 @@ extern dma_dev *DMA2; * Convenience functions */ -void dma_init(dma_dev *dev); +extern void dma_init(dma_dev *dev); /** Flags for DMA transfer configuration. */ typedef enum dma_mode_flags { - DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ - DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ - DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ - DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ - DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ - DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ - DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ - DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ + DMA_MEM_BUF_0 = DMA_CR_CT0, /**< Current memory target buffer 0 */ + DMA_MEM_BUF_1 = DMA_CR_CT1, /**< Current memory target buffer 1 */ + DMA_DBL_BUF_MODE = DMA_CR_DBM, /**< Current memory double buffer mode */ + DMA_PINC_OFFSET = DMA_CR_PINCOS, /**< Peripheral increment offset size */ + DMA_MINC_MODE = DMA_CR_MINC, /**< Memory increment mode */ + DMA_PINC_MODE = DMA_CR_PINC, /**< Peripheral increment mode */ + DMA_CIRC_MODE = DMA_CR_CIRC, /**< Memory Circular mode */ + DMA_FROM_PER = DMA_CR_DIR_P2M, /**< Read from memory to peripheral */ + DMA_FROM_MEM = DMA_CR_DIR_M2P, /**< Read from memory to peripheral */ + DMA_MEM_TO_MEM = DMA_CR_DIR_M2M, /**< Read from memory to memory */ + DMA_PERIF_CTRL = DMA_CR_PFCTRL, /**< Peripheral flow controller */ + DMA_PRIO_MEDIUM = DMA_CR_PL_MEDIUM, /**< Medium priority */ + DMA_PRIO_HIGH = DMA_CR_PL_HIGH, /**< High priority */ + DMA_PRIO_VERY_HIGH = DMA_CR_PL_VERY_HIGH, /**< Very high priority */ + DMA_TRNS_CMPLT = DMA_CR_TCIE, /**< Interrupt on transfer completion */ + DMA_TRNS_HALF = DMA_CR_HTIE, /**< Interrupt on half-transfer */ + DMA_TRNS_ERR = DMA_CR_TEIE, /**< Interrupt on transfer error */ + DMA_DIR_MODE_ERR = DMA_CR_DMEIE /**< Interrupt on direct mode error */ } dma_mode_flags; /** Source and destination transfer sizes. */ typedef enum dma_xfer_size { - DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ - DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ - DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ + DMA_SIZE_8BITS = ( DMA_CR_MSIZE_8BITS|DMA_CR_PSIZE_8BITS ), /**< 8-bit transfers */ + DMA_SIZE_16BITS = (DMA_CR_MSIZE_16BITS|DMA_CR_PSIZE_16BITS), /**< 16-bit transfers */ + DMA_SIZE_32BITS = (DMA_CR_MSIZE_32BITS|DMA_CR_PSIZE_32BITS) /**< 32-bit transfers */ } dma_xfer_size; /** DMA channel */ @@ -201,17 +230,17 @@ typedef enum dma_stream { static inline void dma_setup_transfer(dma_dev *dev, dma_stream stream, + dma_channel channel, + dma_xfer_size trx_size, __io void *peripheral_address, __io void *memory_address0, __io void *memory_address1, - uint32 flags, - uint32 fifo_flags) { + uint32 flags) { dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; // disable dev->regs->STREAM[stream].PAR = (uint32)peripheral_address; dev->regs->STREAM[stream].M0AR = (uint32)memory_address0; dev->regs->STREAM[stream].M1AR = (uint32)memory_address1; - dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits - dev->regs->STREAM[stream].CR = flags & 0x0feffffe; // mask out reserved and enable + dev->regs->STREAM[stream].CR = ((flags|channel|trx_size) & 0x0feffffe); // mask out reserved and enable } static inline void dma_set_num_transfers(dma_dev *dev, @@ -220,6 +249,12 @@ static inline void dma_set_num_transfers(dma_dev *dev, dev->regs->STREAM[stream].NDTR = num_transfers; } +static inline void dma_set_fifo_flags(dma_dev *dev, + dma_stream stream, + uint8 fifo_flags) { + dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits +} + void dma_attach_interrupt(dma_dev *dev, dma_stream stream, void (*handler)(void)); @@ -232,6 +267,7 @@ static inline void dma_enable(dma_dev *dev, dma_stream stream) { static inline void dma_disable(dma_dev *dev, dma_stream stream) { dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; + while (dev->regs->STREAM[stream].CR & DMA_CR_EN); // wait till EN bit is reset, see AN4031, chapter 4.1 } /** diff --git a/STM32F4/cores/maple/libmaple/dma_common.h b/STM32F4/cores/maple/libmaple/dma_common.h index 15dfab9c8..5f989219a 100644 --- a/STM32F4/cores/maple/libmaple/dma_common.h +++ b/STM32F4/cores/maple/libmaple/dma_common.h @@ -56,7 +56,7 @@ extern "C"{ * Devices */ -struct dma_reg_map; +//struct dma_reg_map; /* Encapsulates state related to user interrupt handlers. You * shouldn't touch these directly; use dma_attach_interrupt() and @@ -82,16 +82,6 @@ struct dma_reg_map; * * @see dma_tube */ -typedef enum dma_channel { - DMA_CH0 = 0, /**< Channel 0 */ - DMA_CH1 = 1, /**< Channel 1 */ - DMA_CH2 = 2, /**< Channel 2 */ - DMA_CH3 = 3, /**< Channel 3 */ - DMA_CH4 = 4, /**< Channel 4 */ - DMA_CH5 = 5, /**< Channel 5 */ - DMA_CH6 = 6, /**< Channel 6 */ - DMA_CH7 = 7, /**< Channel 7 */ -} dma_channel; /** * @brief Source and destination transfer sizes. diff --git a/STM32F4/cores/maple/libmaple/spi_f4.c b/STM32F4/cores/maple/libmaple/spi_f4.c index 43f5092c6..8e1bc15bf 100644 --- a/STM32F4/cores/maple/libmaple/spi_f4.c +++ b/STM32F4/cores/maple/libmaple/spi_f4.c @@ -28,7 +28,7 @@ /** * @file libmaple/stm32f1/spi.c * @author Marti Bolivar - * @brief STM32F1 SPI/I2S. + * @brief STM32F4 SPI/I2S. */ #include diff --git a/STM32F4/libraries/SPI/src/SPI.h b/STM32F4/libraries/SPI/src/SPI.h index 39a5a9eac..fe728b519 100644 --- a/STM32F4/libraries/SPI/src/SPI.h +++ b/STM32F4/libraries/SPI/src/SPI.h @@ -42,6 +42,8 @@ #include #include +#define SPI_DMA + // SPI_HAS_TRANSACTION means SPI has // - beginTransaction() // - endTransaction() @@ -135,11 +137,12 @@ class SPISettings { uint32_t dataSize; spi_dev *spi_d; - //uint8_t _SSPin; uint32_t clockDivider; + #ifdef SPI_DMA - dma_channel spiRxDmaChannel, spiTxDmaChannel; dma_dev* spiDmaDev; + dma_channel spiDmaChannel; + dma_stream spiRxDmaStream, spiTxDmaStream; #endif friend class SPIClass; @@ -396,5 +399,6 @@ class SPIClass { */ }; +extern SPIClass SPI; #endif From fc0ee241841d71a5e7e289f6d715c160581dfc38 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Thu, 11 May 2017 00:01:53 +0200 Subject: [PATCH 070/307] Revert "improved SPI no DMA block read + added SPI DMA" This reverts commit 59ebf2a818b803094ee2319021630440e3bc0daf. --- STM32F4/cores/maple/libmaple/dmaF4.c | 35 ++++++++--- STM32F4/cores/maple/libmaple/dmaF4.h | 72 ++++++----------------- STM32F4/cores/maple/libmaple/dma_common.h | 12 +++- STM32F4/cores/maple/libmaple/spi_f4.c | 2 +- STM32F4/libraries/SPI/src/SPI.h | 8 +-- 5 files changed, 58 insertions(+), 71 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/dmaF4.c b/STM32F4/cores/maple/libmaple/dmaF4.c index add3d8e51..4b530aff8 100644 --- a/STM32F4/cores/maple/libmaple/dmaF4.c +++ b/STM32F4/cores/maple/libmaple/dmaF4.c @@ -117,16 +117,33 @@ void dma_detach_interrupt(dma_dev *dev, dma_stream stream) { dev->handlers[stream].handler = NULL; } -const uint8 dma_isr_bits_shift[] = { 0, 6, 16, 22}; - -uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream) { - if ( stream&0xFC ) return ((dev->regs->HISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; - else return ((dev->regs->LISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; -} - void dma_clear_isr_bits(dma_dev *dev, dma_stream stream) { - if ( stream&0xFC ) dev->regs->HIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; - else dev->regs->LIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; + switch (stream) { + case 0: + dev->regs->LIFCR|=0x0000003d; + break; + case 1: + dev->regs->LIFCR|=0x00000f40; + break; + case 2: + dev->regs->LIFCR|=0x003d0000; + break; + case 3: + dev->regs->LIFCR|=0x0f400000; + break; + case 4: + dev->regs->HIFCR|=0x0000003d; + break; + case 5: + dev->regs->HIFCR|=0x00000f40; + break; + case 6: + dev->regs->HIFCR|=0x003d0000; + break; + case 7: + dev->regs->HIFCR|=0x0f400000; + break; + } } /* diff --git a/STM32F4/cores/maple/libmaple/dmaF4.h b/STM32F4/cores/maple/libmaple/dmaF4.h index 757906c82..6f7086f36 100644 --- a/STM32F4/cores/maple/libmaple/dmaF4.h +++ b/STM32F4/cores/maple/libmaple/dmaF4.h @@ -25,7 +25,7 @@ *****************************************************************************/ /** - * @file dmaF4.h + * @file dma.h * * @author Marti Bolivar ; * Original implementation by Michael Hope @@ -84,7 +84,7 @@ typedef struct dma_reg_map { * Register bit definitions */ -/* Stream configuration register */ +/* Channel configuration register */ #define DMA_CR_CH0 (0x0 << 25) #define DMA_CR_CH1 (0x1 << 25) @@ -136,25 +136,6 @@ typedef struct dma_reg_map { #define DMA_CR_DMEIE (0x1 << 1) #define DMA_CR_EN (0x1) -typedef enum dma_channel { - DMA_CH0 = DMA_CR_CH0, /**< Channel 0 */ - DMA_CH1 = DMA_CR_CH1, /**< Channel 1 */ - DMA_CH2 = DMA_CR_CH2, /**< Channel 2 */ - DMA_CH3 = DMA_CR_CH3, /**< Channel 3 */ - DMA_CH4 = DMA_CR_CH4, /**< Channel 4 */ - DMA_CH5 = DMA_CR_CH5, /**< Channel 5 */ - DMA_CH6 = DMA_CR_CH6, /**< Channel 6 */ - DMA_CH7 = DMA_CR_CH7, /**< Channel 7 */ -} dma_channel; - -/* Device interrupt status register flags */ - -#define DMA_ISR_TCIF (1 << 5) -#define DMA_ISR_HTIF (1 << 4) -#define DMA_ISR_TEIF (1 << 3) -#define DMA_ISR_DMEIF (1 << 2) -#define DMA_ISR_FEIF (1 << 0) - /* * Devices */ @@ -185,35 +166,25 @@ extern dma_dev *DMA2; * Convenience functions */ -extern void dma_init(dma_dev *dev); +void dma_init(dma_dev *dev); /** Flags for DMA transfer configuration. */ typedef enum dma_mode_flags { - DMA_MEM_BUF_0 = DMA_CR_CT0, /**< Current memory target buffer 0 */ - DMA_MEM_BUF_1 = DMA_CR_CT1, /**< Current memory target buffer 1 */ - DMA_DBL_BUF_MODE = DMA_CR_DBM, /**< Current memory double buffer mode */ - DMA_PINC_OFFSET = DMA_CR_PINCOS, /**< Peripheral increment offset size */ - DMA_MINC_MODE = DMA_CR_MINC, /**< Memory increment mode */ - DMA_PINC_MODE = DMA_CR_PINC, /**< Peripheral increment mode */ - DMA_CIRC_MODE = DMA_CR_CIRC, /**< Memory Circular mode */ - DMA_FROM_PER = DMA_CR_DIR_P2M, /**< Read from memory to peripheral */ - DMA_FROM_MEM = DMA_CR_DIR_M2P, /**< Read from memory to peripheral */ - DMA_MEM_TO_MEM = DMA_CR_DIR_M2M, /**< Read from memory to memory */ - DMA_PERIF_CTRL = DMA_CR_PFCTRL, /**< Peripheral flow controller */ - DMA_PRIO_MEDIUM = DMA_CR_PL_MEDIUM, /**< Medium priority */ - DMA_PRIO_HIGH = DMA_CR_PL_HIGH, /**< High priority */ - DMA_PRIO_VERY_HIGH = DMA_CR_PL_VERY_HIGH, /**< Very high priority */ - DMA_TRNS_CMPLT = DMA_CR_TCIE, /**< Interrupt on transfer completion */ - DMA_TRNS_HALF = DMA_CR_HTIE, /**< Interrupt on half-transfer */ - DMA_TRNS_ERR = DMA_CR_TEIE, /**< Interrupt on transfer error */ - DMA_DIR_MODE_ERR = DMA_CR_DMEIE /**< Interrupt on direct mode error */ + DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ + DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ + DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ + DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ + DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ + DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ + DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ + DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ } dma_mode_flags; /** Source and destination transfer sizes. */ typedef enum dma_xfer_size { - DMA_SIZE_8BITS = ( DMA_CR_MSIZE_8BITS|DMA_CR_PSIZE_8BITS ), /**< 8-bit transfers */ - DMA_SIZE_16BITS = (DMA_CR_MSIZE_16BITS|DMA_CR_PSIZE_16BITS), /**< 16-bit transfers */ - DMA_SIZE_32BITS = (DMA_CR_MSIZE_32BITS|DMA_CR_PSIZE_32BITS) /**< 32-bit transfers */ + DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ + DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ + DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ } dma_xfer_size; /** DMA channel */ @@ -230,17 +201,17 @@ typedef enum dma_stream { static inline void dma_setup_transfer(dma_dev *dev, dma_stream stream, - dma_channel channel, - dma_xfer_size trx_size, __io void *peripheral_address, __io void *memory_address0, __io void *memory_address1, - uint32 flags) { + uint32 flags, + uint32 fifo_flags) { dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; // disable dev->regs->STREAM[stream].PAR = (uint32)peripheral_address; dev->regs->STREAM[stream].M0AR = (uint32)memory_address0; dev->regs->STREAM[stream].M1AR = (uint32)memory_address1; - dev->regs->STREAM[stream].CR = ((flags|channel|trx_size) & 0x0feffffe); // mask out reserved and enable + dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits + dev->regs->STREAM[stream].CR = flags & 0x0feffffe; // mask out reserved and enable } static inline void dma_set_num_transfers(dma_dev *dev, @@ -249,12 +220,6 @@ static inline void dma_set_num_transfers(dma_dev *dev, dev->regs->STREAM[stream].NDTR = num_transfers; } -static inline void dma_set_fifo_flags(dma_dev *dev, - dma_stream stream, - uint8 fifo_flags) { - dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits -} - void dma_attach_interrupt(dma_dev *dev, dma_stream stream, void (*handler)(void)); @@ -267,7 +232,6 @@ static inline void dma_enable(dma_dev *dev, dma_stream stream) { static inline void dma_disable(dma_dev *dev, dma_stream stream) { dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; - while (dev->regs->STREAM[stream].CR & DMA_CR_EN); // wait till EN bit is reset, see AN4031, chapter 4.1 } /** diff --git a/STM32F4/cores/maple/libmaple/dma_common.h b/STM32F4/cores/maple/libmaple/dma_common.h index 5f989219a..15dfab9c8 100644 --- a/STM32F4/cores/maple/libmaple/dma_common.h +++ b/STM32F4/cores/maple/libmaple/dma_common.h @@ -56,7 +56,7 @@ extern "C"{ * Devices */ -//struct dma_reg_map; +struct dma_reg_map; /* Encapsulates state related to user interrupt handlers. You * shouldn't touch these directly; use dma_attach_interrupt() and @@ -82,6 +82,16 @@ extern "C"{ * * @see dma_tube */ +typedef enum dma_channel { + DMA_CH0 = 0, /**< Channel 0 */ + DMA_CH1 = 1, /**< Channel 1 */ + DMA_CH2 = 2, /**< Channel 2 */ + DMA_CH3 = 3, /**< Channel 3 */ + DMA_CH4 = 4, /**< Channel 4 */ + DMA_CH5 = 5, /**< Channel 5 */ + DMA_CH6 = 6, /**< Channel 6 */ + DMA_CH7 = 7, /**< Channel 7 */ +} dma_channel; /** * @brief Source and destination transfer sizes. diff --git a/STM32F4/cores/maple/libmaple/spi_f4.c b/STM32F4/cores/maple/libmaple/spi_f4.c index 8e1bc15bf..43f5092c6 100644 --- a/STM32F4/cores/maple/libmaple/spi_f4.c +++ b/STM32F4/cores/maple/libmaple/spi_f4.c @@ -28,7 +28,7 @@ /** * @file libmaple/stm32f1/spi.c * @author Marti Bolivar - * @brief STM32F4 SPI/I2S. + * @brief STM32F1 SPI/I2S. */ #include diff --git a/STM32F4/libraries/SPI/src/SPI.h b/STM32F4/libraries/SPI/src/SPI.h index fe728b519..39a5a9eac 100644 --- a/STM32F4/libraries/SPI/src/SPI.h +++ b/STM32F4/libraries/SPI/src/SPI.h @@ -42,8 +42,6 @@ #include #include -#define SPI_DMA - // SPI_HAS_TRANSACTION means SPI has // - beginTransaction() // - endTransaction() @@ -137,12 +135,11 @@ class SPISettings { uint32_t dataSize; spi_dev *spi_d; + //uint8_t _SSPin; uint32_t clockDivider; - #ifdef SPI_DMA + dma_channel spiRxDmaChannel, spiTxDmaChannel; dma_dev* spiDmaDev; - dma_channel spiDmaChannel; - dma_stream spiRxDmaStream, spiTxDmaStream; #endif friend class SPIClass; @@ -399,6 +396,5 @@ class SPIClass { */ }; -extern SPIClass SPI; #endif From bd3fb68a5ed4bd040809020955891492d909b5c7 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Thu, 11 May 2017 00:05:08 +0200 Subject: [PATCH 071/307] SPI improvements: non-DMA block read + added DMA transfer functions --- STM32F4/cores/maple/libmaple/dmaF4.c | 35 ++---- STM32F4/cores/maple/libmaple/dmaF4.h | 72 +++++++++--- STM32F4/libraries/SPI/src/SPI.cpp | 161 +++++++++++++++++---------- STM32F4/libraries/SPI/src/SPI.h | 17 +-- 4 files changed, 169 insertions(+), 116 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/dmaF4.c b/STM32F4/cores/maple/libmaple/dmaF4.c index 4b530aff8..add3d8e51 100644 --- a/STM32F4/cores/maple/libmaple/dmaF4.c +++ b/STM32F4/cores/maple/libmaple/dmaF4.c @@ -117,33 +117,16 @@ void dma_detach_interrupt(dma_dev *dev, dma_stream stream) { dev->handlers[stream].handler = NULL; } +const uint8 dma_isr_bits_shift[] = { 0, 6, 16, 22}; + +uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream) { + if ( stream&0xFC ) return ((dev->regs->HISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; + else return ((dev->regs->LISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; +} + void dma_clear_isr_bits(dma_dev *dev, dma_stream stream) { - switch (stream) { - case 0: - dev->regs->LIFCR|=0x0000003d; - break; - case 1: - dev->regs->LIFCR|=0x00000f40; - break; - case 2: - dev->regs->LIFCR|=0x003d0000; - break; - case 3: - dev->regs->LIFCR|=0x0f400000; - break; - case 4: - dev->regs->HIFCR|=0x0000003d; - break; - case 5: - dev->regs->HIFCR|=0x00000f40; - break; - case 6: - dev->regs->HIFCR|=0x003d0000; - break; - case 7: - dev->regs->HIFCR|=0x0f400000; - break; - } + if ( stream&0xFC ) dev->regs->HIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; + else dev->regs->LIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; } /* diff --git a/STM32F4/cores/maple/libmaple/dmaF4.h b/STM32F4/cores/maple/libmaple/dmaF4.h index 6f7086f36..757906c82 100644 --- a/STM32F4/cores/maple/libmaple/dmaF4.h +++ b/STM32F4/cores/maple/libmaple/dmaF4.h @@ -25,7 +25,7 @@ *****************************************************************************/ /** - * @file dma.h + * @file dmaF4.h * * @author Marti Bolivar ; * Original implementation by Michael Hope @@ -84,7 +84,7 @@ typedef struct dma_reg_map { * Register bit definitions */ -/* Channel configuration register */ +/* Stream configuration register */ #define DMA_CR_CH0 (0x0 << 25) #define DMA_CR_CH1 (0x1 << 25) @@ -136,6 +136,25 @@ typedef struct dma_reg_map { #define DMA_CR_DMEIE (0x1 << 1) #define DMA_CR_EN (0x1) +typedef enum dma_channel { + DMA_CH0 = DMA_CR_CH0, /**< Channel 0 */ + DMA_CH1 = DMA_CR_CH1, /**< Channel 1 */ + DMA_CH2 = DMA_CR_CH2, /**< Channel 2 */ + DMA_CH3 = DMA_CR_CH3, /**< Channel 3 */ + DMA_CH4 = DMA_CR_CH4, /**< Channel 4 */ + DMA_CH5 = DMA_CR_CH5, /**< Channel 5 */ + DMA_CH6 = DMA_CR_CH6, /**< Channel 6 */ + DMA_CH7 = DMA_CR_CH7, /**< Channel 7 */ +} dma_channel; + +/* Device interrupt status register flags */ + +#define DMA_ISR_TCIF (1 << 5) +#define DMA_ISR_HTIF (1 << 4) +#define DMA_ISR_TEIF (1 << 3) +#define DMA_ISR_DMEIF (1 << 2) +#define DMA_ISR_FEIF (1 << 0) + /* * Devices */ @@ -166,25 +185,35 @@ extern dma_dev *DMA2; * Convenience functions */ -void dma_init(dma_dev *dev); +extern void dma_init(dma_dev *dev); /** Flags for DMA transfer configuration. */ typedef enum dma_mode_flags { - DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ - DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ - DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ - DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ - DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ - DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ - DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ - DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ + DMA_MEM_BUF_0 = DMA_CR_CT0, /**< Current memory target buffer 0 */ + DMA_MEM_BUF_1 = DMA_CR_CT1, /**< Current memory target buffer 1 */ + DMA_DBL_BUF_MODE = DMA_CR_DBM, /**< Current memory double buffer mode */ + DMA_PINC_OFFSET = DMA_CR_PINCOS, /**< Peripheral increment offset size */ + DMA_MINC_MODE = DMA_CR_MINC, /**< Memory increment mode */ + DMA_PINC_MODE = DMA_CR_PINC, /**< Peripheral increment mode */ + DMA_CIRC_MODE = DMA_CR_CIRC, /**< Memory Circular mode */ + DMA_FROM_PER = DMA_CR_DIR_P2M, /**< Read from memory to peripheral */ + DMA_FROM_MEM = DMA_CR_DIR_M2P, /**< Read from memory to peripheral */ + DMA_MEM_TO_MEM = DMA_CR_DIR_M2M, /**< Read from memory to memory */ + DMA_PERIF_CTRL = DMA_CR_PFCTRL, /**< Peripheral flow controller */ + DMA_PRIO_MEDIUM = DMA_CR_PL_MEDIUM, /**< Medium priority */ + DMA_PRIO_HIGH = DMA_CR_PL_HIGH, /**< High priority */ + DMA_PRIO_VERY_HIGH = DMA_CR_PL_VERY_HIGH, /**< Very high priority */ + DMA_TRNS_CMPLT = DMA_CR_TCIE, /**< Interrupt on transfer completion */ + DMA_TRNS_HALF = DMA_CR_HTIE, /**< Interrupt on half-transfer */ + DMA_TRNS_ERR = DMA_CR_TEIE, /**< Interrupt on transfer error */ + DMA_DIR_MODE_ERR = DMA_CR_DMEIE /**< Interrupt on direct mode error */ } dma_mode_flags; /** Source and destination transfer sizes. */ typedef enum dma_xfer_size { - DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ - DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ - DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ + DMA_SIZE_8BITS = ( DMA_CR_MSIZE_8BITS|DMA_CR_PSIZE_8BITS ), /**< 8-bit transfers */ + DMA_SIZE_16BITS = (DMA_CR_MSIZE_16BITS|DMA_CR_PSIZE_16BITS), /**< 16-bit transfers */ + DMA_SIZE_32BITS = (DMA_CR_MSIZE_32BITS|DMA_CR_PSIZE_32BITS) /**< 32-bit transfers */ } dma_xfer_size; /** DMA channel */ @@ -201,17 +230,17 @@ typedef enum dma_stream { static inline void dma_setup_transfer(dma_dev *dev, dma_stream stream, + dma_channel channel, + dma_xfer_size trx_size, __io void *peripheral_address, __io void *memory_address0, __io void *memory_address1, - uint32 flags, - uint32 fifo_flags) { + uint32 flags) { dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; // disable dev->regs->STREAM[stream].PAR = (uint32)peripheral_address; dev->regs->STREAM[stream].M0AR = (uint32)memory_address0; dev->regs->STREAM[stream].M1AR = (uint32)memory_address1; - dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits - dev->regs->STREAM[stream].CR = flags & 0x0feffffe; // mask out reserved and enable + dev->regs->STREAM[stream].CR = ((flags|channel|trx_size) & 0x0feffffe); // mask out reserved and enable } static inline void dma_set_num_transfers(dma_dev *dev, @@ -220,6 +249,12 @@ static inline void dma_set_num_transfers(dma_dev *dev, dev->regs->STREAM[stream].NDTR = num_transfers; } +static inline void dma_set_fifo_flags(dma_dev *dev, + dma_stream stream, + uint8 fifo_flags) { + dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits +} + void dma_attach_interrupt(dma_dev *dev, dma_stream stream, void (*handler)(void)); @@ -232,6 +267,7 @@ static inline void dma_enable(dma_dev *dev, dma_stream stream) { static inline void dma_disable(dma_dev *dev, dma_stream stream) { dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; + while (dev->regs->STREAM[stream].CR & DMA_CR_EN); // wait till EN bit is reset, see AN4031, chapter 4.1 } /** diff --git a/STM32F4/libraries/SPI/src/SPI.cpp b/STM32F4/libraries/SPI/src/SPI.cpp index baef0abf2..6edbcebed 100644 --- a/STM32F4/libraries/SPI/src/SPI.cpp +++ b/STM32F4/libraries/SPI/src/SPI.cpp @@ -40,6 +40,8 @@ #include "wirish.h" #include "boards.h" +#define DMA_TIMEOUT 100 + #if CYCLES_PER_MICROSECOND != 168 /* TODO [0.2.0?] something smarter than this */ #warning "Unexpected clock speed; SPI frequency calculation will be incorrect" @@ -115,27 +117,37 @@ SPIClass::SPIClass(uint32 spi_num) { // Init things specific to each SPI device // clock divider setup is a bit of hack, and needs to be improved at a later date. +/*****************************************************************************/ +// DMA / Channel / Stream +// Rx Tx +// SPI1: 2 / 3 / 0 (2) - 2 / 3 / 3 (5) +// SPI2: 1 / 0 / 3 - 1 / 0 / 4 +// SPI3: 1 / 0 / 0 (2) - 1 / 0 / 5 (7) +/*****************************************************************************/ _settings[0].spi_d = SPI1; _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); #ifdef SPI_DMA - _settings[0].spiDmaDev = DMA1; - _settings[0].spiTxDmaChannel = DMA_CH3; - _settings[0].spiRxDmaChannel = DMA_CH2; + _settings[0].spiDmaDev = DMA2; + _settings[0].spiDmaChannel = DMA_CH3; + _settings[0].spiRxDmaStream = DMA_STREAM0; // alternative: DMA_STREAM2 + _settings[0].spiTxDmaStream = DMA_STREAM3; // alternative: DMA_STREAM5 #endif _settings[1].spi_d = SPI2; _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); #ifdef SPI_DMA _settings[1].spiDmaDev = DMA1; - _settings[1].spiTxDmaChannel = DMA_CH5; - _settings[1].spiRxDmaChannel = DMA_CH4; + _settings[1].spiDmaChannel = DMA_CH0; + _settings[1].spiRxDmaStream = DMA_STREAM3; // alternative: - + _settings[1].spiTxDmaStream = DMA_STREAM4; // alternative: - #endif #if BOARD_NR_SPI >= 3 _settings[2].spi_d = SPI3; _settings[2].clockDivider = determine_baud_rate(_settings[2].spi_d, _settings[2].clock); #ifdef SPI_DMA - _settings[2].spiDmaDev = DMA2; - _settings[2].spiTxDmaChannel = DMA_CH2; - _settings[2].spiRxDmaChannel = DMA_CH1; + _settings[2].spiDmaDev = DMA1; + _settings[2].spiDmaChannel = DMA_CH0; + _settings[2].spiRxDmaStream = DMA_STREAM0; // alternative: DMA_STREAM2 + _settings[2].spiTxDmaStream = DMA_STREAM5; // alternative: DMA_STREAM7 #endif #endif @@ -265,9 +277,6 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) #ifdef SPI_DEBUG Serial.println("SPIClass::beginTransaction"); #endif - //_SSPin=pin; - //pinMode(_SSPin,OUTPUT); - //digitalWrite(_SSPin,LOW); setBitOrder(settings.bitOrder); setDataMode(settings.dataMode); setDataSize(settings.dataSize); @@ -321,14 +330,23 @@ uint16 SPIClass::read(void) void SPIClass::read(uint8 *buf, uint32 len) { - spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. + if ( len == 0 ) return; + spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. spi_reg_map * regs = _currentSetting->spi_d->regs; - // start sequence - while ( (len--)>0) { - regs->DR = 0x00FF; // " write the data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while ( (regs->SR & SPI_SR_RXNE)==0 ) ; // wait till data is available in the Rx register - *buf++ = (uint8)(regs->DR); // read and store the received byte - } + // start sequence: write byte 0 + regs->DR = 0x00FF; // write the first byte + // main loop + while ( (--len) ) { + while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag + noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data + regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register + *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. + interrupts(); // let systick do its job + } + // read remaining last byte + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register + *buf++ = (uint8)(regs->DR); // read and store the received byte } void SPIClass::write(uint16 data) @@ -393,47 +411,66 @@ uint16_t SPIClass::transfer16(uint16_t wr_data) const uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length) { if (length == 0) return 0; + uint8 b = 0; - spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. -// dma1_ch3_Active=true; + dma_init(_currentSetting->spiDmaDev); // dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - // RX - spi_rx_dma_enable(_currentSetting->spi_d); dma_xfer_size dma_bit_size = (_currentSetting->dataSize==SPI_DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); + dma_setup_transfer( _currentSetting->spiDmaDev, + _currentSetting->spiRxDmaStream, + _currentSetting->spiDmaChannel, + dma_bit_size, + &_currentSetting->spi_d->regs->DR, // peripheral address + receiveBuf, // memory bank 0 address + NULL, // memory bank 1 address + (DMA_MINC_MODE | DMA_FROM_PER | DMA_PRIO_VERY_HIGH) // flags + ); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream, length); + dma_set_fifo_flags(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream, 0); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream); // TX - uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); - spi_tx_dma_enable(_currentSetting->spi_d); + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM); // | DMA_TRNS_CMPLT); if ( transmitBuf==0 ) { static uint8_t ff = 0XFF; transmitBuf = &ff; - flags ^= DMA_MINC_MODE; // remove increment mode + flags &= ~((uint32)DMA_MINC_MODE); // remove increment mode } - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, flags);// Transmit buffer DMA - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + dma_setup_transfer( _currentSetting->spiDmaDev, + _currentSetting->spiTxDmaStream, + _currentSetting->spiDmaChannel, + dma_bit_size, + &_currentSetting->spi_d->regs->DR, // peripheral address + transmitBuf, // memory bank 0 address + NULL, // memory bank 1 address + flags + ); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, length); + dma_set_fifo_flags(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, 0); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); + // software enable sequence, see AN4031, chapter 4.3 + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream);// enable receive + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream);// enable transmit + spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. + spi_rx_dma_enable(_currentSetting->spi_d); + spi_tx_dma_enable(_currentSetting->spi_d); // must be the last enable to avoid DMA error flag uint32_t m = millis(); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + while ((b = dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set + if ( b&(DMA_ISR_TEIF|DMA_ISR_DMEIF|DMA_ISR_FEIF) ) { b = 1; break; } // break on any error flag if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + if (b & DMA_ISR_TCIF) b = 0; while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - spi_rx_dma_disable(_currentSetting->spi_d); // And disable generation of DMA request from the SPI port so other peripherals can use the channels + // software disable sequence, see AN4031, chapter 4.1 spi_tx_dma_disable(_currentSetting->spi_d); - //uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! + spi_rx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); return b; } @@ -446,28 +483,36 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) { if (length == 0) return 0; - uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); uint8 b = 0; dma_init(_currentSetting->spiDmaDev); // TX - spi_tx_dma_enable(_currentSetting->spi_d); dma_xfer_size dma_bit_size = (_currentSetting->dataSize==SPI_DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, flags);// Transmit buffer DMA - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + dma_setup_transfer( _currentSetting->spiDmaDev, + _currentSetting->spiTxDmaStream, + _currentSetting->spiDmaChannel, + dma_bit_size, + &_currentSetting->spi_d->regs->DR, // peripheral address + transmitBuf, // memory bank 0 address + NULL, // memory bank 1 address + ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM ) //| DMA_TRNS_CMPLT ) // flags + );// Transmit buffer DMA + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, length); + dma_set_fifo_flags(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, 0); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream);// enable transmit + spi_tx_dma_enable(_currentSetting->spi_d); uint32_t m = millis(); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + while ((b = dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set + if ( b&(DMA_ISR_TEIF|DMA_ISR_DMEIF|DMA_ISR_FEIF) ) { b = 1; break; } // break on any error flag if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } - } - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + } + if (b & DMA_ISR_TCIF) b = 0; while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); spi_tx_dma_disable(_currentSetting->spi_d); - //uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); return b; } #endif @@ -507,18 +552,13 @@ uint8 SPIClass::nssPin(void) { */ uint8 SPIClass::send(uint8 data) { - uint8 buf[] = {data}; - return this->send(buf, 1); + this->write(data); + return 1; } uint8 SPIClass::send(uint8 *buf, uint32 len) { - uint32 txed = 0; - uint8 ret = 0; - while (txed < len) { - this->write(buf[txed++]); - ret = this->read(); - } - return ret; + this->write(buf, len); + return len; } uint8 SPIClass::recv(void) { @@ -640,4 +680,3 @@ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { //SPIClass SPI(3); - diff --git a/STM32F4/libraries/SPI/src/SPI.h b/STM32F4/libraries/SPI/src/SPI.h index 39a5a9eac..d9e1e7a8b 100644 --- a/STM32F4/libraries/SPI/src/SPI.h +++ b/STM32F4/libraries/SPI/src/SPI.h @@ -42,6 +42,8 @@ #include #include +#define SPI_DMA + // SPI_HAS_TRANSACTION means SPI has // - beginTransaction() // - endTransaction() @@ -135,19 +137,18 @@ class SPISettings { uint32_t dataSize; spi_dev *spi_d; - //uint8_t _SSPin; uint32_t clockDivider; + #ifdef SPI_DMA - dma_channel spiRxDmaChannel, spiTxDmaChannel; dma_dev* spiDmaDev; + dma_channel spiDmaChannel; + dma_stream spiRxDmaStream, spiTxDmaStream; #endif friend class SPIClass; }; - - /** * @brief Wirish SPI interface. * @@ -157,18 +158,11 @@ class SPISettings { class SPIClass { public: - - /** * @param spiPortNumber Number of the SPI port to manage. */ SPIClass(uint32 spiPortNumber); - /* - * Set up/tear down - */ - - /** * @brief Equivalent to begin(SPI_1_125MHZ, MSBFIRST, 0). @@ -396,5 +390,6 @@ class SPIClass { */ }; +extern SPIClass SPI; #endif From 679217dfafc66b0f0a3c3741396328c8e70df5ad Mon Sep 17 00:00:00 2001 From: stevstrong Date: Thu, 11 May 2017 00:57:08 +0200 Subject: [PATCH 072/307] F4 development - added generic F4 variant - removed F1 and F2 files/defines - resolved include headers - now libraries are detected within sketches - reworked + added new GPIO access functions - moved and size-optimized PIN_MAP in flash - SPI improvements: optimized block read + added DMA --- STM32F4/boards.txt | 39 ++ STM32F4/cores/maple/Arduino.h | 6 - STM32F4/cores/maple/Client.h | 5 +- STM32F4/cores/maple/HardwareTimer.h | 2 +- STM32F4/cores/maple/IPAddress.h | 4 +- STM32F4/cores/maple/Server.h | 4 +- STM32F4/cores/maple/Stream.h | 4 +- STM32F4/cores/maple/Udp.h | 4 +- STM32F4/cores/maple/WProgram.h | 7 +- STM32F4/cores/maple/WString.h | 7 +- STM32F4/cores/maple/bits.h | 5 + STM32F4/cores/maple/boards.cpp | 32 +- STM32F4/cores/maple/boards.h | 39 +- STM32F4/cores/maple/ext_interrupts.cpp | 8 +- STM32F4/cores/maple/ext_interrupts.h | 9 +- STM32F4/cores/maple/io.h | 13 +- STM32F4/cores/maple/itoa.h | 4 +- STM32F4/cores/maple/libmaple/HardwareSPI.cpp | 424 ------------- STM32F4/cores/maple/libmaple/HardwareSPI.h | 279 --------- .../cores/maple/libmaple/HardwareSerial.cpp | 30 +- STM32F4/cores/maple/libmaple/HardwareSerial.h | 2 +- STM32F4/cores/maple/libmaple/adc.c | 33 +- STM32F4/cores/maple/libmaple/adc.h | 54 +- STM32F4/cores/maple/libmaple/dac.c | 4 +- STM32F4/cores/maple/libmaple/dma.h | 7 +- STM32F4/cores/maple/libmaple/dmaF1.c | 383 ------------ STM32F4/cores/maple/libmaple/dmaF1.h | 453 -------------- .../cores/maple/libmaple/{dmaF2.c => dmaF4.c} | 39 +- .../cores/maple/libmaple/{dmaF2.h => dmaF4.h} | 72 ++- STM32F4/cores/maple/libmaple/exti.h | 4 - STM32F4/cores/maple/libmaple/fsmc.c | 53 +- STM32F4/cores/maple/libmaple/gpio.h | 102 +++- STM32F4/cores/maple/libmaple/gpioF1.c | 200 ------ STM32F4/cores/maple/libmaple/gpioF1.h | 530 ---------------- .../maple/libmaple/{gpioF2.c => gpioF4.c} | 79 ++- .../maple/libmaple/{gpioF2.h => gpio_def.h} | 90 +-- STM32F4/cores/maple/libmaple/i2c.c | 40 +- STM32F4/cores/maple/libmaple/i2c.h | 2 +- STM32F4/cores/maple/libmaple/libmaple.h | 14 +- STM32F4/cores/maple/libmaple/libmaple_types.h | 15 +- STM32F4/cores/maple/libmaple/rcc.h | 7 +- STM32F4/cores/maple/libmaple/rccF1.c | 233 ------- STM32F4/cores/maple/libmaple/rccF1.h | 572 ------------------ .../cores/maple/libmaple/{rccF2.c => rccF4.c} | 7 +- .../cores/maple/libmaple/{rccF2.h => rccF4.h} | 0 STM32F4/cores/maple/libmaple/rules.mk | 22 - STM32F4/cores/maple/libmaple/spi.c | 39 +- STM32F4/cores/maple/libmaple/spi.h | 19 +- STM32F4/cores/maple/libmaple/spiF4.h | 15 +- STM32F4/cores/maple/libmaple/spi_f4.c | 26 +- STM32F4/cores/maple/libmaple/stm32.h | 63 +- STM32F4/cores/maple/libmaple/timer.c | 16 +- STM32F4/cores/maple/libmaple/timer.h | 19 +- STM32F4/cores/maple/libmaple/usart.h | 6 +- .../Class/audio/inc/usbd_audio_core.h | 2 +- .../Class/cdc/inc/usbd_cdc_core.h | 3 +- .../Class/cdc/src/usbd_cdc_core.c | 7 +- .../Core/inc/usbd_core.h | 4 +- .../Core/inc/usbd_def.h | 2 +- .../Core/inc/usbd_req.h | 2 +- .../Core/src/usbd_core.c | 10 +- .../Core/src/usbd_ioreq.c | 2 +- .../Core/src/usbd_req.c | 6 +- .../usbF4/STM32_USB_OTG_Driver/inc/usb_core.h | 2 +- .../STM32_USB_OTG_Driver/inc/usb_defines.h | 2 +- .../usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h | 1 + .../usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h | 4 +- .../usbF4/STM32_USB_OTG_Driver/src/usb_core.c | 4 +- .../usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c | 4 +- .../STM32_USB_OTG_Driver/src/usb_dcd_int.c | 4 +- .../cores/maple/libmaple/usbF4/VCP/core_cm4.h | 2 +- STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c | 2 +- .../cores/maple/libmaple/usbF4/VCP/usb_bsp.c | 22 +- .../cores/maple/libmaple/usbF4/VCP/usb_conf.h | 4 + .../maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c | 2 +- .../maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h | 2 +- .../maple/libmaple/usbF4/VCP/usbd_conf.h | 1 + .../maple/libmaple/usbF4/VCP/usbd_desc.c | 6 +- .../maple/libmaple/usbF4/VCP/usbd_desc.h | 2 +- .../cores/maple/libmaple/usbF4/VCP/usbd_usr.c | 4 +- STM32F4/cores/maple/libmaple/usbF4/usb.c | 33 +- STM32F4/cores/maple/libmaple/usbF4/usb.h | 2 +- STM32F4/cores/maple/libmaple/util.c | 6 +- STM32F4/cores/maple/libmaple/util.h | 5 +- STM32F4/cores/maple/pwm.cpp | 4 +- STM32F4/cores/maple/usb_serial.cpp | 6 +- STM32F4/cores/maple/usb_serial.h | 15 +- STM32F4/cores/maple/wirish.h | 15 +- STM32F4/cores/maple/wirish_analog.cpp | 2 - STM32F4/cores/maple/wirish_constants.h | 4 +- STM32F4/cores/maple/wirish_debug.h | 7 +- STM32F4/cores/maple/wirish_digital.cpp | 31 +- STM32F4/cores/maple/wirish_math.h | 4 +- STM32F4/cores/maple/wirish_time.cpp | 6 +- STM32F4/cores/maple/wirish_time.h | 5 +- STM32F4/cores/maple/wirish_types.h | 23 +- STM32F4/libraries/SPI/library.properties | 1 + STM32F4/libraries/SPI/src/SPI.cpp | 518 ++++++++-------- STM32F4/libraries/SPI/src/SPI.h | 157 ++--- STM32F4/platform.txt | 20 +- .../gpio.c => system/libmaple/Arduino.h} | 30 +- .../variants/generic_f407v/generic_f407v.cpp | 81 +++ .../variants/generic_f407v/generic_f407v.h | 163 +++++ STM32F4/variants/generic_f407v/ld/common.inc | 219 +++++++ .../variants/generic_f407v/ld/extra_libs.inc | 7 + STM32F4/variants/generic_f407v/ld/flash.ld | 20 + STM32F4/variants/generic_f407v/ld/jtag.ld | 20 + STM32F4/variants/generic_f407v/ld/names.inc | 78 +++ STM32F4/variants/generic_f407v/ld/ram.ld | 19 + .../generic_f407v/ld/vector_symbols.inc | 78 +++ STM32F4/variants/generic_f407v/pin_map.c | 210 +++++++ STM32F4/variants/generic_f407v/pins_arduino.h | 6 + STM32F4/variants/generic_f407v/stm32_isrs.S | 323 ++++++++++ .../generic_f407v/stm32_vector_table.S | 113 ++++ STM32F4/variants/generic_f407v/variant.h | 21 + .../generic_f407v/wirish/start.S} | 40 +- .../variants/generic_f407v/wirish/start_c.c | 95 +++ 117 files changed, 2546 insertions(+), 4092 deletions(-) delete mode 100644 STM32F4/cores/maple/Arduino.h delete mode 100644 STM32F4/cores/maple/libmaple/HardwareSPI.cpp delete mode 100644 STM32F4/cores/maple/libmaple/HardwareSPI.h delete mode 100644 STM32F4/cores/maple/libmaple/dmaF1.c delete mode 100644 STM32F4/cores/maple/libmaple/dmaF1.h rename STM32F4/cores/maple/libmaple/{dmaF2.c => dmaF4.c} (91%) rename STM32F4/cores/maple/libmaple/{dmaF2.h => dmaF4.h} (74%) delete mode 100644 STM32F4/cores/maple/libmaple/gpioF1.c delete mode 100644 STM32F4/cores/maple/libmaple/gpioF1.h rename STM32F4/cores/maple/libmaple/{gpioF2.c => gpioF4.c} (78%) rename STM32F4/cores/maple/libmaple/{gpioF2.h => gpio_def.h} (90%) delete mode 100644 STM32F4/cores/maple/libmaple/rccF1.c delete mode 100644 STM32F4/cores/maple/libmaple/rccF1.h rename STM32F4/cores/maple/libmaple/{rccF2.c => rccF4.c} (99%) rename STM32F4/cores/maple/libmaple/{rccF2.h => rccF4.h} (100%) rename STM32F4/{cores/maple/libmaple/gpio.c => system/libmaple/Arduino.h} (79%) create mode 100644 STM32F4/variants/generic_f407v/generic_f407v.cpp create mode 100644 STM32F4/variants/generic_f407v/generic_f407v.h create mode 100644 STM32F4/variants/generic_f407v/ld/common.inc create mode 100644 STM32F4/variants/generic_f407v/ld/extra_libs.inc create mode 100644 STM32F4/variants/generic_f407v/ld/flash.ld create mode 100644 STM32F4/variants/generic_f407v/ld/jtag.ld create mode 100644 STM32F4/variants/generic_f407v/ld/names.inc create mode 100644 STM32F4/variants/generic_f407v/ld/ram.ld create mode 100644 STM32F4/variants/generic_f407v/ld/vector_symbols.inc create mode 100644 STM32F4/variants/generic_f407v/pin_map.c create mode 100644 STM32F4/variants/generic_f407v/pins_arduino.h create mode 100644 STM32F4/variants/generic_f407v/stm32_isrs.S create mode 100644 STM32F4/variants/generic_f407v/stm32_vector_table.S create mode 100644 STM32F4/variants/generic_f407v/variant.h rename STM32F4/{cores/maple/libmaple/rcc.c => variants/generic_f407v/wirish/start.S} (54%) create mode 100644 STM32F4/variants/generic_f407v/wirish/start_c.c diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 7577d1949..04bfd0fd0 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -1,5 +1,7 @@ # +menu.usb_cfg=USB configuration + ############################################################## discovery_f407.name=STM32 Discovery F407 @@ -29,6 +31,43 @@ discovery_f407.build.error_led_port=GPIOD discovery_f407.build.error_led_pin=14 discovery_f407.build.board=STM32DiscoveryF407 +############################################################## +generic_f407v.name=Generic STM32F407V series + +generic_f407v.upload.tool=stlink_upload +generic_f407v.upload.protocol=stlink + +generic_f407v.upload.file_type=bin +generic_f407v.upload.ram.maximum_size=131072 +generic_f407v.upload.flash.maximum_size=514288 +generic_f407v.upload.maximum_size=514288 + +#generic_f407v.upload.usbID=0483:3748 +#generic_f407v.upload.altID=1 +#generic_f407v.upload.auto_reset=true + +generic_f407v.build.mcu=cortex-m4 +generic_f407v.build.f_cpu=168000000L +generic_f407v.build.core=maple +generic_f407v.build.extra_flags=-mthumb -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_generic_f407v +generic_f407v.build.ldscript=ld/jtag.ld +generic_f407v.build.variant=generic_f407v +generic_f407v.build.variant_system_lib=lib_f407.a +generic_f407v.build.vect=VECT_TAB_BASE +generic_f407v.build.density=STM32_HIGH_DENSITY +generic_f407v.build.error_led_port=GPIOA +generic_f407v.build.error_led_pin=7 +generic_f407v.build.board=STM32GenericF407VET6 + +generic_f407v.menu.usb_cfg.usb_nc=USB inactive +generic_f407v.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC + +generic_f407v.menu.usb_cfg.usb_serial=USB serial (CDC) +generic_f407v.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB + +generic_f407v.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) +generic_f407v.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC + ############################################################## stm32f4stamp.name=STM32F4Stamp F405 diff --git a/STM32F4/cores/maple/Arduino.h b/STM32F4/cores/maple/Arduino.h deleted file mode 100644 index d02a50cba..000000000 --- a/STM32F4/cores/maple/Arduino.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef Arduino_h -#define Arduino_h -#include "WProgram.h" -#endif - -#include "variant.h" diff --git a/STM32F4/cores/maple/Client.h b/STM32F4/cores/maple/Client.h index b8e5d935f..57bedb8e0 100644 --- a/STM32F4/cores/maple/Client.h +++ b/STM32F4/cores/maple/Client.h @@ -17,8 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef client_h -#define client_h +#ifndef _CLIENT_H_ +#define _CLIENT_H_ + #include "Print.h" #include "Stream.h" #include "IPAddress.h" diff --git a/STM32F4/cores/maple/HardwareTimer.h b/STM32F4/cores/maple/HardwareTimer.h index 89e356499..c90356bf6 100644 --- a/STM32F4/cores/maple/HardwareTimer.h +++ b/STM32F4/cores/maple/HardwareTimer.h @@ -33,7 +33,7 @@ // TODO [0.1.0] Remove deprecated pieces, pick a better API -#include "timer.h" +#include /** Timer mode. */ typedef timer_mode TimerMode; diff --git a/STM32F4/cores/maple/IPAddress.h b/STM32F4/cores/maple/IPAddress.h index 271b24025..c6e06972a 100644 --- a/STM32F4/cores/maple/IPAddress.h +++ b/STM32F4/cores/maple/IPAddress.h @@ -17,8 +17,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef IPAddress_h -#define IPAddress_h +#ifndef _IPAddress_h_ +#define _IPAddress_h_ #include #include diff --git a/STM32F4/cores/maple/Server.h b/STM32F4/cores/maple/Server.h index 69e3e39fe..4a95c9f51 100644 --- a/STM32F4/cores/maple/Server.h +++ b/STM32F4/cores/maple/Server.h @@ -17,8 +17,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef server_h -#define server_h +#ifndef _SERVER_H_ +#define _SERVER_H_ #include "Print.h" diff --git a/STM32F4/cores/maple/Stream.h b/STM32F4/cores/maple/Stream.h index abdcd1768..870fbf0e5 100644 --- a/STM32F4/cores/maple/Stream.h +++ b/STM32F4/cores/maple/Stream.h @@ -19,8 +19,8 @@ parsing functions based on TextFinder library by Michael Margolis */ -#ifndef Stream_h -#define Stream_h +#ifndef _STREAM_H_ +#define _STREAM_H_ #include #include "Print.h" diff --git a/STM32F4/cores/maple/Udp.h b/STM32F4/cores/maple/Udp.h index dc5644b9d..1652cafc9 100644 --- a/STM32F4/cores/maple/Udp.h +++ b/STM32F4/cores/maple/Udp.h @@ -32,8 +32,8 @@ * bjoern@cs.stanford.edu 12/30/2008 */ -#ifndef udp_h -#define udp_h +#ifndef _UDP_H_ +#define _UDP_H_ #include #include diff --git a/STM32F4/cores/maple/WProgram.h b/STM32F4/cores/maple/WProgram.h index 2949a0a59..82b759a64 100644 --- a/STM32F4/cores/maple/WProgram.h +++ b/STM32F4/cores/maple/WProgram.h @@ -24,7 +24,12 @@ * SOFTWARE. *****************************************************************************/ -#include "wirish.h" +#ifndef _WPROGRAM_H_ +#define _WPROGRAM_H_ + +#include void setup(); void loop(); + +#endif \ No newline at end of file diff --git a/STM32F4/cores/maple/WString.h b/STM32F4/cores/maple/WString.h index 903857809..ec0eae7fb 100644 --- a/STM32F4/cores/maple/WString.h +++ b/STM32F4/cores/maple/WString.h @@ -19,8 +19,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef String_class_h -#define String_class_h +#ifndef _WSTRING_H_ +#define _WSTRING_H_ + #ifdef __cplusplus #include @@ -225,4 +226,4 @@ class StringSumHelper : public String }; #endif // __cplusplus -#endif // String_class_h +#endif // _WSTRING_H_ diff --git a/STM32F4/cores/maple/bits.h b/STM32F4/cores/maple/bits.h index 3e755b7f4..3e3eff1ec 100644 --- a/STM32F4/cores/maple/bits.h +++ b/STM32F4/cores/maple/bits.h @@ -27,4 +27,9 @@ /* Note: Use of this header file is deprecated. Use bit_constants.h instead. */ +#ifndef _BITS_H_ +#define _BITS_H_ + #include "bit_constants.h" + +#endif diff --git a/STM32F4/cores/maple/boards.cpp b/STM32F4/cores/maple/boards.cpp index a85657163..0d55e9414 100644 --- a/STM32F4/cores/maple/boards.cpp +++ b/STM32F4/cores/maple/boards.cpp @@ -33,17 +33,16 @@ */ #include "boards.h" -#include "flash.h" -#include "rcc.h" -#include "nvic.h" -#include "systick.h" -#include "gpio.h" -#include "adc.h" -#include "timer.h" +#include +#include +#include +#include +#include +#include +#include #include "usb.h" -#ifdef STM32F2 -//#include "usbF4.h" -#endif +#include "usb_serial.h" + static void setupFlash(void); static void setupClocks(void); @@ -59,7 +58,7 @@ void init(void) { systick_init(SYSTICK_RELOAD_VAL); gpio_init_all(); -#ifdef STM32F2 +#ifdef STM32F4 rcc_clk_enable(RCC_SYSCFG); #else afio_init(); @@ -69,7 +68,10 @@ void init(void) { setupADC(); setupTimers(); - //setupUSB(); +#ifdef SERIAL_USB + setupUSB(); + SerialUSB.begin(); +#endif } /* You could farm this out to the files in boards/ if e.g. it takes @@ -84,11 +86,13 @@ bool boardUsesPin(uint8 pin) { } static void setupFlash(void) { +/* #ifndef STM32F2 // for F2 and F4 CPUs this is done in SetupClock...(), e.g. in SetupClock168MHz() flash_enable_prefetch(); flash_set_latency(FLASH_WAIT_STATE_2); #endif +*/ } /* @@ -121,8 +125,8 @@ static void setupNVIC() { static void adcDefaultConfig(const adc_dev* dev); static void setupADC() { -#ifdef STM32F2 - setupADC_F2(); +#ifdef STM32F4 + setupADC_F4(); #else rcc_set_prescaler(RCC_PRESCALER_ADC, RCC_ADCPRE_PCLK_DIV_6); #endif diff --git a/STM32F4/cores/maple/boards.h b/STM32F4/cores/maple/boards.h index 00d07cddb..d37bff4a5 100644 --- a/STM32F4/cores/maple/boards.h +++ b/STM32F4/cores/maple/boards.h @@ -39,11 +39,8 @@ #ifndef _BOARDS_H_ #define _BOARDS_H_ -#include "libmaple.h" -#include "gpio.h" -#include "timer.h" - -#include "wirish_types.h" +#include +#include /* Set of all possible pin names; not all boards have all these (note * that we use the Dx convention since all of the Maple's pins are @@ -55,9 +52,12 @@ enum { D32, D33, D34, D35, D36, D37, D38, D39, D40, D41, D42, D43, D44, D45, D46, D47, D48, D49, D50, D51, D52, D53, D54, D55, D56, D57, D58, D59, D60, D61, D62, D63, D64, D65, D66, D67, D68, D69, D70, D71, D72, D73, D74, D75, D76, +#if 0 // not available on LQFP100 package D77, D78, D79, D80, D81, D82, D83, D84, D85, D86, D87, D88, D89, D90, D91, D92, D93, D94, D95, D96, D97, D98, D99, D100, D101, D102, D103, D104, D105, - D106, D107, D108, D109, D110, D111, }; + D106, D107, D108, D109, D110, D111, +#endif // not available on LQFP100 package +}; /** * @brief Maps each Maple pin to a corresponding stm32_pin_info. @@ -115,31 +115,20 @@ extern void boardInit(void); * @return true if the given pin is in boardUsedPins, and false otherwise. * @see boardUsedPins */ -bool boardUsesPin(uint8 pin); +extern bool boardUsesPin(uint8 pin); /* Include the appropriate private header from boards/: */ /* FIXME HACK put boards/ before these paths once IDE uses make. */ -#ifdef BOARD_maple -#include "maple.h" -#elif defined(BOARD_maple_native) -#include "maple_native.h" -#elif defined(BOARD_maple_mini) -#include "maple_mini.h" -#elif defined(BOARD_maple_RET6) -/* - * **NOT** MAPLE REV6. This the **Maple RET6 EDITION**, which is a - * Maple with an STM32F103RET6 (...RET6) instead of an STM32F103RBT6 - * (...RBT6) on it. Maple Rev6 (as of March 2011) DOES NOT EXIST. - */ -#include "maple_RET6.h" -#elif defined(BOARD_aeroquad32) || defined(BOARD_aeroquad32f1) +#if defined(BOARD_aeroquad32) || defined(BOARD_aeroquad32f1) #include "aeroquad32.h" #elif defined(BOARD_aeroquad32mini) #include "aeroquad32mini.h" #elif defined(BOARD_discovery_f4) #include "discovery_f4.h" +#elif defined(BOARD_generic_f407v) +#include "generic_f407v.h" #elif defined(BOARD_freeflight) #include "freeflight.h" #else @@ -160,4 +149,12 @@ bool boardUsesPin(uint8 pin); #define CLOCK_SPEED_MHZ CYCLES_PER_MICROSECOND #define CLOCK_SPEED_HZ (CLOCK_SPEED_MHZ * 1000000UL) +#ifndef SYSTICK_RELOAD_VAL +#define SYSTICK_RELOAD_VAL (1000 * CYCLES_PER_MICROSECOND - 1) +#endif + +#ifndef BOARD_BUTTON_PRESSED_LEVEL +#define BOARD_BUTTON_PRESSED_LEVEL HIGH +#endif + #endif diff --git a/STM32F4/cores/maple/ext_interrupts.cpp b/STM32F4/cores/maple/ext_interrupts.cpp index f014f1300..7111d0c86 100644 --- a/STM32F4/cores/maple/ext_interrupts.cpp +++ b/STM32F4/cores/maple/ext_interrupts.cpp @@ -31,8 +31,8 @@ */ #include "boards.h" -#include "gpio.h" -#include "exti.h" +#include +#include #include "ext_interrupts.h" static inline exti_trigger_mode exti_out_mode(ExtIntTriggerMode mode); @@ -51,7 +51,7 @@ void attachInterrupt(uint8 pin, voidFuncPtr handler, ExtIntTriggerMode mode) { exti_trigger_mode outMode = exti_out_mode(mode); - exti_attach_interrupt((afio_exti_num)(PIN_MAP[pin].gpio_bit), + exti_attach_interrupt((afio_exti_num)(pin&0x0F), gpio_exti_port(PIN_MAP[pin].gpio_device), handler, outMode); @@ -66,7 +66,7 @@ void detachInterrupt(uint8 pin) { return; } - exti_detach_interrupt((afio_exti_num)(PIN_MAP[pin].gpio_bit)); + exti_detach_interrupt((afio_exti_num)(pin&0x0F)); } static inline exti_trigger_mode exti_out_mode(ExtIntTriggerMode mode) { diff --git a/STM32F4/cores/maple/ext_interrupts.h b/STM32F4/cores/maple/ext_interrupts.h index b5c6f983b..fe215dceb 100644 --- a/STM32F4/cores/maple/ext_interrupts.h +++ b/STM32F4/cores/maple/ext_interrupts.h @@ -24,8 +24,8 @@ * SOFTWARE. *****************************************************************************/ -#include "libmaple_types.h" -#include "nvic.h" +#ifndef _EXT_INTERRUPTS_H_ +#define _EXT_INTERRUPTS_H_ /** * @file ext_interrupts.h @@ -33,8 +33,9 @@ * @brief Wiring-like external interrupt prototypes and types. */ -#ifndef _EXT_INTERRUPTS_H_ -#define _EXT_INTERRUPTS_H_ +#include +#include + /** * The kind of transition on an external pin which should trigger an diff --git a/STM32F4/cores/maple/io.h b/STM32F4/cores/maple/io.h index df1ab969e..aeaf0fd3a 100644 --- a/STM32F4/cores/maple/io.h +++ b/STM32F4/cores/maple/io.h @@ -33,8 +33,9 @@ #ifndef _IO_H_ #define _IO_H_ -#include "gpio.h" -#include "adc.h" +#include +#include +#include #include "wirish_time.h" @@ -179,9 +180,11 @@ static inline void toggleLED() { * accomplished portably over all LeafLabs boards by calling * pinMode(BOARD_BUTTON_PIN, INPUT). * + * @param button - one of available on-board buttons (up to 3 for generic F4) + * * @see pinMode() */ -uint8 isButtonPressed(); +uint8 isButtonPressed(uint8_t button); /** * Wait until the button is pressed and released, timing out if no @@ -195,12 +198,14 @@ uint8 isButtonPressed(); * button is pressed. If timeout_millis is left out (or 0), wait * forever. * + * @param button - one of available on-board buttons (up to 3 for generic F4) + * * @return true, if the button was pressed; false, if the timeout was * reached. * * @see pinMode() */ -uint8 waitForButtonPress(uint32 timeout_millis=0); +uint8 waitForButtonPress(uint8_t button, uint32 timeout_millis=0); /** * Shift out a byte of data, one bit at a time. diff --git a/STM32F4/cores/maple/itoa.h b/STM32F4/cores/maple/itoa.h index 59af10947..09e8b2f8e 100644 --- a/STM32F4/cores/maple/itoa.h +++ b/STM32F4/cores/maple/itoa.h @@ -16,8 +16,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _ITOA_ -#define _ITOA_ +#ifndef _ITOA_H_ +#define _ITOA_H_ #ifdef __cplusplus extern "C"{ diff --git a/STM32F4/cores/maple/libmaple/HardwareSPI.cpp b/STM32F4/cores/maple/libmaple/HardwareSPI.cpp deleted file mode 100644 index a5b4711be..000000000 --- a/STM32F4/cores/maple/libmaple/HardwareSPI.cpp +++ /dev/null @@ -1,424 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @author Marti Bolivar - * @brief Wirish SPI implementation. - */ - -#include "HardwareSPI.h" - -#include "timer.h" -#include "util.h" -#include "rcc.h" - -#include "wirish.h" -#include "boards.h" - -struct spi_pins { - uint8 nss; - uint8 sck; - uint8 miso; - uint8 mosi; -}; - -static const spi_pins* dev_to_spi_pins(spi_dev *dev); - -static void enable_device(spi_dev *dev, - bool as_master, - SPIFrequency frequency, - spi_cfg_flag endianness, - spi_mode mode); - -static const spi_pins board_spi_pins[] __FLASH__ = { - {BOARD_SPI1_NSS_PIN, - BOARD_SPI1_SCK_PIN, - BOARD_SPI1_MISO_PIN, - BOARD_SPI1_MOSI_PIN}, -#ifdef BOARD_SPI2_NSS_PIN - {BOARD_SPI2_NSS_PIN, - BOARD_SPI2_SCK_PIN, - BOARD_SPI2_MISO_PIN, - BOARD_SPI2_MOSI_PIN}, -#endif -#ifdef STM32_HIGH_DENSITY - {BOARD_SPI3B_NSS_PIN, - BOARD_SPI3B_SCK_PIN, - BOARD_SPI3B_MISO_PIN, - BOARD_SPI3B_MOSI_PIN}, -#endif -#ifdef STM32F4 - {BOARD_SPI3B_NSS_PIN, - BOARD_SPI3B_SCK_PIN, - BOARD_SPI3B_MISO_PIN, - BOARD_SPI3B_MOSI_PIN}, -#endif -}; - - -/* - * Constructor - */ - -HardwareSPI::HardwareSPI(uint32 spi_num) { - switch (spi_num) { - case 1: - this->spi_d = SPI1; - break; - case 2: - this->spi_d = SPI2; - break; -#ifdef STM32_HIGH_DENSITY - case 3: - this->spi_d = SPI3; - break; -#endif -#ifdef STM32F4 -// case 4: -// this->spi_d = SPI4; -// break; -#endif - default: - ASSERT(0); - } -} - -/* - * Set up/tear down - */ - -void HardwareSPI::begin(SPIFrequency frequency, uint32 bitOrder, uint32 mode) { - if (mode >= 4) { - ASSERT(0); - return; - } - spi_cfg_flag end = bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB; - spi_mode m = (spi_mode)mode; - enable_device(this->spi_d, true, frequency, end, m); -} - -void HardwareSPI::begin(void) { - this->begin(SPI_1_125MHZ, MSBFIRST, 0); -} - -void HardwareSPI::beginSlave(uint32 bitOrder, uint32 mode) { - if (mode >= 4) { - ASSERT(0); - return; - } - spi_cfg_flag end = bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB; - spi_mode m = (spi_mode)mode; - enable_device(this->spi_d, false, (SPIFrequency)0, end, m); -} - -void HardwareSPI::beginSlave(void) { - this->beginSlave(MSBFIRST, 0); -} - - -/* -void HardwareSPI::beginTransaction(uint8_t pin, SPISettings settings) -{ -// this->begin(settings.clock, settings.bitOrder, settings.dataMode); - this->begin(SPI_1_125MHZ, settings.bitOrder, settings.dataMode); -} -*/ - -void HardwareSPI::end(void) { - if (!spi_is_enabled(this->spi_d)) { - return; - } - - // Follows RM0008's sequence for disabling a SPI in master/slave - // full duplex mode. - while (spi_is_rx_nonempty(this->spi_d)) { - // FIXME [0.1.0] remove this once you have an interrupt based driver - volatile uint16 rx __attribute__((unused)) = spi_rx_reg(this->spi_d); - } - while (!spi_is_tx_empty(this->spi_d)) - ; - while (spi_is_busy(this->spi_d)) - ; - spi_peripheral_disable(this->spi_d); -} - -/* - * I/O - */ - -uint8 HardwareSPI::read(void) { - uint8 buf[1]; - this->read(buf, 1); - return buf[0]; -} - -void HardwareSPI::read(uint8 *buf, uint32 len) { - uint32 rxed = 0; - while (rxed < len) { - while (!spi_is_rx_nonempty(this->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(this->spi_d); - } -} - -#if 0 -void HardwareSPI::readMaster(uint8 *buf, uint32 len) { - uint32 rxed = 0; - while (rxed < len) { - spi_tx_reg(this->spi_d, 0xff); - while (!spi_is_rx_nonempty(this->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(this->spi_d); - buf[rxed++] = this->spi_d->regs->DR; - } -} -#endif -void HardwareSPI::readMaster(uint8 *buf, uint32 len) { - spi_reg_map *r = this->spi_d->regs; - uint32 rxed = 0; - while (rxed < len) { - r->DR = 0xff; - while (!(r->SR & SPI_SR_RXNE)) - ; - buf[rxed++] = r->DR; - } -} - - -void HardwareSPI::waitReady() { - while (!spi_is_rx_nonempty(this->spi_d)) - ; -} - -void HardwareSPI::write(uint8 byte) { - this->write(&byte, 1); -} - -void HardwareSPI::write(const uint8 *data, uint32 length) { - uint32 txed = 0; - while (txed < length) { - txed += spi_tx(this->spi_d, data + txed, length - txed); - } -} - -uint8 HardwareSPI::transfer(uint8 byte) { - this->write(byte); - return this->read(); -} - -/* - * Pin accessors - */ - -uint8 HardwareSPI::misoPin(void) { - return dev_to_spi_pins(this->spi_d)->miso; -} - -uint8 HardwareSPI::mosiPin(void) { - return dev_to_spi_pins(this->spi_d)->mosi; -} - -uint8 HardwareSPI::sckPin(void) { - return dev_to_spi_pins(this->spi_d)->sck; -} - -uint8 HardwareSPI::nssPin(void) { - return dev_to_spi_pins(this->spi_d)->nss; -} - -/* - * Deprecated functions - */ - -uint8 HardwareSPI::send(uint8 data) { - uint8 buf[] = {data}; - return this->send(buf, 1); -} - -#if 1 -uint8 HardwareSPI::send(const uint8 *buf, uint32 len) { - uint32 txed = 0; - uint8 ret = 0; - while (txed < len) { - this->write(buf[txed++]); - ret = this->read(); - } - return ret; -} -#else -// this does not work for an unknown reason -uint8 HardwareSPI::send(const uint8 *buf, uint32 len) { - volatile uint32 *dr = &(this->spi_d->regs->DR); - volatile uint32 *sr = &(this->spi_d->regs->SR); - uint32 txed = 0; - uint32 rx=0; - while (txed < len) { - //while (!(*sr & SPI_SR_TXE)) - // ; - //*dr = buf[txed++]; - this->write(buf[txed++]); - - while (!(*sr & SPI_SR_RXNE)) - ; - rx = *dr; - //rx = this->read(); - } - - return rx; -} -#endif - -uint8 HardwareSPI::recv(void) { - return this->read(); -} - -/* - * Auxiliary functions - */ - -static void configure_gpios(spi_dev *dev, bool as_master); -static spi_baud_rate determine_baud_rate(spi_dev *dev, SPIFrequency freq); - -static const spi_pins* dev_to_spi_pins(spi_dev *dev) { - switch (dev->clk_id) { - case RCC_SPI1: return board_spi_pins; - case RCC_SPI2: return board_spi_pins + 1; -#ifdef STM32_HIGH_DENSITY - case RCC_SPI3: return board_spi_pins + 2; -#endif -#ifdef STM32F4 - case RCC_SPI4: return board_spi_pins + 3; -#endif - default: return NULL; - } -} - -/* Enables the device in master or slave full duplex mode. If you - * change this code, you must ensure that appropriate changes are made - * to HardwareSPI::end(). */ -static void enable_device(spi_dev *dev, - bool as_master, - SPIFrequency freq, - spi_cfg_flag endianness, - spi_mode mode) { - spi_baud_rate baud = determine_baud_rate(dev, freq); - uint32 cfg_flags = (endianness | SPI_DFF_8_BIT | SPI_SW_SLAVE | - (as_master ? SPI_SOFT_SS : 0)); - - spi_init(dev); - configure_gpios(dev, as_master); - if (as_master) { - spi_master_enable(dev, baud, mode, cfg_flags); - } else { - spi_slave_enable(dev, mode, cfg_flags); - } -} - -static void disable_pwm(const stm32_pin_info *i) { - if (i->timer_device) { - timer_set_mode(i->timer_device, i->timer_channel, TIMER_DISABLED); - } -} - -static void configure_gpios(spi_dev *dev, bool as_master) { - const spi_pins *pins = dev_to_spi_pins(dev); - - if (!pins) { - return; - } - - const stm32_pin_info *nssi = (pins->nss >= 0) ? &PIN_MAP[pins->nss] : NULL; - const stm32_pin_info *scki = &PIN_MAP[pins->sck]; - const stm32_pin_info *misoi = &PIN_MAP[pins->miso]; - const stm32_pin_info *mosii = &PIN_MAP[pins->mosi]; - - if(nssi) { - disable_pwm(nssi); - } - disable_pwm(scki); - disable_pwm(misoi); - disable_pwm(mosii); - -#ifdef STM32F4 - if(dev->clk_id <= RCC_SPI2) { - if(nssi) { - if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 5); - } - } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 5); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 5); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 5); - } else { - if(nssi) { - if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 6); - } - } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 6); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 6); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 6); - } -#endif - - if(nssi) { - spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, - scki->gpio_device, scki->gpio_bit, - misoi->gpio_device, misoi->gpio_bit, - mosii->gpio_device, mosii->gpio_bit); - } else { - spi_config_gpios(dev, as_master, NULL, -1, - scki->gpio_device, scki->gpio_bit, - misoi->gpio_device, misoi->gpio_bit, - mosii->gpio_device, mosii->gpio_bit); - } -} - -static const spi_baud_rate baud_rates[MAX_SPI_FREQS] __FLASH__ = { - SPI_BAUD_PCLK_DIV_2, - SPI_BAUD_PCLK_DIV_4, - SPI_BAUD_PCLK_DIV_8, - SPI_BAUD_PCLK_DIV_16, - SPI_BAUD_PCLK_DIV_32, - SPI_BAUD_PCLK_DIV_64, - SPI_BAUD_PCLK_DIV_128, - SPI_BAUD_PCLK_DIV_256, -}; - -/* - * Note: This assumes you're on a LeafLabs-style board - * (CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). - */ -static spi_baud_rate determine_baud_rate(spi_dev *dev, SPIFrequency freq) { - if (rcc_dev_clk(dev->clk_id) == RCC_APB2 && freq == SPI_140_625KHZ) { - /* APB2 peripherals are too fast for 140.625 KHz */ - ASSERT(0); - return (spi_baud_rate)~0; - } - return (rcc_dev_clk(dev->clk_id) == RCC_APB2 ? - baud_rates[freq + 1] : - baud_rates[freq]); -} diff --git a/STM32F4/cores/maple/libmaple/HardwareSPI.h b/STM32F4/cores/maple/libmaple/HardwareSPI.h deleted file mode 100644 index 327f29da1..000000000 --- a/STM32F4/cores/maple/libmaple/HardwareSPI.h +++ /dev/null @@ -1,279 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file HardwareSPI.h - * @brief High-level SPI interface - * - * This is a "bare essentials" polling driver for now. - */ - -/* TODO [0.1.0] Remove deprecated methods. */ - -#include "libmaple_types.h" -#include "spi.h" - -#include "boards.h" -#include "wirish.h" - -#ifndef _HARDWARESPI_H_ -#define _HARDWARESPI_H_ - -/** - * @brief Defines the possible SPI communication speeds. - */ -typedef enum SPIFrequency { - SPI_18MHZ = 0, /**< 18 MHz */ - SPI_9MHZ = 1, /**< 9 MHz */ - SPI_4_5MHZ = 2, /**< 4.5 MHz */ - SPI_2_25MHZ = 3, /**< 2.25 MHz */ - SPI_1_125MHZ = 4, /**< 1.125 MHz */ - SPI_562_500KHZ = 5, /**< 562.500 KHz */ - SPI_281_250KHZ = 6, /**< 281.250 KHz */ - SPI_140_625KHZ = 7, /**< 140.625 KHz */ -} SPIFrequency; - -#define MAX_SPI_FREQS 8 - -#if CYCLES_PER_MICROSECOND != 72 -/* TODO [0.2.0?] something smarter than this */ -//#warning "Unexpected clock speed; SPI frequency calculation will be incorrect" -#endif - - -//#define BOARD_SPI_DEFAULT_SS PC13 -#define BOARD_SPI_DEFAULT_SS PB0 -#define SPI_MODE0 SPI_MODE_0 -#define SPI_MODE1 SPI_MODE_1 -#define SPI_MODE2 SPI_MODE_2 -#define SPI_MODE3 SPI_MODE_3 - -/* -class SPISettings { -public: - SPISettings(uint32 clock, BitOrder bitOrder, uint8 dataMode) { - if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, dataMode); - } else { - init_MightInline(clock, bitOrder, dataMode); - } - } - SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } -private: - void init_MightInline(uint32 clock, BitOrder bitOrder, uint8 dataMode) { - init_AlwaysInline(clock, bitOrder, dataMode); - } - void init_AlwaysInline(uint32 clock, BitOrder bitOrder, uint8 dataMode) __attribute__((__always_inline__)) { - this->clock = clock; - this->bitOrder = bitOrder; - this->dataMode = dataMode; - } - uint32 clock; - BitOrder bitOrder; - uint8 dataMode; - friend class HardwareSPI; -}; -*/ - - -/** - * @brief Wirish SPI interface. - * - * This implementation uses software slave management, so the caller - * is responsible for controlling the slave select line. - */ -class HardwareSPI { -public: - /** - * @param spiPortNumber Number of the SPI port to manage. - */ - HardwareSPI(uint32 spiPortNumber); - - /* - * Set up/tear down - */ - - /** - * @brief Turn on a SPI port and set its GPIO pin modes for use as master. - * - * SPI port is enabled in full duplex mode, with software slave management. - * - * @param frequency Communication frequency - * @param bitOrder Either LSBFIRST (little-endian) or MSBFIRST (big-endian) - * @param mode SPI mode to use, one of SPI_MODE_0, SPI_MODE_1, - * SPI_MODE_2, and SPI_MODE_3. - */ - void begin(SPIFrequency frequency, uint32 bitOrder, uint32 mode); - - /** - * @brief Equivalent to begin(SPI_1_125MHZ, MSBFIRST, 0). - */ - void begin(void); - - /** - * @brief Turn on a SPI port and set its GPIO pin modes for use as a slave. - * - * SPI port is enabled in full duplex mode, with software slave management. - * - * @param bitOrder Either LSBFIRST (little-endian) or MSBFIRST(big-endian) - * @param mode SPI mode to use - */ - void beginSlave(uint32 bitOrder, uint32 mode); - - /** - * @brief Equivalent to beginSlave(MSBFIRST, 0). - */ - void beginSlave(void); - - /** - * @brief Disables the SPI port, but leaves its GPIO pin modes unchanged. - */ - void end(void); - - /* - * I/O - */ - - /** - * @brief Return the next unread byte. - * - * If there is no unread byte waiting, this function will block - * until one is received. - */ - uint8 read(void); - - /** - * @brief Read length bytes, storing them into buffer. - * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This - * function will block until the desired number of - * bytes have been read. - */ - void read(uint8 *buffer, uint32 length); - - /** - * @brief Read length bytes, storing them into buffer. - * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This - * function will block until the desired number of - * bytes have been read. - */ - void readMaster(uint8 *buffer, uint32 length); - - - void waitReady(); - /** - * @brief Transmit a byte. - * @param data Byte to transmit. - */ - void write(uint8 data); - - /** - * @brief Transmit multiple bytes. - * @param buffer Bytes to transmit. - * @param length Number of bytes in buffer to transmit. - */ - void write(const uint8 *buffer, uint32 length); - - /** - * @brief Transmit a byte, then return the next unread byte. - * - * This function transmits before receiving. - * - * @param data Byte to transmit. - * @return Next unread byte. - */ - uint8 transfer(uint8 data); - - /* - * Pin accessors - */ - - /** - * @brief Return the number of the MISO (master in, slave out) pin - */ - uint8 misoPin(void); - - /** - * @brief Return the number of the MOSI (master out, slave in) pin - */ - uint8 mosiPin(void); - - /** - * @brief Return the number of the SCK (serial clock) pin - */ - uint8 sckPin(void); - - /** - * @brief Return the number of the NSS (slave select) pin - */ - uint8 nssPin(void); - - /* -- The following methods are deprecated --------------------------- */ - - /** - * @brief Deprecated. - * - * Use HardwareSPI::transfer() instead. - * - * @see HardwareSPI::transfer() - */ - uint8 send(uint8 data); - - /** - * @brief Deprecated. - * - * Use HardwareSPI::write() in combination with - * HardwareSPI::read() (or HardwareSPI::transfer()) instead. - * - * @see HardwareSPI::write() - * @see HardwareSPI::read() - * @see HardwareSPI::transfer() - */ - uint8 send(const uint8 *data, uint32 length); - - /** - * @brief Deprecated. - * - * Use HardwareSPI::read() instead. - * - * @see HardwareSPI::read() - */ - uint8 recv(void); - -// void beginTransaction(SPISettings settings) { beginTransaction(BOARD_SPI_DEFAULT_SS, settings); } -// void beginTransaction(uint8 pin, SPISettings settings); - void endTransaction(void) { } - -private: - spi_dev *spi_d; -}; - - -extern HardwareSPI SPI; - -#endif - diff --git a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp index 59ce71d11..f9387d15a 100644 --- a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp +++ b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp @@ -56,19 +56,19 @@ #define RX5 BOARD_UART5_RX_PIN #endif -HardwareSerial Serial(USART1, TX1, RX1); +HardwareSerial Serial1(USART1, TX1, RX1); #ifdef TX2 -HardwareSerial Serial1(USART2, TX2, RX2); +HardwareSerial Serial2(USART2, TX2, RX2); #endif #ifdef TX3 -HardwareSerial Serial2(USART3, TX3, RX3); +HardwareSerial Serial3(USART3, TX3, RX3); #endif #if defined(STM32_HIGH_DENSITY) && !defined(BOARD_maple_RET6) -HardwareSerial Serial3(UART4, TX4, RX4); -HardwareSerial Serial4(UART5, TX5, RX5); +HardwareSerial Serial4(UART4, TX4, RX4); +HardwareSerial Serial5(UART5, TX5, RX5); #endif HardwareSerial::HardwareSerial(usart_dev *usart_device, @@ -90,25 +90,23 @@ void HardwareSerial::begin(uint32 baud) { return; } - const stm32_pin_info *txi = &PIN_MAP[tx_pin]; - const stm32_pin_info *rxi = &PIN_MAP[rx_pin]; -#ifdef STM32F2 +#ifdef STM32F4 // int af = 7<<8; if (usart_device == UART4 || usart_device == UART5) { - gpio_set_af_mode(txi->gpio_device, txi->gpio_bit, 8); - gpio_set_af_mode(rxi->gpio_device, rxi->gpio_bit, 8); + gpio_set_af_mode(tx_pin, 8); + gpio_set_af_mode(rx_pin, 8); } else { - gpio_set_af_mode(txi->gpio_device, txi->gpio_bit, 7); - gpio_set_af_mode(rxi->gpio_device, rxi->gpio_bit, 7); + gpio_set_af_mode(tx_pin, 7); + gpio_set_af_mode(rx_pin, 7); } - gpio_set_mode(txi->gpio_device, txi->gpio_bit, (gpio_pin_mode)(GPIO_AF_OUTPUT_PP | GPIO_PUPD_INPUT_PU | 0x700)); - gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, (gpio_pin_mode)(GPIO_MODE_AF | GPIO_PUPD_INPUT_PU | 0x700)); + gpio_set_mode(tx_pin, (gpio_pin_mode)(GPIO_AF_OUTPUT_PP | GPIO_PUPD_INPUT_PU | 0x700)); + gpio_set_mode(rx_pin, (gpio_pin_mode)(GPIO_MODE_AF | GPIO_PUPD_INPUT_PU | 0x700)); //gpio_set_mode(txi->gpio_device, txi->gpio_bit, (gpio_pin_mode)(GPIO_PUPD_INPUT_PU)); //gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, (gpio_pin_mode)(GPIO_PUPD_INPUT_PU)); #else - gpio_set_mode(txi->gpio_device, txi->gpio_bit, GPIO_AF_OUTPUT_PP); - gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(tx_pin, GPIO_AF_OUTPUT_PP); + gpio_set_mode(rx_pin, GPIO_INPUT_FLOATING); #endif #if 0 if (txi->timer_device != NULL) { diff --git a/STM32F4/cores/maple/libmaple/HardwareSerial.h b/STM32F4/cores/maple/libmaple/HardwareSerial.h index c09fe54f1..d7e8a3d1f 100644 --- a/STM32F4/cores/maple/libmaple/HardwareSerial.h +++ b/STM32F4/cores/maple/libmaple/HardwareSerial.h @@ -75,12 +75,12 @@ class HardwareSerial : public Stream { uint8 rx_pin; }; -extern HardwareSerial Serial; extern HardwareSerial Serial1; extern HardwareSerial Serial2; #if defined(STM32_HIGH_DENSITY) && !defined(BOARD_maple_RET6) extern HardwareSerial Serial3; extern HardwareSerial Serial4; +extern HardwareSerial Serial5; #endif extern HardwareSerial &SerialDebug; #endif diff --git a/STM32F4/cores/maple/libmaple/adc.c b/STM32F4/cores/maple/libmaple/adc.c index aeeb43c0e..0f4c02c3c 100644 --- a/STM32F4/cores/maple/libmaple/adc.c +++ b/STM32F4/cores/maple/libmaple/adc.c @@ -41,27 +41,24 @@ #include "rcc.h" #include "adc.h" -static adc_dev adc1 = { +/** ADC1 device. */ +const adc_dev ADC1 = { .regs = ADC1_BASE, .clk_id = RCC_ADC1 }; -/** ADC1 device. */ -const adc_dev *ADC1 = &adc1; -static adc_dev adc2 = { +/** ADC2 device. */ +const adc_dev ADC2 = { .regs = ADC2_BASE, .clk_id = RCC_ADC2 }; -/** ADC2 device. */ -const adc_dev *ADC2 = &adc2; #ifdef STM32_HIGH_DENSITY -adc_dev adc3 = { +/** ADC3 device. */ +const adc_dev ADC3 = { .regs = ADC3_BASE, .clk_id = RCC_ADC3 }; -/** ADC3 device. */ -const adc_dev *ADC3 = &adc3; #endif /** @@ -74,7 +71,7 @@ const adc_dev *ADC3 = &adc3; */ void adc_init(const adc_dev *dev) { rcc_clk_enable(dev->clk_id); -#ifdef STM32F2 +#ifdef STM32F4 if(dev->clk_id == RCC_ADC1) { rcc_reset_dev(dev->clk_id); } @@ -101,10 +98,10 @@ void adc_set_extsel(const adc_dev *dev, adc_extsel_event event) { * @param fn Function to call on each ADC device. */ void adc_foreach(void (*fn)(const adc_dev*)) { - fn(ADC1); - fn(ADC2); + fn(&ADC1); + fn(&ADC2); #ifdef STM32_HIGH_DENSITY - fn(ADC3); + fn(&ADC3); #endif } @@ -136,7 +133,9 @@ void adc_set_sample_rate(const adc_dev *dev, adc_smp_rate smp_rate) { * @brief Calibrate an ADC peripheral * @param dev adc device */ -void adc_calibrate(const adc_dev *dev) { +void adc_calibrate(const adc_dev *dev) +{ +/* #ifndef STM32F2 __io uint32 *rstcal_bit = bb_perip(&(dev->regs->CR2), 3); __io uint32 *cal_bit = bb_perip(&(dev->regs->CR2), 2); @@ -149,6 +148,7 @@ void adc_calibrate(const adc_dev *dev) { while (*cal_bit) ; #endif +*/ } /** @@ -171,8 +171,8 @@ uint16 adc_read(const adc_dev *dev, uint8 channel) { return (uint16)(regs->DR & ADC_DR_DATA); } -void setupADC_F2() { -#ifdef STM32F2 +void setupADC_F4(void) +{ uint32 tmpreg1 = 0; tmpreg1 = ADC_COMMON->CCR; @@ -196,5 +196,4 @@ void setupADC_F2() { /* Write to ADC CCR */ ADC_COMMON->CCR = tmpreg1; -#endif } diff --git a/STM32F4/cores/maple/libmaple/adc.h b/STM32F4/cores/maple/libmaple/adc.h index 3a40d4c58..6fa61f5ea 100644 --- a/STM32F4/cores/maple/libmaple/adc.h +++ b/STM32F4/cores/maple/libmaple/adc.h @@ -42,17 +42,15 @@ extern "C"{ #endif -#ifdef STM32F2 - typedef struct - { - __io uint32 CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __io uint32 CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __io uint32 CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ - } ADC_Common_TypeDef; +typedef struct +{ + __io uint32 CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __io uint32 CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __io uint32 CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; #define ADC_COMMON ((ADC_Common_TypeDef *) 0x40012300) -#endif /** ADC register map type. */ typedef struct adc_reg_map { @@ -84,33 +82,22 @@ typedef struct adc_dev { rcc_clk_id clk_id; /**< RCC clock information */ } adc_dev; -extern const adc_dev *ADC1; -extern const adc_dev *ADC2; +extern const adc_dev ADC1; +extern const adc_dev ADC2; #ifdef STM32_HIGH_DENSITY -extern const adc_dev *ADC3; +extern const adc_dev ADC3; #endif /* * Register map base pointers */ -#ifdef STM32F2 - /** ADC1 register map base pointer. */ - #define ADC1_BASE ((struct adc_reg_map*)0x40012000) - /** ADC2 register map base pointer. */ - #define ADC2_BASE ((struct adc_reg_map*)0x40012100) - /** ADC3 register map base pointer. */ - #define ADC3_BASE ((struct adc_reg_map*)0x40012200) -#else - /** ADC1 register map base pointer. */ - #define ADC1_BASE ((struct adc_reg_map*)0x40012400) - /** ADC2 register map base pointer. */ - #define ADC2_BASE ((struct adc_reg_map*)0x40012800) - #ifdef STM32_HIGH_DENSITY - /** ADC3 register map base pointer. */ - #define ADC3_BASE ((struct adc_reg_map*)0x40013C00) - #endif -#endif +/** ADC1 register map base pointer. */ +#define ADC1_BASE ((struct adc_reg_map*)0x40012000) +/** ADC2 register map base pointer. */ +#define ADC2_BASE ((struct adc_reg_map*)0x40012100) +/** ADC3 register map base pointer. */ +#define ADC3_BASE ((struct adc_reg_map*)0x40012200) /* * Register bit definitions @@ -167,17 +154,10 @@ extern const adc_dev *ADC3; #define ADC_CR2_JEXTTRIG_BIT 15 #define ADC_CR2_EXTTRIG_BIT 20 #define ADC_CR2_TSEREFE_BIT 23 -#ifdef STM32F2 #define ADC_CR2_JSWSTART_BIT 22 #define ADC_CR2_SWSTART_BIT 30 #define ADC_CR2_EXTSEL (0x0F000000) #define ADC_CR2_JEXTSEL (0x000F0000) -#else -#define ADC_CR2_JSWSTART_BIT 21 -#define ADC_CR2_SWSTART_BIT 22 -#define ADC_CR2_EXTSEL (0x000E0000) -#define ADC_CR2_JEXTSEL (0x00007000) -#endif @@ -388,7 +368,7 @@ static inline void adc_disable_all(void) { adc_foreach(adc_disable); } -void setupADC_F2(); +extern void setupADC_F4(void); #ifdef __cplusplus } // extern "C" diff --git a/STM32F4/cores/maple/libmaple/dac.c b/STM32F4/cores/maple/libmaple/dac.c index 264e4e21a..3853f903c 100644 --- a/STM32F4/cores/maple/libmaple/dac.c +++ b/STM32F4/cores/maple/libmaple/dac.c @@ -126,11 +126,11 @@ void dac_enable_channel(const dac_dev *dev, uint8 channel) { */ switch (channel) { case 1: - gpio_set_mode(GPIOA, 4, GPIO_INPUT_ANALOG); + gpio_set_mode((uint8_t)PA4, GPIO_INPUT_ANALOG); dev->regs->CR |= DAC_CR_EN1; break; case 2: - gpio_set_mode(GPIOA, 5, GPIO_INPUT_ANALOG); + gpio_set_mode((uint8_t)PA5, GPIO_INPUT_ANALOG); dev->regs->CR |= DAC_CR_EN2; break; } diff --git a/STM32F4/cores/maple/libmaple/dma.h b/STM32F4/cores/maple/libmaple/dma.h index a965c036f..420adf8a4 100644 --- a/STM32F4/cores/maple/libmaple/dma.h +++ b/STM32F4/cores/maple/libmaple/dma.h @@ -30,9 +30,4 @@ * @brief Direct Memory Access peripheral support */ -#ifdef STM32F2 -#include "dmaF2.h" -#include -#else -#include "dmaF1.h" -#endif +#include "dmaF4.h" diff --git a/STM32F4/cores/maple/libmaple/dmaF1.c b/STM32F4/cores/maple/libmaple/dmaF1.c deleted file mode 100644 index f8ddb2d22..000000000 --- a/STM32F4/cores/maple/libmaple/dmaF1.c +++ /dev/null @@ -1,383 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -#ifdef STM32F1 - -/** - * @file dma.c - * @author Marti Bolivar ; - * Original implementation by Michael Hope - * @brief Direct Memory Access peripheral support - */ - -#include "dma.h" -#include "bitband.h" -#include "util.h" - -/* - * Devices - */ - -static dma_dev dma1 = { - .regs = DMA1_BASE, - .clk_id = RCC_DMA1, - .handlers = {{ .handler = NULL, .irq_line = NVIC_DMA_CH1 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH2 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH3 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH4 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH5 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH6 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH7 }} -}; -/** DMA1 device */ -dma_dev *DMA1 = &dma1; - -#ifdef STM32_HIGH_DENSITY -static dma_dev dma2 = { - .regs = DMA2_BASE, - .clk_id = RCC_DMA2, - .handlers = {{ .handler = NULL, .irq_line = NVIC_DMA2_CH1 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH2 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH3 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH_4_5 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH_4_5 }} /* !@#$ */ -}; -/** DMA2 device */ -dma_dev *DMA2 = &dma2; -#endif - -/* - * Convenience routines - */ - -/** - * @brief Initialize a DMA device. - * @param dev Device to initialize. - */ -void dma_init(dma_dev *dev) { - rcc_clk_enable(dev->clk_id); -} - -/** - * @brief Set up a DMA transfer. - * - * The channel will be disabled before being reconfigured. The - * transfer will have low priority by default. You may choose another - * priority before the transfer begins using dma_set_priority(), as - * well as performing any other configuration you desire. When the - * channel is configured to your liking, enable it using dma_enable(). - * - * @param dev DMA device. - * @param channel DMA channel. - * @param peripheral_address Base address of peripheral data register - * involved in the transfer. - * @param peripheral_size Peripheral data transfer size. - * @param memory_address Base memory address involved in the transfer. - * @param memory_size Memory data transfer size. - * @param mode Logical OR of dma_mode_flags - * @sideeffect Disables the given DMA channel. - * @see dma_xfer_size - * @see dma_mode_flags - * @see dma_set_num_transfers() - * @see dma_set_priority() - * @see dma_attach_interrupt() - * @see dma_enable() - */ -void dma_setup_transfer(dma_dev *dev, - dma_channel channel, - __io void *peripheral_address, - dma_xfer_size peripheral_size, - __io void *memory_address, - dma_xfer_size memory_size, - uint32 mode) { - dma_channel_reg_map *channel_regs = dma_channel_regs(dev, channel); - - dma_disable(dev, channel); /* can't write to CMAR/CPAR otherwise */ - channel_regs->CCR = (memory_size << 10) | (peripheral_size << 8) | mode; - channel_regs->CMAR = (uint32)memory_address; - channel_regs->CPAR = (uint32)peripheral_address; -} - -/** - * @brief Set the number of data to be transferred on a DMA channel. - * - * You may not call this function while the channel is enabled. - * - * @param dev DMA device - * @param channel Channel through which the transfer occurs. - * @param num_transfers - */ -void dma_set_num_transfers(dma_dev *dev, - dma_channel channel, - uint16 num_transfers) { - dma_channel_reg_map *channel_regs; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - channel_regs = dma_channel_regs(dev, channel); - channel_regs->CNDTR = num_transfers; -} - -/** - * @brief Set the priority of a DMA transfer. - * - * You may not call this function while the channel is enabled. - * - * @param dev DMA device - * @param channel DMA channel - * @param priority priority to set. - */ -void dma_set_priority(dma_dev *dev, - dma_channel channel, - dma_priority priority) { - dma_channel_reg_map *channel_regs; - uint32 ccr; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - channel_regs = dma_channel_regs(dev, channel); - ccr = channel_regs->CCR; - ccr &= ~DMA_CCR_PL; - ccr |= priority; - channel_regs->CCR = ccr; -} - -/** - * @brief Attach an interrupt to a DMA transfer. - * - * Interrupts are enabled using appropriate mode flags in - * dma_setup_transfer(). - * - * @param dev DMA device - * @param channel Channel to attach handler to - * @param handler Interrupt handler to call when channel interrupt fires. - * @see dma_setup_transfer() - * @see dma_get_irq_cause() - * @see dma_detach_interrupt() - */ -void dma_attach_interrupt(dma_dev *dev, - dma_channel channel, - void (*handler)(void)) { - dev->handlers[channel - 1].handler = handler; - nvic_irq_enable(dev->handlers[channel - 1].irq_line); -} - -/** - * @brief Detach a DMA transfer interrupt handler. - * - * After calling this function, the given channel's interrupts will be - * disabled. - * - * @param dev DMA device - * @param channel Channel whose handler to detach - * @sideeffect Clears interrupt enable bits in the channel's CCR register. - * @see dma_attach_interrupt() - */ -void dma_detach_interrupt(dma_dev *dev, dma_channel channel) { - /* Don't use nvic_irq_disable()! Think about DMA2 channels 4 and 5. */ - dma_channel_regs(dev, channel)->CCR &= ~0xF; - dev->handlers[channel - 1].handler = NULL; -} - -/** - * @brief Discover the reason why a DMA interrupt was called. - * - * You may only call this function within an attached interrupt - * handler for the given channel. - * - * This function resets the internal DMA register state which encodes - * the cause of the interrupt; consequently, it can only be called - * once per interrupt handler invocation. - * - * @param dev DMA device - * @param channel Channel whose interrupt is being handled. - * @return Reason why the interrupt fired. - * @sideeffect Clears channel status flags in dev->regs->ISR. - * @see dma_attach_interrupt() - * @see dma_irq_cause - */ -dma_irq_cause dma_get_irq_cause(dma_dev *dev, dma_channel channel) { - uint8 status_bits = dma_get_isr_bits(dev, channel); - - /* If the channel global interrupt flag is cleared, then - * something's very wrong. */ - ASSERT(status_bits & BIT(0)); - - dma_clear_isr_bits(dev, channel); - - /* ISR flags get set even if the corresponding interrupt enable - * bits in the channel's configuration register are cleared, so we - * can't use a switch here. - * - * Don't change the order of these if statements. */ - if (status_bits & BIT(3)) { - return DMA_TRANSFER_ERROR; - } else if (status_bits & BIT(1)) { - return DMA_TRANSFER_COMPLETE; - } else if (status_bits & BIT(2)) { - return DMA_TRANSFER_HALF_COMPLETE; - } else if (status_bits & BIT(0)) { - /* Shouldn't happen (unless someone messed up an IFCR write). */ - throb(); - } -#if DEBUG_LEVEL < DEBUG_ALL - else { - /* We shouldn't have been called, but the debug level is too - * low for the above ASSERT() to have had any effect. In - * order to fail fast, mimic the DMA controller's behavior - * when an error occurs. */ - dma_disable(dev, channel); - } -#endif - return DMA_TRANSFER_ERROR; -} - -/** - * @brief Enable a DMA channel. - * @param dev DMA device - * @param channel Channel to enable - */ -void dma_enable(dma_dev *dev, dma_channel channel) { - dma_channel_reg_map *chan_regs = dma_channel_regs(dev, channel); - bb_peri_set_bit(&chan_regs->CCR, DMA_CCR_EN_BIT, 1); -} - -/** - * @brief Disable a DMA channel. - * @param dev DMA device - * @param channel Channel to disable - */ -void dma_disable(dma_dev *dev, dma_channel channel) { - dma_channel_reg_map *chan_regs = dma_channel_regs(dev, channel); - bb_peri_set_bit(&chan_regs->CCR, DMA_CCR_EN_BIT, 0); -} - -/** - * @brief Set the base memory address where data will be read from or - * written to. - * - * You must not call this function while the channel is enabled. - * - * If the DMA memory size is 16 bits, the address is automatically - * aligned to a half-word. If the DMA memory size is 32 bits, the - * address is aligned to a word. - * - * @param dev DMA Device - * @param channel Channel whose base memory address to set. - * @param addr Memory base address to use. - */ -void dma_set_mem_addr(dma_dev *dev, dma_channel channel, __io void *addr) { - dma_channel_reg_map *chan_regs; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - chan_regs = dma_channel_regs(dev, channel); - chan_regs->CMAR = (uint32)addr; -} - -/** - * @brief Set the base peripheral address where data will be read from - * or written to. - * - * You must not call this function while the channel is enabled. - * - * If the DMA peripheral size is 16 bits, the address is automatically - * aligned to a half-word. If the DMA peripheral size is 32 bits, the - * address is aligned to a word. - * - * @param dev DMA Device - * @param channel Channel whose peripheral data register base address to set. - * @param addr Peripheral memory base address to use. - */ -void dma_set_per_addr(dma_dev *dev, dma_channel channel, __io void *addr) { - dma_channel_reg_map *chan_regs; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - chan_regs = dma_channel_regs(dev, channel); - chan_regs->CPAR = (uint32)addr; -} - -/* - * IRQ handlers - */ - -static inline void dispatch_handler(dma_dev *dev, dma_channel channel) { - void (*handler)(void) = dev->handlers[channel - 1].handler; - if (handler) { - handler(); - dma_clear_isr_bits(dev, channel); /* in case handler doesn't */ - } -} - -void __irq_dma1_channel1(void) { - dispatch_handler(DMA1, DMA_CH1); -} - -void __irq_dma1_channel2(void) { - dispatch_handler(DMA1, DMA_CH2); -} - -void __irq_dma1_channel3(void) { - dispatch_handler(DMA1, DMA_CH3); -} - -void __irq_dma1_channel4(void) { - dispatch_handler(DMA1, DMA_CH4); -} - -void __irq_dma1_channel5(void) { - dispatch_handler(DMA1, DMA_CH5); -} - -void __irq_dma1_channel6(void) { - dispatch_handler(DMA1, DMA_CH6); -} - -void __irq_dma1_channel7(void) { - dispatch_handler(DMA1, DMA_CH7); -} - -#ifdef STM32_HIGH_DENSITY -void __irq_dma2_channel1(void) { - dispatch_handler(DMA2, DMA_CH1); -} - -void __irq_dma2_channel2(void) { - dispatch_handler(DMA2, DMA_CH2); -} - -void __irq_dma2_channel3(void) { - dispatch_handler(DMA2, DMA_CH3); -} - -void __irq_dma2_channel4_5(void) { - dispatch_handler(DMA2, DMA_CH4); - dispatch_handler(DMA2, DMA_CH5); -} -#endif - -#endif \ No newline at end of file diff --git a/STM32F4/cores/maple/libmaple/dmaF1.h b/STM32F4/cores/maple/libmaple/dmaF1.h deleted file mode 100644 index 6e8087f49..000000000 --- a/STM32F4/cores/maple/libmaple/dmaF1.h +++ /dev/null @@ -1,453 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file dma.h - * - * @author Marti Bolivar ; - * Original implementation by Michael Hope - * - * @brief Direct Memory Access peripheral support - */ - -/* - * See /notes/dma.txt for more information. - */ - -#ifndef _DMA_H_ -#define _DMA_H_ - -#include "libmaple_types.h" -#include "rcc.h" -#include "nvic.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Register maps - */ - -/** - * @brief DMA register map type. - * - * Note that DMA controller 2 (register map base pointer DMA2_BASE) - * only supports channels 1--5. - */ -typedef struct dma_reg_map { - __io uint32 ISR; /**< Interrupt status register */ - __io uint32 IFCR; /**< Interrupt flag clear register */ - __io uint32 CCR1; /**< Channel 1 configuration register */ - __io uint32 CNDTR1; /**< Channel 1 number of data register */ - __io uint32 CPAR1; /**< Channel 1 peripheral address register */ - __io uint32 CMAR1; /**< Channel 1 memory address register */ - const uint32 RESERVED1; /**< Reserved. */ - __io uint32 CCR2; /**< Channel 2 configuration register */ - __io uint32 CNDTR2; /**< Channel 2 number of data register */ - __io uint32 CPAR2; /**< Channel 2 peripheral address register */ - __io uint32 CMAR2; /**< Channel 2 memory address register */ - const uint32 RESERVED2; /**< Reserved. */ - __io uint32 CCR3; /**< Channel 3 configuration register */ - __io uint32 CNDTR3; /**< Channel 3 number of data register */ - __io uint32 CPAR3; /**< Channel 3 peripheral address register */ - __io uint32 CMAR3; /**< Channel 3 memory address register */ - const uint32 RESERVED3; /**< Reserved. */ - __io uint32 CCR4; /**< Channel 4 configuration register */ - __io uint32 CNDTR4; /**< Channel 4 number of data register */ - __io uint32 CPAR4; /**< Channel 4 peripheral address register */ - __io uint32 CMAR4; /**< Channel 4 memory address register */ - const uint32 RESERVED4; /**< Reserved. */ - __io uint32 CCR5; /**< Channel 5 configuration register */ - __io uint32 CNDTR5; /**< Channel 5 number of data register */ - __io uint32 CPAR5; /**< Channel 5 peripheral address register */ - __io uint32 CMAR5; /**< Channel 5 memory address register */ - const uint32 RESERVED5; /**< Reserved. */ - __io uint32 CCR6; /**< Channel 6 configuration register */ - __io uint32 CNDTR6; /**< Channel 6 number of data register */ - __io uint32 CPAR6; /**< Channel 6 peripheral address register */ - __io uint32 CMAR6; /**< Channel 6 memory address register */ - const uint32 RESERVED6; /**< Reserved. */ - __io uint32 CCR7; /**< Channel 7 configuration register */ - __io uint32 CNDTR7; /**< Channel 7 number of data register */ - __io uint32 CPAR7; /**< Channel 7 peripheral address register */ - __io uint32 CMAR7; /**< Channel 7 memory address register */ - const uint32 RESERVED7; /**< Reserved. */ -} dma_reg_map; - -/** DMA controller 1 register map base pointer */ -#define DMA1_BASE ((struct dma_reg_map*)0x40020000) - -#ifdef STM32_HIGH_DENSITY -/** DMA controller 2 register map base pointer */ -#define DMA2_BASE ((struct dma_reg_map*)0x40020400) -#endif - -/* - * Register bit definitions - */ - -/* Interrupt status register */ - -#define DMA_ISR_TEIF7_BIT 27 -#define DMA_ISR_HTIF7_BIT 26 -#define DMA_ISR_TCIF7_BIT 25 -#define DMA_ISR_GIF7_BIT 24 -#define DMA_ISR_TEIF6_BIT 23 -#define DMA_ISR_HTIF6_BIT 22 -#define DMA_ISR_TCIF6_BIT 21 -#define DMA_ISR_GIF6_BIT 20 -#define DMA_ISR_TEIF5_BIT 19 -#define DMA_ISR_HTIF5_BIT 18 -#define DMA_ISR_TCIF5_BIT 17 -#define DMA_ISR_GIF5_BIT 16 -#define DMA_ISR_TEIF4_BIT 15 -#define DMA_ISR_HTIF4_BIT 14 -#define DMA_ISR_TCIF4_BIT 13 -#define DMA_ISR_GIF4_BIT 12 -#define DMA_ISR_TEIF3_BIT 11 -#define DMA_ISR_HTIF3_BIT 10 -#define DMA_ISR_TCIF3_BIT 9 -#define DMA_ISR_GIF3_BIT 8 -#define DMA_ISR_TEIF2_BIT 7 -#define DMA_ISR_HTIF2_BIT 6 -#define DMA_ISR_TCIF2_BIT 5 -#define DMA_ISR_GIF2_BIT 4 -#define DMA_ISR_TEIF1_BIT 3 -#define DMA_ISR_HTIF1_BIT 2 -#define DMA_ISR_TCIF1_BIT 1 -#define DMA_ISR_GIF1_BIT 0 - -#define DMA_ISR_TEIF7 BIT(DMA_ISR_TEIF7_BIT) -#define DMA_ISR_HTIF7 BIT(DMA_ISR_HTIF7_BIT) -#define DMA_ISR_TCIF7 BIT(DMA_ISR_TCIF7_BIT) -#define DMA_ISR_GIF7 BIT(DMA_ISR_GIF7_BIT) -#define DMA_ISR_TEIF6 BIT(DMA_ISR_TEIF6_BIT) -#define DMA_ISR_HTIF6 BIT(DMA_ISR_HTIF6_BIT) -#define DMA_ISR_TCIF6 BIT(DMA_ISR_TCIF6_BIT) -#define DMA_ISR_GIF6 BIT(DMA_ISR_GIF6_BIT) -#define DMA_ISR_TEIF5 BIT(DMA_ISR_TEIF5_BIT) -#define DMA_ISR_HTIF5 BIT(DMA_ISR_HTIF5_BIT) -#define DMA_ISR_TCIF5 BIT(DMA_ISR_TCIF5_BIT) -#define DMA_ISR_GIF5 BIT(DMA_ISR_GIF5_BIT) -#define DMA_ISR_TEIF4 BIT(DMA_ISR_TEIF4_BIT) -#define DMA_ISR_HTIF4 BIT(DMA_ISR_HTIF4_BIT) -#define DMA_ISR_TCIF4 BIT(DMA_ISR_TCIF4_BIT) -#define DMA_ISR_GIF4 BIT(DMA_ISR_GIF4_BIT) -#define DMA_ISR_TEIF3 BIT(DMA_ISR_TEIF3_BIT) -#define DMA_ISR_HTIF3 BIT(DMA_ISR_HTIF3_BIT) -#define DMA_ISR_TCIF3 BIT(DMA_ISR_TCIF3_BIT) -#define DMA_ISR_GIF3 BIT(DMA_ISR_GIF3_BIT) -#define DMA_ISR_TEIF2 BIT(DMA_ISR_TEIF2_BIT) -#define DMA_ISR_HTIF2 BIT(DMA_ISR_HTIF2_BIT) -#define DMA_ISR_TCIF2 BIT(DMA_ISR_TCIF2_BIT) -#define DMA_ISR_GIF2 BIT(DMA_ISR_GIF2_BIT) -#define DMA_ISR_TEIF1 BIT(DMA_ISR_TEIF1_BIT) -#define DMA_ISR_HTIF1 BIT(DMA_ISR_HTIF1_BIT) -#define DMA_ISR_TCIF1 BIT(DMA_ISR_TCIF1_BIT) -#define DMA_ISR_GIF1 BIT(DMA_ISR_GIF1_BIT) - -/* Interrupt flag clear register */ - -#define DMA_IFCR_CTEIF7_BIT 27 -#define DMA_IFCR_CHTIF7_BIT 26 -#define DMA_IFCR_CTCIF7_BIT 25 -#define DMA_IFCR_CGIF7_BIT 24 -#define DMA_IFCR_CTEIF6_BIT 23 -#define DMA_IFCR_CHTIF6_BIT 22 -#define DMA_IFCR_CTCIF6_BIT 21 -#define DMA_IFCR_CGIF6_BIT 20 -#define DMA_IFCR_CTEIF5_BIT 19 -#define DMA_IFCR_CHTIF5_BIT 18 -#define DMA_IFCR_CTCIF5_BIT 17 -#define DMA_IFCR_CGIF5_BIT 16 -#define DMA_IFCR_CTEIF4_BIT 15 -#define DMA_IFCR_CHTIF4_BIT 14 -#define DMA_IFCR_CTCIF4_BIT 13 -#define DMA_IFCR_CGIF4_BIT 12 -#define DMA_IFCR_CTEIF3_BIT 11 -#define DMA_IFCR_CHTIF3_BIT 10 -#define DMA_IFCR_CTCIF3_BIT 9 -#define DMA_IFCR_CGIF3_BIT 8 -#define DMA_IFCR_CTEIF2_BIT 7 -#define DMA_IFCR_CHTIF2_BIT 6 -#define DMA_IFCR_CTCIF2_BIT 5 -#define DMA_IFCR_CGIF2_BIT 4 -#define DMA_IFCR_CTEIF1_BIT 3 -#define DMA_IFCR_CHTIF1_BIT 2 -#define DMA_IFCR_CTCIF1_BIT 1 -#define DMA_IFCR_CGIF1_BIT 0 - -#define DMA_IFCR_CTEIF7 BIT(DMA_IFCR_CTEIF7_BIT) -#define DMA_IFCR_CHTIF7 BIT(DMA_IFCR_CHTIF7_BIT) -#define DMA_IFCR_CTCIF7 BIT(DMA_IFCR_CTCIF7_BIT) -#define DMA_IFCR_CGIF7 BIT(DMA_IFCR_CGIF7_BIT) -#define DMA_IFCR_CTEIF6 BIT(DMA_IFCR_CTEIF6_BIT) -#define DMA_IFCR_CHTIF6 BIT(DMA_IFCR_CHTIF6_BIT) -#define DMA_IFCR_CTCIF6 BIT(DMA_IFCR_CTCIF6_BIT) -#define DMA_IFCR_CGIF6 BIT(DMA_IFCR_CGIF6_BIT) -#define DMA_IFCR_CTEIF5 BIT(DMA_IFCR_CTEIF5_BIT) -#define DMA_IFCR_CHTIF5 BIT(DMA_IFCR_CHTIF5_BIT) -#define DMA_IFCR_CTCIF5 BIT(DMA_IFCR_CTCIF5_BIT) -#define DMA_IFCR_CGIF5 BIT(DMA_IFCR_CGIF5_BIT) -#define DMA_IFCR_CTEIF4 BIT(DMA_IFCR_CTEIF4_BIT) -#define DMA_IFCR_CHTIF4 BIT(DMA_IFCR_CHTIF4_BIT) -#define DMA_IFCR_CTCIF4 BIT(DMA_IFCR_CTCIF4_BIT) -#define DMA_IFCR_CGIF4 BIT(DMA_IFCR_CGIF4_BIT) -#define DMA_IFCR_CTEIF3 BIT(DMA_IFCR_CTEIF3_BIT) -#define DMA_IFCR_CHTIF3 BIT(DMA_IFCR_CHTIF3_BIT) -#define DMA_IFCR_CTCIF3 BIT(DMA_IFCR_CTCIF3_BIT) -#define DMA_IFCR_CGIF3 BIT(DMA_IFCR_CGIF3_BIT) -#define DMA_IFCR_CTEIF2 BIT(DMA_IFCR_CTEIF2_BIT) -#define DMA_IFCR_CHTIF2 BIT(DMA_IFCR_CHTIF2_BIT) -#define DMA_IFCR_CTCIF2 BIT(DMA_IFCR_CTCIF2_BIT) -#define DMA_IFCR_CGIF2 BIT(DMA_IFCR_CGIF2_BIT) -#define DMA_IFCR_CTEIF1 BIT(DMA_IFCR_CTEIF1_BIT) -#define DMA_IFCR_CHTIF1 BIT(DMA_IFCR_CHTIF1_BIT) -#define DMA_IFCR_CTCIF1 BIT(DMA_IFCR_CTCIF1_BIT) -#define DMA_IFCR_CGIF1 BIT(DMA_IFCR_CGIF1_BIT) - -/* Channel configuration register */ - -#define DMA_CCR_MEM2MEM_BIT 14 -#define DMA_CCR_MINC_BIT 7 -#define DMA_CCR_PINC_BIT 6 -#define DMA_CCR_CIRC_BIT 5 -#define DMA_CCR_DIR_BIT 4 -#define DMA_CCR_TEIE_BIT 3 -#define DMA_CCR_HTIE_BIT 2 -#define DMA_CCR_TCIE_BIT 1 -#define DMA_CCR_EN_BIT 0 - -#define DMA_CCR_MEM2MEM BIT(DMA_CCR_MEM2MEM_BIT) -#define DMA_CCR_PL (0x3 << 12) -#define DMA_CCR_PL_LOW (0x0 << 12) -#define DMA_CCR_PL_MEDIUM (0x1 << 12) -#define DMA_CCR_PL_HIGH (0x2 << 12) -#define DMA_CCR_PL_VERY_HIGH (0x3 << 12) -#define DMA_CCR_MSIZE (0x3 << 10) -#define DMA_CCR_MSIZE_8BITS (0x0 << 10) -#define DMA_CCR_MSIZE_16BITS (0x1 << 10) -#define DMA_CCR_MSIZE_32BITS (0x2 << 10) -#define DMA_CCR_PSIZE (0x3 << 8) -#define DMA_CCR_PSIZE_8BITS (0x0 << 8) -#define DMA_CCR_PSIZE_16BITS (0x1 << 8) -#define DMA_CCR_PSIZE_32BITS (0x2 << 8) -#define DMA_CCR_MINC BIT(DMA_CCR_MINC_BIT) -#define DMA_CCR_PINC BIT(DMA_CCR_PINC_BIT) -#define DMA_CCR_CIRC BIT(DMA_CCR_CIRC_BIT) -#define DMA_CCR_DIR BIT(DMA_CCR_DIR_BIT) -#define DMA_CCR_TEIE BIT(DMA_CCR_TEIE_BIT) -#define DMA_CCR_HTIE BIT(DMA_CCR_HTIE_BIT) -#define DMA_CCR_TCIE BIT(DMA_CCR_TCIE_BIT) -#define DMA_CCR_EN BIT(DMA_CCR_EN_BIT) - -/* - * Devices - */ - -/** Encapsulates state related to a DMA channel interrupt. */ -typedef struct dma_handler_config { - void (*handler)(void); /**< User-specified channel interrupt - handler */ - nvic_irq_num irq_line; /**< Channel's NVIC interrupt number */ -} dma_handler_config; - -/** DMA device type */ -typedef struct dma_dev { - dma_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< Clock ID */ - dma_handler_config handlers[]; /**< - * @brief IRQ handlers and NVIC numbers. - * - * @see dma_attach_interrupt() - * @see dma_detach_interrupt() - */ -} dma_dev; - -extern dma_dev *DMA1; -#ifdef STM32_HIGH_DENSITY -extern dma_dev *DMA2; -#endif - -/* - * Convenience functions - */ - -void dma_init(dma_dev *dev); - -/** Flags for DMA transfer configuration. */ -typedef enum dma_mode_flags { - DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ - DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ - DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ - DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ - DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ - DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ - DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ - DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ -} dma_mode_flags; - -/** Source and destination transfer sizes. */ -typedef enum dma_xfer_size { - DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ - DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ - DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ -} dma_xfer_size; - -/** DMA channel */ -typedef enum dma_channel { - DMA_CH1 = 1, /**< Channel 1 */ - DMA_CH2 = 2, /**< Channel 2 */ - DMA_CH3 = 3, /**< Channel 3 */ - DMA_CH4 = 4, /**< Channel 4 */ - DMA_CH5 = 5, /**< Channel 5 */ - DMA_CH6 = 6, /**< Channel 6 */ - DMA_CH7 = 7, /**< Channel 7 */ -} dma_channel; - -void dma_setup_transfer(dma_dev *dev, - dma_channel channel, - __io void *peripheral_address, - dma_xfer_size peripheral_size, - __io void *memory_address, - dma_xfer_size memory_size, - uint32 mode); - -void dma_set_num_transfers(dma_dev *dev, - dma_channel channel, - uint16 num_transfers); - -/** DMA transfer priority. */ -typedef enum dma_priority { - DMA_PRIORITY_LOW = DMA_CCR_PL_LOW, /**< Low priority */ - DMA_PRIORITY_MEDIUM = DMA_CCR_PL_MEDIUM, /**< Medium priority */ - DMA_PRIORITY_HIGH = DMA_CCR_PL_HIGH, /**< High priority */ - DMA_PRIORITY_VERY_HIGH = DMA_CCR_PL_VERY_HIGH /**< Very high priority */ -} dma_priority; - -void dma_set_priority(dma_dev *dev, - dma_channel channel, - dma_priority priority); - -void dma_attach_interrupt(dma_dev *dev, - dma_channel channel, - void (*handler)(void)); -void dma_detach_interrupt(dma_dev *dev, dma_channel channel); - -/** - * Encodes the reason why a DMA interrupt was called. - * @see dma_get_irq_cause() - */ -typedef enum dma_irq_cause { - DMA_TRANSFER_COMPLETE, /**< Transfer is complete. */ - DMA_TRANSFER_HALF_COMPLETE, /**< Transfer is half complete. */ - DMA_TRANSFER_ERROR, /**< Error occurred during transfer. */ -} dma_irq_cause; - -dma_irq_cause dma_get_irq_cause(dma_dev *dev, dma_channel channel); - -void dma_enable(dma_dev *dev, dma_channel channel); -void dma_disable(dma_dev *dev, dma_channel channel); - -void dma_set_mem_addr(dma_dev *dev, dma_channel channel, __io void *address); -void dma_set_per_addr(dma_dev *dev, dma_channel channel, __io void *address); - -/** - * @brief DMA channel register map type. - * - * Provides access to an individual channel's registers. - */ -typedef struct dma_channel_reg_map { - __io uint32 CCR; /**< Channel configuration register */ - __io uint32 CNDTR; /**< Channel number of data register */ - __io uint32 CPAR; /**< Channel peripheral address register */ - __io uint32 CMAR; /**< Channel memory address register */ -} dma_channel_reg_map; - -#define DMA_CHANNEL_NREGS 5 - -/** - * @brief Obtain a pointer to an individual DMA channel's registers. - * - * For example, dma_channel_regs(DMA1, DMA_CH1)->CCR is DMA1_BASE->CCR1. - * - * @param dev DMA device - * @param channel DMA channel whose channel register map to obtain. - */ -static inline dma_channel_reg_map* dma_channel_regs(dma_dev *dev, - dma_channel channel) { - __io uint32 *ccr1 = &dev->regs->CCR1; - return (dma_channel_reg_map*)(ccr1 + DMA_CHANNEL_NREGS * (channel - 1)); -} - -/** - * @brief Check if a DMA channel is enabled - * @param dev DMA device - * @param channel Channel whose enabled bit to check. - */ -static inline uint8 dma_is_channel_enabled(dma_dev *dev, dma_channel channel) { - return (uint8)(dma_channel_regs(dev, channel)->CCR & DMA_CCR_EN); -} - -/** - * @brief Get the ISR status bits for a DMA channel. - * - * The bits are returned right-aligned, in the following order: - * transfer error flag, half-transfer flag, transfer complete flag, - * global interrupt flag. - * - * If you're attempting to figure out why a DMA interrupt fired; you - * may find dma_get_irq_cause() more convenient. - * - * @param dev DMA device - * @param channel Channel whose ISR bits to return. - * @see dma_get_irq_cause(). - */ -static inline uint8 dma_get_isr_bits(dma_dev *dev, dma_channel channel) { - uint8 shift = (channel - 1) * 4; - return (dev->regs->ISR >> shift) & 0xF; -} - -/** - * @brief Clear the ISR status bits for a given DMA channel. - * - * If you're attempting to clean up after yourself in a DMA interrupt, - * you may find dma_get_irq_cause() more convenient. - * - * @param dev DMA device - * @param channel Channel whose ISR bits to clear. - * @see dma_get_irq_cause() - */ -static inline void dma_clear_isr_bits(dma_dev *dev, dma_channel channel) { - dev->regs->IFCR = BIT(4 * (channel - 1)); -} - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/dmaF2.c b/STM32F4/cores/maple/libmaple/dmaF4.c similarity index 91% rename from STM32F4/cores/maple/libmaple/dmaF2.c rename to STM32F4/cores/maple/libmaple/dmaF4.c index 0911e584a..add3d8e51 100644 --- a/STM32F4/cores/maple/libmaple/dmaF2.c +++ b/STM32F4/cores/maple/libmaple/dmaF4.c @@ -24,10 +24,10 @@ * SOFTWARE. *****************************************************************************/ - #ifdef STM32F2 +#ifdef STM32F4 /** - * @file dmaF2.c + * @file dmaF4.c * @brief Direct Memory Access peripheral support */ @@ -117,33 +117,16 @@ void dma_detach_interrupt(dma_dev *dev, dma_stream stream) { dev->handlers[stream].handler = NULL; } +const uint8 dma_isr_bits_shift[] = { 0, 6, 16, 22}; + +uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream) { + if ( stream&0xFC ) return ((dev->regs->HISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; + else return ((dev->regs->LISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; +} + void dma_clear_isr_bits(dma_dev *dev, dma_stream stream) { - switch (stream) { - case 0: - dev->regs->LIFCR|=0x0000003d; - break; - case 1: - dev->regs->LIFCR|=0x00000f40; - break; - case 2: - dev->regs->LIFCR|=0x003d0000; - break; - case 3: - dev->regs->LIFCR|=0x0f400000; - break; - case 4: - dev->regs->HIFCR|=0x0000003d; - break; - case 5: - dev->regs->HIFCR|=0x00000f40; - break; - case 6: - dev->regs->HIFCR|=0x003d0000; - break; - case 7: - dev->regs->HIFCR|=0x0f400000; - break; - } + if ( stream&0xFC ) dev->regs->HIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; + else dev->regs->LIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; } /* diff --git a/STM32F4/cores/maple/libmaple/dmaF2.h b/STM32F4/cores/maple/libmaple/dmaF4.h similarity index 74% rename from STM32F4/cores/maple/libmaple/dmaF2.h rename to STM32F4/cores/maple/libmaple/dmaF4.h index 6f7086f36..757906c82 100644 --- a/STM32F4/cores/maple/libmaple/dmaF2.h +++ b/STM32F4/cores/maple/libmaple/dmaF4.h @@ -25,7 +25,7 @@ *****************************************************************************/ /** - * @file dma.h + * @file dmaF4.h * * @author Marti Bolivar ; * Original implementation by Michael Hope @@ -84,7 +84,7 @@ typedef struct dma_reg_map { * Register bit definitions */ -/* Channel configuration register */ +/* Stream configuration register */ #define DMA_CR_CH0 (0x0 << 25) #define DMA_CR_CH1 (0x1 << 25) @@ -136,6 +136,25 @@ typedef struct dma_reg_map { #define DMA_CR_DMEIE (0x1 << 1) #define DMA_CR_EN (0x1) +typedef enum dma_channel { + DMA_CH0 = DMA_CR_CH0, /**< Channel 0 */ + DMA_CH1 = DMA_CR_CH1, /**< Channel 1 */ + DMA_CH2 = DMA_CR_CH2, /**< Channel 2 */ + DMA_CH3 = DMA_CR_CH3, /**< Channel 3 */ + DMA_CH4 = DMA_CR_CH4, /**< Channel 4 */ + DMA_CH5 = DMA_CR_CH5, /**< Channel 5 */ + DMA_CH6 = DMA_CR_CH6, /**< Channel 6 */ + DMA_CH7 = DMA_CR_CH7, /**< Channel 7 */ +} dma_channel; + +/* Device interrupt status register flags */ + +#define DMA_ISR_TCIF (1 << 5) +#define DMA_ISR_HTIF (1 << 4) +#define DMA_ISR_TEIF (1 << 3) +#define DMA_ISR_DMEIF (1 << 2) +#define DMA_ISR_FEIF (1 << 0) + /* * Devices */ @@ -166,25 +185,35 @@ extern dma_dev *DMA2; * Convenience functions */ -void dma_init(dma_dev *dev); +extern void dma_init(dma_dev *dev); /** Flags for DMA transfer configuration. */ typedef enum dma_mode_flags { - DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ - DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ - DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ - DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ - DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ - DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ - DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ - DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ + DMA_MEM_BUF_0 = DMA_CR_CT0, /**< Current memory target buffer 0 */ + DMA_MEM_BUF_1 = DMA_CR_CT1, /**< Current memory target buffer 1 */ + DMA_DBL_BUF_MODE = DMA_CR_DBM, /**< Current memory double buffer mode */ + DMA_PINC_OFFSET = DMA_CR_PINCOS, /**< Peripheral increment offset size */ + DMA_MINC_MODE = DMA_CR_MINC, /**< Memory increment mode */ + DMA_PINC_MODE = DMA_CR_PINC, /**< Peripheral increment mode */ + DMA_CIRC_MODE = DMA_CR_CIRC, /**< Memory Circular mode */ + DMA_FROM_PER = DMA_CR_DIR_P2M, /**< Read from memory to peripheral */ + DMA_FROM_MEM = DMA_CR_DIR_M2P, /**< Read from memory to peripheral */ + DMA_MEM_TO_MEM = DMA_CR_DIR_M2M, /**< Read from memory to memory */ + DMA_PERIF_CTRL = DMA_CR_PFCTRL, /**< Peripheral flow controller */ + DMA_PRIO_MEDIUM = DMA_CR_PL_MEDIUM, /**< Medium priority */ + DMA_PRIO_HIGH = DMA_CR_PL_HIGH, /**< High priority */ + DMA_PRIO_VERY_HIGH = DMA_CR_PL_VERY_HIGH, /**< Very high priority */ + DMA_TRNS_CMPLT = DMA_CR_TCIE, /**< Interrupt on transfer completion */ + DMA_TRNS_HALF = DMA_CR_HTIE, /**< Interrupt on half-transfer */ + DMA_TRNS_ERR = DMA_CR_TEIE, /**< Interrupt on transfer error */ + DMA_DIR_MODE_ERR = DMA_CR_DMEIE /**< Interrupt on direct mode error */ } dma_mode_flags; /** Source and destination transfer sizes. */ typedef enum dma_xfer_size { - DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ - DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ - DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ + DMA_SIZE_8BITS = ( DMA_CR_MSIZE_8BITS|DMA_CR_PSIZE_8BITS ), /**< 8-bit transfers */ + DMA_SIZE_16BITS = (DMA_CR_MSIZE_16BITS|DMA_CR_PSIZE_16BITS), /**< 16-bit transfers */ + DMA_SIZE_32BITS = (DMA_CR_MSIZE_32BITS|DMA_CR_PSIZE_32BITS) /**< 32-bit transfers */ } dma_xfer_size; /** DMA channel */ @@ -201,17 +230,17 @@ typedef enum dma_stream { static inline void dma_setup_transfer(dma_dev *dev, dma_stream stream, + dma_channel channel, + dma_xfer_size trx_size, __io void *peripheral_address, __io void *memory_address0, __io void *memory_address1, - uint32 flags, - uint32 fifo_flags) { + uint32 flags) { dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; // disable dev->regs->STREAM[stream].PAR = (uint32)peripheral_address; dev->regs->STREAM[stream].M0AR = (uint32)memory_address0; dev->regs->STREAM[stream].M1AR = (uint32)memory_address1; - dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits - dev->regs->STREAM[stream].CR = flags & 0x0feffffe; // mask out reserved and enable + dev->regs->STREAM[stream].CR = ((flags|channel|trx_size) & 0x0feffffe); // mask out reserved and enable } static inline void dma_set_num_transfers(dma_dev *dev, @@ -220,6 +249,12 @@ static inline void dma_set_num_transfers(dma_dev *dev, dev->regs->STREAM[stream].NDTR = num_transfers; } +static inline void dma_set_fifo_flags(dma_dev *dev, + dma_stream stream, + uint8 fifo_flags) { + dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits +} + void dma_attach_interrupt(dma_dev *dev, dma_stream stream, void (*handler)(void)); @@ -232,6 +267,7 @@ static inline void dma_enable(dma_dev *dev, dma_stream stream) { static inline void dma_disable(dma_dev *dev, dma_stream stream) { dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; + while (dev->regs->STREAM[stream].CR & DMA_CR_EN); // wait till EN bit is reset, see AN4031, chapter 4.1 } /** diff --git a/STM32F4/cores/maple/libmaple/exti.h b/STM32F4/cores/maple/libmaple/exti.h index bac8adcf4..063f2d7f1 100644 --- a/STM32F4/cores/maple/libmaple/exti.h +++ b/STM32F4/cores/maple/libmaple/exti.h @@ -52,11 +52,7 @@ typedef struct exti_reg_map { } exti_reg_map; /** EXTI register map base pointer */ -#ifdef STM32F2 #define EXTI_BASE ((struct exti_reg_map*)0x40013C00) -#else -#define EXTI_BASE ((struct exti_reg_map*)0x40010400) -#endif /** External interrupt trigger mode */ typedef enum exti_trigger_mode { diff --git a/STM32F4/cores/maple/libmaple/fsmc.c b/STM32F4/cores/maple/libmaple/fsmc.c index 06ca7df6a..42b0d77b4 100644 --- a/STM32F4/cores/maple/libmaple/fsmc.c +++ b/STM32F4/cores/maple/libmaple/fsmc.c @@ -39,27 +39,28 @@ */ void fsmc_sram_init_gpios(void) { /* Data lines... */ - gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD0, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD1, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD8, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD9, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD10, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD14, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD15, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE7, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE8, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE9, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE10, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE11, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE12, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE13, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE14, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE15, GPIO_AF_OUTPUT_PP); /* Address lines... */ - gpio_set_mode(GPIOD, 11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 13, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD11, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD12, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD13, GPIO_AF_OUTPUT_PP); +#if 0 // not available on LQFP package gpio_set_mode(GPIOF, 0, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 1, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 2, GPIO_AF_OUTPUT_PP); @@ -76,18 +77,20 @@ void fsmc_sram_init_gpios(void) { gpio_set_mode(GPIOG, 3, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 4, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 5, GPIO_AF_OUTPUT_PP); - +#endif // not available on LQFP package /* And control lines... */ - gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP); // NOE - gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP); // NWE + gpio_set_mode(PD4, GPIO_AF_OUTPUT_PP); // NOE + gpio_set_mode(PD5, GPIO_AF_OUTPUT_PP); // NWE - gpio_set_mode(GPIOD, 7, GPIO_AF_OUTPUT_PP); // NE1 + gpio_set_mode(PD7, GPIO_AF_OUTPUT_PP); // NE1 +#if 0 // not available on LQFP package gpio_set_mode(GPIOG, 9, GPIO_AF_OUTPUT_PP); // NE2 gpio_set_mode(GPIOG, 10, GPIO_AF_OUTPUT_PP); // NE3 gpio_set_mode(GPIOG, 12, GPIO_AF_OUTPUT_PP); // NE4 +#endif // not available on LQFP package - gpio_set_mode(GPIOE, 0, GPIO_AF_OUTPUT_PP); // NBL0 - gpio_set_mode(GPIOE, 1, GPIO_AF_OUTPUT_PP); // NBL1 + gpio_set_mode(PE0, GPIO_AF_OUTPUT_PP); // NBL0 + gpio_set_mode(PE1, GPIO_AF_OUTPUT_PP); // NBL1 } #endif /* STM32_HIGH_DENSITY */ diff --git a/STM32F4/cores/maple/libmaple/gpio.h b/STM32F4/cores/maple/libmaple/gpio.h index 4d42386c1..f1a141fee 100644 --- a/STM32F4/cores/maple/libmaple/gpio.h +++ b/STM32F4/cores/maple/libmaple/gpio.h @@ -31,8 +31,102 @@ * (AFIO) prototypes, defines, and inlined access functions. */ -#ifdef STM32F2 -#include "gpioF2.h" -#else -#include "gpioF1.h" +#ifndef _GPIO_H_ +#define _GPIO_H_ + +#include "libmaple.h" +#include "boards.h" + +#ifdef __cplusplus +extern "C"{ #endif + + +/** + * @brief Get a GPIO port's corresponding afio_exti_port. + * @param dev GPIO device whose afio_exti_port to return. + */ +static inline afio_exti_port gpio_exti_port(const gpio_dev *dev) { + return dev->exti_port; +} + +/** + * Set or reset a GPIO pin. + * + * Pin must have previously been configured to output mode. + * + * @param dev GPIO device whose pin to set. + * @param pin Pin on to set or reset + * @param val If true, set the pin. If false, reset the pin. + */ +static inline void gpio_write_pin(uint8_t pin, uint8 val) { + if (val) { + (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(pin&0x0F); + } else { + (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(pin&0x0F); + } +} + +static inline void gpio_set_pin(uint8_t pin) { + (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(pin&0x0F); +} + +static inline void gpio_clear_pin(uint8_t pin) { + (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(pin&0x0F); +} + +/** + * Determine whether or not a GPIO pin is set. + * + * Pin must have previously been configured to input mode. + * + * @param dev GPIO device whose pin to test. + * @param pin Pin on dev to test. + * @return True if the pin is set, false otherwise. + */ +static inline uint32 gpio_read_pin(uint8_t pin) { + return (PIN_MAP[pin].gpio_device)->regs->IDR & BIT(pin&0x0F); +} + +/** + * Toggle a pin configured as output push-pull. + * @param dev GPIO device. + * @param pin Pin on dev to toggle. + */ +static inline void gpio_toggle_pin(uint8_t pin) { + (PIN_MAP[pin].gpio_device)->regs->ODR = (PIN_MAP[pin].gpio_device)->regs->ODR ^ BIT(pin&0x0F); +} + +/* + * GPIO Convenience routines + */ + +extern void gpio_init(const gpio_dev *dev); +extern void gpio_init_all(void); +extern void gpio_set_mode(uint8_t pin, gpio_pin_mode mode); +extern void gpio_set_af_mode(uint8_t pin, int mode); + +/* + * AFIO convenience routines + */ + +extern void afio_init(void); +extern void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port); +extern void afio_remap(afio_remap_peripheral p); + +/** + * @brief Enable or disable the JTAG and SW debug ports. + * @param config Desired debug port configuration + * @see afio_debug_cfg + */ +static inline void afio_cfg_debug_ports(afio_debug_cfg config) { + //__io uint32 *mapr = &AFIO_BASE->MAPR; + //*mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; +} + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/STM32F4/cores/maple/libmaple/gpioF1.c b/STM32F4/cores/maple/libmaple/gpioF1.c deleted file mode 100644 index 846b7542a..000000000 --- a/STM32F4/cores/maple/libmaple/gpioF1.c +++ /dev/null @@ -1,200 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -#ifdef STM32F1 - -/** - * @file gpio.c - * @brief GPIO initialization routine - */ - -#include "gpio.h" -#include "rcc.h" - -/* - * GPIO devices - */ - -gpio_dev gpioa = { - .regs = GPIOA_BASE, - .clk_id = RCC_GPIOA, - .exti_port = AFIO_EXTI_PA, -}; -/** GPIO port A device. */ -gpio_dev* const GPIOA = &gpioa; - -gpio_dev gpiob = { - .regs = GPIOB_BASE, - .clk_id = RCC_GPIOB, - .exti_port = AFIO_EXTI_PB, -}; -/** GPIO port B device. */ -gpio_dev* const GPIOB = &gpiob; - -gpio_dev gpioc = { - .regs = GPIOC_BASE, - .clk_id = RCC_GPIOC, - .exti_port = AFIO_EXTI_PC, -}; -/** GPIO port C device. */ -gpio_dev* const GPIOC = &gpioc; - -gpio_dev gpiod = { - .regs = GPIOD_BASE, - .clk_id = RCC_GPIOD, - .exti_port = AFIO_EXTI_PD, -}; -/** GPIO port D device. */ -gpio_dev* const GPIOD = &gpiod; - -#ifdef STM32_HIGH_DENSITY -gpio_dev gpioe = { - .regs = GPIOE_BASE, - .clk_id = RCC_GPIOE, - .exti_port = AFIO_EXTI_PE, -}; -/** GPIO port E device. */ -gpio_dev* const GPIOE = &gpioe; - -gpio_dev gpiof = { - .regs = GPIOF_BASE, - .clk_id = RCC_GPIOF, - .exti_port = AFIO_EXTI_PF, -}; -/** GPIO port F device. */ -gpio_dev* const GPIOF = &gpiof; - -gpio_dev gpiog = { - .regs = GPIOG_BASE, - .clk_id = RCC_GPIOG, - .exti_port = AFIO_EXTI_PG, -}; -/** GPIO port G device. */ -gpio_dev* const GPIOG = &gpiog; -#endif - -/* - * GPIO convenience routines - */ - -/** - * Initialize a GPIO device. - * - * Enables the clock for and resets the given device. - * - * @param dev GPIO device to initialize. - */ -void gpio_init(gpio_dev *dev) { - rcc_clk_enable(dev->clk_id); - rcc_reset_dev(dev->clk_id); -} - -/** - * Initialize and reset all available GPIO devices. - */ -void gpio_init_all(void) { - gpio_init(GPIOA); - gpio_init(GPIOB); - gpio_init(GPIOC); - gpio_init(GPIOD); -#ifdef STM32_HIGH_DENSITY - gpio_init(GPIOE); - gpio_init(GPIOF); - gpio_init(GPIOG); -#endif -} - -/** - * Set the mode of a GPIO pin. - * - * @param dev GPIO device. - * @param pin Pin on the device whose mode to set, 0--15. - * @param mode General purpose or alternate function mode to set the pin to. - * @see gpio_pin_mode - */ -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { - gpio_reg_map *regs = dev->regs; - __io uint32 *cr = ®s->CRL + (pin >> 3); - uint32 shift = (pin & 0x7) * 4; - uint32 tmp = *cr; - - tmp &= ~(0xF << shift); - tmp |= (mode == GPIO_INPUT_PU ? GPIO_INPUT_PD : mode) << shift; - *cr = tmp; - - if (mode == GPIO_INPUT_PD) { - regs->ODR &= ~BIT(pin); - } else if (mode == GPIO_INPUT_PU) { - regs->ODR |= BIT(pin); - } -} - -/* - * AFIO - */ - -/** - * @brief Initialize the AFIO clock, and reset the AFIO registers. - */ -void afio_init(void) { - rcc_clk_enable(RCC_AFIO); - rcc_reset_dev(RCC_AFIO); -} - -#define AFIO_EXTI_SEL_MASK 0xF - -/** - * @brief Select a source input for an external interrupt. - * - * @param exti External interrupt. - * @param gpio_port Port which contains pin to use as source input. - * @see afio_exti_num - * @see afio_exti_port - */ -void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port) { - __io uint32 *exti_cr = &AFIO_BASE->EXTICR1 + exti / 4; - uint32 shift = 4 * (exti % 4); - uint32 cr = *exti_cr; - - cr &= ~(AFIO_EXTI_SEL_MASK << shift); - cr |= gpio_port << shift; - *exti_cr = cr; -} - -/** - * @brief Perform an alternate function remap. - * @param remapping Remapping to perform. - */ -void afio_remap(afio_remap_peripheral remapping) { - if (remapping & AFIO_REMAP_USE_MAPR2) { - remapping &= ~AFIO_REMAP_USE_MAPR2; - AFIO_BASE->MAPR2 |= remapping; - } else { - AFIO_BASE->MAPR |= remapping; - } -} - -#endif diff --git a/STM32F4/cores/maple/libmaple/gpioF1.h b/STM32F4/cores/maple/libmaple/gpioF1.h deleted file mode 100644 index c69efb417..000000000 --- a/STM32F4/cores/maple/libmaple/gpioF1.h +++ /dev/null @@ -1,530 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. -*****************************************************************************/ - -/** - * @file gpio.h - * - * @brief General purpose I/O (GPIO) and Alternate Function I/O - * (AFIO) prototypes, defines, and inlined access functions. - */ - -#ifndef _GPIO_H_ -#define _GPIO_H_ - -#include "libmaple.h" -#include "rcc.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * GPIO register maps and devices - */ - -/** GPIO register map type */ -typedef struct gpio_reg_map { - __io uint32 CRL; /**< Port configuration register low */ - __io uint32 CRH; /**< Port configuration register high */ - __io uint32 IDR; /**< Port input data register */ - __io uint32 ODR; /**< Port output data register */ - __io uint32 BSRR; /**< Port bit set/reset register */ - __io uint32 BRR; /**< Port bit reset register */ - __io uint32 LCKR; /**< Port configuration lock register */ -} gpio_reg_map; - -/** - * @brief External interrupt line port selector. - * - * Used to determine which GPIO port to map an external interrupt line - * onto. */ -/* (See AFIO sections, below) */ -typedef enum afio_exti_port { - AFIO_EXTI_PA, /**< Use port A (PAx) pin. */ - AFIO_EXTI_PB, /**< Use port B (PBx) pin. */ - AFIO_EXTI_PC, /**< Use port C (PCx) pin. */ - AFIO_EXTI_PD, /**< Use port D (PDx) pin. */ -#ifdef STM32_HIGH_DENSITY - AFIO_EXTI_PE, /**< Use port E (PEx) pin. */ - AFIO_EXTI_PF, /**< Use port F (PFx) pin. */ - AFIO_EXTI_PG, /**< Use port G (PGx) pin. */ -#endif -} afio_exti_port; - -/** GPIO device type */ -typedef struct gpio_dev { - gpio_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< RCC clock information */ - afio_exti_port exti_port; /**< AFIO external interrupt port value */ -} gpio_dev; - -extern gpio_dev gpioa; -extern gpio_dev* const GPIOA; -extern gpio_dev gpiob; -extern gpio_dev* const GPIOB; -extern gpio_dev gpioc; -extern gpio_dev* const GPIOC; -extern gpio_dev gpiod; -extern gpio_dev* const GPIOD; -#ifdef STM32_HIGH_DENSITY -extern gpio_dev gpioe; -extern gpio_dev* const GPIOE; -extern gpio_dev gpiof; -extern gpio_dev* const GPIOF; -extern gpio_dev gpiog; -extern gpio_dev* const GPIOG; -#endif - -/** GPIO port A register map base pointer */ -#define GPIOA_BASE ((struct gpio_reg_map*)0x40010800) -/** GPIO port B register map base pointer */ -#define GPIOB_BASE ((struct gpio_reg_map*)0x40010C00) -/** GPIO port C register map base pointer */ -#define GPIOC_BASE ((struct gpio_reg_map*)0x40011000) -/** GPIO port D register map base pointer */ -#define GPIOD_BASE ((struct gpio_reg_map*)0x40011400) -#ifdef STM32_HIGH_DENSITY -/** GPIO port E register map base pointer */ -#define GPIOE_BASE ((struct gpio_reg_map*)0x40011800) -/** GPIO port F register map base pointer */ -#define GPIOF_BASE ((struct gpio_reg_map*)0x40011C00) -/** GPIO port G register map base pointer */ -#define GPIOG_BASE ((struct gpio_reg_map*)0x40012000) -#endif - -/* - * GPIO register bit definitions - */ - -/* Control registers, low and high */ - -#define GPIO_CR_CNF (0x3 << 2) -#define GPIO_CR_CNF_INPUT_ANALOG (0x0 << 2) -#define GPIO_CR_CNF_INPUT_FLOATING (0x1 << 2) -#define GPIO_CR_CNF_INPUT_PU_PD (0x2 << 2) -#define GPIO_CR_CNF_OUTPUT_PP (0x0 << 2) -#define GPIO_CR_CNF_OUTPUT_OD (0x1 << 2) -#define GPIO_CR_CNF_AF_OUTPUT_PP (0x2 << 2) -#define GPIO_CR_CNF_AF_OUTPUT_OD (0x3 << 2) -#define GPIO_CR_MODE 0x3 -#define GPIO_CR_MODE_INPUT 0x0 -#define GPIO_CR_MODE_OUTPUT_10MHZ 0x1 -#define GPIO_CR_MODE_OUTPUT_2MHZ 0x2 -#define GPIO_CR_MODE_OUTPUT_50MHZ 0x3 - -/** - * @brief GPIO Pin modes. - * - * These only allow for 50MHZ max output speeds; if you want slower, - * use direct register access. - */ -typedef enum gpio_pin_mode { - GPIO_OUTPUT_PP = (GPIO_CR_CNF_OUTPUT_PP | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Output push-pull. */ - GPIO_OUTPUT_OD = (GPIO_CR_CNF_OUTPUT_OD | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Output open-drain. */ - GPIO_AF_OUTPUT_PP = (GPIO_CR_CNF_AF_OUTPUT_PP | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Alternate function - output push-pull. */ - GPIO_AF_OUTPUT_OD = (GPIO_CR_CNF_AF_OUTPUT_OD | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Alternate function - output open drain. */ - GPIO_INPUT_ANALOG = (GPIO_CR_CNF_INPUT_ANALOG | - GPIO_CR_MODE_INPUT), /**< Analog input. */ - GPIO_INPUT_FLOATING = (GPIO_CR_CNF_INPUT_FLOATING | - GPIO_CR_MODE_INPUT), /**< Input floating. */ - GPIO_INPUT_PD = (GPIO_CR_CNF_INPUT_PU_PD | - GPIO_CR_MODE_INPUT), /**< Input pull-down. */ - GPIO_AF_INPUT_PD = (GPIO_INPUT_PD), /**< Input pull-down. */ - GPIO_INPUT_PU /**< Input pull-up. */ - - - /* GPIO_INPUT_PU treated as a special case, for ODR twiddling */ -} gpio_pin_mode; - -/* - * GPIO Convenience routines - */ - -void gpio_init(gpio_dev *dev); -void gpio_init_all(void); -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode); - -/** - * @brief Get a GPIO port's corresponding afio_exti_port. - * @param dev GPIO device whose afio_exti_port to return. - */ -static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { - return dev->exti_port; -} - -/** - * Set or reset a GPIO pin. - * - * Pin must have previously been configured to output mode. - * - * @param dev GPIO device whose pin to set. - * @param pin Pin on to set or reset - * @param val If true, set the pin. If false, reset the pin. - */ -static inline void gpio_write_bit(gpio_dev *dev, uint8 pin, uint8 val) { - if (val) { - dev->regs->BSRR = BIT(pin); - } else { - dev->regs->BRR = BIT(pin); - } -} - -/** - * Determine whether or not a GPIO pin is set. - * - * Pin must have previously been configured to input mode. - * - * @param dev GPIO device whose pin to test. - * @param pin Pin on dev to test. - * @return True if the pin is set, false otherwise. - */ -static inline uint32 gpio_read_bit(gpio_dev *dev, uint8 pin) { - return dev->regs->IDR & BIT(pin); -} - -/** - * Toggle a pin configured as output push-pull. - * @param dev GPIO device. - * @param pin Pin on dev to toggle. - */ -static inline void gpio_toggle_bit(gpio_dev *dev, uint8 pin) { - dev->regs->ODR = dev->regs->ODR ^ BIT(pin); -} - -/* - * AFIO register map - */ - -/** AFIO register map */ -typedef struct afio_reg_map { - __io uint32 EVCR; /**< Event control register. */ - __io uint32 MAPR; /**< AF remap and debug I/O configuration - register. */ - __io uint32 EXTICR1; /**< External interrupt configuration - register 1. */ - __io uint32 EXTICR2; /**< External interrupt configuration - register 2. */ - __io uint32 EXTICR3; /**< External interrupt configuration - register 3. */ - __io uint32 EXTICR4; /**< External interrupt configuration - register 4. */ - __io uint32 MAPR2; /**< AF remap and debug I/O configuration - register 2. */ -} afio_reg_map; - -/** AFIO register map base pointer. */ -#define AFIO_BASE ((struct afio_reg_map *)0x40010000) - -/* - * AFIO register bit definitions - */ - -/* Event control register */ - -#define AFIO_EVCR_EVOE (0x1 << 7) -#define AFIO_EVCR_PORT_PA (0x0 << 4) -#define AFIO_EVCR_PORT_PB (0x1 << 4) -#define AFIO_EVCR_PORT_PC (0x2 << 4) -#define AFIO_EVCR_PORT_PD (0x3 << 4) -#define AFIO_EVCR_PORT_PE (0x4 << 4) -#define AFIO_EVCR_PIN_0 0x0 -#define AFIO_EVCR_PIN_1 0x1 -#define AFIO_EVCR_PIN_2 0x2 -#define AFIO_EVCR_PIN_3 0x3 -#define AFIO_EVCR_PIN_4 0x4 -#define AFIO_EVCR_PIN_5 0x5 -#define AFIO_EVCR_PIN_6 0x6 -#define AFIO_EVCR_PIN_7 0x7 -#define AFIO_EVCR_PIN_8 0x8 -#define AFIO_EVCR_PIN_9 0x9 -#define AFIO_EVCR_PIN_10 0xA -#define AFIO_EVCR_PIN_11 0xB -#define AFIO_EVCR_PIN_12 0xC -#define AFIO_EVCR_PIN_13 0xD -#define AFIO_EVCR_PIN_14 0xE -#define AFIO_EVCR_PIN_15 0xF - -/* AF remap and debug I/O configuration register */ - -#define AFIO_MAPR_SWJ_CFG (0x7 << 24) -#define AFIO_MAPR_SWJ_CFG_FULL_SWJ (0x0 << 24) -#define AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST (0x1 << 24) -#define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24) -#define AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW (0x4 << 24) -#define AFIO_MAPR_ADC2_ETRGREG_REMAP BIT(20) -#define AFIO_MAPR_ADC2_ETRGINJ_REMAP BIT(19) -#define AFIO_MAPR_ADC1_ETRGREG_REMAP BIT(18) -#define AFIO_MAPR_ADC1_ETRGINJ_REMAP BIT(17) -#define AFIO_MAPR_TIM5CH4_IREMAP BIT(16) -#define AFIO_MAPR_PD01_REMAP BIT(15) -#define AFIO_MAPR_CAN_REMAP (0x3 << 13) -#define AFIO_MAPR_CAN_REMAP_NONE (0x0 << 13) -#define AFIO_MAPR_CAN_REMAP_PB8_PB9 (0x2 << 13) -#define AFIO_MAPR_CAN_REMAP_PD0_PD1 (0x3 << 13) -#define AFIO_MAPR_TIM4_REMAP BIT(12) -#define AFIO_MAPR_TIM3_REMAP (0x3 << 10) -#define AFIO_MAPR_TIM3_REMAP_NONE (0x0 << 10) -#define AFIO_MAPR_TIM3_REMAP_PARTIAL (0x2 << 10) -#define AFIO_MAPR_TIM3_REMAP_FULL (0x3 << 10) -#define AFIO_MAPR_TIM2_REMAP (0x3 << 8) -#define AFIO_MAPR_TIM2_REMAP_NONE (0x0 << 8) -#define AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3 (0x1 << 8) -#define AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11 (0x2 << 8) -#define AFIO_MAPR_TIM2_REMAP_FULL (0x3 << 8) -#define AFIO_MAPR_TIM1_REMAP (0x3 << 6) -#define AFIO_MAPR_TIM1_REMAP_NONE (0x0 << 6) -#define AFIO_MAPR_TIM1_REMAP_PARTIAL (0x1 << 6) -#define AFIO_MAPR_TIM1_REMAP_FULL (0x3 << 6) -#define AFIO_MAPR_USART3_REMAP (0x3 << 4) -#define AFIO_MAPR_USART3_REMAP_NONE (0x0 << 4) -#define AFIO_MAPR_USART3_REMAP_PARTIAL (0x1 << 4) -#define AFIO_MAPR_USART3_REMAP_FULL (0x3 << 4) -#define AFIO_MAPR_USART2_REMAP BIT(3) -#define AFIO_MAPR_USART1_REMAP BIT(2) -#define AFIO_MAPR_I2C1_REMAP BIT(1) -#define AFIO_MAPR_SPI1_REMAP BIT(0) - -/* External interrupt configuration register 1 */ - -#define AFIO_EXTICR1_EXTI3 (0xF << 12) -#define AFIO_EXTICR1_EXTI3_PA (0x0 << 12) -#define AFIO_EXTICR1_EXTI3_PB (0x1 << 12) -#define AFIO_EXTICR1_EXTI3_PC (0x2 << 12) -#define AFIO_EXTICR1_EXTI3_PD (0x3 << 12) -#define AFIO_EXTICR1_EXTI3_PE (0x4 << 12) -#define AFIO_EXTICR1_EXTI3_PF (0x5 << 12) -#define AFIO_EXTICR1_EXTI3_PG (0x6 << 12) -#define AFIO_EXTICR1_EXTI2 (0xF << 8) -#define AFIO_EXTICR1_EXTI2_PA (0x0 << 8) -#define AFIO_EXTICR1_EXTI2_PB (0x1 << 8) -#define AFIO_EXTICR1_EXTI2_PC (0x2 << 8) -#define AFIO_EXTICR1_EXTI2_PD (0x3 << 8) -#define AFIO_EXTICR1_EXTI2_PE (0x4 << 8) -#define AFIO_EXTICR1_EXTI2_PF (0x5 << 8) -#define AFIO_EXTICR1_EXTI2_PG (0x6 << 8) -#define AFIO_EXTICR1_EXTI1 (0xF << 4) -#define AFIO_EXTICR1_EXTI1_PA (0x0 << 4) -#define AFIO_EXTICR1_EXTI1_PB (0x1 << 4) -#define AFIO_EXTICR1_EXTI1_PC (0x2 << 4) -#define AFIO_EXTICR1_EXTI1_PD (0x3 << 4) -#define AFIO_EXTICR1_EXTI1_PE (0x4 << 4) -#define AFIO_EXTICR1_EXTI1_PF (0x5 << 4) -#define AFIO_EXTICR1_EXTI1_PG (0x6 << 4) -#define AFIO_EXTICR1_EXTI0 0xF -#define AFIO_EXTICR1_EXTI0_PA 0x0 -#define AFIO_EXTICR1_EXTI0_PB 0x1 -#define AFIO_EXTICR1_EXTI0_PC 0x2 -#define AFIO_EXTICR1_EXTI0_PD 0x3 -#define AFIO_EXTICR1_EXTI0_PE 0x4 -#define AFIO_EXTICR1_EXTI0_PF 0x5 -#define AFIO_EXTICR1_EXTI0_PG 0x6 - -/* External interrupt configuration register 2 */ - -#define AFIO_EXTICR2_EXTI7 (0xF << 12) -#define AFIO_EXTICR2_EXTI7_PA (0x0 << 12) -#define AFIO_EXTICR2_EXTI7_PB (0x1 << 12) -#define AFIO_EXTICR2_EXTI7_PC (0x2 << 12) -#define AFIO_EXTICR2_EXTI7_PD (0x3 << 12) -#define AFIO_EXTICR2_EXTI7_PE (0x4 << 12) -#define AFIO_EXTICR2_EXTI7_PF (0x5 << 12) -#define AFIO_EXTICR2_EXTI7_PG (0x6 << 12) -#define AFIO_EXTICR2_EXTI6 (0xF << 8) -#define AFIO_EXTICR2_EXTI6_PA (0x0 << 8) -#define AFIO_EXTICR2_EXTI6_PB (0x1 << 8) -#define AFIO_EXTICR2_EXTI6_PC (0x2 << 8) -#define AFIO_EXTICR2_EXTI6_PD (0x3 << 8) -#define AFIO_EXTICR2_EXTI6_PE (0x4 << 8) -#define AFIO_EXTICR2_EXTI6_PF (0x5 << 8) -#define AFIO_EXTICR2_EXTI6_PG (0x6 << 8) -#define AFIO_EXTICR2_EXTI5 (0xF << 4) -#define AFIO_EXTICR2_EXTI5_PA (0x0 << 4) -#define AFIO_EXTICR2_EXTI5_PB (0x1 << 4) -#define AFIO_EXTICR2_EXTI5_PC (0x2 << 4) -#define AFIO_EXTICR2_EXTI5_PD (0x3 << 4) -#define AFIO_EXTICR2_EXTI5_PE (0x4 << 4) -#define AFIO_EXTICR2_EXTI5_PF (0x5 << 4) -#define AFIO_EXTICR2_EXTI5_PG (0x6 << 4) -#define AFIO_EXTICR2_EXTI4 0xF -#define AFIO_EXTICR2_EXTI4_PA 0x0 -#define AFIO_EXTICR2_EXTI4_PB 0x1 -#define AFIO_EXTICR2_EXTI4_PC 0x2 -#define AFIO_EXTICR2_EXTI4_PD 0x3 -#define AFIO_EXTICR2_EXTI4_PE 0x4 -#define AFIO_EXTICR2_EXTI4_PF 0x5 -#define AFIO_EXTICR2_EXTI4_PG 0x6 - -/* AF remap and debug I/O configuration register 2 */ - -#define AFIO_MAPR2_FSMC_NADV BIT(10) -#define AFIO_MAPR2_TIM14_REMAP BIT(9) -#define AFIO_MAPR2_TIM13_REMAP BIT(8) -#define AFIO_MAPR2_TIM11_REMAP BIT(7) -#define AFIO_MAPR2_TIM10_REMAP BIT(6) -#define AFIO_MAPR2_TIM9_REMAP BIT(5) - -/* - * AFIO convenience routines - */ - -void afio_init(void); - -/** - * External interrupt line numbers. - */ -typedef enum afio_exti_num { - AFIO_EXTI_0, /**< External interrupt line 0. */ - AFIO_EXTI_1, /**< External interrupt line 1. */ - AFIO_EXTI_2, /**< External interrupt line 2. */ - AFIO_EXTI_3, /**< External interrupt line 3. */ - AFIO_EXTI_4, /**< External interrupt line 4. */ - AFIO_EXTI_5, /**< External interrupt line 5. */ - AFIO_EXTI_6, /**< External interrupt line 6. */ - AFIO_EXTI_7, /**< External interrupt line 7. */ - AFIO_EXTI_8, /**< External interrupt line 8. */ - AFIO_EXTI_9, /**< External interrupt line 9. */ - AFIO_EXTI_10, /**< External interrupt line 10. */ - AFIO_EXTI_11, /**< External interrupt line 11. */ - AFIO_EXTI_12, /**< External interrupt line 12. */ - AFIO_EXTI_13, /**< External interrupt line 13. */ - AFIO_EXTI_14, /**< External interrupt line 14. */ - AFIO_EXTI_15, /**< External interrupt line 15. */ -} afio_exti_num; - -void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port); - -/* HACK: Use upper bit to denote MAPR2, Bit 31 is reserved and - * not used in either MAPR or MAPR2 */ -#define AFIO_REMAP_USE_MAPR2 (1 << 31) - -/** - * @brief Available peripheral remaps. - * @see afio_remap() - */ -typedef enum afio_remap_peripheral { - AFIO_REMAP_ADC2_ETRGREG = AFIO_MAPR_ADC2_ETRGREG_REMAP, /**< - ADC 2 external trigger regular conversion remapping */ - AFIO_REMAP_ADC2_ETRGINJ = AFIO_MAPR_ADC2_ETRGINJ_REMAP, /**< - ADC 2 external trigger injected conversion remapping */ - AFIO_REMAP_ADC1_ETRGREG = AFIO_MAPR_ADC1_ETRGREG_REMAP, /**< - ADC 1 external trigger regular conversion remapping */ - AFIO_REMAP_ADC1_ETRGINJ = AFIO_MAPR_ADC1_ETRGINJ_REMAP, /**< - ADC 1 external trigger injected conversion remapping */ - AFIO_REMAP_TIM5CH4_I = AFIO_MAPR_TIM5CH4_IREMAP, /**< - Timer 5 channel 4 internal remapping */ - AFIO_REMAP_PD01 = AFIO_MAPR_PD01_REMAP, /**< - Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ - AFIO_REMAP_CAN_1 = AFIO_MAPR_CAN_REMAP_PB8_PB9, /**< - CAN alternate function remapping 1 (RX on PB8, TX on PB9) */ - AFIO_REMAP_CAN_2 = AFIO_MAPR_CAN_REMAP_PD0_PD1, /**< - CAN alternate function remapping 2 (RX on PD0, TX on PD1) */ - AFIO_REMAP_TIM4 = AFIO_MAPR_TIM4_REMAP, /**< - Timer 4 remapping */ - AFIO_REMAP_TIM3_PARTIAL = AFIO_MAPR_TIM3_REMAP_PARTIAL, /**< - Timer 3 partial remapping */ - AFIO_REMAP_TIM3_FULL = AFIO_MAPR_TIM3_REMAP_FULL, /**< - Timer 3 full remapping */ - AFIO_REMAP_TIM2_PARTIAL_1 = AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3, /**< - Timer 2 partial remapping 1 (CH1 and ETR on PA15, CH2 on PB3, CH3 - on PA2, CH4 on PA3) */ - AFIO_REMAP_TIM2_PARTIAL_2 = AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11, /**< - Timer 2 partial remapping 2 (CH1 and ETR on PA0, CH2 on PA1, CH3 - on PB10, CH4 on PB11) */ - AFIO_REMAP_TIM2_FULL = AFIO_MAPR_TIM2_REMAP_FULL, /**< - Timer 2 full remapping */ - AFIO_REMAP_USART2 = AFIO_MAPR_USART2_REMAP, /**< - USART 2 remapping */ - AFIO_REMAP_USART1 = AFIO_MAPR_USART1_REMAP, /**< - USART 1 remapping */ - AFIO_REMAP_I2C1 = AFIO_MAPR_I2C1_REMAP, /**< - I2C 1 remapping */ - AFIO_REMAP_SPI1 = AFIO_MAPR_SPI1_REMAP, /**< - SPI 1 remapping */ - AFIO_REMAP_FSMC_NADV = (AFIO_MAPR2_FSMC_NADV | - AFIO_REMAP_USE_MAPR2), /**< - NADV signal not connected */ - AFIO_REMAP_TIM14 = (AFIO_MAPR2_TIM14_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 14 remapping */ - AFIO_REMAP_TIM13 = (AFIO_MAPR2_TIM13_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 13 remapping */ - AFIO_REMAP_TIM11 = (AFIO_MAPR2_TIM11_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 11 remapping */ - AFIO_REMAP_TIM10 = (AFIO_MAPR2_TIM10_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 10 remapping */ - AFIO_REMAP_TIM9 = (AFIO_MAPR2_TIM9_REMAP | - AFIO_REMAP_USE_MAPR2) /**< - Timer 9 */ -} afio_remap_peripheral; - -void afio_remap(afio_remap_peripheral p); - -/** - * @brief Debug port configuration - * - * Used to configure the behavior of JTAG and Serial Wire (SW) debug - * ports and their associated GPIO pins. - * - * @see afio_cfg_debug_ports() - */ -typedef enum afio_debug_cfg { - AFIO_DEBUG_FULL_SWJ = AFIO_MAPR_SWJ_CFG_FULL_SWJ, /**< - Full Serial Wire and JTAG debug */ - AFIO_DEBUG_FULL_SWJ_NO_NJRST = AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST, /**< - Full Serial Wire and JTAG, but no NJTRST. */ - AFIO_DEBUG_SW_ONLY = AFIO_MAPR_SWJ_CFG_NO_JTAG_SW, /**< - Serial Wire debug only (JTAG-DP disabled, - SW-DP enabled) */ - AFIO_DEBUG_NONE = AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW /**< - No debug; all JTAG and SW pins are free - for use as GPIOs. */ -} afio_debug_cfg; - -/** - * @brief Enable or disable the JTAG and SW debug ports. - * @param config Desired debug port configuration - * @see afio_debug_cfg - */ -static inline void afio_cfg_debug_ports(afio_debug_cfg config) { - __io uint32 *mapr = &AFIO_BASE->MAPR; - *mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; -} - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/STM32F4/cores/maple/libmaple/gpioF2.c b/STM32F4/cores/maple/libmaple/gpioF4.c similarity index 78% rename from STM32F4/cores/maple/libmaple/gpioF2.c rename to STM32F4/cores/maple/libmaple/gpioF4.c index b04c7e9d6..67d3bea53 100644 --- a/STM32F4/cores/maple/libmaple/gpioF2.c +++ b/STM32F4/cores/maple/libmaple/gpioF4.c @@ -24,8 +24,6 @@ * SOFTWARE. *****************************************************************************/ - #ifdef STM32F2 - /** * @file gpio.c * @brief GPIO initialization routine @@ -38,62 +36,57 @@ * GPIO devices */ -gpio_dev gpioa = { +/** GPIO port A device. */ +const gpio_dev GPIOA = { .regs = GPIOA_BASE, .clk_id = RCC_GPIOA, .exti_port = AFIO_EXTI_PA, }; -/** GPIO port A device. */ -gpio_dev* const GPIOA = &gpioa; -gpio_dev gpiob = { +/** GPIO port B device. */ +const gpio_dev GPIOB = { .regs = GPIOB_BASE, .clk_id = RCC_GPIOB, .exti_port = AFIO_EXTI_PB, }; -/** GPIO port B device. */ -gpio_dev* const GPIOB = &gpiob; -gpio_dev gpioc = { +/** GPIO port C device. */ +const gpio_dev GPIOC = { .regs = GPIOC_BASE, .clk_id = RCC_GPIOC, .exti_port = AFIO_EXTI_PC, }; -/** GPIO port C device. */ -gpio_dev* const GPIOC = &gpioc; -gpio_dev gpiod = { +/** GPIO port D device. */ +const gpio_dev GPIOD = { .regs = GPIOD_BASE, .clk_id = RCC_GPIOD, .exti_port = AFIO_EXTI_PD, }; -/** GPIO port D device. */ -gpio_dev* const GPIOD = &gpiod; #ifdef STM32_HIGH_DENSITY -gpio_dev gpioe = { +/** GPIO port E device. */ +const gpio_dev GPIOE = { .regs = GPIOE_BASE, .clk_id = RCC_GPIOE, .exti_port = AFIO_EXTI_PE, }; -/** GPIO port E device. */ -gpio_dev* const GPIOE = &gpioe; -gpio_dev gpiof = { + #if 0 // not available on LQFP 100 package +/** GPIO port F device. */ +const gpio_dev GPIOF = { .regs = GPIOF_BASE, .clk_id = RCC_GPIOF, .exti_port = AFIO_EXTI_PF, }; -/** GPIO port F device. */ -gpio_dev* const GPIOF = &gpiof; -gpio_dev gpiog = { +/** GPIO port G device. */ +const gpio_dev GPIOG = { .regs = GPIOG_BASE, .clk_id = RCC_GPIOG, .exti_port = AFIO_EXTI_PG, }; -/** GPIO port G device. */ -gpio_dev* const GPIOG = &gpiog; +#endif #endif /* @@ -107,7 +100,7 @@ gpio_dev* const GPIOG = &gpiog; * * @param dev GPIO device to initialize. */ -void gpio_init(gpio_dev *dev) { +void gpio_init(const gpio_dev *dev) { rcc_clk_enable(dev->clk_id); rcc_reset_dev(dev->clk_id); } @@ -116,15 +109,17 @@ void gpio_init(gpio_dev *dev) { * Initialize and reset all available GPIO devices. */ void gpio_init_all(void) { - gpio_init(GPIOA); - gpio_init(GPIOB); - gpio_init(GPIOC); - gpio_init(GPIOD); + gpio_init(&GPIOA); + gpio_init(&GPIOB); + gpio_init(&GPIOC); + gpio_init(&GPIOD); #ifdef STM32_HIGH_DENSITY - gpio_init(GPIOE); - gpio_init(GPIOF); - gpio_init(GPIOG); + gpio_init(&GPIOE); + #if 0 // not available on LQFP 100 package + gpio_init(GPIOF); + gpio_init(GPIOG); + #endif // not available on LQFP 100 package #endif #ifdef ARDUINO_STM32F4_NETDUINO2PLUS @@ -148,16 +143,17 @@ void gpio_init_all(void) { * @param mode General purpose or alternate function mode to set the pin to. * @see gpio_pin_mode */ -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { - gpio_reg_map *regs = dev->regs; +void gpio_set_mode(uint8_t io_pin, gpio_pin_mode mode) { + gpio_reg_map *regs = (PIN_MAP[io_pin].gpio_device)->regs; + uint8_t pin = io_pin&0x0f; //regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 8) & 15) << (4*(pin&7))); //gpio_set_af_mode(dev, pin, mode>>8); - regs->MODER = (regs->MODER & ~( 3 << (2*pin))) | (((mode >> 0) & 3) << (2*pin)); - regs->PUPDR = (regs->PUPDR & ~( 3 << (2*pin))) | (((mode >> 2) & 3) << (2*pin)); - regs->OSPEEDR = (regs->OSPEEDR & ~( 3 << (2*pin))) | (((mode >> 4) & 3) << (2*pin)); - regs->OTYPER = (regs->OTYPER & ~( 1 << (1*pin))) | (((mode >> 6) & 1) << (1*pin)); + regs->MODER = (regs->MODER & ~( 3 << (pin<<1))) | (((mode >> 0) & 3) << (pin<<1)); + regs->PUPDR = (regs->PUPDR & ~( 3 << (pin<<1))) | (((mode >> 2) & 3) << (pin<<1)); + regs->OSPEEDR = (regs->OSPEEDR & ~( 3 << (pin<<1))) | (((mode >> 4) & 3) << (pin<<1)); + regs->OTYPER = (regs->OTYPER & ~( 1 << (pin<<0))) | (((mode >> 6) & 1) << (pin<<0)); } /** @@ -168,10 +164,11 @@ void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { * @param mode alternate function mode to set the pin to. * @see gpio_pin_mode */ -void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode) { - gpio_reg_map *regs = dev->regs; +void gpio_set_af_mode(uint8_t io_pin, int mode) { + gpio_reg_map *regs = (PIN_MAP[io_pin].gpio_device)->regs; + uint8_t pin = io_pin&0x0F; - regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 0) & 15) << (4*(pin&7))); + regs->AFR[pin>>3] = (regs->AFR[pin>>3] & ~(15 << ((pin&7)<<2))) | (((mode >> 0) & 15) << ((pin&7)<<2)); } /* @@ -220,5 +217,3 @@ void afio_remap(afio_remap_peripheral remapping) { } } #endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/gpioF2.h b/STM32F4/cores/maple/libmaple/gpio_def.h similarity index 90% rename from STM32F4/cores/maple/libmaple/gpioF2.h rename to STM32F4/cores/maple/libmaple/gpio_def.h index 91bd67be3..cd1fb3843 100644 --- a/STM32F4/cores/maple/libmaple/gpioF2.h +++ b/STM32F4/cores/maple/libmaple/gpio_def.h @@ -31,8 +31,8 @@ * (AFIO) prototypes, defines, and inlined access functions. */ -#ifndef _GPIO_H_ -#define _GPIO_H_ +#ifndef _GPIO_DEF_H_ +#define _GPIO_DEF_H_ #include "libmaple.h" #include "rcc.h" @@ -74,11 +74,14 @@ typedef enum afio_exti_port { AFIO_EXTI_PD, /**< Use port D (PDx) pin. */ #ifdef STM32_HIGH_DENSITY AFIO_EXTI_PE, /**< Use port E (PEx) pin. */ + #if 0 // not available on LQFP 100 package AFIO_EXTI_PF, /**< Use port F (PFx) pin. */ AFIO_EXTI_PG, /**< Use port G (PGx) pin. */ + #endif // not available on LQFP 100 package #endif } afio_exti_port; + /** GPIO device type */ typedef struct gpio_dev { gpio_reg_map *regs; /**< Register map */ @@ -86,21 +89,18 @@ typedef struct gpio_dev { afio_exti_port exti_port; /**< AFIO external interrupt port value */ } gpio_dev; -extern gpio_dev gpioa; -extern gpio_dev* const GPIOA; -extern gpio_dev gpiob; -extern gpio_dev* const GPIOB; -extern gpio_dev gpioc; -extern gpio_dev* const GPIOC; -extern gpio_dev gpiod; -extern gpio_dev* const GPIOD; +extern const gpio_dev GPIOA; +extern const gpio_dev GPIOB; +extern const gpio_dev GPIOC; +extern const gpio_dev GPIOD; #ifdef STM32_HIGH_DENSITY -extern gpio_dev gpioe; -extern gpio_dev* const GPIOE; +extern const gpio_dev GPIOE; + #if 0 // not available on LQFP 100 package extern gpio_dev gpiof; extern gpio_dev* const GPIOF; extern gpio_dev gpiog; extern gpio_dev* const GPIOG; + #endif // not available on LQFP 100 package #endif /** GPIO port register map base pointer */ @@ -110,8 +110,10 @@ extern gpio_dev* const GPIOG; #define GPIOD_BASE ((struct gpio_reg_map*)0x40020C00) #ifdef STM32_HIGH_DENSITY #define GPIOE_BASE ((struct gpio_reg_map*)0x40021000) + #if 0 // not available on LQFP 100 package #define GPIOF_BASE ((struct gpio_reg_map*)0x40021400) #define GPIOG_BASE ((struct gpio_reg_map*)0x40021800) + #endif // not available on LQFP 100 package #endif /* @@ -190,61 +192,6 @@ typedef enum gpio_pin_mode { GPIO_BIGNUMBER = 0xfff } gpio_pin_mode; -/* - * GPIO Convenience routines - */ - -void gpio_init(gpio_dev *dev); -void gpio_init_all(void); -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode); -void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode); - -/** - * @brief Get a GPIO port's corresponding afio_exti_port. - * @param dev GPIO device whose afio_exti_port to return. - */ -static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { - return dev->exti_port; -} - -/** - * Set or reset a GPIO pin. - * - * Pin must have previously been configured to output mode. - * - * @param dev GPIO device whose pin to set. - * @param pin Pin on to set or reset - * @param val If true, set the pin. If false, reset the pin. - */ -static inline void gpio_write_bit(gpio_dev *dev, uint8 pin, uint8 val) { - if (val) { - dev->regs->BSRRL = BIT(pin); - } else { - dev->regs->BSRRH = BIT(pin); - } -} - -/** - * Determine whether or not a GPIO pin is set. - * - * Pin must have previously been configured to input mode. - * - * @param dev GPIO device whose pin to test. - * @param pin Pin on dev to test. - * @return True if the pin is set, false otherwise. - */ -static inline uint32 gpio_read_bit(gpio_dev *dev, uint8 pin) { - return dev->regs->IDR & BIT(pin); -} - -/** - * Toggle a pin configured as output push-pull. - * @param dev GPIO device. - * @param pin Pin on dev to toggle. - */ -static inline void gpio_toggle_bit(gpio_dev *dev, uint8 pin) { - dev->regs->ODR = dev->regs->ODR ^ BIT(pin); -} /* * AFIO register map @@ -532,15 +479,6 @@ typedef enum afio_debug_cfg { for use as GPIOs. */ } afio_debug_cfg; -/** - * @brief Enable or disable the JTAG and SW debug ports. - * @param config Desired debug port configuration - * @see afio_debug_cfg - */ -static inline void afio_cfg_debug_ports(afio_debug_cfg config) { - //__io uint32 *mapr = &AFIO_BASE->MAPR; - //*mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; -} #ifdef __cplusplus } diff --git a/STM32F4/cores/maple/libmaple/i2c.c b/STM32F4/cores/maple/libmaple/i2c.c index e3f3199bc..a582ed056 100644 --- a/STM32F4/cores/maple/libmaple/i2c.c +++ b/STM32F4/cores/maple/libmaple/i2c.c @@ -41,9 +41,9 @@ static i2c_dev i2c_dev1 = { .regs = I2C1_BASE, - .gpio_port = &gpiob, - .sda_pin = 7, - .scl_pin = 6, + //.gpio_port = &gpiob, + .sda_pin = PB7, + .scl_pin = PB6, .clk_id = RCC_I2C1, .ev_nvic_line = NVIC_I2C1_EV, .er_nvic_line = NVIC_I2C1_ER, @@ -54,9 +54,9 @@ i2c_dev* const I2C1 = &i2c_dev1; static i2c_dev i2c_dev2 = { .regs = I2C2_BASE, - .gpio_port = &gpiob, - .sda_pin = 11, - .scl_pin = 10, + //.gpio_port = &gpiob, + .sda_pin = PB11, + .scl_pin = PB10, .clk_id = RCC_I2C2, .ev_nvic_line = NVIC_I2C2_EV, .er_nvic_line = NVIC_I2C2_ER, @@ -336,38 +336,38 @@ void __irq_i2c2_er(void) { */ void i2c_bus_reset(const i2c_dev *dev) { /* Release both lines */ - gpio_write_bit(dev->gpio_port, dev->scl_pin, 1); - gpio_write_bit(dev->gpio_port, dev->sda_pin, 1); - gpio_set_mode(dev->gpio_port, dev->scl_pin, GPIO_OUTPUT_OD); - gpio_set_mode(dev->gpio_port, dev->sda_pin, GPIO_OUTPUT_OD); + gpio_set_pin(dev->scl_pin); + gpio_set_pin(dev->sda_pin); + gpio_set_mode(dev->scl_pin, GPIO_OUTPUT_OD); + gpio_set_mode(dev->sda_pin, GPIO_OUTPUT_OD); /* * Make sure the bus is free by clocking it until any slaves release the * bus. */ - while (!gpio_read_bit(dev->gpio_port, dev->sda_pin)) { + while (!gpio_read_pin(dev->sda_pin)) { /* Wait for any clock stretching to finish */ - while (!gpio_read_bit(dev->gpio_port, dev->scl_pin)) + while (!gpio_read_pin(dev->scl_pin)) ; delay_us(10); /* Pull low */ - gpio_write_bit(dev->gpio_port, dev->scl_pin, 0); + gpio_clear_pin(dev->scl_pin); delay_us(10); /* Release high again */ - gpio_write_bit(dev->gpio_port, dev->scl_pin, 1); + gpio_set_pin(dev->scl_pin); delay_us(10); } /* Generate start then stop condition */ - gpio_write_bit(dev->gpio_port, dev->sda_pin, 0); + gpio_clear_pin(dev->sda_pin); delay_us(10); - gpio_write_bit(dev->gpio_port, dev->scl_pin, 0); + gpio_clear_pin(dev->scl_pin); delay_us(10); - gpio_write_bit(dev->gpio_port, dev->scl_pin, 1); + gpio_set_pin(dev->scl_pin); delay_us(10); - gpio_write_bit(dev->gpio_port, dev->sda_pin, 1); + gpio_set_pin(dev->sda_pin); } /** @@ -413,8 +413,8 @@ void i2c_master_enable(i2c_dev *dev, uint32 flags) { /* Turn on clock and set GPIO modes */ i2c_init(dev); - gpio_set_mode(dev->gpio_port, dev->sda_pin, GPIO_AF_OUTPUT_OD); - gpio_set_mode(dev->gpio_port, dev->scl_pin, GPIO_AF_OUTPUT_OD); + gpio_set_mode(dev->sda_pin, GPIO_AF_OUTPUT_OD); + gpio_set_mode(dev->scl_pin, GPIO_AF_OUTPUT_OD); /* I2C1 and I2C2 are fed from APB1, clocked at 36MHz */ i2c_set_input_clk(dev, I2C_CLK); diff --git a/STM32F4/cores/maple/libmaple/i2c.h b/STM32F4/cores/maple/libmaple/i2c.h index 4c60ad713..28819a35b 100644 --- a/STM32F4/cores/maple/libmaple/i2c.h +++ b/STM32F4/cores/maple/libmaple/i2c.h @@ -78,7 +78,7 @@ typedef struct i2c_msg { */ typedef struct i2c_dev { i2c_reg_map *regs; /**< Register map */ - gpio_dev *gpio_port; /**< SDA, SCL pins' GPIO port */ + //gpio_dev *gpio_port; /**< SDA, SCL pins' GPIO port */ uint8 sda_pin; /**< SDA bit on gpio_port */ uint8 scl_pin; /**< SCL bit on gpio_port */ rcc_clk_id clk_id; /**< RCC clock information */ diff --git a/STM32F4/cores/maple/libmaple/libmaple.h b/STM32F4/cores/maple/libmaple/libmaple.h index 10c6c0c00..8360ba390 100644 --- a/STM32F4/cores/maple/libmaple/libmaple.h +++ b/STM32F4/cores/maple/libmaple/libmaple.h @@ -32,29 +32,31 @@ #ifndef _LIBMAPLE_H_ #define _LIBMAPLE_H_ -#include "libmaple_types.h" -#include "stm32.h" #include "util.h" -#include "delay.h" /* * Where to put usercode, based on space reserved for bootloader. * * FIXME this has no business being here */ +/* #if defined(MCU_STM32F103VE) || defined(MCU_STM32F205VE) || defined(MCU_STM32F406VG) - /* e.g., Aeroquad32 */ - #define USER_ADDR_ROM 0x08010000 /* ala42 */ + // e.g., Aeroquad32 + #define USER_ADDR_ROM 0x08010000 // ala42 #define USER_ADDR_RAM 0x20000C00 #define STACK_TOP 0x20000800 #elif defined(BOARD_freeflight) +*/ #define USER_ADDR_ROM 0x08000000 -#define USER_ADDR_RAM 0x20000000 +#define USER_ADDR_RAM 0x20000C00 #define STACK_TOP 0x20000800 +/* #else #define USER_ADDR_ROM 0x08005000 #define USER_ADDR_RAM 0x20000C00 #define STACK_TOP 0x20000800 #endif +*/ + #endif diff --git a/STM32F4/cores/maple/libmaple/libmaple_types.h b/STM32F4/cores/maple/libmaple/libmaple_types.h index 332ded176..8e765b435 100644 --- a/STM32F4/cores/maple/libmaple/libmaple_types.h +++ b/STM32F4/cores/maple/libmaple/libmaple_types.h @@ -33,6 +33,8 @@ #ifndef _LIBMAPLE_TYPES_H_ #define _LIBMAPLE_TYPES_H_ +#include + typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; @@ -46,12 +48,15 @@ typedef long long int64; typedef void (*voidFuncPtr)(void); #define __io volatile -#define __attr_flash __attribute__((section (".USER_FLASH"))) - -#define __always_inline inline __attribute__((always_inline)) - +#define __IO volatile +#ifndef __attr_flash + #define __attr_flash __attribute__((section (".USER_FLASH"))) +#endif +#ifndef __always_inline + #define __always_inline inline __attribute__((always_inline)) +#endif #ifndef NULL -#define NULL 0 + #define NULL 0 #endif #endif diff --git a/STM32F4/cores/maple/libmaple/rcc.h b/STM32F4/cores/maple/libmaple/rcc.h index 6317cbdb8..75e2d3d7a 100644 --- a/STM32F4/cores/maple/libmaple/rcc.h +++ b/STM32F4/cores/maple/libmaple/rcc.h @@ -29,8 +29,5 @@ * @brief reset and clock control definitions and prototypes */ -#ifdef STM32F2 -#include "rccF2.h" -#else -#include "rccF1.h" -#endif + +#include "rccF4.h" diff --git a/STM32F4/cores/maple/libmaple/rccF1.c b/STM32F4/cores/maple/libmaple/rccF1.c deleted file mode 100644 index 9eb56b872..000000000 --- a/STM32F4/cores/maple/libmaple/rccF1.c +++ /dev/null @@ -1,233 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - - #ifdef STM32F1 - -/** - * @file rcc.c - * @brief Implements pretty much only the basic clock setup on the - * stm32, clock enable/disable and peripheral reset commands. - */ - -#include "libmaple.h" -#include "flash.h" -#include "rcc.h" -#include "bitband.h" - -#define APB1 RCC_APB1 -#define APB2 RCC_APB2 -#define AHB RCC_AHB - -struct rcc_dev_info { - const rcc_clk_domain clk_domain; - const uint8 line_num; -}; - -/* Device descriptor table, maps rcc_clk_id onto bus and enable/reset - * register bit numbers. */ -static const struct rcc_dev_info rcc_dev_table[] = { - [RCC_GPIOA] = { .clk_domain = APB2, .line_num = 2 }, - [RCC_GPIOB] = { .clk_domain = APB2, .line_num = 3 }, - [RCC_GPIOC] = { .clk_domain = APB2, .line_num = 4 }, - [RCC_GPIOD] = { .clk_domain = APB2, .line_num = 5 }, - [RCC_AFIO] = { .clk_domain = APB2, .line_num = 0 }, - [RCC_ADC1] = { .clk_domain = APB2, .line_num = 9 }, - [RCC_ADC2] = { .clk_domain = APB2, .line_num = 10 }, - [RCC_ADC3] = { .clk_domain = APB2, .line_num = 15 }, - [RCC_USART1] = { .clk_domain = APB2, .line_num = 14 }, - [RCC_USART2] = { .clk_domain = APB1, .line_num = 17 }, - [RCC_USART3] = { .clk_domain = APB1, .line_num = 18 }, - [RCC_TIMER1] = { .clk_domain = APB2, .line_num = 11 }, - [RCC_TIMER2] = { .clk_domain = APB1, .line_num = 0 }, - [RCC_TIMER3] = { .clk_domain = APB1, .line_num = 1 }, - [RCC_TIMER4] = { .clk_domain = APB1, .line_num = 2 }, - [RCC_SPI1] = { .clk_domain = APB2, .line_num = 12 }, - [RCC_SPI2] = { .clk_domain = APB1, .line_num = 14 }, - [RCC_DMA1] = { .clk_domain = AHB, .line_num = 0 }, - [RCC_PWR] = { .clk_domain = APB1, .line_num = 28}, - [RCC_BKP] = { .clk_domain = APB1, .line_num = 27}, - [RCC_I2C1] = { .clk_domain = APB1, .line_num = 21 }, - [RCC_I2C2] = { .clk_domain = APB1, .line_num = 22 }, - [RCC_CRC] = { .clk_domain = AHB, .line_num = 6}, - [RCC_FLITF] = { .clk_domain = AHB, .line_num = 4}, - [RCC_SRAM] = { .clk_domain = AHB, .line_num = 2}, -#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) - [RCC_GPIOE] = { .clk_domain = APB2, .line_num = 6 }, - [RCC_GPIOF] = { .clk_domain = APB2, .line_num = 7 }, - [RCC_GPIOG] = { .clk_domain = APB2, .line_num = 8 }, - [RCC_UART4] = { .clk_domain = APB1, .line_num = 19 }, - [RCC_UART5] = { .clk_domain = APB1, .line_num = 20 }, - [RCC_TIMER5] = { .clk_domain = APB1, .line_num = 3 }, - [RCC_TIMER6] = { .clk_domain = APB1, .line_num = 4 }, - [RCC_TIMER7] = { .clk_domain = APB1, .line_num = 5 }, - [RCC_TIMER8] = { .clk_domain = APB2, .line_num = 13 }, - [RCC_FSMC] = { .clk_domain = AHB, .line_num = 8 }, - [RCC_DAC] = { .clk_domain = APB1, .line_num = 29 }, - [RCC_DMA2] = { .clk_domain = AHB, .line_num = 1 }, - [RCC_SDIO] = { .clk_domain = AHB, .line_num = 10 }, - [RCC_SPI3] = { .clk_domain = APB1, .line_num = 15 }, -#endif -#ifdef STM32_XL_DENSITY - [RCC_TIMER9] = { .clk_domain = APB2, .line_num = 19 }, - [RCC_TIMER10] = { .clk_domain = APB2, .line_num = 20 }, - [RCC_TIMER11] = { .clk_domain = APB2, .line_num = 21 }, - [RCC_TIMER12] = { .clk_domain = APB1, .line_num = 6 }, - [RCC_TIMER13] = { .clk_domain = APB1, .line_num = 7 }, - [RCC_TIMER14] = { .clk_domain = APB1, .line_num = 8 }, -#endif -}; - -/** - * @brief Initialize the clock control system. Initializes the system - * clock source to use the PLL driven by an external oscillator - * @param sysclk_src system clock source, must be PLL - * @param pll_src pll clock source, must be HSE - * @param pll_mul pll multiplier - */ -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul) { - uint32 cfgr = 0; - uint32 cr; - - /* Assume that we're going to clock the chip off the PLL, fed by - * the HSE */ - ASSERT(sysclk_src == RCC_CLKSRC_PLL && - pll_src == RCC_PLLSRC_HSE); - - RCC_BASE->CFGR = pll_src | pll_mul; - - /* Turn on the HSE */ - cr = RCC_BASE->CR; - cr |= RCC_CR_HSEON; - RCC_BASE->CR = cr; - while (!(RCC_BASE->CR & RCC_CR_HSERDY)) - ; - - /* Now the PLL */ - cr |= RCC_CR_PLLON; - RCC_BASE->CR = cr; - while (!(RCC_BASE->CR & RCC_CR_PLLRDY)) - ; - - /* Finally, let's switch over to the PLL */ - cfgr &= ~RCC_CFGR_SW; - cfgr |= RCC_CFGR_SW_PLL; - RCC_BASE->CFGR = cfgr; - while ((RCC_BASE->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) - ; -} - -/** - * @brief Turn on the clock line on a peripheral - * @param id Clock ID of the peripheral to turn on. - */ -void rcc_clk_enable(rcc_clk_id id) { - static const __io uint32* enable_regs[] = { - [APB1] = &RCC_BASE->APB1ENR, - [APB2] = &RCC_BASE->APB2ENR, - [AHB] = &RCC_BASE->AHBENR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io uint32* enr = (__io uint32*)enable_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(enr, lnum, 1); -} - -/** - * @brief Reset a peripheral. - * @param id Clock ID of the peripheral to reset. - */ -void rcc_reset_dev(rcc_clk_id id) { - static const __io uint32* reset_regs[] = { - [APB1] = &RCC_BASE->APB1RSTR, - [APB2] = &RCC_BASE->APB2RSTR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io void* addr = (__io void*)reset_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(addr, lnum, 1); - bb_peri_set_bit(addr, lnum, 0); -} - -/** - * @brief Get a peripheral's clock domain - * @param id Clock ID of the peripheral whose clock domain to return - * @return Clock source for the given clock ID - */ -rcc_clk_domain rcc_dev_clk(rcc_clk_id id) { - return rcc_dev_table[id].clk_domain; -} - -/** - * @brief Get a peripheral's clock domain speed - * @param id Clock ID of the peripheral whose clock domain speed to return - * @return Clock speed for the given clock ID - */ -uint32 rcc_dev_clk_speed(rcc_clk_id id) { - static const uint32 rcc_dev_clk_speed_table[] = { - [RCC_AHB] = 72000000, - [RCC_APB1] = 36000000, - [RCC_APB2] = 72000000 - }; - return rcc_dev_clk_speed_table[rcc_dev_clk(id)]; -} - -/** - * @brief Get a peripheral's timer clock domain speed - * @param id Clock ID of the peripheral whose clock domain speed to return - * @return Clock speed for the given clock ID - */ -uint32 rcc_dev_timer_clk_speed(rcc_clk_id id) { - return rcc_dev_clk_speed(RCC_APB2); // 72 MHz for all counter -} - -/** - * @brief Set the divider on a peripheral prescaler - * @param prescaler prescaler to set - * @param divider prescaler divider - */ -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) { - static const uint32 masks[] = { - [RCC_PRESCALER_AHB] = RCC_CFGR_HPRE, - [RCC_PRESCALER_APB1] = RCC_CFGR_PPRE1, - [RCC_PRESCALER_APB2] = RCC_CFGR_PPRE2, - [RCC_PRESCALER_USB] = RCC_CFGR_USBPRE, - [RCC_PRESCALER_ADC] = RCC_CFGR_ADCPRE, - }; - - uint32 cfgr = RCC_BASE->CFGR; - cfgr &= ~masks[prescaler]; - cfgr |= divider; - RCC_BASE->CFGR = cfgr; -} - - -#endif diff --git a/STM32F4/cores/maple/libmaple/rccF1.h b/STM32F4/cores/maple/libmaple/rccF1.h deleted file mode 100644 index dd79704d8..000000000 --- a/STM32F4/cores/maple/libmaple/rccF1.h +++ /dev/null @@ -1,572 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file rcc.h - * @brief reset and clock control definitions and prototypes - */ - -#include "libmaple_types.h" - -#ifndef _RCC_H_ -#define _RCC_H_ - -#ifdef __cplusplus -extern "C"{ -#endif - -/** RCC register map type */ -typedef struct rcc_reg_map { - __io uint32 CR; /**< Clock control register */ - __io uint32 CFGR; /**< Clock configuration register */ - __io uint32 CIR; /**< Clock interrupt register */ - __io uint32 APB2RSTR; /**< APB2 peripheral reset register */ - __io uint32 APB1RSTR; /**< APB1 peripheral reset register */ - __io uint32 AHBENR; /**< AHB peripheral clock enable register */ - __io uint32 APB2ENR; /**< APB2 peripheral clock enable register */ - __io uint32 APB1ENR; /**< APB1 peripheral clock enable register */ - __io uint32 BDCR; /**< Backup domain control register */ - __io uint32 CSR; /**< Control/status register */ -} rcc_reg_map; - -/** RCC register map base pointer */ -#define RCC_BASE ((struct rcc_reg_map*)0x40021000) - -/* - * Register bit definitions - */ - -/* Clock control register */ - -#define RCC_CR_PLLRDY_BIT 25 -#define RCC_CR_PLLON_BIT 24 -#define RCC_CR_CSSON_BIT 19 -#define RCC_CR_HSEBYP_BIT 18 -#define RCC_CR_HSERDY_BIT 17 -#define RCC_CR_HSEON_BIT 16 -#define RCC_CR_HSIRDY_BIT 1 -#define RCC_CR_HSION_BIT 0 - -#define RCC_CR_PLLRDY BIT(RCC_CR_PLLRDY_BIT) -#define RCC_CR_PLLON BIT(RCC_CR_PLLON_BIT) -#define RCC_CR_CSSON BIT(RCC_CR_CSSON_BIT) -#define RCC_CR_HSEBYP BIT(RCC_CR_HSEBYP_BIT) -#define RCC_CR_HSERDY BIT(RCC_CR_HSERDY_BIT) -#define RCC_CR_HSEON BIT(RCC_CR_HSEON_BIT) -#define RCC_CR_HSICAL (0xFF << 8) -#define RCC_CR_HSITRIM (0x1F << 3) -#define RCC_CR_HSIRDY BIT(RCC_CR_HSIRDY_BIT) -#define RCC_CR_HSION BIT(RCC_CR_HSION_BIT) - -/* Clock configuration register */ - -#define RCC_CFGR_USBPRE_BIT 22 -#define RCC_CFGR_PLLXTPRE_BIT 17 -#define RCC_CFGR_PLLSRC_BIT 16 - -#define RCC_CFGR_MCO (0x3 << 24) -#define RCC_CFGR_USBPRE BIT(RCC_CFGR_USBPRE_BIT) -#define RCC_CFGR_PLLMUL (0xF << 18) -#define RCC_CFGR_PLLXTPRE BIT(RCC_CFGR_PLLXTPRE_BIT) -#define RCC_CFGR_PLLSRC BIT(RCC_CFGR_PLLSRC_BIT) -#define RCC_CFGR_ADCPRE (0x3 << 14) -#define RCC_CFGR_PPRE2 (0x7 << 11) -#define RCC_CFGR_PPRE1 (0x7 << 8) -#define RCC_CFGR_HPRE (0xF << 4) -#define RCC_CFGR_SWS (0x3 << 2) -#define RCC_CFGR_SWS_PLL (0x2 << 2) -#define RCC_CFGR_SWS_HSE (0x1 << 2) -#define RCC_CFGR_SW 0x3 -#define RCC_CFGR_SW_PLL 0x2 -#define RCC_CFGR_SW_HSE 0x1 - -/* Clock interrupt register */ - -#define RCC_CIR_CSSC_BIT 23 -#define RCC_CIR_PLLRDYC_BIT 20 -#define RCC_CIR_HSERDYC_BIT 19 -#define RCC_CIR_HSIRDYC_BIT 18 -#define RCC_CIR_LSERDYC_BIT 17 -#define RCC_CIR_LSIRDYC_BIT 16 -#define RCC_CIR_PLLRDYIE_BIT 12 -#define RCC_CIR_HSERDYIE_BIT 11 -#define RCC_CIR_HSIRDYIE_BIT 10 -#define RCC_CIR_LSERDYIE_BIT 9 -#define RCC_CIR_LSIRDYIE_BIT 8 -#define RCC_CIR_CSSF_BIT 7 -#define RCC_CIR_PLLRDYF_BIT 4 -#define RCC_CIR_HSERDYF_BIT 3 -#define RCC_CIR_HSIRDYF_BIT 2 -#define RCC_CIR_LSERDYF_BIT 1 -#define RCC_CIR_LSIRDYF_BIT 0 - -#define RCC_CIR_CSSC BIT(RCC_CIR_CSSC_BIT) -#define RCC_CIR_PLLRDYC BIT(RCC_CIR_PLLRDYC_BIT) -#define RCC_CIR_HSERDYC BIT(RCC_CIR_HSERDYC_BIT) -#define RCC_CIR_HSIRDYC BIT(RCC_CIR_HSIRDYC_BIT) -#define RCC_CIR_LSERDYC BIT(RCC_CIR_LSERDYC_BIT) -#define RCC_CIR_LSIRDYC BIT(RCC_CIR_LSIRDYC_BIT) -#define RCC_CIR_PLLRDYIE BIT(RCC_CIR_PLLRDYIE_BIT) -#define RCC_CIR_HSERDYIE BIT(RCC_CIR_HSERDYIE_BIT) -#define RCC_CIR_HSIRDYIE BIT(RCC_CIR_HSIRDYIE_BIT) -#define RCC_CIR_LSERDYIE BIT(RCC_CIR_LSERDYIE_BIT) -#define RCC_CIR_LSIRDYIE BIT(RCC_CIR_LSIRDYIE_BIT) -#define RCC_CIR_CSSF BIT(RCC_CIR_CSSF_BIT) -#define RCC_CIR_PLLRDYF BIT(RCC_CIR_PLLRDYF_BIT) -#define RCC_CIR_HSERDYF BIT(RCC_CIR_HSERDYF_BIT) -#define RCC_CIR_HSIRDYF BIT(RCC_CIR_HSIRDYF_BIT) -#define RCC_CIR_LSERDYF BIT(RCC_CIR_LSERDYF_BIT) -#define RCC_CIR_LSIRDYF BIT(RCC_CIR_LSIRDYF_BIT) - -/* APB2 peripheral reset register */ - -#define RCC_APB2RSTR_TIM11RST_BIT 21 -#define RCC_APB2RSTR_TIM10RST_BIT 20 -#define RCC_APB2RSTR_TIM9RST_BIT 19 -#define RCC_APB2RSTR_ADC3RST_BIT 15 -#define RCC_APB2RSTR_USART1RST_BIT 14 -#define RCC_APB2RSTR_TIM8RST_BIT 13 -#define RCC_APB2RSTR_SPI1RST_BIT 12 -#define RCC_APB2RSTR_TIM1RST_BIT 11 -#define RCC_APB2RSTR_ADC2RST_BIT 10 -#define RCC_APB2RSTR_ADC1RST_BIT 9 -#define RCC_APB2RSTR_IOPGRST_BIT 8 -#define RCC_APB2RSTR_IOPFRST_BIT 7 -#define RCC_APB2RSTR_IOPERST_BIT 6 -#define RCC_APB2RSTR_IOPDRST_BIT 5 -#define RCC_APB2RSTR_IOPCRST_BIT 4 -#define RCC_APB2RSTR_IOPBRST_BIT 3 -#define RCC_APB2RSTR_IOPARST_BIT 2 -#define RCC_APB2RSTR_AFIORST_BIT 0 - -#define RCC_APB2RSTR_TIM11RST BIT(RCC_APB2RSTR_TIM11RST_BIT) -#define RCC_APB2RSTR_TIM10RST BIT(RCC_APB2RSTR_TIM10RST_BIT) -#define RCC_APB2RSTR_TIM9RST BIT(RCC_APB2RSTR_TIM9RST_BIT) -#define RCC_APB2RSTR_ADC3RST BIT(RCC_APB2RSTR_ADC3RST_BIT) -#define RCC_APB2RSTR_USART1RST BIT(RCC_APB2RSTR_USART1RST_BIT) -#define RCC_APB2RSTR_TIM8RST BIT(RCC_APB2RSTR_TIM8RST_BIT) -#define RCC_APB2RSTR_SPI1RST BIT(RCC_APB2RSTR_SPI1RST_BIT) -#define RCC_APB2RSTR_TIM1RST BIT(RCC_APB2RSTR_TIM1RST_BIT) -#define RCC_APB2RSTR_ADC2RST BIT(RCC_APB2RSTR_ADC2RST_BIT) -#define RCC_APB2RSTR_ADC1RST BIT(RCC_APB2RSTR_ADC1RST_BIT) -#define RCC_APB2RSTR_IOPGRST BIT(RCC_APB2RSTR_IOPGRST_BIT) -#define RCC_APB2RSTR_IOPFRST BIT(RCC_APB2RSTR_IOPFRST_BIT) -#define RCC_APB2RSTR_IOPERST BIT(RCC_APB2RSTR_IOPERST_BIT) -#define RCC_APB2RSTR_IOPDRST BIT(RCC_APB2RSTR_IOPDRST_BIT) -#define RCC_APB2RSTR_IOPCRST BIT(RCC_APB2RSTR_IOPCRST_BIT) -#define RCC_APB2RSTR_IOPBRST BIT(RCC_APB2RSTR_IOPBRST_BIT) -#define RCC_APB2RSTR_IOPARST BIT(RCC_APB2RSTR_IOPARST_BIT) -#define RCC_APB2RSTR_AFIORST BIT(RCC_APB2RSTR_AFIORST_BIT) - -/* APB1 peripheral reset register */ - -#define RCC_APB1RSTR_DACRST_BIT 29 -#define RCC_APB1RSTR_PWRRST_BIT 28 -#define RCC_APB1RSTR_BKPRST_BIT 27 -#define RCC_APB1RSTR_CANRST_BIT 25 -#define RCC_APB1RSTR_USBRST_BIT 23 -#define RCC_APB1RSTR_I2C2RST_BIT 22 -#define RCC_APB1RSTR_I2C1RST_BIT 21 -#define RCC_APB1RSTR_UART5RST_BIT 20 -#define RCC_APB1RSTR_UART4RST_BIT 19 -#define RCC_APB1RSTR_USART3RST_BIT 18 -#define RCC_APB1RSTR_USART2RST_BIT 17 -#define RCC_APB1RSTR_SPI3RST_BIT 15 -#define RCC_APB1RSTR_SPI2RST_BIT 14 -#define RCC_APB1RSTR_WWDRST_BIT 11 -#define RCC_APB1RSTR_TIM14RST_BIT 8 -#define RCC_APB1RSTR_TIM13RST_BIT 7 -#define RCC_APB1RSTR_TIM12RST_BIT 6 -#define RCC_APB1RSTR_TIM7RST_BIT 5 -#define RCC_APB1RSTR_TIM6RST_BIT 4 -#define RCC_APB1RSTR_TIM5RST_BIT 3 -#define RCC_APB1RSTR_TIM4RST_BIT 2 -#define RCC_APB1RSTR_TIM3RST_BIT 1 -#define RCC_APB1RSTR_TIM2RST_BIT 0 - -#define RCC_APB1RSTR_DACRST BIT(RCC_APB1RSTR_DACRST_BIT) -#define RCC_APB1RSTR_PWRRST BIT(RCC_APB1RSTR_PWRRST_BIT) -#define RCC_APB1RSTR_BKPRST BIT(RCC_APB1RSTR_BKPRST_BIT) -#define RCC_APB1RSTR_CANRST BIT(RCC_APB1RSTR_CANRST_BIT) -#define RCC_APB1RSTR_USBRST BIT(RCC_APB1RSTR_USBRST_BIT) -#define RCC_APB1RSTR_I2C2RST BIT(RCC_APB1RSTR_I2C2RST_BIT) -#define RCC_APB1RSTR_I2C1RST BIT(RCC_APB1RSTR_I2C1RST_BIT) -#define RCC_APB1RSTR_UART5RST BIT(RCC_APB1RSTR_UART5RST_BIT) -#define RCC_APB1RSTR_UART4RST BIT(RCC_APB1RSTR_UART4RST_BIT) -#define RCC_APB1RSTR_USART3RST BIT(RCC_APB1RSTR_USART3RST_BIT) -#define RCC_APB1RSTR_USART2RST BIT(RCC_APB1RSTR_USART2RST_BIT) -#define RCC_APB1RSTR_SPI3RST BIT(RCC_APB1RSTR_SPI3RST_BIT) -#define RCC_APB1RSTR_SPI2RST BIT(RCC_APB1RSTR_SPI2RST_BIT) -#define RCC_APB1RSTR_WWDRST BIT(RCC_APB1RSTR_WWDRST_BIT) -#define RCC_APB1RSTR_TIM14RST BIT(RCC_APB1RSTR_TIM14RST_BIT) -#define RCC_APB1RSTR_TIM13RST BIT(RCC_APB1RSTR_TIM13RST_BIT) -#define RCC_APB1RSTR_TIM12RST BIT(RCC_APB1RSTR_TIM12RST_BIT) -#define RCC_APB1RSTR_TIM7RST BIT(RCC_APB1RSTR_TIM7RST_BIT) -#define RCC_APB1RSTR_TIM6RST BIT(RCC_APB1RSTR_TIM6RST_BIT) -#define RCC_APB1RSTR_TIM5RST BIT(RCC_APB1RSTR_TIM5RST_BIT) -#define RCC_APB1RSTR_TIM4RST BIT(RCC_APB1RSTR_TIM4RST_BIT) -#define RCC_APB1RSTR_TIM3RST BIT(RCC_APB1RSTR_TIM3RST_BIT) -#define RCC_APB1RSTR_TIM2RST BIT(RCC_APB1RSTR_TIM2RST_BIT) - -/* AHB peripheral clock enable register */ - -#define RCC_AHBENR_SDIOEN_BIT 10 -#define RCC_AHBENR_FSMCEN_BIT 8 -#define RCC_AHBENR_CRCEN_BIT 7 -#define RCC_AHBENR_FLITFEN_BIT 4 -#define RCC_AHBENR_SRAMEN_BIT 2 -#define RCC_AHBENR_DMA2EN_BIT 1 -#define RCC_AHBENR_DMA1EN_BIT 0 - -#define RCC_AHBENR_SDIOEN BIT(RCC_AHBENR_SDIOEN_BIT) -#define RCC_AHBENR_FSMCEN BIT(RCC_AHBENR_FSMCEN_BIT) -#define RCC_AHBENR_CRCEN BIT(RCC_AHBENR_CRCEN_BIT) -#define RCC_AHBENR_FLITFEN BIT(RCC_AHBENR_FLITFEN_BIT) -#define RCC_AHBENR_SRAMEN BIT(RCC_AHBENR_SRAMEN_BIT) -#define RCC_AHBENR_DMA2EN BIT(RCC_AHBENR_DMA2EN_BIT) -#define RCC_AHBENR_DMA1EN BIT(RCC_AHBENR_DMA1EN_BIT) - -/* APB2 peripheral clock enable register */ - -#define RCC_APB2ENR_TIM11EN_BIT 21 -#define RCC_APB2ENR_TIM10EN_BIT 20 -#define RCC_APB2ENR_TIM9EN_BIT 19 -#define RCC_APB2ENR_ADC3EN_BIT 15 -#define RCC_APB2ENR_USART1EN_BIT 14 -#define RCC_APB2ENR_TIM8EN_BIT 13 -#define RCC_APB2ENR_SPI1EN_BIT 12 -#define RCC_APB2ENR_TIM1EN_BIT 11 -#define RCC_APB2ENR_ADC2EN_BIT 10 -#define RCC_APB2ENR_ADC1EN_BIT 9 -#define RCC_APB2ENR_IOPGEN_BIT 8 -#define RCC_APB2ENR_IOPFEN_BIT 7 -#define RCC_APB2ENR_IOPEEN_BIT 6 -#define RCC_APB2ENR_IOPDEN_BIT 5 -#define RCC_APB2ENR_IOPCEN_BIT 4 -#define RCC_APB2ENR_IOPBEN_BIT 3 -#define RCC_APB2ENR_IOPAEN_BIT 2 -#define RCC_APB2ENR_AFIOEN_BIT 0 - -#define RCC_APB2ENR_TIM11EN BIT(RCC_APB2ENR_TIM11EN_BIT) -#define RCC_APB2ENR_TIM10EN BIT(RCC_APB2ENR_TIM10EN_BIT) -#define RCC_APB2ENR_TIM9EN BIT(RCC_APB2ENR_TIM9EN_BIT) -#define RCC_APB2ENR_ADC3EN BIT(RCC_APB2ENR_ADC3EN_BIT) -#define RCC_APB2ENR_USART1EN BIT(RCC_APB2ENR_USART1EN_BIT) -#define RCC_APB2ENR_TIM8EN BIT(RCC_APB2ENR_TIM8EN_BIT) -#define RCC_APB2ENR_SPI1EN BIT(RCC_APB2ENR_SPI1EN_BIT) -#define RCC_APB2ENR_TIM1EN BIT(RCC_APB2ENR_TIM1EN_BIT) -#define RCC_APB2ENR_ADC2EN BIT(RCC_APB2ENR_ADC2EN_BIT) -#define RCC_APB2ENR_ADC1EN BIT(RCC_APB2ENR_ADC1EN_BIT) -#define RCC_APB2ENR_IOPGEN BIT(RCC_APB2ENR_IOPGEN_BIT) -#define RCC_APB2ENR_IOPFEN BIT(RCC_APB2ENR_IOPFEN_BIT) -#define RCC_APB2ENR_IOPEEN BIT(RCC_APB2ENR_IOPEEN_BIT) -#define RCC_APB2ENR_IOPDEN BIT(RCC_APB2ENR_IOPDEN_BIT) -#define RCC_APB2ENR_IOPCEN BIT(RCC_APB2ENR_IOPCEN_BIT) -#define RCC_APB2ENR_IOPBEN BIT(RCC_APB2ENR_IOPBEN_BIT) -#define RCC_APB2ENR_IOPAEN BIT(RCC_APB2ENR_IOPAEN_BIT) -#define RCC_APB2ENR_AFIOEN BIT(RCC_APB2ENR_AFIOEN_BIT) - -/* APB1 peripheral clock enable register */ - -#define RCC_APB1ENR_DACEN_BIT 29 -#define RCC_APB1ENR_PWREN_BIT 28 -#define RCC_APB1ENR_BKPEN_BIT 27 -#define RCC_APB1ENR_CANEN_BIT 25 -#define RCC_APB1ENR_USBEN_BIT 23 -#define RCC_APB1ENR_I2C2EN_BIT 22 -#define RCC_APB1ENR_I2C1EN_BIT 21 -#define RCC_APB1ENR_UART5EN_BIT 20 -#define RCC_APB1ENR_UART4EN_BIT 19 -#define RCC_APB1ENR_USART3EN_BIT 18 -#define RCC_APB1ENR_USART2EN_BIT 17 -#define RCC_APB1ENR_SPI3EN_BIT 15 -#define RCC_APB1ENR_SPI2EN_BIT 14 -#define RCC_APB1ENR_WWDEN_BIT 11 -#define RCC_APB1ENR_TIM14EN_BIT 8 -#define RCC_APB1ENR_TIM13EN_BIT 7 -#define RCC_APB1ENR_TIM12EN_BIT 6 -#define RCC_APB1ENR_TIM7EN_BIT 5 -#define RCC_APB1ENR_TIM6EN_BIT 4 -#define RCC_APB1ENR_TIM5EN_BIT 3 -#define RCC_APB1ENR_TIM4EN_BIT 2 -#define RCC_APB1ENR_TIM3EN_BIT 1 -#define RCC_APB1ENR_TIM2EN_BIT 0 - -#define RCC_APB1ENR_DACEN BIT(RCC_APB1ENR_DACEN_BIT) -#define RCC_APB1ENR_PWREN BIT(RCC_APB1ENR_PWREN_BIT) -#define RCC_APB1ENR_BKPEN BIT(RCC_APB1ENR_BKPEN_BIT) -#define RCC_APB1ENR_CANEN BIT(RCC_APB1ENR_CANEN_BIT) -#define RCC_APB1ENR_USBEN BIT(RCC_APB1ENR_USBEN_BIT) -#define RCC_APB1ENR_I2C2EN BIT(RCC_APB1ENR_I2C2EN_BIT) -#define RCC_APB1ENR_I2C1EN BIT(RCC_APB1ENR_I2C1EN_BIT) -#define RCC_APB1ENR_UART5EN BIT(RCC_APB1ENR_UART5EN_BIT) -#define RCC_APB1ENR_UART4EN BIT(RCC_APB1ENR_UART4EN_BIT) -#define RCC_APB1ENR_USART3EN BIT(RCC_APB1ENR_USART3EN_BIT) -#define RCC_APB1ENR_USART2EN BIT(RCC_APB1ENR_USART2EN_BIT) -#define RCC_APB1ENR_SPI3EN BIT(RCC_APB1ENR_SPI3EN_BIT) -#define RCC_APB1ENR_SPI2EN BIT(RCC_APB1ENR_SPI2EN_BIT) -#define RCC_APB1ENR_WWDEN BIT(RCC_APB1ENR_WWDEN_BIT) -#define RCC_APB1ENR_TIM14EN BIT(RCC_APB1ENR_TIM14EN_BIT) -#define RCC_APB1ENR_TIM13EN BIT(RCC_APB1ENR_TIM13EN_BIT) -#define RCC_APB1ENR_TIM12EN BIT(RCC_APB1ENR_TIM12EN_BIT) -#define RCC_APB1ENR_TIM7EN BIT(RCC_APB1ENR_TIM7EN_BIT) -#define RCC_APB1ENR_TIM6EN BIT(RCC_APB1ENR_TIM6EN_BIT) -#define RCC_APB1ENR_TIM5EN BIT(RCC_APB1ENR_TIM5EN_BIT) -#define RCC_APB1ENR_TIM4EN BIT(RCC_APB1ENR_TIM4EN_BIT) -#define RCC_APB1ENR_TIM3EN BIT(RCC_APB1ENR_TIM3EN_BIT) -#define RCC_APB1ENR_TIM2EN BIT(RCC_APB1ENR_TIM2EN_BIT) - -/* Backup domain control register */ - -#define RCC_BDCR_BDRST_BIT 16 -#define RCC_BDCR_RTCEN_BIT 15 -#define RCC_BDCR_LSEBYP_BIT 2 -#define RCC_BDCR_LSERDY_BIT 1 -#define RCC_BDCR_LSEON_BIT 0 - -#define RCC_BDCR_BDRST BIT(RCC_BDCR_BDRST_BIT) -#define RCC_BDCR_RTCEN BIT(RCC_BDCR_RTC_BIT) -#define RCC_BDCR_RTCSEL (0x3 << 8) -#define RCC_BDCR_RTCSEL_NONE (0x0 << 8) -#define RCC_BDCR_RTCSEL_LSE (0x1 << 8) -#define RCC_BDCR_RTCSEL_HSE (0x3 << 8) -#define RCC_BDCR_LSEBYP BIT(RCC_BDCR_LSEBYP_BIT) -#define RCC_BDCR_LSERDY BIT(RCC_BDCR_LSERDY_BIT) -#define RCC_BDCR_LSEON BIT(RCC_BDCR_LSEON_BIT) - -/* Control/status register */ - -#define RCC_CSR_LPWRRSTF_BIT 31 -#define RCC_CSR_WWDGRSTF_BIT 30 -#define RCC_CSR_IWDGRSTF_BIT 29 -#define RCC_CSR_SFTRSTF_BIT 28 -#define RCC_CSR_PORRSTF_BIT 27 -#define RCC_CSR_PINRSTF_BIT 26 -#define RCC_CSR_RMVF_BIT 24 -#define RCC_CSR_LSIRDY_BIT 1 -#define RCC_CSR_LSION_BIT 0 - -#define RCC_CSR_LPWRRSTF BIT(RCC_CSR_LPWRRSTF_BIT) -#define RCC_CSR_WWDGRSTF BIT(RCC_CSR_WWDGRSTF_BIT) -#define RCC_CSR_IWDGRSTF BIT(RCC_CSR_IWDGRSTF_BIT) -#define RCC_CSR_SFTRSTF BIT(RCC_CSR_SFTRSTF_BIT) -#define RCC_CSR_PORRSTF BIT(RCC_CSR_PORRSTF_BIT) -#define RCC_CSR_PINRSTF BIT(RCC_CSR_PINRSTF_BIT) -#define RCC_CSR_RMVF BIT(RCC_CSR_RMVF_BIT) -#define RCC_CSR_LSIRDY BIT(RCC_CSR_LSIRDY_BIT) -#define RCC_CSR_LSION BIT(RCC_CSR_LSION_BIT) - -/* - * Convenience routines - */ - -/** - * SYSCLK sources - * @see rcc_clk_init() - */ -typedef enum rcc_sysclk_src { - RCC_CLKSRC_HSI = 0x0, - RCC_CLKSRC_HSE = 0x1, - RCC_CLKSRC_PLL = 0x2, -} rcc_sysclk_src; - -/** - * PLL entry clock source - * @see rcc_clk_init() - */ -typedef enum rcc_pllsrc { - RCC_PLLSRC_HSE = (0x1 << 16), - RCC_PLLSRC_HSI_DIV_2 = (0x0 << 16) -} rcc_pllsrc; - -/** - * PLL multipliers - * @see rcc_clk_init() - */ -typedef enum rcc_pll_multiplier { - RCC_PLLMUL_2 = (0x0 << 18), - RCC_PLLMUL_3 = (0x1 << 18), - RCC_PLLMUL_4 = (0x2 << 18), - RCC_PLLMUL_5 = (0x3 << 18), - RCC_PLLMUL_6 = (0x4 << 18), - RCC_PLLMUL_7 = (0x5 << 18), - RCC_PLLMUL_8 = (0x6 << 18), - RCC_PLLMUL_9 = (0x7 << 18), - RCC_PLLMUL_10 = (0x8 << 18), - RCC_PLLMUL_11 = (0x9 << 18), - RCC_PLLMUL_12 = (0xA << 18), - RCC_PLLMUL_13 = (0xB << 18), - RCC_PLLMUL_14 = (0xC << 18), - RCC_PLLMUL_15 = (0xD << 18), - RCC_PLLMUL_16 = (0xE << 18), -} rcc_pll_multiplier; - -/** - * @brief Identifies bus and clock line for a peripheral. - * - * Also generally useful as a unique identifier for that peripheral - * (or its corresponding device struct). - */ -typedef enum rcc_clk_id { - RCC_GPIOA, - RCC_GPIOB, - RCC_GPIOC, - RCC_GPIOD, - RCC_AFIO, - RCC_ADC1, - RCC_ADC2, - RCC_ADC3, - RCC_USART1, - RCC_USART2, - RCC_USART3, - RCC_TIMER1, - RCC_TIMER2, - RCC_TIMER3, - RCC_TIMER4, - RCC_SPI1, - RCC_SPI2, - RCC_DMA1, - RCC_PWR, - RCC_BKP, - RCC_I2C1, - RCC_I2C2, - RCC_CRC, - RCC_FLITF, - RCC_SRAM, -#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) - RCC_GPIOE, - RCC_GPIOF, - RCC_GPIOG, - RCC_UART4, - RCC_UART5, - RCC_TIMER5, - RCC_TIMER6, - RCC_TIMER7, - RCC_TIMER8, - RCC_FSMC, - RCC_DAC, - RCC_DMA2, - RCC_SDIO, - RCC_SPI3, -#endif -#ifdef STM32_XL_DENSITY - RCC_TIMER9, - RCC_TIMER10, - RCC_TIMER11, - RCC_TIMER12, - RCC_TIMER13, - RCC_TIMER14, -#endif -} rcc_clk_id; - -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul); -void rcc_clk_enable(rcc_clk_id device); -void rcc_reset_dev(rcc_clk_id device); - -typedef enum rcc_clk_domain { - RCC_APB1, - RCC_APB2, - RCC_AHB -} rcc_clk_domain; - -rcc_clk_domain rcc_dev_clk(rcc_clk_id device); - -uint32 rcc_dev_clk_speed(rcc_clk_id id); -uint32 rcc_dev_timer_clk_speed(rcc_clk_id id); - -/** - * Prescaler identifiers - * @see rcc_set_prescaler() - */ -typedef enum rcc_prescaler { - RCC_PRESCALER_AHB, - RCC_PRESCALER_APB1, - RCC_PRESCALER_APB2, - RCC_PRESCALER_USB, - RCC_PRESCALER_ADC -} rcc_prescaler; - -/** - * ADC prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_adc_divider { - RCC_ADCPRE_PCLK_DIV_2 = 0x0 << 14, - RCC_ADCPRE_PCLK_DIV_4 = 0x1 << 14, - RCC_ADCPRE_PCLK_DIV_6 = 0x2 << 14, - RCC_ADCPRE_PCLK_DIV_8 = 0x3 << 14, -} rcc_adc_divider; - -/** - * APB1 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb1_divider { - RCC_APB1_HCLK_DIV_1 = 0x0 << 8, - RCC_APB1_HCLK_DIV_2 = 0x4 << 8, - RCC_APB1_HCLK_DIV_4 = 0x5 << 8, - RCC_APB1_HCLK_DIV_8 = 0x6 << 8, - RCC_APB1_HCLK_DIV_16 = 0x7 << 8, -} rcc_apb1_divider; - -/** - * APB2 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb2_divider { - RCC_APB2_HCLK_DIV_1 = 0x0 << 11, - RCC_APB2_HCLK_DIV_2 = 0x4 << 11, - RCC_APB2_HCLK_DIV_4 = 0x5 << 11, - RCC_APB2_HCLK_DIV_8 = 0x6 << 11, - RCC_APB2_HCLK_DIV_16 = 0x7 << 11, -} rcc_apb2_divider; - -/** - * AHB prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_ahb_divider { - RCC_AHB_SYSCLK_DIV_1 = 0x0 << 4, - RCC_AHB_SYSCLK_DIV_2 = 0x8 << 4, - RCC_AHB_SYSCLK_DIV_4 = 0x9 << 4, - RCC_AHB_SYSCLK_DIV_8 = 0xA << 4, - RCC_AHB_SYSCLK_DIV_16 = 0xB << 4, - RCC_AHB_SYSCLK_DIV_32 = 0xC << 4, - RCC_AHB_SYSCLK_DIV_64 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_128 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_256 = 0xE << 4, - RCC_AHB_SYSCLK_DIV_512 = 0xF << 4, -} rcc_ahb_divider; - -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/rccF2.c b/STM32F4/cores/maple/libmaple/rccF4.c similarity index 99% rename from STM32F4/cores/maple/libmaple/rccF2.c rename to STM32F4/cores/maple/libmaple/rccF4.c index 691393a8d..c4ff30dc4 100644 --- a/STM32F4/cores/maple/libmaple/rccF2.c +++ b/STM32F4/cores/maple/libmaple/rccF4.c @@ -24,7 +24,7 @@ * SOFTWARE. *****************************************************************************/ - #ifdef STM32F2 +#ifdef STM32F4 /** * @file rcc.c @@ -166,7 +166,6 @@ typedef struct #define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) #define RESET 0 -typedef uint32 uint32_t; void InitMCO1() { @@ -175,8 +174,8 @@ void InitMCO1() RCC->CFGR &= RCC_CFGR_MCO1_RESET_MASK; RCC->CFGR |= RCC_CFGR_MCO1Source_HSE | RCC_CFGR_MCO1Div_1; // PA8 Output the Master Clock MCO1 - gpio_set_af_mode(GPIOA, 8, 0); - gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_af_mode(PA8, 0); + gpio_set_mode(PA8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); } diff --git a/STM32F4/cores/maple/libmaple/rccF2.h b/STM32F4/cores/maple/libmaple/rccF4.h similarity index 100% rename from STM32F4/cores/maple/libmaple/rccF2.h rename to STM32F4/cores/maple/libmaple/rccF4.h diff --git a/STM32F4/cores/maple/libmaple/rules.mk b/STM32F4/cores/maple/libmaple/rules.mk index c4924dc86..eb8d96d26 100644 --- a/STM32F4/cores/maple/libmaple/rules.mk +++ b/STM32F4/cores/maple/libmaple/rules.mk @@ -3,17 +3,11 @@ sp := $(sp).x dirstack_$(sp) := $(d) d := $(dir) BUILDDIRS += $(BUILD_PATH)/$(d) -ifneq ($(MCU_FAMILY), STM32F2) -BUILDDIRS += $(BUILD_PATH)/$(d)/usb -BUILDDIRS += $(BUILD_PATH)/$(d)/usb/usb_lib -LIBMAPLE_INCLUDES := -I$(LIBMAPLE_PATH) -I$(LIBMAPLE_PATH)/usb -I$(LIBMAPLE_PATH)/usb/usb_lib -else BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/STM32_USB_Device_Library/Core/src BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/STM32_USB_Device_Library/Class/cdc/src BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/STM32_USB_OTG_Driver/src BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/VCP LIBMAPLE_INCLUDES := -I$(LIBMAPLE_PATH) -I$(LIBMAPLE_PATH)/usbF4 -endif # Local flags @@ -42,18 +36,6 @@ cSRCS_$(d) := adc.c \ usart.c \ util.c -ifneq ($(MCU_FAMILY), STM32F2) - cSRCS_$(d) += \ - usb/descriptors.c \ - usb/usb.c \ - usb/usb_callbacks.c \ - usb/usb_hardware.c \ - usb/usb_lib/usb_core.c \ - usb/usb_lib/usb_init.c \ - usb/usb_lib/usb_int.c \ - usb/usb_lib/usb_mem.c \ - usb/usb_lib/usb_regs.c -else V=1 cSRCS_$(d) += \ usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c \ @@ -69,11 +51,7 @@ else usbF4/VCP/usbd_usr.c \ usbF4/usb.c \ usbF4/VCP/misc.c -endif -ifneq ($(MCU_FAMILY), STM32F2) - cSRCS_$(d) += bkp.c -endif sSRCS_$(d) := exc.S diff --git a/STM32F4/cores/maple/libmaple/spi.c b/STM32F4/cores/maple/libmaple/spi.c index 194a82efe..4b274cb37 100644 --- a/STM32F4/cores/maple/libmaple/spi.c +++ b/STM32F4/cores/maple/libmaple/spi.c @@ -83,25 +83,29 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags) { } /** - * @brief Nonblocking SPI transmit. + * @brief Blocking SPI transmit. * @param dev SPI port to use for transmission * @param buf Buffer to transmit. The sizeof buf's elements are * inferred from dev's data frame format (i.e., are * correctly treated as 8-bit or 16-bit quantities). * @param len Maximum number of elements to transmit. - * @return Number of elements transmitted. */ -uint32 spi_tx(spi_dev *dev, const void *buf, uint32 len) { - uint32 txed = 0; - uint8 byte_frame = spi_dff(dev) == SPI_DFF_8_BIT; - while (spi_is_tx_empty(dev) && (txed < len)) { - if (byte_frame) { - dev->regs->DR = ((const uint8*)buf)[txed++]; - } else { - dev->regs->DR = ((const uint16*)buf)[txed++]; - } - } - return txed; +void spi_tx(spi_dev *dev, void *buf, uint32 len) +{ + spi_reg_map *regs = dev->regs; + if ( spi_dff(dev) == SPI_DFF_8_BIT ) { + uint8 * dp8 = (uint8*)buf; + while ( len-- ) { + while ( (regs->SR & SPI_SR_TXE)==0 ) ; //while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty + regs->DR = *dp8++; + } + } else { + uint16 * dp16 = (uint16*)buf; + while ( len-- ) { + while ( (regs->SR & SPI_SR_TXE)==0 ) ; //while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty + regs->DR = *dp16++; + } + } } /** @@ -157,8 +161,9 @@ void spi_rx_dma_disable(spi_dev *dev) { */ static void spi_reconfigure(spi_dev *dev, uint32 cr1_config) { - spi_irq_disable(dev, SPI_INTERRUPTS_ALL); - spi_peripheral_disable(dev); - dev->regs->CR1 = cr1_config; - spi_peripheral_enable(dev); +#define MASK (SPI_CR1_CRCEN|SPI_CR1_DFF) + spi_irq_disable(dev, SPI_INTERRUPTS_ALL); + if ( (dev->regs->CR1&MASK)!=(cr1_config&MASK) ) spi_peripheral_disable(dev); + dev->regs->CR1 = cr1_config; + spi_peripheral_enable(dev); } diff --git a/STM32F4/cores/maple/libmaple/spi.h b/STM32F4/cores/maple/libmaple/spi.h index 88739c584..abed68c12 100644 --- a/STM32F4/cores/maple/libmaple/spi.h +++ b/STM32F4/cores/maple/libmaple/spi.h @@ -213,31 +213,22 @@ typedef struct spi_dev { void spi_init(spi_dev *dev); -struct gpio_dev; /** * @brief Configure GPIO bit modes for use as a SPI port's pins. * * @param dev SPI device * @param as_master If true, configure as bus master; otherwise, as slave. - * @param nss_dev NSS pin's GPIO device * @param nss_bit NSS pin's GPIO bit on nss_dev - * @param sck_dev SCK pin's GPIO device * @param sck_bit SCK pin's GPIO bit on comm_dev - * @param miso_dev MISO pin's GPIO device * @param miso_bit MISO pin's GPIO bit on comm_dev - * @param mosi_dev MOSI pin's GPIO device * @param mosi_bit MOSI pin's GPIO bit on comm_dev */ extern void spi_config_gpios(spi_dev *dev, uint8 as_master, - struct gpio_dev *nss_dev, - uint8 nss_bit, - struct gpio_dev *sck_dev, - uint8 sck_bit, - struct gpio_dev *miso_dev, - uint8 miso_bit, - struct gpio_dev *mosi_dev, - uint8 mosi_bit); + uint8 nss_pin, + uint8 sck_pin, + uint8 miso_pin, + uint8 mosi_pin); /** * @brief SPI mode configuration. @@ -312,7 +303,7 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags); -uint32 spi_tx(spi_dev *dev, const void *buf, uint32 len); +void spi_tx(spi_dev *dev, void *buf, uint32 len); /** * @brief Call a function on each SPI port diff --git a/STM32F4/cores/maple/libmaple/spiF4.h b/STM32F4/cores/maple/libmaple/spiF4.h index 3f5116442..cbdc91a73 100644 --- a/STM32F4/cores/maple/libmaple/spiF4.h +++ b/STM32F4/cores/maple/libmaple/spiF4.h @@ -31,8 +31,8 @@ * @brief STM32F1 SPI/I2S series header. */ -#ifndef _LIBMAPLE_STM32F1_SPI_H_ -#define _LIBMAPLE_STM32F1_SPI_H_ +#ifndef _LIBMAPLE_SPI_F4_H_ +#define _LIBMAPLE_SPI_F4_H_ #include @@ -62,17 +62,6 @@ extern struct spi_dev *SPI2; extern struct spi_dev *SPI3; #endif -/* - * Routines - */ - -/* spi_gpio_cfg(): Backwards compatibility shim to spi_config_gpios() */ -struct gpio_dev; -extern void spi_config_gpios(struct spi_dev*, uint8, - struct gpio_dev*, uint8, - struct gpio_dev*, uint8, - struct gpio_dev*, uint8, - struct gpio_dev*, uint8); #ifdef __cplusplus } diff --git a/STM32F4/cores/maple/libmaple/spi_f4.c b/STM32F4/cores/maple/libmaple/spi_f4.c index b9beb68d2..43f5092c6 100644 --- a/STM32F4/cores/maple/libmaple/spi_f4.c +++ b/STM32F4/cores/maple/libmaple/spi_f4.c @@ -56,25 +56,21 @@ spi_dev *SPI3 = &spi3; void spi_config_gpios(spi_dev *ignored, uint8 as_master, - gpio_dev *nss_dev, - uint8 nss_bit, - gpio_dev *sck_dev, - uint8 sck_bit, - gpio_dev *miso_dev, - uint8 miso_bit, - gpio_dev *mosi_dev, - uint8 mosi_bit) { + uint8 nss_pin, + uint8 sck_pin, + uint8 miso_pin, + uint8 mosi_pin) { if (as_master) { // gpio_set_mode(nss_dev, nss_bit, GPIO_AF_OUTPUT_PP); - gpio_set_mode(sck_dev, sck_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(sck_pin, GPIO_AF_OUTPUT_PP); // gpio_set_mode(comm_dev, miso_bit, GPIO_INPUT_FLOATING); - gpio_set_mode(miso_dev, miso_bit, GPIO_AF_INPUT_PD); - gpio_set_mode(mosi_dev, mosi_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(miso_pin, GPIO_AF_INPUT_PD); + gpio_set_mode(mosi_pin, GPIO_AF_OUTPUT_PP); } else { - gpio_set_mode(nss_dev, nss_bit, GPIO_INPUT_FLOATING); - gpio_set_mode(sck_dev, sck_bit, GPIO_INPUT_FLOATING); - gpio_set_mode(miso_dev, miso_bit, GPIO_AF_OUTPUT_PP); - gpio_set_mode(mosi_dev, mosi_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(nss_pin, GPIO_INPUT_FLOATING); + gpio_set_mode(sck_pin, GPIO_INPUT_FLOATING); + gpio_set_mode(miso_pin, GPIO_AF_OUTPUT_PP); + gpio_set_mode(mosi_pin, GPIO_INPUT_FLOATING); } } diff --git a/STM32F4/cores/maple/libmaple/stm32.h b/STM32F4/cores/maple/libmaple/stm32.h index 0d4deaa41..3921788e7 100644 --- a/STM32F4/cores/maple/libmaple/stm32.h +++ b/STM32F4/cores/maple/libmaple/stm32.h @@ -138,69 +138,8 @@ #endif -#if defined(MCU_STM32F103RB) - /* e.g., LeafLabs Maple */ - #define STM32_NR_GPIO_PORTS 4 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20005000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103ZE) - /* e.g., LeafLabs Maple Native */ - - #define STM32_NR_GPIO_PORTS 7 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103CB) - /* e.g., LeafLabs Maple Mini */ - - /* This STM32_NR_GPIO_PORTS value is not, strictly speaking, true. - * But only pins 0 and 1 exist, and they're used for OSC on the - * Mini, so we'll live with this for now. */ - #define STM32_NR_GPIO_PORTS 3 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20005000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103RE) - /* e.g., LeafLabs Maple RET6 edition */ - - #define STM32_NR_GPIO_PORTS 4 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103VE) - /* e.g., LeafLabs Maple Native */ - - #define STM32_NR_GPIO_PORTS 5 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F205VE) - #define STM32_TICKS_PER_US 120 - #define STM32_NR_GPIO_PORTS 5 - #define STM32_DELAY_US_MULT (STM32_TICKS_PER_US/3) - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F406VG) +#if defined( STM32F4 ) #define STM32_TICKS_PER_US 168 #define STM32_NR_GPIO_PORTS 5 #define STM32_DELAY_US_MULT (STM32_TICKS_PER_US/3) diff --git a/STM32F4/cores/maple/libmaple/timer.c b/STM32F4/cores/maple/libmaple/timer.c index 83e9ace33..f8e55a185 100644 --- a/STM32F4/cores/maple/libmaple/timer.c +++ b/STM32F4/cores/maple/libmaple/timer.c @@ -44,7 +44,7 @@ /* Update only. */ #define NR_BAS_HANDLERS 1 -static timer_dev timer1 = { +timer_dev timer1 = { .regs = { .adv = TIMER1_BASE }, .clk_id = RCC_TIMER1, .type = TIMER_ADVANCED, @@ -53,7 +53,7 @@ static timer_dev timer1 = { /** Timer 1 device (advanced) */ timer_dev *TIMER1 = &timer1; -static timer_dev timer2 = { +timer_dev timer2 = { .regs = { .gen = TIMER2_BASE }, .clk_id = RCC_TIMER2, .type = TIMER_GENERAL, @@ -62,7 +62,7 @@ static timer_dev timer2 = { /** Timer 2 device (general-purpose) */ timer_dev *TIMER2 = &timer2; -static timer_dev timer3 = { +timer_dev timer3 = { .regs = { .gen = TIMER3_BASE }, .clk_id = RCC_TIMER3, .type = TIMER_GENERAL, @@ -71,7 +71,7 @@ static timer_dev timer3 = { /** Timer 3 device (general-purpose) */ timer_dev *TIMER3 = &timer3; -static timer_dev timer4 = { +timer_dev timer4 = { .regs = { .gen = TIMER4_BASE }, .clk_id = RCC_TIMER4, .type = TIMER_GENERAL, @@ -81,7 +81,7 @@ static timer_dev timer4 = { timer_dev *TIMER4 = &timer4; #ifdef STM32_HIGH_DENSITY -static timer_dev timer5 = { +timer_dev timer5 = { .regs = { .gen = TIMER5_BASE }, .clk_id = RCC_TIMER5, .type = TIMER_GENERAL, @@ -90,7 +90,7 @@ static timer_dev timer5 = { /** Timer 5 device (general-purpose) */ timer_dev *TIMER5 = &timer5; -static timer_dev timer6 = { +timer_dev timer6 = { .regs = { .bas = TIMER6_BASE }, .clk_id = RCC_TIMER6, .type = TIMER_BASIC, @@ -99,7 +99,7 @@ static timer_dev timer6 = { /** Timer 6 device (basic) */ timer_dev *TIMER6 = &timer6; -static timer_dev timer7 = { +timer_dev timer7 = { .regs = { .bas = TIMER7_BASE }, .clk_id = RCC_TIMER7, .type = TIMER_BASIC, @@ -108,7 +108,7 @@ static timer_dev timer7 = { /** Timer 7 device (basic) */ timer_dev *TIMER7 = &timer7; -static timer_dev timer8 = { +timer_dev timer8 = { .regs = { .adv = TIMER8_BASE }, .clk_id = RCC_TIMER8, .type = TIMER_ADVANCED, diff --git a/STM32F4/cores/maple/libmaple/timer.h b/STM32F4/cores/maple/libmaple/timer.h index fce6345b2..79b7d2996 100644 --- a/STM32F4/cores/maple/libmaple/timer.h +++ b/STM32F4/cores/maple/libmaple/timer.h @@ -113,13 +113,8 @@ typedef struct timer_bas_reg_map { } timer_bas_reg_map; -#ifdef STM32F2 - /** Timer 1 register map base pointer */ - #define TIMER1_BASE ((struct timer_adv_reg_map*)0x40010000) -#else - /** Timer 1 register map base pointer */ - #define TIMER1_BASE ((struct timer_adv_reg_map*)0x40012C00) -#endif +/** Timer 1 register map base pointer */ +#define TIMER1_BASE ((struct timer_adv_reg_map*)0x40010000) /** Timer 2 register map base pointer */ #define TIMER2_BASE ((struct timer_gen_reg_map*)0x40000000) /** Timer 3 register map base pointer */ @@ -133,14 +128,8 @@ typedef struct timer_bas_reg_map { #define TIMER6_BASE ((struct timer_bas_reg_map*)0x40001000) /** Timer 7 register map base pointer */ #define TIMER7_BASE ((struct timer_bas_reg_map*)0x40001400) - -#ifdef STM32F2 - /** Timer 8 register map base pointer */ - #define TIMER8_BASE ((struct timer_adv_reg_map*)0x40010400) -#else - /** Timer 8 register map base pointer */ - #define TIMER8_BASE ((struct timer_adv_reg_map*)0x40013400) -#endif +/** Timer 8 register map base pointer */ +#define TIMER8_BASE ((struct timer_adv_reg_map*)0x40010400) #endif /* diff --git a/STM32F4/cores/maple/libmaple/usart.h b/STM32F4/cores/maple/libmaple/usart.h index 3f7c88590..282293a17 100644 --- a/STM32F4/cores/maple/libmaple/usart.h +++ b/STM32F4/cores/maple/libmaple/usart.h @@ -62,11 +62,7 @@ typedef struct usart_reg_map { } usart_reg_map; /** USART1 register map base pointer */ -#ifdef STM32F2 - #define USART1_BASE ((struct usart_reg_map*)0x40011000) -#else - #define USART1_BASE ((struct usart_reg_map*)0x40013800) -#endif +#define USART1_BASE ((struct usart_reg_map*)0x40011000) /** USART2 register map base pointer */ #define USART2_BASE ((struct usart_reg_map*)0x40004400) /** USART3 register map base pointer */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h index f58ff0601..7ac987dcb 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h @@ -26,7 +26,7 @@ #include "usbd_ioreq.h" #include "usbd_req.h" -#include "usbd_desc.h" +#include diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h index 926f42e13..b1c8cc117 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h @@ -24,7 +24,8 @@ #ifndef __USB_CDC_CORE_H_ #define __USB_CDC_CORE_H_ -#include "usbd_ioreq.h" +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c index aac6776cd..8f97c5176 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c @@ -58,9 +58,10 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_core.h" -#include "usbd_desc.h" -#include "usbd_req.h" +#include +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h index b876856a3..063a30e69 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h @@ -24,9 +24,9 @@ #define __USBD_CORE_H /* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" +#include #include "usbd_def.h" -#include "usbd_conf.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h index a8c86710d..f2a31153a 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h @@ -24,7 +24,7 @@ #ifndef __USBD_DEF_H #define __USBD_DEF_H /* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h index 9aa9e44a3..f9849c6f9 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h @@ -27,7 +27,7 @@ /* Includes ------------------------------------------------------------------*/ #include "usbd_def.h" #include "usbd_core.h" -#include "usbd_conf.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c index af758427d..00bb25140 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c @@ -20,11 +20,11 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usbd_req.h" -#include "usbd_ioreq.h" -#include "usb_dcd_int.h" -#include "usb_bsp.h" +#include +#include +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c index 6964766bd..20ee5a0f1 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c @@ -20,7 +20,7 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c index f08d26c6c..5fc2e036c 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c @@ -20,9 +20,9 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" -#include "usbd_ioreq.h" -#include "usbd_desc.h" +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h index 82a09e15c..43c478126 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h @@ -24,7 +24,7 @@ #define __USB_CORE_H__ /* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" +#include #include "usb_regs.h" #include "usb_defines.h" diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h index 8c23d72d9..ee2c1a009 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h @@ -24,7 +24,7 @@ #define __USB_DEF_H__ /* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" +#include /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h index 54d61b827..1347f315d 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h @@ -23,6 +23,7 @@ #ifndef __USB_OTG__ #define __USB_OTG__ +#include "usb_core.h" /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h index cd71ddfaf..99f844e58 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h @@ -24,8 +24,8 @@ #define __USB_OTG_REGS_H__ /* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" - +#include +#include /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c index cb9eabc8c..1687afa7c 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_bsp.h" -#include "usb_core.h" +#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c index c3336cb84..dc9e53839 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" -#include "usb_bsp.h" +#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c index 3a49ede25..f9e561f14 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c @@ -20,12 +20,12 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_dcd_int.h" +#include typedef int IRQn_Type; #define __NVIC_PRIO_BITS 4 #define __Vendor_SysTickConfig 1 -#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h index 443665c70..ff5e9a6d4 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h @@ -141,7 +141,7 @@ #endif #include /*!< standard types definitions */ -#include /*!< Core Instruction Access */ +#include "core_cmInstr.h" /*!< Core Instruction Access */ //#include /*!< Core Function Access */ //#include /*!< Compiler specific SIMD Intrinsics */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c index 9f33150cf..15a715e87 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c @@ -80,7 +80,7 @@ typedef unsigned char u8; typedef int IRQn_Type; #define __NVIC_PRIO_BITS 4 #define __Vendor_SysTickConfig 1 -#include +#include "core_cm4.h" /** @addtogroup STM32F4xx_StdPeriph_Driver * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c index df23ccbd7..e794cb144 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c @@ -21,13 +21,13 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_bsp.h" +#include #include "usbd_conf.h" -#include +#include typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; #define OTG_FS_IRQn 67 //typedef unsigned char uint8_t; -#include +#include "misc.h" //#include "stm32f4_discovery.h" @@ -97,10 +97,10 @@ void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) { // ala42 #define GPIO_AF_OTG1_FS ((uint8_t)0xA) /* OTG_FS Alternate Function mapping */ - gpio_set_mode(GPIOA,11,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); - gpio_set_mode(GPIOA,12,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); - gpio_set_af_mode(GPIOA,11,GPIO_AF_OTG1_FS) ; // OTG_FS_DM - gpio_set_af_mode(GPIOA,12,GPIO_AF_OTG1_FS) ; // OTG_FS_DP + gpio_set_mode(BOARD_USB_DM_PIN,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_mode(BOARD_USB_DP_PIN,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_af_mode(BOARD_USB_DM_PIN,GPIO_AF_OTG1_FS) ; // OTG_FS_DM + gpio_set_af_mode(BOARD_USB_DP_PIN,GPIO_AF_OTG1_FS) ; // OTG_FS_DP #ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED gpio_set_mode(GPIOA, 8,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); gpio_set_af_mode(GPIOA, 8,GPIO_AF_OTG1_FS) ; // OTG_FS_SOF @@ -122,10 +122,10 @@ void USB_OTG_BSP_DeInit(USB_OTG_CORE_HANDLE *pdev) { // ala42 #define GPIO_AF0 ((uint8_t)0) /* OTG_FS Alternate Function mapping */ - gpio_set_mode(GPIOA,11, GPIO_MODE_INPUT); - gpio_set_mode(GPIOA,12, GPIO_MODE_INPUT); - gpio_set_af_mode(GPIOA,11,GPIO_AF0) ; // OTG_FS_DM - gpio_set_af_mode(GPIOA,12,GPIO_AF0) ; // OTG_FS_DP + gpio_set_mode(BOARD_USB_DM_PIN, GPIO_MODE_INPUT); + gpio_set_mode(BOARD_USB_DP_PIN, GPIO_MODE_INPUT); + gpio_set_af_mode(BOARD_USB_DM_PIN,GPIO_AF0) ; // OTG_FS_DM + gpio_set_af_mode(BOARD_USB_DP_PIN,GPIO_AF0) ; // OTG_FS_DP #ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED gpio_set_mode(GPIOA, 8,GPIO_MODE_INPUT); gpio_set_af_mode(GPIOA, 8,GPIO_AF0) ; // OTG_FS_SOF diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h index 61b0ac50c..fd45f4db3 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h @@ -173,7 +173,9 @@ typedef unsigned char u8; #elif defined (__ICCARM__) /* IAR Compiler */ #define __packed __packed #elif defined ( __GNUC__ ) /* GNU Compiler */ + #ifndef __packed #define __packed __attribute__ ((__packed__)) + #endif #elif defined (__TASKING__) /* TASKING Compiler */ #define __packed __unaligned #endif /* __CC_ARM */ @@ -206,7 +208,9 @@ typedef unsigned char u8; #elif defined (__ICCARM__) /* IAR Compiler */ #define __packed __packed #elif defined ( __GNUC__ ) /* GNU Compiler */ + #ifndef __packed #define __packed __attribute__ ((__packed__)) + #endif #elif defined (__TASKING__) /* TASKING Compiler */ #define __packed __unaligned #endif /* __CC_ARM */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c index b13260ee5..28a2d1ff2 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c @@ -255,7 +255,7 @@ typedef struct { void systemHardReset(void) { SCB_TypeDef* rSCB = (SCB_TypeDef *) SCB_BASE; - typedef void (*funcPtr)(void); + //typedef void (*funcPtr)(void); // not used /* Reset */ rSCB->AIRCR = (u32)AIRCR_RESET_REQ; diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h index 67475e7a4..8398dbdbb 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h @@ -26,7 +26,7 @@ /* Includes ------------------------------------------------------------------*/ //#include "stm32f4xx.h" -#include "usbd_cdc_core.h" +#include #include "usbd_conf.h" diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h index 516a2fbb3..62a40c27c 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h @@ -25,6 +25,7 @@ /* Includes ------------------------------------------------------------------*/ //#include "stm32f4_discovery.h" +#include "usb_conf.h" /** @defgroup USB_CONF_Exported_Defines * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c index 537f2665c..0153858fc 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c @@ -20,11 +20,11 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" +#include #include "usbd_desc.h" -#include "usbd_req.h" +#include #include "usbd_conf.h" -#include "usb_regs.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h index ed999dc62..4ae998cee 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h @@ -25,7 +25,7 @@ #define __USB_DESC_H /* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c index 84e8d6a54..a16ce40c5 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_usr.h" -#include "usbd_ioreq.h" +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.c b/STM32F4/cores/maple/libmaple/usbF4/usb.c index 2c0672f6a..385071982 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.c +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.c @@ -1,27 +1,30 @@ -#include "usbd_cdc_core.h" -#include "usbd_usr.h" -#include "usbd_desc.h" +#ifndef _USBF4_USB_H_ +#define _USBF4_USB_H_ + + +#include +#include +#include #include "usb.h" -#include -#include -#include +#include +#include +#include +#include USB_OTG_CORE_HANDLE USB_OTG_dev; -void setupUSB (void) { - #define USB_DISC_DEV GPIOD - #define USB_DISC_PIN 11 - - gpio_set_mode(USB_DISC_DEV, USB_DISC_PIN, GPIO_OUTPUT_OD); // ala42 +void setupUSB (void) +{ + gpio_set_mode(BOARD_USB_DP_PIN, GPIO_OUTPUT_OD); // ala42 #ifdef USB_DISC_OD //gpio_set_mode(USB_DISC_DEV, USB_DISC_PIN, GPIO_OUTPUT_OD); // ala42 #else //gpio_set_mode(USB_DISC_DEV, USB_DISC_PIN, GPIO_OUTPUT_PP); // ala42 for active pull-up on disconnect pin #endif - gpio_write_bit(USB_DISC_DEV, USB_DISC_PIN,0); // ala42 + gpio_clear_pin(BOARD_USB_DP_PIN); // ala42 delay_us(200000); /* setup the apb1 clock for USB */ @@ -29,7 +32,7 @@ void setupUSB (void) { //pRCC->APB1ENR |= RCC_APB1ENR_USBEN; /* initialize the usb application */ - gpio_write_bit(USB_DISC_DEV, USB_DISC_PIN, 1); // ala42 // presents us to the host + gpio_set_pin(BOARD_USB_DP_PIN); // ala42 // presents us to the host USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, @@ -93,7 +96,7 @@ RESULT usbPowerOff(void) { void usbDsbISR(void) {}; -#include "usb_dcd_int.h" +#include void __irq_OTG_FS_IRQHandler(void) { USBD_OTG_ISR_Handler (&USB_OTG_dev); @@ -102,3 +105,5 @@ void __irq_OTG_FS_IRQHandler(void) void x__irq_usbwakeup(void) { } + +#endif diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.h b/STM32F4/cores/maple/libmaple/usbF4/usb.h index f09f2bd0c..ce1a5585f 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.h +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.h @@ -5,7 +5,7 @@ extern "C" { #endif -#include "usb_conf.h" +#include typedef enum _RESULT { diff --git a/STM32F4/cores/maple/libmaple/util.c b/STM32F4/cores/maple/libmaple/util.c index 8c03e1865..8a745e87d 100644 --- a/STM32F4/cores/maple/libmaple/util.c +++ b/STM32F4/cores/maple/libmaple/util.c @@ -128,7 +128,7 @@ void throb(void) { uint32 TOP_CNT = 0x0800; uint32 i = 0; - gpio_set_mode(ERROR_LED_PORT, ERROR_LED_PIN, GPIO_OUTPUT_PP); + gpio_set_mode(ERROR_LED_PIN, GPIO_OUTPUT_PP); /* Error fade. */ while (1) { if (CC == TOP_CNT) { @@ -143,9 +143,9 @@ void throb(void) { } if (i < CC) { - gpio_write_bit(ERROR_LED_PORT, ERROR_LED_PIN, 1); + gpio_set_pin(ERROR_LED_PIN); } else { - gpio_write_bit(ERROR_LED_PORT, ERROR_LED_PIN, 0); + gpio_clear_pin(ERROR_LED_PIN); } i++; } diff --git a/STM32F4/cores/maple/libmaple/util.h b/STM32F4/cores/maple/libmaple/util.h index 62ad8af37..c5ed2de07 100644 --- a/STM32F4/cores/maple/libmaple/util.h +++ b/STM32F4/cores/maple/libmaple/util.h @@ -29,11 +29,12 @@ * @brief Miscellaneous utility macros and procedures. */ -#include "libmaple_types.h" - #ifndef _UTIL_H_ #define _UTIL_H_ +#include "libmaple_types.h" +#include "delay.h" + #ifdef __cplusplus extern "C"{ #endif diff --git a/STM32F4/cores/maple/pwm.cpp b/STM32F4/cores/maple/pwm.cpp index 1806348c2..c5f2ccbc6 100644 --- a/STM32F4/cores/maple/pwm.cpp +++ b/STM32F4/cores/maple/pwm.cpp @@ -28,8 +28,8 @@ * @brief Arduino-style PWM implementation. */ -#include "libmaple_types.h" -#include "timer.h" +#include +#include #include "boards.h" #include "pwm.h" diff --git a/STM32F4/cores/maple/usb_serial.cpp b/STM32F4/cores/maple/usb_serial.cpp index cc726c2e2..fadcb91af 100644 --- a/STM32F4/cores/maple/usb_serial.cpp +++ b/STM32F4/cores/maple/usb_serial.cpp @@ -33,6 +33,8 @@ #include "wirish.h" #include "usb.h" +#ifdef SERIAL_USB + #define USB_TIMEOUT 50 USBSerial::USBSerial(void) { @@ -132,7 +134,7 @@ uint8 USBSerial::pending(void) { return usbGetPending(); } -uint8 USBSerial::isConnected(void) { +USBSerial::operator bool() { return usbIsConnected() && usbIsConfigured(); } @@ -153,3 +155,5 @@ void USBSerial::disableBlockingTx(void) { } USBSerial SerialUSB; + +#endif diff --git a/STM32F4/cores/maple/usb_serial.h b/STM32F4/cores/maple/usb_serial.h index a551e9d4b..8eeed966a 100644 --- a/STM32F4/cores/maple/usb_serial.h +++ b/STM32F4/cores/maple/usb_serial.h @@ -33,6 +33,8 @@ #include "Stream.h" +#ifdef SERIAL_USB + /** * @brief Virtual serial terminal. */ @@ -57,7 +59,8 @@ class USBSerial : public Stream { uint8 getRTS(); uint8 getDTR(); - uint8 isConnected(); + operator bool(); + uint8 isConnected() { return (bool) *this; } uint8 pending(); void enableBlockingTx(void); @@ -65,6 +68,14 @@ class USBSerial : public Stream { }; extern USBSerial SerialUSB; +#define Serial SerialUSB + +#else // _USB_SERIAL_H_ + +#define Serial Serial1 + +#endif // SERIAL_USB + -#endif +#endif // _USB_SERIAL_H_ diff --git a/STM32F4/cores/maple/wirish.h b/STM32F4/cores/maple/wirish.h index 4aca74c0b..945e8fb94 100644 --- a/STM32F4/cores/maple/wirish.h +++ b/STM32F4/cores/maple/wirish.h @@ -34,9 +34,9 @@ #define _WIRISH_H_ #include -#include "libmaple.h" +#include +#include -#include "wirish_types.h" #include "boards.h" #include "io.h" #include "bits.h" @@ -44,10 +44,8 @@ #include "ext_interrupts.h" #include "wirish_debug.h" #include "wirish_math.h" -#include "wirish_time.h" #include -#include "HardwareSPI.h" -#include "HardwareSerial.h" +#include #include "HardwareTimer.h" #include "usb_serial.h" @@ -55,9 +53,10 @@ #define HIGH 0x1 #define LOW 0x0 -#define true 0x1 -#define false 0x0 - +#ifndef true + #define true 0x1 + #define false 0x0 +#endif #define lowByte(w) ((w) & 0xFF) #define highByte(w) (((w) >> 8) & 0xFF) diff --git a/STM32F4/cores/maple/wirish_analog.cpp b/STM32F4/cores/maple/wirish_analog.cpp index 63b5eb2d0..4e920e7c7 100644 --- a/STM32F4/cores/maple/wirish_analog.cpp +++ b/STM32F4/cores/maple/wirish_analog.cpp @@ -28,9 +28,7 @@ * @brief Arduino-compatible ADC implementation. */ -#include "libmaple.h" #include "wirish.h" -#include "io.h" /* Assumes that the ADC has been initialized and that the pin is set * to INPUT_ANALOG */ diff --git a/STM32F4/cores/maple/wirish_constants.h b/STM32F4/cores/maple/wirish_constants.h index 06a85ae8c..f39c0777e 100644 --- a/STM32F4/cores/maple/wirish_constants.h +++ b/STM32F4/cores/maple/wirish_constants.h @@ -1,5 +1,5 @@ -#ifndef _WIRING_CONSTANTS_ -#define _WIRING_CONSTANTS_ +#ifndef _WIRISH_CONSTANTS_H_ +#define _WIRISH_CONSTANTS_H_ #ifdef __cplusplus extern "C"{ diff --git a/STM32F4/cores/maple/wirish_debug.h b/STM32F4/cores/maple/wirish_debug.h index d4c0bab4d..d7dea2391 100644 --- a/STM32F4/cores/maple/wirish_debug.h +++ b/STM32F4/cores/maple/wirish_debug.h @@ -24,6 +24,9 @@ * SOFTWARE. *****************************************************************************/ +#ifndef _WIRISH_DEBUG_H_ +#define _WIRISH_DEBUG_H_ + /** * @file wirish_debug.h * @brief High level debug port configuration @@ -50,5 +53,7 @@ static inline void disableDebugPorts(void) { * @see disableDebugPorts() */ static inline void enableDebugPorts(void) { - afio_cfg_debug_ports(AFIO_DEBUG_FULL_SWJ); + afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY); //AFIO_DEBUG_FULL_SWJ); } + +#endif diff --git a/STM32F4/cores/maple/wirish_digital.cpp b/STM32F4/cores/maple/wirish_digital.cpp index a8b3ad811..4a656199b 100644 --- a/STM32F4/cores/maple/wirish_digital.cpp +++ b/STM32F4/cores/maple/wirish_digital.cpp @@ -29,7 +29,7 @@ */ #include "wirish.h" -#include "io.h" + void pinMode(uint8 pin, WiringPinMode mode) { gpio_pin_mode outputMode; @@ -72,7 +72,7 @@ void pinMode(uint8 pin, WiringPinMode mode) { return; } - gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, outputMode); + gpio_set_mode(pin, outputMode); if (PIN_MAP[pin].timer_device != NULL) { /* Enable/disable timer channels if we're switching into or @@ -84,48 +84,51 @@ void pinMode(uint8 pin, WiringPinMode mode) { } -uint32 digitalRead(uint8 pin) { +uint32 digitalRead(uint8 pin) +{ if (pin >= BOARD_NR_GPIO_PINS) { return 0; } - return gpio_read_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit) ? + return gpio_read_pin(pin) ? HIGH : LOW; } -void digitalWrite(uint8 pin, uint8 val) { +void digitalWrite(uint8 pin, uint8 val) +{ if (pin >= BOARD_NR_GPIO_PINS) { return; } - gpio_write_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, val); + gpio_write_pin(pin, val); } -void togglePin(uint8 pin) { +void togglePin(uint8 pin) +{ if (pin >= BOARD_NR_GPIO_PINS) { return; } - gpio_toggle_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit); + gpio_toggle_pin(pin); } #define BUTTON_DEBOUNCE_DELAY 1 -uint8 isButtonPressed() { - if (digitalRead(BOARD_BUTTON_PIN)) { +uint8 isButtonPressed(uint8_t button) { + if (digitalRead(button)) { delay(BUTTON_DEBOUNCE_DELAY); - while (digitalRead(BOARD_BUTTON_PIN)) + while (digitalRead(button)) ; return true; } return false; } -uint8 waitForButtonPress(uint32 timeout) { +uint8 waitForButtonPress(uint8_t button, uint32 timeout) { uint32 start = millis(); uint32 time; if (timeout == 0) { - while (!isButtonPressed()) + while (!isButtonPressed(button)) ; return true; } @@ -136,6 +139,6 @@ uint8 waitForButtonPress(uint32 timeout) { time - start > timeout) { return false; } - } while (!isButtonPressed()); + } while (!isButtonPressed(button)); return true; } diff --git a/STM32F4/cores/maple/wirish_math.h b/STM32F4/cores/maple/wirish_math.h index a85b30ada..0b8b22260 100644 --- a/STM32F4/cores/maple/wirish_math.h +++ b/STM32F4/cores/maple/wirish_math.h @@ -29,8 +29,8 @@ * @brief Includes ; provides Arduino-compatible math routines. */ -#ifndef _WIRING_MATH_H_ -#define _WIRING_MATH_H_ +#ifndef _WIRISH_MATH_H_ +#define _WIRISH_MATH_H_ #include diff --git a/STM32F4/cores/maple/wirish_time.cpp b/STM32F4/cores/maple/wirish_time.cpp index 270da28ac..654c1a2d2 100644 --- a/STM32F4/cores/maple/wirish_time.cpp +++ b/STM32F4/cores/maple/wirish_time.cpp @@ -28,10 +28,10 @@ * @brief Delay implementation. */ -#include "libmaple.h" -#include "systick.h" +#include +#include #include "wirish_time.h" -#include "delay.h" +#include void delay(unsigned long ms) { uint32 i; diff --git a/STM32F4/cores/maple/wirish_time.h b/STM32F4/cores/maple/wirish_time.h index 20a2fbfc4..3a117863c 100644 --- a/STM32F4/cores/maple/wirish_time.h +++ b/STM32F4/cores/maple/wirish_time.h @@ -32,10 +32,9 @@ #ifndef __WIRISH_TIME_H_ #define __WIRISH_TIME_H_ -#include "libmaple.h" -#include "nvic.h" -#include "systick.h" #include "boards.h" +#include +#include #define US_PER_MS 1000 diff --git a/STM32F4/cores/maple/wirish_types.h b/STM32F4/cores/maple/wirish_types.h index a3c260a73..6a8c85c3e 100644 --- a/STM32F4/cores/maple/wirish_types.h +++ b/STM32F4/cores/maple/wirish_types.h @@ -30,14 +30,13 @@ * @brief Wirish library type definitions. */ -#include "libmaple_types.h" -#include "gpio.h" -#include "timer.h" -#include "adc.h" - #ifndef _WIRISH_TYPES_H_ #define _WIRISH_TYPES_H_ +#include +#include +#include + /** * Invalid stm32_pin_info adc_channel value. * @see stm32_pin_info @@ -48,6 +47,18 @@ * @brief Stores STM32-specific information related to a given Maple pin. * @see PIN_MAP */ +#ifdef BOARD_generic_f407v +// restructure members to build consecutive pairs +typedef struct stm32_pin_info { + const gpio_dev * gpio_device; /**< Maple pin's GPIO device */ + timer_dev * timer_device; /**< Pin's timer device, if any. */ + uint8 timer_channel; /**< Timer channel, or 0 if none. */ + uint8 adc_channel; /**< Pin ADC channel, or ADCx if none. */ + const adc_dev *adc_device; /**< ADC device, if any. */ +} stm32_pin_info; + +#else + typedef struct stm32_pin_info { gpio_dev *gpio_device; /**< Maple pin's GPIO device */ timer_dev *timer_device; /**< Pin's timer device, if any. */ @@ -58,6 +69,8 @@ typedef struct stm32_pin_info { uint8 filler; } stm32_pin_info; +#endif + /** * Variable attribute, instructs the linker to place the marked * variable in Flash instead of RAM. */ diff --git a/STM32F4/libraries/SPI/library.properties b/STM32F4/libraries/SPI/library.properties index 6f20f0185..ba3a57704 100644 --- a/STM32F4/libraries/SPI/library.properties +++ b/STM32F4/libraries/SPI/library.properties @@ -7,3 +7,4 @@ paragraph=SPI for STM32F4 category=Communication url= architectures=STM32F4 +maintainer= \ No newline at end of file diff --git a/STM32F4/libraries/SPI/src/SPI.cpp b/STM32F4/libraries/SPI/src/SPI.cpp index 08fbbd5d7..cb8f561c9 100644 --- a/STM32F4/libraries/SPI/src/SPI.cpp +++ b/STM32F4/libraries/SPI/src/SPI.cpp @@ -40,9 +40,9 @@ #include "wirish.h" #include "boards.h" -//#include "HardwareSerial.h" +#define DMA_TIMEOUT 100 -#if CYCLES_PER_MICROSECOND != 72 +#if CYCLES_PER_MICROSECOND != 168 /* TODO [0.2.0?] something smarter than this */ #warning "Unexpected clock speed; SPI frequency calculation will be incorrect" #endif @@ -91,77 +91,115 @@ static const spi_pins board_spi_pins[] __FLASH__ = { */ SPIClass::SPIClass(uint32 spi_num) { + + _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed + + switch (spi_num) { #if BOARD_NR_SPI >= 1 case 1: - this->spi_d = SPI1; + _currentSetting->spi_d = SPI1; break; #endif #if BOARD_NR_SPI >= 2 case 2: - this->spi_d = SPI2; + _currentSetting->spi_d = SPI2; break; #endif #if BOARD_NR_SPI >= 3 case 3: - this->spi_d = SPI3; + _currentSetting->spi_d = SPI3; break; #endif default: ASSERT(0); } - //pinMode(BOARD_SPI_DEFAULT_SS,OUTPUT); - - clockDivider = SPI_BAUD_PCLK_DIV_16; - dataMode = SPI_MODE0; + // Init things specific to each SPI device + // clock divider setup is a bit of hack, and needs to be improved at a later date. +/*****************************************************************************/ +// DMA / Channel / Stream +// Rx Tx +// SPI1: 2 / 3 / 0 (2) - 2 / 3 / 3 (5) +// SPI2: 1 / 0 / 3 - 1 / 0 / 4 +// SPI3: 1 / 0 / 0 (2) - 1 / 0 / 5 (7) +/*****************************************************************************/ + _settings[0].spi_d = SPI1; + _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); +#ifdef SPI_DMA + _settings[0].spiDmaDev = DMA2; + _settings[0].spiDmaChannel = DMA_CH3; + _settings[0].spiRxDmaStream = DMA_STREAM0; // alternative: DMA_STREAM2 + _settings[0].spiTxDmaStream = DMA_STREAM3; // alternative: DMA_STREAM5 +#endif + _settings[1].spi_d = SPI2; + _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); +#ifdef SPI_DMA + _settings[1].spiDmaDev = DMA1; + _settings[1].spiDmaChannel = DMA_CH0; + _settings[1].spiRxDmaStream = DMA_STREAM3; // alternative: - + _settings[1].spiTxDmaStream = DMA_STREAM4; // alternative: - +#endif +#if BOARD_NR_SPI >= 3 + _settings[2].spi_d = SPI3; + _settings[2].clockDivider = determine_baud_rate(_settings[2].spi_d, _settings[2].clock); +#ifdef SPI_DMA + _settings[2].spiDmaDev = DMA1; + _settings[2].spiDmaChannel = DMA_CH0; + _settings[2].spiRxDmaStream = DMA_STREAM0; // alternative: DMA_STREAM2 + _settings[2].spiTxDmaStream = DMA_STREAM5; // alternative: DMA_STREAM7 +#endif +#endif + } /* * Set up/tear down */ - -void SPIClass::begin(void) { - - uint32 flags = ((bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE | SPI_SOFT_SS); - spi_init(spi_d); - configure_gpios(spi_d, 1); +void SPIClass::updateSettings(void) { + uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE | SPI_SOFT_SS); #ifdef SPI_DEBUG - Serial.print("spi_master_enable("); Serial.print(clockDivider); Serial.print(","); Serial.print(dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif - spi_master_enable(spi_d, (spi_baud_rate)clockDivider, (spi_mode)dataMode, flags); + spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags); +} + +void SPIClass::begin(void) { + spi_init(_currentSetting->spi_d); + configure_gpios(_currentSetting->spi_d, 1); + updateSettings(); +#ifdef SPI_USE_DMA_BUFFER + dmaSendBufferInit(); +#endif +//Serial.println("SPI class begin - end"); } void SPIClass::beginSlave(void) { - if (dataMode >= 4) { - ASSERT(0); - return; - } - uint32 flags = ((bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE); - spi_init(spi_d); - configure_gpios(spi_d, 0); + spi_init(_currentSetting->spi_d); + configure_gpios(_currentSetting->spi_d, 0); + uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_RX_ONLY); #ifdef SPI_DEBUG - Serial.print("spi_slave_enable("); Serial.print(dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + Serial.print("spi_slave_enable("); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif - spi_slave_enable(spi_d, (spi_mode)dataMode, flags); + spi_slave_enable(_currentSetting->spi_d, (spi_mode)_currentSetting->dataMode, flags); } void SPIClass::end(void) { - if (!spi_is_enabled(this->spi_d)) { + if (!spi_is_enabled(_currentSetting->spi_d)) { return; } // Follows RM0008's sequence for disabling a SPI in master/slave // full duplex mode. - while (spi_is_rx_nonempty(this->spi_d)) { + while (spi_is_rx_nonempty(_currentSetting->spi_d)) { // FIXME [0.1.0] remove this once you have an interrupt based driver - volatile uint16 rx __attribute__((unused)) = spi_rx_reg(this->spi_d); + volatile uint16 rx __attribute__((unused)) = spi_rx_reg(_currentSetting->spi_d); } - while (!spi_is_tx_empty(this->spi_d)) + while (!spi_is_tx_empty(_currentSetting->spi_d)) ; - while (spi_is_busy(this->spi_d)) + while (spi_is_busy(_currentSetting->spi_d)) ; - spi_peripheral_disable(this->spi_d); + spi_peripheral_disable(_currentSetting->spi_d); } /* Roger Clark added 3 functions */ @@ -170,8 +208,9 @@ void SPIClass::setClockDivider(uint32_t clockDivider) #ifdef SPI_DEBUG Serial.print("Clock divider set to "); Serial.println(clockDivider); #endif - this->clockDivider = clockDivider; - this->begin(); + _currentSetting->clockDivider = clockDivider; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_BR); + _currentSetting->spi_d->regs->CR1 = cr1 | (clockDivider & SPI_CR1_BR); } void SPIClass::setBitOrder(BitOrder bitOrder) @@ -179,8 +218,10 @@ void SPIClass::setBitOrder(BitOrder bitOrder) #ifdef SPI_DEBUG Serial.print("Bit order set to "); Serial.println(bitOrder); #endif - this->bitOrder = bitOrder; - this->begin(); + _currentSetting->bitOrder = bitOrder; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_LSBFIRST); + if ( bitOrder==LSBFIRST ) cr1 |= SPI_CR1_LSBFIRST; + _currentSetting->spi_d->regs->CR1 = cr1; } /* Victor Perez. Added to test changing datasize from 8 to 16 bit modes on the fly. @@ -189,11 +230,11 @@ void SPIClass::setBitOrder(BitOrder bitOrder) */ void SPIClass::setDataSize(uint32 datasize) { - uint32 cr1 = this->spi_d->regs->CR1; - datasize &= SPI_CR1_DFF; - cr1 &= ~(SPI_CR1_DFF); - cr1 |= datasize; - this->spi_d->regs->CR1 = cr1; + _currentSetting->dataSize = datasize; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF); + uint8 en = spi_is_enabled(_currentSetting->spi_d); + spi_peripheral_disable(_currentSetting->spi_d); + _currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF) | en; } void SPIClass::setDataMode(uint8_t dataMode) @@ -212,13 +253,11 @@ SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge On the STM32 it appears to be bit 1 - CPOL : Clock polarity - (This bit should not be changed when communication is ongoing) 0 : CLK to 0 when idle 1 : CLK to 1 when idle bit 0 - CPHA : Clock phase - (This bit should not be changed when communication is ongoing) 0 : The first clock transition is the first data capture edge 1 : The second clock transition is the first data capture edge @@ -228,44 +267,32 @@ If someone finds this is not the case or sees a logic error with this let me kno #ifdef SPI_DEBUG Serial.print("Data mode set to "); Serial.println(dataMode); #endif - this->dataMode = dataMode; - this->begin(); -} - + _currentSetting->dataMode = dataMode; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA); + _currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA)); +} void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) { #ifdef SPI_DEBUG Serial.println("SPIClass::beginTransaction"); #endif - //_SSPin=pin; - //pinMode(_SSPin,OUTPUT); - //digitalWrite(_SSPin,LOW); setBitOrder(settings.bitOrder); setDataMode(settings.dataMode); - setClockDivider(determine_baud_rate(spi_d, settings.clock)); + setDataSize(settings.dataSize); + setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); begin(); -#if 0 -// code from SAM core - uint8_t mode = interruptMode; - if (mode > 0) { - if (mode < 16) { - if (mode & 1) PIOA->PIO_IDR = interruptMask[0]; - if (mode & 2) PIOB->PIO_IDR = interruptMask[1]; - if (mode & 4) PIOC->PIO_IDR = interruptMask[2]; - if (mode & 8) PIOD->PIO_IDR = interruptMask[3]; - } else { - interruptSave = interruptsStatus(); - noInterrupts(); - } - } - uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL(pin); - bitOrder[ch] = settings.border; - SPI_ConfigureNPCS(spi, ch, settings.config); - //setBitOrder(pin, settings.border); - //setDataMode(pin, settings.datamode); - //setClockDivider(pin, settings.clockdiv); -#endif +} + +void SPIClass::beginTransactionSlave(SPISettings settings) +{ + #ifdef SPI_DEBUG + Serial.println(F("SPIClass::beginTransactionSlave")); + #endif + setBitOrder(settings.bitOrder); + setDataMode(settings.dataMode); + setDataSize(settings.dataSize); + beginSlave(); } void SPIClass::endTransaction(void) @@ -295,131 +322,154 @@ void SPIClass::endTransaction(void) * I/O */ -uint8 SPIClass::read(void) { - uint8 buf[1]; - this->read(buf, 1); - return buf[0]; +uint16 SPIClass::read(void) +{ + while ( spi_is_rx_nonempty(_currentSetting->spi_d)==0 ) ; + return (uint16)spi_rx_reg(_currentSetting->spi_d); } -void SPIClass::read(uint8 *buf, uint32 len) { - uint32 rxed = 0; - while (rxed < len) { - while (!spi_is_rx_nonempty(this->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(this->spi_d); - } +void SPIClass::read(uint8 *buf, uint32 len) +{ + if ( len == 0 ) return; + spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. + spi_reg_map * regs = _currentSetting->spi_d->regs; + // start sequence: write byte 0 + regs->DR = 0x00FF; // write the first byte + // main loop + while ( (--len) ) { + while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag + noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data + regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register + *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. + interrupts(); // let systick do its job + } + // read remaining last byte + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register + *buf++ = (uint8)(regs->DR); // read and store the received byte } -void SPIClass::write(uint16 data) { - #ifdef SPI_DEBUG -// Serial.print("SPIClass::write("); Serial.print(data); Serial.println(")"); - #endif - // this->write(&data, 1); - +void SPIClass::write(uint16 data) +{ /* Added for 16bit data Victor Perez. Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) - * The original method, of calling write(*data, length) . + * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, + * by taking the Tx code from transfer(byte) * This almost doubles the speed of this function. */ - - spi_tx_reg(this->spi_d, data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_reg(_currentSetting->spi_d, data); // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } -//void SPIClass::write(uint8 byte) { - // this->write(&byte, 1); +void SPIClass::write(uint16 data, uint32 n) +{ + // Added by stevstrong: Repeatedly send same data by the specified number of times + spi_reg_map * regs = _currentSetting->spi_d->regs; + while ( (n--)>0 ) { + regs->DR = data; // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + while ( (regs->SR & SPI_SR_TXE)==0 ) ; // wait till Tx empty + } + while ( (regs->SR & SPI_SR_BSY) != 0); // wait until BSY=0 before returning +} - /* Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) - * The original method, of calling write(*data, length) . - * This almost doubles the speed of this function. - */ - -// spi_tx_reg(this->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." -// while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." -// while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." -//} +void SPIClass::write(void *data, uint32 length) +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_tx(spi_d, (void*)data, length); // data can be array of bytes or words + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." +} -void SPIClass::write(const uint8 *data, uint32 length) { - #ifdef SPI_DEBUG - Serial.print("SPIClass::write(data, "); Serial.print(length); Serial.println(")"); - #endif - uint32 txed = 0; - while (txed < length) { - txed += spi_tx(this->spi_d, data + txed, length - txed); - } - while (spi_is_tx_empty(this->spi_d) == 0); // "4. After writing the last data item into the SPI_DR register, wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... then wait until BSY=0, this indicates that the transmission of the last data is complete." +uint8 SPIClass::transfer(uint8 byte) const +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, byte); // Write the data item to be transmitted into the SPI_DR register + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint8)spi_rx_reg(spi_d); // "... and read the last received data." } -uint8 SPIClass::transfer(uint8 byte) const { - #ifdef SPI_DEBUG -// Serial.print("SPIClass::transfer("); Serial.print(byte); Serial.println(")"); - #endif - uint8 b; - spi_tx_reg(this->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return b; +uint16_t SPIClass::transfer16(uint16_t wr_data) const +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint16)spi_rx_reg(spi_d); // "... and read the last received data." } + +#ifdef SPI_DMA /* Roger Clark and Victor Perez, 2015 * Performs a DMA SPI transfer with at least a receive buffer. -* If a TX buffer is not provided, FF is sent over and over for the lenght of the transfer. -* On exit TX buffer is not modified, and RX buffer cotains the received data. +* If a TX buffer is not provided, FF is sent over and over for the length of the transfer. +* On exit TX buffer is not modified, and RX buffer contains the received data. * Still in progress. */ -uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length) { +uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length) +{ if (length == 0) return 0; - uint8 b; - if (spi_is_rx_nonempty(this->spi_d) == 1) b = spi_rx_reg(this->spi_d); //Clear the RX buffer in case a byte is waiting on it. - dma1_ch3_Active=true; - dma_init(DMA1); - dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - + + uint8 b = 0; + + dma_init(_currentSetting->spiDmaDev); +// dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); // RX - spi_rx_dma_enable(SPI1); - dma_setup_transfer(DMA1, DMA_CH2, &SPI1->regs->DR, DMA_SIZE_8BITS, - receiveBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA - dma_set_num_transfers(DMA1, DMA_CH2, length); - + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==SPI_DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer( _currentSetting->spiDmaDev, + _currentSetting->spiRxDmaStream, + _currentSetting->spiDmaChannel, + dma_bit_size, + &_currentSetting->spi_d->regs->DR, // peripheral address + receiveBuf, // memory bank 0 address + NULL, // memory bank 1 address + (DMA_MINC_MODE | DMA_FROM_PER | DMA_PRIO_VERY_HIGH) // flags + ); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream, length); + dma_set_fifo_flags(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream, 0); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream); + // TX - spi_tx_dma_enable(SPI1); - if (!transmitBuf) { - static uint8_t ff = 0XFF; - transmitBuf = &ff; - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, (DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit FF repeatedly + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM); // | DMA_TRNS_CMPLT); + if ( transmitBuf==0 ) { + static uint8_t ff = 0XFF; + transmitBuf = &ff; + flags &= ~((uint32)DMA_MINC_MODE); // remove increment mode } - else { - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit buffer DMA - } - dma_set_num_transfers(DMA1, DMA_CH3, length); - - dma_enable(DMA1, DMA_CH2);// enable receive - dma_enable(DMA1, DMA_CH3);// enable transmit + dma_setup_transfer( _currentSetting->spiDmaDev, + _currentSetting->spiTxDmaStream, + _currentSetting->spiDmaChannel, + dma_bit_size, + &_currentSetting->spi_d->regs->DR, // peripheral address + transmitBuf, // memory bank 0 address + NULL, // memory bank 1 address + flags + ); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, length); + dma_set_fifo_flags(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, 0); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); + // software enable sequence, see AN4031, chapter 4.3 + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream);// enable receive + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream);// enable transmit + spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. + spi_rx_dma_enable(_currentSetting->spi_d); + spi_tx_dma_enable(_currentSetting->spi_d); // must be the last enable to avoid DMA error flag -// while (dma1_ch3_Active); -// if (receiveBuf) { uint32_t m = millis(); - while (dma1_ch3_Active) { - if ((millis() - m) > 100) { - dma1_ch3_Active = 0; - b = 2; - break; - } + while ((b = dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set + if ( b&(DMA_ISR_TEIF|DMA_ISR_DMEIF|DMA_ISR_FEIF) ) { b = 1; break; } // break on any error flag + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - -// } - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(DMA1, DMA_CH3); - dma_disable(DMA1, DMA_CH2); - spi_rx_dma_disable(SPI1); - spi_tx_dma_disable(SPI1); + if (b & DMA_ISR_TCIF) b = 0; + + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + // software disable sequence, see AN4031, chapter 4.1 + spi_tx_dma_disable(_currentSetting->spi_d); + spi_rx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); return b; } @@ -427,56 +477,45 @@ uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length * Performs a DMA SPI send using a TX buffer. * On exit TX buffer is not modified. * Still in progress. +* 2016 - stevstrong - reworked to automatically detect bit size from SPI setting */ -uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { +uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) +{ if (length == 0) return 0; - uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - uint8 b; - dma1_ch3_Active=true; - dma_init(DMA1); - dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - + uint8 b = 0; + dma_init(_currentSetting->spiDmaDev); // TX - spi_tx_dma_enable(SPI1); - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, flags);// Transmit buffer DMA - dma_set_num_transfers(DMA1, DMA_CH3, length); - dma_enable(DMA1, DMA_CH3);// enable transmit - - while (dma1_ch3_Active); - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(DMA1, DMA_CH3); - spi_tx_dma_disable(SPI1); - return b; -} - -uint8 SPIClass::dmaSend(uint16 *transmitBuf, uint16 length, bool minc) { - if (length == 0) return 0; - uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - uint8 b; - dma1_ch3_Active=true; - dma_init(DMA1); - dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==SPI_DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer( _currentSetting->spiDmaDev, + _currentSetting->spiTxDmaStream, + _currentSetting->spiDmaChannel, + dma_bit_size, + &_currentSetting->spi_d->regs->DR, // peripheral address + transmitBuf, // memory bank 0 address + NULL, // memory bank 1 address + ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM ) //| DMA_TRNS_CMPLT ) // flags + );// Transmit buffer DMA + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, length); + dma_set_fifo_flags(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, 0); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream);// enable transmit + spi_tx_dma_enable(_currentSetting->spi_d); + + uint32_t m = millis(); + while ((b = dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set + if ( b&(DMA_ISR_TEIF|DMA_ISR_DMEIF|DMA_ISR_FEIF) ) { b = 1; break; } // break on any error flag + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } + if (b & DMA_ISR_TCIF) b = 0; - // TX - spi_tx_dma_enable(SPI1); - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_16BITS, - transmitBuf, DMA_SIZE_16BITS, flags);// Transmit buffer DMA - dma_set_num_transfers(DMA1, DMA_CH3, length); - dma_enable(DMA1, DMA_CH3);// enable transmit - - while (dma1_ch3_Active); - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(DMA1, DMA_CH3); - spi_tx_dma_disable(SPI1); - return b; + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); + return b; } +#endif + void SPIClass::attachInterrupt(void) { @@ -492,19 +531,19 @@ void SPIClass::detachInterrupt(void) { */ uint8 SPIClass::misoPin(void) { - return dev_to_spi_pins(this->spi_d)->miso; + return dev_to_spi_pins(_currentSetting->spi_d)->miso; } uint8 SPIClass::mosiPin(void) { - return dev_to_spi_pins(this->spi_d)->mosi; + return dev_to_spi_pins(_currentSetting->spi_d)->mosi; } uint8 SPIClass::sckPin(void) { - return dev_to_spi_pins(this->spi_d)->sck; + return dev_to_spi_pins(_currentSetting->spi_d)->sck; } uint8 SPIClass::nssPin(void) { - return dev_to_spi_pins(this->spi_d)->nss; + return dev_to_spi_pins(_currentSetting->spi_d)->nss; } /* @@ -512,18 +551,13 @@ uint8 SPIClass::nssPin(void) { */ uint8 SPIClass::send(uint8 data) { - uint8 buf[] = {data}; - return this->send(buf, 1); + this->write(data); + return 1; } uint8 SPIClass::send(uint8 *buf, uint32 len) { - uint32 txed = 0; - uint8 ret = 0; - while (txed < len) { - this->write(buf[txed++]); - ret = this->read(); - } - return ret; + this->write(buf, len); + return len; } uint8 SPIClass::recv(void) { @@ -585,29 +619,26 @@ static void configure_gpios(spi_dev *dev, bool as_master) { if(dev->clk_id <= RCC_SPI2) { if(nssi) { if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 5); + gpio_set_af_mode(pins->nss, 5); } } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 5); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 5); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 5); + gpio_set_af_mode(pins->sck, 5); + gpio_set_af_mode(pins->miso, 5); + gpio_set_af_mode(pins->mosi, 5); } else { if(nssi) { if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 6); + gpio_set_af_mode(pins->nss, 6); } } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 6); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 6); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 6); + gpio_set_af_mode(pins->sck, 6); + gpio_set_af_mode(pins->miso, 6); + gpio_set_af_mode(pins->mosi, 6); } #endif - spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, - scki->gpio_device, scki->gpio_bit, - misoi->gpio_device, misoi->gpio_bit, - mosii->gpio_device, mosii->gpio_bit); + spi_config_gpios(dev, as_master, pins->nss, pins->sck, pins->miso, pins->mosi); } static const spi_baud_rate baud_rates[8] __FLASH__ = { @@ -634,6 +665,8 @@ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { { case RCC_APB2: clock = STM32_PCLK2; break; // 72 Mhz case RCC_APB1: clock = STM32_PCLK1; break; // 36 Mhz + case RCC_AHB1: break; + default: break; } clock /= 2; i = 0; @@ -646,4 +679,3 @@ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { //SPIClass SPI(3); - diff --git a/STM32F4/libraries/SPI/src/SPI.h b/STM32F4/libraries/SPI/src/SPI.h index 490d58b2e..218449fb1 100644 --- a/STM32F4/libraries/SPI/src/SPI.h +++ b/STM32F4/libraries/SPI/src/SPI.h @@ -34,18 +34,15 @@ /* TODO [0.1.0] Remove deprecated methods. */ - -#ifndef _SPI_H_INCLUDED -#define _SPI_H_INCLUDED +#ifndef _LIB_SPI_H_ +#define _LIB_SPI_H_ #include #include #include - -#include -#include #include + // SPI_HAS_TRANSACTION means SPI has // - beginTransaction() // - endTransaction() @@ -96,34 +93,61 @@ #define SPI_MODE2 SPI_MODE_2 #define SPI_MODE3 SPI_MODE_3 +#define SPI_DATA_SIZE_8BIT SPI_CR1_DFF_8_BIT +#define SPI_DATA_SIZE_16BIT SPI_CR1_DFF_16_BIT + class SPISettings { public: SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, dataMode); + init_AlwaysInline(clock, bitOrder, dataMode, SPI_DATA_SIZE_8BIT); + } else { + init_MightInline(clock, bitOrder, dataMode, SPI_DATA_SIZE_8BIT); + } + } + SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) { + if (__builtin_constant_p(clock)) { + init_AlwaysInline(clock, bitOrder, dataMode, dataSize); } else { - init_MightInline(clock, bitOrder, dataMode); + init_MightInline(clock, bitOrder, dataMode, dataSize); } } - SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } + SPISettings(uint32_t clock) { + if (__builtin_constant_p(clock)) { + init_AlwaysInline(clock, MSBFIRST, SPI_MODE0, SPI_DATA_SIZE_8BIT); + } else { + init_MightInline(clock, MSBFIRST, SPI_MODE0, SPI_DATA_SIZE_8BIT); + } + } + SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, SPI_DATA_SIZE_8BIT); } private: - void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { - init_AlwaysInline(clock, bitOrder, dataMode); + void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) { + init_AlwaysInline(clock, bitOrder, dataMode, dataSize); } - void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) __attribute__((__always_inline__)) { + void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) __attribute__((__always_inline__)) { this->clock = clock; this->bitOrder = bitOrder; this->dataMode = dataMode; + this->dataSize = dataSize; } uint32_t clock; BitOrder bitOrder; uint8_t dataMode; + uint32_t dataSize; + + spi_dev *spi_d; + uint32_t clockDivider; + +#ifdef SPI_DMA + dma_dev* spiDmaDev; + dma_channel spiDmaChannel; + dma_stream spiRxDmaStream, spiTxDmaStream; +#endif + friend class SPIClass; }; -volatile static bool dma1_ch3_Active; - /** * @brief Wirish SPI interface. * @@ -133,18 +157,11 @@ volatile static bool dma1_ch3_Active; class SPIClass { public: - - /** * @param spiPortNumber Number of the SPI port to manage. */ SPIClass(uint32 spiPortNumber); - /* - * Set up/tear down - */ - - /** * @brief Equivalent to begin(SPI_1_125MHZ, MSBFIRST, 0). @@ -175,6 +192,8 @@ class SPIClass { void beginTransaction(uint8_t pin, SPISettings settings); void endTransaction(void); + void beginTransactionSlave(SPISettings settings); + void setClockDivider(uint32_t clockDivider); void setBitOrder(BitOrder bitOrder); void setDataMode(uint8_t dataMode); @@ -195,40 +214,40 @@ class SPIClass { */ /** - * @brief Return the next unread byte. + * @brief Return the next unread byte/word. * - * If there is no unread byte waiting, this function will block + * If there is no unread byte/word waiting, this function will block * until one is received. */ - uint8 read(void); + uint16 read(void); /** * @brief Read length bytes, storing them into buffer. * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This + * @param length Number of bytes to store in buffer. This * function will block until the desired number of * bytes have been read. */ void read(uint8 *buffer, uint32 length); /** - * @brief Transmit a byte. - * @param data Byte to transmit. + * @brief Transmit one byte/word. + * @param data to transmit. */ -// void write(uint8 data); - + void write(uint16 data); + /** - * @brief Transmit a half word. + * @brief Transmit one byte/word a specified number of times. * @param data to transmit. */ - void write(uint16 data); + void write(uint16 data, uint32 n); /** - * @brief Transmit multiple bytes. - * @param buffer Bytes to transmit. - * @param length Number of bytes in buffer to transmit. + * @brief Transmit multiple bytes/words. + * @param buffer Bytes/words to transmit. + * @param length Number of bytes/words in buffer to transmit. */ - void write(const uint8 *buffer, uint32 length); + void write(void * buffer, uint32 length); /** * @brief Transmit a byte, then return the next unread byte. @@ -239,9 +258,12 @@ class SPIClass { * @return Next unread byte. */ uint8 transfer(uint8 data) const; + uint16_t transfer16(uint16_t data) const; +#ifdef SPI_DMA /** * @brief Sets up a DMA Transfer for "length" bytes. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * * This function transmits and receives to buffers. * @@ -249,30 +271,19 @@ class SPIClass { * @param receiveBuf buffer Bytes to save received data. * @param length Number of bytes in buffer to transmit. */ - uint8 dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length); + uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); /** - * @brief Sets up a DMA Transmit for bytes. - * - * This function transmits and does not care about the RX fifo. + * @brief Sets up a DMA Transmit for SPI 8 or 16 bit transfer mode. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * - * @param transmitBuf buffer Bytes to transmit, - * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode, clear to use Circular mode. - */ - uint8 dmaSend(uint8 *transmitBuf, uint16 length, bool minc = 1); - - /** - * @brief Sets up a DMA Transmit for half words. - * SPI PERFIPHERAL MUST BE SET TO 16 BIT MODE BEFORE - * - * This function transmits and does not care about the RX fifo. + * This function only transmits and does not care about the RX fifo. * * @param data buffer half words to transmit, * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode (default if blank), clear to use Circular mode. */ - uint8 dmaSend(uint16 *transmitBuf, uint16 length, bool minc = 1); + uint8 dmaSend(void * transmitBuf, uint16 length, bool minc = 1); +#endif /* * Pin accessors @@ -304,7 +315,24 @@ class SPIClass { * @brief Get a pointer to the underlying libmaple spi_dev for * this HardwareSPI instance. */ - spi_dev* c_dev(void) { return this->spi_d; } + spi_dev* c_dev(void) { return _currentSetting->spi_d; } + + + spi_dev *dev(){ return _currentSetting->spi_d;} + + /** + * @brief Sets the number of the SPI peripheral to be used by + * this HardwareSPI instance. + * + * @param spi_num Number of the SPI port. 1-2 in low density devices + * or 1-3 in high density devices. + */ + + void setModule(int spi_num) + { + _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed + } + /* -- The following methods are deprecated --------------------------- */ @@ -338,26 +366,13 @@ class SPIClass { */ uint8 recv(void); - spi_dev *dev(){ return spi_d;} - - - private: - - static inline void DMA1_CH3_Event() { - dma1_ch3_Active = 0; -// dma_disable(DMA1, DMA_CH3); -// dma_disable(DMA1, DMA_CH2); - - // To Do. Need to wait for - } - spi_dev *spi_d; - uint8_t _SSPin; - uint32_t clockDivider; - uint8_t dataMode; - BitOrder bitOrder; + SPISettings _settings[BOARD_NR_SPI]; + SPISettings *_currentSetting; + + void updateSettings(void); }; +extern SPIClass SPI; // needed bx SdFat(EX) lib -extern SPIClass SPI;//(1);// dummy params #endif diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index 99ae55549..2bb1946b0 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -8,17 +8,15 @@ version=0.1.0 # compiler variables # ---------------------- -#build.gcc_ver=gcc-arm-none-eabi-4.8.3-2014q1 - compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g -Os -Wall -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ compiler.c.elf.flags=-Os -Wl,--gc-sections compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g -Os -Wall -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy @@ -30,6 +28,8 @@ compiler.size.cmd=arm-none-eabi-size compiler.define=-DARDUINO= # this can be overriden in boards.txt +build.f_cpu=168000000L +build.mcu=cortex-m4 build.cpu_flags= build.hs_flag= build.common_flags=-mthumb -D__STM32F4__ @@ -44,12 +44,10 @@ compiler.ar.extra_flags= compiler.elf2hex.extra_flags= +##compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" +#compiler.libs.c.flags="-I{build.core.path}" "-I{build.core.path}/libmaple" "-I{build.core.path}/libmaple/usbF4" "-I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Core/inc" "-I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc" "-I{build.core.path}/libmaple/usbF4/STM32_USB_OTG_Driver/inc" "-I{build.core.path}/libmaple/usbF4/VCP" +compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.core.path}/libmaple/usbF4" -##compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/stm32f1/include/series" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" -#compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" - - -compiler.libs.c.flags="-I{build.core.path}/libmaple" -I{build.core.path}/libmaple/usbF4 -I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Core/inc -I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc -I{build.core.path}/libmaple/usbF4/STM32_USB_OTG_Driver/inc -I{build.core.path}/libmaple/usbF4/VCP @@ -66,14 +64,13 @@ compiler.libs.c.flags="-I{build.core.path}/libmaple" -I{build.core.path}/libmapl # --------------------- ## Compile c files -recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" +recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {build.cpu_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" ## Compile c++ files recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {build.cpu_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" ## Compile S files recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.S.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {build.cpu_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" -#recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" "{source_file}" -o "{object_file}" ## Create archives recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}" @@ -92,7 +89,6 @@ recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf ## Compute size recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf" -#recipe.size.regex=\.text\s+([0-9]+).* recipe.size.regex=^(?:\.text|\.rodata|\.ARM.exidx)\s+([0-9]+).* recipe.size.regex.data=^(?:\.data|\.bss|\.noinit)\s+([0-9]+).* diff --git a/STM32F4/cores/maple/libmaple/gpio.c b/STM32F4/system/libmaple/Arduino.h similarity index 79% rename from STM32F4/cores/maple/libmaple/gpio.c rename to STM32F4/system/libmaple/Arduino.h index 3792220e3..cef8f089f 100644 --- a/STM32F4/cores/maple/libmaple/gpio.c +++ b/STM32F4/system/libmaple/Arduino.h @@ -1,7 +1,7 @@ /****************************************************************************** * The MIT License * - * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2010 LeafLabs LLC. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -24,13 +24,23 @@ * SOFTWARE. *****************************************************************************/ -/** - * @file gpio.c - * @brief GPIO initialization routine - */ +#ifndef _WIRISH_ARDUINO_H_ +#define _WIRISH_ARDUINO_H_ -// #ifdef STM32F2 -// #include "gpioF2.c" -// #else -// #include "gpioF1.c" -// #endif +//#warning Include Arduino.h from system\libmaple + +#include "wirish.h" + +void setup(); +void loop(); +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus +void yield(void); +#ifdef __cplusplus +} +#endif // __cplusplus + +#include "variant.h" + +#endif diff --git a/STM32F4/variants/generic_f407v/generic_f407v.cpp b/STM32F4/variants/generic_f407v/generic_f407v.cpp new file mode 100644 index 000000000..c51ff9b55 --- /dev/null +++ b/STM32F4/variants/generic_f407v/generic_f407v.cpp @@ -0,0 +1,81 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file generic_f407v.cpp + * @author ala42 + * @brief generic_f407v board file. + */ + +#ifdef BOARD_generic_f407v + +#include "generic_f407v.h" + +#include "wirish_types.h" + +//static void initSRAMChip(void); +/*****************************************************************************/ +// Alternate functions, see DocID022152 Rev 8, Table 9. +/*****************************************************************************/ +void boardInit(void) { +/* // remap TIMER8 to PC6-9 + gpio_set_af_mode(GPIOC, 6, 3); + gpio_set_af_mode(GPIOC, 7, 3); + gpio_set_af_mode(GPIOC, 8, 3); + gpio_set_af_mode(GPIOC, 9, 3); + + // remap TIMER1 to PE9,11,13,14 + gpio_set_af_mode(GPIOE, 9, 1); + gpio_set_af_mode(GPIOE, 11, 1); + gpio_set_af_mode(GPIOE, 13, 1); + gpio_set_af_mode(GPIOE, 14, 1); + + // remap TIMER3 to PB4,5,0,1 + gpio_set_af_mode(GPIOB, 4, 2); + gpio_set_af_mode(GPIOB, 5, 2); + gpio_set_af_mode(GPIOB, 0, 2); + gpio_set_af_mode(GPIOB, 1, 2); + + //gpio_set_af_mode(GPIOA, 2, 7); + //gpio_set_af_mode(GPIOA, 3, 7); +*/ + return; +} + +/* +static void initSRAMChip(void) { + fsmc_nor_psram_reg_map *regs = FSMC_NOR_PSRAM1_BASE; + + fsmc_sram_init_gpios(); + rcc_clk_enable(RCC_FSMC); + + regs->BCR = (FSMC_BCR_WREN | FSMC_BCR_MWID_16BITS | FSMC_BCR_MTYP_SRAM | + FSMC_BCR_MBKEN); + fsmc_nor_psram_set_addset(regs, 0); + fsmc_nor_psram_set_datast(regs, 3); +} +*/ +#endif diff --git a/STM32F4/variants/generic_f407v/generic_f407v.h b/STM32F4/variants/generic_f407v/generic_f407v.h new file mode 100644 index 000000000..927f9cd9c --- /dev/null +++ b/STM32F4/variants/generic_f407v/generic_f407v.h @@ -0,0 +1,163 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file generic_f407v.h + * @author Marti Bolivar + * @brief Private include file for Maple Native in boards.h + * + * See maple.h for more information on these definitions. + */ + +#ifndef _BOARD_GENERIC_F407V_H_ +#define _BOARD_GENERIC_F407V_H_ + +#define Port2Pin(port, bit) ((port-'A')*16+bit) + +#define CYCLES_PER_MICROSECOND 168 + + +#undef STM32_PCLK1 +#undef STM32_PCLK2 +#define STM32_PCLK1 (CYCLES_PER_MICROSECOND*1000000/4) +#define STM32_PCLK2 (CYCLES_PER_MICROSECOND*1000000/2) + +#define SYSTICK_RELOAD_VAL (CYCLES_PER_MICROSECOND*1000-1) + +/*****************************************************************************/ +// Board pin definitions +#define BOARD_USB_DM_PIN PA11 +#define BOARD_USB_DP_PIN PA12 + +#define BOARD_LED_PIN PA6 //Port2Pin('A', 6) +#define BOARD_LED2_PIN PA7 //Port2Pin('A', 7) +#define BOARD_BUTTON1_PIN PA0 //Port2Pin('A', 0) +#define BOARD_BUTTON2_PIN PE4 //Port2Pin('E', 4) +#define BOARD_BUTTON3_PIN PE3 //Port2Pin('E', 3) + +#define BOARD_NR_USARTS 5 +#define BOARD_USART1_TX_PIN PA9 //Port2Pin('A', 9) +#define BOARD_USART1_RX_PIN PA10 //Port2Pin('A',10) +#define BOARD_USART2_TX_PIN PA2 //Port2Pin('A', 2) +#define BOARD_USART2_RX_PIN PA3 //Port2Pin('A', 3) +#define BOARD_USART3_TX_PIN PB10 //Port2Pin('B',10) +#define BOARD_USART3_RX_PIN PB11 //Port2Pin('B',11) +#define BOARD_UART4_TX_PIN PA0 //Port2Pin('A', 0) +#define BOARD_UART4_RX_PIN PA1 //Port2Pin('A', 1) +#define BOARD_UART5_TX_PIN PC12 //Port2Pin('C',12) +#define BOARD_UART5_RX_PIN PD2 //Port2Pin('D', 2) + +#define BOARD_NR_SPI 3 +#define BOARD_SPI1_NSS_PIN PA4 //Port2Pin('A', 4) +#define BOARD_SPI1_SCK_PIN PA5 //Port2Pin('A', 5) +#define BOARD_SPI1_MISO_PIN PA6 //Port2Pin('A', 6) +#define BOARD_SPI1_MOSI_PIN PA7 //Port2Pin('A', 7) +#define BOARD_SPI1A_NSS_PIN PA15 //Port2Pin('A',15) +#define BOARD_SPI1A_SCK_PIN PB3 //Port2Pin('B', 3) +#define BOARD_SPI1A_MISO_PIN PB4 //Port2Pin('B', 4) +#define BOARD_SPI1A_MOSI_PIN PB5 //Port2Pin('B', 5) + +#define BOARD_SPI2_NSS_PIN PB12 //Port2Pin('B',12) +#define BOARD_SPI2_SCK_PIN PB13 //Port2Pin('B',13) +#define BOARD_SPI2_MISO_PIN PB14 //Port2Pin('B',14) +#define BOARD_SPI2_MOSI_PIN PB15 //Port2Pin('B',15) +#define BOARD_SPI2A_NSS_PIN PB9 //Port2Pin('B', 9) +#define BOARD_SPI2A_SCK_PIN PB10 //Port2Pin('B',10) +#define BOARD_SPI2A_MISO_PIN PC2 //Port2Pin('C', 2) +#define BOARD_SPI2A_MOSI_PIN pc3 //Port2Pin('C', 3) + +#define BOARD_SPI3_NSS_PIN PA15 //Port2Pin('A',15) +#define BOARD_SPI3_SCK_PIN PB3 //Port2Pin('B', 3) +#define BOARD_SPI3_MISO_PIN PB4 //Port2Pin('B', 4) +#define BOARD_SPI3_MOSI_PIN PB5 //Port2Pin('B', 5) +/* overlap with the SDIO interface for SD card +#define BOARD_SPI3A_NSS_PIN PA4 //Port2Pin('A', 4) +#define BOARD_SPI3A_SCK_PIN PC10 //Port2Pin('C',10) +#define BOARD_SPI3A_MISO_PIN PC11 //Port2Pin('C',11) +#define BOARD_SPI3A_MOSI_PIN PC12 //Port2Pin('C',12) +*/ +#define BOARD_SDIO_D0 PC8 //Port2Pin('C', 8) +#define BOARD_SDIO_D1 PC9 //Port2Pin('C', 9) +#define BOARD_SDIO_D2 PC10 //Port2Pin('C',10) +#define BOARD_SDIO_D3 PC11 //Port2Pin('C',11) +#define BOARD_SDIO_CK PC12 //Port2Pin('C',12) +#define BOARD_SDIO_CMD PD2 //Port2Pin('D', 2) + +#define BOARD_NR_GPIO_PINS 80 +#define BOARD_NR_PWM_PINS 22 +#define BOARD_NR_ADC_PINS 16 +#define BOARD_NR_USED_PINS 22 +#define BOARD_JTMS_SWDIO_PIN PA13 //Port2Pin('A',13) +#define BOARD_JTCK_SWCLK_PIN PA14 //Port2Pin('A',14) +#define BOARD_JTDI_PIN PA15 //Port2Pin('A',15) +#define BOARD_JTDO_PIN PB3 //Port2Pin('B', 3) +#define BOARD_NJTRST_PIN PB4 //Port2Pin('B', 4) + +/*****************************************************************************/ +// Pins reserved for the on-board hardware +#define USB_DM_PIN BOARD_USB_DM_PIN // PA11 +#define USB_DP_PIN BOARD_USB_DP_PIN // PA12 + +#define FLASH_CS_PIN PB0 +#define FLASH_CLK_PIN BOARD_SPI3_SCK_PIN // PB3 +#define FLASH_DO_PIN BOARD_SPI3_MISO_PIN // PB4 +#define FLASH_DI_PIN BOARD_SPI3_MOSI_PIN // PB5 + +#define NRF24_CLK_PIN BOARD_SPI3_SCK_PIN // PB3 +#define NRF24_DO_PIN BOARD_SPI3_MISO_PIN // PB4 +#define NRF24_DI_PIN BOARD_SPI3_MOSI_PIN // PB5 +#define NRF24_CE_PIN PB6 +#define NRF24_CS_PIN PB7 +#define NRF24_IRQ_PIN PB8 + +// SD card, SDIO mode +#define SD_DAT0 BOARD_SDIO_D0 // PC8 +#define SD_DAT1 BOARD_SDIO_D1 // PC9 +#define SD_DAT2 BOARD_SDIO_D2 // PC10 +#define SD_DAT3 BOARD_SDIO_D3 // PC11 +#define SD_CLK BOARD_SDIO_CK // PC12 +#define SD_CMD BOARD_SDIO_CMD // PD2 +// SD card, SPI mode, only usable with software SPI +#define SD_DI BOARD_SDIO_CMD // PD2 +#define SD_DO BOARD_SDIO_D0 // PC8 +#define SD_CS BOARD_SDIO_D3 // PC11 +#define SD_SCLK BOARD_SDIO_CK // PC12 + +/*****************************************************************************/ + +enum { +PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, +PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, +PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, +PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7,PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15, +PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15, +#if 0 // not available on LQFP100 package +PF0,PF1,PF2,PF3,PF4,PF5,PF6,PF7,PF8,PF9,PF10,PF11,PF12,PF13,PF14,PF15, +PG0,PG1,PG2,PG3,PG4,PG5,PG6,PG7,PG8,PG9,PG10,PG11,PG12,PG13,PG14,PG15 +#endif // not available on LQFP100 package +}; + +#endif diff --git a/STM32F4/variants/generic_f407v/ld/common.inc b/STM32F4/variants/generic_f407v/ld/common.inc new file mode 100644 index 000000000..f5a0f5b6e --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/common.inc @@ -0,0 +1,219 @@ +/* + * Linker script for libmaple. + * + * Original author "lanchon" from ST forums, with modifications by LeafLabs. + */ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") + +/* + * Configure other libraries we want in the link. + * + * libgcc, libc, and libm are common across supported toolchains. + * However, some toolchains require additional archives which aren't + * present everywhere (e.g. ARM's gcc-arm-embedded releases). + * + * To hack around this, we let the build system specify additional + * archives by putting the right extra_libs.inc (in a directory under + * toolchains/) in our search path. + */ +GROUP(libgcc.a libc.a libm.a) +INCLUDE extra_libs.inc + +/* + * These force the linker to search for vector table symbols. + * + * These symbols vary by STM32 family (and also within families). + * It's up to the build system to configure the link's search path + * properly for the target MCU. + */ +INCLUDE vector_symbols.inc + +/* STM32 vector table. */ +EXTERN(__stm32_vector_table) + +/* C runtime initialization function. */ +EXTERN(start_c) + +/* main entry point */ +EXTERN(main) + +/* Initial stack pointer value. */ +EXTERN(__msp_init) +PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram)); + +/* Reset vector and chip reset entry point */ +EXTERN(__start__) +ENTRY(__start__) +PROVIDE(__exc_reset = __start__); + +/* Heap boundaries, for libmaple */ +EXTERN(_lm_heap_start); +EXTERN(_lm_heap_end); + +SECTIONS +{ + .text : + { + __text_start__ = .; + /* + * STM32 vector table. Leave this here. Yes, really. + */ + *(.stm32.interrupt_vector) + + /* + * Program code and vague linking + */ + *(.text .text.* .gnu.linkonce.t.*) + *(.plt) + *(.gnu.warning) + *(.glue_7t) *(.glue_7) *(.vfp11_veneer) + + *(.ARM.extab* .gnu.linkonce.armextab.*) + *(.gcc_except_table) + *(.eh_frame_hdr) + *(.eh_frame) + + . = ALIGN(4); + KEEP(*(.init)) + + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + } > REGION_TEXT + + /* + * End of text + */ + .text.align : + { + . = ALIGN(8); + __text_end__ = .; + } > REGION_TEXT + + /* + * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI + */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > REGION_RODATA + __exidx_end = .; + + /* + * .data + */ + .data : + { + . = ALIGN(8); + __data_start__ = .; + + *(.got.plt) *(.got) + *(.data .data.* .gnu.linkonce.d.*) + + . = ALIGN(8); + __data_end__ = .; + } > REGION_DATA AT> REGION_RODATA + + /* + * Read-only data + */ + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + /* .USER_FLASH: We allow users to allocate into Flash here */ + *(.USER_FLASH) + /* ROM image configuration; for C startup */ + . = ALIGN(4); + _lm_rom_img_cfgp = .; + LONG(LOADADDR(.data)); + /* + * Heap: Linker scripts may choose a custom heap by overriding + * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in + * internal SRAM, beginning after .bss, and growing towards + * the stack. + * + * I'm shoving these here naively; there's probably a cleaner way + * to go about this. [mbolivar] + */ + _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; + _lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init; + } > REGION_RODATA + + /* + * .bss + */ + .bss : + { + . = ALIGN(8); + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + . = ALIGN (8); + __bss_end__ = .; + _end = __bss_end__; + } > REGION_BSS + + /* + * Debugging sections + */ + .stab 0 (NOLOAD) : { *(.stab) } + .stabstr 0 (NOLOAD) : { *(.stabstr) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/STM32F4/variants/generic_f407v/ld/extra_libs.inc b/STM32F4/variants/generic_f407v/ld/extra_libs.inc new file mode 100644 index 000000000..dd2c84fa4 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/extra_libs.inc @@ -0,0 +1,7 @@ +/* + * Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi- + * releases (https://launchpad.net/gcc-arm-embedded/). + */ + +/* This is for the provided newlib. */ +GROUP(libnosys.a) diff --git a/STM32F4/variants/generic_f407v/ld/flash.ld b/STM32F4/variants/generic_f407v/ld/flash.ld new file mode 100644 index 000000000..c753a786c --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/flash.ld @@ -0,0 +1,20 @@ +/* + * Discovery F4 (STM32F407VGT6, high density) linker script for + * Flash builds. + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 125K + rom (rx) : ORIGIN = 0x08010000, LENGTH = 960K /* ala42 */ +} + +/* GROUP(libcs4_stm32_high_density.a) */ + +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +_FLASH_BUILD = 1; +INCLUDE common.inc diff --git a/STM32F4/variants/generic_f407v/ld/jtag.ld b/STM32F4/variants/generic_f407v/ld/jtag.ld new file mode 100644 index 000000000..1001db518 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/jtag.ld @@ -0,0 +1,20 @@ +/* + * STM32F4xx high density linker script for + * JTAG (bare metal, no bootloader) builds. + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K +} + +/* GROUP(libcs3_stm32_high_density.a) */ + +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +_FLASH_BUILD = 1; +INCLUDE common.inc diff --git a/STM32F4/variants/generic_f407v/ld/names.inc b/STM32F4/variants/generic_f407v/ld/names.inc new file mode 100644 index 000000000..6d7ff6e94 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/names.inc @@ -0,0 +1,78 @@ +EXTERN(__cs3_stack) +EXTERN(__cs3_reset) +EXTERN(__exc_nmi) +EXTERN(__exc_hardfault) +EXTERN(__exc_memmanage) +EXTERN(__exc_busfault) +EXTERN(__exc_usagefault) +EXTERN(__stm32reservedexception7) +EXTERN(__stm32reservedexception8) +EXTERN(__stm32reservedexception9) +EXTERN(__stm32reservedexception10) +EXTERN(__exc_svc) +EXTERN(__exc_debug_monitor) +EXTERN(__stm32reservedexception13) +EXTERN(__exc_pendsv) +EXTERN(__exc_systick) + +EXTERN(__irq_wwdg) +EXTERN(__irq_pvd) +EXTERN(__irq_tamper) +EXTERN(__irq_rtc) +EXTERN(__irq_flash) +EXTERN(__irq_rcc) +EXTERN(__irq_exti0) +EXTERN(__irq_exti1) +EXTERN(__irq_exti2) +EXTERN(__irq_exti3) +EXTERN(__irq_exti4) +EXTERN(__irq_dma1_channel1) +EXTERN(__irq_dma1_channel2) +EXTERN(__irq_dma1_channel3) +EXTERN(__irq_dma1_channel4) +EXTERN(__irq_dma1_channel5) +EXTERN(__irq_dma1_channel6) +EXTERN(__irq_dma1_channel7) +EXTERN(__irq_adc) +EXTERN(__irq_usb_hp_can_tx) +EXTERN(__irq_usb_lp_can_rx0) +EXTERN(__irq_can_rx1) +EXTERN(__irq_can_sce) +EXTERN(__irq_exti9_5) +EXTERN(__irq_tim1_brk) +EXTERN(__irq_tim1_up) +EXTERN(__irq_tim1_trg_com) +EXTERN(__irq_tim1_cc) +EXTERN(__irq_tim2) +EXTERN(__irq_tim3) +EXTERN(__irq_tim4) +EXTERN(__irq_i2c1_ev) +EXTERN(__irq_i2c1_er) +EXTERN(__irq_i2c2_ev) +EXTERN(__irq_i2c2_er) +EXTERN(__irq_spi1) +EXTERN(__irq_spi2) +EXTERN(__irq_usart1) +EXTERN(__irq_usart2) +EXTERN(__irq_usart3) +EXTERN(__irq_exti15_10) +EXTERN(__irq_rtcalarm) +EXTERN(__irq_usbwakeup) + +EXTERN(__irq_tim8_brk) +EXTERN(__irq_tim8_up) +EXTERN(__irq_tim8_trg_com) +EXTERN(__irq_tim8_cc) +EXTERN(__irq_adc3) +EXTERN(__irq_fsmc) +EXTERN(__irq_sdio) +EXTERN(__irq_tim5) +EXTERN(__irq_spi3) +EXTERN(__irq_uart4) +EXTERN(__irq_uart5) +EXTERN(__irq_tim6) +EXTERN(__irq_tim7) +EXTERN(__irq_dma2_channel1) +EXTERN(__irq_dma2_channel2) +EXTERN(__irq_dma2_channel3) +EXTERN(__irq_dma2_channel4_5) diff --git a/STM32F4/variants/generic_f407v/ld/ram.ld b/STM32F4/variants/generic_f407v/ld/ram.ld new file mode 100644 index 000000000..b57060c92 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/ram.ld @@ -0,0 +1,19 @@ +/* + * aeroquad32 (STM32F103VET6, high density) linker script for + * RAM builds. + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K + rom (rx) : ORIGIN = 0x08010000, LENGTH = 0K /* ala42 */ +} + +GROUP(libcs3_stm32_high_density.a) + +REGION_ALIAS("REGION_TEXT", ram); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", ram); + +INCLUDE common.inc diff --git a/STM32F4/variants/generic_f407v/ld/vector_symbols.inc b/STM32F4/variants/generic_f407v/ld/vector_symbols.inc new file mode 100644 index 000000000..f8519bba4 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/vector_symbols.inc @@ -0,0 +1,78 @@ +EXTERN(__msp_init) +EXTERN(__exc_reset) +EXTERN(__exc_nmi) +EXTERN(__exc_hardfault) +EXTERN(__exc_memmanage) +EXTERN(__exc_busfault) +EXTERN(__exc_usagefault) +EXTERN(__stm32reservedexception7) +EXTERN(__stm32reservedexception8) +EXTERN(__stm32reservedexception9) +EXTERN(__stm32reservedexception10) +EXTERN(__exc_svc) +EXTERN(__exc_debug_monitor) +EXTERN(__stm32reservedexception13) +EXTERN(__exc_pendsv) +EXTERN(__exc_systick) + +EXTERN(__irq_wwdg) +EXTERN(__irq_pvd) +EXTERN(__irq_tamper) +EXTERN(__irq_rtc) +EXTERN(__irq_flash) +EXTERN(__irq_rcc) +EXTERN(__irq_exti0) +EXTERN(__irq_exti1) +EXTERN(__irq_exti2) +EXTERN(__irq_exti3) +EXTERN(__irq_exti4) +EXTERN(__irq_dma1_channel1) +EXTERN(__irq_dma1_channel2) +EXTERN(__irq_dma1_channel3) +EXTERN(__irq_dma1_channel4) +EXTERN(__irq_dma1_channel5) +EXTERN(__irq_dma1_channel6) +EXTERN(__irq_dma1_channel7) +EXTERN(__irq_adc) +EXTERN(__irq_usb_hp_can_tx) +EXTERN(__irq_usb_lp_can_rx0) +EXTERN(__irq_can_rx1) +EXTERN(__irq_can_sce) +EXTERN(__irq_exti9_5) +EXTERN(__irq_tim1_brk) +EXTERN(__irq_tim1_up) +EXTERN(__irq_tim1_trg_com) +EXTERN(__irq_tim1_cc) +EXTERN(__irq_tim2) +EXTERN(__irq_tim3) +EXTERN(__irq_tim4) +EXTERN(__irq_i2c1_ev) +EXTERN(__irq_i2c1_er) +EXTERN(__irq_i2c2_ev) +EXTERN(__irq_i2c2_er) +EXTERN(__irq_spi1) +EXTERN(__irq_spi2) +EXTERN(__irq_usart1) +EXTERN(__irq_usart2) +EXTERN(__irq_usart3) +EXTERN(__irq_exti15_10) +EXTERN(__irq_rtcalarm) +EXTERN(__irq_usbwakeup) + +EXTERN(__irq_tim8_brk) +EXTERN(__irq_tim8_up) +EXTERN(__irq_tim8_trg_com) +EXTERN(__irq_tim8_cc) +EXTERN(__irq_adc3) +EXTERN(__irq_fsmc) +EXTERN(__irq_sdio) +EXTERN(__irq_tim5) +EXTERN(__irq_spi3) +EXTERN(__irq_uart4) +EXTERN(__irq_uart5) +EXTERN(__irq_tim6) +EXTERN(__irq_tim7) +EXTERN(__irq_dma2_channel1) +EXTERN(__irq_dma2_channel2) +EXTERN(__irq_dma2_channel3) +EXTERN(__irq_dma2_channel4_5) diff --git a/STM32F4/variants/generic_f407v/pin_map.c b/STM32F4/variants/generic_f407v/pin_map.c new file mode 100644 index 000000000..2189902d6 --- /dev/null +++ b/STM32F4/variants/generic_f407v/pin_map.c @@ -0,0 +1,210 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file generic_f407v.cpp + * @author ala42 + * @brief generic_f407v board file. + */ + +#ifdef BOARD_generic_f407v + +#ifdef __cplusplus +extern "C"{ +#endif + +//#include "generic_f407v.h" + +//#include "fsmc.h" +#include +#include +#include + +#include + +extern timer_dev timer1; +extern timer_dev timer2; +extern timer_dev timer3; +extern timer_dev timer4; +extern timer_dev timer5; +extern timer_dev timer6; +extern timer_dev timer7; +extern timer_dev timer8; + +/* +typedef struct stm32_pin_info { + gpio_dev *gpio_device; // Maple pin's GPIO device + timer_dev *timer_device; // Pin's timer device, if any. + uint8 timer_channel; // Timer channel, or 0 if none. + uint8 adc_channel; // Pin ADC channel, or ADCx if none. + const adc_dev *adc_device; // ADC device, if any. +} stm32_pin_info; +*/ +const stm32_pin_info PIN_MAP[] = { // LQFP100 package pin + {&GPIOA, &timer5, 1, 0, &ADC1}, // D00/PA0 | 23 | USART2_CTS | UART4_TX | ETH_MII_CRS | TIM2_CH1_ETR | TIM5_CH1 | TIM8_ETR | ADC123_IN0/WKUP + {&GPIOA, &timer5, 2, 1, &ADC1}, // D01/PA1 | 24 | USART2_RTS | UART4_RX | ETH_RMII_REF_CLK | ETH_MII_RX_CLK | TIM5_CH2 | TIM2_CH2 | ADC123_IN1 + {&GPIOA, &timer5, 3, 2, &ADC1}, // D02/PA2 | 25 | USART2_TX | TIM5_CH3 | TIM9_CH1 | TIM2_CH3 | ETH_MDIO | ADC123_IN2 + {&GPIOA, &timer5, 4, 3, &ADC1}, // D03/PA3 | 26 | USART2_RX | TIM5_CH4 | TIM9_CH2 | TIM2_CH4 | OTG_HS_ULPI_D0 | ETH_MII_COL | ADC123_IN3 + {&GPIOA, NULL, 0, 4, &ADC1}, // D04/PA4 | 29 | SPI1_NSS | SPI3_NSS | USART2_CK | DCMI_HSYNC | OTG_HS_SOF | I2S3_WS | ADC12_IN4 / DAC_OUT1 + {&GPIOA, NULL, 0, 5, &ADC1}, // D05/PA5 | 30 | SPI1_SCK | OTG_HS_ULPI_CK | TIM2_CH1_ETR | TIM8_CH1N | ADC12_IN5 / DAC_OUT2 + {&GPIOA, NULL, 1, 6, &ADC1}, // D06/PA6 | 31 | SPI1_MISO | TIM8_BKIN | TIM13_CH1 | DCMI_PIXCLK | TIM3_CH1 | TIM1_BKIN | ADC12_IN6 + {&GPIOA, NULL, 0, 7, &ADC1}, // D07/PA7 | 32 | SPI1_MOSI | TIM8_CH1N | TIM14_CH1 | TIM3_CH2 | ETH_MII_RX_DV | TIM1_CH1N / ETH_RMII_CRS_DV | ADC12_IN7 + {&GPIOA, NULL, 0, ADCx, NULL}, // D08/PA8 | 67 | MCO1 | USART1_CK | TIM1_CH1 | I2C3_SCL | OTG_FS_SOF + {&GPIOA, NULL, 0, ADCx, NULL}, // D09/PA9 | 68 | USART1_TX | TIM1_CH2 | I2C3_SMBA | DCMI_D0 + {&GPIOA, NULL, 0, ADCx, NULL}, // D10/PA10 | 69 | USART1_RX | TIM1_CH3 | OTG_FS_ID | DCMI_D1 + {&GPIOA, NULL, 0, ADCx, NULL}, // D11/PA11 | 70 | USART1_CTS | CAN1_RX | TIM1_CH4 | OTG_FS_DM + {&GPIOA, NULL, 0, ADCx, NULL}, // D12/PA12 | 71 | USART1_RTS | CAN1_TX | TIM1_ETR | OTG_FS_DP + {&GPIOA, NULL, 0, ADCx, NULL}, // D13/PA13 | 72 | JTMS-SWDIO + {&GPIOA, NULL, 0, ADCx, NULL}, // D14/PA14 | 76 | JTCK-SWCLK + {&GPIOA, &timer2, 1, ADCx, NULL}, // D15/PA15 | 77 | JTDI | SPI3_NSS | I2S3_WS | TIM2_CH1_ETR | SPI1_NSS + + {&GPIOB, &timer3, 3, 8, &ADC1}, // D16/PB0 | 35 | TIM3_CH3 | TIM8_CH2N | OTG_HS_ULPI_D1 | ETH_MII_RXD2 | TIM1_CH2N | ADC12_IN8 + {&GPIOB, &timer3, 4, 9, &ADC1}, // D17/PB1 | 36 | TIM3_CH4 | TIM8_CH3N | OTG_HS_ULPI_D2 | ETH_MII_RXD3 | TIM1_CH3N | ADC12_IN9 + {&GPIOB, NULL, 0, ADCx, NULL}, // D18/PB2 | 37 | BOOT1 + {&GPIOB, &timer2, 2, ADCx, NULL}, // D19/PB3 | 89 | JTDO | TRACESWO | SPI3_SCK | I2S3_CK | TIM2_CH2 | SPI1_SCK + {&GPIOB, &timer3, 1, ADCx, NULL}, // D20/PB4 | 90 | NJTRST | SPI3_MISO | TIM3_CH1 | SPI1_MISO | I2S3ext_SD + {&GPIOB, &timer3, 2, ADCx, NULL}, // D21/PB5 | 91 | I2C1_SMBA | CAN2_RX | OTG_HS_ULPI_D7 | ETH_PPS_OUT | TIM3_CH2 | SPI1_MOSI | SPI3_MOSI | DCMI_D10 | I2S3_SD + {&GPIOB, NULL, 0, ADCx, NULL}, // D22/PB6 | 92 | I2C1_SCL | TIM4_CH1 | CAN2_TX | DCMI_D5 | USART1_TX + {&GPIOB, NULL, 0, ADCx, NULL}, // D23/PB7 | 93 | I2C1_SDA | FSMC_NL | DCMI_VSYNC | USART1_RX | TIM4_CH2 + {&GPIOB, NULL, 0, ADCx, NULL}, // D24/PB8 | 95 | TIM4_CH3 | SDIO_D4 | TIM10_CH1 | DCMI_D6 | ETH_MII_TXD3 | I2C1_SCL | CAN1_RX + {&GPIOB, NULL, 0, ADCx, NULL}, // D25/PB9 | 96 | SPI2_NSS | I2S2_WS | TIM4_CH4 | TIM11_CH1 | SDIO_D5 | DCMI_D7 | I2C1_SDA | CAN1_TX + {&GPIOB, NULL, 0, ADCx, NULL}, // D26/PB10 | 47 | SPI2_SCK | I2S2_CK | I2C2_SCL | USART3_TX | OTG_HS_ULPI_D3 | ETH_MII_RX_ER | TIM2_CH3 + {&GPIOB, NULL, 0, ADCx, NULL}, // D27/PB11 | 48 | I2C2_SDA | USART3_RX | OTG_HS_ULPI_D4 | ETH_RMII_TX_EN | ETH_MII_TX_EN | TIM2_CH4 + {&GPIOB, NULL, 0, ADCx, NULL}, // D28/PB12 | 51 | SPI2_NSS | I2S2_WS | I2C2_SMBA | USART3_CK | TIM1_BKIN | CAN2_RX | OTG_HS_ULPI_D5 | ETH_RMII_TXD0 | ETH_MII_TXD0 | OTG_HS_ID + {&GPIOB, NULL, 0, ADCx, NULL}, // D29/PB13 | 52 | SPI2_SCK | I2S2_CK | USART3_CTS | TIM1_CH1N | CAN2_TX | OTG_HS_ULPI_D6 | ETH_RMII_TXD1 | ETH_MII_TXD1 + {&GPIOB, NULL, 0, ADCx, NULL}, // D30/PB14 | 53 | SPI2_MISO | TIM1_CH2N | TIM12_CH1 | OTG_HS_DM | USART3_RTS | TIM8_CH2N | I2S2ext_SD + {&GPIOB, NULL, 0, ADCx, NULL}, // D31/PB15 | 54 | SPI2_MOSI | I2S2_SD | TIM1_CH3N | TIM8_CH3N | TIM12_CH2 | OTG_HS_DP + + {&GPIOC, NULL, 0, 10, &ADC1}, // D32/PC0 | 15 | OTG_HS_ULPI_STP | ADC123_IN10 + {&GPIOC, NULL, 0, 11, &ADC1}, // D33/PC1 | 16 | ETH_MDC | ADC123_IN11 + {&GPIOC, NULL, 0, 12, &ADC1}, // D34/PC2 | 17 | SPI2_MISO | OTG_HS_ULPI_DIR | ETH_MII_TXD2 | I2S2ext_SD | ADC123_IN12 + {&GPIOC, NULL, 0, 13, &ADC1}, // D35/PC3 | 18 | SPI2_MOSI | I2S2_SD | OTG_HS_ULPI_NXT | ETH_MII_TX_CLK | ADC123_IN13 + {&GPIOC, NULL, 0, 14, &ADC1}, // D36/PC4 | 33 | ETH_RMII_RX_D0 | ETH_MII_RX_D0 | ADC12_IN14 + {&GPIOC, NULL, 0, 15, &ADC1}, // D37/PC5 | 34 | ETH_RMII_RX_D1 | ETH_MII_RX_D1 | ADC12_IN15 + {&GPIOC, &timer8, 1, ADCx, NULL}, // D38/PC6 | 63 | I2S2_MCK | TIM8_CH1/SDIO_D6 | USART6_TX | DCMI_D0/TIM3_CH1 + {&GPIOC, &timer8, 2, ADCx, NULL}, // D39/PC7 | 64 | I2S3_MCK | TIM8_CH2/SDIO_D7 | USART6_RX | DCMI_D1/TIM3_CH2 + {&GPIOC, &timer8, 3, ADCx, NULL}, // D40/PC8 | 65 | TIM8_CH3 | SDIO_D0 | TIM3_CH3 | USART6_CK | DCMI_D2 + {&GPIOC, &timer8, 4, ADCx, NULL}, // D41/PC9 | 66 | I2S_CKIN | MCO2 | TIM8_CH4 | SDIO_D1 | I2C3_SDA | DCMI_D3 | TIM3_CH4 + {&GPIOC, NULL, 0, ADCx, NULL}, // D42/PC10 | 78 | SPI3_SCK | I2S3_CK | UART4_TX | SDIO_D2 | DCMI_D8 | USART3_TX + {&GPIOC, NULL, 0, ADCx, NULL}, // D43/PC11 | 79 | UART4_RX | SPI3_MISO | SDIO_D3 | DCMI_D4 | USART3_RX | I2S3ext_SD + {&GPIOC, NULL, 0, ADCx, NULL}, // D44/PC12 | 80 | UART5_TX | SDIO_CK | DCMI_D9 | SPI3_MOSI | I2S3_SD | USART3_CK + {&GPIOC, NULL, 0, ADCx, NULL}, // D45/PC13 | 7 | RTC_OUT, RTC_TAMP1, RTC_TS + {&GPIOC, NULL, 0, ADCx, NULL}, // D46/PC14 | 8 | OSC32_IN + {&GPIOC, NULL, 0, ADCx, NULL}, // D47/PC15 | 9 | OSC32_OUT + + {&GPIOD, NULL, 0, ADCx, NULL}, // D48/PD0 | 81 | FSMC_D2 | CAN1_RX + {&GPIOD, NULL, 0, ADCx, NULL}, // D49/PD1 | 82 | FSMC_D3 | CAN1_TX + {&GPIOD, NULL, 0, ADCx, NULL}, // D50/PD2 | 83 | TIM3_ETR | UART5_RX | SDIO_CMD | DCMI_D11 + {&GPIOD, NULL, 0, ADCx, NULL}, // D51/PD3 | 84 | FSMC_CLK | USART2_CTS + {&GPIOD, NULL, 0, ADCx, NULL}, // D52/PD4 | 85 | FSMC_NOE | USART2_RTS + {&GPIOD, NULL, 0, ADCx, NULL}, // D53/PD5 | 86 | FSMC_NWE | USART2_TX + {&GPIOD, NULL, 0, ADCx, NULL}, // D54/PD6 | 87 | FSMC_NWAIT | USART2_RX + {&GPIOD, NULL, 0, ADCx, NULL}, // D55/PD7 | 88 | USART2_CK | FSMC_NE1 | FSMC_NCE2 + {&GPIOD, NULL, 0, ADCx, NULL}, // D56/PD8 | 55 | FSMC_D13 | USART3_TX + {&GPIOD, NULL, 0, ADCx, NULL}, // D57/PD9 | 56 | FSMC_D14 | USART3_RX + {&GPIOD, NULL, 0, ADCx, NULL}, // D58/PD10 | 57 | FSMC_D15 | USART3_CK + {&GPIOD, NULL, 0, ADCx, NULL}, // D59/PD11 | 58 | FSMC_CLE | FSMC_A16 | USART3_CTS + {&GPIOD, &timer4, 1, ADCx, NULL}, // D60/PD12 | 59 | FSMC_ALE | FSMC_A17 | TIM4_CH1 | USART3_RTS // remap in + {&GPIOD, &timer4, 2, ADCx, NULL}, // D61/PD13 | 60 | FSMC_A18 | TIM4_CH2 // remap in + {&GPIOD, &timer4, 3, ADCx, NULL}, // D62/PD14 | 61 | FSMC_D0 | TIM4_CH3 // remap in + {&GPIOD, &timer4, 4, ADCx, NULL}, // D63/PD15 | 62 | FSMC_D1 | TIM4_CH4 // remap in + + {&GPIOE, NULL, 0, ADCx, NULL}, // D64/PE0 | 97 | TIM4_ETR | FSMC_NBL0 | DCMI_D2 + {&GPIOE, NULL, 0, ADCx, NULL}, // D65/PE1 | 98 | FSMC_NBL1 | DCMI_D3 + {&GPIOE, NULL, 0, ADCx, NULL}, // D66/PE2 | 1 | TRACECLK | FSMC_A23 | ETH_MII_TXD3 + {&GPIOE, NULL, 0, ADCx, NULL}, // D67/PE3 | 2 | TRACED0 | FSMC_A19 + {&GPIOE, NULL, 0, ADCx, NULL}, // D68/PE4 | 3 | TRACED1 | FSMC_A20 | DCMI_D4 + {&GPIOE, NULL, 0, ADCx, NULL}, // D69/PE5 | 4 | TRACED2 | FSMC_A21 | TIM9_CH1 / DCMI_D6 + {&GPIOE, NULL, 0, ADCx, NULL}, // D70/PE6 | 5 | TRACED3 | FSMC_A22 | TIM9_CH2 / DCMI_D7 + {&GPIOE, NULL, 0, ADCx, NULL}, // D71/PE7 | 38 | FSMC_D4 | TIM1_ETR + {&GPIOE, NULL, 0, ADCx, NULL}, // D72/PE8 | 39 | FSMC_D5 | TIM1_CH1N + {&GPIOE, &timer1, 1, ADCx, NULL}, // D73/PE9 | 40 | FSMC_D6 | TIM1_CH1 // remap in + {&GPIOE, NULL, 0, ADCx, NULL}, // D74/PE10 | 41 | FSMC_D7 | TIM1_CH2N + {&GPIOE, &timer1, 2, ADCx, NULL}, // D75/PE11 | 42 | FSMC_D8 | TIM1_CH2 // remap in + {&GPIOE, NULL, 0, ADCx, NULL}, // D76/PE12 | 43 | FSMC_D9 | TIM1_CH3N + {&GPIOE, &timer1, 3, ADCx, NULL}, // D77/PE13 | 44 | FSMC_D10 | TIM1_CH3 // remap in + {&GPIOE, &timer1, 4, ADCx, NULL}, // D78/PE14 | 45 | FSMC_D11 | TIM1_CH4 // remap in + {&GPIOE, NULL, 0, ADCx, NULL}, // D79/PE15 | 46 | FSMC_D12 | TIM1_BKIN +#if 0 + {GPIOF, 0, NULL, 0, NULL, ADCx}, // D80/PF0 + {GPIOF, 1, NULL, 0, NULL, ADCx}, // D81/PF1 + {GPIOF, 2, NULL, 0, NULL, ADCx}, // D82/PF2 + {GPIOF, 3, NULL, 0, NULL, ADCx}, // D83/PF3 + {GPIOF, 4, NULL, 0, NULL, ADCx}, // D84/PF4 + {GPIOF, 5, NULL, 0, NULL, ADCx}, // D85/PF5 + {GPIOF, 6, NULL, 0, NULL, ADCx}, // D86/PF6 + {GPIOF, 7, NULL, 0, NULL, ADCx}, // D87/PF7 + {GPIOF, 8, NULL, 0, NULL, ADCx}, // D88/PF8 + {GPIOF, 9, NULL, 0, NULL, ADCx}, // D89/PF9 + {GPIOF, 10, NULL, 0, NULL, ADCx}, // D90/PF10 + {GPIOF, 11, NULL, 0, NULL, ADCx}, // D91/PF11 + {GPIOF, 12, NULL, 0, NULL, ADCx}, // D92/PF12 + {GPIOF, 13, NULL, 0, NULL, ADCx}, // D93/PF13 + {GPIOF, 14, NULL, 0, NULL, ADCx}, // D94/PF14 + {GPIOF, 15, NULL, 0, NULL, ADCx}, // D95/PF15 + + {GPIOG, 0, NULL, 0, NULL, ADCx}, // D96/PG0 + {GPIOG, 1, NULL, 0, NULL, ADCx}, // D97/PG1 + {GPIOG, 2, NULL, 0, NULL, ADCx}, // D98/PG2 + {GPIOG, 3, NULL, 0, NULL, ADCx}, // D99/PG3 + {GPIOG, 4, NULL, 0, NULL, ADCx}, // D100/PG4 + {GPIOG, 5, NULL, 0, NULL, ADCx}, // D101/PG5 + {GPIOG, 6, NULL, 0, NULL, ADCx}, // D102/PG6 + {GPIOG, 7, NULL, 0, NULL, ADCx}, // D103/PG7 + {GPIOG, 8, NULL, 0, NULL, ADCx}, // D104/PG8 + {GPIOG, 9, NULL, 0, NULL, ADCx}, // D105/PG9 + {GPIOG, 10, NULL, 0, NULL, ADCx}, // D106/PG10 + {GPIOG, 11, NULL, 0, NULL, ADCx}, // D107/PG11 + {GPIOG, 12, NULL, 0, NULL, ADCx}, // D108/PG12 + {GPIOG, 13, NULL, 0, NULL, ADCx}, // D109/PG13 + {GPIOG, 14, NULL, 0, NULL, ADCx}, // D110/PG14 + {GPIOG, 15, NULL, 0, NULL, ADCx} // D111/PG15 +#endif +}; +/* to be defined +extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { + 0, 1, 2, 3, 15, 16, 17, 19, 20, 21, 38, 39, 49, 41, 60, 61, 62, 63, 73, 75, 77, 78 +}; +*/ +const uint8 boardADCPins[BOARD_NR_ADC_PINS] = { + PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PB0, PB1, PC0, PC1, PC2, PC3, PC4, PC5 +}; + +const uint8 boardUsedPins[BOARD_NR_USED_PINS] = { + BOARD_LED_PIN, BOARD_LED2_PIN, BOARD_BUTTON1_PIN, BOARD_BUTTON2_PIN, BOARD_BUTTON2_PIN, + BOARD_JTMS_SWDIO_PIN, BOARD_JTCK_SWCLK_PIN, + FLASH_CS_PIN, FLASH_CLK_PIN, FLASH_DO_PIN, FLASH_DI_PIN, + NRF24_CE_PIN, NRF24_CS_PIN, NRF24_IRQ_PIN, + BOARD_SDIO_D0, BOARD_SDIO_D1, BOARD_SDIO_D2, BOARD_SDIO_D3, BOARD_SDIO_CK, BOARD_SDIO_CMD, + USB_DM_PIN, USB_DP_PIN +}; + +#ifdef __cplusplus +} +#endif + + +#endif // BOARD_generic_f407v diff --git a/STM32F4/variants/generic_f407v/pins_arduino.h b/STM32F4/variants/generic_f407v/pins_arduino.h new file mode 100644 index 000000000..3052f2eb2 --- /dev/null +++ b/STM32F4/variants/generic_f407v/pins_arduino.h @@ -0,0 +1,6 @@ + + + + +// API compatibility +#include "variant.h" \ No newline at end of file diff --git a/STM32F4/variants/generic_f407v/stm32_isrs.S b/STM32F4/variants/generic_f407v/stm32_isrs.S new file mode 100644 index 000000000..34e515c08 --- /dev/null +++ b/STM32F4/variants/generic_f407v/stm32_isrs.S @@ -0,0 +1,323 @@ +/* STM32 ISR weak declarations */ + + .thumb + +/* Default handler for all non-overridden interrupts and exceptions */ + .globl __default_handler + .type __default_handler, %function + +__default_handler: + b . + + .weak __exc_nmi + .globl __exc_nmi + .set __exc_nmi, __default_handler + .weak __exc_hardfault + .globl __exc_hardfault + .set __exc_hardfault, __default_handler + .weak __exc_memmanage + .globl __exc_memmanage + .set __exc_memmanage, __default_handler + .weak __exc_busfault + .globl __exc_busfault + .set __exc_busfault, __default_handler + .weak __exc_usagefault + .globl __exc_usagefault + .set __exc_usagefault, __default_handler + .weak __stm32reservedexception7 + .globl __stm32reservedexception7 + .set __stm32reservedexception7, __default_handler + .weak __stm32reservedexception8 + .globl __stm32reservedexception8 + .set __stm32reservedexception8, __default_handler + .weak __stm32reservedexception9 + .globl __stm32reservedexception9 + .set __stm32reservedexception9, __default_handler + .weak __stm32reservedexception10 + .globl __stm32reservedexception10 + .set __stm32reservedexception10, __default_handler + .weak __exc_svc + .globl __exc_svc + .set __exc_svc, __default_handler + .weak __exc_debug_monitor + .globl __exc_debug_monitor + .set __exc_debug_monitor, __default_handler + .weak __stm32reservedexception13 + .globl __stm32reservedexception13 + .set __stm32reservedexception13, __default_handler + .weak __exc_pendsv + .globl __exc_pendsv + .set __exc_pendsv, __default_handler + .weak __exc_systick + .globl __exc_systick + .set __exc_systick, __default_handler + .weak __irq_wwdg + .globl __irq_wwdg + .set __irq_wwdg, __default_handler + .weak __irq_pvd + .globl __irq_pvd + .set __irq_pvd, __default_handler + .weak __irq_tamper + .globl __irq_tamper + .set __irq_tamper, __default_handler + .weak __irq_rtc + .globl __irq_rtc + .set __irq_rtc, __default_handler + .weak __irq_flash + .globl __irq_flash + .set __irq_flash, __default_handler + .weak __irq_rcc + .globl __irq_rcc + .set __irq_rcc, __default_handler + .weak __irq_exti0 + .globl __irq_exti0 + .set __irq_exti0, __default_handler + .weak __irq_exti1 + .globl __irq_exti1 + .set __irq_exti1, __default_handler + .weak __irq_exti2 + .globl __irq_exti2 + .set __irq_exti2, __default_handler + .weak __irq_exti3 + .globl __irq_exti3 + .set __irq_exti3, __default_handler + .weak __irq_exti4 + .globl __irq_exti4 + .set __irq_exti4, __default_handler + .weak __irq_dma1_channel1 + .globl __irq_dma1_channel1 + .set __irq_dma1_channel1, __default_handler + .weak __irq_dma1_channel2 + .globl __irq_dma1_channel2 + .set __irq_dma1_channel2, __default_handler + .weak __irq_dma1_channel3 + .globl __irq_dma1_channel3 + .set __irq_dma1_channel3, __default_handler + .weak __irq_dma1_channel4 + .globl __irq_dma1_channel4 + .set __irq_dma1_channel4, __default_handler + .weak __irq_dma1_channel5 + .globl __irq_dma1_channel5 + .set __irq_dma1_channel5, __default_handler + .weak __irq_dma1_channel6 + .globl __irq_dma1_channel6 + .set __irq_dma1_channel6, __default_handler + .weak __irq_dma1_channel7 + .globl __irq_dma1_channel7 + .set __irq_dma1_channel7, __default_handler + .weak __irq_adc + .globl __irq_adc + .set __irq_adc, __default_handler + .weak __irq_usb_hp_can_tx + .globl __irq_usb_hp_can_tx + .set __irq_usb_hp_can_tx, __default_handler + .weak __irq_usb_lp_can_rx0 + .globl __irq_usb_lp_can_rx0 + .set __irq_usb_lp_can_rx0, __default_handler + .weak __irq_can_rx1 + .globl __irq_can_rx1 + .set __irq_can_rx1, __default_handler + .weak __irq_can_sce + .globl __irq_can_sce + .set __irq_can_sce, __default_handler + .weak __irq_exti9_5 + .globl __irq_exti9_5 + .set __irq_exti9_5, __default_handler + .weak __irq_tim1_brk + .globl __irq_tim1_brk + .set __irq_tim1_brk, __default_handler + .weak __irq_tim1_up + .globl __irq_tim1_up + .set __irq_tim1_up, __default_handler + .weak __irq_tim1_trg_com + .globl __irq_tim1_trg_com + .set __irq_tim1_trg_com, __default_handler + .weak __irq_tim1_cc + .globl __irq_tim1_cc + .set __irq_tim1_cc, __default_handler + .weak __irq_tim2 + .globl __irq_tim2 + .set __irq_tim2, __default_handler + .weak __irq_tim3 + .globl __irq_tim3 + .set __irq_tim3, __default_handler + .weak __irq_tim4 + .globl __irq_tim4 + .set __irq_tim4, __default_handler + .weak __irq_i2c1_ev + .globl __irq_i2c1_ev + .set __irq_i2c1_ev, __default_handler + .weak __irq_i2c1_er + .globl __irq_i2c1_er + .set __irq_i2c1_er, __default_handler + .weak __irq_i2c2_ev + .globl __irq_i2c2_ev + .set __irq_i2c2_ev, __default_handler + .weak __irq_i2c2_er + .globl __irq_i2c2_er + .set __irq_i2c2_er, __default_handler + .weak __irq_spi1 + .globl __irq_spi1 + .set __irq_spi1, __default_handler + .weak __irq_spi2 + .globl __irq_spi2 + .set __irq_spi2, __default_handler + .weak __irq_usart1 + .globl __irq_usart1 + .set __irq_usart1, __default_handler + .weak __irq_usart2 + .globl __irq_usart2 + .set __irq_usart2, __default_handler + .weak __irq_usart3 + .globl __irq_usart3 + .set __irq_usart3, __default_handler + .weak __irq_exti15_10 + .globl __irq_exti15_10 + .set __irq_exti15_10, __default_handler + .weak __irq_rtcalarm + .globl __irq_rtcalarm + .set __irq_rtcalarm, __default_handler + .weak __irq_usbwakeup + .globl __irq_usbwakeup + .set __irq_usbwakeup, __default_handler +#if defined (STM32_HIGH_DENSITY) + .weak __irq_tim8_brk + .globl __irq_tim8_brk + .set __irq_tim8_brk, __default_handler + .weak __irq_tim8_up + .globl __irq_tim8_up + .set __irq_tim8_up, __default_handler + .weak __irq_tim8_trg_com + .globl __irq_tim8_trg_com + .set __irq_tim8_trg_com, __default_handler + .weak __irq_tim8_cc + .globl __irq_tim8_cc + .set __irq_tim8_cc, __default_handler + .weak __irq_adc3 + .globl __irq_adc3 + .set __irq_adc3, __default_handler + .weak __irq_fsmc + .globl __irq_fsmc + .set __irq_fsmc, __default_handler + .weak __irq_sdio + .globl __irq_sdio + .set __irq_sdio, __default_handler + .weak __irq_tim5 + .globl __irq_tim5 + .set __irq_tim5, __default_handler + .weak __irq_spi3 + .globl __irq_spi3 + .set __irq_spi3, __default_handler + .weak __irq_uart4 + .globl __irq_uart4 + .set __irq_uart4, __default_handler + .weak __irq_uart5 + .globl __irq_uart5 + .set __irq_uart5, __default_handler + .weak __irq_tim6 + .globl __irq_tim6 + .set __irq_tim6, __default_handler + .weak __irq_tim7 + .globl __irq_tim7 + .set __irq_tim7, __default_handler + .weak __irq_dma2_channel1 + .globl __irq_dma2_channel1 + .set __irq_dma2_channel1, __default_handler + .weak __irq_dma2_channel2 + .globl __irq_dma2_channel2 + .set __irq_dma2_channel2, __default_handler + .weak __irq_dma2_channel3 + .globl __irq_dma2_channel3 + .set __irq_dma2_channel3, __default_handler + .weak __irq_dma2_channel4_5 + .globl __irq_dma2_channel4_5 + .set __irq_dma2_channel4_5, __default_handler +#endif /* STM32_HIGH_DENSITY */ + + .weak __irq_DMA2_Stream4_IRQHandler + .globl __irq_DMA2_Stream4_IRQHandler + .set __irq_DMA2_Stream4_IRQHandler, __default_handler + + .weak __irq_ETH_IRQHandler + .globl __irq_ETH_IRQHandler + .set __irq_ETH_IRQHandler, __default_handler + + .weak __irq_ETH_WKUP_IRQHandler + .globl __irq_ETH_WKUP_IRQHandler + .set __irq_ETH_WKUP_IRQHandler, __default_handler + + .weak __irq_CAN2_TX_IRQHandler + .globl __irq_CAN2_TX_IRQHandler + .set __irq_CAN2_TX_IRQHandler, __default_handler + + .weak __irq_CAN2_RX0_IRQHandler + .globl __irq_CAN2_RX0_IRQHandler + .set __irq_CAN2_RX0_IRQHandler, __default_handler + + .weak __irq_CAN2_RX1_IRQHandler + .globl __irq_CAN2_RX1_IRQHandler + .set __irq_CAN2_RX1_IRQHandler, __default_handler + + .weak __irq_CAN2_SCE_IRQHandler + .globl __irq_CAN2_SCE_IRQHandler + .set __irq_CAN2_SCE_IRQHandler, __default_handler + + .weak __irq_OTG_FS_IRQHandler + .globl __irq_OTG_FS_IRQHandler + .set __irq_OTG_FS_IRQHandler, __default_handler + + .weak __irq_DMA2_Stream5_IRQHandler + .globl __irq_DMA2_Stream5_IRQHandler + .set __irq_DMA2_Stream5_IRQHandler, __default_handler + + .weak __irq_DMA2_Stream6_IRQHandler + .globl __irq_DMA2_Stream6_IRQHandler + .set __irq_DMA2_Stream6_IRQHandler, __default_handler + + .weak __irq_DMA2_Stream7_IRQHandler + .globl __irq_DMA2_Stream7_IRQHandler + .set __irq_DMA2_Stream7_IRQHandler, __default_handler + + .weak __irq_USART6_IRQHandler + .globl __irq_USART6_IRQHandler + .set __irq_USART6_IRQHandler, __default_handler + + .weak __irq_I2C3_EV_IRQHandler + .globl __irq_I2C3_EV_IRQHandler + .set __irq_I2C3_EV_IRQHandler, __default_handler + + .weak __irq_I2C3_ER_IRQHandler + .globl __irq_I2C3_ER_IRQHandler + .set __irq_I2C3_ER_IRQHandler, __default_handler + + .weak __irq_OTG_HS_EP1_OUT_IRQHandler + .globl __irq_OTG_HS_EP1_OUT_IRQHandler + .set __irq_OTG_HS_EP1_OUT_IRQHandler, __default_handler + + .weak __irq_OTG_HS_EP1_IN_IRQHandler + .globl __irq_OTG_HS_EP1_IN_IRQHandler + .set __irq_OTG_HS_EP1_IN_IRQHandler, __default_handler + + .weak __irq_OTG_HS_WKUP_IRQHandler + .globl __irq_OTG_HS_WKUP_IRQHandler + .set __irq_OTG_HS_WKUP_IRQHandler, __default_handler + + .weak __irq_OTG_HS_IRQHandler + .globl __irq_OTG_HS_IRQHandler + .set __irq_OTG_HS_IRQHandler, __default_handler + + .weak __irq_DCMI_IRQHandler + .globl __irq_DCMI_IRQHandler + .set __irq_DCMI_IRQHandler, __default_handler + + .weak __irq_CRYP_IRQHandler + .globl __irq_CRYP_IRQHandler + .set __irq_CRYP_IRQHandler, __default_handler + + .weak __irq_HASH_RNG_IRQHandler + .globl __irq_HASH_RNG_IRQHandler + .set __irq_HASH_RNG_IRQHandler, __default_handler + + .weak __irq_FPU_IRQHandler + .globl __irq_FPU_IRQHandler + .set __irq_FPU_IRQHandler, __default_handler diff --git a/STM32F4/variants/generic_f407v/stm32_vector_table.S b/STM32F4/variants/generic_f407v/stm32_vector_table.S new file mode 100644 index 000000000..9f08d6669 --- /dev/null +++ b/STM32F4/variants/generic_f407v/stm32_vector_table.S @@ -0,0 +1,113 @@ +/* STM32 vector table */ + + .section ".stm32.interrupt_vector" + + .globl __stm32_vector_table + .type __stm32_vector_table, %object + +__stm32_vector_table: +/* CM3 core interrupts */ + .long __msp_init + .long __exc_reset + .long __exc_nmi + .long __exc_hardfault + .long __exc_memmanage + .long __exc_busfault + .long __exc_usagefault + .long __stm32reservedexception7 + .long __stm32reservedexception8 + .long __stm32reservedexception9 + .long __stm32reservedexception10 + .long __exc_svc + .long __exc_debug_monitor + .long __stm32reservedexception13 + .long __exc_pendsv + .long __exc_systick +/* Peripheral interrupts */ + .long __irq_wwdg + .long __irq_pvd + .long __irq_tamper + .long __irq_rtc + .long __irq_flash + .long __irq_rcc + .long __irq_exti0 + .long __irq_exti1 + .long __irq_exti2 + .long __irq_exti3 + .long __irq_exti4 + .long __irq_dma1_channel1 + .long __irq_dma1_channel2 + .long __irq_dma1_channel3 + .long __irq_dma1_channel4 + .long __irq_dma1_channel5 + .long __irq_dma1_channel6 + .long __irq_dma1_channel7 + .long __irq_adc + .long __irq_usb_hp_can_tx + .long __irq_usb_lp_can_rx0 + .long __irq_can_rx1 + .long __irq_can_sce + .long __irq_exti9_5 + .long __irq_tim1_brk + .long __irq_tim1_up + .long __irq_tim1_trg_com + .long __irq_tim1_cc + .long __irq_tim2 + .long __irq_tim3 + .long __irq_tim4 + .long __irq_i2c1_ev + .long __irq_i2c1_er + .long __irq_i2c2_ev + .long __irq_i2c2_er + .long __irq_spi1 + .long __irq_spi2 + .long __irq_usart1 + .long __irq_usart2 + .long __irq_usart3 + .long __irq_exti15_10 + .long __irq_rtcalarm + .long __irq_usbwakeup +#if defined (STM32_HIGH_DENSITY) + .long __irq_tim8_brk + .long __irq_tim8_up + .long __irq_tim8_trg_com + .long __irq_tim8_cc + .long __irq_adc3 + .long __irq_fsmc + .long __irq_sdio + .long __irq_tim5 + .long __irq_spi3 + .long __irq_uart4 + .long __irq_uart5 + .long __irq_tim6 + .long __irq_tim7 + .long __irq_dma2_channel1 + .long __irq_dma2_channel2 + .long __irq_dma2_channel3 + .long __irq_dma2_channel4_5 +#endif /* STM32_HIGH_DENSITY */ + + .long __irq_DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .long __irq_ETH_IRQHandler /* Ethernet */ + .long __irq_ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .long __irq_CAN2_TX_IRQHandler /* CAN2 TX */ + .long __irq_CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .long __irq_CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .long __irq_CAN2_SCE_IRQHandler /* CAN2 SCE */ + .long __irq_OTG_FS_IRQHandler /* USB OTG FS */ + .long __irq_DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .long __irq_DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .long __irq_DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .long __irq_USART6_IRQHandler /* USART6 */ + .long __irq_I2C3_EV_IRQHandler /* I2C3 event */ + .long __irq_I2C3_ER_IRQHandler /* I2C3 error */ + .long __irq_OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .long __irq_OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .long __irq_OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .long __irq_OTG_HS_IRQHandler /* USB OTG HS */ + .long __irq_DCMI_IRQHandler /* DCMI */ + .long __irq_CRYP_IRQHandler /* CRYP crypto */ + .long __irq_HASH_RNG_IRQHandler /* Hash and Rng */ + .long __irq_FPU_IRQHandler /* FPU */ + + .size __stm32_vector_table, . - __stm32_vector_table diff --git a/STM32F4/variants/generic_f407v/variant.h b/STM32F4/variants/generic_f407v/variant.h new file mode 100644 index 000000000..cd0a96de4 --- /dev/null +++ b/STM32F4/variants/generic_f407v/variant.h @@ -0,0 +1,21 @@ +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + + +#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) +#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) +#define portOutputRegister(port) ( &(port->regs->ODR) ) +#define portInputRegister(port) ( &(port->regs->IDR) ) + +#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) ) +#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) ) + +#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) ) + +static const uint8_t SS = BOARD_SPI1_NSS_PIN; +static const uint8_t SS1 = BOARD_SPI2_NSS_PIN; +static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; +static const uint8_t MISO = BOARD_SPI1_MISO_PIN; +static const uint8_t SCK = BOARD_SPI1_SCK_PIN; + +#endif /* _VARIANT_ARDUINO_STM32_ */ \ No newline at end of file diff --git a/STM32F4/cores/maple/libmaple/rcc.c b/STM32F4/variants/generic_f407v/wirish/start.S similarity index 54% rename from STM32F4/cores/maple/libmaple/rcc.c rename to STM32F4/variants/generic_f407v/wirish/start.S index b3cb9c5d1..8b181aa99 100644 --- a/STM32F4/cores/maple/libmaple/rcc.c +++ b/STM32F4/variants/generic_f407v/wirish/start.S @@ -1,7 +1,7 @@ /****************************************************************************** * The MIT License * - * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011 LeafLabs, LLC. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -24,14 +24,34 @@ * SOFTWARE. *****************************************************************************/ -/** - * @file rcc.c - * @brief Implements pretty much only the basic clock setup on the - * stm32, clock enable/disable and peripheral reset commands. +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. */ -// #ifdef STM32F2 -// #include "rccF2.c" -// #else -// #include "rccF1.c" -// #endif + .text + .code 16 + .thumb_func + + .globl __start__ + .type __start__, %function +__start__: + .fnstart + ldr r1,=__msp_init + mov sp,r1 + ldr r1,=start_c + bx r1 + .pool + .cantunwind + .fnend diff --git a/STM32F4/variants/generic_f407v/wirish/start_c.c b/STM32F4/variants/generic_f407v/wirish/start_c.c new file mode 100644 index 000000000..655fefb88 --- /dev/null +++ b/STM32F4/variants/generic_f407v/wirish/start_c.c @@ -0,0 +1,95 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * Copyright (c) 2006, 2007 CodeSourcery Inc + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +extern void __libc_init_array(void); + +extern int main(int, char**, char**); + +extern void exit(int) __attribute__((noreturn, weak)); + +/* The linker must ensure that these are at least 4-byte aligned. */ +extern char __data_start__, __data_end__; +extern char __bss_start__, __bss_end__; + +struct rom_img_cfg { + int *img_start; +}; + +extern char _lm_rom_img_cfgp; + +void __attribute__((noreturn)) start_c(void) { + struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; + int *src = img_cfg->img_start; + int *dst = (int*)&__data_start__; + int exit_code; + + /* Initialize .data, if necessary. */ + if (src != dst) { + int *end = (int*)&__data_end__; + while (dst < end) { + *dst++ = *src++; + } + } + + /* Zero .bss. */ + dst = (int*)&__bss_start__; + while (dst < (int*)&__bss_end__) { + *dst++ = 0; + } + + /* Run initializers. */ + __libc_init_array(); + + /* Jump to main. */ + exit_code = main(0, 0, 0); + if (exit) { + exit(exit_code); + } + + /* If exit is NULL, make sure we don't return. */ + for (;;) + continue; +} From 220247c115287b4208407c34ee080d609e5bab0e Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 12 May 2017 20:51:12 +0200 Subject: [PATCH 073/307] bugfix: other variants than generic did not work --- STM32F4/boards.txt | 22 +- STM32F4/cores/maple/libmaple/gpioF4.c | 10 +- STM32F4/cores/maple/wirish_types.h | 4 +- STM32F4/libraries/SPI/src/SPI.h | 1 + .../variants/discovery_f407/discovery_f4.cpp | 287 +++++++++--------- .../variants/discovery_f407/discovery_f4.h | 3 + 6 files changed, 176 insertions(+), 151 deletions(-) diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 04bfd0fd0..8fc143071 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -31,6 +31,12 @@ discovery_f407.build.error_led_port=GPIOD discovery_f407.build.error_led_pin=14 discovery_f407.build.board=STM32DiscoveryF407 +discovery_f407.menu.usb_cfg.usb_nc=USB inactive +discovery_f407.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC +discovery_f407.menu.usb_cfg.usb_serial=USB serial (CDC) +discovery_f407.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB +discovery_f407.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) +discovery_f407.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC ############################################################## generic_f407v.name=Generic STM32F407V series @@ -88,7 +94,7 @@ stm32f4stamp.upload.dfuse_addr=0x8000000 stm32f4stamp.build.mcu=cortex-m4 stm32f4stamp.build.f_cpu=168000000L stm32f4stamp.build.core=maple -stm32f4stamp.build.extra_flags=-DMCU_STM32F406VG -mthumb -DSTM32_HIGH_DENSITY -DSTM32F2 -DSTM32F4 -DBOARD_discovery_f4 +stm32f4stamp.build.extra_flags=-DMCU_STM32F406VG -mthumb -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_discovery_f4 stm32f4stamp.build.ldscript=ld/jtag.ld stm32f4stamp.build.variant=discovery_f407 stm32f4stamp.build.variant_system_lib=lib_f407.a @@ -98,6 +104,12 @@ stm32f4stamp.build.error_led_port=GPIOD stm32f4stamp.build.error_led_pin=14 stm32f4stamp.build.board=STM32F4StampF405 +stm32f4stamp.menu.usb_cfg.usb_nc=USB inactive +stm32f4stamp.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC +stm32f4stamp.menu.usb_cfg.usb_serial=USB serial (CDC) +stm32f4stamp.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB +stm32f4stamp.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) +stm32f4stamp.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC ############################################################## netduino2plus.name=Netduino2 F405 @@ -118,7 +130,7 @@ netduino2plus.upload.dfuse_addr=0x8000000 netduino2plus.build.mcu=cortex-m4 netduino2plus.build.f_cpu=168000000L netduino2plus.build.core=maple -netduino2plus.build.extra_flags=-DMCU_STM32F406VG -mthumb -DSTM32_HIGH_DENSITY -DSTM32F2 -DSTM32F4 -DBOARD_discovery_f4 -DARDUINO_STM32F4_NETDUINO2PLUS +netduino2plus.build.extra_flags=-DMCU_STM32F406VG -mthumb -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_discovery_f4 -DARDUINO_STM32F4_NETDUINO2PLUS netduino2plus.build.ldscript=ld/jtag.ld netduino2plus.build.variant=discovery_f407 netduino2plus.build.variant_system_lib=lib_f407.a @@ -128,5 +140,11 @@ netduino2plus.build.error_led_port=GPIOD netduino2plus.build.error_led_pin=14 netduino2plus.build.board=Netduino2F405 +netduino2plus.menu.usb_cfg.usb_nc=USB inactive +netduino2plus.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC +netduino2plus.menu.usb_cfg.usb_serial=USB serial (CDC) +netduino2plus.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB +netduino2plus.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) +netduino2plus.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC ############################################################## diff --git a/STM32F4/cores/maple/libmaple/gpioF4.c b/STM32F4/cores/maple/libmaple/gpioF4.c index 67d3bea53..af839ebea 100644 --- a/STM32F4/cores/maple/libmaple/gpioF4.c +++ b/STM32F4/cores/maple/libmaple/gpioF4.c @@ -124,14 +124,14 @@ void gpio_init_all(void) { #ifdef ARDUINO_STM32F4_NETDUINO2PLUS // PA8 Output the Master Clock MCO1 - gpio_set_af_mode(GPIOA, 8, 0); - gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_af_mode(PA8, 0); + gpio_set_mode(PA8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); // PB4 as alternate MISO Input - gpio_set_af_mode(GPIOB, 4, 5); + gpio_set_af_mode(PB4, 5); // PA5 as alternate SCK Output - gpio_set_af_mode(GPIOA, 5, 5); + gpio_set_af_mode(PA5, 5); // PA7 as alternate MOSI Output - gpio_set_af_mode(GPIOA, 7, 5); + gpio_set_af_mode(PA7, 5); #endif } diff --git a/STM32F4/cores/maple/wirish_types.h b/STM32F4/cores/maple/wirish_types.h index 6a8c85c3e..de685bf9f 100644 --- a/STM32F4/cores/maple/wirish_types.h +++ b/STM32F4/cores/maple/wirish_types.h @@ -60,13 +60,11 @@ typedef struct stm32_pin_info { #else typedef struct stm32_pin_info { - gpio_dev *gpio_device; /**< Maple pin's GPIO device */ + const gpio_dev *gpio_device; /**< Maple pin's GPIO device */ timer_dev *timer_device; /**< Pin's timer device, if any. */ const adc_dev *adc_device; /**< ADC device, if any. */ - uint8 gpio_bit; /**< Pin's GPIO port bit. */ uint8 timer_channel; /**< Timer channel, or 0 if none. */ uint8 adc_channel; /**< Pin ADC channel, or ADCx if none. */ - uint8 filler; } stm32_pin_info; #endif diff --git a/STM32F4/libraries/SPI/src/SPI.h b/STM32F4/libraries/SPI/src/SPI.h index 218449fb1..cabc0c260 100644 --- a/STM32F4/libraries/SPI/src/SPI.h +++ b/STM32F4/libraries/SPI/src/SPI.h @@ -42,6 +42,7 @@ #include #include +#define SPI_DMA // SPI_HAS_TRANSACTION means SPI has // - beginTransaction() diff --git a/STM32F4/variants/discovery_f407/discovery_f4.cpp b/STM32F4/variants/discovery_f407/discovery_f4.cpp index d97074e5c..74660f0b9 100644 --- a/STM32F4/variants/discovery_f407/discovery_f4.cpp +++ b/STM32F4/variants/discovery_f407/discovery_f4.cpp @@ -34,182 +34,187 @@ #include "discovery_f4.h" -//#include "fsmc.h" -#include "gpio.h" -#include "rcc.h" -#include "timer.h" +#include +#include #include "wirish_types.h" //static void initSRAMChip(void); void boardInit(void) { // remap TIMER8 to PC6-9 - gpio_set_af_mode(GPIOC, 6, 3); - gpio_set_af_mode(GPIOC, 7, 3); - gpio_set_af_mode(GPIOC, 8, 3); - gpio_set_af_mode(GPIOC, 9, 3); + gpio_set_af_mode(PC6, 3); + gpio_set_af_mode(PC7, 3); + gpio_set_af_mode(PC8, 3); + gpio_set_af_mode(PC9, 3); // remap TIMER1 to PE9,11,13,14 - gpio_set_af_mode(GPIOE, 9, 1); - gpio_set_af_mode(GPIOE, 11, 1); - gpio_set_af_mode(GPIOE, 13, 1); - gpio_set_af_mode(GPIOE, 14, 1); + gpio_set_af_mode(PE9, 1); + gpio_set_af_mode(PE11, 1); + gpio_set_af_mode(PE13, 1); + gpio_set_af_mode(PE14, 1); // remap TIMER3 to PB4,5,0,1 - gpio_set_af_mode(GPIOB, 4, 2); - gpio_set_af_mode(GPIOB, 5, 2); - gpio_set_af_mode(GPIOB, 0, 2); - gpio_set_af_mode(GPIOB, 1, 2); + gpio_set_af_mode(PB4, 2); + gpio_set_af_mode(PB5, 2); + gpio_set_af_mode(PB0, 2); + gpio_set_af_mode(PB1, 2); //gpio_set_af_mode(GPIOA, 2, 7); //gpio_set_af_mode(GPIOA, 3, 7); #ifdef ARDUINO_STM32F4_NETDUINO2PLUS // PA8 Output the Master Clock MCO1 - gpio_set_af_mode(GPIOA, 8, 0); + gpio_set_af_mode(PA8, 0); // PB4 as alternate MISO Input - gpio_set_af_mode(GPIOB, 4, 5); + gpio_set_af_mode(PB4, 5); // PA5 as alternate SCK Output - gpio_set_af_mode(GPIOA, 5, 5); + gpio_set_af_mode(PA5, 5); // PA7 as alternate MOSI Output - gpio_set_af_mode(GPIOA, 7, 5); + gpio_set_af_mode(PA7, 5); #endif return; } +extern timer_dev timer1; +extern timer_dev timer2; +extern timer_dev timer3; +extern timer_dev timer4; +extern timer_dev timer5; +extern timer_dev timer6; +extern timer_dev timer7; +extern timer_dev timer8; + #if 0 typedef struct stm32_pin_info { gpio_dev *gpio_device; /**< Maple pin's GPIO device */ timer_dev *timer_device; /**< Pin's timer device, if any. */ const adc_dev *adc_device; /**< ADC device, if any. */ - uint8 gpio_bit; /**< Pin's GPIO port bit. */ uint8 timer_channel; /**< Timer channel, or 0 if none. */ uint8 adc_channel; /**< Pin ADC channel, or ADCx if none. */ } stm32_pin_info; - #endif extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {GPIOA, TIMER5, ADC1, 0, 1, 0}, /* D00/PA0 */ - {GPIOA, TIMER5, ADC1, 1, 2, 1}, /* D01/PA1 */ - {GPIOA, TIMER5, ADC1, 2, 3, 2}, /* D02/PA2 */ - {GPIOA, TIMER5, ADC1, 3, 4, 3}, /* D03/PA3 */ - {GPIOA, NULL, ADC1, 4, 0, 4}, /* D04/PA4 */ - {GPIOA, NULL, ADC1, 5, 0, 5}, /* D05/PA5 */ - {GPIOA, NULL, ADC1, 6, 1, 6}, /* D06/PA6 */ // ala check TIMER3 - {GPIOA, NULL, ADC1, 7, 0, 7}, /* D07/PA7 */ - {GPIOA, NULL, NULL, 8, 0, ADCx}, /* D08/PA8 */ // remap out - {GPIOA, NULL, NULL, 9, 0, ADCx}, /* D09/PA9 */ // remap out - {GPIOA, NULL, NULL, 10, 0, ADCx}, /* D10/PA10 */ // remap out - {GPIOA, NULL, NULL, 11, 0, ADCx}, /* D11/PA11 */ // remap out - {GPIOA, NULL, NULL, 12, 0, ADCx}, /* D12/PA12 */ - {GPIOA, NULL, NULL, 13, 0, ADCx}, /* D13/PA13 */ - {GPIOA, NULL, NULL, 14, 0, ADCx}, /* D14/PA14 */ - {GPIOA, TIMER2, NULL, 15, 1, ADCx}, /* D15/PA15 */ // remap in - - {GPIOB, TIMER3, ADC1, 0, 3, 8}, /* D16/PB0 */ - {GPIOB, TIMER3, ADC1, 1, 4, 9}, /* D17/PB1 */ - {GPIOB, NULL, NULL, 2, 0, ADCx}, /* D18/PB2 */ - {GPIOB, TIMER2, NULL, 3, 2, ADCx}, /* D19/PB3 */ // remap in - {GPIOB, TIMER3, NULL, 4, 1, ADCx}, /* D20/PB4 */ // remap in - {GPIOB, TIMER3, NULL, 5, 2, ADCx}, /* D21/PB5 */ // remap in - {GPIOB, NULL, NULL, 6, 0, ADCx}, /* D22/PB6 */ // remap out - {GPIOB, NULL, NULL, 7, 0, ADCx}, /* D23/PB7 */ // remap out - {GPIOB, NULL, NULL, 8, 0, ADCx}, /* D24/PB8 */ // remap out - {GPIOB, NULL, NULL, 9, 0, ADCx}, /* D25/PB9 */ // remap out - {GPIOB, NULL, NULL, 10, 0, ADCx}, /* D26/PB10 */ - {GPIOB, NULL, NULL, 11, 0, ADCx}, /* D27/PB11 */ - {GPIOB, NULL, NULL, 12, 0, ADCx}, /* D28/PB12 */ - {GPIOB, NULL, NULL, 13, 0, ADCx}, /* D29/PB13 */ - {GPIOB, NULL, NULL, 14, 0, ADCx}, /* D30/PB14 */ - {GPIOB, NULL, NULL, 15, 0, ADCx}, /* D31/PB15 */ - - {GPIOC, NULL, ADC1, 0, 0, 10}, /* D32/PC0 */ - {GPIOC, NULL, ADC1, 1, 0, 11}, /* D33/PC1 */ - {GPIOC, NULL, ADC1, 2, 0, 12}, /* D34/PC2 */ - {GPIOC, NULL, ADC1, 3, 0, 13}, /* D35/PC3 */ - {GPIOC, NULL, ADC1, 4, 0, 14}, /* D36/PC4 */ - {GPIOC, NULL, ADC1, 5, 0, 15}, /* D37/PC5 */ - {GPIOC, TIMER8, NULL, 6, 1, ADCx}, /* D38/PC6 */ - {GPIOC, TIMER8, NULL, 7, 2, ADCx}, /* D39/PC7 */ - {GPIOC, TIMER8, NULL, 8, 3, ADCx}, /* D40/PC8 */ - {GPIOC, TIMER8, NULL, 9, 4, ADCx}, /* D41/PC9 */ - {GPIOC, NULL, NULL, 10, 0, ADCx}, /* D42/PC10 */ - {GPIOC, NULL, NULL, 11, 0, ADCx}, /* D43/PC11 */ - {GPIOC, NULL, NULL, 12, 0, ADCx}, /* D44/PC12 */ - {GPIOC, NULL, NULL, 13, 0, ADCx}, /* D45/PC13 */ - {GPIOC, NULL, NULL, 14, 0, ADCx}, /* D46/PC14 */ - {GPIOC, NULL, NULL, 15, 0, ADCx}, /* D47/PC15 */ - - {GPIOD, NULL, NULL, 0, 0, ADCx}, /* D48/PD0 */ - {GPIOD, NULL, NULL, 1, 0, ADCx}, /* D49/PD1 */ - {GPIOD, NULL, NULL, 2, 0, ADCx}, /* D50/PD2 */ - {GPIOD, NULL, NULL, 3, 0, ADCx}, /* D51/PD3 */ - {GPIOD, NULL, NULL, 4, 0, ADCx}, /* D52/PD4 */ - {GPIOD, NULL, NULL, 5, 0, ADCx}, /* D53/PD5 */ - {GPIOD, NULL, NULL, 6, 0, ADCx}, /* D54/PD6 */ - {GPIOD, NULL, NULL, 7, 0, ADCx}, /* D55/PD7 */ - {GPIOD, NULL, NULL, 8, 0, ADCx}, /* D56/PD8 */ - {GPIOD, NULL, NULL, 9, 0, ADCx}, /* D57/PD9 */ - {GPIOD, NULL, NULL, 10, 0, ADCx}, /* D58/PD10 */ - {GPIOD, NULL, NULL, 11, 0, ADCx}, /* D59/PD11 */ - {GPIOD, TIMER4, NULL, 12, 1, ADCx}, /* D60/PD12 */ // remap in - {GPIOD, TIMER4, NULL, 13, 2, ADCx}, /* D61/PD13 */ // remap in - {GPIOD, TIMER4, NULL, 14, 3, ADCx}, /* D62/PD14 */ // remap in - {GPIOD, TIMER4, NULL, 15, 4, ADCx}, /* D63/PD15 */ // remap in - - {GPIOE, NULL, NULL, 0, 0, ADCx}, /* D64/PE0 */ - {GPIOE, NULL, NULL, 1, 0, ADCx}, /* D65/PE1 */ - {GPIOE, NULL, NULL, 2, 0, ADCx}, /* D66/PE2 */ - {GPIOE, NULL, NULL, 3, 0, ADCx}, /* D67/PE3 */ - {GPIOE, NULL, NULL, 4, 0, ADCx}, /* D68/PE4 */ - {GPIOE, NULL, NULL, 5, 0, ADCx}, /* D69/PE5 */ - {GPIOE, NULL, NULL, 6, 0, ADCx}, /* D70/PE6 */ - {GPIOE, NULL, NULL, 7, 0, ADCx}, /* D71/PE7 */ - {GPIOE, NULL, NULL, 8, 0, ADCx}, /* D72/PE8 */ - {GPIOE, TIMER1, NULL, 9, 1, ADCx}, /* D73/PE9 */ // remap in - {GPIOE, NULL, NULL, 10, 0, ADCx}, /* D74/PE10 */ - {GPIOE, TIMER1, NULL, 11, 2, ADCx}, /* D75/PE11 */ // remap in - {GPIOE, NULL, NULL, 12, 0, ADCx}, /* D76/PE12 */ - {GPIOE, TIMER1, NULL, 13, 3, ADCx}, /* D77/PE13 */ // remap in - {GPIOE, TIMER1, NULL, 14, 4, ADCx}, /* D78/PE14 */ // remap in - {GPIOE, NULL, NULL, 15, 0, ADCx}, /* D79/PE15 */ - - {GPIOF, NULL, NULL, 0, 0, ADCx}, /* D80/PF0 */ - {GPIOF, NULL, NULL, 1, 0, ADCx}, /* D81/PF1 */ - {GPIOF, NULL, NULL, 2, 0, ADCx}, /* D82/PF2 */ - {GPIOF, NULL, NULL, 3, 0, ADCx}, /* D83/PF3 */ - {GPIOF, NULL, NULL, 4, 0, ADCx}, /* D84/PF4 */ - {GPIOF, NULL, NULL, 5, 0, ADCx}, /* D85/PF5 */ - {GPIOF, NULL, NULL, 6, 0, ADCx}, /* D86/PF6 */ - {GPIOF, NULL, NULL, 7, 0, ADCx}, /* D87/PF7 */ - {GPIOF, NULL, NULL, 8, 0, ADCx}, /* D88/PF8 */ - {GPIOF, NULL, NULL, 9, 0, ADCx}, /* D89/PF9 */ - {GPIOF, NULL, NULL, 10, 0, ADCx}, /* D90/PF10 */ - {GPIOF, NULL, NULL, 11, 0, ADCx}, /* D91/PF11 */ - {GPIOF, NULL, NULL, 12, 0, ADCx}, /* D92/PF12 */ - {GPIOF, NULL, NULL, 13, 0, ADCx}, /* D93/PF13 */ - {GPIOF, NULL, NULL, 14, 0, ADCx}, /* D94/PF14 */ - {GPIOF, NULL, NULL, 15, 0, ADCx}, /* D95/PF15 */ - - {GPIOG, NULL, NULL, 0, 0, ADCx}, /* D96/PG0 */ - {GPIOG, NULL, NULL, 1, 0, ADCx}, /* D97/PG1 */ - {GPIOG, NULL, NULL, 2, 0, ADCx}, /* D98/PG2 */ - {GPIOG, NULL, NULL, 3, 0, ADCx}, /* D99/PG3 */ - {GPIOG, NULL, NULL, 4, 0, ADCx}, /* D100/PG4 */ - {GPIOG, NULL, NULL, 5, 0, ADCx}, /* D101/PG5 */ - {GPIOG, NULL, NULL, 6, 0, ADCx}, /* D102/PG6 */ - {GPIOG, NULL, NULL, 7, 0, ADCx}, /* D103/PG7 */ - {GPIOG, NULL, NULL, 8, 0, ADCx}, /* D104/PG8 */ - {GPIOG, NULL, NULL, 9, 0, ADCx}, /* D105/PG9 */ - {GPIOG, NULL, NULL, 10, 0, ADCx}, /* D106/PG10 */ - {GPIOG, NULL, NULL, 11, 0, ADCx}, /* D107/PG11 */ - {GPIOG, NULL, NULL, 12, 0, ADCx}, /* D108/PG12 */ - {GPIOG, NULL, NULL, 13, 0, ADCx}, /* D109/PG13 */ - {GPIOG, NULL, NULL, 14, 0, ADCx}, /* D110/PG14 */ - {GPIOG, NULL, NULL, 15, 0, ADCx} /* D111/PG15 */ - + {&GPIOA, &timer5, &ADC1, 1, 0}, /* D00/PA0 */ + {&GPIOA, &timer5, &ADC1, 2, 1}, /* D01/PA1 */ + {&GPIOA, &timer5, &ADC1, 3, 2}, /* D02/PA2 */ + {&GPIOA, &timer5, &ADC1, 4, 3}, /* D03/PA3 */ + {&GPIOA, NULL, &ADC1, 0, 4}, /* D04/PA4 */ + {&GPIOA, NULL, &ADC1, 0, 5}, /* D05/PA5 */ + {&GPIOA, NULL, &ADC1, 1, 6}, /* D06/PA6 */ // ala check TIMER3 + {&GPIOA, NULL, &ADC1, 0, 7}, /* D07/PA7 */ + {&GPIOA, NULL, NULL, 0, ADCx}, /* D08/PA8 */ // remap out + {&GPIOA, NULL, NULL, 0, ADCx}, /* D09/PA9 */ // remap out + {&GPIOA, NULL, NULL, 0, ADCx}, /* D10/PA10 */ // remap out + {&GPIOA, NULL, NULL, 0, ADCx}, /* D11/PA11 */ // remap out + {&GPIOA, NULL, NULL, 0, ADCx}, /* D12/PA12 */ + {&GPIOA, NULL, NULL, 0, ADCx}, /* D13/PA13 */ + {&GPIOA, NULL, NULL, 0, ADCx}, /* D14/PA14 */ + {&GPIOA, &timer2, NULL, 1, ADCx}, /* D15/PA15 */ // remap in + + {&GPIOB, &timer3, &ADC1, 3, 8}, /* D16/PB0 */ + {&GPIOB, &timer3, &ADC1, 4, 9}, /* D17/PB1 */ + {&GPIOB, NULL, NULL, 0, ADCx}, /* D18/PB2 */ + {&GPIOB, &timer2, NULL, 2, ADCx}, /* D19/PB3 */ // remap in + {&GPIOB, &timer3, NULL, 1, ADCx}, /* D20/PB4 */ // remap in + {&GPIOB, &timer3, NULL, 2, ADCx}, /* D21/PB5 */ // remap in + {&GPIOB, NULL, NULL, 0, ADCx}, /* D22/PB6 */ // remap out + {&GPIOB, NULL, NULL, 0, ADCx}, /* D23/PB7 */ // remap out + {&GPIOB, NULL, NULL, 0, ADCx}, /* D24/PB8 */ // remap out + {&GPIOB, NULL, NULL, 0, ADCx}, /* D25/PB9 */ // remap out + {&GPIOB, NULL, NULL, 0, ADCx}, /* D26/PB10 */ + {&GPIOB, NULL, NULL, 0, ADCx}, /* D27/PB11 */ + {&GPIOB, NULL, NULL, 0, ADCx}, /* D28/PB12 */ + {&GPIOB, NULL, NULL, 0, ADCx}, /* D29/PB13 */ + {&GPIOB, NULL, NULL, 0, ADCx}, /* D30/PB14 */ + {&GPIOB, NULL, NULL, 0, ADCx}, /* D31/PB15 */ + + {&GPIOC, NULL, &ADC1, 0, 10}, /* D32/PC0 */ + {&GPIOC, NULL, &ADC1, 0, 11}, /* D33/PC1 */ + {&GPIOC, NULL, &ADC1, 0, 12}, /* D34/PC2 */ + {&GPIOC, NULL, &ADC1, 0, 13}, /* D35/PC3 */ + {&GPIOC, NULL, &ADC1, 0, 14}, /* D36/PC4 */ + {&GPIOC, NULL, &ADC1, 0, 15}, /* D37/PC5 */ + {&GPIOC, &timer8, NULL, 1, ADCx}, /* D38/PC6 */ + {&GPIOC, &timer8, NULL, 2, ADCx}, /* D39/PC7 */ + {&GPIOC, &timer8, NULL, 3, ADCx}, /* D40/PC8 */ + {&GPIOC, &timer8, NULL, 4, ADCx}, /* D41/PC9 */ + {&GPIOC, NULL, NULL, 0, ADCx}, /* D42/PC10 */ + {&GPIOC, NULL, NULL, 0, ADCx}, /* D43/PC11 */ + {&GPIOC, NULL, NULL, 0, ADCx}, /* D44/PC12 */ + {&GPIOC, NULL, NULL, 0, ADCx}, /* D45/PC13 */ + {&GPIOC, NULL, NULL, 0, ADCx}, /* D46/PC14 */ + {&GPIOC, NULL, NULL, 0, ADCx}, /* D47/PC15 */ + + {&GPIOD, NULL, NULL, 0, ADCx}, /* D48/PD0 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D49/PD1 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D50/PD2 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D51/PD3 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D52/PD4 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D53/PD5 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D54/PD6 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D55/PD7 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D56/PD8 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D57/PD9 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D58/PD10 */ + {&GPIOD, NULL, NULL, 0, ADCx}, /* D59/PD11 */ + {&GPIOD, &timer4, NULL, 1, ADCx}, /* D60/PD12 */ // remap in + {&GPIOD, &timer4, NULL, 2, ADCx}, /* D61/PD13 */ // remap in + {&GPIOD, &timer4, NULL, 3, ADCx}, /* D62/PD14 */ // remap in + {&GPIOD, &timer4, NULL, 4, ADCx}, /* D63/PD15 */ // remap in + + {&GPIOE, NULL, NULL, 0, ADCx}, /* D64/PE0 */ + {&GPIOE, NULL, NULL, 0, ADCx}, /* D65/PE1 */ + {&GPIOE, NULL, NULL, 0, ADCx}, /* D66/PE2 */ + {&GPIOE, NULL, NULL, 0, ADCx}, /* D67/PE3 */ + {&GPIOE, NULL, NULL, 0, ADCx}, /* D68/PE4 */ + {&GPIOE, NULL, NULL, 0, ADCx}, /* D69/PE5 */ + {&GPIOE, NULL, NULL, 0, ADCx}, /* D70/PE6 */ + {&GPIOE, NULL, NULL, 0, ADCx}, /* D71/PE7 */ + {&GPIOE, NULL, NULL, 0, ADCx}, /* D72/PE8 */ + {&GPIOE, &timer1, NULL, 1, ADCx}, /* D73/PE9 */ // remap in + {&GPIOE, NULL, NULL, 0, ADCx}, /* D74/PE10 */ + {&GPIOE, &timer1, NULL, 2, ADCx}, /* D75/PE11 */ // remap in + {&GPIOE, NULL, NULL, 0, ADCx}, /* D76/PE12 */ + {&GPIOE, &timer1, NULL, 3, ADCx}, /* D77/PE13 */ // remap in + {&GPIOE, &timer1, NULL, 4, ADCx}, /* D78/PE14 */ // remap in + {&GPIOE, NULL, NULL, 0, ADCx}, /* D79/PE15 */ +#if 0 // not available on LQFP100 package + {&GPIOF, NULL, NULL, 0, ADCx}, /* D80/PF0 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D81/PF1 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D82/PF2 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D83/PF3 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D84/PF4 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D85/PF5 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D86/PF6 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D87/PF7 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D88/PF8 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D89/PF9 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D90/PF10 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D91/PF11 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D92/PF12 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D93/PF13 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D94/PF14 */ + {&GPIOF, NULL, NULL, 0, ADCx}, /* D95/PF15 */ + + {&GPIOG, NULL, NULL, 0, ADCx}, /* D96/PG0 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D97/PG1 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D98/PG2 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D99/PG3 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D100/PG4 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D101/PG5 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D102/PG6 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D103/PG7 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D104/PG8 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D105/PG9 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D106/PG10 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D107/PG11 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D108/PG12 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D109/PG13 */ + {&GPIOG, NULL, NULL, 0, ADCx}, /* D110/PG14 */ + {&GPIOG, NULL, NULL, 0, ADCx} /* D111/PG15 */ +#endif // not available on LQFP100 package }; extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F4/variants/discovery_f407/discovery_f4.h b/STM32F4/variants/discovery_f407/discovery_f4.h index 750175289..e3fa0466a 100644 --- a/STM32F4/variants/discovery_f407/discovery_f4.h +++ b/STM32F4/variants/discovery_f407/discovery_f4.h @@ -50,6 +50,9 @@ #define BOARD_LED_PIN Port2Pin('D', 12) #define BOARD_BUTTON_PIN Port2Pin('A', 0) +#define BOARD_USB_DM_PIN PA11 +#define BOARD_USB_DP_PIN PA12 + #define BOARD_NR_USARTS 5 #define BOARD_USART1_TX_PIN Port2Pin('A', 9) #define BOARD_USART1_RX_PIN Port2Pin('A',10) From 97329efca32eb20b01047c0afdfba6eea877b5da Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sat, 13 May 2017 10:27:33 +0200 Subject: [PATCH 074/307] push the generic_f4 branch to master --- STM32F1/libraries/SPI/src/SPI.cpp | 9 +- STM32F4/boards.txt | 61 +- STM32F4/cores/maple/Arduino.h | 6 - STM32F4/cores/maple/Client.h | 5 +- STM32F4/cores/maple/HardwareTimer.h | 2 +- STM32F4/cores/maple/IPAddress.h | 4 +- STM32F4/cores/maple/Server.h | 4 +- STM32F4/cores/maple/Stream.h | 4 +- STM32F4/cores/maple/Udp.h | 4 +- STM32F4/cores/maple/WProgram.h | 7 +- STM32F4/cores/maple/WString.h | 7 +- STM32F4/cores/maple/bits.h | 5 + STM32F4/cores/maple/boards.cpp | 32 +- STM32F4/cores/maple/boards.h | 39 +- STM32F4/cores/maple/ext_interrupts.cpp | 8 +- STM32F4/cores/maple/ext_interrupts.h | 9 +- STM32F4/cores/maple/io.h | 13 +- STM32F4/cores/maple/itoa.h | 4 +- STM32F4/cores/maple/libmaple/HardwareSPI.cpp | 424 ------------- STM32F4/cores/maple/libmaple/HardwareSPI.h | 279 --------- .../cores/maple/libmaple/HardwareSerial.cpp | 30 +- STM32F4/cores/maple/libmaple/HardwareSerial.h | 2 +- STM32F4/cores/maple/libmaple/adc.c | 33 +- STM32F4/cores/maple/libmaple/adc.h | 54 +- STM32F4/cores/maple/libmaple/dac.c | 4 +- STM32F4/cores/maple/libmaple/dma.h | 7 +- STM32F4/cores/maple/libmaple/dmaF1.c | 383 ------------ STM32F4/cores/maple/libmaple/dmaF1.h | 453 -------------- .../cores/maple/libmaple/{dmaF2.c => dmaF4.c} | 39 +- .../cores/maple/libmaple/{dmaF2.h => dmaF4.h} | 72 ++- STM32F4/cores/maple/libmaple/exti.h | 4 - STM32F4/cores/maple/libmaple/fsmc.c | 53 +- STM32F4/cores/maple/libmaple/gpio.h | 102 +++- STM32F4/cores/maple/libmaple/gpioF1.c | 200 ------ STM32F4/cores/maple/libmaple/gpioF1.h | 530 ---------------- .../maple/libmaple/{gpioF2.c => gpioF4.c} | 89 ++- .../maple/libmaple/{gpioF2.h => gpio_def.h} | 90 +-- STM32F4/cores/maple/libmaple/i2c.c | 40 +- STM32F4/cores/maple/libmaple/i2c.h | 2 +- STM32F4/cores/maple/libmaple/libmaple.h | 14 +- STM32F4/cores/maple/libmaple/libmaple_types.h | 15 +- STM32F4/cores/maple/libmaple/rcc.h | 7 +- STM32F4/cores/maple/libmaple/rccF1.c | 233 ------- STM32F4/cores/maple/libmaple/rccF1.h | 572 ------------------ .../cores/maple/libmaple/{rccF2.c => rccF4.c} | 7 +- .../cores/maple/libmaple/{rccF2.h => rccF4.h} | 0 STM32F4/cores/maple/libmaple/rules.mk | 22 - STM32F4/cores/maple/libmaple/spi.c | 39 +- STM32F4/cores/maple/libmaple/spi.h | 19 +- STM32F4/cores/maple/libmaple/spiF4.h | 15 +- STM32F4/cores/maple/libmaple/spi_f4.c | 26 +- STM32F4/cores/maple/libmaple/stm32.h | 63 +- STM32F4/cores/maple/libmaple/timer.c | 16 +- STM32F4/cores/maple/libmaple/timer.h | 19 +- STM32F4/cores/maple/libmaple/usart.h | 6 +- .../Class/audio/inc/usbd_audio_core.h | 2 +- .../Class/cdc/inc/usbd_cdc_core.h | 3 +- .../Class/cdc/src/usbd_cdc_core.c | 7 +- .../Core/inc/usbd_core.h | 4 +- .../Core/inc/usbd_def.h | 2 +- .../Core/inc/usbd_req.h | 2 +- .../Core/src/usbd_core.c | 10 +- .../Core/src/usbd_ioreq.c | 2 +- .../Core/src/usbd_req.c | 6 +- .../usbF4/STM32_USB_OTG_Driver/inc/usb_core.h | 2 +- .../STM32_USB_OTG_Driver/inc/usb_defines.h | 2 +- .../usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h | 1 + .../usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h | 4 +- .../usbF4/STM32_USB_OTG_Driver/src/usb_core.c | 4 +- .../usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c | 4 +- .../STM32_USB_OTG_Driver/src/usb_dcd_int.c | 4 +- .../cores/maple/libmaple/usbF4/VCP/core_cm4.h | 2 +- STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c | 2 +- .../cores/maple/libmaple/usbF4/VCP/usb_bsp.c | 22 +- .../cores/maple/libmaple/usbF4/VCP/usb_conf.h | 4 + .../maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c | 2 +- .../maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h | 2 +- .../maple/libmaple/usbF4/VCP/usbd_conf.h | 1 + .../maple/libmaple/usbF4/VCP/usbd_desc.c | 6 +- .../maple/libmaple/usbF4/VCP/usbd_desc.h | 2 +- .../cores/maple/libmaple/usbF4/VCP/usbd_usr.c | 4 +- STM32F4/cores/maple/libmaple/usbF4/usb.c | 33 +- STM32F4/cores/maple/libmaple/usbF4/usb.h | 2 +- STM32F4/cores/maple/libmaple/util.c | 6 +- STM32F4/cores/maple/libmaple/util.h | 5 +- STM32F4/cores/maple/pwm.cpp | 4 +- STM32F4/cores/maple/usb_serial.cpp | 6 +- STM32F4/cores/maple/usb_serial.h | 15 +- STM32F4/cores/maple/wirish.h | 15 +- STM32F4/cores/maple/wirish_analog.cpp | 2 - STM32F4/cores/maple/wirish_constants.h | 4 +- STM32F4/cores/maple/wirish_debug.h | 7 +- STM32F4/cores/maple/wirish_digital.cpp | 31 +- STM32F4/cores/maple/wirish_math.h | 4 +- STM32F4/cores/maple/wirish_time.cpp | 6 +- STM32F4/cores/maple/wirish_time.h | 5 +- STM32F4/cores/maple/wirish_types.h | 27 +- STM32F4/libraries/SPI/library.properties | 1 + STM32F4/libraries/SPI/src/SPI.cpp | 518 ++++++++-------- STM32F4/libraries/SPI/src/SPI.h | 158 ++--- STM32F4/platform.txt | 20 +- .../gpio.c => system/libmaple/Arduino.h} | 30 +- .../variants/generic_f407v/generic_f407v.cpp | 81 +++ .../variants/generic_f407v/generic_f407v.h | 163 +++++ STM32F4/variants/generic_f407v/ld/common.inc | 219 +++++++ .../variants/generic_f407v/ld/extra_libs.inc | 7 + STM32F4/variants/generic_f407v/ld/flash.ld | 20 + STM32F4/variants/generic_f407v/ld/jtag.ld | 20 + STM32F4/variants/generic_f407v/ld/names.inc | 78 +++ STM32F4/variants/generic_f407v/ld/ram.ld | 19 + .../generic_f407v/ld/vector_symbols.inc | 78 +++ STM32F4/variants/generic_f407v/pin_map.c | 210 +++++++ STM32F4/variants/generic_f407v/pins_arduino.h | 6 + STM32F4/variants/generic_f407v/stm32_isrs.S | 323 ++++++++++ .../generic_f407v/stm32_vector_table.S | 113 ++++ STM32F4/variants/generic_f407v/variant.h | 21 + .../generic_f407v/wirish/start.S} | 40 +- .../variants/generic_f407v/wirish/start_c.c | 95 +++ 118 files changed, 2577 insertions(+), 4107 deletions(-) delete mode 100644 STM32F4/cores/maple/Arduino.h delete mode 100644 STM32F4/cores/maple/libmaple/HardwareSPI.cpp delete mode 100644 STM32F4/cores/maple/libmaple/HardwareSPI.h delete mode 100644 STM32F4/cores/maple/libmaple/dmaF1.c delete mode 100644 STM32F4/cores/maple/libmaple/dmaF1.h rename STM32F4/cores/maple/libmaple/{dmaF2.c => dmaF4.c} (91%) rename STM32F4/cores/maple/libmaple/{dmaF2.h => dmaF4.h} (74%) delete mode 100644 STM32F4/cores/maple/libmaple/gpioF1.c delete mode 100644 STM32F4/cores/maple/libmaple/gpioF1.h rename STM32F4/cores/maple/libmaple/{gpioF2.c => gpioF4.c} (75%) rename STM32F4/cores/maple/libmaple/{gpioF2.h => gpio_def.h} (90%) delete mode 100644 STM32F4/cores/maple/libmaple/rccF1.c delete mode 100644 STM32F4/cores/maple/libmaple/rccF1.h rename STM32F4/cores/maple/libmaple/{rccF2.c => rccF4.c} (99%) rename STM32F4/cores/maple/libmaple/{rccF2.h => rccF4.h} (100%) rename STM32F4/{cores/maple/libmaple/gpio.c => system/libmaple/Arduino.h} (79%) create mode 100644 STM32F4/variants/generic_f407v/generic_f407v.cpp create mode 100644 STM32F4/variants/generic_f407v/generic_f407v.h create mode 100644 STM32F4/variants/generic_f407v/ld/common.inc create mode 100644 STM32F4/variants/generic_f407v/ld/extra_libs.inc create mode 100644 STM32F4/variants/generic_f407v/ld/flash.ld create mode 100644 STM32F4/variants/generic_f407v/ld/jtag.ld create mode 100644 STM32F4/variants/generic_f407v/ld/names.inc create mode 100644 STM32F4/variants/generic_f407v/ld/ram.ld create mode 100644 STM32F4/variants/generic_f407v/ld/vector_symbols.inc create mode 100644 STM32F4/variants/generic_f407v/pin_map.c create mode 100644 STM32F4/variants/generic_f407v/pins_arduino.h create mode 100644 STM32F4/variants/generic_f407v/stm32_isrs.S create mode 100644 STM32F4/variants/generic_f407v/stm32_vector_table.S create mode 100644 STM32F4/variants/generic_f407v/variant.h rename STM32F4/{cores/maple/libmaple/rcc.c => variants/generic_f407v/wirish/start.S} (54%) create mode 100644 STM32F4/variants/generic_f407v/wirish/start_c.c diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 45ee25ab4..34c810234 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -391,11 +391,11 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length spi_rx_dma_enable(_currentSetting->spi_d); dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA + receiveBuf, dma_bit_size, (DMA_MINC_MODE));// receive buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); // TX - uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM); spi_tx_dma_enable(_currentSetting->spi_d); if ( transmitBuf==0 ) { static uint8_t ff = 0XFF; @@ -407,13 +407,13 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit uint32_t m = millis(); while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." @@ -443,14 +443,13 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit -// while (dma1_ch3_Active); uint32_t m = millis(); while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 7577d1949..8fc143071 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -1,5 +1,7 @@ # +menu.usb_cfg=USB configuration + ############################################################## discovery_f407.name=STM32 Discovery F407 @@ -29,6 +31,49 @@ discovery_f407.build.error_led_port=GPIOD discovery_f407.build.error_led_pin=14 discovery_f407.build.board=STM32DiscoveryF407 +discovery_f407.menu.usb_cfg.usb_nc=USB inactive +discovery_f407.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC +discovery_f407.menu.usb_cfg.usb_serial=USB serial (CDC) +discovery_f407.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB +discovery_f407.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) +discovery_f407.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC +############################################################## +generic_f407v.name=Generic STM32F407V series + +generic_f407v.upload.tool=stlink_upload +generic_f407v.upload.protocol=stlink + +generic_f407v.upload.file_type=bin +generic_f407v.upload.ram.maximum_size=131072 +generic_f407v.upload.flash.maximum_size=514288 +generic_f407v.upload.maximum_size=514288 + +#generic_f407v.upload.usbID=0483:3748 +#generic_f407v.upload.altID=1 +#generic_f407v.upload.auto_reset=true + +generic_f407v.build.mcu=cortex-m4 +generic_f407v.build.f_cpu=168000000L +generic_f407v.build.core=maple +generic_f407v.build.extra_flags=-mthumb -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_generic_f407v +generic_f407v.build.ldscript=ld/jtag.ld +generic_f407v.build.variant=generic_f407v +generic_f407v.build.variant_system_lib=lib_f407.a +generic_f407v.build.vect=VECT_TAB_BASE +generic_f407v.build.density=STM32_HIGH_DENSITY +generic_f407v.build.error_led_port=GPIOA +generic_f407v.build.error_led_pin=7 +generic_f407v.build.board=STM32GenericF407VET6 + +generic_f407v.menu.usb_cfg.usb_nc=USB inactive +generic_f407v.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC + +generic_f407v.menu.usb_cfg.usb_serial=USB serial (CDC) +generic_f407v.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB + +generic_f407v.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) +generic_f407v.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC + ############################################################## stm32f4stamp.name=STM32F4Stamp F405 @@ -49,7 +94,7 @@ stm32f4stamp.upload.dfuse_addr=0x8000000 stm32f4stamp.build.mcu=cortex-m4 stm32f4stamp.build.f_cpu=168000000L stm32f4stamp.build.core=maple -stm32f4stamp.build.extra_flags=-DMCU_STM32F406VG -mthumb -DSTM32_HIGH_DENSITY -DSTM32F2 -DSTM32F4 -DBOARD_discovery_f4 +stm32f4stamp.build.extra_flags=-DMCU_STM32F406VG -mthumb -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_discovery_f4 stm32f4stamp.build.ldscript=ld/jtag.ld stm32f4stamp.build.variant=discovery_f407 stm32f4stamp.build.variant_system_lib=lib_f407.a @@ -59,6 +104,12 @@ stm32f4stamp.build.error_led_port=GPIOD stm32f4stamp.build.error_led_pin=14 stm32f4stamp.build.board=STM32F4StampF405 +stm32f4stamp.menu.usb_cfg.usb_nc=USB inactive +stm32f4stamp.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC +stm32f4stamp.menu.usb_cfg.usb_serial=USB serial (CDC) +stm32f4stamp.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB +stm32f4stamp.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) +stm32f4stamp.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC ############################################################## netduino2plus.name=Netduino2 F405 @@ -79,7 +130,7 @@ netduino2plus.upload.dfuse_addr=0x8000000 netduino2plus.build.mcu=cortex-m4 netduino2plus.build.f_cpu=168000000L netduino2plus.build.core=maple -netduino2plus.build.extra_flags=-DMCU_STM32F406VG -mthumb -DSTM32_HIGH_DENSITY -DSTM32F2 -DSTM32F4 -DBOARD_discovery_f4 -DARDUINO_STM32F4_NETDUINO2PLUS +netduino2plus.build.extra_flags=-DMCU_STM32F406VG -mthumb -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_discovery_f4 -DARDUINO_STM32F4_NETDUINO2PLUS netduino2plus.build.ldscript=ld/jtag.ld netduino2plus.build.variant=discovery_f407 netduino2plus.build.variant_system_lib=lib_f407.a @@ -89,5 +140,11 @@ netduino2plus.build.error_led_port=GPIOD netduino2plus.build.error_led_pin=14 netduino2plus.build.board=Netduino2F405 +netduino2plus.menu.usb_cfg.usb_nc=USB inactive +netduino2plus.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC +netduino2plus.menu.usb_cfg.usb_serial=USB serial (CDC) +netduino2plus.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB +netduino2plus.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) +netduino2plus.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC ############################################################## diff --git a/STM32F4/cores/maple/Arduino.h b/STM32F4/cores/maple/Arduino.h deleted file mode 100644 index d02a50cba..000000000 --- a/STM32F4/cores/maple/Arduino.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef Arduino_h -#define Arduino_h -#include "WProgram.h" -#endif - -#include "variant.h" diff --git a/STM32F4/cores/maple/Client.h b/STM32F4/cores/maple/Client.h index b8e5d935f..57bedb8e0 100644 --- a/STM32F4/cores/maple/Client.h +++ b/STM32F4/cores/maple/Client.h @@ -17,8 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef client_h -#define client_h +#ifndef _CLIENT_H_ +#define _CLIENT_H_ + #include "Print.h" #include "Stream.h" #include "IPAddress.h" diff --git a/STM32F4/cores/maple/HardwareTimer.h b/STM32F4/cores/maple/HardwareTimer.h index 89e356499..c90356bf6 100644 --- a/STM32F4/cores/maple/HardwareTimer.h +++ b/STM32F4/cores/maple/HardwareTimer.h @@ -33,7 +33,7 @@ // TODO [0.1.0] Remove deprecated pieces, pick a better API -#include "timer.h" +#include /** Timer mode. */ typedef timer_mode TimerMode; diff --git a/STM32F4/cores/maple/IPAddress.h b/STM32F4/cores/maple/IPAddress.h index 271b24025..c6e06972a 100644 --- a/STM32F4/cores/maple/IPAddress.h +++ b/STM32F4/cores/maple/IPAddress.h @@ -17,8 +17,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef IPAddress_h -#define IPAddress_h +#ifndef _IPAddress_h_ +#define _IPAddress_h_ #include #include diff --git a/STM32F4/cores/maple/Server.h b/STM32F4/cores/maple/Server.h index 69e3e39fe..4a95c9f51 100644 --- a/STM32F4/cores/maple/Server.h +++ b/STM32F4/cores/maple/Server.h @@ -17,8 +17,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef server_h -#define server_h +#ifndef _SERVER_H_ +#define _SERVER_H_ #include "Print.h" diff --git a/STM32F4/cores/maple/Stream.h b/STM32F4/cores/maple/Stream.h index abdcd1768..870fbf0e5 100644 --- a/STM32F4/cores/maple/Stream.h +++ b/STM32F4/cores/maple/Stream.h @@ -19,8 +19,8 @@ parsing functions based on TextFinder library by Michael Margolis */ -#ifndef Stream_h -#define Stream_h +#ifndef _STREAM_H_ +#define _STREAM_H_ #include #include "Print.h" diff --git a/STM32F4/cores/maple/Udp.h b/STM32F4/cores/maple/Udp.h index dc5644b9d..1652cafc9 100644 --- a/STM32F4/cores/maple/Udp.h +++ b/STM32F4/cores/maple/Udp.h @@ -32,8 +32,8 @@ * bjoern@cs.stanford.edu 12/30/2008 */ -#ifndef udp_h -#define udp_h +#ifndef _UDP_H_ +#define _UDP_H_ #include #include diff --git a/STM32F4/cores/maple/WProgram.h b/STM32F4/cores/maple/WProgram.h index 2949a0a59..82b759a64 100644 --- a/STM32F4/cores/maple/WProgram.h +++ b/STM32F4/cores/maple/WProgram.h @@ -24,7 +24,12 @@ * SOFTWARE. *****************************************************************************/ -#include "wirish.h" +#ifndef _WPROGRAM_H_ +#define _WPROGRAM_H_ + +#include void setup(); void loop(); + +#endif \ No newline at end of file diff --git a/STM32F4/cores/maple/WString.h b/STM32F4/cores/maple/WString.h index 903857809..ec0eae7fb 100644 --- a/STM32F4/cores/maple/WString.h +++ b/STM32F4/cores/maple/WString.h @@ -19,8 +19,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef String_class_h -#define String_class_h +#ifndef _WSTRING_H_ +#define _WSTRING_H_ + #ifdef __cplusplus #include @@ -225,4 +226,4 @@ class StringSumHelper : public String }; #endif // __cplusplus -#endif // String_class_h +#endif // _WSTRING_H_ diff --git a/STM32F4/cores/maple/bits.h b/STM32F4/cores/maple/bits.h index 3e755b7f4..3e3eff1ec 100644 --- a/STM32F4/cores/maple/bits.h +++ b/STM32F4/cores/maple/bits.h @@ -27,4 +27,9 @@ /* Note: Use of this header file is deprecated. Use bit_constants.h instead. */ +#ifndef _BITS_H_ +#define _BITS_H_ + #include "bit_constants.h" + +#endif diff --git a/STM32F4/cores/maple/boards.cpp b/STM32F4/cores/maple/boards.cpp index a85657163..0d55e9414 100644 --- a/STM32F4/cores/maple/boards.cpp +++ b/STM32F4/cores/maple/boards.cpp @@ -33,17 +33,16 @@ */ #include "boards.h" -#include "flash.h" -#include "rcc.h" -#include "nvic.h" -#include "systick.h" -#include "gpio.h" -#include "adc.h" -#include "timer.h" +#include +#include +#include +#include +#include +#include +#include #include "usb.h" -#ifdef STM32F2 -//#include "usbF4.h" -#endif +#include "usb_serial.h" + static void setupFlash(void); static void setupClocks(void); @@ -59,7 +58,7 @@ void init(void) { systick_init(SYSTICK_RELOAD_VAL); gpio_init_all(); -#ifdef STM32F2 +#ifdef STM32F4 rcc_clk_enable(RCC_SYSCFG); #else afio_init(); @@ -69,7 +68,10 @@ void init(void) { setupADC(); setupTimers(); - //setupUSB(); +#ifdef SERIAL_USB + setupUSB(); + SerialUSB.begin(); +#endif } /* You could farm this out to the files in boards/ if e.g. it takes @@ -84,11 +86,13 @@ bool boardUsesPin(uint8 pin) { } static void setupFlash(void) { +/* #ifndef STM32F2 // for F2 and F4 CPUs this is done in SetupClock...(), e.g. in SetupClock168MHz() flash_enable_prefetch(); flash_set_latency(FLASH_WAIT_STATE_2); #endif +*/ } /* @@ -121,8 +125,8 @@ static void setupNVIC() { static void adcDefaultConfig(const adc_dev* dev); static void setupADC() { -#ifdef STM32F2 - setupADC_F2(); +#ifdef STM32F4 + setupADC_F4(); #else rcc_set_prescaler(RCC_PRESCALER_ADC, RCC_ADCPRE_PCLK_DIV_6); #endif diff --git a/STM32F4/cores/maple/boards.h b/STM32F4/cores/maple/boards.h index 00d07cddb..d37bff4a5 100644 --- a/STM32F4/cores/maple/boards.h +++ b/STM32F4/cores/maple/boards.h @@ -39,11 +39,8 @@ #ifndef _BOARDS_H_ #define _BOARDS_H_ -#include "libmaple.h" -#include "gpio.h" -#include "timer.h" - -#include "wirish_types.h" +#include +#include /* Set of all possible pin names; not all boards have all these (note * that we use the Dx convention since all of the Maple's pins are @@ -55,9 +52,12 @@ enum { D32, D33, D34, D35, D36, D37, D38, D39, D40, D41, D42, D43, D44, D45, D46, D47, D48, D49, D50, D51, D52, D53, D54, D55, D56, D57, D58, D59, D60, D61, D62, D63, D64, D65, D66, D67, D68, D69, D70, D71, D72, D73, D74, D75, D76, +#if 0 // not available on LQFP100 package D77, D78, D79, D80, D81, D82, D83, D84, D85, D86, D87, D88, D89, D90, D91, D92, D93, D94, D95, D96, D97, D98, D99, D100, D101, D102, D103, D104, D105, - D106, D107, D108, D109, D110, D111, }; + D106, D107, D108, D109, D110, D111, +#endif // not available on LQFP100 package +}; /** * @brief Maps each Maple pin to a corresponding stm32_pin_info. @@ -115,31 +115,20 @@ extern void boardInit(void); * @return true if the given pin is in boardUsedPins, and false otherwise. * @see boardUsedPins */ -bool boardUsesPin(uint8 pin); +extern bool boardUsesPin(uint8 pin); /* Include the appropriate private header from boards/: */ /* FIXME HACK put boards/ before these paths once IDE uses make. */ -#ifdef BOARD_maple -#include "maple.h" -#elif defined(BOARD_maple_native) -#include "maple_native.h" -#elif defined(BOARD_maple_mini) -#include "maple_mini.h" -#elif defined(BOARD_maple_RET6) -/* - * **NOT** MAPLE REV6. This the **Maple RET6 EDITION**, which is a - * Maple with an STM32F103RET6 (...RET6) instead of an STM32F103RBT6 - * (...RBT6) on it. Maple Rev6 (as of March 2011) DOES NOT EXIST. - */ -#include "maple_RET6.h" -#elif defined(BOARD_aeroquad32) || defined(BOARD_aeroquad32f1) +#if defined(BOARD_aeroquad32) || defined(BOARD_aeroquad32f1) #include "aeroquad32.h" #elif defined(BOARD_aeroquad32mini) #include "aeroquad32mini.h" #elif defined(BOARD_discovery_f4) #include "discovery_f4.h" +#elif defined(BOARD_generic_f407v) +#include "generic_f407v.h" #elif defined(BOARD_freeflight) #include "freeflight.h" #else @@ -160,4 +149,12 @@ bool boardUsesPin(uint8 pin); #define CLOCK_SPEED_MHZ CYCLES_PER_MICROSECOND #define CLOCK_SPEED_HZ (CLOCK_SPEED_MHZ * 1000000UL) +#ifndef SYSTICK_RELOAD_VAL +#define SYSTICK_RELOAD_VAL (1000 * CYCLES_PER_MICROSECOND - 1) +#endif + +#ifndef BOARD_BUTTON_PRESSED_LEVEL +#define BOARD_BUTTON_PRESSED_LEVEL HIGH +#endif + #endif diff --git a/STM32F4/cores/maple/ext_interrupts.cpp b/STM32F4/cores/maple/ext_interrupts.cpp index f014f1300..7111d0c86 100644 --- a/STM32F4/cores/maple/ext_interrupts.cpp +++ b/STM32F4/cores/maple/ext_interrupts.cpp @@ -31,8 +31,8 @@ */ #include "boards.h" -#include "gpio.h" -#include "exti.h" +#include +#include #include "ext_interrupts.h" static inline exti_trigger_mode exti_out_mode(ExtIntTriggerMode mode); @@ -51,7 +51,7 @@ void attachInterrupt(uint8 pin, voidFuncPtr handler, ExtIntTriggerMode mode) { exti_trigger_mode outMode = exti_out_mode(mode); - exti_attach_interrupt((afio_exti_num)(PIN_MAP[pin].gpio_bit), + exti_attach_interrupt((afio_exti_num)(pin&0x0F), gpio_exti_port(PIN_MAP[pin].gpio_device), handler, outMode); @@ -66,7 +66,7 @@ void detachInterrupt(uint8 pin) { return; } - exti_detach_interrupt((afio_exti_num)(PIN_MAP[pin].gpio_bit)); + exti_detach_interrupt((afio_exti_num)(pin&0x0F)); } static inline exti_trigger_mode exti_out_mode(ExtIntTriggerMode mode) { diff --git a/STM32F4/cores/maple/ext_interrupts.h b/STM32F4/cores/maple/ext_interrupts.h index b5c6f983b..fe215dceb 100644 --- a/STM32F4/cores/maple/ext_interrupts.h +++ b/STM32F4/cores/maple/ext_interrupts.h @@ -24,8 +24,8 @@ * SOFTWARE. *****************************************************************************/ -#include "libmaple_types.h" -#include "nvic.h" +#ifndef _EXT_INTERRUPTS_H_ +#define _EXT_INTERRUPTS_H_ /** * @file ext_interrupts.h @@ -33,8 +33,9 @@ * @brief Wiring-like external interrupt prototypes and types. */ -#ifndef _EXT_INTERRUPTS_H_ -#define _EXT_INTERRUPTS_H_ +#include +#include + /** * The kind of transition on an external pin which should trigger an diff --git a/STM32F4/cores/maple/io.h b/STM32F4/cores/maple/io.h index df1ab969e..aeaf0fd3a 100644 --- a/STM32F4/cores/maple/io.h +++ b/STM32F4/cores/maple/io.h @@ -33,8 +33,9 @@ #ifndef _IO_H_ #define _IO_H_ -#include "gpio.h" -#include "adc.h" +#include +#include +#include #include "wirish_time.h" @@ -179,9 +180,11 @@ static inline void toggleLED() { * accomplished portably over all LeafLabs boards by calling * pinMode(BOARD_BUTTON_PIN, INPUT). * + * @param button - one of available on-board buttons (up to 3 for generic F4) + * * @see pinMode() */ -uint8 isButtonPressed(); +uint8 isButtonPressed(uint8_t button); /** * Wait until the button is pressed and released, timing out if no @@ -195,12 +198,14 @@ uint8 isButtonPressed(); * button is pressed. If timeout_millis is left out (or 0), wait * forever. * + * @param button - one of available on-board buttons (up to 3 for generic F4) + * * @return true, if the button was pressed; false, if the timeout was * reached. * * @see pinMode() */ -uint8 waitForButtonPress(uint32 timeout_millis=0); +uint8 waitForButtonPress(uint8_t button, uint32 timeout_millis=0); /** * Shift out a byte of data, one bit at a time. diff --git a/STM32F4/cores/maple/itoa.h b/STM32F4/cores/maple/itoa.h index 59af10947..09e8b2f8e 100644 --- a/STM32F4/cores/maple/itoa.h +++ b/STM32F4/cores/maple/itoa.h @@ -16,8 +16,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _ITOA_ -#define _ITOA_ +#ifndef _ITOA_H_ +#define _ITOA_H_ #ifdef __cplusplus extern "C"{ diff --git a/STM32F4/cores/maple/libmaple/HardwareSPI.cpp b/STM32F4/cores/maple/libmaple/HardwareSPI.cpp deleted file mode 100644 index a5b4711be..000000000 --- a/STM32F4/cores/maple/libmaple/HardwareSPI.cpp +++ /dev/null @@ -1,424 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @author Marti Bolivar - * @brief Wirish SPI implementation. - */ - -#include "HardwareSPI.h" - -#include "timer.h" -#include "util.h" -#include "rcc.h" - -#include "wirish.h" -#include "boards.h" - -struct spi_pins { - uint8 nss; - uint8 sck; - uint8 miso; - uint8 mosi; -}; - -static const spi_pins* dev_to_spi_pins(spi_dev *dev); - -static void enable_device(spi_dev *dev, - bool as_master, - SPIFrequency frequency, - spi_cfg_flag endianness, - spi_mode mode); - -static const spi_pins board_spi_pins[] __FLASH__ = { - {BOARD_SPI1_NSS_PIN, - BOARD_SPI1_SCK_PIN, - BOARD_SPI1_MISO_PIN, - BOARD_SPI1_MOSI_PIN}, -#ifdef BOARD_SPI2_NSS_PIN - {BOARD_SPI2_NSS_PIN, - BOARD_SPI2_SCK_PIN, - BOARD_SPI2_MISO_PIN, - BOARD_SPI2_MOSI_PIN}, -#endif -#ifdef STM32_HIGH_DENSITY - {BOARD_SPI3B_NSS_PIN, - BOARD_SPI3B_SCK_PIN, - BOARD_SPI3B_MISO_PIN, - BOARD_SPI3B_MOSI_PIN}, -#endif -#ifdef STM32F4 - {BOARD_SPI3B_NSS_PIN, - BOARD_SPI3B_SCK_PIN, - BOARD_SPI3B_MISO_PIN, - BOARD_SPI3B_MOSI_PIN}, -#endif -}; - - -/* - * Constructor - */ - -HardwareSPI::HardwareSPI(uint32 spi_num) { - switch (spi_num) { - case 1: - this->spi_d = SPI1; - break; - case 2: - this->spi_d = SPI2; - break; -#ifdef STM32_HIGH_DENSITY - case 3: - this->spi_d = SPI3; - break; -#endif -#ifdef STM32F4 -// case 4: -// this->spi_d = SPI4; -// break; -#endif - default: - ASSERT(0); - } -} - -/* - * Set up/tear down - */ - -void HardwareSPI::begin(SPIFrequency frequency, uint32 bitOrder, uint32 mode) { - if (mode >= 4) { - ASSERT(0); - return; - } - spi_cfg_flag end = bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB; - spi_mode m = (spi_mode)mode; - enable_device(this->spi_d, true, frequency, end, m); -} - -void HardwareSPI::begin(void) { - this->begin(SPI_1_125MHZ, MSBFIRST, 0); -} - -void HardwareSPI::beginSlave(uint32 bitOrder, uint32 mode) { - if (mode >= 4) { - ASSERT(0); - return; - } - spi_cfg_flag end = bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB; - spi_mode m = (spi_mode)mode; - enable_device(this->spi_d, false, (SPIFrequency)0, end, m); -} - -void HardwareSPI::beginSlave(void) { - this->beginSlave(MSBFIRST, 0); -} - - -/* -void HardwareSPI::beginTransaction(uint8_t pin, SPISettings settings) -{ -// this->begin(settings.clock, settings.bitOrder, settings.dataMode); - this->begin(SPI_1_125MHZ, settings.bitOrder, settings.dataMode); -} -*/ - -void HardwareSPI::end(void) { - if (!spi_is_enabled(this->spi_d)) { - return; - } - - // Follows RM0008's sequence for disabling a SPI in master/slave - // full duplex mode. - while (spi_is_rx_nonempty(this->spi_d)) { - // FIXME [0.1.0] remove this once you have an interrupt based driver - volatile uint16 rx __attribute__((unused)) = spi_rx_reg(this->spi_d); - } - while (!spi_is_tx_empty(this->spi_d)) - ; - while (spi_is_busy(this->spi_d)) - ; - spi_peripheral_disable(this->spi_d); -} - -/* - * I/O - */ - -uint8 HardwareSPI::read(void) { - uint8 buf[1]; - this->read(buf, 1); - return buf[0]; -} - -void HardwareSPI::read(uint8 *buf, uint32 len) { - uint32 rxed = 0; - while (rxed < len) { - while (!spi_is_rx_nonempty(this->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(this->spi_d); - } -} - -#if 0 -void HardwareSPI::readMaster(uint8 *buf, uint32 len) { - uint32 rxed = 0; - while (rxed < len) { - spi_tx_reg(this->spi_d, 0xff); - while (!spi_is_rx_nonempty(this->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(this->spi_d); - buf[rxed++] = this->spi_d->regs->DR; - } -} -#endif -void HardwareSPI::readMaster(uint8 *buf, uint32 len) { - spi_reg_map *r = this->spi_d->regs; - uint32 rxed = 0; - while (rxed < len) { - r->DR = 0xff; - while (!(r->SR & SPI_SR_RXNE)) - ; - buf[rxed++] = r->DR; - } -} - - -void HardwareSPI::waitReady() { - while (!spi_is_rx_nonempty(this->spi_d)) - ; -} - -void HardwareSPI::write(uint8 byte) { - this->write(&byte, 1); -} - -void HardwareSPI::write(const uint8 *data, uint32 length) { - uint32 txed = 0; - while (txed < length) { - txed += spi_tx(this->spi_d, data + txed, length - txed); - } -} - -uint8 HardwareSPI::transfer(uint8 byte) { - this->write(byte); - return this->read(); -} - -/* - * Pin accessors - */ - -uint8 HardwareSPI::misoPin(void) { - return dev_to_spi_pins(this->spi_d)->miso; -} - -uint8 HardwareSPI::mosiPin(void) { - return dev_to_spi_pins(this->spi_d)->mosi; -} - -uint8 HardwareSPI::sckPin(void) { - return dev_to_spi_pins(this->spi_d)->sck; -} - -uint8 HardwareSPI::nssPin(void) { - return dev_to_spi_pins(this->spi_d)->nss; -} - -/* - * Deprecated functions - */ - -uint8 HardwareSPI::send(uint8 data) { - uint8 buf[] = {data}; - return this->send(buf, 1); -} - -#if 1 -uint8 HardwareSPI::send(const uint8 *buf, uint32 len) { - uint32 txed = 0; - uint8 ret = 0; - while (txed < len) { - this->write(buf[txed++]); - ret = this->read(); - } - return ret; -} -#else -// this does not work for an unknown reason -uint8 HardwareSPI::send(const uint8 *buf, uint32 len) { - volatile uint32 *dr = &(this->spi_d->regs->DR); - volatile uint32 *sr = &(this->spi_d->regs->SR); - uint32 txed = 0; - uint32 rx=0; - while (txed < len) { - //while (!(*sr & SPI_SR_TXE)) - // ; - //*dr = buf[txed++]; - this->write(buf[txed++]); - - while (!(*sr & SPI_SR_RXNE)) - ; - rx = *dr; - //rx = this->read(); - } - - return rx; -} -#endif - -uint8 HardwareSPI::recv(void) { - return this->read(); -} - -/* - * Auxiliary functions - */ - -static void configure_gpios(spi_dev *dev, bool as_master); -static spi_baud_rate determine_baud_rate(spi_dev *dev, SPIFrequency freq); - -static const spi_pins* dev_to_spi_pins(spi_dev *dev) { - switch (dev->clk_id) { - case RCC_SPI1: return board_spi_pins; - case RCC_SPI2: return board_spi_pins + 1; -#ifdef STM32_HIGH_DENSITY - case RCC_SPI3: return board_spi_pins + 2; -#endif -#ifdef STM32F4 - case RCC_SPI4: return board_spi_pins + 3; -#endif - default: return NULL; - } -} - -/* Enables the device in master or slave full duplex mode. If you - * change this code, you must ensure that appropriate changes are made - * to HardwareSPI::end(). */ -static void enable_device(spi_dev *dev, - bool as_master, - SPIFrequency freq, - spi_cfg_flag endianness, - spi_mode mode) { - spi_baud_rate baud = determine_baud_rate(dev, freq); - uint32 cfg_flags = (endianness | SPI_DFF_8_BIT | SPI_SW_SLAVE | - (as_master ? SPI_SOFT_SS : 0)); - - spi_init(dev); - configure_gpios(dev, as_master); - if (as_master) { - spi_master_enable(dev, baud, mode, cfg_flags); - } else { - spi_slave_enable(dev, mode, cfg_flags); - } -} - -static void disable_pwm(const stm32_pin_info *i) { - if (i->timer_device) { - timer_set_mode(i->timer_device, i->timer_channel, TIMER_DISABLED); - } -} - -static void configure_gpios(spi_dev *dev, bool as_master) { - const spi_pins *pins = dev_to_spi_pins(dev); - - if (!pins) { - return; - } - - const stm32_pin_info *nssi = (pins->nss >= 0) ? &PIN_MAP[pins->nss] : NULL; - const stm32_pin_info *scki = &PIN_MAP[pins->sck]; - const stm32_pin_info *misoi = &PIN_MAP[pins->miso]; - const stm32_pin_info *mosii = &PIN_MAP[pins->mosi]; - - if(nssi) { - disable_pwm(nssi); - } - disable_pwm(scki); - disable_pwm(misoi); - disable_pwm(mosii); - -#ifdef STM32F4 - if(dev->clk_id <= RCC_SPI2) { - if(nssi) { - if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 5); - } - } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 5); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 5); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 5); - } else { - if(nssi) { - if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 6); - } - } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 6); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 6); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 6); - } -#endif - - if(nssi) { - spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, - scki->gpio_device, scki->gpio_bit, - misoi->gpio_device, misoi->gpio_bit, - mosii->gpio_device, mosii->gpio_bit); - } else { - spi_config_gpios(dev, as_master, NULL, -1, - scki->gpio_device, scki->gpio_bit, - misoi->gpio_device, misoi->gpio_bit, - mosii->gpio_device, mosii->gpio_bit); - } -} - -static const spi_baud_rate baud_rates[MAX_SPI_FREQS] __FLASH__ = { - SPI_BAUD_PCLK_DIV_2, - SPI_BAUD_PCLK_DIV_4, - SPI_BAUD_PCLK_DIV_8, - SPI_BAUD_PCLK_DIV_16, - SPI_BAUD_PCLK_DIV_32, - SPI_BAUD_PCLK_DIV_64, - SPI_BAUD_PCLK_DIV_128, - SPI_BAUD_PCLK_DIV_256, -}; - -/* - * Note: This assumes you're on a LeafLabs-style board - * (CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). - */ -static spi_baud_rate determine_baud_rate(spi_dev *dev, SPIFrequency freq) { - if (rcc_dev_clk(dev->clk_id) == RCC_APB2 && freq == SPI_140_625KHZ) { - /* APB2 peripherals are too fast for 140.625 KHz */ - ASSERT(0); - return (spi_baud_rate)~0; - } - return (rcc_dev_clk(dev->clk_id) == RCC_APB2 ? - baud_rates[freq + 1] : - baud_rates[freq]); -} diff --git a/STM32F4/cores/maple/libmaple/HardwareSPI.h b/STM32F4/cores/maple/libmaple/HardwareSPI.h deleted file mode 100644 index 327f29da1..000000000 --- a/STM32F4/cores/maple/libmaple/HardwareSPI.h +++ /dev/null @@ -1,279 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file HardwareSPI.h - * @brief High-level SPI interface - * - * This is a "bare essentials" polling driver for now. - */ - -/* TODO [0.1.0] Remove deprecated methods. */ - -#include "libmaple_types.h" -#include "spi.h" - -#include "boards.h" -#include "wirish.h" - -#ifndef _HARDWARESPI_H_ -#define _HARDWARESPI_H_ - -/** - * @brief Defines the possible SPI communication speeds. - */ -typedef enum SPIFrequency { - SPI_18MHZ = 0, /**< 18 MHz */ - SPI_9MHZ = 1, /**< 9 MHz */ - SPI_4_5MHZ = 2, /**< 4.5 MHz */ - SPI_2_25MHZ = 3, /**< 2.25 MHz */ - SPI_1_125MHZ = 4, /**< 1.125 MHz */ - SPI_562_500KHZ = 5, /**< 562.500 KHz */ - SPI_281_250KHZ = 6, /**< 281.250 KHz */ - SPI_140_625KHZ = 7, /**< 140.625 KHz */ -} SPIFrequency; - -#define MAX_SPI_FREQS 8 - -#if CYCLES_PER_MICROSECOND != 72 -/* TODO [0.2.0?] something smarter than this */ -//#warning "Unexpected clock speed; SPI frequency calculation will be incorrect" -#endif - - -//#define BOARD_SPI_DEFAULT_SS PC13 -#define BOARD_SPI_DEFAULT_SS PB0 -#define SPI_MODE0 SPI_MODE_0 -#define SPI_MODE1 SPI_MODE_1 -#define SPI_MODE2 SPI_MODE_2 -#define SPI_MODE3 SPI_MODE_3 - -/* -class SPISettings { -public: - SPISettings(uint32 clock, BitOrder bitOrder, uint8 dataMode) { - if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, dataMode); - } else { - init_MightInline(clock, bitOrder, dataMode); - } - } - SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } -private: - void init_MightInline(uint32 clock, BitOrder bitOrder, uint8 dataMode) { - init_AlwaysInline(clock, bitOrder, dataMode); - } - void init_AlwaysInline(uint32 clock, BitOrder bitOrder, uint8 dataMode) __attribute__((__always_inline__)) { - this->clock = clock; - this->bitOrder = bitOrder; - this->dataMode = dataMode; - } - uint32 clock; - BitOrder bitOrder; - uint8 dataMode; - friend class HardwareSPI; -}; -*/ - - -/** - * @brief Wirish SPI interface. - * - * This implementation uses software slave management, so the caller - * is responsible for controlling the slave select line. - */ -class HardwareSPI { -public: - /** - * @param spiPortNumber Number of the SPI port to manage. - */ - HardwareSPI(uint32 spiPortNumber); - - /* - * Set up/tear down - */ - - /** - * @brief Turn on a SPI port and set its GPIO pin modes for use as master. - * - * SPI port is enabled in full duplex mode, with software slave management. - * - * @param frequency Communication frequency - * @param bitOrder Either LSBFIRST (little-endian) or MSBFIRST (big-endian) - * @param mode SPI mode to use, one of SPI_MODE_0, SPI_MODE_1, - * SPI_MODE_2, and SPI_MODE_3. - */ - void begin(SPIFrequency frequency, uint32 bitOrder, uint32 mode); - - /** - * @brief Equivalent to begin(SPI_1_125MHZ, MSBFIRST, 0). - */ - void begin(void); - - /** - * @brief Turn on a SPI port and set its GPIO pin modes for use as a slave. - * - * SPI port is enabled in full duplex mode, with software slave management. - * - * @param bitOrder Either LSBFIRST (little-endian) or MSBFIRST(big-endian) - * @param mode SPI mode to use - */ - void beginSlave(uint32 bitOrder, uint32 mode); - - /** - * @brief Equivalent to beginSlave(MSBFIRST, 0). - */ - void beginSlave(void); - - /** - * @brief Disables the SPI port, but leaves its GPIO pin modes unchanged. - */ - void end(void); - - /* - * I/O - */ - - /** - * @brief Return the next unread byte. - * - * If there is no unread byte waiting, this function will block - * until one is received. - */ - uint8 read(void); - - /** - * @brief Read length bytes, storing them into buffer. - * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This - * function will block until the desired number of - * bytes have been read. - */ - void read(uint8 *buffer, uint32 length); - - /** - * @brief Read length bytes, storing them into buffer. - * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This - * function will block until the desired number of - * bytes have been read. - */ - void readMaster(uint8 *buffer, uint32 length); - - - void waitReady(); - /** - * @brief Transmit a byte. - * @param data Byte to transmit. - */ - void write(uint8 data); - - /** - * @brief Transmit multiple bytes. - * @param buffer Bytes to transmit. - * @param length Number of bytes in buffer to transmit. - */ - void write(const uint8 *buffer, uint32 length); - - /** - * @brief Transmit a byte, then return the next unread byte. - * - * This function transmits before receiving. - * - * @param data Byte to transmit. - * @return Next unread byte. - */ - uint8 transfer(uint8 data); - - /* - * Pin accessors - */ - - /** - * @brief Return the number of the MISO (master in, slave out) pin - */ - uint8 misoPin(void); - - /** - * @brief Return the number of the MOSI (master out, slave in) pin - */ - uint8 mosiPin(void); - - /** - * @brief Return the number of the SCK (serial clock) pin - */ - uint8 sckPin(void); - - /** - * @brief Return the number of the NSS (slave select) pin - */ - uint8 nssPin(void); - - /* -- The following methods are deprecated --------------------------- */ - - /** - * @brief Deprecated. - * - * Use HardwareSPI::transfer() instead. - * - * @see HardwareSPI::transfer() - */ - uint8 send(uint8 data); - - /** - * @brief Deprecated. - * - * Use HardwareSPI::write() in combination with - * HardwareSPI::read() (or HardwareSPI::transfer()) instead. - * - * @see HardwareSPI::write() - * @see HardwareSPI::read() - * @see HardwareSPI::transfer() - */ - uint8 send(const uint8 *data, uint32 length); - - /** - * @brief Deprecated. - * - * Use HardwareSPI::read() instead. - * - * @see HardwareSPI::read() - */ - uint8 recv(void); - -// void beginTransaction(SPISettings settings) { beginTransaction(BOARD_SPI_DEFAULT_SS, settings); } -// void beginTransaction(uint8 pin, SPISettings settings); - void endTransaction(void) { } - -private: - spi_dev *spi_d; -}; - - -extern HardwareSPI SPI; - -#endif - diff --git a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp index 59ce71d11..f9387d15a 100644 --- a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp +++ b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp @@ -56,19 +56,19 @@ #define RX5 BOARD_UART5_RX_PIN #endif -HardwareSerial Serial(USART1, TX1, RX1); +HardwareSerial Serial1(USART1, TX1, RX1); #ifdef TX2 -HardwareSerial Serial1(USART2, TX2, RX2); +HardwareSerial Serial2(USART2, TX2, RX2); #endif #ifdef TX3 -HardwareSerial Serial2(USART3, TX3, RX3); +HardwareSerial Serial3(USART3, TX3, RX3); #endif #if defined(STM32_HIGH_DENSITY) && !defined(BOARD_maple_RET6) -HardwareSerial Serial3(UART4, TX4, RX4); -HardwareSerial Serial4(UART5, TX5, RX5); +HardwareSerial Serial4(UART4, TX4, RX4); +HardwareSerial Serial5(UART5, TX5, RX5); #endif HardwareSerial::HardwareSerial(usart_dev *usart_device, @@ -90,25 +90,23 @@ void HardwareSerial::begin(uint32 baud) { return; } - const stm32_pin_info *txi = &PIN_MAP[tx_pin]; - const stm32_pin_info *rxi = &PIN_MAP[rx_pin]; -#ifdef STM32F2 +#ifdef STM32F4 // int af = 7<<8; if (usart_device == UART4 || usart_device == UART5) { - gpio_set_af_mode(txi->gpio_device, txi->gpio_bit, 8); - gpio_set_af_mode(rxi->gpio_device, rxi->gpio_bit, 8); + gpio_set_af_mode(tx_pin, 8); + gpio_set_af_mode(rx_pin, 8); } else { - gpio_set_af_mode(txi->gpio_device, txi->gpio_bit, 7); - gpio_set_af_mode(rxi->gpio_device, rxi->gpio_bit, 7); + gpio_set_af_mode(tx_pin, 7); + gpio_set_af_mode(rx_pin, 7); } - gpio_set_mode(txi->gpio_device, txi->gpio_bit, (gpio_pin_mode)(GPIO_AF_OUTPUT_PP | GPIO_PUPD_INPUT_PU | 0x700)); - gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, (gpio_pin_mode)(GPIO_MODE_AF | GPIO_PUPD_INPUT_PU | 0x700)); + gpio_set_mode(tx_pin, (gpio_pin_mode)(GPIO_AF_OUTPUT_PP | GPIO_PUPD_INPUT_PU | 0x700)); + gpio_set_mode(rx_pin, (gpio_pin_mode)(GPIO_MODE_AF | GPIO_PUPD_INPUT_PU | 0x700)); //gpio_set_mode(txi->gpio_device, txi->gpio_bit, (gpio_pin_mode)(GPIO_PUPD_INPUT_PU)); //gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, (gpio_pin_mode)(GPIO_PUPD_INPUT_PU)); #else - gpio_set_mode(txi->gpio_device, txi->gpio_bit, GPIO_AF_OUTPUT_PP); - gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(tx_pin, GPIO_AF_OUTPUT_PP); + gpio_set_mode(rx_pin, GPIO_INPUT_FLOATING); #endif #if 0 if (txi->timer_device != NULL) { diff --git a/STM32F4/cores/maple/libmaple/HardwareSerial.h b/STM32F4/cores/maple/libmaple/HardwareSerial.h index c09fe54f1..d7e8a3d1f 100644 --- a/STM32F4/cores/maple/libmaple/HardwareSerial.h +++ b/STM32F4/cores/maple/libmaple/HardwareSerial.h @@ -75,12 +75,12 @@ class HardwareSerial : public Stream { uint8 rx_pin; }; -extern HardwareSerial Serial; extern HardwareSerial Serial1; extern HardwareSerial Serial2; #if defined(STM32_HIGH_DENSITY) && !defined(BOARD_maple_RET6) extern HardwareSerial Serial3; extern HardwareSerial Serial4; +extern HardwareSerial Serial5; #endif extern HardwareSerial &SerialDebug; #endif diff --git a/STM32F4/cores/maple/libmaple/adc.c b/STM32F4/cores/maple/libmaple/adc.c index aeeb43c0e..0f4c02c3c 100644 --- a/STM32F4/cores/maple/libmaple/adc.c +++ b/STM32F4/cores/maple/libmaple/adc.c @@ -41,27 +41,24 @@ #include "rcc.h" #include "adc.h" -static adc_dev adc1 = { +/** ADC1 device. */ +const adc_dev ADC1 = { .regs = ADC1_BASE, .clk_id = RCC_ADC1 }; -/** ADC1 device. */ -const adc_dev *ADC1 = &adc1; -static adc_dev adc2 = { +/** ADC2 device. */ +const adc_dev ADC2 = { .regs = ADC2_BASE, .clk_id = RCC_ADC2 }; -/** ADC2 device. */ -const adc_dev *ADC2 = &adc2; #ifdef STM32_HIGH_DENSITY -adc_dev adc3 = { +/** ADC3 device. */ +const adc_dev ADC3 = { .regs = ADC3_BASE, .clk_id = RCC_ADC3 }; -/** ADC3 device. */ -const adc_dev *ADC3 = &adc3; #endif /** @@ -74,7 +71,7 @@ const adc_dev *ADC3 = &adc3; */ void adc_init(const adc_dev *dev) { rcc_clk_enable(dev->clk_id); -#ifdef STM32F2 +#ifdef STM32F4 if(dev->clk_id == RCC_ADC1) { rcc_reset_dev(dev->clk_id); } @@ -101,10 +98,10 @@ void adc_set_extsel(const adc_dev *dev, adc_extsel_event event) { * @param fn Function to call on each ADC device. */ void adc_foreach(void (*fn)(const adc_dev*)) { - fn(ADC1); - fn(ADC2); + fn(&ADC1); + fn(&ADC2); #ifdef STM32_HIGH_DENSITY - fn(ADC3); + fn(&ADC3); #endif } @@ -136,7 +133,9 @@ void adc_set_sample_rate(const adc_dev *dev, adc_smp_rate smp_rate) { * @brief Calibrate an ADC peripheral * @param dev adc device */ -void adc_calibrate(const adc_dev *dev) { +void adc_calibrate(const adc_dev *dev) +{ +/* #ifndef STM32F2 __io uint32 *rstcal_bit = bb_perip(&(dev->regs->CR2), 3); __io uint32 *cal_bit = bb_perip(&(dev->regs->CR2), 2); @@ -149,6 +148,7 @@ void adc_calibrate(const adc_dev *dev) { while (*cal_bit) ; #endif +*/ } /** @@ -171,8 +171,8 @@ uint16 adc_read(const adc_dev *dev, uint8 channel) { return (uint16)(regs->DR & ADC_DR_DATA); } -void setupADC_F2() { -#ifdef STM32F2 +void setupADC_F4(void) +{ uint32 tmpreg1 = 0; tmpreg1 = ADC_COMMON->CCR; @@ -196,5 +196,4 @@ void setupADC_F2() { /* Write to ADC CCR */ ADC_COMMON->CCR = tmpreg1; -#endif } diff --git a/STM32F4/cores/maple/libmaple/adc.h b/STM32F4/cores/maple/libmaple/adc.h index 3a40d4c58..6fa61f5ea 100644 --- a/STM32F4/cores/maple/libmaple/adc.h +++ b/STM32F4/cores/maple/libmaple/adc.h @@ -42,17 +42,15 @@ extern "C"{ #endif -#ifdef STM32F2 - typedef struct - { - __io uint32 CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __io uint32 CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __io uint32 CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ - } ADC_Common_TypeDef; +typedef struct +{ + __io uint32 CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __io uint32 CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __io uint32 CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; #define ADC_COMMON ((ADC_Common_TypeDef *) 0x40012300) -#endif /** ADC register map type. */ typedef struct adc_reg_map { @@ -84,33 +82,22 @@ typedef struct adc_dev { rcc_clk_id clk_id; /**< RCC clock information */ } adc_dev; -extern const adc_dev *ADC1; -extern const adc_dev *ADC2; +extern const adc_dev ADC1; +extern const adc_dev ADC2; #ifdef STM32_HIGH_DENSITY -extern const adc_dev *ADC3; +extern const adc_dev ADC3; #endif /* * Register map base pointers */ -#ifdef STM32F2 - /** ADC1 register map base pointer. */ - #define ADC1_BASE ((struct adc_reg_map*)0x40012000) - /** ADC2 register map base pointer. */ - #define ADC2_BASE ((struct adc_reg_map*)0x40012100) - /** ADC3 register map base pointer. */ - #define ADC3_BASE ((struct adc_reg_map*)0x40012200) -#else - /** ADC1 register map base pointer. */ - #define ADC1_BASE ((struct adc_reg_map*)0x40012400) - /** ADC2 register map base pointer. */ - #define ADC2_BASE ((struct adc_reg_map*)0x40012800) - #ifdef STM32_HIGH_DENSITY - /** ADC3 register map base pointer. */ - #define ADC3_BASE ((struct adc_reg_map*)0x40013C00) - #endif -#endif +/** ADC1 register map base pointer. */ +#define ADC1_BASE ((struct adc_reg_map*)0x40012000) +/** ADC2 register map base pointer. */ +#define ADC2_BASE ((struct adc_reg_map*)0x40012100) +/** ADC3 register map base pointer. */ +#define ADC3_BASE ((struct adc_reg_map*)0x40012200) /* * Register bit definitions @@ -167,17 +154,10 @@ extern const adc_dev *ADC3; #define ADC_CR2_JEXTTRIG_BIT 15 #define ADC_CR2_EXTTRIG_BIT 20 #define ADC_CR2_TSEREFE_BIT 23 -#ifdef STM32F2 #define ADC_CR2_JSWSTART_BIT 22 #define ADC_CR2_SWSTART_BIT 30 #define ADC_CR2_EXTSEL (0x0F000000) #define ADC_CR2_JEXTSEL (0x000F0000) -#else -#define ADC_CR2_JSWSTART_BIT 21 -#define ADC_CR2_SWSTART_BIT 22 -#define ADC_CR2_EXTSEL (0x000E0000) -#define ADC_CR2_JEXTSEL (0x00007000) -#endif @@ -388,7 +368,7 @@ static inline void adc_disable_all(void) { adc_foreach(adc_disable); } -void setupADC_F2(); +extern void setupADC_F4(void); #ifdef __cplusplus } // extern "C" diff --git a/STM32F4/cores/maple/libmaple/dac.c b/STM32F4/cores/maple/libmaple/dac.c index 264e4e21a..3853f903c 100644 --- a/STM32F4/cores/maple/libmaple/dac.c +++ b/STM32F4/cores/maple/libmaple/dac.c @@ -126,11 +126,11 @@ void dac_enable_channel(const dac_dev *dev, uint8 channel) { */ switch (channel) { case 1: - gpio_set_mode(GPIOA, 4, GPIO_INPUT_ANALOG); + gpio_set_mode((uint8_t)PA4, GPIO_INPUT_ANALOG); dev->regs->CR |= DAC_CR_EN1; break; case 2: - gpio_set_mode(GPIOA, 5, GPIO_INPUT_ANALOG); + gpio_set_mode((uint8_t)PA5, GPIO_INPUT_ANALOG); dev->regs->CR |= DAC_CR_EN2; break; } diff --git a/STM32F4/cores/maple/libmaple/dma.h b/STM32F4/cores/maple/libmaple/dma.h index a965c036f..420adf8a4 100644 --- a/STM32F4/cores/maple/libmaple/dma.h +++ b/STM32F4/cores/maple/libmaple/dma.h @@ -30,9 +30,4 @@ * @brief Direct Memory Access peripheral support */ -#ifdef STM32F2 -#include "dmaF2.h" -#include -#else -#include "dmaF1.h" -#endif +#include "dmaF4.h" diff --git a/STM32F4/cores/maple/libmaple/dmaF1.c b/STM32F4/cores/maple/libmaple/dmaF1.c deleted file mode 100644 index f8ddb2d22..000000000 --- a/STM32F4/cores/maple/libmaple/dmaF1.c +++ /dev/null @@ -1,383 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -#ifdef STM32F1 - -/** - * @file dma.c - * @author Marti Bolivar ; - * Original implementation by Michael Hope - * @brief Direct Memory Access peripheral support - */ - -#include "dma.h" -#include "bitband.h" -#include "util.h" - -/* - * Devices - */ - -static dma_dev dma1 = { - .regs = DMA1_BASE, - .clk_id = RCC_DMA1, - .handlers = {{ .handler = NULL, .irq_line = NVIC_DMA_CH1 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH2 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH3 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH4 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH5 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH6 }, - { .handler = NULL, .irq_line = NVIC_DMA_CH7 }} -}; -/** DMA1 device */ -dma_dev *DMA1 = &dma1; - -#ifdef STM32_HIGH_DENSITY -static dma_dev dma2 = { - .regs = DMA2_BASE, - .clk_id = RCC_DMA2, - .handlers = {{ .handler = NULL, .irq_line = NVIC_DMA2_CH1 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH2 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH3 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH_4_5 }, - { .handler = NULL, .irq_line = NVIC_DMA2_CH_4_5 }} /* !@#$ */ -}; -/** DMA2 device */ -dma_dev *DMA2 = &dma2; -#endif - -/* - * Convenience routines - */ - -/** - * @brief Initialize a DMA device. - * @param dev Device to initialize. - */ -void dma_init(dma_dev *dev) { - rcc_clk_enable(dev->clk_id); -} - -/** - * @brief Set up a DMA transfer. - * - * The channel will be disabled before being reconfigured. The - * transfer will have low priority by default. You may choose another - * priority before the transfer begins using dma_set_priority(), as - * well as performing any other configuration you desire. When the - * channel is configured to your liking, enable it using dma_enable(). - * - * @param dev DMA device. - * @param channel DMA channel. - * @param peripheral_address Base address of peripheral data register - * involved in the transfer. - * @param peripheral_size Peripheral data transfer size. - * @param memory_address Base memory address involved in the transfer. - * @param memory_size Memory data transfer size. - * @param mode Logical OR of dma_mode_flags - * @sideeffect Disables the given DMA channel. - * @see dma_xfer_size - * @see dma_mode_flags - * @see dma_set_num_transfers() - * @see dma_set_priority() - * @see dma_attach_interrupt() - * @see dma_enable() - */ -void dma_setup_transfer(dma_dev *dev, - dma_channel channel, - __io void *peripheral_address, - dma_xfer_size peripheral_size, - __io void *memory_address, - dma_xfer_size memory_size, - uint32 mode) { - dma_channel_reg_map *channel_regs = dma_channel_regs(dev, channel); - - dma_disable(dev, channel); /* can't write to CMAR/CPAR otherwise */ - channel_regs->CCR = (memory_size << 10) | (peripheral_size << 8) | mode; - channel_regs->CMAR = (uint32)memory_address; - channel_regs->CPAR = (uint32)peripheral_address; -} - -/** - * @brief Set the number of data to be transferred on a DMA channel. - * - * You may not call this function while the channel is enabled. - * - * @param dev DMA device - * @param channel Channel through which the transfer occurs. - * @param num_transfers - */ -void dma_set_num_transfers(dma_dev *dev, - dma_channel channel, - uint16 num_transfers) { - dma_channel_reg_map *channel_regs; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - channel_regs = dma_channel_regs(dev, channel); - channel_regs->CNDTR = num_transfers; -} - -/** - * @brief Set the priority of a DMA transfer. - * - * You may not call this function while the channel is enabled. - * - * @param dev DMA device - * @param channel DMA channel - * @param priority priority to set. - */ -void dma_set_priority(dma_dev *dev, - dma_channel channel, - dma_priority priority) { - dma_channel_reg_map *channel_regs; - uint32 ccr; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - channel_regs = dma_channel_regs(dev, channel); - ccr = channel_regs->CCR; - ccr &= ~DMA_CCR_PL; - ccr |= priority; - channel_regs->CCR = ccr; -} - -/** - * @brief Attach an interrupt to a DMA transfer. - * - * Interrupts are enabled using appropriate mode flags in - * dma_setup_transfer(). - * - * @param dev DMA device - * @param channel Channel to attach handler to - * @param handler Interrupt handler to call when channel interrupt fires. - * @see dma_setup_transfer() - * @see dma_get_irq_cause() - * @see dma_detach_interrupt() - */ -void dma_attach_interrupt(dma_dev *dev, - dma_channel channel, - void (*handler)(void)) { - dev->handlers[channel - 1].handler = handler; - nvic_irq_enable(dev->handlers[channel - 1].irq_line); -} - -/** - * @brief Detach a DMA transfer interrupt handler. - * - * After calling this function, the given channel's interrupts will be - * disabled. - * - * @param dev DMA device - * @param channel Channel whose handler to detach - * @sideeffect Clears interrupt enable bits in the channel's CCR register. - * @see dma_attach_interrupt() - */ -void dma_detach_interrupt(dma_dev *dev, dma_channel channel) { - /* Don't use nvic_irq_disable()! Think about DMA2 channels 4 and 5. */ - dma_channel_regs(dev, channel)->CCR &= ~0xF; - dev->handlers[channel - 1].handler = NULL; -} - -/** - * @brief Discover the reason why a DMA interrupt was called. - * - * You may only call this function within an attached interrupt - * handler for the given channel. - * - * This function resets the internal DMA register state which encodes - * the cause of the interrupt; consequently, it can only be called - * once per interrupt handler invocation. - * - * @param dev DMA device - * @param channel Channel whose interrupt is being handled. - * @return Reason why the interrupt fired. - * @sideeffect Clears channel status flags in dev->regs->ISR. - * @see dma_attach_interrupt() - * @see dma_irq_cause - */ -dma_irq_cause dma_get_irq_cause(dma_dev *dev, dma_channel channel) { - uint8 status_bits = dma_get_isr_bits(dev, channel); - - /* If the channel global interrupt flag is cleared, then - * something's very wrong. */ - ASSERT(status_bits & BIT(0)); - - dma_clear_isr_bits(dev, channel); - - /* ISR flags get set even if the corresponding interrupt enable - * bits in the channel's configuration register are cleared, so we - * can't use a switch here. - * - * Don't change the order of these if statements. */ - if (status_bits & BIT(3)) { - return DMA_TRANSFER_ERROR; - } else if (status_bits & BIT(1)) { - return DMA_TRANSFER_COMPLETE; - } else if (status_bits & BIT(2)) { - return DMA_TRANSFER_HALF_COMPLETE; - } else if (status_bits & BIT(0)) { - /* Shouldn't happen (unless someone messed up an IFCR write). */ - throb(); - } -#if DEBUG_LEVEL < DEBUG_ALL - else { - /* We shouldn't have been called, but the debug level is too - * low for the above ASSERT() to have had any effect. In - * order to fail fast, mimic the DMA controller's behavior - * when an error occurs. */ - dma_disable(dev, channel); - } -#endif - return DMA_TRANSFER_ERROR; -} - -/** - * @brief Enable a DMA channel. - * @param dev DMA device - * @param channel Channel to enable - */ -void dma_enable(dma_dev *dev, dma_channel channel) { - dma_channel_reg_map *chan_regs = dma_channel_regs(dev, channel); - bb_peri_set_bit(&chan_regs->CCR, DMA_CCR_EN_BIT, 1); -} - -/** - * @brief Disable a DMA channel. - * @param dev DMA device - * @param channel Channel to disable - */ -void dma_disable(dma_dev *dev, dma_channel channel) { - dma_channel_reg_map *chan_regs = dma_channel_regs(dev, channel); - bb_peri_set_bit(&chan_regs->CCR, DMA_CCR_EN_BIT, 0); -} - -/** - * @brief Set the base memory address where data will be read from or - * written to. - * - * You must not call this function while the channel is enabled. - * - * If the DMA memory size is 16 bits, the address is automatically - * aligned to a half-word. If the DMA memory size is 32 bits, the - * address is aligned to a word. - * - * @param dev DMA Device - * @param channel Channel whose base memory address to set. - * @param addr Memory base address to use. - */ -void dma_set_mem_addr(dma_dev *dev, dma_channel channel, __io void *addr) { - dma_channel_reg_map *chan_regs; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - chan_regs = dma_channel_regs(dev, channel); - chan_regs->CMAR = (uint32)addr; -} - -/** - * @brief Set the base peripheral address where data will be read from - * or written to. - * - * You must not call this function while the channel is enabled. - * - * If the DMA peripheral size is 16 bits, the address is automatically - * aligned to a half-word. If the DMA peripheral size is 32 bits, the - * address is aligned to a word. - * - * @param dev DMA Device - * @param channel Channel whose peripheral data register base address to set. - * @param addr Peripheral memory base address to use. - */ -void dma_set_per_addr(dma_dev *dev, dma_channel channel, __io void *addr) { - dma_channel_reg_map *chan_regs; - - ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); - - chan_regs = dma_channel_regs(dev, channel); - chan_regs->CPAR = (uint32)addr; -} - -/* - * IRQ handlers - */ - -static inline void dispatch_handler(dma_dev *dev, dma_channel channel) { - void (*handler)(void) = dev->handlers[channel - 1].handler; - if (handler) { - handler(); - dma_clear_isr_bits(dev, channel); /* in case handler doesn't */ - } -} - -void __irq_dma1_channel1(void) { - dispatch_handler(DMA1, DMA_CH1); -} - -void __irq_dma1_channel2(void) { - dispatch_handler(DMA1, DMA_CH2); -} - -void __irq_dma1_channel3(void) { - dispatch_handler(DMA1, DMA_CH3); -} - -void __irq_dma1_channel4(void) { - dispatch_handler(DMA1, DMA_CH4); -} - -void __irq_dma1_channel5(void) { - dispatch_handler(DMA1, DMA_CH5); -} - -void __irq_dma1_channel6(void) { - dispatch_handler(DMA1, DMA_CH6); -} - -void __irq_dma1_channel7(void) { - dispatch_handler(DMA1, DMA_CH7); -} - -#ifdef STM32_HIGH_DENSITY -void __irq_dma2_channel1(void) { - dispatch_handler(DMA2, DMA_CH1); -} - -void __irq_dma2_channel2(void) { - dispatch_handler(DMA2, DMA_CH2); -} - -void __irq_dma2_channel3(void) { - dispatch_handler(DMA2, DMA_CH3); -} - -void __irq_dma2_channel4_5(void) { - dispatch_handler(DMA2, DMA_CH4); - dispatch_handler(DMA2, DMA_CH5); -} -#endif - -#endif \ No newline at end of file diff --git a/STM32F4/cores/maple/libmaple/dmaF1.h b/STM32F4/cores/maple/libmaple/dmaF1.h deleted file mode 100644 index 6e8087f49..000000000 --- a/STM32F4/cores/maple/libmaple/dmaF1.h +++ /dev/null @@ -1,453 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file dma.h - * - * @author Marti Bolivar ; - * Original implementation by Michael Hope - * - * @brief Direct Memory Access peripheral support - */ - -/* - * See /notes/dma.txt for more information. - */ - -#ifndef _DMA_H_ -#define _DMA_H_ - -#include "libmaple_types.h" -#include "rcc.h" -#include "nvic.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Register maps - */ - -/** - * @brief DMA register map type. - * - * Note that DMA controller 2 (register map base pointer DMA2_BASE) - * only supports channels 1--5. - */ -typedef struct dma_reg_map { - __io uint32 ISR; /**< Interrupt status register */ - __io uint32 IFCR; /**< Interrupt flag clear register */ - __io uint32 CCR1; /**< Channel 1 configuration register */ - __io uint32 CNDTR1; /**< Channel 1 number of data register */ - __io uint32 CPAR1; /**< Channel 1 peripheral address register */ - __io uint32 CMAR1; /**< Channel 1 memory address register */ - const uint32 RESERVED1; /**< Reserved. */ - __io uint32 CCR2; /**< Channel 2 configuration register */ - __io uint32 CNDTR2; /**< Channel 2 number of data register */ - __io uint32 CPAR2; /**< Channel 2 peripheral address register */ - __io uint32 CMAR2; /**< Channel 2 memory address register */ - const uint32 RESERVED2; /**< Reserved. */ - __io uint32 CCR3; /**< Channel 3 configuration register */ - __io uint32 CNDTR3; /**< Channel 3 number of data register */ - __io uint32 CPAR3; /**< Channel 3 peripheral address register */ - __io uint32 CMAR3; /**< Channel 3 memory address register */ - const uint32 RESERVED3; /**< Reserved. */ - __io uint32 CCR4; /**< Channel 4 configuration register */ - __io uint32 CNDTR4; /**< Channel 4 number of data register */ - __io uint32 CPAR4; /**< Channel 4 peripheral address register */ - __io uint32 CMAR4; /**< Channel 4 memory address register */ - const uint32 RESERVED4; /**< Reserved. */ - __io uint32 CCR5; /**< Channel 5 configuration register */ - __io uint32 CNDTR5; /**< Channel 5 number of data register */ - __io uint32 CPAR5; /**< Channel 5 peripheral address register */ - __io uint32 CMAR5; /**< Channel 5 memory address register */ - const uint32 RESERVED5; /**< Reserved. */ - __io uint32 CCR6; /**< Channel 6 configuration register */ - __io uint32 CNDTR6; /**< Channel 6 number of data register */ - __io uint32 CPAR6; /**< Channel 6 peripheral address register */ - __io uint32 CMAR6; /**< Channel 6 memory address register */ - const uint32 RESERVED6; /**< Reserved. */ - __io uint32 CCR7; /**< Channel 7 configuration register */ - __io uint32 CNDTR7; /**< Channel 7 number of data register */ - __io uint32 CPAR7; /**< Channel 7 peripheral address register */ - __io uint32 CMAR7; /**< Channel 7 memory address register */ - const uint32 RESERVED7; /**< Reserved. */ -} dma_reg_map; - -/** DMA controller 1 register map base pointer */ -#define DMA1_BASE ((struct dma_reg_map*)0x40020000) - -#ifdef STM32_HIGH_DENSITY -/** DMA controller 2 register map base pointer */ -#define DMA2_BASE ((struct dma_reg_map*)0x40020400) -#endif - -/* - * Register bit definitions - */ - -/* Interrupt status register */ - -#define DMA_ISR_TEIF7_BIT 27 -#define DMA_ISR_HTIF7_BIT 26 -#define DMA_ISR_TCIF7_BIT 25 -#define DMA_ISR_GIF7_BIT 24 -#define DMA_ISR_TEIF6_BIT 23 -#define DMA_ISR_HTIF6_BIT 22 -#define DMA_ISR_TCIF6_BIT 21 -#define DMA_ISR_GIF6_BIT 20 -#define DMA_ISR_TEIF5_BIT 19 -#define DMA_ISR_HTIF5_BIT 18 -#define DMA_ISR_TCIF5_BIT 17 -#define DMA_ISR_GIF5_BIT 16 -#define DMA_ISR_TEIF4_BIT 15 -#define DMA_ISR_HTIF4_BIT 14 -#define DMA_ISR_TCIF4_BIT 13 -#define DMA_ISR_GIF4_BIT 12 -#define DMA_ISR_TEIF3_BIT 11 -#define DMA_ISR_HTIF3_BIT 10 -#define DMA_ISR_TCIF3_BIT 9 -#define DMA_ISR_GIF3_BIT 8 -#define DMA_ISR_TEIF2_BIT 7 -#define DMA_ISR_HTIF2_BIT 6 -#define DMA_ISR_TCIF2_BIT 5 -#define DMA_ISR_GIF2_BIT 4 -#define DMA_ISR_TEIF1_BIT 3 -#define DMA_ISR_HTIF1_BIT 2 -#define DMA_ISR_TCIF1_BIT 1 -#define DMA_ISR_GIF1_BIT 0 - -#define DMA_ISR_TEIF7 BIT(DMA_ISR_TEIF7_BIT) -#define DMA_ISR_HTIF7 BIT(DMA_ISR_HTIF7_BIT) -#define DMA_ISR_TCIF7 BIT(DMA_ISR_TCIF7_BIT) -#define DMA_ISR_GIF7 BIT(DMA_ISR_GIF7_BIT) -#define DMA_ISR_TEIF6 BIT(DMA_ISR_TEIF6_BIT) -#define DMA_ISR_HTIF6 BIT(DMA_ISR_HTIF6_BIT) -#define DMA_ISR_TCIF6 BIT(DMA_ISR_TCIF6_BIT) -#define DMA_ISR_GIF6 BIT(DMA_ISR_GIF6_BIT) -#define DMA_ISR_TEIF5 BIT(DMA_ISR_TEIF5_BIT) -#define DMA_ISR_HTIF5 BIT(DMA_ISR_HTIF5_BIT) -#define DMA_ISR_TCIF5 BIT(DMA_ISR_TCIF5_BIT) -#define DMA_ISR_GIF5 BIT(DMA_ISR_GIF5_BIT) -#define DMA_ISR_TEIF4 BIT(DMA_ISR_TEIF4_BIT) -#define DMA_ISR_HTIF4 BIT(DMA_ISR_HTIF4_BIT) -#define DMA_ISR_TCIF4 BIT(DMA_ISR_TCIF4_BIT) -#define DMA_ISR_GIF4 BIT(DMA_ISR_GIF4_BIT) -#define DMA_ISR_TEIF3 BIT(DMA_ISR_TEIF3_BIT) -#define DMA_ISR_HTIF3 BIT(DMA_ISR_HTIF3_BIT) -#define DMA_ISR_TCIF3 BIT(DMA_ISR_TCIF3_BIT) -#define DMA_ISR_GIF3 BIT(DMA_ISR_GIF3_BIT) -#define DMA_ISR_TEIF2 BIT(DMA_ISR_TEIF2_BIT) -#define DMA_ISR_HTIF2 BIT(DMA_ISR_HTIF2_BIT) -#define DMA_ISR_TCIF2 BIT(DMA_ISR_TCIF2_BIT) -#define DMA_ISR_GIF2 BIT(DMA_ISR_GIF2_BIT) -#define DMA_ISR_TEIF1 BIT(DMA_ISR_TEIF1_BIT) -#define DMA_ISR_HTIF1 BIT(DMA_ISR_HTIF1_BIT) -#define DMA_ISR_TCIF1 BIT(DMA_ISR_TCIF1_BIT) -#define DMA_ISR_GIF1 BIT(DMA_ISR_GIF1_BIT) - -/* Interrupt flag clear register */ - -#define DMA_IFCR_CTEIF7_BIT 27 -#define DMA_IFCR_CHTIF7_BIT 26 -#define DMA_IFCR_CTCIF7_BIT 25 -#define DMA_IFCR_CGIF7_BIT 24 -#define DMA_IFCR_CTEIF6_BIT 23 -#define DMA_IFCR_CHTIF6_BIT 22 -#define DMA_IFCR_CTCIF6_BIT 21 -#define DMA_IFCR_CGIF6_BIT 20 -#define DMA_IFCR_CTEIF5_BIT 19 -#define DMA_IFCR_CHTIF5_BIT 18 -#define DMA_IFCR_CTCIF5_BIT 17 -#define DMA_IFCR_CGIF5_BIT 16 -#define DMA_IFCR_CTEIF4_BIT 15 -#define DMA_IFCR_CHTIF4_BIT 14 -#define DMA_IFCR_CTCIF4_BIT 13 -#define DMA_IFCR_CGIF4_BIT 12 -#define DMA_IFCR_CTEIF3_BIT 11 -#define DMA_IFCR_CHTIF3_BIT 10 -#define DMA_IFCR_CTCIF3_BIT 9 -#define DMA_IFCR_CGIF3_BIT 8 -#define DMA_IFCR_CTEIF2_BIT 7 -#define DMA_IFCR_CHTIF2_BIT 6 -#define DMA_IFCR_CTCIF2_BIT 5 -#define DMA_IFCR_CGIF2_BIT 4 -#define DMA_IFCR_CTEIF1_BIT 3 -#define DMA_IFCR_CHTIF1_BIT 2 -#define DMA_IFCR_CTCIF1_BIT 1 -#define DMA_IFCR_CGIF1_BIT 0 - -#define DMA_IFCR_CTEIF7 BIT(DMA_IFCR_CTEIF7_BIT) -#define DMA_IFCR_CHTIF7 BIT(DMA_IFCR_CHTIF7_BIT) -#define DMA_IFCR_CTCIF7 BIT(DMA_IFCR_CTCIF7_BIT) -#define DMA_IFCR_CGIF7 BIT(DMA_IFCR_CGIF7_BIT) -#define DMA_IFCR_CTEIF6 BIT(DMA_IFCR_CTEIF6_BIT) -#define DMA_IFCR_CHTIF6 BIT(DMA_IFCR_CHTIF6_BIT) -#define DMA_IFCR_CTCIF6 BIT(DMA_IFCR_CTCIF6_BIT) -#define DMA_IFCR_CGIF6 BIT(DMA_IFCR_CGIF6_BIT) -#define DMA_IFCR_CTEIF5 BIT(DMA_IFCR_CTEIF5_BIT) -#define DMA_IFCR_CHTIF5 BIT(DMA_IFCR_CHTIF5_BIT) -#define DMA_IFCR_CTCIF5 BIT(DMA_IFCR_CTCIF5_BIT) -#define DMA_IFCR_CGIF5 BIT(DMA_IFCR_CGIF5_BIT) -#define DMA_IFCR_CTEIF4 BIT(DMA_IFCR_CTEIF4_BIT) -#define DMA_IFCR_CHTIF4 BIT(DMA_IFCR_CHTIF4_BIT) -#define DMA_IFCR_CTCIF4 BIT(DMA_IFCR_CTCIF4_BIT) -#define DMA_IFCR_CGIF4 BIT(DMA_IFCR_CGIF4_BIT) -#define DMA_IFCR_CTEIF3 BIT(DMA_IFCR_CTEIF3_BIT) -#define DMA_IFCR_CHTIF3 BIT(DMA_IFCR_CHTIF3_BIT) -#define DMA_IFCR_CTCIF3 BIT(DMA_IFCR_CTCIF3_BIT) -#define DMA_IFCR_CGIF3 BIT(DMA_IFCR_CGIF3_BIT) -#define DMA_IFCR_CTEIF2 BIT(DMA_IFCR_CTEIF2_BIT) -#define DMA_IFCR_CHTIF2 BIT(DMA_IFCR_CHTIF2_BIT) -#define DMA_IFCR_CTCIF2 BIT(DMA_IFCR_CTCIF2_BIT) -#define DMA_IFCR_CGIF2 BIT(DMA_IFCR_CGIF2_BIT) -#define DMA_IFCR_CTEIF1 BIT(DMA_IFCR_CTEIF1_BIT) -#define DMA_IFCR_CHTIF1 BIT(DMA_IFCR_CHTIF1_BIT) -#define DMA_IFCR_CTCIF1 BIT(DMA_IFCR_CTCIF1_BIT) -#define DMA_IFCR_CGIF1 BIT(DMA_IFCR_CGIF1_BIT) - -/* Channel configuration register */ - -#define DMA_CCR_MEM2MEM_BIT 14 -#define DMA_CCR_MINC_BIT 7 -#define DMA_CCR_PINC_BIT 6 -#define DMA_CCR_CIRC_BIT 5 -#define DMA_CCR_DIR_BIT 4 -#define DMA_CCR_TEIE_BIT 3 -#define DMA_CCR_HTIE_BIT 2 -#define DMA_CCR_TCIE_BIT 1 -#define DMA_CCR_EN_BIT 0 - -#define DMA_CCR_MEM2MEM BIT(DMA_CCR_MEM2MEM_BIT) -#define DMA_CCR_PL (0x3 << 12) -#define DMA_CCR_PL_LOW (0x0 << 12) -#define DMA_CCR_PL_MEDIUM (0x1 << 12) -#define DMA_CCR_PL_HIGH (0x2 << 12) -#define DMA_CCR_PL_VERY_HIGH (0x3 << 12) -#define DMA_CCR_MSIZE (0x3 << 10) -#define DMA_CCR_MSIZE_8BITS (0x0 << 10) -#define DMA_CCR_MSIZE_16BITS (0x1 << 10) -#define DMA_CCR_MSIZE_32BITS (0x2 << 10) -#define DMA_CCR_PSIZE (0x3 << 8) -#define DMA_CCR_PSIZE_8BITS (0x0 << 8) -#define DMA_CCR_PSIZE_16BITS (0x1 << 8) -#define DMA_CCR_PSIZE_32BITS (0x2 << 8) -#define DMA_CCR_MINC BIT(DMA_CCR_MINC_BIT) -#define DMA_CCR_PINC BIT(DMA_CCR_PINC_BIT) -#define DMA_CCR_CIRC BIT(DMA_CCR_CIRC_BIT) -#define DMA_CCR_DIR BIT(DMA_CCR_DIR_BIT) -#define DMA_CCR_TEIE BIT(DMA_CCR_TEIE_BIT) -#define DMA_CCR_HTIE BIT(DMA_CCR_HTIE_BIT) -#define DMA_CCR_TCIE BIT(DMA_CCR_TCIE_BIT) -#define DMA_CCR_EN BIT(DMA_CCR_EN_BIT) - -/* - * Devices - */ - -/** Encapsulates state related to a DMA channel interrupt. */ -typedef struct dma_handler_config { - void (*handler)(void); /**< User-specified channel interrupt - handler */ - nvic_irq_num irq_line; /**< Channel's NVIC interrupt number */ -} dma_handler_config; - -/** DMA device type */ -typedef struct dma_dev { - dma_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< Clock ID */ - dma_handler_config handlers[]; /**< - * @brief IRQ handlers and NVIC numbers. - * - * @see dma_attach_interrupt() - * @see dma_detach_interrupt() - */ -} dma_dev; - -extern dma_dev *DMA1; -#ifdef STM32_HIGH_DENSITY -extern dma_dev *DMA2; -#endif - -/* - * Convenience functions - */ - -void dma_init(dma_dev *dev); - -/** Flags for DMA transfer configuration. */ -typedef enum dma_mode_flags { - DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ - DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ - DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ - DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ - DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ - DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ - DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ - DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ -} dma_mode_flags; - -/** Source and destination transfer sizes. */ -typedef enum dma_xfer_size { - DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ - DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ - DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ -} dma_xfer_size; - -/** DMA channel */ -typedef enum dma_channel { - DMA_CH1 = 1, /**< Channel 1 */ - DMA_CH2 = 2, /**< Channel 2 */ - DMA_CH3 = 3, /**< Channel 3 */ - DMA_CH4 = 4, /**< Channel 4 */ - DMA_CH5 = 5, /**< Channel 5 */ - DMA_CH6 = 6, /**< Channel 6 */ - DMA_CH7 = 7, /**< Channel 7 */ -} dma_channel; - -void dma_setup_transfer(dma_dev *dev, - dma_channel channel, - __io void *peripheral_address, - dma_xfer_size peripheral_size, - __io void *memory_address, - dma_xfer_size memory_size, - uint32 mode); - -void dma_set_num_transfers(dma_dev *dev, - dma_channel channel, - uint16 num_transfers); - -/** DMA transfer priority. */ -typedef enum dma_priority { - DMA_PRIORITY_LOW = DMA_CCR_PL_LOW, /**< Low priority */ - DMA_PRIORITY_MEDIUM = DMA_CCR_PL_MEDIUM, /**< Medium priority */ - DMA_PRIORITY_HIGH = DMA_CCR_PL_HIGH, /**< High priority */ - DMA_PRIORITY_VERY_HIGH = DMA_CCR_PL_VERY_HIGH /**< Very high priority */ -} dma_priority; - -void dma_set_priority(dma_dev *dev, - dma_channel channel, - dma_priority priority); - -void dma_attach_interrupt(dma_dev *dev, - dma_channel channel, - void (*handler)(void)); -void dma_detach_interrupt(dma_dev *dev, dma_channel channel); - -/** - * Encodes the reason why a DMA interrupt was called. - * @see dma_get_irq_cause() - */ -typedef enum dma_irq_cause { - DMA_TRANSFER_COMPLETE, /**< Transfer is complete. */ - DMA_TRANSFER_HALF_COMPLETE, /**< Transfer is half complete. */ - DMA_TRANSFER_ERROR, /**< Error occurred during transfer. */ -} dma_irq_cause; - -dma_irq_cause dma_get_irq_cause(dma_dev *dev, dma_channel channel); - -void dma_enable(dma_dev *dev, dma_channel channel); -void dma_disable(dma_dev *dev, dma_channel channel); - -void dma_set_mem_addr(dma_dev *dev, dma_channel channel, __io void *address); -void dma_set_per_addr(dma_dev *dev, dma_channel channel, __io void *address); - -/** - * @brief DMA channel register map type. - * - * Provides access to an individual channel's registers. - */ -typedef struct dma_channel_reg_map { - __io uint32 CCR; /**< Channel configuration register */ - __io uint32 CNDTR; /**< Channel number of data register */ - __io uint32 CPAR; /**< Channel peripheral address register */ - __io uint32 CMAR; /**< Channel memory address register */ -} dma_channel_reg_map; - -#define DMA_CHANNEL_NREGS 5 - -/** - * @brief Obtain a pointer to an individual DMA channel's registers. - * - * For example, dma_channel_regs(DMA1, DMA_CH1)->CCR is DMA1_BASE->CCR1. - * - * @param dev DMA device - * @param channel DMA channel whose channel register map to obtain. - */ -static inline dma_channel_reg_map* dma_channel_regs(dma_dev *dev, - dma_channel channel) { - __io uint32 *ccr1 = &dev->regs->CCR1; - return (dma_channel_reg_map*)(ccr1 + DMA_CHANNEL_NREGS * (channel - 1)); -} - -/** - * @brief Check if a DMA channel is enabled - * @param dev DMA device - * @param channel Channel whose enabled bit to check. - */ -static inline uint8 dma_is_channel_enabled(dma_dev *dev, dma_channel channel) { - return (uint8)(dma_channel_regs(dev, channel)->CCR & DMA_CCR_EN); -} - -/** - * @brief Get the ISR status bits for a DMA channel. - * - * The bits are returned right-aligned, in the following order: - * transfer error flag, half-transfer flag, transfer complete flag, - * global interrupt flag. - * - * If you're attempting to figure out why a DMA interrupt fired; you - * may find dma_get_irq_cause() more convenient. - * - * @param dev DMA device - * @param channel Channel whose ISR bits to return. - * @see dma_get_irq_cause(). - */ -static inline uint8 dma_get_isr_bits(dma_dev *dev, dma_channel channel) { - uint8 shift = (channel - 1) * 4; - return (dev->regs->ISR >> shift) & 0xF; -} - -/** - * @brief Clear the ISR status bits for a given DMA channel. - * - * If you're attempting to clean up after yourself in a DMA interrupt, - * you may find dma_get_irq_cause() more convenient. - * - * @param dev DMA device - * @param channel Channel whose ISR bits to clear. - * @see dma_get_irq_cause() - */ -static inline void dma_clear_isr_bits(dma_dev *dev, dma_channel channel) { - dev->regs->IFCR = BIT(4 * (channel - 1)); -} - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/dmaF2.c b/STM32F4/cores/maple/libmaple/dmaF4.c similarity index 91% rename from STM32F4/cores/maple/libmaple/dmaF2.c rename to STM32F4/cores/maple/libmaple/dmaF4.c index 0911e584a..add3d8e51 100644 --- a/STM32F4/cores/maple/libmaple/dmaF2.c +++ b/STM32F4/cores/maple/libmaple/dmaF4.c @@ -24,10 +24,10 @@ * SOFTWARE. *****************************************************************************/ - #ifdef STM32F2 +#ifdef STM32F4 /** - * @file dmaF2.c + * @file dmaF4.c * @brief Direct Memory Access peripheral support */ @@ -117,33 +117,16 @@ void dma_detach_interrupt(dma_dev *dev, dma_stream stream) { dev->handlers[stream].handler = NULL; } +const uint8 dma_isr_bits_shift[] = { 0, 6, 16, 22}; + +uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream) { + if ( stream&0xFC ) return ((dev->regs->HISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; + else return ((dev->regs->LISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; +} + void dma_clear_isr_bits(dma_dev *dev, dma_stream stream) { - switch (stream) { - case 0: - dev->regs->LIFCR|=0x0000003d; - break; - case 1: - dev->regs->LIFCR|=0x00000f40; - break; - case 2: - dev->regs->LIFCR|=0x003d0000; - break; - case 3: - dev->regs->LIFCR|=0x0f400000; - break; - case 4: - dev->regs->HIFCR|=0x0000003d; - break; - case 5: - dev->regs->HIFCR|=0x00000f40; - break; - case 6: - dev->regs->HIFCR|=0x003d0000; - break; - case 7: - dev->regs->HIFCR|=0x0f400000; - break; - } + if ( stream&0xFC ) dev->regs->HIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; + else dev->regs->LIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; } /* diff --git a/STM32F4/cores/maple/libmaple/dmaF2.h b/STM32F4/cores/maple/libmaple/dmaF4.h similarity index 74% rename from STM32F4/cores/maple/libmaple/dmaF2.h rename to STM32F4/cores/maple/libmaple/dmaF4.h index 6f7086f36..757906c82 100644 --- a/STM32F4/cores/maple/libmaple/dmaF2.h +++ b/STM32F4/cores/maple/libmaple/dmaF4.h @@ -25,7 +25,7 @@ *****************************************************************************/ /** - * @file dma.h + * @file dmaF4.h * * @author Marti Bolivar ; * Original implementation by Michael Hope @@ -84,7 +84,7 @@ typedef struct dma_reg_map { * Register bit definitions */ -/* Channel configuration register */ +/* Stream configuration register */ #define DMA_CR_CH0 (0x0 << 25) #define DMA_CR_CH1 (0x1 << 25) @@ -136,6 +136,25 @@ typedef struct dma_reg_map { #define DMA_CR_DMEIE (0x1 << 1) #define DMA_CR_EN (0x1) +typedef enum dma_channel { + DMA_CH0 = DMA_CR_CH0, /**< Channel 0 */ + DMA_CH1 = DMA_CR_CH1, /**< Channel 1 */ + DMA_CH2 = DMA_CR_CH2, /**< Channel 2 */ + DMA_CH3 = DMA_CR_CH3, /**< Channel 3 */ + DMA_CH4 = DMA_CR_CH4, /**< Channel 4 */ + DMA_CH5 = DMA_CR_CH5, /**< Channel 5 */ + DMA_CH6 = DMA_CR_CH6, /**< Channel 6 */ + DMA_CH7 = DMA_CR_CH7, /**< Channel 7 */ +} dma_channel; + +/* Device interrupt status register flags */ + +#define DMA_ISR_TCIF (1 << 5) +#define DMA_ISR_HTIF (1 << 4) +#define DMA_ISR_TEIF (1 << 3) +#define DMA_ISR_DMEIF (1 << 2) +#define DMA_ISR_FEIF (1 << 0) + /* * Devices */ @@ -166,25 +185,35 @@ extern dma_dev *DMA2; * Convenience functions */ -void dma_init(dma_dev *dev); +extern void dma_init(dma_dev *dev); /** Flags for DMA transfer configuration. */ typedef enum dma_mode_flags { - DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ - DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ - DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ - DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ - DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ - DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ - DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ - DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ + DMA_MEM_BUF_0 = DMA_CR_CT0, /**< Current memory target buffer 0 */ + DMA_MEM_BUF_1 = DMA_CR_CT1, /**< Current memory target buffer 1 */ + DMA_DBL_BUF_MODE = DMA_CR_DBM, /**< Current memory double buffer mode */ + DMA_PINC_OFFSET = DMA_CR_PINCOS, /**< Peripheral increment offset size */ + DMA_MINC_MODE = DMA_CR_MINC, /**< Memory increment mode */ + DMA_PINC_MODE = DMA_CR_PINC, /**< Peripheral increment mode */ + DMA_CIRC_MODE = DMA_CR_CIRC, /**< Memory Circular mode */ + DMA_FROM_PER = DMA_CR_DIR_P2M, /**< Read from memory to peripheral */ + DMA_FROM_MEM = DMA_CR_DIR_M2P, /**< Read from memory to peripheral */ + DMA_MEM_TO_MEM = DMA_CR_DIR_M2M, /**< Read from memory to memory */ + DMA_PERIF_CTRL = DMA_CR_PFCTRL, /**< Peripheral flow controller */ + DMA_PRIO_MEDIUM = DMA_CR_PL_MEDIUM, /**< Medium priority */ + DMA_PRIO_HIGH = DMA_CR_PL_HIGH, /**< High priority */ + DMA_PRIO_VERY_HIGH = DMA_CR_PL_VERY_HIGH, /**< Very high priority */ + DMA_TRNS_CMPLT = DMA_CR_TCIE, /**< Interrupt on transfer completion */ + DMA_TRNS_HALF = DMA_CR_HTIE, /**< Interrupt on half-transfer */ + DMA_TRNS_ERR = DMA_CR_TEIE, /**< Interrupt on transfer error */ + DMA_DIR_MODE_ERR = DMA_CR_DMEIE /**< Interrupt on direct mode error */ } dma_mode_flags; /** Source and destination transfer sizes. */ typedef enum dma_xfer_size { - DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ - DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ - DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ + DMA_SIZE_8BITS = ( DMA_CR_MSIZE_8BITS|DMA_CR_PSIZE_8BITS ), /**< 8-bit transfers */ + DMA_SIZE_16BITS = (DMA_CR_MSIZE_16BITS|DMA_CR_PSIZE_16BITS), /**< 16-bit transfers */ + DMA_SIZE_32BITS = (DMA_CR_MSIZE_32BITS|DMA_CR_PSIZE_32BITS) /**< 32-bit transfers */ } dma_xfer_size; /** DMA channel */ @@ -201,17 +230,17 @@ typedef enum dma_stream { static inline void dma_setup_transfer(dma_dev *dev, dma_stream stream, + dma_channel channel, + dma_xfer_size trx_size, __io void *peripheral_address, __io void *memory_address0, __io void *memory_address1, - uint32 flags, - uint32 fifo_flags) { + uint32 flags) { dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; // disable dev->regs->STREAM[stream].PAR = (uint32)peripheral_address; dev->regs->STREAM[stream].M0AR = (uint32)memory_address0; dev->regs->STREAM[stream].M1AR = (uint32)memory_address1; - dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits - dev->regs->STREAM[stream].CR = flags & 0x0feffffe; // mask out reserved and enable + dev->regs->STREAM[stream].CR = ((flags|channel|trx_size) & 0x0feffffe); // mask out reserved and enable } static inline void dma_set_num_transfers(dma_dev *dev, @@ -220,6 +249,12 @@ static inline void dma_set_num_transfers(dma_dev *dev, dev->regs->STREAM[stream].NDTR = num_transfers; } +static inline void dma_set_fifo_flags(dma_dev *dev, + dma_stream stream, + uint8 fifo_flags) { + dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits +} + void dma_attach_interrupt(dma_dev *dev, dma_stream stream, void (*handler)(void)); @@ -232,6 +267,7 @@ static inline void dma_enable(dma_dev *dev, dma_stream stream) { static inline void dma_disable(dma_dev *dev, dma_stream stream) { dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; + while (dev->regs->STREAM[stream].CR & DMA_CR_EN); // wait till EN bit is reset, see AN4031, chapter 4.1 } /** diff --git a/STM32F4/cores/maple/libmaple/exti.h b/STM32F4/cores/maple/libmaple/exti.h index bac8adcf4..063f2d7f1 100644 --- a/STM32F4/cores/maple/libmaple/exti.h +++ b/STM32F4/cores/maple/libmaple/exti.h @@ -52,11 +52,7 @@ typedef struct exti_reg_map { } exti_reg_map; /** EXTI register map base pointer */ -#ifdef STM32F2 #define EXTI_BASE ((struct exti_reg_map*)0x40013C00) -#else -#define EXTI_BASE ((struct exti_reg_map*)0x40010400) -#endif /** External interrupt trigger mode */ typedef enum exti_trigger_mode { diff --git a/STM32F4/cores/maple/libmaple/fsmc.c b/STM32F4/cores/maple/libmaple/fsmc.c index 06ca7df6a..42b0d77b4 100644 --- a/STM32F4/cores/maple/libmaple/fsmc.c +++ b/STM32F4/cores/maple/libmaple/fsmc.c @@ -39,27 +39,28 @@ */ void fsmc_sram_init_gpios(void) { /* Data lines... */ - gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD0, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD1, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD8, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD9, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD10, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD14, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD15, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE7, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE8, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE9, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE10, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE11, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE12, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE13, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE14, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PE15, GPIO_AF_OUTPUT_PP); /* Address lines... */ - gpio_set_mode(GPIOD, 11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD, 13, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD11, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD12, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PD13, GPIO_AF_OUTPUT_PP); +#if 0 // not available on LQFP package gpio_set_mode(GPIOF, 0, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 1, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOF, 2, GPIO_AF_OUTPUT_PP); @@ -76,18 +77,20 @@ void fsmc_sram_init_gpios(void) { gpio_set_mode(GPIOG, 3, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 4, GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOG, 5, GPIO_AF_OUTPUT_PP); - +#endif // not available on LQFP package /* And control lines... */ - gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP); // NOE - gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP); // NWE + gpio_set_mode(PD4, GPIO_AF_OUTPUT_PP); // NOE + gpio_set_mode(PD5, GPIO_AF_OUTPUT_PP); // NWE - gpio_set_mode(GPIOD, 7, GPIO_AF_OUTPUT_PP); // NE1 + gpio_set_mode(PD7, GPIO_AF_OUTPUT_PP); // NE1 +#if 0 // not available on LQFP package gpio_set_mode(GPIOG, 9, GPIO_AF_OUTPUT_PP); // NE2 gpio_set_mode(GPIOG, 10, GPIO_AF_OUTPUT_PP); // NE3 gpio_set_mode(GPIOG, 12, GPIO_AF_OUTPUT_PP); // NE4 +#endif // not available on LQFP package - gpio_set_mode(GPIOE, 0, GPIO_AF_OUTPUT_PP); // NBL0 - gpio_set_mode(GPIOE, 1, GPIO_AF_OUTPUT_PP); // NBL1 + gpio_set_mode(PE0, GPIO_AF_OUTPUT_PP); // NBL0 + gpio_set_mode(PE1, GPIO_AF_OUTPUT_PP); // NBL1 } #endif /* STM32_HIGH_DENSITY */ diff --git a/STM32F4/cores/maple/libmaple/gpio.h b/STM32F4/cores/maple/libmaple/gpio.h index 4d42386c1..f1a141fee 100644 --- a/STM32F4/cores/maple/libmaple/gpio.h +++ b/STM32F4/cores/maple/libmaple/gpio.h @@ -31,8 +31,102 @@ * (AFIO) prototypes, defines, and inlined access functions. */ -#ifdef STM32F2 -#include "gpioF2.h" -#else -#include "gpioF1.h" +#ifndef _GPIO_H_ +#define _GPIO_H_ + +#include "libmaple.h" +#include "boards.h" + +#ifdef __cplusplus +extern "C"{ #endif + + +/** + * @brief Get a GPIO port's corresponding afio_exti_port. + * @param dev GPIO device whose afio_exti_port to return. + */ +static inline afio_exti_port gpio_exti_port(const gpio_dev *dev) { + return dev->exti_port; +} + +/** + * Set or reset a GPIO pin. + * + * Pin must have previously been configured to output mode. + * + * @param dev GPIO device whose pin to set. + * @param pin Pin on to set or reset + * @param val If true, set the pin. If false, reset the pin. + */ +static inline void gpio_write_pin(uint8_t pin, uint8 val) { + if (val) { + (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(pin&0x0F); + } else { + (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(pin&0x0F); + } +} + +static inline void gpio_set_pin(uint8_t pin) { + (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(pin&0x0F); +} + +static inline void gpio_clear_pin(uint8_t pin) { + (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(pin&0x0F); +} + +/** + * Determine whether or not a GPIO pin is set. + * + * Pin must have previously been configured to input mode. + * + * @param dev GPIO device whose pin to test. + * @param pin Pin on dev to test. + * @return True if the pin is set, false otherwise. + */ +static inline uint32 gpio_read_pin(uint8_t pin) { + return (PIN_MAP[pin].gpio_device)->regs->IDR & BIT(pin&0x0F); +} + +/** + * Toggle a pin configured as output push-pull. + * @param dev GPIO device. + * @param pin Pin on dev to toggle. + */ +static inline void gpio_toggle_pin(uint8_t pin) { + (PIN_MAP[pin].gpio_device)->regs->ODR = (PIN_MAP[pin].gpio_device)->regs->ODR ^ BIT(pin&0x0F); +} + +/* + * GPIO Convenience routines + */ + +extern void gpio_init(const gpio_dev *dev); +extern void gpio_init_all(void); +extern void gpio_set_mode(uint8_t pin, gpio_pin_mode mode); +extern void gpio_set_af_mode(uint8_t pin, int mode); + +/* + * AFIO convenience routines + */ + +extern void afio_init(void); +extern void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port); +extern void afio_remap(afio_remap_peripheral p); + +/** + * @brief Enable or disable the JTAG and SW debug ports. + * @param config Desired debug port configuration + * @see afio_debug_cfg + */ +static inline void afio_cfg_debug_ports(afio_debug_cfg config) { + //__io uint32 *mapr = &AFIO_BASE->MAPR; + //*mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; +} + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/STM32F4/cores/maple/libmaple/gpioF1.c b/STM32F4/cores/maple/libmaple/gpioF1.c deleted file mode 100644 index 846b7542a..000000000 --- a/STM32F4/cores/maple/libmaple/gpioF1.c +++ /dev/null @@ -1,200 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -#ifdef STM32F1 - -/** - * @file gpio.c - * @brief GPIO initialization routine - */ - -#include "gpio.h" -#include "rcc.h" - -/* - * GPIO devices - */ - -gpio_dev gpioa = { - .regs = GPIOA_BASE, - .clk_id = RCC_GPIOA, - .exti_port = AFIO_EXTI_PA, -}; -/** GPIO port A device. */ -gpio_dev* const GPIOA = &gpioa; - -gpio_dev gpiob = { - .regs = GPIOB_BASE, - .clk_id = RCC_GPIOB, - .exti_port = AFIO_EXTI_PB, -}; -/** GPIO port B device. */ -gpio_dev* const GPIOB = &gpiob; - -gpio_dev gpioc = { - .regs = GPIOC_BASE, - .clk_id = RCC_GPIOC, - .exti_port = AFIO_EXTI_PC, -}; -/** GPIO port C device. */ -gpio_dev* const GPIOC = &gpioc; - -gpio_dev gpiod = { - .regs = GPIOD_BASE, - .clk_id = RCC_GPIOD, - .exti_port = AFIO_EXTI_PD, -}; -/** GPIO port D device. */ -gpio_dev* const GPIOD = &gpiod; - -#ifdef STM32_HIGH_DENSITY -gpio_dev gpioe = { - .regs = GPIOE_BASE, - .clk_id = RCC_GPIOE, - .exti_port = AFIO_EXTI_PE, -}; -/** GPIO port E device. */ -gpio_dev* const GPIOE = &gpioe; - -gpio_dev gpiof = { - .regs = GPIOF_BASE, - .clk_id = RCC_GPIOF, - .exti_port = AFIO_EXTI_PF, -}; -/** GPIO port F device. */ -gpio_dev* const GPIOF = &gpiof; - -gpio_dev gpiog = { - .regs = GPIOG_BASE, - .clk_id = RCC_GPIOG, - .exti_port = AFIO_EXTI_PG, -}; -/** GPIO port G device. */ -gpio_dev* const GPIOG = &gpiog; -#endif - -/* - * GPIO convenience routines - */ - -/** - * Initialize a GPIO device. - * - * Enables the clock for and resets the given device. - * - * @param dev GPIO device to initialize. - */ -void gpio_init(gpio_dev *dev) { - rcc_clk_enable(dev->clk_id); - rcc_reset_dev(dev->clk_id); -} - -/** - * Initialize and reset all available GPIO devices. - */ -void gpio_init_all(void) { - gpio_init(GPIOA); - gpio_init(GPIOB); - gpio_init(GPIOC); - gpio_init(GPIOD); -#ifdef STM32_HIGH_DENSITY - gpio_init(GPIOE); - gpio_init(GPIOF); - gpio_init(GPIOG); -#endif -} - -/** - * Set the mode of a GPIO pin. - * - * @param dev GPIO device. - * @param pin Pin on the device whose mode to set, 0--15. - * @param mode General purpose or alternate function mode to set the pin to. - * @see gpio_pin_mode - */ -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { - gpio_reg_map *regs = dev->regs; - __io uint32 *cr = ®s->CRL + (pin >> 3); - uint32 shift = (pin & 0x7) * 4; - uint32 tmp = *cr; - - tmp &= ~(0xF << shift); - tmp |= (mode == GPIO_INPUT_PU ? GPIO_INPUT_PD : mode) << shift; - *cr = tmp; - - if (mode == GPIO_INPUT_PD) { - regs->ODR &= ~BIT(pin); - } else if (mode == GPIO_INPUT_PU) { - regs->ODR |= BIT(pin); - } -} - -/* - * AFIO - */ - -/** - * @brief Initialize the AFIO clock, and reset the AFIO registers. - */ -void afio_init(void) { - rcc_clk_enable(RCC_AFIO); - rcc_reset_dev(RCC_AFIO); -} - -#define AFIO_EXTI_SEL_MASK 0xF - -/** - * @brief Select a source input for an external interrupt. - * - * @param exti External interrupt. - * @param gpio_port Port which contains pin to use as source input. - * @see afio_exti_num - * @see afio_exti_port - */ -void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port) { - __io uint32 *exti_cr = &AFIO_BASE->EXTICR1 + exti / 4; - uint32 shift = 4 * (exti % 4); - uint32 cr = *exti_cr; - - cr &= ~(AFIO_EXTI_SEL_MASK << shift); - cr |= gpio_port << shift; - *exti_cr = cr; -} - -/** - * @brief Perform an alternate function remap. - * @param remapping Remapping to perform. - */ -void afio_remap(afio_remap_peripheral remapping) { - if (remapping & AFIO_REMAP_USE_MAPR2) { - remapping &= ~AFIO_REMAP_USE_MAPR2; - AFIO_BASE->MAPR2 |= remapping; - } else { - AFIO_BASE->MAPR |= remapping; - } -} - -#endif diff --git a/STM32F4/cores/maple/libmaple/gpioF1.h b/STM32F4/cores/maple/libmaple/gpioF1.h deleted file mode 100644 index c69efb417..000000000 --- a/STM32F4/cores/maple/libmaple/gpioF1.h +++ /dev/null @@ -1,530 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. -*****************************************************************************/ - -/** - * @file gpio.h - * - * @brief General purpose I/O (GPIO) and Alternate Function I/O - * (AFIO) prototypes, defines, and inlined access functions. - */ - -#ifndef _GPIO_H_ -#define _GPIO_H_ - -#include "libmaple.h" -#include "rcc.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * GPIO register maps and devices - */ - -/** GPIO register map type */ -typedef struct gpio_reg_map { - __io uint32 CRL; /**< Port configuration register low */ - __io uint32 CRH; /**< Port configuration register high */ - __io uint32 IDR; /**< Port input data register */ - __io uint32 ODR; /**< Port output data register */ - __io uint32 BSRR; /**< Port bit set/reset register */ - __io uint32 BRR; /**< Port bit reset register */ - __io uint32 LCKR; /**< Port configuration lock register */ -} gpio_reg_map; - -/** - * @brief External interrupt line port selector. - * - * Used to determine which GPIO port to map an external interrupt line - * onto. */ -/* (See AFIO sections, below) */ -typedef enum afio_exti_port { - AFIO_EXTI_PA, /**< Use port A (PAx) pin. */ - AFIO_EXTI_PB, /**< Use port B (PBx) pin. */ - AFIO_EXTI_PC, /**< Use port C (PCx) pin. */ - AFIO_EXTI_PD, /**< Use port D (PDx) pin. */ -#ifdef STM32_HIGH_DENSITY - AFIO_EXTI_PE, /**< Use port E (PEx) pin. */ - AFIO_EXTI_PF, /**< Use port F (PFx) pin. */ - AFIO_EXTI_PG, /**< Use port G (PGx) pin. */ -#endif -} afio_exti_port; - -/** GPIO device type */ -typedef struct gpio_dev { - gpio_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< RCC clock information */ - afio_exti_port exti_port; /**< AFIO external interrupt port value */ -} gpio_dev; - -extern gpio_dev gpioa; -extern gpio_dev* const GPIOA; -extern gpio_dev gpiob; -extern gpio_dev* const GPIOB; -extern gpio_dev gpioc; -extern gpio_dev* const GPIOC; -extern gpio_dev gpiod; -extern gpio_dev* const GPIOD; -#ifdef STM32_HIGH_DENSITY -extern gpio_dev gpioe; -extern gpio_dev* const GPIOE; -extern gpio_dev gpiof; -extern gpio_dev* const GPIOF; -extern gpio_dev gpiog; -extern gpio_dev* const GPIOG; -#endif - -/** GPIO port A register map base pointer */ -#define GPIOA_BASE ((struct gpio_reg_map*)0x40010800) -/** GPIO port B register map base pointer */ -#define GPIOB_BASE ((struct gpio_reg_map*)0x40010C00) -/** GPIO port C register map base pointer */ -#define GPIOC_BASE ((struct gpio_reg_map*)0x40011000) -/** GPIO port D register map base pointer */ -#define GPIOD_BASE ((struct gpio_reg_map*)0x40011400) -#ifdef STM32_HIGH_DENSITY -/** GPIO port E register map base pointer */ -#define GPIOE_BASE ((struct gpio_reg_map*)0x40011800) -/** GPIO port F register map base pointer */ -#define GPIOF_BASE ((struct gpio_reg_map*)0x40011C00) -/** GPIO port G register map base pointer */ -#define GPIOG_BASE ((struct gpio_reg_map*)0x40012000) -#endif - -/* - * GPIO register bit definitions - */ - -/* Control registers, low and high */ - -#define GPIO_CR_CNF (0x3 << 2) -#define GPIO_CR_CNF_INPUT_ANALOG (0x0 << 2) -#define GPIO_CR_CNF_INPUT_FLOATING (0x1 << 2) -#define GPIO_CR_CNF_INPUT_PU_PD (0x2 << 2) -#define GPIO_CR_CNF_OUTPUT_PP (0x0 << 2) -#define GPIO_CR_CNF_OUTPUT_OD (0x1 << 2) -#define GPIO_CR_CNF_AF_OUTPUT_PP (0x2 << 2) -#define GPIO_CR_CNF_AF_OUTPUT_OD (0x3 << 2) -#define GPIO_CR_MODE 0x3 -#define GPIO_CR_MODE_INPUT 0x0 -#define GPIO_CR_MODE_OUTPUT_10MHZ 0x1 -#define GPIO_CR_MODE_OUTPUT_2MHZ 0x2 -#define GPIO_CR_MODE_OUTPUT_50MHZ 0x3 - -/** - * @brief GPIO Pin modes. - * - * These only allow for 50MHZ max output speeds; if you want slower, - * use direct register access. - */ -typedef enum gpio_pin_mode { - GPIO_OUTPUT_PP = (GPIO_CR_CNF_OUTPUT_PP | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Output push-pull. */ - GPIO_OUTPUT_OD = (GPIO_CR_CNF_OUTPUT_OD | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Output open-drain. */ - GPIO_AF_OUTPUT_PP = (GPIO_CR_CNF_AF_OUTPUT_PP | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Alternate function - output push-pull. */ - GPIO_AF_OUTPUT_OD = (GPIO_CR_CNF_AF_OUTPUT_OD | - GPIO_CR_MODE_OUTPUT_50MHZ), /**< Alternate function - output open drain. */ - GPIO_INPUT_ANALOG = (GPIO_CR_CNF_INPUT_ANALOG | - GPIO_CR_MODE_INPUT), /**< Analog input. */ - GPIO_INPUT_FLOATING = (GPIO_CR_CNF_INPUT_FLOATING | - GPIO_CR_MODE_INPUT), /**< Input floating. */ - GPIO_INPUT_PD = (GPIO_CR_CNF_INPUT_PU_PD | - GPIO_CR_MODE_INPUT), /**< Input pull-down. */ - GPIO_AF_INPUT_PD = (GPIO_INPUT_PD), /**< Input pull-down. */ - GPIO_INPUT_PU /**< Input pull-up. */ - - - /* GPIO_INPUT_PU treated as a special case, for ODR twiddling */ -} gpio_pin_mode; - -/* - * GPIO Convenience routines - */ - -void gpio_init(gpio_dev *dev); -void gpio_init_all(void); -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode); - -/** - * @brief Get a GPIO port's corresponding afio_exti_port. - * @param dev GPIO device whose afio_exti_port to return. - */ -static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { - return dev->exti_port; -} - -/** - * Set or reset a GPIO pin. - * - * Pin must have previously been configured to output mode. - * - * @param dev GPIO device whose pin to set. - * @param pin Pin on to set or reset - * @param val If true, set the pin. If false, reset the pin. - */ -static inline void gpio_write_bit(gpio_dev *dev, uint8 pin, uint8 val) { - if (val) { - dev->regs->BSRR = BIT(pin); - } else { - dev->regs->BRR = BIT(pin); - } -} - -/** - * Determine whether or not a GPIO pin is set. - * - * Pin must have previously been configured to input mode. - * - * @param dev GPIO device whose pin to test. - * @param pin Pin on dev to test. - * @return True if the pin is set, false otherwise. - */ -static inline uint32 gpio_read_bit(gpio_dev *dev, uint8 pin) { - return dev->regs->IDR & BIT(pin); -} - -/** - * Toggle a pin configured as output push-pull. - * @param dev GPIO device. - * @param pin Pin on dev to toggle. - */ -static inline void gpio_toggle_bit(gpio_dev *dev, uint8 pin) { - dev->regs->ODR = dev->regs->ODR ^ BIT(pin); -} - -/* - * AFIO register map - */ - -/** AFIO register map */ -typedef struct afio_reg_map { - __io uint32 EVCR; /**< Event control register. */ - __io uint32 MAPR; /**< AF remap and debug I/O configuration - register. */ - __io uint32 EXTICR1; /**< External interrupt configuration - register 1. */ - __io uint32 EXTICR2; /**< External interrupt configuration - register 2. */ - __io uint32 EXTICR3; /**< External interrupt configuration - register 3. */ - __io uint32 EXTICR4; /**< External interrupt configuration - register 4. */ - __io uint32 MAPR2; /**< AF remap and debug I/O configuration - register 2. */ -} afio_reg_map; - -/** AFIO register map base pointer. */ -#define AFIO_BASE ((struct afio_reg_map *)0x40010000) - -/* - * AFIO register bit definitions - */ - -/* Event control register */ - -#define AFIO_EVCR_EVOE (0x1 << 7) -#define AFIO_EVCR_PORT_PA (0x0 << 4) -#define AFIO_EVCR_PORT_PB (0x1 << 4) -#define AFIO_EVCR_PORT_PC (0x2 << 4) -#define AFIO_EVCR_PORT_PD (0x3 << 4) -#define AFIO_EVCR_PORT_PE (0x4 << 4) -#define AFIO_EVCR_PIN_0 0x0 -#define AFIO_EVCR_PIN_1 0x1 -#define AFIO_EVCR_PIN_2 0x2 -#define AFIO_EVCR_PIN_3 0x3 -#define AFIO_EVCR_PIN_4 0x4 -#define AFIO_EVCR_PIN_5 0x5 -#define AFIO_EVCR_PIN_6 0x6 -#define AFIO_EVCR_PIN_7 0x7 -#define AFIO_EVCR_PIN_8 0x8 -#define AFIO_EVCR_PIN_9 0x9 -#define AFIO_EVCR_PIN_10 0xA -#define AFIO_EVCR_PIN_11 0xB -#define AFIO_EVCR_PIN_12 0xC -#define AFIO_EVCR_PIN_13 0xD -#define AFIO_EVCR_PIN_14 0xE -#define AFIO_EVCR_PIN_15 0xF - -/* AF remap and debug I/O configuration register */ - -#define AFIO_MAPR_SWJ_CFG (0x7 << 24) -#define AFIO_MAPR_SWJ_CFG_FULL_SWJ (0x0 << 24) -#define AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST (0x1 << 24) -#define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24) -#define AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW (0x4 << 24) -#define AFIO_MAPR_ADC2_ETRGREG_REMAP BIT(20) -#define AFIO_MAPR_ADC2_ETRGINJ_REMAP BIT(19) -#define AFIO_MAPR_ADC1_ETRGREG_REMAP BIT(18) -#define AFIO_MAPR_ADC1_ETRGINJ_REMAP BIT(17) -#define AFIO_MAPR_TIM5CH4_IREMAP BIT(16) -#define AFIO_MAPR_PD01_REMAP BIT(15) -#define AFIO_MAPR_CAN_REMAP (0x3 << 13) -#define AFIO_MAPR_CAN_REMAP_NONE (0x0 << 13) -#define AFIO_MAPR_CAN_REMAP_PB8_PB9 (0x2 << 13) -#define AFIO_MAPR_CAN_REMAP_PD0_PD1 (0x3 << 13) -#define AFIO_MAPR_TIM4_REMAP BIT(12) -#define AFIO_MAPR_TIM3_REMAP (0x3 << 10) -#define AFIO_MAPR_TIM3_REMAP_NONE (0x0 << 10) -#define AFIO_MAPR_TIM3_REMAP_PARTIAL (0x2 << 10) -#define AFIO_MAPR_TIM3_REMAP_FULL (0x3 << 10) -#define AFIO_MAPR_TIM2_REMAP (0x3 << 8) -#define AFIO_MAPR_TIM2_REMAP_NONE (0x0 << 8) -#define AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3 (0x1 << 8) -#define AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11 (0x2 << 8) -#define AFIO_MAPR_TIM2_REMAP_FULL (0x3 << 8) -#define AFIO_MAPR_TIM1_REMAP (0x3 << 6) -#define AFIO_MAPR_TIM1_REMAP_NONE (0x0 << 6) -#define AFIO_MAPR_TIM1_REMAP_PARTIAL (0x1 << 6) -#define AFIO_MAPR_TIM1_REMAP_FULL (0x3 << 6) -#define AFIO_MAPR_USART3_REMAP (0x3 << 4) -#define AFIO_MAPR_USART3_REMAP_NONE (0x0 << 4) -#define AFIO_MAPR_USART3_REMAP_PARTIAL (0x1 << 4) -#define AFIO_MAPR_USART3_REMAP_FULL (0x3 << 4) -#define AFIO_MAPR_USART2_REMAP BIT(3) -#define AFIO_MAPR_USART1_REMAP BIT(2) -#define AFIO_MAPR_I2C1_REMAP BIT(1) -#define AFIO_MAPR_SPI1_REMAP BIT(0) - -/* External interrupt configuration register 1 */ - -#define AFIO_EXTICR1_EXTI3 (0xF << 12) -#define AFIO_EXTICR1_EXTI3_PA (0x0 << 12) -#define AFIO_EXTICR1_EXTI3_PB (0x1 << 12) -#define AFIO_EXTICR1_EXTI3_PC (0x2 << 12) -#define AFIO_EXTICR1_EXTI3_PD (0x3 << 12) -#define AFIO_EXTICR1_EXTI3_PE (0x4 << 12) -#define AFIO_EXTICR1_EXTI3_PF (0x5 << 12) -#define AFIO_EXTICR1_EXTI3_PG (0x6 << 12) -#define AFIO_EXTICR1_EXTI2 (0xF << 8) -#define AFIO_EXTICR1_EXTI2_PA (0x0 << 8) -#define AFIO_EXTICR1_EXTI2_PB (0x1 << 8) -#define AFIO_EXTICR1_EXTI2_PC (0x2 << 8) -#define AFIO_EXTICR1_EXTI2_PD (0x3 << 8) -#define AFIO_EXTICR1_EXTI2_PE (0x4 << 8) -#define AFIO_EXTICR1_EXTI2_PF (0x5 << 8) -#define AFIO_EXTICR1_EXTI2_PG (0x6 << 8) -#define AFIO_EXTICR1_EXTI1 (0xF << 4) -#define AFIO_EXTICR1_EXTI1_PA (0x0 << 4) -#define AFIO_EXTICR1_EXTI1_PB (0x1 << 4) -#define AFIO_EXTICR1_EXTI1_PC (0x2 << 4) -#define AFIO_EXTICR1_EXTI1_PD (0x3 << 4) -#define AFIO_EXTICR1_EXTI1_PE (0x4 << 4) -#define AFIO_EXTICR1_EXTI1_PF (0x5 << 4) -#define AFIO_EXTICR1_EXTI1_PG (0x6 << 4) -#define AFIO_EXTICR1_EXTI0 0xF -#define AFIO_EXTICR1_EXTI0_PA 0x0 -#define AFIO_EXTICR1_EXTI0_PB 0x1 -#define AFIO_EXTICR1_EXTI0_PC 0x2 -#define AFIO_EXTICR1_EXTI0_PD 0x3 -#define AFIO_EXTICR1_EXTI0_PE 0x4 -#define AFIO_EXTICR1_EXTI0_PF 0x5 -#define AFIO_EXTICR1_EXTI0_PG 0x6 - -/* External interrupt configuration register 2 */ - -#define AFIO_EXTICR2_EXTI7 (0xF << 12) -#define AFIO_EXTICR2_EXTI7_PA (0x0 << 12) -#define AFIO_EXTICR2_EXTI7_PB (0x1 << 12) -#define AFIO_EXTICR2_EXTI7_PC (0x2 << 12) -#define AFIO_EXTICR2_EXTI7_PD (0x3 << 12) -#define AFIO_EXTICR2_EXTI7_PE (0x4 << 12) -#define AFIO_EXTICR2_EXTI7_PF (0x5 << 12) -#define AFIO_EXTICR2_EXTI7_PG (0x6 << 12) -#define AFIO_EXTICR2_EXTI6 (0xF << 8) -#define AFIO_EXTICR2_EXTI6_PA (0x0 << 8) -#define AFIO_EXTICR2_EXTI6_PB (0x1 << 8) -#define AFIO_EXTICR2_EXTI6_PC (0x2 << 8) -#define AFIO_EXTICR2_EXTI6_PD (0x3 << 8) -#define AFIO_EXTICR2_EXTI6_PE (0x4 << 8) -#define AFIO_EXTICR2_EXTI6_PF (0x5 << 8) -#define AFIO_EXTICR2_EXTI6_PG (0x6 << 8) -#define AFIO_EXTICR2_EXTI5 (0xF << 4) -#define AFIO_EXTICR2_EXTI5_PA (0x0 << 4) -#define AFIO_EXTICR2_EXTI5_PB (0x1 << 4) -#define AFIO_EXTICR2_EXTI5_PC (0x2 << 4) -#define AFIO_EXTICR2_EXTI5_PD (0x3 << 4) -#define AFIO_EXTICR2_EXTI5_PE (0x4 << 4) -#define AFIO_EXTICR2_EXTI5_PF (0x5 << 4) -#define AFIO_EXTICR2_EXTI5_PG (0x6 << 4) -#define AFIO_EXTICR2_EXTI4 0xF -#define AFIO_EXTICR2_EXTI4_PA 0x0 -#define AFIO_EXTICR2_EXTI4_PB 0x1 -#define AFIO_EXTICR2_EXTI4_PC 0x2 -#define AFIO_EXTICR2_EXTI4_PD 0x3 -#define AFIO_EXTICR2_EXTI4_PE 0x4 -#define AFIO_EXTICR2_EXTI4_PF 0x5 -#define AFIO_EXTICR2_EXTI4_PG 0x6 - -/* AF remap and debug I/O configuration register 2 */ - -#define AFIO_MAPR2_FSMC_NADV BIT(10) -#define AFIO_MAPR2_TIM14_REMAP BIT(9) -#define AFIO_MAPR2_TIM13_REMAP BIT(8) -#define AFIO_MAPR2_TIM11_REMAP BIT(7) -#define AFIO_MAPR2_TIM10_REMAP BIT(6) -#define AFIO_MAPR2_TIM9_REMAP BIT(5) - -/* - * AFIO convenience routines - */ - -void afio_init(void); - -/** - * External interrupt line numbers. - */ -typedef enum afio_exti_num { - AFIO_EXTI_0, /**< External interrupt line 0. */ - AFIO_EXTI_1, /**< External interrupt line 1. */ - AFIO_EXTI_2, /**< External interrupt line 2. */ - AFIO_EXTI_3, /**< External interrupt line 3. */ - AFIO_EXTI_4, /**< External interrupt line 4. */ - AFIO_EXTI_5, /**< External interrupt line 5. */ - AFIO_EXTI_6, /**< External interrupt line 6. */ - AFIO_EXTI_7, /**< External interrupt line 7. */ - AFIO_EXTI_8, /**< External interrupt line 8. */ - AFIO_EXTI_9, /**< External interrupt line 9. */ - AFIO_EXTI_10, /**< External interrupt line 10. */ - AFIO_EXTI_11, /**< External interrupt line 11. */ - AFIO_EXTI_12, /**< External interrupt line 12. */ - AFIO_EXTI_13, /**< External interrupt line 13. */ - AFIO_EXTI_14, /**< External interrupt line 14. */ - AFIO_EXTI_15, /**< External interrupt line 15. */ -} afio_exti_num; - -void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port); - -/* HACK: Use upper bit to denote MAPR2, Bit 31 is reserved and - * not used in either MAPR or MAPR2 */ -#define AFIO_REMAP_USE_MAPR2 (1 << 31) - -/** - * @brief Available peripheral remaps. - * @see afio_remap() - */ -typedef enum afio_remap_peripheral { - AFIO_REMAP_ADC2_ETRGREG = AFIO_MAPR_ADC2_ETRGREG_REMAP, /**< - ADC 2 external trigger regular conversion remapping */ - AFIO_REMAP_ADC2_ETRGINJ = AFIO_MAPR_ADC2_ETRGINJ_REMAP, /**< - ADC 2 external trigger injected conversion remapping */ - AFIO_REMAP_ADC1_ETRGREG = AFIO_MAPR_ADC1_ETRGREG_REMAP, /**< - ADC 1 external trigger regular conversion remapping */ - AFIO_REMAP_ADC1_ETRGINJ = AFIO_MAPR_ADC1_ETRGINJ_REMAP, /**< - ADC 1 external trigger injected conversion remapping */ - AFIO_REMAP_TIM5CH4_I = AFIO_MAPR_TIM5CH4_IREMAP, /**< - Timer 5 channel 4 internal remapping */ - AFIO_REMAP_PD01 = AFIO_MAPR_PD01_REMAP, /**< - Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ - AFIO_REMAP_CAN_1 = AFIO_MAPR_CAN_REMAP_PB8_PB9, /**< - CAN alternate function remapping 1 (RX on PB8, TX on PB9) */ - AFIO_REMAP_CAN_2 = AFIO_MAPR_CAN_REMAP_PD0_PD1, /**< - CAN alternate function remapping 2 (RX on PD0, TX on PD1) */ - AFIO_REMAP_TIM4 = AFIO_MAPR_TIM4_REMAP, /**< - Timer 4 remapping */ - AFIO_REMAP_TIM3_PARTIAL = AFIO_MAPR_TIM3_REMAP_PARTIAL, /**< - Timer 3 partial remapping */ - AFIO_REMAP_TIM3_FULL = AFIO_MAPR_TIM3_REMAP_FULL, /**< - Timer 3 full remapping */ - AFIO_REMAP_TIM2_PARTIAL_1 = AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3, /**< - Timer 2 partial remapping 1 (CH1 and ETR on PA15, CH2 on PB3, CH3 - on PA2, CH4 on PA3) */ - AFIO_REMAP_TIM2_PARTIAL_2 = AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11, /**< - Timer 2 partial remapping 2 (CH1 and ETR on PA0, CH2 on PA1, CH3 - on PB10, CH4 on PB11) */ - AFIO_REMAP_TIM2_FULL = AFIO_MAPR_TIM2_REMAP_FULL, /**< - Timer 2 full remapping */ - AFIO_REMAP_USART2 = AFIO_MAPR_USART2_REMAP, /**< - USART 2 remapping */ - AFIO_REMAP_USART1 = AFIO_MAPR_USART1_REMAP, /**< - USART 1 remapping */ - AFIO_REMAP_I2C1 = AFIO_MAPR_I2C1_REMAP, /**< - I2C 1 remapping */ - AFIO_REMAP_SPI1 = AFIO_MAPR_SPI1_REMAP, /**< - SPI 1 remapping */ - AFIO_REMAP_FSMC_NADV = (AFIO_MAPR2_FSMC_NADV | - AFIO_REMAP_USE_MAPR2), /**< - NADV signal not connected */ - AFIO_REMAP_TIM14 = (AFIO_MAPR2_TIM14_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 14 remapping */ - AFIO_REMAP_TIM13 = (AFIO_MAPR2_TIM13_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 13 remapping */ - AFIO_REMAP_TIM11 = (AFIO_MAPR2_TIM11_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 11 remapping */ - AFIO_REMAP_TIM10 = (AFIO_MAPR2_TIM10_REMAP | - AFIO_REMAP_USE_MAPR2), /**< - Timer 10 remapping */ - AFIO_REMAP_TIM9 = (AFIO_MAPR2_TIM9_REMAP | - AFIO_REMAP_USE_MAPR2) /**< - Timer 9 */ -} afio_remap_peripheral; - -void afio_remap(afio_remap_peripheral p); - -/** - * @brief Debug port configuration - * - * Used to configure the behavior of JTAG and Serial Wire (SW) debug - * ports and their associated GPIO pins. - * - * @see afio_cfg_debug_ports() - */ -typedef enum afio_debug_cfg { - AFIO_DEBUG_FULL_SWJ = AFIO_MAPR_SWJ_CFG_FULL_SWJ, /**< - Full Serial Wire and JTAG debug */ - AFIO_DEBUG_FULL_SWJ_NO_NJRST = AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST, /**< - Full Serial Wire and JTAG, but no NJTRST. */ - AFIO_DEBUG_SW_ONLY = AFIO_MAPR_SWJ_CFG_NO_JTAG_SW, /**< - Serial Wire debug only (JTAG-DP disabled, - SW-DP enabled) */ - AFIO_DEBUG_NONE = AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW /**< - No debug; all JTAG and SW pins are free - for use as GPIOs. */ -} afio_debug_cfg; - -/** - * @brief Enable or disable the JTAG and SW debug ports. - * @param config Desired debug port configuration - * @see afio_debug_cfg - */ -static inline void afio_cfg_debug_ports(afio_debug_cfg config) { - __io uint32 *mapr = &AFIO_BASE->MAPR; - *mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; -} - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/STM32F4/cores/maple/libmaple/gpioF2.c b/STM32F4/cores/maple/libmaple/gpioF4.c similarity index 75% rename from STM32F4/cores/maple/libmaple/gpioF2.c rename to STM32F4/cores/maple/libmaple/gpioF4.c index b04c7e9d6..af839ebea 100644 --- a/STM32F4/cores/maple/libmaple/gpioF2.c +++ b/STM32F4/cores/maple/libmaple/gpioF4.c @@ -24,8 +24,6 @@ * SOFTWARE. *****************************************************************************/ - #ifdef STM32F2 - /** * @file gpio.c * @brief GPIO initialization routine @@ -38,62 +36,57 @@ * GPIO devices */ -gpio_dev gpioa = { +/** GPIO port A device. */ +const gpio_dev GPIOA = { .regs = GPIOA_BASE, .clk_id = RCC_GPIOA, .exti_port = AFIO_EXTI_PA, }; -/** GPIO port A device. */ -gpio_dev* const GPIOA = &gpioa; -gpio_dev gpiob = { +/** GPIO port B device. */ +const gpio_dev GPIOB = { .regs = GPIOB_BASE, .clk_id = RCC_GPIOB, .exti_port = AFIO_EXTI_PB, }; -/** GPIO port B device. */ -gpio_dev* const GPIOB = &gpiob; -gpio_dev gpioc = { +/** GPIO port C device. */ +const gpio_dev GPIOC = { .regs = GPIOC_BASE, .clk_id = RCC_GPIOC, .exti_port = AFIO_EXTI_PC, }; -/** GPIO port C device. */ -gpio_dev* const GPIOC = &gpioc; -gpio_dev gpiod = { +/** GPIO port D device. */ +const gpio_dev GPIOD = { .regs = GPIOD_BASE, .clk_id = RCC_GPIOD, .exti_port = AFIO_EXTI_PD, }; -/** GPIO port D device. */ -gpio_dev* const GPIOD = &gpiod; #ifdef STM32_HIGH_DENSITY -gpio_dev gpioe = { +/** GPIO port E device. */ +const gpio_dev GPIOE = { .regs = GPIOE_BASE, .clk_id = RCC_GPIOE, .exti_port = AFIO_EXTI_PE, }; -/** GPIO port E device. */ -gpio_dev* const GPIOE = &gpioe; -gpio_dev gpiof = { + #if 0 // not available on LQFP 100 package +/** GPIO port F device. */ +const gpio_dev GPIOF = { .regs = GPIOF_BASE, .clk_id = RCC_GPIOF, .exti_port = AFIO_EXTI_PF, }; -/** GPIO port F device. */ -gpio_dev* const GPIOF = &gpiof; -gpio_dev gpiog = { +/** GPIO port G device. */ +const gpio_dev GPIOG = { .regs = GPIOG_BASE, .clk_id = RCC_GPIOG, .exti_port = AFIO_EXTI_PG, }; -/** GPIO port G device. */ -gpio_dev* const GPIOG = &gpiog; +#endif #endif /* @@ -107,7 +100,7 @@ gpio_dev* const GPIOG = &gpiog; * * @param dev GPIO device to initialize. */ -void gpio_init(gpio_dev *dev) { +void gpio_init(const gpio_dev *dev) { rcc_clk_enable(dev->clk_id); rcc_reset_dev(dev->clk_id); } @@ -116,27 +109,29 @@ void gpio_init(gpio_dev *dev) { * Initialize and reset all available GPIO devices. */ void gpio_init_all(void) { - gpio_init(GPIOA); - gpio_init(GPIOB); - gpio_init(GPIOC); - gpio_init(GPIOD); + gpio_init(&GPIOA); + gpio_init(&GPIOB); + gpio_init(&GPIOC); + gpio_init(&GPIOD); #ifdef STM32_HIGH_DENSITY - gpio_init(GPIOE); - gpio_init(GPIOF); - gpio_init(GPIOG); + gpio_init(&GPIOE); + #if 0 // not available on LQFP 100 package + gpio_init(GPIOF); + gpio_init(GPIOG); + #endif // not available on LQFP 100 package #endif #ifdef ARDUINO_STM32F4_NETDUINO2PLUS // PA8 Output the Master Clock MCO1 - gpio_set_af_mode(GPIOA, 8, 0); - gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_af_mode(PA8, 0); + gpio_set_mode(PA8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); // PB4 as alternate MISO Input - gpio_set_af_mode(GPIOB, 4, 5); + gpio_set_af_mode(PB4, 5); // PA5 as alternate SCK Output - gpio_set_af_mode(GPIOA, 5, 5); + gpio_set_af_mode(PA5, 5); // PA7 as alternate MOSI Output - gpio_set_af_mode(GPIOA, 7, 5); + gpio_set_af_mode(PA7, 5); #endif } @@ -148,16 +143,17 @@ void gpio_init_all(void) { * @param mode General purpose or alternate function mode to set the pin to. * @see gpio_pin_mode */ -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { - gpio_reg_map *regs = dev->regs; +void gpio_set_mode(uint8_t io_pin, gpio_pin_mode mode) { + gpio_reg_map *regs = (PIN_MAP[io_pin].gpio_device)->regs; + uint8_t pin = io_pin&0x0f; //regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 8) & 15) << (4*(pin&7))); //gpio_set_af_mode(dev, pin, mode>>8); - regs->MODER = (regs->MODER & ~( 3 << (2*pin))) | (((mode >> 0) & 3) << (2*pin)); - regs->PUPDR = (regs->PUPDR & ~( 3 << (2*pin))) | (((mode >> 2) & 3) << (2*pin)); - regs->OSPEEDR = (regs->OSPEEDR & ~( 3 << (2*pin))) | (((mode >> 4) & 3) << (2*pin)); - regs->OTYPER = (regs->OTYPER & ~( 1 << (1*pin))) | (((mode >> 6) & 1) << (1*pin)); + regs->MODER = (regs->MODER & ~( 3 << (pin<<1))) | (((mode >> 0) & 3) << (pin<<1)); + regs->PUPDR = (regs->PUPDR & ~( 3 << (pin<<1))) | (((mode >> 2) & 3) << (pin<<1)); + regs->OSPEEDR = (regs->OSPEEDR & ~( 3 << (pin<<1))) | (((mode >> 4) & 3) << (pin<<1)); + regs->OTYPER = (regs->OTYPER & ~( 1 << (pin<<0))) | (((mode >> 6) & 1) << (pin<<0)); } /** @@ -168,10 +164,11 @@ void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { * @param mode alternate function mode to set the pin to. * @see gpio_pin_mode */ -void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode) { - gpio_reg_map *regs = dev->regs; +void gpio_set_af_mode(uint8_t io_pin, int mode) { + gpio_reg_map *regs = (PIN_MAP[io_pin].gpio_device)->regs; + uint8_t pin = io_pin&0x0F; - regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 0) & 15) << (4*(pin&7))); + regs->AFR[pin>>3] = (regs->AFR[pin>>3] & ~(15 << ((pin&7)<<2))) | (((mode >> 0) & 15) << ((pin&7)<<2)); } /* @@ -220,5 +217,3 @@ void afio_remap(afio_remap_peripheral remapping) { } } #endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/gpioF2.h b/STM32F4/cores/maple/libmaple/gpio_def.h similarity index 90% rename from STM32F4/cores/maple/libmaple/gpioF2.h rename to STM32F4/cores/maple/libmaple/gpio_def.h index 91bd67be3..cd1fb3843 100644 --- a/STM32F4/cores/maple/libmaple/gpioF2.h +++ b/STM32F4/cores/maple/libmaple/gpio_def.h @@ -31,8 +31,8 @@ * (AFIO) prototypes, defines, and inlined access functions. */ -#ifndef _GPIO_H_ -#define _GPIO_H_ +#ifndef _GPIO_DEF_H_ +#define _GPIO_DEF_H_ #include "libmaple.h" #include "rcc.h" @@ -74,11 +74,14 @@ typedef enum afio_exti_port { AFIO_EXTI_PD, /**< Use port D (PDx) pin. */ #ifdef STM32_HIGH_DENSITY AFIO_EXTI_PE, /**< Use port E (PEx) pin. */ + #if 0 // not available on LQFP 100 package AFIO_EXTI_PF, /**< Use port F (PFx) pin. */ AFIO_EXTI_PG, /**< Use port G (PGx) pin. */ + #endif // not available on LQFP 100 package #endif } afio_exti_port; + /** GPIO device type */ typedef struct gpio_dev { gpio_reg_map *regs; /**< Register map */ @@ -86,21 +89,18 @@ typedef struct gpio_dev { afio_exti_port exti_port; /**< AFIO external interrupt port value */ } gpio_dev; -extern gpio_dev gpioa; -extern gpio_dev* const GPIOA; -extern gpio_dev gpiob; -extern gpio_dev* const GPIOB; -extern gpio_dev gpioc; -extern gpio_dev* const GPIOC; -extern gpio_dev gpiod; -extern gpio_dev* const GPIOD; +extern const gpio_dev GPIOA; +extern const gpio_dev GPIOB; +extern const gpio_dev GPIOC; +extern const gpio_dev GPIOD; #ifdef STM32_HIGH_DENSITY -extern gpio_dev gpioe; -extern gpio_dev* const GPIOE; +extern const gpio_dev GPIOE; + #if 0 // not available on LQFP 100 package extern gpio_dev gpiof; extern gpio_dev* const GPIOF; extern gpio_dev gpiog; extern gpio_dev* const GPIOG; + #endif // not available on LQFP 100 package #endif /** GPIO port register map base pointer */ @@ -110,8 +110,10 @@ extern gpio_dev* const GPIOG; #define GPIOD_BASE ((struct gpio_reg_map*)0x40020C00) #ifdef STM32_HIGH_DENSITY #define GPIOE_BASE ((struct gpio_reg_map*)0x40021000) + #if 0 // not available on LQFP 100 package #define GPIOF_BASE ((struct gpio_reg_map*)0x40021400) #define GPIOG_BASE ((struct gpio_reg_map*)0x40021800) + #endif // not available on LQFP 100 package #endif /* @@ -190,61 +192,6 @@ typedef enum gpio_pin_mode { GPIO_BIGNUMBER = 0xfff } gpio_pin_mode; -/* - * GPIO Convenience routines - */ - -void gpio_init(gpio_dev *dev); -void gpio_init_all(void); -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode); -void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode); - -/** - * @brief Get a GPIO port's corresponding afio_exti_port. - * @param dev GPIO device whose afio_exti_port to return. - */ -static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { - return dev->exti_port; -} - -/** - * Set or reset a GPIO pin. - * - * Pin must have previously been configured to output mode. - * - * @param dev GPIO device whose pin to set. - * @param pin Pin on to set or reset - * @param val If true, set the pin. If false, reset the pin. - */ -static inline void gpio_write_bit(gpio_dev *dev, uint8 pin, uint8 val) { - if (val) { - dev->regs->BSRRL = BIT(pin); - } else { - dev->regs->BSRRH = BIT(pin); - } -} - -/** - * Determine whether or not a GPIO pin is set. - * - * Pin must have previously been configured to input mode. - * - * @param dev GPIO device whose pin to test. - * @param pin Pin on dev to test. - * @return True if the pin is set, false otherwise. - */ -static inline uint32 gpio_read_bit(gpio_dev *dev, uint8 pin) { - return dev->regs->IDR & BIT(pin); -} - -/** - * Toggle a pin configured as output push-pull. - * @param dev GPIO device. - * @param pin Pin on dev to toggle. - */ -static inline void gpio_toggle_bit(gpio_dev *dev, uint8 pin) { - dev->regs->ODR = dev->regs->ODR ^ BIT(pin); -} /* * AFIO register map @@ -532,15 +479,6 @@ typedef enum afio_debug_cfg { for use as GPIOs. */ } afio_debug_cfg; -/** - * @brief Enable or disable the JTAG and SW debug ports. - * @param config Desired debug port configuration - * @see afio_debug_cfg - */ -static inline void afio_cfg_debug_ports(afio_debug_cfg config) { - //__io uint32 *mapr = &AFIO_BASE->MAPR; - //*mapr = (*mapr & ~AFIO_MAPR_SWJ_CFG) | config; -} #ifdef __cplusplus } diff --git a/STM32F4/cores/maple/libmaple/i2c.c b/STM32F4/cores/maple/libmaple/i2c.c index e3f3199bc..a582ed056 100644 --- a/STM32F4/cores/maple/libmaple/i2c.c +++ b/STM32F4/cores/maple/libmaple/i2c.c @@ -41,9 +41,9 @@ static i2c_dev i2c_dev1 = { .regs = I2C1_BASE, - .gpio_port = &gpiob, - .sda_pin = 7, - .scl_pin = 6, + //.gpio_port = &gpiob, + .sda_pin = PB7, + .scl_pin = PB6, .clk_id = RCC_I2C1, .ev_nvic_line = NVIC_I2C1_EV, .er_nvic_line = NVIC_I2C1_ER, @@ -54,9 +54,9 @@ i2c_dev* const I2C1 = &i2c_dev1; static i2c_dev i2c_dev2 = { .regs = I2C2_BASE, - .gpio_port = &gpiob, - .sda_pin = 11, - .scl_pin = 10, + //.gpio_port = &gpiob, + .sda_pin = PB11, + .scl_pin = PB10, .clk_id = RCC_I2C2, .ev_nvic_line = NVIC_I2C2_EV, .er_nvic_line = NVIC_I2C2_ER, @@ -336,38 +336,38 @@ void __irq_i2c2_er(void) { */ void i2c_bus_reset(const i2c_dev *dev) { /* Release both lines */ - gpio_write_bit(dev->gpio_port, dev->scl_pin, 1); - gpio_write_bit(dev->gpio_port, dev->sda_pin, 1); - gpio_set_mode(dev->gpio_port, dev->scl_pin, GPIO_OUTPUT_OD); - gpio_set_mode(dev->gpio_port, dev->sda_pin, GPIO_OUTPUT_OD); + gpio_set_pin(dev->scl_pin); + gpio_set_pin(dev->sda_pin); + gpio_set_mode(dev->scl_pin, GPIO_OUTPUT_OD); + gpio_set_mode(dev->sda_pin, GPIO_OUTPUT_OD); /* * Make sure the bus is free by clocking it until any slaves release the * bus. */ - while (!gpio_read_bit(dev->gpio_port, dev->sda_pin)) { + while (!gpio_read_pin(dev->sda_pin)) { /* Wait for any clock stretching to finish */ - while (!gpio_read_bit(dev->gpio_port, dev->scl_pin)) + while (!gpio_read_pin(dev->scl_pin)) ; delay_us(10); /* Pull low */ - gpio_write_bit(dev->gpio_port, dev->scl_pin, 0); + gpio_clear_pin(dev->scl_pin); delay_us(10); /* Release high again */ - gpio_write_bit(dev->gpio_port, dev->scl_pin, 1); + gpio_set_pin(dev->scl_pin); delay_us(10); } /* Generate start then stop condition */ - gpio_write_bit(dev->gpio_port, dev->sda_pin, 0); + gpio_clear_pin(dev->sda_pin); delay_us(10); - gpio_write_bit(dev->gpio_port, dev->scl_pin, 0); + gpio_clear_pin(dev->scl_pin); delay_us(10); - gpio_write_bit(dev->gpio_port, dev->scl_pin, 1); + gpio_set_pin(dev->scl_pin); delay_us(10); - gpio_write_bit(dev->gpio_port, dev->sda_pin, 1); + gpio_set_pin(dev->sda_pin); } /** @@ -413,8 +413,8 @@ void i2c_master_enable(i2c_dev *dev, uint32 flags) { /* Turn on clock and set GPIO modes */ i2c_init(dev); - gpio_set_mode(dev->gpio_port, dev->sda_pin, GPIO_AF_OUTPUT_OD); - gpio_set_mode(dev->gpio_port, dev->scl_pin, GPIO_AF_OUTPUT_OD); + gpio_set_mode(dev->sda_pin, GPIO_AF_OUTPUT_OD); + gpio_set_mode(dev->scl_pin, GPIO_AF_OUTPUT_OD); /* I2C1 and I2C2 are fed from APB1, clocked at 36MHz */ i2c_set_input_clk(dev, I2C_CLK); diff --git a/STM32F4/cores/maple/libmaple/i2c.h b/STM32F4/cores/maple/libmaple/i2c.h index 4c60ad713..28819a35b 100644 --- a/STM32F4/cores/maple/libmaple/i2c.h +++ b/STM32F4/cores/maple/libmaple/i2c.h @@ -78,7 +78,7 @@ typedef struct i2c_msg { */ typedef struct i2c_dev { i2c_reg_map *regs; /**< Register map */ - gpio_dev *gpio_port; /**< SDA, SCL pins' GPIO port */ + //gpio_dev *gpio_port; /**< SDA, SCL pins' GPIO port */ uint8 sda_pin; /**< SDA bit on gpio_port */ uint8 scl_pin; /**< SCL bit on gpio_port */ rcc_clk_id clk_id; /**< RCC clock information */ diff --git a/STM32F4/cores/maple/libmaple/libmaple.h b/STM32F4/cores/maple/libmaple/libmaple.h index 10c6c0c00..8360ba390 100644 --- a/STM32F4/cores/maple/libmaple/libmaple.h +++ b/STM32F4/cores/maple/libmaple/libmaple.h @@ -32,29 +32,31 @@ #ifndef _LIBMAPLE_H_ #define _LIBMAPLE_H_ -#include "libmaple_types.h" -#include "stm32.h" #include "util.h" -#include "delay.h" /* * Where to put usercode, based on space reserved for bootloader. * * FIXME this has no business being here */ +/* #if defined(MCU_STM32F103VE) || defined(MCU_STM32F205VE) || defined(MCU_STM32F406VG) - /* e.g., Aeroquad32 */ - #define USER_ADDR_ROM 0x08010000 /* ala42 */ + // e.g., Aeroquad32 + #define USER_ADDR_ROM 0x08010000 // ala42 #define USER_ADDR_RAM 0x20000C00 #define STACK_TOP 0x20000800 #elif defined(BOARD_freeflight) +*/ #define USER_ADDR_ROM 0x08000000 -#define USER_ADDR_RAM 0x20000000 +#define USER_ADDR_RAM 0x20000C00 #define STACK_TOP 0x20000800 +/* #else #define USER_ADDR_ROM 0x08005000 #define USER_ADDR_RAM 0x20000C00 #define STACK_TOP 0x20000800 #endif +*/ + #endif diff --git a/STM32F4/cores/maple/libmaple/libmaple_types.h b/STM32F4/cores/maple/libmaple/libmaple_types.h index 332ded176..8e765b435 100644 --- a/STM32F4/cores/maple/libmaple/libmaple_types.h +++ b/STM32F4/cores/maple/libmaple/libmaple_types.h @@ -33,6 +33,8 @@ #ifndef _LIBMAPLE_TYPES_H_ #define _LIBMAPLE_TYPES_H_ +#include + typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; @@ -46,12 +48,15 @@ typedef long long int64; typedef void (*voidFuncPtr)(void); #define __io volatile -#define __attr_flash __attribute__((section (".USER_FLASH"))) - -#define __always_inline inline __attribute__((always_inline)) - +#define __IO volatile +#ifndef __attr_flash + #define __attr_flash __attribute__((section (".USER_FLASH"))) +#endif +#ifndef __always_inline + #define __always_inline inline __attribute__((always_inline)) +#endif #ifndef NULL -#define NULL 0 + #define NULL 0 #endif #endif diff --git a/STM32F4/cores/maple/libmaple/rcc.h b/STM32F4/cores/maple/libmaple/rcc.h index 6317cbdb8..75e2d3d7a 100644 --- a/STM32F4/cores/maple/libmaple/rcc.h +++ b/STM32F4/cores/maple/libmaple/rcc.h @@ -29,8 +29,5 @@ * @brief reset and clock control definitions and prototypes */ -#ifdef STM32F2 -#include "rccF2.h" -#else -#include "rccF1.h" -#endif + +#include "rccF4.h" diff --git a/STM32F4/cores/maple/libmaple/rccF1.c b/STM32F4/cores/maple/libmaple/rccF1.c deleted file mode 100644 index 9eb56b872..000000000 --- a/STM32F4/cores/maple/libmaple/rccF1.c +++ /dev/null @@ -1,233 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - - #ifdef STM32F1 - -/** - * @file rcc.c - * @brief Implements pretty much only the basic clock setup on the - * stm32, clock enable/disable and peripheral reset commands. - */ - -#include "libmaple.h" -#include "flash.h" -#include "rcc.h" -#include "bitband.h" - -#define APB1 RCC_APB1 -#define APB2 RCC_APB2 -#define AHB RCC_AHB - -struct rcc_dev_info { - const rcc_clk_domain clk_domain; - const uint8 line_num; -}; - -/* Device descriptor table, maps rcc_clk_id onto bus and enable/reset - * register bit numbers. */ -static const struct rcc_dev_info rcc_dev_table[] = { - [RCC_GPIOA] = { .clk_domain = APB2, .line_num = 2 }, - [RCC_GPIOB] = { .clk_domain = APB2, .line_num = 3 }, - [RCC_GPIOC] = { .clk_domain = APB2, .line_num = 4 }, - [RCC_GPIOD] = { .clk_domain = APB2, .line_num = 5 }, - [RCC_AFIO] = { .clk_domain = APB2, .line_num = 0 }, - [RCC_ADC1] = { .clk_domain = APB2, .line_num = 9 }, - [RCC_ADC2] = { .clk_domain = APB2, .line_num = 10 }, - [RCC_ADC3] = { .clk_domain = APB2, .line_num = 15 }, - [RCC_USART1] = { .clk_domain = APB2, .line_num = 14 }, - [RCC_USART2] = { .clk_domain = APB1, .line_num = 17 }, - [RCC_USART3] = { .clk_domain = APB1, .line_num = 18 }, - [RCC_TIMER1] = { .clk_domain = APB2, .line_num = 11 }, - [RCC_TIMER2] = { .clk_domain = APB1, .line_num = 0 }, - [RCC_TIMER3] = { .clk_domain = APB1, .line_num = 1 }, - [RCC_TIMER4] = { .clk_domain = APB1, .line_num = 2 }, - [RCC_SPI1] = { .clk_domain = APB2, .line_num = 12 }, - [RCC_SPI2] = { .clk_domain = APB1, .line_num = 14 }, - [RCC_DMA1] = { .clk_domain = AHB, .line_num = 0 }, - [RCC_PWR] = { .clk_domain = APB1, .line_num = 28}, - [RCC_BKP] = { .clk_domain = APB1, .line_num = 27}, - [RCC_I2C1] = { .clk_domain = APB1, .line_num = 21 }, - [RCC_I2C2] = { .clk_domain = APB1, .line_num = 22 }, - [RCC_CRC] = { .clk_domain = AHB, .line_num = 6}, - [RCC_FLITF] = { .clk_domain = AHB, .line_num = 4}, - [RCC_SRAM] = { .clk_domain = AHB, .line_num = 2}, -#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) - [RCC_GPIOE] = { .clk_domain = APB2, .line_num = 6 }, - [RCC_GPIOF] = { .clk_domain = APB2, .line_num = 7 }, - [RCC_GPIOG] = { .clk_domain = APB2, .line_num = 8 }, - [RCC_UART4] = { .clk_domain = APB1, .line_num = 19 }, - [RCC_UART5] = { .clk_domain = APB1, .line_num = 20 }, - [RCC_TIMER5] = { .clk_domain = APB1, .line_num = 3 }, - [RCC_TIMER6] = { .clk_domain = APB1, .line_num = 4 }, - [RCC_TIMER7] = { .clk_domain = APB1, .line_num = 5 }, - [RCC_TIMER8] = { .clk_domain = APB2, .line_num = 13 }, - [RCC_FSMC] = { .clk_domain = AHB, .line_num = 8 }, - [RCC_DAC] = { .clk_domain = APB1, .line_num = 29 }, - [RCC_DMA2] = { .clk_domain = AHB, .line_num = 1 }, - [RCC_SDIO] = { .clk_domain = AHB, .line_num = 10 }, - [RCC_SPI3] = { .clk_domain = APB1, .line_num = 15 }, -#endif -#ifdef STM32_XL_DENSITY - [RCC_TIMER9] = { .clk_domain = APB2, .line_num = 19 }, - [RCC_TIMER10] = { .clk_domain = APB2, .line_num = 20 }, - [RCC_TIMER11] = { .clk_domain = APB2, .line_num = 21 }, - [RCC_TIMER12] = { .clk_domain = APB1, .line_num = 6 }, - [RCC_TIMER13] = { .clk_domain = APB1, .line_num = 7 }, - [RCC_TIMER14] = { .clk_domain = APB1, .line_num = 8 }, -#endif -}; - -/** - * @brief Initialize the clock control system. Initializes the system - * clock source to use the PLL driven by an external oscillator - * @param sysclk_src system clock source, must be PLL - * @param pll_src pll clock source, must be HSE - * @param pll_mul pll multiplier - */ -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul) { - uint32 cfgr = 0; - uint32 cr; - - /* Assume that we're going to clock the chip off the PLL, fed by - * the HSE */ - ASSERT(sysclk_src == RCC_CLKSRC_PLL && - pll_src == RCC_PLLSRC_HSE); - - RCC_BASE->CFGR = pll_src | pll_mul; - - /* Turn on the HSE */ - cr = RCC_BASE->CR; - cr |= RCC_CR_HSEON; - RCC_BASE->CR = cr; - while (!(RCC_BASE->CR & RCC_CR_HSERDY)) - ; - - /* Now the PLL */ - cr |= RCC_CR_PLLON; - RCC_BASE->CR = cr; - while (!(RCC_BASE->CR & RCC_CR_PLLRDY)) - ; - - /* Finally, let's switch over to the PLL */ - cfgr &= ~RCC_CFGR_SW; - cfgr |= RCC_CFGR_SW_PLL; - RCC_BASE->CFGR = cfgr; - while ((RCC_BASE->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) - ; -} - -/** - * @brief Turn on the clock line on a peripheral - * @param id Clock ID of the peripheral to turn on. - */ -void rcc_clk_enable(rcc_clk_id id) { - static const __io uint32* enable_regs[] = { - [APB1] = &RCC_BASE->APB1ENR, - [APB2] = &RCC_BASE->APB2ENR, - [AHB] = &RCC_BASE->AHBENR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io uint32* enr = (__io uint32*)enable_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(enr, lnum, 1); -} - -/** - * @brief Reset a peripheral. - * @param id Clock ID of the peripheral to reset. - */ -void rcc_reset_dev(rcc_clk_id id) { - static const __io uint32* reset_regs[] = { - [APB1] = &RCC_BASE->APB1RSTR, - [APB2] = &RCC_BASE->APB2RSTR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io void* addr = (__io void*)reset_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(addr, lnum, 1); - bb_peri_set_bit(addr, lnum, 0); -} - -/** - * @brief Get a peripheral's clock domain - * @param id Clock ID of the peripheral whose clock domain to return - * @return Clock source for the given clock ID - */ -rcc_clk_domain rcc_dev_clk(rcc_clk_id id) { - return rcc_dev_table[id].clk_domain; -} - -/** - * @brief Get a peripheral's clock domain speed - * @param id Clock ID of the peripheral whose clock domain speed to return - * @return Clock speed for the given clock ID - */ -uint32 rcc_dev_clk_speed(rcc_clk_id id) { - static const uint32 rcc_dev_clk_speed_table[] = { - [RCC_AHB] = 72000000, - [RCC_APB1] = 36000000, - [RCC_APB2] = 72000000 - }; - return rcc_dev_clk_speed_table[rcc_dev_clk(id)]; -} - -/** - * @brief Get a peripheral's timer clock domain speed - * @param id Clock ID of the peripheral whose clock domain speed to return - * @return Clock speed for the given clock ID - */ -uint32 rcc_dev_timer_clk_speed(rcc_clk_id id) { - return rcc_dev_clk_speed(RCC_APB2); // 72 MHz for all counter -} - -/** - * @brief Set the divider on a peripheral prescaler - * @param prescaler prescaler to set - * @param divider prescaler divider - */ -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) { - static const uint32 masks[] = { - [RCC_PRESCALER_AHB] = RCC_CFGR_HPRE, - [RCC_PRESCALER_APB1] = RCC_CFGR_PPRE1, - [RCC_PRESCALER_APB2] = RCC_CFGR_PPRE2, - [RCC_PRESCALER_USB] = RCC_CFGR_USBPRE, - [RCC_PRESCALER_ADC] = RCC_CFGR_ADCPRE, - }; - - uint32 cfgr = RCC_BASE->CFGR; - cfgr &= ~masks[prescaler]; - cfgr |= divider; - RCC_BASE->CFGR = cfgr; -} - - -#endif diff --git a/STM32F4/cores/maple/libmaple/rccF1.h b/STM32F4/cores/maple/libmaple/rccF1.h deleted file mode 100644 index dd79704d8..000000000 --- a/STM32F4/cores/maple/libmaple/rccF1.h +++ /dev/null @@ -1,572 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file rcc.h - * @brief reset and clock control definitions and prototypes - */ - -#include "libmaple_types.h" - -#ifndef _RCC_H_ -#define _RCC_H_ - -#ifdef __cplusplus -extern "C"{ -#endif - -/** RCC register map type */ -typedef struct rcc_reg_map { - __io uint32 CR; /**< Clock control register */ - __io uint32 CFGR; /**< Clock configuration register */ - __io uint32 CIR; /**< Clock interrupt register */ - __io uint32 APB2RSTR; /**< APB2 peripheral reset register */ - __io uint32 APB1RSTR; /**< APB1 peripheral reset register */ - __io uint32 AHBENR; /**< AHB peripheral clock enable register */ - __io uint32 APB2ENR; /**< APB2 peripheral clock enable register */ - __io uint32 APB1ENR; /**< APB1 peripheral clock enable register */ - __io uint32 BDCR; /**< Backup domain control register */ - __io uint32 CSR; /**< Control/status register */ -} rcc_reg_map; - -/** RCC register map base pointer */ -#define RCC_BASE ((struct rcc_reg_map*)0x40021000) - -/* - * Register bit definitions - */ - -/* Clock control register */ - -#define RCC_CR_PLLRDY_BIT 25 -#define RCC_CR_PLLON_BIT 24 -#define RCC_CR_CSSON_BIT 19 -#define RCC_CR_HSEBYP_BIT 18 -#define RCC_CR_HSERDY_BIT 17 -#define RCC_CR_HSEON_BIT 16 -#define RCC_CR_HSIRDY_BIT 1 -#define RCC_CR_HSION_BIT 0 - -#define RCC_CR_PLLRDY BIT(RCC_CR_PLLRDY_BIT) -#define RCC_CR_PLLON BIT(RCC_CR_PLLON_BIT) -#define RCC_CR_CSSON BIT(RCC_CR_CSSON_BIT) -#define RCC_CR_HSEBYP BIT(RCC_CR_HSEBYP_BIT) -#define RCC_CR_HSERDY BIT(RCC_CR_HSERDY_BIT) -#define RCC_CR_HSEON BIT(RCC_CR_HSEON_BIT) -#define RCC_CR_HSICAL (0xFF << 8) -#define RCC_CR_HSITRIM (0x1F << 3) -#define RCC_CR_HSIRDY BIT(RCC_CR_HSIRDY_BIT) -#define RCC_CR_HSION BIT(RCC_CR_HSION_BIT) - -/* Clock configuration register */ - -#define RCC_CFGR_USBPRE_BIT 22 -#define RCC_CFGR_PLLXTPRE_BIT 17 -#define RCC_CFGR_PLLSRC_BIT 16 - -#define RCC_CFGR_MCO (0x3 << 24) -#define RCC_CFGR_USBPRE BIT(RCC_CFGR_USBPRE_BIT) -#define RCC_CFGR_PLLMUL (0xF << 18) -#define RCC_CFGR_PLLXTPRE BIT(RCC_CFGR_PLLXTPRE_BIT) -#define RCC_CFGR_PLLSRC BIT(RCC_CFGR_PLLSRC_BIT) -#define RCC_CFGR_ADCPRE (0x3 << 14) -#define RCC_CFGR_PPRE2 (0x7 << 11) -#define RCC_CFGR_PPRE1 (0x7 << 8) -#define RCC_CFGR_HPRE (0xF << 4) -#define RCC_CFGR_SWS (0x3 << 2) -#define RCC_CFGR_SWS_PLL (0x2 << 2) -#define RCC_CFGR_SWS_HSE (0x1 << 2) -#define RCC_CFGR_SW 0x3 -#define RCC_CFGR_SW_PLL 0x2 -#define RCC_CFGR_SW_HSE 0x1 - -/* Clock interrupt register */ - -#define RCC_CIR_CSSC_BIT 23 -#define RCC_CIR_PLLRDYC_BIT 20 -#define RCC_CIR_HSERDYC_BIT 19 -#define RCC_CIR_HSIRDYC_BIT 18 -#define RCC_CIR_LSERDYC_BIT 17 -#define RCC_CIR_LSIRDYC_BIT 16 -#define RCC_CIR_PLLRDYIE_BIT 12 -#define RCC_CIR_HSERDYIE_BIT 11 -#define RCC_CIR_HSIRDYIE_BIT 10 -#define RCC_CIR_LSERDYIE_BIT 9 -#define RCC_CIR_LSIRDYIE_BIT 8 -#define RCC_CIR_CSSF_BIT 7 -#define RCC_CIR_PLLRDYF_BIT 4 -#define RCC_CIR_HSERDYF_BIT 3 -#define RCC_CIR_HSIRDYF_BIT 2 -#define RCC_CIR_LSERDYF_BIT 1 -#define RCC_CIR_LSIRDYF_BIT 0 - -#define RCC_CIR_CSSC BIT(RCC_CIR_CSSC_BIT) -#define RCC_CIR_PLLRDYC BIT(RCC_CIR_PLLRDYC_BIT) -#define RCC_CIR_HSERDYC BIT(RCC_CIR_HSERDYC_BIT) -#define RCC_CIR_HSIRDYC BIT(RCC_CIR_HSIRDYC_BIT) -#define RCC_CIR_LSERDYC BIT(RCC_CIR_LSERDYC_BIT) -#define RCC_CIR_LSIRDYC BIT(RCC_CIR_LSIRDYC_BIT) -#define RCC_CIR_PLLRDYIE BIT(RCC_CIR_PLLRDYIE_BIT) -#define RCC_CIR_HSERDYIE BIT(RCC_CIR_HSERDYIE_BIT) -#define RCC_CIR_HSIRDYIE BIT(RCC_CIR_HSIRDYIE_BIT) -#define RCC_CIR_LSERDYIE BIT(RCC_CIR_LSERDYIE_BIT) -#define RCC_CIR_LSIRDYIE BIT(RCC_CIR_LSIRDYIE_BIT) -#define RCC_CIR_CSSF BIT(RCC_CIR_CSSF_BIT) -#define RCC_CIR_PLLRDYF BIT(RCC_CIR_PLLRDYF_BIT) -#define RCC_CIR_HSERDYF BIT(RCC_CIR_HSERDYF_BIT) -#define RCC_CIR_HSIRDYF BIT(RCC_CIR_HSIRDYF_BIT) -#define RCC_CIR_LSERDYF BIT(RCC_CIR_LSERDYF_BIT) -#define RCC_CIR_LSIRDYF BIT(RCC_CIR_LSIRDYF_BIT) - -/* APB2 peripheral reset register */ - -#define RCC_APB2RSTR_TIM11RST_BIT 21 -#define RCC_APB2RSTR_TIM10RST_BIT 20 -#define RCC_APB2RSTR_TIM9RST_BIT 19 -#define RCC_APB2RSTR_ADC3RST_BIT 15 -#define RCC_APB2RSTR_USART1RST_BIT 14 -#define RCC_APB2RSTR_TIM8RST_BIT 13 -#define RCC_APB2RSTR_SPI1RST_BIT 12 -#define RCC_APB2RSTR_TIM1RST_BIT 11 -#define RCC_APB2RSTR_ADC2RST_BIT 10 -#define RCC_APB2RSTR_ADC1RST_BIT 9 -#define RCC_APB2RSTR_IOPGRST_BIT 8 -#define RCC_APB2RSTR_IOPFRST_BIT 7 -#define RCC_APB2RSTR_IOPERST_BIT 6 -#define RCC_APB2RSTR_IOPDRST_BIT 5 -#define RCC_APB2RSTR_IOPCRST_BIT 4 -#define RCC_APB2RSTR_IOPBRST_BIT 3 -#define RCC_APB2RSTR_IOPARST_BIT 2 -#define RCC_APB2RSTR_AFIORST_BIT 0 - -#define RCC_APB2RSTR_TIM11RST BIT(RCC_APB2RSTR_TIM11RST_BIT) -#define RCC_APB2RSTR_TIM10RST BIT(RCC_APB2RSTR_TIM10RST_BIT) -#define RCC_APB2RSTR_TIM9RST BIT(RCC_APB2RSTR_TIM9RST_BIT) -#define RCC_APB2RSTR_ADC3RST BIT(RCC_APB2RSTR_ADC3RST_BIT) -#define RCC_APB2RSTR_USART1RST BIT(RCC_APB2RSTR_USART1RST_BIT) -#define RCC_APB2RSTR_TIM8RST BIT(RCC_APB2RSTR_TIM8RST_BIT) -#define RCC_APB2RSTR_SPI1RST BIT(RCC_APB2RSTR_SPI1RST_BIT) -#define RCC_APB2RSTR_TIM1RST BIT(RCC_APB2RSTR_TIM1RST_BIT) -#define RCC_APB2RSTR_ADC2RST BIT(RCC_APB2RSTR_ADC2RST_BIT) -#define RCC_APB2RSTR_ADC1RST BIT(RCC_APB2RSTR_ADC1RST_BIT) -#define RCC_APB2RSTR_IOPGRST BIT(RCC_APB2RSTR_IOPGRST_BIT) -#define RCC_APB2RSTR_IOPFRST BIT(RCC_APB2RSTR_IOPFRST_BIT) -#define RCC_APB2RSTR_IOPERST BIT(RCC_APB2RSTR_IOPERST_BIT) -#define RCC_APB2RSTR_IOPDRST BIT(RCC_APB2RSTR_IOPDRST_BIT) -#define RCC_APB2RSTR_IOPCRST BIT(RCC_APB2RSTR_IOPCRST_BIT) -#define RCC_APB2RSTR_IOPBRST BIT(RCC_APB2RSTR_IOPBRST_BIT) -#define RCC_APB2RSTR_IOPARST BIT(RCC_APB2RSTR_IOPARST_BIT) -#define RCC_APB2RSTR_AFIORST BIT(RCC_APB2RSTR_AFIORST_BIT) - -/* APB1 peripheral reset register */ - -#define RCC_APB1RSTR_DACRST_BIT 29 -#define RCC_APB1RSTR_PWRRST_BIT 28 -#define RCC_APB1RSTR_BKPRST_BIT 27 -#define RCC_APB1RSTR_CANRST_BIT 25 -#define RCC_APB1RSTR_USBRST_BIT 23 -#define RCC_APB1RSTR_I2C2RST_BIT 22 -#define RCC_APB1RSTR_I2C1RST_BIT 21 -#define RCC_APB1RSTR_UART5RST_BIT 20 -#define RCC_APB1RSTR_UART4RST_BIT 19 -#define RCC_APB1RSTR_USART3RST_BIT 18 -#define RCC_APB1RSTR_USART2RST_BIT 17 -#define RCC_APB1RSTR_SPI3RST_BIT 15 -#define RCC_APB1RSTR_SPI2RST_BIT 14 -#define RCC_APB1RSTR_WWDRST_BIT 11 -#define RCC_APB1RSTR_TIM14RST_BIT 8 -#define RCC_APB1RSTR_TIM13RST_BIT 7 -#define RCC_APB1RSTR_TIM12RST_BIT 6 -#define RCC_APB1RSTR_TIM7RST_BIT 5 -#define RCC_APB1RSTR_TIM6RST_BIT 4 -#define RCC_APB1RSTR_TIM5RST_BIT 3 -#define RCC_APB1RSTR_TIM4RST_BIT 2 -#define RCC_APB1RSTR_TIM3RST_BIT 1 -#define RCC_APB1RSTR_TIM2RST_BIT 0 - -#define RCC_APB1RSTR_DACRST BIT(RCC_APB1RSTR_DACRST_BIT) -#define RCC_APB1RSTR_PWRRST BIT(RCC_APB1RSTR_PWRRST_BIT) -#define RCC_APB1RSTR_BKPRST BIT(RCC_APB1RSTR_BKPRST_BIT) -#define RCC_APB1RSTR_CANRST BIT(RCC_APB1RSTR_CANRST_BIT) -#define RCC_APB1RSTR_USBRST BIT(RCC_APB1RSTR_USBRST_BIT) -#define RCC_APB1RSTR_I2C2RST BIT(RCC_APB1RSTR_I2C2RST_BIT) -#define RCC_APB1RSTR_I2C1RST BIT(RCC_APB1RSTR_I2C1RST_BIT) -#define RCC_APB1RSTR_UART5RST BIT(RCC_APB1RSTR_UART5RST_BIT) -#define RCC_APB1RSTR_UART4RST BIT(RCC_APB1RSTR_UART4RST_BIT) -#define RCC_APB1RSTR_USART3RST BIT(RCC_APB1RSTR_USART3RST_BIT) -#define RCC_APB1RSTR_USART2RST BIT(RCC_APB1RSTR_USART2RST_BIT) -#define RCC_APB1RSTR_SPI3RST BIT(RCC_APB1RSTR_SPI3RST_BIT) -#define RCC_APB1RSTR_SPI2RST BIT(RCC_APB1RSTR_SPI2RST_BIT) -#define RCC_APB1RSTR_WWDRST BIT(RCC_APB1RSTR_WWDRST_BIT) -#define RCC_APB1RSTR_TIM14RST BIT(RCC_APB1RSTR_TIM14RST_BIT) -#define RCC_APB1RSTR_TIM13RST BIT(RCC_APB1RSTR_TIM13RST_BIT) -#define RCC_APB1RSTR_TIM12RST BIT(RCC_APB1RSTR_TIM12RST_BIT) -#define RCC_APB1RSTR_TIM7RST BIT(RCC_APB1RSTR_TIM7RST_BIT) -#define RCC_APB1RSTR_TIM6RST BIT(RCC_APB1RSTR_TIM6RST_BIT) -#define RCC_APB1RSTR_TIM5RST BIT(RCC_APB1RSTR_TIM5RST_BIT) -#define RCC_APB1RSTR_TIM4RST BIT(RCC_APB1RSTR_TIM4RST_BIT) -#define RCC_APB1RSTR_TIM3RST BIT(RCC_APB1RSTR_TIM3RST_BIT) -#define RCC_APB1RSTR_TIM2RST BIT(RCC_APB1RSTR_TIM2RST_BIT) - -/* AHB peripheral clock enable register */ - -#define RCC_AHBENR_SDIOEN_BIT 10 -#define RCC_AHBENR_FSMCEN_BIT 8 -#define RCC_AHBENR_CRCEN_BIT 7 -#define RCC_AHBENR_FLITFEN_BIT 4 -#define RCC_AHBENR_SRAMEN_BIT 2 -#define RCC_AHBENR_DMA2EN_BIT 1 -#define RCC_AHBENR_DMA1EN_BIT 0 - -#define RCC_AHBENR_SDIOEN BIT(RCC_AHBENR_SDIOEN_BIT) -#define RCC_AHBENR_FSMCEN BIT(RCC_AHBENR_FSMCEN_BIT) -#define RCC_AHBENR_CRCEN BIT(RCC_AHBENR_CRCEN_BIT) -#define RCC_AHBENR_FLITFEN BIT(RCC_AHBENR_FLITFEN_BIT) -#define RCC_AHBENR_SRAMEN BIT(RCC_AHBENR_SRAMEN_BIT) -#define RCC_AHBENR_DMA2EN BIT(RCC_AHBENR_DMA2EN_BIT) -#define RCC_AHBENR_DMA1EN BIT(RCC_AHBENR_DMA1EN_BIT) - -/* APB2 peripheral clock enable register */ - -#define RCC_APB2ENR_TIM11EN_BIT 21 -#define RCC_APB2ENR_TIM10EN_BIT 20 -#define RCC_APB2ENR_TIM9EN_BIT 19 -#define RCC_APB2ENR_ADC3EN_BIT 15 -#define RCC_APB2ENR_USART1EN_BIT 14 -#define RCC_APB2ENR_TIM8EN_BIT 13 -#define RCC_APB2ENR_SPI1EN_BIT 12 -#define RCC_APB2ENR_TIM1EN_BIT 11 -#define RCC_APB2ENR_ADC2EN_BIT 10 -#define RCC_APB2ENR_ADC1EN_BIT 9 -#define RCC_APB2ENR_IOPGEN_BIT 8 -#define RCC_APB2ENR_IOPFEN_BIT 7 -#define RCC_APB2ENR_IOPEEN_BIT 6 -#define RCC_APB2ENR_IOPDEN_BIT 5 -#define RCC_APB2ENR_IOPCEN_BIT 4 -#define RCC_APB2ENR_IOPBEN_BIT 3 -#define RCC_APB2ENR_IOPAEN_BIT 2 -#define RCC_APB2ENR_AFIOEN_BIT 0 - -#define RCC_APB2ENR_TIM11EN BIT(RCC_APB2ENR_TIM11EN_BIT) -#define RCC_APB2ENR_TIM10EN BIT(RCC_APB2ENR_TIM10EN_BIT) -#define RCC_APB2ENR_TIM9EN BIT(RCC_APB2ENR_TIM9EN_BIT) -#define RCC_APB2ENR_ADC3EN BIT(RCC_APB2ENR_ADC3EN_BIT) -#define RCC_APB2ENR_USART1EN BIT(RCC_APB2ENR_USART1EN_BIT) -#define RCC_APB2ENR_TIM8EN BIT(RCC_APB2ENR_TIM8EN_BIT) -#define RCC_APB2ENR_SPI1EN BIT(RCC_APB2ENR_SPI1EN_BIT) -#define RCC_APB2ENR_TIM1EN BIT(RCC_APB2ENR_TIM1EN_BIT) -#define RCC_APB2ENR_ADC2EN BIT(RCC_APB2ENR_ADC2EN_BIT) -#define RCC_APB2ENR_ADC1EN BIT(RCC_APB2ENR_ADC1EN_BIT) -#define RCC_APB2ENR_IOPGEN BIT(RCC_APB2ENR_IOPGEN_BIT) -#define RCC_APB2ENR_IOPFEN BIT(RCC_APB2ENR_IOPFEN_BIT) -#define RCC_APB2ENR_IOPEEN BIT(RCC_APB2ENR_IOPEEN_BIT) -#define RCC_APB2ENR_IOPDEN BIT(RCC_APB2ENR_IOPDEN_BIT) -#define RCC_APB2ENR_IOPCEN BIT(RCC_APB2ENR_IOPCEN_BIT) -#define RCC_APB2ENR_IOPBEN BIT(RCC_APB2ENR_IOPBEN_BIT) -#define RCC_APB2ENR_IOPAEN BIT(RCC_APB2ENR_IOPAEN_BIT) -#define RCC_APB2ENR_AFIOEN BIT(RCC_APB2ENR_AFIOEN_BIT) - -/* APB1 peripheral clock enable register */ - -#define RCC_APB1ENR_DACEN_BIT 29 -#define RCC_APB1ENR_PWREN_BIT 28 -#define RCC_APB1ENR_BKPEN_BIT 27 -#define RCC_APB1ENR_CANEN_BIT 25 -#define RCC_APB1ENR_USBEN_BIT 23 -#define RCC_APB1ENR_I2C2EN_BIT 22 -#define RCC_APB1ENR_I2C1EN_BIT 21 -#define RCC_APB1ENR_UART5EN_BIT 20 -#define RCC_APB1ENR_UART4EN_BIT 19 -#define RCC_APB1ENR_USART3EN_BIT 18 -#define RCC_APB1ENR_USART2EN_BIT 17 -#define RCC_APB1ENR_SPI3EN_BIT 15 -#define RCC_APB1ENR_SPI2EN_BIT 14 -#define RCC_APB1ENR_WWDEN_BIT 11 -#define RCC_APB1ENR_TIM14EN_BIT 8 -#define RCC_APB1ENR_TIM13EN_BIT 7 -#define RCC_APB1ENR_TIM12EN_BIT 6 -#define RCC_APB1ENR_TIM7EN_BIT 5 -#define RCC_APB1ENR_TIM6EN_BIT 4 -#define RCC_APB1ENR_TIM5EN_BIT 3 -#define RCC_APB1ENR_TIM4EN_BIT 2 -#define RCC_APB1ENR_TIM3EN_BIT 1 -#define RCC_APB1ENR_TIM2EN_BIT 0 - -#define RCC_APB1ENR_DACEN BIT(RCC_APB1ENR_DACEN_BIT) -#define RCC_APB1ENR_PWREN BIT(RCC_APB1ENR_PWREN_BIT) -#define RCC_APB1ENR_BKPEN BIT(RCC_APB1ENR_BKPEN_BIT) -#define RCC_APB1ENR_CANEN BIT(RCC_APB1ENR_CANEN_BIT) -#define RCC_APB1ENR_USBEN BIT(RCC_APB1ENR_USBEN_BIT) -#define RCC_APB1ENR_I2C2EN BIT(RCC_APB1ENR_I2C2EN_BIT) -#define RCC_APB1ENR_I2C1EN BIT(RCC_APB1ENR_I2C1EN_BIT) -#define RCC_APB1ENR_UART5EN BIT(RCC_APB1ENR_UART5EN_BIT) -#define RCC_APB1ENR_UART4EN BIT(RCC_APB1ENR_UART4EN_BIT) -#define RCC_APB1ENR_USART3EN BIT(RCC_APB1ENR_USART3EN_BIT) -#define RCC_APB1ENR_USART2EN BIT(RCC_APB1ENR_USART2EN_BIT) -#define RCC_APB1ENR_SPI3EN BIT(RCC_APB1ENR_SPI3EN_BIT) -#define RCC_APB1ENR_SPI2EN BIT(RCC_APB1ENR_SPI2EN_BIT) -#define RCC_APB1ENR_WWDEN BIT(RCC_APB1ENR_WWDEN_BIT) -#define RCC_APB1ENR_TIM14EN BIT(RCC_APB1ENR_TIM14EN_BIT) -#define RCC_APB1ENR_TIM13EN BIT(RCC_APB1ENR_TIM13EN_BIT) -#define RCC_APB1ENR_TIM12EN BIT(RCC_APB1ENR_TIM12EN_BIT) -#define RCC_APB1ENR_TIM7EN BIT(RCC_APB1ENR_TIM7EN_BIT) -#define RCC_APB1ENR_TIM6EN BIT(RCC_APB1ENR_TIM6EN_BIT) -#define RCC_APB1ENR_TIM5EN BIT(RCC_APB1ENR_TIM5EN_BIT) -#define RCC_APB1ENR_TIM4EN BIT(RCC_APB1ENR_TIM4EN_BIT) -#define RCC_APB1ENR_TIM3EN BIT(RCC_APB1ENR_TIM3EN_BIT) -#define RCC_APB1ENR_TIM2EN BIT(RCC_APB1ENR_TIM2EN_BIT) - -/* Backup domain control register */ - -#define RCC_BDCR_BDRST_BIT 16 -#define RCC_BDCR_RTCEN_BIT 15 -#define RCC_BDCR_LSEBYP_BIT 2 -#define RCC_BDCR_LSERDY_BIT 1 -#define RCC_BDCR_LSEON_BIT 0 - -#define RCC_BDCR_BDRST BIT(RCC_BDCR_BDRST_BIT) -#define RCC_BDCR_RTCEN BIT(RCC_BDCR_RTC_BIT) -#define RCC_BDCR_RTCSEL (0x3 << 8) -#define RCC_BDCR_RTCSEL_NONE (0x0 << 8) -#define RCC_BDCR_RTCSEL_LSE (0x1 << 8) -#define RCC_BDCR_RTCSEL_HSE (0x3 << 8) -#define RCC_BDCR_LSEBYP BIT(RCC_BDCR_LSEBYP_BIT) -#define RCC_BDCR_LSERDY BIT(RCC_BDCR_LSERDY_BIT) -#define RCC_BDCR_LSEON BIT(RCC_BDCR_LSEON_BIT) - -/* Control/status register */ - -#define RCC_CSR_LPWRRSTF_BIT 31 -#define RCC_CSR_WWDGRSTF_BIT 30 -#define RCC_CSR_IWDGRSTF_BIT 29 -#define RCC_CSR_SFTRSTF_BIT 28 -#define RCC_CSR_PORRSTF_BIT 27 -#define RCC_CSR_PINRSTF_BIT 26 -#define RCC_CSR_RMVF_BIT 24 -#define RCC_CSR_LSIRDY_BIT 1 -#define RCC_CSR_LSION_BIT 0 - -#define RCC_CSR_LPWRRSTF BIT(RCC_CSR_LPWRRSTF_BIT) -#define RCC_CSR_WWDGRSTF BIT(RCC_CSR_WWDGRSTF_BIT) -#define RCC_CSR_IWDGRSTF BIT(RCC_CSR_IWDGRSTF_BIT) -#define RCC_CSR_SFTRSTF BIT(RCC_CSR_SFTRSTF_BIT) -#define RCC_CSR_PORRSTF BIT(RCC_CSR_PORRSTF_BIT) -#define RCC_CSR_PINRSTF BIT(RCC_CSR_PINRSTF_BIT) -#define RCC_CSR_RMVF BIT(RCC_CSR_RMVF_BIT) -#define RCC_CSR_LSIRDY BIT(RCC_CSR_LSIRDY_BIT) -#define RCC_CSR_LSION BIT(RCC_CSR_LSION_BIT) - -/* - * Convenience routines - */ - -/** - * SYSCLK sources - * @see rcc_clk_init() - */ -typedef enum rcc_sysclk_src { - RCC_CLKSRC_HSI = 0x0, - RCC_CLKSRC_HSE = 0x1, - RCC_CLKSRC_PLL = 0x2, -} rcc_sysclk_src; - -/** - * PLL entry clock source - * @see rcc_clk_init() - */ -typedef enum rcc_pllsrc { - RCC_PLLSRC_HSE = (0x1 << 16), - RCC_PLLSRC_HSI_DIV_2 = (0x0 << 16) -} rcc_pllsrc; - -/** - * PLL multipliers - * @see rcc_clk_init() - */ -typedef enum rcc_pll_multiplier { - RCC_PLLMUL_2 = (0x0 << 18), - RCC_PLLMUL_3 = (0x1 << 18), - RCC_PLLMUL_4 = (0x2 << 18), - RCC_PLLMUL_5 = (0x3 << 18), - RCC_PLLMUL_6 = (0x4 << 18), - RCC_PLLMUL_7 = (0x5 << 18), - RCC_PLLMUL_8 = (0x6 << 18), - RCC_PLLMUL_9 = (0x7 << 18), - RCC_PLLMUL_10 = (0x8 << 18), - RCC_PLLMUL_11 = (0x9 << 18), - RCC_PLLMUL_12 = (0xA << 18), - RCC_PLLMUL_13 = (0xB << 18), - RCC_PLLMUL_14 = (0xC << 18), - RCC_PLLMUL_15 = (0xD << 18), - RCC_PLLMUL_16 = (0xE << 18), -} rcc_pll_multiplier; - -/** - * @brief Identifies bus and clock line for a peripheral. - * - * Also generally useful as a unique identifier for that peripheral - * (or its corresponding device struct). - */ -typedef enum rcc_clk_id { - RCC_GPIOA, - RCC_GPIOB, - RCC_GPIOC, - RCC_GPIOD, - RCC_AFIO, - RCC_ADC1, - RCC_ADC2, - RCC_ADC3, - RCC_USART1, - RCC_USART2, - RCC_USART3, - RCC_TIMER1, - RCC_TIMER2, - RCC_TIMER3, - RCC_TIMER4, - RCC_SPI1, - RCC_SPI2, - RCC_DMA1, - RCC_PWR, - RCC_BKP, - RCC_I2C1, - RCC_I2C2, - RCC_CRC, - RCC_FLITF, - RCC_SRAM, -#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) - RCC_GPIOE, - RCC_GPIOF, - RCC_GPIOG, - RCC_UART4, - RCC_UART5, - RCC_TIMER5, - RCC_TIMER6, - RCC_TIMER7, - RCC_TIMER8, - RCC_FSMC, - RCC_DAC, - RCC_DMA2, - RCC_SDIO, - RCC_SPI3, -#endif -#ifdef STM32_XL_DENSITY - RCC_TIMER9, - RCC_TIMER10, - RCC_TIMER11, - RCC_TIMER12, - RCC_TIMER13, - RCC_TIMER14, -#endif -} rcc_clk_id; - -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul); -void rcc_clk_enable(rcc_clk_id device); -void rcc_reset_dev(rcc_clk_id device); - -typedef enum rcc_clk_domain { - RCC_APB1, - RCC_APB2, - RCC_AHB -} rcc_clk_domain; - -rcc_clk_domain rcc_dev_clk(rcc_clk_id device); - -uint32 rcc_dev_clk_speed(rcc_clk_id id); -uint32 rcc_dev_timer_clk_speed(rcc_clk_id id); - -/** - * Prescaler identifiers - * @see rcc_set_prescaler() - */ -typedef enum rcc_prescaler { - RCC_PRESCALER_AHB, - RCC_PRESCALER_APB1, - RCC_PRESCALER_APB2, - RCC_PRESCALER_USB, - RCC_PRESCALER_ADC -} rcc_prescaler; - -/** - * ADC prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_adc_divider { - RCC_ADCPRE_PCLK_DIV_2 = 0x0 << 14, - RCC_ADCPRE_PCLK_DIV_4 = 0x1 << 14, - RCC_ADCPRE_PCLK_DIV_6 = 0x2 << 14, - RCC_ADCPRE_PCLK_DIV_8 = 0x3 << 14, -} rcc_adc_divider; - -/** - * APB1 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb1_divider { - RCC_APB1_HCLK_DIV_1 = 0x0 << 8, - RCC_APB1_HCLK_DIV_2 = 0x4 << 8, - RCC_APB1_HCLK_DIV_4 = 0x5 << 8, - RCC_APB1_HCLK_DIV_8 = 0x6 << 8, - RCC_APB1_HCLK_DIV_16 = 0x7 << 8, -} rcc_apb1_divider; - -/** - * APB2 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb2_divider { - RCC_APB2_HCLK_DIV_1 = 0x0 << 11, - RCC_APB2_HCLK_DIV_2 = 0x4 << 11, - RCC_APB2_HCLK_DIV_4 = 0x5 << 11, - RCC_APB2_HCLK_DIV_8 = 0x6 << 11, - RCC_APB2_HCLK_DIV_16 = 0x7 << 11, -} rcc_apb2_divider; - -/** - * AHB prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_ahb_divider { - RCC_AHB_SYSCLK_DIV_1 = 0x0 << 4, - RCC_AHB_SYSCLK_DIV_2 = 0x8 << 4, - RCC_AHB_SYSCLK_DIV_4 = 0x9 << 4, - RCC_AHB_SYSCLK_DIV_8 = 0xA << 4, - RCC_AHB_SYSCLK_DIV_16 = 0xB << 4, - RCC_AHB_SYSCLK_DIV_32 = 0xC << 4, - RCC_AHB_SYSCLK_DIV_64 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_128 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_256 = 0xE << 4, - RCC_AHB_SYSCLK_DIV_512 = 0xF << 4, -} rcc_ahb_divider; - -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/STM32F4/cores/maple/libmaple/rccF2.c b/STM32F4/cores/maple/libmaple/rccF4.c similarity index 99% rename from STM32F4/cores/maple/libmaple/rccF2.c rename to STM32F4/cores/maple/libmaple/rccF4.c index 691393a8d..c4ff30dc4 100644 --- a/STM32F4/cores/maple/libmaple/rccF2.c +++ b/STM32F4/cores/maple/libmaple/rccF4.c @@ -24,7 +24,7 @@ * SOFTWARE. *****************************************************************************/ - #ifdef STM32F2 +#ifdef STM32F4 /** * @file rcc.c @@ -166,7 +166,6 @@ typedef struct #define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) #define RESET 0 -typedef uint32 uint32_t; void InitMCO1() { @@ -175,8 +174,8 @@ void InitMCO1() RCC->CFGR &= RCC_CFGR_MCO1_RESET_MASK; RCC->CFGR |= RCC_CFGR_MCO1Source_HSE | RCC_CFGR_MCO1Div_1; // PA8 Output the Master Clock MCO1 - gpio_set_af_mode(GPIOA, 8, 0); - gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_af_mode(PA8, 0); + gpio_set_mode(PA8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); } diff --git a/STM32F4/cores/maple/libmaple/rccF2.h b/STM32F4/cores/maple/libmaple/rccF4.h similarity index 100% rename from STM32F4/cores/maple/libmaple/rccF2.h rename to STM32F4/cores/maple/libmaple/rccF4.h diff --git a/STM32F4/cores/maple/libmaple/rules.mk b/STM32F4/cores/maple/libmaple/rules.mk index c4924dc86..eb8d96d26 100644 --- a/STM32F4/cores/maple/libmaple/rules.mk +++ b/STM32F4/cores/maple/libmaple/rules.mk @@ -3,17 +3,11 @@ sp := $(sp).x dirstack_$(sp) := $(d) d := $(dir) BUILDDIRS += $(BUILD_PATH)/$(d) -ifneq ($(MCU_FAMILY), STM32F2) -BUILDDIRS += $(BUILD_PATH)/$(d)/usb -BUILDDIRS += $(BUILD_PATH)/$(d)/usb/usb_lib -LIBMAPLE_INCLUDES := -I$(LIBMAPLE_PATH) -I$(LIBMAPLE_PATH)/usb -I$(LIBMAPLE_PATH)/usb/usb_lib -else BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/STM32_USB_Device_Library/Core/src BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/STM32_USB_Device_Library/Class/cdc/src BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/STM32_USB_OTG_Driver/src BUILDDIRS += $(BUILD_PATH)/$(d)/usbF4/VCP LIBMAPLE_INCLUDES := -I$(LIBMAPLE_PATH) -I$(LIBMAPLE_PATH)/usbF4 -endif # Local flags @@ -42,18 +36,6 @@ cSRCS_$(d) := adc.c \ usart.c \ util.c -ifneq ($(MCU_FAMILY), STM32F2) - cSRCS_$(d) += \ - usb/descriptors.c \ - usb/usb.c \ - usb/usb_callbacks.c \ - usb/usb_hardware.c \ - usb/usb_lib/usb_core.c \ - usb/usb_lib/usb_init.c \ - usb/usb_lib/usb_int.c \ - usb/usb_lib/usb_mem.c \ - usb/usb_lib/usb_regs.c -else V=1 cSRCS_$(d) += \ usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c \ @@ -69,11 +51,7 @@ else usbF4/VCP/usbd_usr.c \ usbF4/usb.c \ usbF4/VCP/misc.c -endif -ifneq ($(MCU_FAMILY), STM32F2) - cSRCS_$(d) += bkp.c -endif sSRCS_$(d) := exc.S diff --git a/STM32F4/cores/maple/libmaple/spi.c b/STM32F4/cores/maple/libmaple/spi.c index 194a82efe..4b274cb37 100644 --- a/STM32F4/cores/maple/libmaple/spi.c +++ b/STM32F4/cores/maple/libmaple/spi.c @@ -83,25 +83,29 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags) { } /** - * @brief Nonblocking SPI transmit. + * @brief Blocking SPI transmit. * @param dev SPI port to use for transmission * @param buf Buffer to transmit. The sizeof buf's elements are * inferred from dev's data frame format (i.e., are * correctly treated as 8-bit or 16-bit quantities). * @param len Maximum number of elements to transmit. - * @return Number of elements transmitted. */ -uint32 spi_tx(spi_dev *dev, const void *buf, uint32 len) { - uint32 txed = 0; - uint8 byte_frame = spi_dff(dev) == SPI_DFF_8_BIT; - while (spi_is_tx_empty(dev) && (txed < len)) { - if (byte_frame) { - dev->regs->DR = ((const uint8*)buf)[txed++]; - } else { - dev->regs->DR = ((const uint16*)buf)[txed++]; - } - } - return txed; +void spi_tx(spi_dev *dev, void *buf, uint32 len) +{ + spi_reg_map *regs = dev->regs; + if ( spi_dff(dev) == SPI_DFF_8_BIT ) { + uint8 * dp8 = (uint8*)buf; + while ( len-- ) { + while ( (regs->SR & SPI_SR_TXE)==0 ) ; //while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty + regs->DR = *dp8++; + } + } else { + uint16 * dp16 = (uint16*)buf; + while ( len-- ) { + while ( (regs->SR & SPI_SR_TXE)==0 ) ; //while ( spi_is_tx_empty(dev)==0 ); // wait Tx to be empty + regs->DR = *dp16++; + } + } } /** @@ -157,8 +161,9 @@ void spi_rx_dma_disable(spi_dev *dev) { */ static void spi_reconfigure(spi_dev *dev, uint32 cr1_config) { - spi_irq_disable(dev, SPI_INTERRUPTS_ALL); - spi_peripheral_disable(dev); - dev->regs->CR1 = cr1_config; - spi_peripheral_enable(dev); +#define MASK (SPI_CR1_CRCEN|SPI_CR1_DFF) + spi_irq_disable(dev, SPI_INTERRUPTS_ALL); + if ( (dev->regs->CR1&MASK)!=(cr1_config&MASK) ) spi_peripheral_disable(dev); + dev->regs->CR1 = cr1_config; + spi_peripheral_enable(dev); } diff --git a/STM32F4/cores/maple/libmaple/spi.h b/STM32F4/cores/maple/libmaple/spi.h index 88739c584..abed68c12 100644 --- a/STM32F4/cores/maple/libmaple/spi.h +++ b/STM32F4/cores/maple/libmaple/spi.h @@ -213,31 +213,22 @@ typedef struct spi_dev { void spi_init(spi_dev *dev); -struct gpio_dev; /** * @brief Configure GPIO bit modes for use as a SPI port's pins. * * @param dev SPI device * @param as_master If true, configure as bus master; otherwise, as slave. - * @param nss_dev NSS pin's GPIO device * @param nss_bit NSS pin's GPIO bit on nss_dev - * @param sck_dev SCK pin's GPIO device * @param sck_bit SCK pin's GPIO bit on comm_dev - * @param miso_dev MISO pin's GPIO device * @param miso_bit MISO pin's GPIO bit on comm_dev - * @param mosi_dev MOSI pin's GPIO device * @param mosi_bit MOSI pin's GPIO bit on comm_dev */ extern void spi_config_gpios(spi_dev *dev, uint8 as_master, - struct gpio_dev *nss_dev, - uint8 nss_bit, - struct gpio_dev *sck_dev, - uint8 sck_bit, - struct gpio_dev *miso_dev, - uint8 miso_bit, - struct gpio_dev *mosi_dev, - uint8 mosi_bit); + uint8 nss_pin, + uint8 sck_pin, + uint8 miso_pin, + uint8 mosi_pin); /** * @brief SPI mode configuration. @@ -312,7 +303,7 @@ void spi_slave_enable(spi_dev *dev, spi_mode mode, uint32 flags); -uint32 spi_tx(spi_dev *dev, const void *buf, uint32 len); +void spi_tx(spi_dev *dev, void *buf, uint32 len); /** * @brief Call a function on each SPI port diff --git a/STM32F4/cores/maple/libmaple/spiF4.h b/STM32F4/cores/maple/libmaple/spiF4.h index 3f5116442..cbdc91a73 100644 --- a/STM32F4/cores/maple/libmaple/spiF4.h +++ b/STM32F4/cores/maple/libmaple/spiF4.h @@ -31,8 +31,8 @@ * @brief STM32F1 SPI/I2S series header. */ -#ifndef _LIBMAPLE_STM32F1_SPI_H_ -#define _LIBMAPLE_STM32F1_SPI_H_ +#ifndef _LIBMAPLE_SPI_F4_H_ +#define _LIBMAPLE_SPI_F4_H_ #include @@ -62,17 +62,6 @@ extern struct spi_dev *SPI2; extern struct spi_dev *SPI3; #endif -/* - * Routines - */ - -/* spi_gpio_cfg(): Backwards compatibility shim to spi_config_gpios() */ -struct gpio_dev; -extern void spi_config_gpios(struct spi_dev*, uint8, - struct gpio_dev*, uint8, - struct gpio_dev*, uint8, - struct gpio_dev*, uint8, - struct gpio_dev*, uint8); #ifdef __cplusplus } diff --git a/STM32F4/cores/maple/libmaple/spi_f4.c b/STM32F4/cores/maple/libmaple/spi_f4.c index b9beb68d2..43f5092c6 100644 --- a/STM32F4/cores/maple/libmaple/spi_f4.c +++ b/STM32F4/cores/maple/libmaple/spi_f4.c @@ -56,25 +56,21 @@ spi_dev *SPI3 = &spi3; void spi_config_gpios(spi_dev *ignored, uint8 as_master, - gpio_dev *nss_dev, - uint8 nss_bit, - gpio_dev *sck_dev, - uint8 sck_bit, - gpio_dev *miso_dev, - uint8 miso_bit, - gpio_dev *mosi_dev, - uint8 mosi_bit) { + uint8 nss_pin, + uint8 sck_pin, + uint8 miso_pin, + uint8 mosi_pin) { if (as_master) { // gpio_set_mode(nss_dev, nss_bit, GPIO_AF_OUTPUT_PP); - gpio_set_mode(sck_dev, sck_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(sck_pin, GPIO_AF_OUTPUT_PP); // gpio_set_mode(comm_dev, miso_bit, GPIO_INPUT_FLOATING); - gpio_set_mode(miso_dev, miso_bit, GPIO_AF_INPUT_PD); - gpio_set_mode(mosi_dev, mosi_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(miso_pin, GPIO_AF_INPUT_PD); + gpio_set_mode(mosi_pin, GPIO_AF_OUTPUT_PP); } else { - gpio_set_mode(nss_dev, nss_bit, GPIO_INPUT_FLOATING); - gpio_set_mode(sck_dev, sck_bit, GPIO_INPUT_FLOATING); - gpio_set_mode(miso_dev, miso_bit, GPIO_AF_OUTPUT_PP); - gpio_set_mode(mosi_dev, mosi_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(nss_pin, GPIO_INPUT_FLOATING); + gpio_set_mode(sck_pin, GPIO_INPUT_FLOATING); + gpio_set_mode(miso_pin, GPIO_AF_OUTPUT_PP); + gpio_set_mode(mosi_pin, GPIO_INPUT_FLOATING); } } diff --git a/STM32F4/cores/maple/libmaple/stm32.h b/STM32F4/cores/maple/libmaple/stm32.h index 0d4deaa41..3921788e7 100644 --- a/STM32F4/cores/maple/libmaple/stm32.h +++ b/STM32F4/cores/maple/libmaple/stm32.h @@ -138,69 +138,8 @@ #endif -#if defined(MCU_STM32F103RB) - /* e.g., LeafLabs Maple */ - #define STM32_NR_GPIO_PORTS 4 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20005000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103ZE) - /* e.g., LeafLabs Maple Native */ - - #define STM32_NR_GPIO_PORTS 7 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103CB) - /* e.g., LeafLabs Maple Mini */ - - /* This STM32_NR_GPIO_PORTS value is not, strictly speaking, true. - * But only pins 0 and 1 exist, and they're used for OSC on the - * Mini, so we'll live with this for now. */ - #define STM32_NR_GPIO_PORTS 3 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20005000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103RE) - /* e.g., LeafLabs Maple RET6 edition */ - - #define STM32_NR_GPIO_PORTS 4 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F103VE) - /* e.g., LeafLabs Maple Native */ - - #define STM32_NR_GPIO_PORTS 5 - #define STM32_DELAY_US_MULT 12 - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F205VE) - #define STM32_TICKS_PER_US 120 - #define STM32_NR_GPIO_PORTS 5 - #define STM32_DELAY_US_MULT (STM32_TICKS_PER_US/3) - #define STM32_SRAM_END ((void*)0x20010000) - - #define NR_GPIO_PORTS STM32_NR_GPIO_PORTS - #define DELAY_US_MULT STM32_DELAY_US_MULT - -#elif defined(MCU_STM32F406VG) +#if defined( STM32F4 ) #define STM32_TICKS_PER_US 168 #define STM32_NR_GPIO_PORTS 5 #define STM32_DELAY_US_MULT (STM32_TICKS_PER_US/3) diff --git a/STM32F4/cores/maple/libmaple/timer.c b/STM32F4/cores/maple/libmaple/timer.c index 83e9ace33..f8e55a185 100644 --- a/STM32F4/cores/maple/libmaple/timer.c +++ b/STM32F4/cores/maple/libmaple/timer.c @@ -44,7 +44,7 @@ /* Update only. */ #define NR_BAS_HANDLERS 1 -static timer_dev timer1 = { +timer_dev timer1 = { .regs = { .adv = TIMER1_BASE }, .clk_id = RCC_TIMER1, .type = TIMER_ADVANCED, @@ -53,7 +53,7 @@ static timer_dev timer1 = { /** Timer 1 device (advanced) */ timer_dev *TIMER1 = &timer1; -static timer_dev timer2 = { +timer_dev timer2 = { .regs = { .gen = TIMER2_BASE }, .clk_id = RCC_TIMER2, .type = TIMER_GENERAL, @@ -62,7 +62,7 @@ static timer_dev timer2 = { /** Timer 2 device (general-purpose) */ timer_dev *TIMER2 = &timer2; -static timer_dev timer3 = { +timer_dev timer3 = { .regs = { .gen = TIMER3_BASE }, .clk_id = RCC_TIMER3, .type = TIMER_GENERAL, @@ -71,7 +71,7 @@ static timer_dev timer3 = { /** Timer 3 device (general-purpose) */ timer_dev *TIMER3 = &timer3; -static timer_dev timer4 = { +timer_dev timer4 = { .regs = { .gen = TIMER4_BASE }, .clk_id = RCC_TIMER4, .type = TIMER_GENERAL, @@ -81,7 +81,7 @@ static timer_dev timer4 = { timer_dev *TIMER4 = &timer4; #ifdef STM32_HIGH_DENSITY -static timer_dev timer5 = { +timer_dev timer5 = { .regs = { .gen = TIMER5_BASE }, .clk_id = RCC_TIMER5, .type = TIMER_GENERAL, @@ -90,7 +90,7 @@ static timer_dev timer5 = { /** Timer 5 device (general-purpose) */ timer_dev *TIMER5 = &timer5; -static timer_dev timer6 = { +timer_dev timer6 = { .regs = { .bas = TIMER6_BASE }, .clk_id = RCC_TIMER6, .type = TIMER_BASIC, @@ -99,7 +99,7 @@ static timer_dev timer6 = { /** Timer 6 device (basic) */ timer_dev *TIMER6 = &timer6; -static timer_dev timer7 = { +timer_dev timer7 = { .regs = { .bas = TIMER7_BASE }, .clk_id = RCC_TIMER7, .type = TIMER_BASIC, @@ -108,7 +108,7 @@ static timer_dev timer7 = { /** Timer 7 device (basic) */ timer_dev *TIMER7 = &timer7; -static timer_dev timer8 = { +timer_dev timer8 = { .regs = { .adv = TIMER8_BASE }, .clk_id = RCC_TIMER8, .type = TIMER_ADVANCED, diff --git a/STM32F4/cores/maple/libmaple/timer.h b/STM32F4/cores/maple/libmaple/timer.h index fce6345b2..79b7d2996 100644 --- a/STM32F4/cores/maple/libmaple/timer.h +++ b/STM32F4/cores/maple/libmaple/timer.h @@ -113,13 +113,8 @@ typedef struct timer_bas_reg_map { } timer_bas_reg_map; -#ifdef STM32F2 - /** Timer 1 register map base pointer */ - #define TIMER1_BASE ((struct timer_adv_reg_map*)0x40010000) -#else - /** Timer 1 register map base pointer */ - #define TIMER1_BASE ((struct timer_adv_reg_map*)0x40012C00) -#endif +/** Timer 1 register map base pointer */ +#define TIMER1_BASE ((struct timer_adv_reg_map*)0x40010000) /** Timer 2 register map base pointer */ #define TIMER2_BASE ((struct timer_gen_reg_map*)0x40000000) /** Timer 3 register map base pointer */ @@ -133,14 +128,8 @@ typedef struct timer_bas_reg_map { #define TIMER6_BASE ((struct timer_bas_reg_map*)0x40001000) /** Timer 7 register map base pointer */ #define TIMER7_BASE ((struct timer_bas_reg_map*)0x40001400) - -#ifdef STM32F2 - /** Timer 8 register map base pointer */ - #define TIMER8_BASE ((struct timer_adv_reg_map*)0x40010400) -#else - /** Timer 8 register map base pointer */ - #define TIMER8_BASE ((struct timer_adv_reg_map*)0x40013400) -#endif +/** Timer 8 register map base pointer */ +#define TIMER8_BASE ((struct timer_adv_reg_map*)0x40010400) #endif /* diff --git a/STM32F4/cores/maple/libmaple/usart.h b/STM32F4/cores/maple/libmaple/usart.h index 3f7c88590..282293a17 100644 --- a/STM32F4/cores/maple/libmaple/usart.h +++ b/STM32F4/cores/maple/libmaple/usart.h @@ -62,11 +62,7 @@ typedef struct usart_reg_map { } usart_reg_map; /** USART1 register map base pointer */ -#ifdef STM32F2 - #define USART1_BASE ((struct usart_reg_map*)0x40011000) -#else - #define USART1_BASE ((struct usart_reg_map*)0x40013800) -#endif +#define USART1_BASE ((struct usart_reg_map*)0x40011000) /** USART2 register map base pointer */ #define USART2_BASE ((struct usart_reg_map*)0x40004400) /** USART3 register map base pointer */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h index f58ff0601..7ac987dcb 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h @@ -26,7 +26,7 @@ #include "usbd_ioreq.h" #include "usbd_req.h" -#include "usbd_desc.h" +#include diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h index 926f42e13..b1c8cc117 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h @@ -24,7 +24,8 @@ #ifndef __USB_CDC_CORE_H_ #define __USB_CDC_CORE_H_ -#include "usbd_ioreq.h" +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c index aac6776cd..8f97c5176 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c @@ -58,9 +58,10 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_core.h" -#include "usbd_desc.h" -#include "usbd_req.h" +#include +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h index b876856a3..063a30e69 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h @@ -24,9 +24,9 @@ #define __USBD_CORE_H /* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" +#include #include "usbd_def.h" -#include "usbd_conf.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h index a8c86710d..f2a31153a 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h @@ -24,7 +24,7 @@ #ifndef __USBD_DEF_H #define __USBD_DEF_H /* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h index 9aa9e44a3..f9849c6f9 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h @@ -27,7 +27,7 @@ /* Includes ------------------------------------------------------------------*/ #include "usbd_def.h" #include "usbd_core.h" -#include "usbd_conf.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c index af758427d..00bb25140 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c @@ -20,11 +20,11 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usbd_req.h" -#include "usbd_ioreq.h" -#include "usb_dcd_int.h" -#include "usb_bsp.h" +#include +#include +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c index 6964766bd..20ee5a0f1 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c @@ -20,7 +20,7 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c index f08d26c6c..5fc2e036c 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c @@ -20,9 +20,9 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" -#include "usbd_ioreq.h" -#include "usbd_desc.h" +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h index 82a09e15c..43c478126 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h @@ -24,7 +24,7 @@ #define __USB_CORE_H__ /* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" +#include #include "usb_regs.h" #include "usb_defines.h" diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h index 8c23d72d9..ee2c1a009 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h @@ -24,7 +24,7 @@ #define __USB_DEF_H__ /* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" +#include /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h index 54d61b827..1347f315d 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_otg.h @@ -23,6 +23,7 @@ #ifndef __USB_OTG__ #define __USB_OTG__ +#include "usb_core.h" /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h index cd71ddfaf..99f844e58 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h @@ -24,8 +24,8 @@ #define __USB_OTG_REGS_H__ /* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" - +#include +#include /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c index cb9eabc8c..1687afa7c 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_bsp.h" -#include "usb_core.h" +#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c index c3336cb84..dc9e53839 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" -#include "usb_bsp.h" +#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c index 3a49ede25..f9e561f14 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c @@ -20,12 +20,12 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_dcd_int.h" +#include typedef int IRQn_Type; #define __NVIC_PRIO_BITS 4 #define __Vendor_SysTickConfig 1 -#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h index 443665c70..ff5e9a6d4 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/core_cm4.h @@ -141,7 +141,7 @@ #endif #include /*!< standard types definitions */ -#include /*!< Core Instruction Access */ +#include "core_cmInstr.h" /*!< Core Instruction Access */ //#include /*!< Core Function Access */ //#include /*!< Compiler specific SIMD Intrinsics */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c index 9f33150cf..15a715e87 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/misc.c @@ -80,7 +80,7 @@ typedef unsigned char u8; typedef int IRQn_Type; #define __NVIC_PRIO_BITS 4 #define __Vendor_SysTickConfig 1 -#include +#include "core_cm4.h" /** @addtogroup STM32F4xx_StdPeriph_Driver * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c index df23ccbd7..e794cb144 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c @@ -21,13 +21,13 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usb_bsp.h" +#include #include "usbd_conf.h" -#include +#include typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; #define OTG_FS_IRQn 67 //typedef unsigned char uint8_t; -#include +#include "misc.h" //#include "stm32f4_discovery.h" @@ -97,10 +97,10 @@ void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) { // ala42 #define GPIO_AF_OTG1_FS ((uint8_t)0xA) /* OTG_FS Alternate Function mapping */ - gpio_set_mode(GPIOA,11,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); - gpio_set_mode(GPIOA,12,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); - gpio_set_af_mode(GPIOA,11,GPIO_AF_OTG1_FS) ; // OTG_FS_DM - gpio_set_af_mode(GPIOA,12,GPIO_AF_OTG1_FS) ; // OTG_FS_DP + gpio_set_mode(BOARD_USB_DM_PIN,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_mode(BOARD_USB_DP_PIN,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + gpio_set_af_mode(BOARD_USB_DM_PIN,GPIO_AF_OTG1_FS) ; // OTG_FS_DM + gpio_set_af_mode(BOARD_USB_DP_PIN,GPIO_AF_OTG1_FS) ; // OTG_FS_DP #ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED gpio_set_mode(GPIOA, 8,GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); gpio_set_af_mode(GPIOA, 8,GPIO_AF_OTG1_FS) ; // OTG_FS_SOF @@ -122,10 +122,10 @@ void USB_OTG_BSP_DeInit(USB_OTG_CORE_HANDLE *pdev) { // ala42 #define GPIO_AF0 ((uint8_t)0) /* OTG_FS Alternate Function mapping */ - gpio_set_mode(GPIOA,11, GPIO_MODE_INPUT); - gpio_set_mode(GPIOA,12, GPIO_MODE_INPUT); - gpio_set_af_mode(GPIOA,11,GPIO_AF0) ; // OTG_FS_DM - gpio_set_af_mode(GPIOA,12,GPIO_AF0) ; // OTG_FS_DP + gpio_set_mode(BOARD_USB_DM_PIN, GPIO_MODE_INPUT); + gpio_set_mode(BOARD_USB_DP_PIN, GPIO_MODE_INPUT); + gpio_set_af_mode(BOARD_USB_DM_PIN,GPIO_AF0) ; // OTG_FS_DM + gpio_set_af_mode(BOARD_USB_DP_PIN,GPIO_AF0) ; // OTG_FS_DP #ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED gpio_set_mode(GPIOA, 8,GPIO_MODE_INPUT); gpio_set_af_mode(GPIOA, 8,GPIO_AF0) ; // OTG_FS_SOF diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h index 61b0ac50c..fd45f4db3 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_conf.h @@ -173,7 +173,9 @@ typedef unsigned char u8; #elif defined (__ICCARM__) /* IAR Compiler */ #define __packed __packed #elif defined ( __GNUC__ ) /* GNU Compiler */ + #ifndef __packed #define __packed __attribute__ ((__packed__)) + #endif #elif defined (__TASKING__) /* TASKING Compiler */ #define __packed __unaligned #endif /* __CC_ARM */ @@ -206,7 +208,9 @@ typedef unsigned char u8; #elif defined (__ICCARM__) /* IAR Compiler */ #define __packed __packed #elif defined ( __GNUC__ ) /* GNU Compiler */ + #ifndef __packed #define __packed __attribute__ ((__packed__)) + #endif #elif defined (__TASKING__) /* TASKING Compiler */ #define __packed __unaligned #endif /* __CC_ARM */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c index b13260ee5..28a2d1ff2 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c @@ -255,7 +255,7 @@ typedef struct { void systemHardReset(void) { SCB_TypeDef* rSCB = (SCB_TypeDef *) SCB_BASE; - typedef void (*funcPtr)(void); + //typedef void (*funcPtr)(void); // not used /* Reset */ rSCB->AIRCR = (u32)AIRCR_RESET_REQ; diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h index 67475e7a4..8398dbdbb 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h @@ -26,7 +26,7 @@ /* Includes ------------------------------------------------------------------*/ //#include "stm32f4xx.h" -#include "usbd_cdc_core.h" +#include #include "usbd_conf.h" diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h index 516a2fbb3..62a40c27c 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_conf.h @@ -25,6 +25,7 @@ /* Includes ------------------------------------------------------------------*/ //#include "stm32f4_discovery.h" +#include "usb_conf.h" /** @defgroup USB_CONF_Exported_Defines * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c index 537f2665c..0153858fc 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c @@ -20,11 +20,11 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" +#include #include "usbd_desc.h" -#include "usbd_req.h" +#include #include "usbd_conf.h" -#include "usb_regs.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h index ed999dc62..4ae998cee 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h @@ -25,7 +25,7 @@ #define __USB_DESC_H /* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c index 84e8d6a54..a16ce40c5 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_usr.h" -#include "usbd_ioreq.h" +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.c b/STM32F4/cores/maple/libmaple/usbF4/usb.c index 2c0672f6a..385071982 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.c +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.c @@ -1,27 +1,30 @@ -#include "usbd_cdc_core.h" -#include "usbd_usr.h" -#include "usbd_desc.h" +#ifndef _USBF4_USB_H_ +#define _USBF4_USB_H_ + + +#include +#include +#include #include "usb.h" -#include -#include -#include +#include +#include +#include +#include USB_OTG_CORE_HANDLE USB_OTG_dev; -void setupUSB (void) { - #define USB_DISC_DEV GPIOD - #define USB_DISC_PIN 11 - - gpio_set_mode(USB_DISC_DEV, USB_DISC_PIN, GPIO_OUTPUT_OD); // ala42 +void setupUSB (void) +{ + gpio_set_mode(BOARD_USB_DP_PIN, GPIO_OUTPUT_OD); // ala42 #ifdef USB_DISC_OD //gpio_set_mode(USB_DISC_DEV, USB_DISC_PIN, GPIO_OUTPUT_OD); // ala42 #else //gpio_set_mode(USB_DISC_DEV, USB_DISC_PIN, GPIO_OUTPUT_PP); // ala42 for active pull-up on disconnect pin #endif - gpio_write_bit(USB_DISC_DEV, USB_DISC_PIN,0); // ala42 + gpio_clear_pin(BOARD_USB_DP_PIN); // ala42 delay_us(200000); /* setup the apb1 clock for USB */ @@ -29,7 +32,7 @@ void setupUSB (void) { //pRCC->APB1ENR |= RCC_APB1ENR_USBEN; /* initialize the usb application */ - gpio_write_bit(USB_DISC_DEV, USB_DISC_PIN, 1); // ala42 // presents us to the host + gpio_set_pin(BOARD_USB_DP_PIN); // ala42 // presents us to the host USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, @@ -93,7 +96,7 @@ RESULT usbPowerOff(void) { void usbDsbISR(void) {}; -#include "usb_dcd_int.h" +#include void __irq_OTG_FS_IRQHandler(void) { USBD_OTG_ISR_Handler (&USB_OTG_dev); @@ -102,3 +105,5 @@ void __irq_OTG_FS_IRQHandler(void) void x__irq_usbwakeup(void) { } + +#endif diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.h b/STM32F4/cores/maple/libmaple/usbF4/usb.h index f09f2bd0c..ce1a5585f 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.h +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.h @@ -5,7 +5,7 @@ extern "C" { #endif -#include "usb_conf.h" +#include typedef enum _RESULT { diff --git a/STM32F4/cores/maple/libmaple/util.c b/STM32F4/cores/maple/libmaple/util.c index 8c03e1865..8a745e87d 100644 --- a/STM32F4/cores/maple/libmaple/util.c +++ b/STM32F4/cores/maple/libmaple/util.c @@ -128,7 +128,7 @@ void throb(void) { uint32 TOP_CNT = 0x0800; uint32 i = 0; - gpio_set_mode(ERROR_LED_PORT, ERROR_LED_PIN, GPIO_OUTPUT_PP); + gpio_set_mode(ERROR_LED_PIN, GPIO_OUTPUT_PP); /* Error fade. */ while (1) { if (CC == TOP_CNT) { @@ -143,9 +143,9 @@ void throb(void) { } if (i < CC) { - gpio_write_bit(ERROR_LED_PORT, ERROR_LED_PIN, 1); + gpio_set_pin(ERROR_LED_PIN); } else { - gpio_write_bit(ERROR_LED_PORT, ERROR_LED_PIN, 0); + gpio_clear_pin(ERROR_LED_PIN); } i++; } diff --git a/STM32F4/cores/maple/libmaple/util.h b/STM32F4/cores/maple/libmaple/util.h index 62ad8af37..c5ed2de07 100644 --- a/STM32F4/cores/maple/libmaple/util.h +++ b/STM32F4/cores/maple/libmaple/util.h @@ -29,11 +29,12 @@ * @brief Miscellaneous utility macros and procedures. */ -#include "libmaple_types.h" - #ifndef _UTIL_H_ #define _UTIL_H_ +#include "libmaple_types.h" +#include "delay.h" + #ifdef __cplusplus extern "C"{ #endif diff --git a/STM32F4/cores/maple/pwm.cpp b/STM32F4/cores/maple/pwm.cpp index 1806348c2..c5f2ccbc6 100644 --- a/STM32F4/cores/maple/pwm.cpp +++ b/STM32F4/cores/maple/pwm.cpp @@ -28,8 +28,8 @@ * @brief Arduino-style PWM implementation. */ -#include "libmaple_types.h" -#include "timer.h" +#include +#include #include "boards.h" #include "pwm.h" diff --git a/STM32F4/cores/maple/usb_serial.cpp b/STM32F4/cores/maple/usb_serial.cpp index cc726c2e2..fadcb91af 100644 --- a/STM32F4/cores/maple/usb_serial.cpp +++ b/STM32F4/cores/maple/usb_serial.cpp @@ -33,6 +33,8 @@ #include "wirish.h" #include "usb.h" +#ifdef SERIAL_USB + #define USB_TIMEOUT 50 USBSerial::USBSerial(void) { @@ -132,7 +134,7 @@ uint8 USBSerial::pending(void) { return usbGetPending(); } -uint8 USBSerial::isConnected(void) { +USBSerial::operator bool() { return usbIsConnected() && usbIsConfigured(); } @@ -153,3 +155,5 @@ void USBSerial::disableBlockingTx(void) { } USBSerial SerialUSB; + +#endif diff --git a/STM32F4/cores/maple/usb_serial.h b/STM32F4/cores/maple/usb_serial.h index a551e9d4b..8eeed966a 100644 --- a/STM32F4/cores/maple/usb_serial.h +++ b/STM32F4/cores/maple/usb_serial.h @@ -33,6 +33,8 @@ #include "Stream.h" +#ifdef SERIAL_USB + /** * @brief Virtual serial terminal. */ @@ -57,7 +59,8 @@ class USBSerial : public Stream { uint8 getRTS(); uint8 getDTR(); - uint8 isConnected(); + operator bool(); + uint8 isConnected() { return (bool) *this; } uint8 pending(); void enableBlockingTx(void); @@ -65,6 +68,14 @@ class USBSerial : public Stream { }; extern USBSerial SerialUSB; +#define Serial SerialUSB + +#else // _USB_SERIAL_H_ + +#define Serial Serial1 + +#endif // SERIAL_USB + -#endif +#endif // _USB_SERIAL_H_ diff --git a/STM32F4/cores/maple/wirish.h b/STM32F4/cores/maple/wirish.h index 4aca74c0b..945e8fb94 100644 --- a/STM32F4/cores/maple/wirish.h +++ b/STM32F4/cores/maple/wirish.h @@ -34,9 +34,9 @@ #define _WIRISH_H_ #include -#include "libmaple.h" +#include +#include -#include "wirish_types.h" #include "boards.h" #include "io.h" #include "bits.h" @@ -44,10 +44,8 @@ #include "ext_interrupts.h" #include "wirish_debug.h" #include "wirish_math.h" -#include "wirish_time.h" #include -#include "HardwareSPI.h" -#include "HardwareSerial.h" +#include #include "HardwareTimer.h" #include "usb_serial.h" @@ -55,9 +53,10 @@ #define HIGH 0x1 #define LOW 0x0 -#define true 0x1 -#define false 0x0 - +#ifndef true + #define true 0x1 + #define false 0x0 +#endif #define lowByte(w) ((w) & 0xFF) #define highByte(w) (((w) >> 8) & 0xFF) diff --git a/STM32F4/cores/maple/wirish_analog.cpp b/STM32F4/cores/maple/wirish_analog.cpp index 63b5eb2d0..4e920e7c7 100644 --- a/STM32F4/cores/maple/wirish_analog.cpp +++ b/STM32F4/cores/maple/wirish_analog.cpp @@ -28,9 +28,7 @@ * @brief Arduino-compatible ADC implementation. */ -#include "libmaple.h" #include "wirish.h" -#include "io.h" /* Assumes that the ADC has been initialized and that the pin is set * to INPUT_ANALOG */ diff --git a/STM32F4/cores/maple/wirish_constants.h b/STM32F4/cores/maple/wirish_constants.h index 06a85ae8c..f39c0777e 100644 --- a/STM32F4/cores/maple/wirish_constants.h +++ b/STM32F4/cores/maple/wirish_constants.h @@ -1,5 +1,5 @@ -#ifndef _WIRING_CONSTANTS_ -#define _WIRING_CONSTANTS_ +#ifndef _WIRISH_CONSTANTS_H_ +#define _WIRISH_CONSTANTS_H_ #ifdef __cplusplus extern "C"{ diff --git a/STM32F4/cores/maple/wirish_debug.h b/STM32F4/cores/maple/wirish_debug.h index d4c0bab4d..d7dea2391 100644 --- a/STM32F4/cores/maple/wirish_debug.h +++ b/STM32F4/cores/maple/wirish_debug.h @@ -24,6 +24,9 @@ * SOFTWARE. *****************************************************************************/ +#ifndef _WIRISH_DEBUG_H_ +#define _WIRISH_DEBUG_H_ + /** * @file wirish_debug.h * @brief High level debug port configuration @@ -50,5 +53,7 @@ static inline void disableDebugPorts(void) { * @see disableDebugPorts() */ static inline void enableDebugPorts(void) { - afio_cfg_debug_ports(AFIO_DEBUG_FULL_SWJ); + afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY); //AFIO_DEBUG_FULL_SWJ); } + +#endif diff --git a/STM32F4/cores/maple/wirish_digital.cpp b/STM32F4/cores/maple/wirish_digital.cpp index a8b3ad811..4a656199b 100644 --- a/STM32F4/cores/maple/wirish_digital.cpp +++ b/STM32F4/cores/maple/wirish_digital.cpp @@ -29,7 +29,7 @@ */ #include "wirish.h" -#include "io.h" + void pinMode(uint8 pin, WiringPinMode mode) { gpio_pin_mode outputMode; @@ -72,7 +72,7 @@ void pinMode(uint8 pin, WiringPinMode mode) { return; } - gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, outputMode); + gpio_set_mode(pin, outputMode); if (PIN_MAP[pin].timer_device != NULL) { /* Enable/disable timer channels if we're switching into or @@ -84,48 +84,51 @@ void pinMode(uint8 pin, WiringPinMode mode) { } -uint32 digitalRead(uint8 pin) { +uint32 digitalRead(uint8 pin) +{ if (pin >= BOARD_NR_GPIO_PINS) { return 0; } - return gpio_read_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit) ? + return gpio_read_pin(pin) ? HIGH : LOW; } -void digitalWrite(uint8 pin, uint8 val) { +void digitalWrite(uint8 pin, uint8 val) +{ if (pin >= BOARD_NR_GPIO_PINS) { return; } - gpio_write_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, val); + gpio_write_pin(pin, val); } -void togglePin(uint8 pin) { +void togglePin(uint8 pin) +{ if (pin >= BOARD_NR_GPIO_PINS) { return; } - gpio_toggle_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit); + gpio_toggle_pin(pin); } #define BUTTON_DEBOUNCE_DELAY 1 -uint8 isButtonPressed() { - if (digitalRead(BOARD_BUTTON_PIN)) { +uint8 isButtonPressed(uint8_t button) { + if (digitalRead(button)) { delay(BUTTON_DEBOUNCE_DELAY); - while (digitalRead(BOARD_BUTTON_PIN)) + while (digitalRead(button)) ; return true; } return false; } -uint8 waitForButtonPress(uint32 timeout) { +uint8 waitForButtonPress(uint8_t button, uint32 timeout) { uint32 start = millis(); uint32 time; if (timeout == 0) { - while (!isButtonPressed()) + while (!isButtonPressed(button)) ; return true; } @@ -136,6 +139,6 @@ uint8 waitForButtonPress(uint32 timeout) { time - start > timeout) { return false; } - } while (!isButtonPressed()); + } while (!isButtonPressed(button)); return true; } diff --git a/STM32F4/cores/maple/wirish_math.h b/STM32F4/cores/maple/wirish_math.h index a85b30ada..0b8b22260 100644 --- a/STM32F4/cores/maple/wirish_math.h +++ b/STM32F4/cores/maple/wirish_math.h @@ -29,8 +29,8 @@ * @brief Includes ; provides Arduino-compatible math routines. */ -#ifndef _WIRING_MATH_H_ -#define _WIRING_MATH_H_ +#ifndef _WIRISH_MATH_H_ +#define _WIRISH_MATH_H_ #include diff --git a/STM32F4/cores/maple/wirish_time.cpp b/STM32F4/cores/maple/wirish_time.cpp index 270da28ac..654c1a2d2 100644 --- a/STM32F4/cores/maple/wirish_time.cpp +++ b/STM32F4/cores/maple/wirish_time.cpp @@ -28,10 +28,10 @@ * @brief Delay implementation. */ -#include "libmaple.h" -#include "systick.h" +#include +#include #include "wirish_time.h" -#include "delay.h" +#include void delay(unsigned long ms) { uint32 i; diff --git a/STM32F4/cores/maple/wirish_time.h b/STM32F4/cores/maple/wirish_time.h index 20a2fbfc4..3a117863c 100644 --- a/STM32F4/cores/maple/wirish_time.h +++ b/STM32F4/cores/maple/wirish_time.h @@ -32,10 +32,9 @@ #ifndef __WIRISH_TIME_H_ #define __WIRISH_TIME_H_ -#include "libmaple.h" -#include "nvic.h" -#include "systick.h" #include "boards.h" +#include +#include #define US_PER_MS 1000 diff --git a/STM32F4/cores/maple/wirish_types.h b/STM32F4/cores/maple/wirish_types.h index a3c260a73..de685bf9f 100644 --- a/STM32F4/cores/maple/wirish_types.h +++ b/STM32F4/cores/maple/wirish_types.h @@ -30,14 +30,13 @@ * @brief Wirish library type definitions. */ -#include "libmaple_types.h" -#include "gpio.h" -#include "timer.h" -#include "adc.h" - #ifndef _WIRISH_TYPES_H_ #define _WIRISH_TYPES_H_ +#include +#include +#include + /** * Invalid stm32_pin_info adc_channel value. * @see stm32_pin_info @@ -48,16 +47,28 @@ * @brief Stores STM32-specific information related to a given Maple pin. * @see PIN_MAP */ +#ifdef BOARD_generic_f407v +// restructure members to build consecutive pairs typedef struct stm32_pin_info { - gpio_dev *gpio_device; /**< Maple pin's GPIO device */ + const gpio_dev * gpio_device; /**< Maple pin's GPIO device */ + timer_dev * timer_device; /**< Pin's timer device, if any. */ + uint8 timer_channel; /**< Timer channel, or 0 if none. */ + uint8 adc_channel; /**< Pin ADC channel, or ADCx if none. */ + const adc_dev *adc_device; /**< ADC device, if any. */ +} stm32_pin_info; + +#else + +typedef struct stm32_pin_info { + const gpio_dev *gpio_device; /**< Maple pin's GPIO device */ timer_dev *timer_device; /**< Pin's timer device, if any. */ const adc_dev *adc_device; /**< ADC device, if any. */ - uint8 gpio_bit; /**< Pin's GPIO port bit. */ uint8 timer_channel; /**< Timer channel, or 0 if none. */ uint8 adc_channel; /**< Pin ADC channel, or ADCx if none. */ - uint8 filler; } stm32_pin_info; +#endif + /** * Variable attribute, instructs the linker to place the marked * variable in Flash instead of RAM. */ diff --git a/STM32F4/libraries/SPI/library.properties b/STM32F4/libraries/SPI/library.properties index 6f20f0185..ba3a57704 100644 --- a/STM32F4/libraries/SPI/library.properties +++ b/STM32F4/libraries/SPI/library.properties @@ -7,3 +7,4 @@ paragraph=SPI for STM32F4 category=Communication url= architectures=STM32F4 +maintainer= \ No newline at end of file diff --git a/STM32F4/libraries/SPI/src/SPI.cpp b/STM32F4/libraries/SPI/src/SPI.cpp index 08fbbd5d7..cb8f561c9 100644 --- a/STM32F4/libraries/SPI/src/SPI.cpp +++ b/STM32F4/libraries/SPI/src/SPI.cpp @@ -40,9 +40,9 @@ #include "wirish.h" #include "boards.h" -//#include "HardwareSerial.h" +#define DMA_TIMEOUT 100 -#if CYCLES_PER_MICROSECOND != 72 +#if CYCLES_PER_MICROSECOND != 168 /* TODO [0.2.0?] something smarter than this */ #warning "Unexpected clock speed; SPI frequency calculation will be incorrect" #endif @@ -91,77 +91,115 @@ static const spi_pins board_spi_pins[] __FLASH__ = { */ SPIClass::SPIClass(uint32 spi_num) { + + _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed + + switch (spi_num) { #if BOARD_NR_SPI >= 1 case 1: - this->spi_d = SPI1; + _currentSetting->spi_d = SPI1; break; #endif #if BOARD_NR_SPI >= 2 case 2: - this->spi_d = SPI2; + _currentSetting->spi_d = SPI2; break; #endif #if BOARD_NR_SPI >= 3 case 3: - this->spi_d = SPI3; + _currentSetting->spi_d = SPI3; break; #endif default: ASSERT(0); } - //pinMode(BOARD_SPI_DEFAULT_SS,OUTPUT); - - clockDivider = SPI_BAUD_PCLK_DIV_16; - dataMode = SPI_MODE0; + // Init things specific to each SPI device + // clock divider setup is a bit of hack, and needs to be improved at a later date. +/*****************************************************************************/ +// DMA / Channel / Stream +// Rx Tx +// SPI1: 2 / 3 / 0 (2) - 2 / 3 / 3 (5) +// SPI2: 1 / 0 / 3 - 1 / 0 / 4 +// SPI3: 1 / 0 / 0 (2) - 1 / 0 / 5 (7) +/*****************************************************************************/ + _settings[0].spi_d = SPI1; + _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); +#ifdef SPI_DMA + _settings[0].spiDmaDev = DMA2; + _settings[0].spiDmaChannel = DMA_CH3; + _settings[0].spiRxDmaStream = DMA_STREAM0; // alternative: DMA_STREAM2 + _settings[0].spiTxDmaStream = DMA_STREAM3; // alternative: DMA_STREAM5 +#endif + _settings[1].spi_d = SPI2; + _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); +#ifdef SPI_DMA + _settings[1].spiDmaDev = DMA1; + _settings[1].spiDmaChannel = DMA_CH0; + _settings[1].spiRxDmaStream = DMA_STREAM3; // alternative: - + _settings[1].spiTxDmaStream = DMA_STREAM4; // alternative: - +#endif +#if BOARD_NR_SPI >= 3 + _settings[2].spi_d = SPI3; + _settings[2].clockDivider = determine_baud_rate(_settings[2].spi_d, _settings[2].clock); +#ifdef SPI_DMA + _settings[2].spiDmaDev = DMA1; + _settings[2].spiDmaChannel = DMA_CH0; + _settings[2].spiRxDmaStream = DMA_STREAM0; // alternative: DMA_STREAM2 + _settings[2].spiTxDmaStream = DMA_STREAM5; // alternative: DMA_STREAM7 +#endif +#endif + } /* * Set up/tear down */ - -void SPIClass::begin(void) { - - uint32 flags = ((bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE | SPI_SOFT_SS); - spi_init(spi_d); - configure_gpios(spi_d, 1); +void SPIClass::updateSettings(void) { + uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE | SPI_SOFT_SS); #ifdef SPI_DEBUG - Serial.print("spi_master_enable("); Serial.print(clockDivider); Serial.print(","); Serial.print(dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif - spi_master_enable(spi_d, (spi_baud_rate)clockDivider, (spi_mode)dataMode, flags); + spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags); +} + +void SPIClass::begin(void) { + spi_init(_currentSetting->spi_d); + configure_gpios(_currentSetting->spi_d, 1); + updateSettings(); +#ifdef SPI_USE_DMA_BUFFER + dmaSendBufferInit(); +#endif +//Serial.println("SPI class begin - end"); } void SPIClass::beginSlave(void) { - if (dataMode >= 4) { - ASSERT(0); - return; - } - uint32 flags = ((bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE); - spi_init(spi_d); - configure_gpios(spi_d, 0); + spi_init(_currentSetting->spi_d); + configure_gpios(_currentSetting->spi_d, 0); + uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_RX_ONLY); #ifdef SPI_DEBUG - Serial.print("spi_slave_enable("); Serial.print(dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + Serial.print("spi_slave_enable("); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif - spi_slave_enable(spi_d, (spi_mode)dataMode, flags); + spi_slave_enable(_currentSetting->spi_d, (spi_mode)_currentSetting->dataMode, flags); } void SPIClass::end(void) { - if (!spi_is_enabled(this->spi_d)) { + if (!spi_is_enabled(_currentSetting->spi_d)) { return; } // Follows RM0008's sequence for disabling a SPI in master/slave // full duplex mode. - while (spi_is_rx_nonempty(this->spi_d)) { + while (spi_is_rx_nonempty(_currentSetting->spi_d)) { // FIXME [0.1.0] remove this once you have an interrupt based driver - volatile uint16 rx __attribute__((unused)) = spi_rx_reg(this->spi_d); + volatile uint16 rx __attribute__((unused)) = spi_rx_reg(_currentSetting->spi_d); } - while (!spi_is_tx_empty(this->spi_d)) + while (!spi_is_tx_empty(_currentSetting->spi_d)) ; - while (spi_is_busy(this->spi_d)) + while (spi_is_busy(_currentSetting->spi_d)) ; - spi_peripheral_disable(this->spi_d); + spi_peripheral_disable(_currentSetting->spi_d); } /* Roger Clark added 3 functions */ @@ -170,8 +208,9 @@ void SPIClass::setClockDivider(uint32_t clockDivider) #ifdef SPI_DEBUG Serial.print("Clock divider set to "); Serial.println(clockDivider); #endif - this->clockDivider = clockDivider; - this->begin(); + _currentSetting->clockDivider = clockDivider; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_BR); + _currentSetting->spi_d->regs->CR1 = cr1 | (clockDivider & SPI_CR1_BR); } void SPIClass::setBitOrder(BitOrder bitOrder) @@ -179,8 +218,10 @@ void SPIClass::setBitOrder(BitOrder bitOrder) #ifdef SPI_DEBUG Serial.print("Bit order set to "); Serial.println(bitOrder); #endif - this->bitOrder = bitOrder; - this->begin(); + _currentSetting->bitOrder = bitOrder; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_LSBFIRST); + if ( bitOrder==LSBFIRST ) cr1 |= SPI_CR1_LSBFIRST; + _currentSetting->spi_d->regs->CR1 = cr1; } /* Victor Perez. Added to test changing datasize from 8 to 16 bit modes on the fly. @@ -189,11 +230,11 @@ void SPIClass::setBitOrder(BitOrder bitOrder) */ void SPIClass::setDataSize(uint32 datasize) { - uint32 cr1 = this->spi_d->regs->CR1; - datasize &= SPI_CR1_DFF; - cr1 &= ~(SPI_CR1_DFF); - cr1 |= datasize; - this->spi_d->regs->CR1 = cr1; + _currentSetting->dataSize = datasize; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF); + uint8 en = spi_is_enabled(_currentSetting->spi_d); + spi_peripheral_disable(_currentSetting->spi_d); + _currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF) | en; } void SPIClass::setDataMode(uint8_t dataMode) @@ -212,13 +253,11 @@ SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge On the STM32 it appears to be bit 1 - CPOL : Clock polarity - (This bit should not be changed when communication is ongoing) 0 : CLK to 0 when idle 1 : CLK to 1 when idle bit 0 - CPHA : Clock phase - (This bit should not be changed when communication is ongoing) 0 : The first clock transition is the first data capture edge 1 : The second clock transition is the first data capture edge @@ -228,44 +267,32 @@ If someone finds this is not the case or sees a logic error with this let me kno #ifdef SPI_DEBUG Serial.print("Data mode set to "); Serial.println(dataMode); #endif - this->dataMode = dataMode; - this->begin(); -} - + _currentSetting->dataMode = dataMode; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA); + _currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA)); +} void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) { #ifdef SPI_DEBUG Serial.println("SPIClass::beginTransaction"); #endif - //_SSPin=pin; - //pinMode(_SSPin,OUTPUT); - //digitalWrite(_SSPin,LOW); setBitOrder(settings.bitOrder); setDataMode(settings.dataMode); - setClockDivider(determine_baud_rate(spi_d, settings.clock)); + setDataSize(settings.dataSize); + setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); begin(); -#if 0 -// code from SAM core - uint8_t mode = interruptMode; - if (mode > 0) { - if (mode < 16) { - if (mode & 1) PIOA->PIO_IDR = interruptMask[0]; - if (mode & 2) PIOB->PIO_IDR = interruptMask[1]; - if (mode & 4) PIOC->PIO_IDR = interruptMask[2]; - if (mode & 8) PIOD->PIO_IDR = interruptMask[3]; - } else { - interruptSave = interruptsStatus(); - noInterrupts(); - } - } - uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL(pin); - bitOrder[ch] = settings.border; - SPI_ConfigureNPCS(spi, ch, settings.config); - //setBitOrder(pin, settings.border); - //setDataMode(pin, settings.datamode); - //setClockDivider(pin, settings.clockdiv); -#endif +} + +void SPIClass::beginTransactionSlave(SPISettings settings) +{ + #ifdef SPI_DEBUG + Serial.println(F("SPIClass::beginTransactionSlave")); + #endif + setBitOrder(settings.bitOrder); + setDataMode(settings.dataMode); + setDataSize(settings.dataSize); + beginSlave(); } void SPIClass::endTransaction(void) @@ -295,131 +322,154 @@ void SPIClass::endTransaction(void) * I/O */ -uint8 SPIClass::read(void) { - uint8 buf[1]; - this->read(buf, 1); - return buf[0]; +uint16 SPIClass::read(void) +{ + while ( spi_is_rx_nonempty(_currentSetting->spi_d)==0 ) ; + return (uint16)spi_rx_reg(_currentSetting->spi_d); } -void SPIClass::read(uint8 *buf, uint32 len) { - uint32 rxed = 0; - while (rxed < len) { - while (!spi_is_rx_nonempty(this->spi_d)) - ; - buf[rxed++] = (uint8)spi_rx_reg(this->spi_d); - } +void SPIClass::read(uint8 *buf, uint32 len) +{ + if ( len == 0 ) return; + spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. + spi_reg_map * regs = _currentSetting->spi_d->regs; + // start sequence: write byte 0 + regs->DR = 0x00FF; // write the first byte + // main loop + while ( (--len) ) { + while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag + noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data + regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register + *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. + interrupts(); // let systick do its job + } + // read remaining last byte + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register + *buf++ = (uint8)(regs->DR); // read and store the received byte } -void SPIClass::write(uint16 data) { - #ifdef SPI_DEBUG -// Serial.print("SPIClass::write("); Serial.print(data); Serial.println(")"); - #endif - // this->write(&data, 1); - +void SPIClass::write(uint16 data) +{ /* Added for 16bit data Victor Perez. Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) - * The original method, of calling write(*data, length) . + * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, + * by taking the Tx code from transfer(byte) * This almost doubles the speed of this function. */ - - spi_tx_reg(this->spi_d, data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_reg(_currentSetting->spi_d, data); // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } -//void SPIClass::write(uint8 byte) { - // this->write(&byte, 1); +void SPIClass::write(uint16 data, uint32 n) +{ + // Added by stevstrong: Repeatedly send same data by the specified number of times + spi_reg_map * regs = _currentSetting->spi_d->regs; + while ( (n--)>0 ) { + regs->DR = data; // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + while ( (regs->SR & SPI_SR_TXE)==0 ) ; // wait till Tx empty + } + while ( (regs->SR & SPI_SR_BSY) != 0); // wait until BSY=0 before returning +} - /* Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, * by taking the Tx code from transfer(byte) - * The original method, of calling write(*data, length) . - * This almost doubles the speed of this function. - */ - -// spi_tx_reg(this->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." -// while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." -// while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." -//} +void SPIClass::write(void *data, uint32 length) +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_tx(spi_d, (void*)data, length); // data can be array of bytes or words + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." +} -void SPIClass::write(const uint8 *data, uint32 length) { - #ifdef SPI_DEBUG - Serial.print("SPIClass::write(data, "); Serial.print(length); Serial.println(")"); - #endif - uint32 txed = 0; - while (txed < length) { - txed += spi_tx(this->spi_d, data + txed, length - txed); - } - while (spi_is_tx_empty(this->spi_d) == 0); // "4. After writing the last data item into the SPI_DR register, wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... then wait until BSY=0, this indicates that the transmission of the last data is complete." +uint8 SPIClass::transfer(uint8 byte) const +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, byte); // Write the data item to be transmitted into the SPI_DR register + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint8)spi_rx_reg(spi_d); // "... and read the last received data." } -uint8 SPIClass::transfer(uint8 byte) const { - #ifdef SPI_DEBUG -// Serial.print("SPIClass::transfer("); Serial.print(byte); Serial.println(")"); - #endif - uint8 b; - spi_tx_reg(this->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return b; +uint16_t SPIClass::transfer16(uint16_t wr_data) const +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint16)spi_rx_reg(spi_d); // "... and read the last received data." } + +#ifdef SPI_DMA /* Roger Clark and Victor Perez, 2015 * Performs a DMA SPI transfer with at least a receive buffer. -* If a TX buffer is not provided, FF is sent over and over for the lenght of the transfer. -* On exit TX buffer is not modified, and RX buffer cotains the received data. +* If a TX buffer is not provided, FF is sent over and over for the length of the transfer. +* On exit TX buffer is not modified, and RX buffer contains the received data. * Still in progress. */ -uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length) { +uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length) +{ if (length == 0) return 0; - uint8 b; - if (spi_is_rx_nonempty(this->spi_d) == 1) b = spi_rx_reg(this->spi_d); //Clear the RX buffer in case a byte is waiting on it. - dma1_ch3_Active=true; - dma_init(DMA1); - dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - + + uint8 b = 0; + + dma_init(_currentSetting->spiDmaDev); +// dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); // RX - spi_rx_dma_enable(SPI1); - dma_setup_transfer(DMA1, DMA_CH2, &SPI1->regs->DR, DMA_SIZE_8BITS, - receiveBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA - dma_set_num_transfers(DMA1, DMA_CH2, length); - + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==SPI_DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer( _currentSetting->spiDmaDev, + _currentSetting->spiRxDmaStream, + _currentSetting->spiDmaChannel, + dma_bit_size, + &_currentSetting->spi_d->regs->DR, // peripheral address + receiveBuf, // memory bank 0 address + NULL, // memory bank 1 address + (DMA_MINC_MODE | DMA_FROM_PER | DMA_PRIO_VERY_HIGH) // flags + ); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream, length); + dma_set_fifo_flags(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream, 0); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream); + // TX - spi_tx_dma_enable(SPI1); - if (!transmitBuf) { - static uint8_t ff = 0XFF; - transmitBuf = &ff; - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, (DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit FF repeatedly + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM); // | DMA_TRNS_CMPLT); + if ( transmitBuf==0 ) { + static uint8_t ff = 0XFF; + transmitBuf = &ff; + flags &= ~((uint32)DMA_MINC_MODE); // remove increment mode } - else { - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit buffer DMA - } - dma_set_num_transfers(DMA1, DMA_CH3, length); - - dma_enable(DMA1, DMA_CH2);// enable receive - dma_enable(DMA1, DMA_CH3);// enable transmit + dma_setup_transfer( _currentSetting->spiDmaDev, + _currentSetting->spiTxDmaStream, + _currentSetting->spiDmaChannel, + dma_bit_size, + &_currentSetting->spi_d->regs->DR, // peripheral address + transmitBuf, // memory bank 0 address + NULL, // memory bank 1 address + flags + ); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, length); + dma_set_fifo_flags(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, 0); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); + // software enable sequence, see AN4031, chapter 4.3 + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream);// enable receive + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream);// enable transmit + spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. + spi_rx_dma_enable(_currentSetting->spi_d); + spi_tx_dma_enable(_currentSetting->spi_d); // must be the last enable to avoid DMA error flag -// while (dma1_ch3_Active); -// if (receiveBuf) { uint32_t m = millis(); - while (dma1_ch3_Active) { - if ((millis() - m) > 100) { - dma1_ch3_Active = 0; - b = 2; - break; - } + while ((b = dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set + if ( b&(DMA_ISR_TEIF|DMA_ISR_DMEIF|DMA_ISR_FEIF) ) { b = 1; break; } // break on any error flag + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - -// } - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(DMA1, DMA_CH3); - dma_disable(DMA1, DMA_CH2); - spi_rx_dma_disable(SPI1); - spi_tx_dma_disable(SPI1); + if (b & DMA_ISR_TCIF) b = 0; + + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + // software disable sequence, see AN4031, chapter 4.1 + spi_tx_dma_disable(_currentSetting->spi_d); + spi_rx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); return b; } @@ -427,56 +477,45 @@ uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length * Performs a DMA SPI send using a TX buffer. * On exit TX buffer is not modified. * Still in progress. +* 2016 - stevstrong - reworked to automatically detect bit size from SPI setting */ -uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { +uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) +{ if (length == 0) return 0; - uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - uint8 b; - dma1_ch3_Active=true; - dma_init(DMA1); - dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - + uint8 b = 0; + dma_init(_currentSetting->spiDmaDev); // TX - spi_tx_dma_enable(SPI1); - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, - transmitBuf, DMA_SIZE_8BITS, flags);// Transmit buffer DMA - dma_set_num_transfers(DMA1, DMA_CH3, length); - dma_enable(DMA1, DMA_CH3);// enable transmit - - while (dma1_ch3_Active); - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(DMA1, DMA_CH3); - spi_tx_dma_disable(SPI1); - return b; -} - -uint8 SPIClass::dmaSend(uint16 *transmitBuf, uint16 length, bool minc) { - if (length == 0) return 0; - uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - uint8 b; - dma1_ch3_Active=true; - dma_init(DMA1); - dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==SPI_DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer( _currentSetting->spiDmaDev, + _currentSetting->spiTxDmaStream, + _currentSetting->spiDmaChannel, + dma_bit_size, + &_currentSetting->spi_d->regs->DR, // peripheral address + transmitBuf, // memory bank 0 address + NULL, // memory bank 1 address + ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM ) //| DMA_TRNS_CMPLT ) // flags + );// Transmit buffer DMA + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, length); + dma_set_fifo_flags(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, 0); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream);// enable transmit + spi_tx_dma_enable(_currentSetting->spi_d); + + uint32_t m = millis(); + while ((b = dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set + if ( b&(DMA_ISR_TEIF|DMA_ISR_DMEIF|DMA_ISR_FEIF) ) { b = 1; break; } // break on any error flag + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } + if (b & DMA_ISR_TCIF) b = 0; - // TX - spi_tx_dma_enable(SPI1); - dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_16BITS, - transmitBuf, DMA_SIZE_16BITS, flags);// Transmit buffer DMA - dma_set_num_transfers(DMA1, DMA_CH3, length); - dma_enable(DMA1, DMA_CH3);// enable transmit - - while (dma1_ch3_Active); - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(DMA1, DMA_CH3); - spi_tx_dma_disable(SPI1); - return b; + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); + return b; } +#endif + void SPIClass::attachInterrupt(void) { @@ -492,19 +531,19 @@ void SPIClass::detachInterrupt(void) { */ uint8 SPIClass::misoPin(void) { - return dev_to_spi_pins(this->spi_d)->miso; + return dev_to_spi_pins(_currentSetting->spi_d)->miso; } uint8 SPIClass::mosiPin(void) { - return dev_to_spi_pins(this->spi_d)->mosi; + return dev_to_spi_pins(_currentSetting->spi_d)->mosi; } uint8 SPIClass::sckPin(void) { - return dev_to_spi_pins(this->spi_d)->sck; + return dev_to_spi_pins(_currentSetting->spi_d)->sck; } uint8 SPIClass::nssPin(void) { - return dev_to_spi_pins(this->spi_d)->nss; + return dev_to_spi_pins(_currentSetting->spi_d)->nss; } /* @@ -512,18 +551,13 @@ uint8 SPIClass::nssPin(void) { */ uint8 SPIClass::send(uint8 data) { - uint8 buf[] = {data}; - return this->send(buf, 1); + this->write(data); + return 1; } uint8 SPIClass::send(uint8 *buf, uint32 len) { - uint32 txed = 0; - uint8 ret = 0; - while (txed < len) { - this->write(buf[txed++]); - ret = this->read(); - } - return ret; + this->write(buf, len); + return len; } uint8 SPIClass::recv(void) { @@ -585,29 +619,26 @@ static void configure_gpios(spi_dev *dev, bool as_master) { if(dev->clk_id <= RCC_SPI2) { if(nssi) { if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 5); + gpio_set_af_mode(pins->nss, 5); } } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 5); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 5); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 5); + gpio_set_af_mode(pins->sck, 5); + gpio_set_af_mode(pins->miso, 5); + gpio_set_af_mode(pins->mosi, 5); } else { if(nssi) { if(!as_master) { - gpio_set_af_mode(nssi->gpio_device, scki->gpio_bit, 6); + gpio_set_af_mode(pins->nss, 6); } } - gpio_set_af_mode(scki->gpio_device, scki->gpio_bit, 6); - gpio_set_af_mode(misoi->gpio_device, misoi->gpio_bit, 6); - gpio_set_af_mode(mosii->gpio_device, mosii->gpio_bit, 6); + gpio_set_af_mode(pins->sck, 6); + gpio_set_af_mode(pins->miso, 6); + gpio_set_af_mode(pins->mosi, 6); } #endif - spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, - scki->gpio_device, scki->gpio_bit, - misoi->gpio_device, misoi->gpio_bit, - mosii->gpio_device, mosii->gpio_bit); + spi_config_gpios(dev, as_master, pins->nss, pins->sck, pins->miso, pins->mosi); } static const spi_baud_rate baud_rates[8] __FLASH__ = { @@ -634,6 +665,8 @@ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { { case RCC_APB2: clock = STM32_PCLK2; break; // 72 Mhz case RCC_APB1: clock = STM32_PCLK1; break; // 36 Mhz + case RCC_AHB1: break; + default: break; } clock /= 2; i = 0; @@ -646,4 +679,3 @@ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { //SPIClass SPI(3); - diff --git a/STM32F4/libraries/SPI/src/SPI.h b/STM32F4/libraries/SPI/src/SPI.h index 490d58b2e..cabc0c260 100644 --- a/STM32F4/libraries/SPI/src/SPI.h +++ b/STM32F4/libraries/SPI/src/SPI.h @@ -34,18 +34,16 @@ /* TODO [0.1.0] Remove deprecated methods. */ - -#ifndef _SPI_H_INCLUDED -#define _SPI_H_INCLUDED +#ifndef _LIB_SPI_H_ +#define _LIB_SPI_H_ #include #include #include - -#include -#include #include +#define SPI_DMA + // SPI_HAS_TRANSACTION means SPI has // - beginTransaction() // - endTransaction() @@ -96,34 +94,61 @@ #define SPI_MODE2 SPI_MODE_2 #define SPI_MODE3 SPI_MODE_3 +#define SPI_DATA_SIZE_8BIT SPI_CR1_DFF_8_BIT +#define SPI_DATA_SIZE_16BIT SPI_CR1_DFF_16_BIT + class SPISettings { public: SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, dataMode); + init_AlwaysInline(clock, bitOrder, dataMode, SPI_DATA_SIZE_8BIT); + } else { + init_MightInline(clock, bitOrder, dataMode, SPI_DATA_SIZE_8BIT); + } + } + SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) { + if (__builtin_constant_p(clock)) { + init_AlwaysInline(clock, bitOrder, dataMode, dataSize); } else { - init_MightInline(clock, bitOrder, dataMode); + init_MightInline(clock, bitOrder, dataMode, dataSize); } } - SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } + SPISettings(uint32_t clock) { + if (__builtin_constant_p(clock)) { + init_AlwaysInline(clock, MSBFIRST, SPI_MODE0, SPI_DATA_SIZE_8BIT); + } else { + init_MightInline(clock, MSBFIRST, SPI_MODE0, SPI_DATA_SIZE_8BIT); + } + } + SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, SPI_DATA_SIZE_8BIT); } private: - void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { - init_AlwaysInline(clock, bitOrder, dataMode); + void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) { + init_AlwaysInline(clock, bitOrder, dataMode, dataSize); } - void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) __attribute__((__always_inline__)) { + void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) __attribute__((__always_inline__)) { this->clock = clock; this->bitOrder = bitOrder; this->dataMode = dataMode; + this->dataSize = dataSize; } uint32_t clock; BitOrder bitOrder; uint8_t dataMode; + uint32_t dataSize; + + spi_dev *spi_d; + uint32_t clockDivider; + +#ifdef SPI_DMA + dma_dev* spiDmaDev; + dma_channel spiDmaChannel; + dma_stream spiRxDmaStream, spiTxDmaStream; +#endif + friend class SPIClass; }; -volatile static bool dma1_ch3_Active; - /** * @brief Wirish SPI interface. * @@ -133,18 +158,11 @@ volatile static bool dma1_ch3_Active; class SPIClass { public: - - /** * @param spiPortNumber Number of the SPI port to manage. */ SPIClass(uint32 spiPortNumber); - /* - * Set up/tear down - */ - - /** * @brief Equivalent to begin(SPI_1_125MHZ, MSBFIRST, 0). @@ -175,6 +193,8 @@ class SPIClass { void beginTransaction(uint8_t pin, SPISettings settings); void endTransaction(void); + void beginTransactionSlave(SPISettings settings); + void setClockDivider(uint32_t clockDivider); void setBitOrder(BitOrder bitOrder); void setDataMode(uint8_t dataMode); @@ -195,40 +215,40 @@ class SPIClass { */ /** - * @brief Return the next unread byte. + * @brief Return the next unread byte/word. * - * If there is no unread byte waiting, this function will block + * If there is no unread byte/word waiting, this function will block * until one is received. */ - uint8 read(void); + uint16 read(void); /** * @brief Read length bytes, storing them into buffer. * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This + * @param length Number of bytes to store in buffer. This * function will block until the desired number of * bytes have been read. */ void read(uint8 *buffer, uint32 length); /** - * @brief Transmit a byte. - * @param data Byte to transmit. + * @brief Transmit one byte/word. + * @param data to transmit. */ -// void write(uint8 data); - + void write(uint16 data); + /** - * @brief Transmit a half word. + * @brief Transmit one byte/word a specified number of times. * @param data to transmit. */ - void write(uint16 data); + void write(uint16 data, uint32 n); /** - * @brief Transmit multiple bytes. - * @param buffer Bytes to transmit. - * @param length Number of bytes in buffer to transmit. + * @brief Transmit multiple bytes/words. + * @param buffer Bytes/words to transmit. + * @param length Number of bytes/words in buffer to transmit. */ - void write(const uint8 *buffer, uint32 length); + void write(void * buffer, uint32 length); /** * @brief Transmit a byte, then return the next unread byte. @@ -239,9 +259,12 @@ class SPIClass { * @return Next unread byte. */ uint8 transfer(uint8 data) const; + uint16_t transfer16(uint16_t data) const; +#ifdef SPI_DMA /** * @brief Sets up a DMA Transfer for "length" bytes. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * * This function transmits and receives to buffers. * @@ -249,30 +272,19 @@ class SPIClass { * @param receiveBuf buffer Bytes to save received data. * @param length Number of bytes in buffer to transmit. */ - uint8 dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length); + uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); /** - * @brief Sets up a DMA Transmit for bytes. - * - * This function transmits and does not care about the RX fifo. + * @brief Sets up a DMA Transmit for SPI 8 or 16 bit transfer mode. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. * - * @param transmitBuf buffer Bytes to transmit, - * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode, clear to use Circular mode. - */ - uint8 dmaSend(uint8 *transmitBuf, uint16 length, bool minc = 1); - - /** - * @brief Sets up a DMA Transmit for half words. - * SPI PERFIPHERAL MUST BE SET TO 16 BIT MODE BEFORE - * - * This function transmits and does not care about the RX fifo. + * This function only transmits and does not care about the RX fifo. * * @param data buffer half words to transmit, * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode (default if blank), clear to use Circular mode. */ - uint8 dmaSend(uint16 *transmitBuf, uint16 length, bool minc = 1); + uint8 dmaSend(void * transmitBuf, uint16 length, bool minc = 1); +#endif /* * Pin accessors @@ -304,7 +316,24 @@ class SPIClass { * @brief Get a pointer to the underlying libmaple spi_dev for * this HardwareSPI instance. */ - spi_dev* c_dev(void) { return this->spi_d; } + spi_dev* c_dev(void) { return _currentSetting->spi_d; } + + + spi_dev *dev(){ return _currentSetting->spi_d;} + + /** + * @brief Sets the number of the SPI peripheral to be used by + * this HardwareSPI instance. + * + * @param spi_num Number of the SPI port. 1-2 in low density devices + * or 1-3 in high density devices. + */ + + void setModule(int spi_num) + { + _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed + } + /* -- The following methods are deprecated --------------------------- */ @@ -338,26 +367,13 @@ class SPIClass { */ uint8 recv(void); - spi_dev *dev(){ return spi_d;} - - - private: - - static inline void DMA1_CH3_Event() { - dma1_ch3_Active = 0; -// dma_disable(DMA1, DMA_CH3); -// dma_disable(DMA1, DMA_CH2); - - // To Do. Need to wait for - } - spi_dev *spi_d; - uint8_t _SSPin; - uint32_t clockDivider; - uint8_t dataMode; - BitOrder bitOrder; + SPISettings _settings[BOARD_NR_SPI]; + SPISettings *_currentSetting; + + void updateSettings(void); }; +extern SPIClass SPI; // needed bx SdFat(EX) lib -extern SPIClass SPI;//(1);// dummy params #endif diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index 99ae55549..2bb1946b0 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -8,17 +8,15 @@ version=0.1.0 # compiler variables # ---------------------- -#build.gcc_ver=gcc-arm-none-eabi-4.8.3-2014q1 - compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g -Os -Wall -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ compiler.c.elf.flags=-Os -Wl,--gc-sections compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g -Os -Wall -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy @@ -30,6 +28,8 @@ compiler.size.cmd=arm-none-eabi-size compiler.define=-DARDUINO= # this can be overriden in boards.txt +build.f_cpu=168000000L +build.mcu=cortex-m4 build.cpu_flags= build.hs_flag= build.common_flags=-mthumb -D__STM32F4__ @@ -44,12 +44,10 @@ compiler.ar.extra_flags= compiler.elf2hex.extra_flags= +##compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" +#compiler.libs.c.flags="-I{build.core.path}" "-I{build.core.path}/libmaple" "-I{build.core.path}/libmaple/usbF4" "-I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Core/inc" "-I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc" "-I{build.core.path}/libmaple/usbF4/STM32_USB_OTG_Driver/inc" "-I{build.core.path}/libmaple/usbF4/VCP" +compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.core.path}/libmaple/usbF4" -##compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/stm32f1/include/series" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" -#compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.system.path}/libmaple/include" "-I{build.system.path}/libmaple/stm32f1/include" "-I{build.system.path}/libmaple/usb/stm32f1" "-I{build.system.path}/libmaple/usb/usb_lib" - - -compiler.libs.c.flags="-I{build.core.path}/libmaple" -I{build.core.path}/libmaple/usbF4 -I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Core/inc -I{build.core.path}/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc -I{build.core.path}/libmaple/usbF4/STM32_USB_OTG_Driver/inc -I{build.core.path}/libmaple/usbF4/VCP @@ -66,14 +64,13 @@ compiler.libs.c.flags="-I{build.core.path}/libmaple" -I{build.core.path}/libmapl # --------------------- ## Compile c files -recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" +recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {build.cpu_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" ## Compile c++ files recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {build.cpu_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" ## Compile S files recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.S.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {build.cpu_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" -#recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" "{source_file}" -o "{object_file}" ## Create archives recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}" @@ -92,7 +89,6 @@ recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf ## Compute size recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf" -#recipe.size.regex=\.text\s+([0-9]+).* recipe.size.regex=^(?:\.text|\.rodata|\.ARM.exidx)\s+([0-9]+).* recipe.size.regex.data=^(?:\.data|\.bss|\.noinit)\s+([0-9]+).* diff --git a/STM32F4/cores/maple/libmaple/gpio.c b/STM32F4/system/libmaple/Arduino.h similarity index 79% rename from STM32F4/cores/maple/libmaple/gpio.c rename to STM32F4/system/libmaple/Arduino.h index 3792220e3..cef8f089f 100644 --- a/STM32F4/cores/maple/libmaple/gpio.c +++ b/STM32F4/system/libmaple/Arduino.h @@ -1,7 +1,7 @@ /****************************************************************************** * The MIT License * - * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2010 LeafLabs LLC. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -24,13 +24,23 @@ * SOFTWARE. *****************************************************************************/ -/** - * @file gpio.c - * @brief GPIO initialization routine - */ +#ifndef _WIRISH_ARDUINO_H_ +#define _WIRISH_ARDUINO_H_ -// #ifdef STM32F2 -// #include "gpioF2.c" -// #else -// #include "gpioF1.c" -// #endif +//#warning Include Arduino.h from system\libmaple + +#include "wirish.h" + +void setup(); +void loop(); +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus +void yield(void); +#ifdef __cplusplus +} +#endif // __cplusplus + +#include "variant.h" + +#endif diff --git a/STM32F4/variants/generic_f407v/generic_f407v.cpp b/STM32F4/variants/generic_f407v/generic_f407v.cpp new file mode 100644 index 000000000..c51ff9b55 --- /dev/null +++ b/STM32F4/variants/generic_f407v/generic_f407v.cpp @@ -0,0 +1,81 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file generic_f407v.cpp + * @author ala42 + * @brief generic_f407v board file. + */ + +#ifdef BOARD_generic_f407v + +#include "generic_f407v.h" + +#include "wirish_types.h" + +//static void initSRAMChip(void); +/*****************************************************************************/ +// Alternate functions, see DocID022152 Rev 8, Table 9. +/*****************************************************************************/ +void boardInit(void) { +/* // remap TIMER8 to PC6-9 + gpio_set_af_mode(GPIOC, 6, 3); + gpio_set_af_mode(GPIOC, 7, 3); + gpio_set_af_mode(GPIOC, 8, 3); + gpio_set_af_mode(GPIOC, 9, 3); + + // remap TIMER1 to PE9,11,13,14 + gpio_set_af_mode(GPIOE, 9, 1); + gpio_set_af_mode(GPIOE, 11, 1); + gpio_set_af_mode(GPIOE, 13, 1); + gpio_set_af_mode(GPIOE, 14, 1); + + // remap TIMER3 to PB4,5,0,1 + gpio_set_af_mode(GPIOB, 4, 2); + gpio_set_af_mode(GPIOB, 5, 2); + gpio_set_af_mode(GPIOB, 0, 2); + gpio_set_af_mode(GPIOB, 1, 2); + + //gpio_set_af_mode(GPIOA, 2, 7); + //gpio_set_af_mode(GPIOA, 3, 7); +*/ + return; +} + +/* +static void initSRAMChip(void) { + fsmc_nor_psram_reg_map *regs = FSMC_NOR_PSRAM1_BASE; + + fsmc_sram_init_gpios(); + rcc_clk_enable(RCC_FSMC); + + regs->BCR = (FSMC_BCR_WREN | FSMC_BCR_MWID_16BITS | FSMC_BCR_MTYP_SRAM | + FSMC_BCR_MBKEN); + fsmc_nor_psram_set_addset(regs, 0); + fsmc_nor_psram_set_datast(regs, 3); +} +*/ +#endif diff --git a/STM32F4/variants/generic_f407v/generic_f407v.h b/STM32F4/variants/generic_f407v/generic_f407v.h new file mode 100644 index 000000000..927f9cd9c --- /dev/null +++ b/STM32F4/variants/generic_f407v/generic_f407v.h @@ -0,0 +1,163 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file generic_f407v.h + * @author Marti Bolivar + * @brief Private include file for Maple Native in boards.h + * + * See maple.h for more information on these definitions. + */ + +#ifndef _BOARD_GENERIC_F407V_H_ +#define _BOARD_GENERIC_F407V_H_ + +#define Port2Pin(port, bit) ((port-'A')*16+bit) + +#define CYCLES_PER_MICROSECOND 168 + + +#undef STM32_PCLK1 +#undef STM32_PCLK2 +#define STM32_PCLK1 (CYCLES_PER_MICROSECOND*1000000/4) +#define STM32_PCLK2 (CYCLES_PER_MICROSECOND*1000000/2) + +#define SYSTICK_RELOAD_VAL (CYCLES_PER_MICROSECOND*1000-1) + +/*****************************************************************************/ +// Board pin definitions +#define BOARD_USB_DM_PIN PA11 +#define BOARD_USB_DP_PIN PA12 + +#define BOARD_LED_PIN PA6 //Port2Pin('A', 6) +#define BOARD_LED2_PIN PA7 //Port2Pin('A', 7) +#define BOARD_BUTTON1_PIN PA0 //Port2Pin('A', 0) +#define BOARD_BUTTON2_PIN PE4 //Port2Pin('E', 4) +#define BOARD_BUTTON3_PIN PE3 //Port2Pin('E', 3) + +#define BOARD_NR_USARTS 5 +#define BOARD_USART1_TX_PIN PA9 //Port2Pin('A', 9) +#define BOARD_USART1_RX_PIN PA10 //Port2Pin('A',10) +#define BOARD_USART2_TX_PIN PA2 //Port2Pin('A', 2) +#define BOARD_USART2_RX_PIN PA3 //Port2Pin('A', 3) +#define BOARD_USART3_TX_PIN PB10 //Port2Pin('B',10) +#define BOARD_USART3_RX_PIN PB11 //Port2Pin('B',11) +#define BOARD_UART4_TX_PIN PA0 //Port2Pin('A', 0) +#define BOARD_UART4_RX_PIN PA1 //Port2Pin('A', 1) +#define BOARD_UART5_TX_PIN PC12 //Port2Pin('C',12) +#define BOARD_UART5_RX_PIN PD2 //Port2Pin('D', 2) + +#define BOARD_NR_SPI 3 +#define BOARD_SPI1_NSS_PIN PA4 //Port2Pin('A', 4) +#define BOARD_SPI1_SCK_PIN PA5 //Port2Pin('A', 5) +#define BOARD_SPI1_MISO_PIN PA6 //Port2Pin('A', 6) +#define BOARD_SPI1_MOSI_PIN PA7 //Port2Pin('A', 7) +#define BOARD_SPI1A_NSS_PIN PA15 //Port2Pin('A',15) +#define BOARD_SPI1A_SCK_PIN PB3 //Port2Pin('B', 3) +#define BOARD_SPI1A_MISO_PIN PB4 //Port2Pin('B', 4) +#define BOARD_SPI1A_MOSI_PIN PB5 //Port2Pin('B', 5) + +#define BOARD_SPI2_NSS_PIN PB12 //Port2Pin('B',12) +#define BOARD_SPI2_SCK_PIN PB13 //Port2Pin('B',13) +#define BOARD_SPI2_MISO_PIN PB14 //Port2Pin('B',14) +#define BOARD_SPI2_MOSI_PIN PB15 //Port2Pin('B',15) +#define BOARD_SPI2A_NSS_PIN PB9 //Port2Pin('B', 9) +#define BOARD_SPI2A_SCK_PIN PB10 //Port2Pin('B',10) +#define BOARD_SPI2A_MISO_PIN PC2 //Port2Pin('C', 2) +#define BOARD_SPI2A_MOSI_PIN pc3 //Port2Pin('C', 3) + +#define BOARD_SPI3_NSS_PIN PA15 //Port2Pin('A',15) +#define BOARD_SPI3_SCK_PIN PB3 //Port2Pin('B', 3) +#define BOARD_SPI3_MISO_PIN PB4 //Port2Pin('B', 4) +#define BOARD_SPI3_MOSI_PIN PB5 //Port2Pin('B', 5) +/* overlap with the SDIO interface for SD card +#define BOARD_SPI3A_NSS_PIN PA4 //Port2Pin('A', 4) +#define BOARD_SPI3A_SCK_PIN PC10 //Port2Pin('C',10) +#define BOARD_SPI3A_MISO_PIN PC11 //Port2Pin('C',11) +#define BOARD_SPI3A_MOSI_PIN PC12 //Port2Pin('C',12) +*/ +#define BOARD_SDIO_D0 PC8 //Port2Pin('C', 8) +#define BOARD_SDIO_D1 PC9 //Port2Pin('C', 9) +#define BOARD_SDIO_D2 PC10 //Port2Pin('C',10) +#define BOARD_SDIO_D3 PC11 //Port2Pin('C',11) +#define BOARD_SDIO_CK PC12 //Port2Pin('C',12) +#define BOARD_SDIO_CMD PD2 //Port2Pin('D', 2) + +#define BOARD_NR_GPIO_PINS 80 +#define BOARD_NR_PWM_PINS 22 +#define BOARD_NR_ADC_PINS 16 +#define BOARD_NR_USED_PINS 22 +#define BOARD_JTMS_SWDIO_PIN PA13 //Port2Pin('A',13) +#define BOARD_JTCK_SWCLK_PIN PA14 //Port2Pin('A',14) +#define BOARD_JTDI_PIN PA15 //Port2Pin('A',15) +#define BOARD_JTDO_PIN PB3 //Port2Pin('B', 3) +#define BOARD_NJTRST_PIN PB4 //Port2Pin('B', 4) + +/*****************************************************************************/ +// Pins reserved for the on-board hardware +#define USB_DM_PIN BOARD_USB_DM_PIN // PA11 +#define USB_DP_PIN BOARD_USB_DP_PIN // PA12 + +#define FLASH_CS_PIN PB0 +#define FLASH_CLK_PIN BOARD_SPI3_SCK_PIN // PB3 +#define FLASH_DO_PIN BOARD_SPI3_MISO_PIN // PB4 +#define FLASH_DI_PIN BOARD_SPI3_MOSI_PIN // PB5 + +#define NRF24_CLK_PIN BOARD_SPI3_SCK_PIN // PB3 +#define NRF24_DO_PIN BOARD_SPI3_MISO_PIN // PB4 +#define NRF24_DI_PIN BOARD_SPI3_MOSI_PIN // PB5 +#define NRF24_CE_PIN PB6 +#define NRF24_CS_PIN PB7 +#define NRF24_IRQ_PIN PB8 + +// SD card, SDIO mode +#define SD_DAT0 BOARD_SDIO_D0 // PC8 +#define SD_DAT1 BOARD_SDIO_D1 // PC9 +#define SD_DAT2 BOARD_SDIO_D2 // PC10 +#define SD_DAT3 BOARD_SDIO_D3 // PC11 +#define SD_CLK BOARD_SDIO_CK // PC12 +#define SD_CMD BOARD_SDIO_CMD // PD2 +// SD card, SPI mode, only usable with software SPI +#define SD_DI BOARD_SDIO_CMD // PD2 +#define SD_DO BOARD_SDIO_D0 // PC8 +#define SD_CS BOARD_SDIO_D3 // PC11 +#define SD_SCLK BOARD_SDIO_CK // PC12 + +/*****************************************************************************/ + +enum { +PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, +PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, +PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, +PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7,PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15, +PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15, +#if 0 // not available on LQFP100 package +PF0,PF1,PF2,PF3,PF4,PF5,PF6,PF7,PF8,PF9,PF10,PF11,PF12,PF13,PF14,PF15, +PG0,PG1,PG2,PG3,PG4,PG5,PG6,PG7,PG8,PG9,PG10,PG11,PG12,PG13,PG14,PG15 +#endif // not available on LQFP100 package +}; + +#endif diff --git a/STM32F4/variants/generic_f407v/ld/common.inc b/STM32F4/variants/generic_f407v/ld/common.inc new file mode 100644 index 000000000..f5a0f5b6e --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/common.inc @@ -0,0 +1,219 @@ +/* + * Linker script for libmaple. + * + * Original author "lanchon" from ST forums, with modifications by LeafLabs. + */ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") + +/* + * Configure other libraries we want in the link. + * + * libgcc, libc, and libm are common across supported toolchains. + * However, some toolchains require additional archives which aren't + * present everywhere (e.g. ARM's gcc-arm-embedded releases). + * + * To hack around this, we let the build system specify additional + * archives by putting the right extra_libs.inc (in a directory under + * toolchains/) in our search path. + */ +GROUP(libgcc.a libc.a libm.a) +INCLUDE extra_libs.inc + +/* + * These force the linker to search for vector table symbols. + * + * These symbols vary by STM32 family (and also within families). + * It's up to the build system to configure the link's search path + * properly for the target MCU. + */ +INCLUDE vector_symbols.inc + +/* STM32 vector table. */ +EXTERN(__stm32_vector_table) + +/* C runtime initialization function. */ +EXTERN(start_c) + +/* main entry point */ +EXTERN(main) + +/* Initial stack pointer value. */ +EXTERN(__msp_init) +PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram)); + +/* Reset vector and chip reset entry point */ +EXTERN(__start__) +ENTRY(__start__) +PROVIDE(__exc_reset = __start__); + +/* Heap boundaries, for libmaple */ +EXTERN(_lm_heap_start); +EXTERN(_lm_heap_end); + +SECTIONS +{ + .text : + { + __text_start__ = .; + /* + * STM32 vector table. Leave this here. Yes, really. + */ + *(.stm32.interrupt_vector) + + /* + * Program code and vague linking + */ + *(.text .text.* .gnu.linkonce.t.*) + *(.plt) + *(.gnu.warning) + *(.glue_7t) *(.glue_7) *(.vfp11_veneer) + + *(.ARM.extab* .gnu.linkonce.armextab.*) + *(.gcc_except_table) + *(.eh_frame_hdr) + *(.eh_frame) + + . = ALIGN(4); + KEEP(*(.init)) + + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + } > REGION_TEXT + + /* + * End of text + */ + .text.align : + { + . = ALIGN(8); + __text_end__ = .; + } > REGION_TEXT + + /* + * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI + */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > REGION_RODATA + __exidx_end = .; + + /* + * .data + */ + .data : + { + . = ALIGN(8); + __data_start__ = .; + + *(.got.plt) *(.got) + *(.data .data.* .gnu.linkonce.d.*) + + . = ALIGN(8); + __data_end__ = .; + } > REGION_DATA AT> REGION_RODATA + + /* + * Read-only data + */ + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + /* .USER_FLASH: We allow users to allocate into Flash here */ + *(.USER_FLASH) + /* ROM image configuration; for C startup */ + . = ALIGN(4); + _lm_rom_img_cfgp = .; + LONG(LOADADDR(.data)); + /* + * Heap: Linker scripts may choose a custom heap by overriding + * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in + * internal SRAM, beginning after .bss, and growing towards + * the stack. + * + * I'm shoving these here naively; there's probably a cleaner way + * to go about this. [mbolivar] + */ + _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; + _lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init; + } > REGION_RODATA + + /* + * .bss + */ + .bss : + { + . = ALIGN(8); + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + . = ALIGN (8); + __bss_end__ = .; + _end = __bss_end__; + } > REGION_BSS + + /* + * Debugging sections + */ + .stab 0 (NOLOAD) : { *(.stab) } + .stabstr 0 (NOLOAD) : { *(.stabstr) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/STM32F4/variants/generic_f407v/ld/extra_libs.inc b/STM32F4/variants/generic_f407v/ld/extra_libs.inc new file mode 100644 index 000000000..dd2c84fa4 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/extra_libs.inc @@ -0,0 +1,7 @@ +/* + * Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi- + * releases (https://launchpad.net/gcc-arm-embedded/). + */ + +/* This is for the provided newlib. */ +GROUP(libnosys.a) diff --git a/STM32F4/variants/generic_f407v/ld/flash.ld b/STM32F4/variants/generic_f407v/ld/flash.ld new file mode 100644 index 000000000..c753a786c --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/flash.ld @@ -0,0 +1,20 @@ +/* + * Discovery F4 (STM32F407VGT6, high density) linker script for + * Flash builds. + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 125K + rom (rx) : ORIGIN = 0x08010000, LENGTH = 960K /* ala42 */ +} + +/* GROUP(libcs4_stm32_high_density.a) */ + +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +_FLASH_BUILD = 1; +INCLUDE common.inc diff --git a/STM32F4/variants/generic_f407v/ld/jtag.ld b/STM32F4/variants/generic_f407v/ld/jtag.ld new file mode 100644 index 000000000..1001db518 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/jtag.ld @@ -0,0 +1,20 @@ +/* + * STM32F4xx high density linker script for + * JTAG (bare metal, no bootloader) builds. + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K +} + +/* GROUP(libcs3_stm32_high_density.a) */ + +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +_FLASH_BUILD = 1; +INCLUDE common.inc diff --git a/STM32F4/variants/generic_f407v/ld/names.inc b/STM32F4/variants/generic_f407v/ld/names.inc new file mode 100644 index 000000000..6d7ff6e94 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/names.inc @@ -0,0 +1,78 @@ +EXTERN(__cs3_stack) +EXTERN(__cs3_reset) +EXTERN(__exc_nmi) +EXTERN(__exc_hardfault) +EXTERN(__exc_memmanage) +EXTERN(__exc_busfault) +EXTERN(__exc_usagefault) +EXTERN(__stm32reservedexception7) +EXTERN(__stm32reservedexception8) +EXTERN(__stm32reservedexception9) +EXTERN(__stm32reservedexception10) +EXTERN(__exc_svc) +EXTERN(__exc_debug_monitor) +EXTERN(__stm32reservedexception13) +EXTERN(__exc_pendsv) +EXTERN(__exc_systick) + +EXTERN(__irq_wwdg) +EXTERN(__irq_pvd) +EXTERN(__irq_tamper) +EXTERN(__irq_rtc) +EXTERN(__irq_flash) +EXTERN(__irq_rcc) +EXTERN(__irq_exti0) +EXTERN(__irq_exti1) +EXTERN(__irq_exti2) +EXTERN(__irq_exti3) +EXTERN(__irq_exti4) +EXTERN(__irq_dma1_channel1) +EXTERN(__irq_dma1_channel2) +EXTERN(__irq_dma1_channel3) +EXTERN(__irq_dma1_channel4) +EXTERN(__irq_dma1_channel5) +EXTERN(__irq_dma1_channel6) +EXTERN(__irq_dma1_channel7) +EXTERN(__irq_adc) +EXTERN(__irq_usb_hp_can_tx) +EXTERN(__irq_usb_lp_can_rx0) +EXTERN(__irq_can_rx1) +EXTERN(__irq_can_sce) +EXTERN(__irq_exti9_5) +EXTERN(__irq_tim1_brk) +EXTERN(__irq_tim1_up) +EXTERN(__irq_tim1_trg_com) +EXTERN(__irq_tim1_cc) +EXTERN(__irq_tim2) +EXTERN(__irq_tim3) +EXTERN(__irq_tim4) +EXTERN(__irq_i2c1_ev) +EXTERN(__irq_i2c1_er) +EXTERN(__irq_i2c2_ev) +EXTERN(__irq_i2c2_er) +EXTERN(__irq_spi1) +EXTERN(__irq_spi2) +EXTERN(__irq_usart1) +EXTERN(__irq_usart2) +EXTERN(__irq_usart3) +EXTERN(__irq_exti15_10) +EXTERN(__irq_rtcalarm) +EXTERN(__irq_usbwakeup) + +EXTERN(__irq_tim8_brk) +EXTERN(__irq_tim8_up) +EXTERN(__irq_tim8_trg_com) +EXTERN(__irq_tim8_cc) +EXTERN(__irq_adc3) +EXTERN(__irq_fsmc) +EXTERN(__irq_sdio) +EXTERN(__irq_tim5) +EXTERN(__irq_spi3) +EXTERN(__irq_uart4) +EXTERN(__irq_uart5) +EXTERN(__irq_tim6) +EXTERN(__irq_tim7) +EXTERN(__irq_dma2_channel1) +EXTERN(__irq_dma2_channel2) +EXTERN(__irq_dma2_channel3) +EXTERN(__irq_dma2_channel4_5) diff --git a/STM32F4/variants/generic_f407v/ld/ram.ld b/STM32F4/variants/generic_f407v/ld/ram.ld new file mode 100644 index 000000000..b57060c92 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/ram.ld @@ -0,0 +1,19 @@ +/* + * aeroquad32 (STM32F103VET6, high density) linker script for + * RAM builds. + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K + rom (rx) : ORIGIN = 0x08010000, LENGTH = 0K /* ala42 */ +} + +GROUP(libcs3_stm32_high_density.a) + +REGION_ALIAS("REGION_TEXT", ram); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", ram); + +INCLUDE common.inc diff --git a/STM32F4/variants/generic_f407v/ld/vector_symbols.inc b/STM32F4/variants/generic_f407v/ld/vector_symbols.inc new file mode 100644 index 000000000..f8519bba4 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/vector_symbols.inc @@ -0,0 +1,78 @@ +EXTERN(__msp_init) +EXTERN(__exc_reset) +EXTERN(__exc_nmi) +EXTERN(__exc_hardfault) +EXTERN(__exc_memmanage) +EXTERN(__exc_busfault) +EXTERN(__exc_usagefault) +EXTERN(__stm32reservedexception7) +EXTERN(__stm32reservedexception8) +EXTERN(__stm32reservedexception9) +EXTERN(__stm32reservedexception10) +EXTERN(__exc_svc) +EXTERN(__exc_debug_monitor) +EXTERN(__stm32reservedexception13) +EXTERN(__exc_pendsv) +EXTERN(__exc_systick) + +EXTERN(__irq_wwdg) +EXTERN(__irq_pvd) +EXTERN(__irq_tamper) +EXTERN(__irq_rtc) +EXTERN(__irq_flash) +EXTERN(__irq_rcc) +EXTERN(__irq_exti0) +EXTERN(__irq_exti1) +EXTERN(__irq_exti2) +EXTERN(__irq_exti3) +EXTERN(__irq_exti4) +EXTERN(__irq_dma1_channel1) +EXTERN(__irq_dma1_channel2) +EXTERN(__irq_dma1_channel3) +EXTERN(__irq_dma1_channel4) +EXTERN(__irq_dma1_channel5) +EXTERN(__irq_dma1_channel6) +EXTERN(__irq_dma1_channel7) +EXTERN(__irq_adc) +EXTERN(__irq_usb_hp_can_tx) +EXTERN(__irq_usb_lp_can_rx0) +EXTERN(__irq_can_rx1) +EXTERN(__irq_can_sce) +EXTERN(__irq_exti9_5) +EXTERN(__irq_tim1_brk) +EXTERN(__irq_tim1_up) +EXTERN(__irq_tim1_trg_com) +EXTERN(__irq_tim1_cc) +EXTERN(__irq_tim2) +EXTERN(__irq_tim3) +EXTERN(__irq_tim4) +EXTERN(__irq_i2c1_ev) +EXTERN(__irq_i2c1_er) +EXTERN(__irq_i2c2_ev) +EXTERN(__irq_i2c2_er) +EXTERN(__irq_spi1) +EXTERN(__irq_spi2) +EXTERN(__irq_usart1) +EXTERN(__irq_usart2) +EXTERN(__irq_usart3) +EXTERN(__irq_exti15_10) +EXTERN(__irq_rtcalarm) +EXTERN(__irq_usbwakeup) + +EXTERN(__irq_tim8_brk) +EXTERN(__irq_tim8_up) +EXTERN(__irq_tim8_trg_com) +EXTERN(__irq_tim8_cc) +EXTERN(__irq_adc3) +EXTERN(__irq_fsmc) +EXTERN(__irq_sdio) +EXTERN(__irq_tim5) +EXTERN(__irq_spi3) +EXTERN(__irq_uart4) +EXTERN(__irq_uart5) +EXTERN(__irq_tim6) +EXTERN(__irq_tim7) +EXTERN(__irq_dma2_channel1) +EXTERN(__irq_dma2_channel2) +EXTERN(__irq_dma2_channel3) +EXTERN(__irq_dma2_channel4_5) diff --git a/STM32F4/variants/generic_f407v/pin_map.c b/STM32F4/variants/generic_f407v/pin_map.c new file mode 100644 index 000000000..2189902d6 --- /dev/null +++ b/STM32F4/variants/generic_f407v/pin_map.c @@ -0,0 +1,210 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file generic_f407v.cpp + * @author ala42 + * @brief generic_f407v board file. + */ + +#ifdef BOARD_generic_f407v + +#ifdef __cplusplus +extern "C"{ +#endif + +//#include "generic_f407v.h" + +//#include "fsmc.h" +#include +#include +#include + +#include + +extern timer_dev timer1; +extern timer_dev timer2; +extern timer_dev timer3; +extern timer_dev timer4; +extern timer_dev timer5; +extern timer_dev timer6; +extern timer_dev timer7; +extern timer_dev timer8; + +/* +typedef struct stm32_pin_info { + gpio_dev *gpio_device; // Maple pin's GPIO device + timer_dev *timer_device; // Pin's timer device, if any. + uint8 timer_channel; // Timer channel, or 0 if none. + uint8 adc_channel; // Pin ADC channel, or ADCx if none. + const adc_dev *adc_device; // ADC device, if any. +} stm32_pin_info; +*/ +const stm32_pin_info PIN_MAP[] = { // LQFP100 package pin + {&GPIOA, &timer5, 1, 0, &ADC1}, // D00/PA0 | 23 | USART2_CTS | UART4_TX | ETH_MII_CRS | TIM2_CH1_ETR | TIM5_CH1 | TIM8_ETR | ADC123_IN0/WKUP + {&GPIOA, &timer5, 2, 1, &ADC1}, // D01/PA1 | 24 | USART2_RTS | UART4_RX | ETH_RMII_REF_CLK | ETH_MII_RX_CLK | TIM5_CH2 | TIM2_CH2 | ADC123_IN1 + {&GPIOA, &timer5, 3, 2, &ADC1}, // D02/PA2 | 25 | USART2_TX | TIM5_CH3 | TIM9_CH1 | TIM2_CH3 | ETH_MDIO | ADC123_IN2 + {&GPIOA, &timer5, 4, 3, &ADC1}, // D03/PA3 | 26 | USART2_RX | TIM5_CH4 | TIM9_CH2 | TIM2_CH4 | OTG_HS_ULPI_D0 | ETH_MII_COL | ADC123_IN3 + {&GPIOA, NULL, 0, 4, &ADC1}, // D04/PA4 | 29 | SPI1_NSS | SPI3_NSS | USART2_CK | DCMI_HSYNC | OTG_HS_SOF | I2S3_WS | ADC12_IN4 / DAC_OUT1 + {&GPIOA, NULL, 0, 5, &ADC1}, // D05/PA5 | 30 | SPI1_SCK | OTG_HS_ULPI_CK | TIM2_CH1_ETR | TIM8_CH1N | ADC12_IN5 / DAC_OUT2 + {&GPIOA, NULL, 1, 6, &ADC1}, // D06/PA6 | 31 | SPI1_MISO | TIM8_BKIN | TIM13_CH1 | DCMI_PIXCLK | TIM3_CH1 | TIM1_BKIN | ADC12_IN6 + {&GPIOA, NULL, 0, 7, &ADC1}, // D07/PA7 | 32 | SPI1_MOSI | TIM8_CH1N | TIM14_CH1 | TIM3_CH2 | ETH_MII_RX_DV | TIM1_CH1N / ETH_RMII_CRS_DV | ADC12_IN7 + {&GPIOA, NULL, 0, ADCx, NULL}, // D08/PA8 | 67 | MCO1 | USART1_CK | TIM1_CH1 | I2C3_SCL | OTG_FS_SOF + {&GPIOA, NULL, 0, ADCx, NULL}, // D09/PA9 | 68 | USART1_TX | TIM1_CH2 | I2C3_SMBA | DCMI_D0 + {&GPIOA, NULL, 0, ADCx, NULL}, // D10/PA10 | 69 | USART1_RX | TIM1_CH3 | OTG_FS_ID | DCMI_D1 + {&GPIOA, NULL, 0, ADCx, NULL}, // D11/PA11 | 70 | USART1_CTS | CAN1_RX | TIM1_CH4 | OTG_FS_DM + {&GPIOA, NULL, 0, ADCx, NULL}, // D12/PA12 | 71 | USART1_RTS | CAN1_TX | TIM1_ETR | OTG_FS_DP + {&GPIOA, NULL, 0, ADCx, NULL}, // D13/PA13 | 72 | JTMS-SWDIO + {&GPIOA, NULL, 0, ADCx, NULL}, // D14/PA14 | 76 | JTCK-SWCLK + {&GPIOA, &timer2, 1, ADCx, NULL}, // D15/PA15 | 77 | JTDI | SPI3_NSS | I2S3_WS | TIM2_CH1_ETR | SPI1_NSS + + {&GPIOB, &timer3, 3, 8, &ADC1}, // D16/PB0 | 35 | TIM3_CH3 | TIM8_CH2N | OTG_HS_ULPI_D1 | ETH_MII_RXD2 | TIM1_CH2N | ADC12_IN8 + {&GPIOB, &timer3, 4, 9, &ADC1}, // D17/PB1 | 36 | TIM3_CH4 | TIM8_CH3N | OTG_HS_ULPI_D2 | ETH_MII_RXD3 | TIM1_CH3N | ADC12_IN9 + {&GPIOB, NULL, 0, ADCx, NULL}, // D18/PB2 | 37 | BOOT1 + {&GPIOB, &timer2, 2, ADCx, NULL}, // D19/PB3 | 89 | JTDO | TRACESWO | SPI3_SCK | I2S3_CK | TIM2_CH2 | SPI1_SCK + {&GPIOB, &timer3, 1, ADCx, NULL}, // D20/PB4 | 90 | NJTRST | SPI3_MISO | TIM3_CH1 | SPI1_MISO | I2S3ext_SD + {&GPIOB, &timer3, 2, ADCx, NULL}, // D21/PB5 | 91 | I2C1_SMBA | CAN2_RX | OTG_HS_ULPI_D7 | ETH_PPS_OUT | TIM3_CH2 | SPI1_MOSI | SPI3_MOSI | DCMI_D10 | I2S3_SD + {&GPIOB, NULL, 0, ADCx, NULL}, // D22/PB6 | 92 | I2C1_SCL | TIM4_CH1 | CAN2_TX | DCMI_D5 | USART1_TX + {&GPIOB, NULL, 0, ADCx, NULL}, // D23/PB7 | 93 | I2C1_SDA | FSMC_NL | DCMI_VSYNC | USART1_RX | TIM4_CH2 + {&GPIOB, NULL, 0, ADCx, NULL}, // D24/PB8 | 95 | TIM4_CH3 | SDIO_D4 | TIM10_CH1 | DCMI_D6 | ETH_MII_TXD3 | I2C1_SCL | CAN1_RX + {&GPIOB, NULL, 0, ADCx, NULL}, // D25/PB9 | 96 | SPI2_NSS | I2S2_WS | TIM4_CH4 | TIM11_CH1 | SDIO_D5 | DCMI_D7 | I2C1_SDA | CAN1_TX + {&GPIOB, NULL, 0, ADCx, NULL}, // D26/PB10 | 47 | SPI2_SCK | I2S2_CK | I2C2_SCL | USART3_TX | OTG_HS_ULPI_D3 | ETH_MII_RX_ER | TIM2_CH3 + {&GPIOB, NULL, 0, ADCx, NULL}, // D27/PB11 | 48 | I2C2_SDA | USART3_RX | OTG_HS_ULPI_D4 | ETH_RMII_TX_EN | ETH_MII_TX_EN | TIM2_CH4 + {&GPIOB, NULL, 0, ADCx, NULL}, // D28/PB12 | 51 | SPI2_NSS | I2S2_WS | I2C2_SMBA | USART3_CK | TIM1_BKIN | CAN2_RX | OTG_HS_ULPI_D5 | ETH_RMII_TXD0 | ETH_MII_TXD0 | OTG_HS_ID + {&GPIOB, NULL, 0, ADCx, NULL}, // D29/PB13 | 52 | SPI2_SCK | I2S2_CK | USART3_CTS | TIM1_CH1N | CAN2_TX | OTG_HS_ULPI_D6 | ETH_RMII_TXD1 | ETH_MII_TXD1 + {&GPIOB, NULL, 0, ADCx, NULL}, // D30/PB14 | 53 | SPI2_MISO | TIM1_CH2N | TIM12_CH1 | OTG_HS_DM | USART3_RTS | TIM8_CH2N | I2S2ext_SD + {&GPIOB, NULL, 0, ADCx, NULL}, // D31/PB15 | 54 | SPI2_MOSI | I2S2_SD | TIM1_CH3N | TIM8_CH3N | TIM12_CH2 | OTG_HS_DP + + {&GPIOC, NULL, 0, 10, &ADC1}, // D32/PC0 | 15 | OTG_HS_ULPI_STP | ADC123_IN10 + {&GPIOC, NULL, 0, 11, &ADC1}, // D33/PC1 | 16 | ETH_MDC | ADC123_IN11 + {&GPIOC, NULL, 0, 12, &ADC1}, // D34/PC2 | 17 | SPI2_MISO | OTG_HS_ULPI_DIR | ETH_MII_TXD2 | I2S2ext_SD | ADC123_IN12 + {&GPIOC, NULL, 0, 13, &ADC1}, // D35/PC3 | 18 | SPI2_MOSI | I2S2_SD | OTG_HS_ULPI_NXT | ETH_MII_TX_CLK | ADC123_IN13 + {&GPIOC, NULL, 0, 14, &ADC1}, // D36/PC4 | 33 | ETH_RMII_RX_D0 | ETH_MII_RX_D0 | ADC12_IN14 + {&GPIOC, NULL, 0, 15, &ADC1}, // D37/PC5 | 34 | ETH_RMII_RX_D1 | ETH_MII_RX_D1 | ADC12_IN15 + {&GPIOC, &timer8, 1, ADCx, NULL}, // D38/PC6 | 63 | I2S2_MCK | TIM8_CH1/SDIO_D6 | USART6_TX | DCMI_D0/TIM3_CH1 + {&GPIOC, &timer8, 2, ADCx, NULL}, // D39/PC7 | 64 | I2S3_MCK | TIM8_CH2/SDIO_D7 | USART6_RX | DCMI_D1/TIM3_CH2 + {&GPIOC, &timer8, 3, ADCx, NULL}, // D40/PC8 | 65 | TIM8_CH3 | SDIO_D0 | TIM3_CH3 | USART6_CK | DCMI_D2 + {&GPIOC, &timer8, 4, ADCx, NULL}, // D41/PC9 | 66 | I2S_CKIN | MCO2 | TIM8_CH4 | SDIO_D1 | I2C3_SDA | DCMI_D3 | TIM3_CH4 + {&GPIOC, NULL, 0, ADCx, NULL}, // D42/PC10 | 78 | SPI3_SCK | I2S3_CK | UART4_TX | SDIO_D2 | DCMI_D8 | USART3_TX + {&GPIOC, NULL, 0, ADCx, NULL}, // D43/PC11 | 79 | UART4_RX | SPI3_MISO | SDIO_D3 | DCMI_D4 | USART3_RX | I2S3ext_SD + {&GPIOC, NULL, 0, ADCx, NULL}, // D44/PC12 | 80 | UART5_TX | SDIO_CK | DCMI_D9 | SPI3_MOSI | I2S3_SD | USART3_CK + {&GPIOC, NULL, 0, ADCx, NULL}, // D45/PC13 | 7 | RTC_OUT, RTC_TAMP1, RTC_TS + {&GPIOC, NULL, 0, ADCx, NULL}, // D46/PC14 | 8 | OSC32_IN + {&GPIOC, NULL, 0, ADCx, NULL}, // D47/PC15 | 9 | OSC32_OUT + + {&GPIOD, NULL, 0, ADCx, NULL}, // D48/PD0 | 81 | FSMC_D2 | CAN1_RX + {&GPIOD, NULL, 0, ADCx, NULL}, // D49/PD1 | 82 | FSMC_D3 | CAN1_TX + {&GPIOD, NULL, 0, ADCx, NULL}, // D50/PD2 | 83 | TIM3_ETR | UART5_RX | SDIO_CMD | DCMI_D11 + {&GPIOD, NULL, 0, ADCx, NULL}, // D51/PD3 | 84 | FSMC_CLK | USART2_CTS + {&GPIOD, NULL, 0, ADCx, NULL}, // D52/PD4 | 85 | FSMC_NOE | USART2_RTS + {&GPIOD, NULL, 0, ADCx, NULL}, // D53/PD5 | 86 | FSMC_NWE | USART2_TX + {&GPIOD, NULL, 0, ADCx, NULL}, // D54/PD6 | 87 | FSMC_NWAIT | USART2_RX + {&GPIOD, NULL, 0, ADCx, NULL}, // D55/PD7 | 88 | USART2_CK | FSMC_NE1 | FSMC_NCE2 + {&GPIOD, NULL, 0, ADCx, NULL}, // D56/PD8 | 55 | FSMC_D13 | USART3_TX + {&GPIOD, NULL, 0, ADCx, NULL}, // D57/PD9 | 56 | FSMC_D14 | USART3_RX + {&GPIOD, NULL, 0, ADCx, NULL}, // D58/PD10 | 57 | FSMC_D15 | USART3_CK + {&GPIOD, NULL, 0, ADCx, NULL}, // D59/PD11 | 58 | FSMC_CLE | FSMC_A16 | USART3_CTS + {&GPIOD, &timer4, 1, ADCx, NULL}, // D60/PD12 | 59 | FSMC_ALE | FSMC_A17 | TIM4_CH1 | USART3_RTS // remap in + {&GPIOD, &timer4, 2, ADCx, NULL}, // D61/PD13 | 60 | FSMC_A18 | TIM4_CH2 // remap in + {&GPIOD, &timer4, 3, ADCx, NULL}, // D62/PD14 | 61 | FSMC_D0 | TIM4_CH3 // remap in + {&GPIOD, &timer4, 4, ADCx, NULL}, // D63/PD15 | 62 | FSMC_D1 | TIM4_CH4 // remap in + + {&GPIOE, NULL, 0, ADCx, NULL}, // D64/PE0 | 97 | TIM4_ETR | FSMC_NBL0 | DCMI_D2 + {&GPIOE, NULL, 0, ADCx, NULL}, // D65/PE1 | 98 | FSMC_NBL1 | DCMI_D3 + {&GPIOE, NULL, 0, ADCx, NULL}, // D66/PE2 | 1 | TRACECLK | FSMC_A23 | ETH_MII_TXD3 + {&GPIOE, NULL, 0, ADCx, NULL}, // D67/PE3 | 2 | TRACED0 | FSMC_A19 + {&GPIOE, NULL, 0, ADCx, NULL}, // D68/PE4 | 3 | TRACED1 | FSMC_A20 | DCMI_D4 + {&GPIOE, NULL, 0, ADCx, NULL}, // D69/PE5 | 4 | TRACED2 | FSMC_A21 | TIM9_CH1 / DCMI_D6 + {&GPIOE, NULL, 0, ADCx, NULL}, // D70/PE6 | 5 | TRACED3 | FSMC_A22 | TIM9_CH2 / DCMI_D7 + {&GPIOE, NULL, 0, ADCx, NULL}, // D71/PE7 | 38 | FSMC_D4 | TIM1_ETR + {&GPIOE, NULL, 0, ADCx, NULL}, // D72/PE8 | 39 | FSMC_D5 | TIM1_CH1N + {&GPIOE, &timer1, 1, ADCx, NULL}, // D73/PE9 | 40 | FSMC_D6 | TIM1_CH1 // remap in + {&GPIOE, NULL, 0, ADCx, NULL}, // D74/PE10 | 41 | FSMC_D7 | TIM1_CH2N + {&GPIOE, &timer1, 2, ADCx, NULL}, // D75/PE11 | 42 | FSMC_D8 | TIM1_CH2 // remap in + {&GPIOE, NULL, 0, ADCx, NULL}, // D76/PE12 | 43 | FSMC_D9 | TIM1_CH3N + {&GPIOE, &timer1, 3, ADCx, NULL}, // D77/PE13 | 44 | FSMC_D10 | TIM1_CH3 // remap in + {&GPIOE, &timer1, 4, ADCx, NULL}, // D78/PE14 | 45 | FSMC_D11 | TIM1_CH4 // remap in + {&GPIOE, NULL, 0, ADCx, NULL}, // D79/PE15 | 46 | FSMC_D12 | TIM1_BKIN +#if 0 + {GPIOF, 0, NULL, 0, NULL, ADCx}, // D80/PF0 + {GPIOF, 1, NULL, 0, NULL, ADCx}, // D81/PF1 + {GPIOF, 2, NULL, 0, NULL, ADCx}, // D82/PF2 + {GPIOF, 3, NULL, 0, NULL, ADCx}, // D83/PF3 + {GPIOF, 4, NULL, 0, NULL, ADCx}, // D84/PF4 + {GPIOF, 5, NULL, 0, NULL, ADCx}, // D85/PF5 + {GPIOF, 6, NULL, 0, NULL, ADCx}, // D86/PF6 + {GPIOF, 7, NULL, 0, NULL, ADCx}, // D87/PF7 + {GPIOF, 8, NULL, 0, NULL, ADCx}, // D88/PF8 + {GPIOF, 9, NULL, 0, NULL, ADCx}, // D89/PF9 + {GPIOF, 10, NULL, 0, NULL, ADCx}, // D90/PF10 + {GPIOF, 11, NULL, 0, NULL, ADCx}, // D91/PF11 + {GPIOF, 12, NULL, 0, NULL, ADCx}, // D92/PF12 + {GPIOF, 13, NULL, 0, NULL, ADCx}, // D93/PF13 + {GPIOF, 14, NULL, 0, NULL, ADCx}, // D94/PF14 + {GPIOF, 15, NULL, 0, NULL, ADCx}, // D95/PF15 + + {GPIOG, 0, NULL, 0, NULL, ADCx}, // D96/PG0 + {GPIOG, 1, NULL, 0, NULL, ADCx}, // D97/PG1 + {GPIOG, 2, NULL, 0, NULL, ADCx}, // D98/PG2 + {GPIOG, 3, NULL, 0, NULL, ADCx}, // D99/PG3 + {GPIOG, 4, NULL, 0, NULL, ADCx}, // D100/PG4 + {GPIOG, 5, NULL, 0, NULL, ADCx}, // D101/PG5 + {GPIOG, 6, NULL, 0, NULL, ADCx}, // D102/PG6 + {GPIOG, 7, NULL, 0, NULL, ADCx}, // D103/PG7 + {GPIOG, 8, NULL, 0, NULL, ADCx}, // D104/PG8 + {GPIOG, 9, NULL, 0, NULL, ADCx}, // D105/PG9 + {GPIOG, 10, NULL, 0, NULL, ADCx}, // D106/PG10 + {GPIOG, 11, NULL, 0, NULL, ADCx}, // D107/PG11 + {GPIOG, 12, NULL, 0, NULL, ADCx}, // D108/PG12 + {GPIOG, 13, NULL, 0, NULL, ADCx}, // D109/PG13 + {GPIOG, 14, NULL, 0, NULL, ADCx}, // D110/PG14 + {GPIOG, 15, NULL, 0, NULL, ADCx} // D111/PG15 +#endif +}; +/* to be defined +extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { + 0, 1, 2, 3, 15, 16, 17, 19, 20, 21, 38, 39, 49, 41, 60, 61, 62, 63, 73, 75, 77, 78 +}; +*/ +const uint8 boardADCPins[BOARD_NR_ADC_PINS] = { + PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PB0, PB1, PC0, PC1, PC2, PC3, PC4, PC5 +}; + +const uint8 boardUsedPins[BOARD_NR_USED_PINS] = { + BOARD_LED_PIN, BOARD_LED2_PIN, BOARD_BUTTON1_PIN, BOARD_BUTTON2_PIN, BOARD_BUTTON2_PIN, + BOARD_JTMS_SWDIO_PIN, BOARD_JTCK_SWCLK_PIN, + FLASH_CS_PIN, FLASH_CLK_PIN, FLASH_DO_PIN, FLASH_DI_PIN, + NRF24_CE_PIN, NRF24_CS_PIN, NRF24_IRQ_PIN, + BOARD_SDIO_D0, BOARD_SDIO_D1, BOARD_SDIO_D2, BOARD_SDIO_D3, BOARD_SDIO_CK, BOARD_SDIO_CMD, + USB_DM_PIN, USB_DP_PIN +}; + +#ifdef __cplusplus +} +#endif + + +#endif // BOARD_generic_f407v diff --git a/STM32F4/variants/generic_f407v/pins_arduino.h b/STM32F4/variants/generic_f407v/pins_arduino.h new file mode 100644 index 000000000..3052f2eb2 --- /dev/null +++ b/STM32F4/variants/generic_f407v/pins_arduino.h @@ -0,0 +1,6 @@ + + + + +// API compatibility +#include "variant.h" \ No newline at end of file diff --git a/STM32F4/variants/generic_f407v/stm32_isrs.S b/STM32F4/variants/generic_f407v/stm32_isrs.S new file mode 100644 index 000000000..34e515c08 --- /dev/null +++ b/STM32F4/variants/generic_f407v/stm32_isrs.S @@ -0,0 +1,323 @@ +/* STM32 ISR weak declarations */ + + .thumb + +/* Default handler for all non-overridden interrupts and exceptions */ + .globl __default_handler + .type __default_handler, %function + +__default_handler: + b . + + .weak __exc_nmi + .globl __exc_nmi + .set __exc_nmi, __default_handler + .weak __exc_hardfault + .globl __exc_hardfault + .set __exc_hardfault, __default_handler + .weak __exc_memmanage + .globl __exc_memmanage + .set __exc_memmanage, __default_handler + .weak __exc_busfault + .globl __exc_busfault + .set __exc_busfault, __default_handler + .weak __exc_usagefault + .globl __exc_usagefault + .set __exc_usagefault, __default_handler + .weak __stm32reservedexception7 + .globl __stm32reservedexception7 + .set __stm32reservedexception7, __default_handler + .weak __stm32reservedexception8 + .globl __stm32reservedexception8 + .set __stm32reservedexception8, __default_handler + .weak __stm32reservedexception9 + .globl __stm32reservedexception9 + .set __stm32reservedexception9, __default_handler + .weak __stm32reservedexception10 + .globl __stm32reservedexception10 + .set __stm32reservedexception10, __default_handler + .weak __exc_svc + .globl __exc_svc + .set __exc_svc, __default_handler + .weak __exc_debug_monitor + .globl __exc_debug_monitor + .set __exc_debug_monitor, __default_handler + .weak __stm32reservedexception13 + .globl __stm32reservedexception13 + .set __stm32reservedexception13, __default_handler + .weak __exc_pendsv + .globl __exc_pendsv + .set __exc_pendsv, __default_handler + .weak __exc_systick + .globl __exc_systick + .set __exc_systick, __default_handler + .weak __irq_wwdg + .globl __irq_wwdg + .set __irq_wwdg, __default_handler + .weak __irq_pvd + .globl __irq_pvd + .set __irq_pvd, __default_handler + .weak __irq_tamper + .globl __irq_tamper + .set __irq_tamper, __default_handler + .weak __irq_rtc + .globl __irq_rtc + .set __irq_rtc, __default_handler + .weak __irq_flash + .globl __irq_flash + .set __irq_flash, __default_handler + .weak __irq_rcc + .globl __irq_rcc + .set __irq_rcc, __default_handler + .weak __irq_exti0 + .globl __irq_exti0 + .set __irq_exti0, __default_handler + .weak __irq_exti1 + .globl __irq_exti1 + .set __irq_exti1, __default_handler + .weak __irq_exti2 + .globl __irq_exti2 + .set __irq_exti2, __default_handler + .weak __irq_exti3 + .globl __irq_exti3 + .set __irq_exti3, __default_handler + .weak __irq_exti4 + .globl __irq_exti4 + .set __irq_exti4, __default_handler + .weak __irq_dma1_channel1 + .globl __irq_dma1_channel1 + .set __irq_dma1_channel1, __default_handler + .weak __irq_dma1_channel2 + .globl __irq_dma1_channel2 + .set __irq_dma1_channel2, __default_handler + .weak __irq_dma1_channel3 + .globl __irq_dma1_channel3 + .set __irq_dma1_channel3, __default_handler + .weak __irq_dma1_channel4 + .globl __irq_dma1_channel4 + .set __irq_dma1_channel4, __default_handler + .weak __irq_dma1_channel5 + .globl __irq_dma1_channel5 + .set __irq_dma1_channel5, __default_handler + .weak __irq_dma1_channel6 + .globl __irq_dma1_channel6 + .set __irq_dma1_channel6, __default_handler + .weak __irq_dma1_channel7 + .globl __irq_dma1_channel7 + .set __irq_dma1_channel7, __default_handler + .weak __irq_adc + .globl __irq_adc + .set __irq_adc, __default_handler + .weak __irq_usb_hp_can_tx + .globl __irq_usb_hp_can_tx + .set __irq_usb_hp_can_tx, __default_handler + .weak __irq_usb_lp_can_rx0 + .globl __irq_usb_lp_can_rx0 + .set __irq_usb_lp_can_rx0, __default_handler + .weak __irq_can_rx1 + .globl __irq_can_rx1 + .set __irq_can_rx1, __default_handler + .weak __irq_can_sce + .globl __irq_can_sce + .set __irq_can_sce, __default_handler + .weak __irq_exti9_5 + .globl __irq_exti9_5 + .set __irq_exti9_5, __default_handler + .weak __irq_tim1_brk + .globl __irq_tim1_brk + .set __irq_tim1_brk, __default_handler + .weak __irq_tim1_up + .globl __irq_tim1_up + .set __irq_tim1_up, __default_handler + .weak __irq_tim1_trg_com + .globl __irq_tim1_trg_com + .set __irq_tim1_trg_com, __default_handler + .weak __irq_tim1_cc + .globl __irq_tim1_cc + .set __irq_tim1_cc, __default_handler + .weak __irq_tim2 + .globl __irq_tim2 + .set __irq_tim2, __default_handler + .weak __irq_tim3 + .globl __irq_tim3 + .set __irq_tim3, __default_handler + .weak __irq_tim4 + .globl __irq_tim4 + .set __irq_tim4, __default_handler + .weak __irq_i2c1_ev + .globl __irq_i2c1_ev + .set __irq_i2c1_ev, __default_handler + .weak __irq_i2c1_er + .globl __irq_i2c1_er + .set __irq_i2c1_er, __default_handler + .weak __irq_i2c2_ev + .globl __irq_i2c2_ev + .set __irq_i2c2_ev, __default_handler + .weak __irq_i2c2_er + .globl __irq_i2c2_er + .set __irq_i2c2_er, __default_handler + .weak __irq_spi1 + .globl __irq_spi1 + .set __irq_spi1, __default_handler + .weak __irq_spi2 + .globl __irq_spi2 + .set __irq_spi2, __default_handler + .weak __irq_usart1 + .globl __irq_usart1 + .set __irq_usart1, __default_handler + .weak __irq_usart2 + .globl __irq_usart2 + .set __irq_usart2, __default_handler + .weak __irq_usart3 + .globl __irq_usart3 + .set __irq_usart3, __default_handler + .weak __irq_exti15_10 + .globl __irq_exti15_10 + .set __irq_exti15_10, __default_handler + .weak __irq_rtcalarm + .globl __irq_rtcalarm + .set __irq_rtcalarm, __default_handler + .weak __irq_usbwakeup + .globl __irq_usbwakeup + .set __irq_usbwakeup, __default_handler +#if defined (STM32_HIGH_DENSITY) + .weak __irq_tim8_brk + .globl __irq_tim8_brk + .set __irq_tim8_brk, __default_handler + .weak __irq_tim8_up + .globl __irq_tim8_up + .set __irq_tim8_up, __default_handler + .weak __irq_tim8_trg_com + .globl __irq_tim8_trg_com + .set __irq_tim8_trg_com, __default_handler + .weak __irq_tim8_cc + .globl __irq_tim8_cc + .set __irq_tim8_cc, __default_handler + .weak __irq_adc3 + .globl __irq_adc3 + .set __irq_adc3, __default_handler + .weak __irq_fsmc + .globl __irq_fsmc + .set __irq_fsmc, __default_handler + .weak __irq_sdio + .globl __irq_sdio + .set __irq_sdio, __default_handler + .weak __irq_tim5 + .globl __irq_tim5 + .set __irq_tim5, __default_handler + .weak __irq_spi3 + .globl __irq_spi3 + .set __irq_spi3, __default_handler + .weak __irq_uart4 + .globl __irq_uart4 + .set __irq_uart4, __default_handler + .weak __irq_uart5 + .globl __irq_uart5 + .set __irq_uart5, __default_handler + .weak __irq_tim6 + .globl __irq_tim6 + .set __irq_tim6, __default_handler + .weak __irq_tim7 + .globl __irq_tim7 + .set __irq_tim7, __default_handler + .weak __irq_dma2_channel1 + .globl __irq_dma2_channel1 + .set __irq_dma2_channel1, __default_handler + .weak __irq_dma2_channel2 + .globl __irq_dma2_channel2 + .set __irq_dma2_channel2, __default_handler + .weak __irq_dma2_channel3 + .globl __irq_dma2_channel3 + .set __irq_dma2_channel3, __default_handler + .weak __irq_dma2_channel4_5 + .globl __irq_dma2_channel4_5 + .set __irq_dma2_channel4_5, __default_handler +#endif /* STM32_HIGH_DENSITY */ + + .weak __irq_DMA2_Stream4_IRQHandler + .globl __irq_DMA2_Stream4_IRQHandler + .set __irq_DMA2_Stream4_IRQHandler, __default_handler + + .weak __irq_ETH_IRQHandler + .globl __irq_ETH_IRQHandler + .set __irq_ETH_IRQHandler, __default_handler + + .weak __irq_ETH_WKUP_IRQHandler + .globl __irq_ETH_WKUP_IRQHandler + .set __irq_ETH_WKUP_IRQHandler, __default_handler + + .weak __irq_CAN2_TX_IRQHandler + .globl __irq_CAN2_TX_IRQHandler + .set __irq_CAN2_TX_IRQHandler, __default_handler + + .weak __irq_CAN2_RX0_IRQHandler + .globl __irq_CAN2_RX0_IRQHandler + .set __irq_CAN2_RX0_IRQHandler, __default_handler + + .weak __irq_CAN2_RX1_IRQHandler + .globl __irq_CAN2_RX1_IRQHandler + .set __irq_CAN2_RX1_IRQHandler, __default_handler + + .weak __irq_CAN2_SCE_IRQHandler + .globl __irq_CAN2_SCE_IRQHandler + .set __irq_CAN2_SCE_IRQHandler, __default_handler + + .weak __irq_OTG_FS_IRQHandler + .globl __irq_OTG_FS_IRQHandler + .set __irq_OTG_FS_IRQHandler, __default_handler + + .weak __irq_DMA2_Stream5_IRQHandler + .globl __irq_DMA2_Stream5_IRQHandler + .set __irq_DMA2_Stream5_IRQHandler, __default_handler + + .weak __irq_DMA2_Stream6_IRQHandler + .globl __irq_DMA2_Stream6_IRQHandler + .set __irq_DMA2_Stream6_IRQHandler, __default_handler + + .weak __irq_DMA2_Stream7_IRQHandler + .globl __irq_DMA2_Stream7_IRQHandler + .set __irq_DMA2_Stream7_IRQHandler, __default_handler + + .weak __irq_USART6_IRQHandler + .globl __irq_USART6_IRQHandler + .set __irq_USART6_IRQHandler, __default_handler + + .weak __irq_I2C3_EV_IRQHandler + .globl __irq_I2C3_EV_IRQHandler + .set __irq_I2C3_EV_IRQHandler, __default_handler + + .weak __irq_I2C3_ER_IRQHandler + .globl __irq_I2C3_ER_IRQHandler + .set __irq_I2C3_ER_IRQHandler, __default_handler + + .weak __irq_OTG_HS_EP1_OUT_IRQHandler + .globl __irq_OTG_HS_EP1_OUT_IRQHandler + .set __irq_OTG_HS_EP1_OUT_IRQHandler, __default_handler + + .weak __irq_OTG_HS_EP1_IN_IRQHandler + .globl __irq_OTG_HS_EP1_IN_IRQHandler + .set __irq_OTG_HS_EP1_IN_IRQHandler, __default_handler + + .weak __irq_OTG_HS_WKUP_IRQHandler + .globl __irq_OTG_HS_WKUP_IRQHandler + .set __irq_OTG_HS_WKUP_IRQHandler, __default_handler + + .weak __irq_OTG_HS_IRQHandler + .globl __irq_OTG_HS_IRQHandler + .set __irq_OTG_HS_IRQHandler, __default_handler + + .weak __irq_DCMI_IRQHandler + .globl __irq_DCMI_IRQHandler + .set __irq_DCMI_IRQHandler, __default_handler + + .weak __irq_CRYP_IRQHandler + .globl __irq_CRYP_IRQHandler + .set __irq_CRYP_IRQHandler, __default_handler + + .weak __irq_HASH_RNG_IRQHandler + .globl __irq_HASH_RNG_IRQHandler + .set __irq_HASH_RNG_IRQHandler, __default_handler + + .weak __irq_FPU_IRQHandler + .globl __irq_FPU_IRQHandler + .set __irq_FPU_IRQHandler, __default_handler diff --git a/STM32F4/variants/generic_f407v/stm32_vector_table.S b/STM32F4/variants/generic_f407v/stm32_vector_table.S new file mode 100644 index 000000000..9f08d6669 --- /dev/null +++ b/STM32F4/variants/generic_f407v/stm32_vector_table.S @@ -0,0 +1,113 @@ +/* STM32 vector table */ + + .section ".stm32.interrupt_vector" + + .globl __stm32_vector_table + .type __stm32_vector_table, %object + +__stm32_vector_table: +/* CM3 core interrupts */ + .long __msp_init + .long __exc_reset + .long __exc_nmi + .long __exc_hardfault + .long __exc_memmanage + .long __exc_busfault + .long __exc_usagefault + .long __stm32reservedexception7 + .long __stm32reservedexception8 + .long __stm32reservedexception9 + .long __stm32reservedexception10 + .long __exc_svc + .long __exc_debug_monitor + .long __stm32reservedexception13 + .long __exc_pendsv + .long __exc_systick +/* Peripheral interrupts */ + .long __irq_wwdg + .long __irq_pvd + .long __irq_tamper + .long __irq_rtc + .long __irq_flash + .long __irq_rcc + .long __irq_exti0 + .long __irq_exti1 + .long __irq_exti2 + .long __irq_exti3 + .long __irq_exti4 + .long __irq_dma1_channel1 + .long __irq_dma1_channel2 + .long __irq_dma1_channel3 + .long __irq_dma1_channel4 + .long __irq_dma1_channel5 + .long __irq_dma1_channel6 + .long __irq_dma1_channel7 + .long __irq_adc + .long __irq_usb_hp_can_tx + .long __irq_usb_lp_can_rx0 + .long __irq_can_rx1 + .long __irq_can_sce + .long __irq_exti9_5 + .long __irq_tim1_brk + .long __irq_tim1_up + .long __irq_tim1_trg_com + .long __irq_tim1_cc + .long __irq_tim2 + .long __irq_tim3 + .long __irq_tim4 + .long __irq_i2c1_ev + .long __irq_i2c1_er + .long __irq_i2c2_ev + .long __irq_i2c2_er + .long __irq_spi1 + .long __irq_spi2 + .long __irq_usart1 + .long __irq_usart2 + .long __irq_usart3 + .long __irq_exti15_10 + .long __irq_rtcalarm + .long __irq_usbwakeup +#if defined (STM32_HIGH_DENSITY) + .long __irq_tim8_brk + .long __irq_tim8_up + .long __irq_tim8_trg_com + .long __irq_tim8_cc + .long __irq_adc3 + .long __irq_fsmc + .long __irq_sdio + .long __irq_tim5 + .long __irq_spi3 + .long __irq_uart4 + .long __irq_uart5 + .long __irq_tim6 + .long __irq_tim7 + .long __irq_dma2_channel1 + .long __irq_dma2_channel2 + .long __irq_dma2_channel3 + .long __irq_dma2_channel4_5 +#endif /* STM32_HIGH_DENSITY */ + + .long __irq_DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .long __irq_ETH_IRQHandler /* Ethernet */ + .long __irq_ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .long __irq_CAN2_TX_IRQHandler /* CAN2 TX */ + .long __irq_CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .long __irq_CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .long __irq_CAN2_SCE_IRQHandler /* CAN2 SCE */ + .long __irq_OTG_FS_IRQHandler /* USB OTG FS */ + .long __irq_DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .long __irq_DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .long __irq_DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .long __irq_USART6_IRQHandler /* USART6 */ + .long __irq_I2C3_EV_IRQHandler /* I2C3 event */ + .long __irq_I2C3_ER_IRQHandler /* I2C3 error */ + .long __irq_OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .long __irq_OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .long __irq_OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .long __irq_OTG_HS_IRQHandler /* USB OTG HS */ + .long __irq_DCMI_IRQHandler /* DCMI */ + .long __irq_CRYP_IRQHandler /* CRYP crypto */ + .long __irq_HASH_RNG_IRQHandler /* Hash and Rng */ + .long __irq_FPU_IRQHandler /* FPU */ + + .size __stm32_vector_table, . - __stm32_vector_table diff --git a/STM32F4/variants/generic_f407v/variant.h b/STM32F4/variants/generic_f407v/variant.h new file mode 100644 index 000000000..cd0a96de4 --- /dev/null +++ b/STM32F4/variants/generic_f407v/variant.h @@ -0,0 +1,21 @@ +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + + +#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) +#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) +#define portOutputRegister(port) ( &(port->regs->ODR) ) +#define portInputRegister(port) ( &(port->regs->IDR) ) + +#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) ) +#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) ) + +#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) ) + +static const uint8_t SS = BOARD_SPI1_NSS_PIN; +static const uint8_t SS1 = BOARD_SPI2_NSS_PIN; +static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; +static const uint8_t MISO = BOARD_SPI1_MISO_PIN; +static const uint8_t SCK = BOARD_SPI1_SCK_PIN; + +#endif /* _VARIANT_ARDUINO_STM32_ */ \ No newline at end of file diff --git a/STM32F4/cores/maple/libmaple/rcc.c b/STM32F4/variants/generic_f407v/wirish/start.S similarity index 54% rename from STM32F4/cores/maple/libmaple/rcc.c rename to STM32F4/variants/generic_f407v/wirish/start.S index b3cb9c5d1..8b181aa99 100644 --- a/STM32F4/cores/maple/libmaple/rcc.c +++ b/STM32F4/variants/generic_f407v/wirish/start.S @@ -1,7 +1,7 @@ /****************************************************************************** * The MIT License * - * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011 LeafLabs, LLC. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -24,14 +24,34 @@ * SOFTWARE. *****************************************************************************/ -/** - * @file rcc.c - * @brief Implements pretty much only the basic clock setup on the - * stm32, clock enable/disable and peripheral reset commands. +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. */ -// #ifdef STM32F2 -// #include "rccF2.c" -// #else -// #include "rccF1.c" -// #endif + .text + .code 16 + .thumb_func + + .globl __start__ + .type __start__, %function +__start__: + .fnstart + ldr r1,=__msp_init + mov sp,r1 + ldr r1,=start_c + bx r1 + .pool + .cantunwind + .fnend diff --git a/STM32F4/variants/generic_f407v/wirish/start_c.c b/STM32F4/variants/generic_f407v/wirish/start_c.c new file mode 100644 index 000000000..655fefb88 --- /dev/null +++ b/STM32F4/variants/generic_f407v/wirish/start_c.c @@ -0,0 +1,95 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * Copyright (c) 2006, 2007 CodeSourcery Inc + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +extern void __libc_init_array(void); + +extern int main(int, char**, char**); + +extern void exit(int) __attribute__((noreturn, weak)); + +/* The linker must ensure that these are at least 4-byte aligned. */ +extern char __data_start__, __data_end__; +extern char __bss_start__, __bss_end__; + +struct rom_img_cfg { + int *img_start; +}; + +extern char _lm_rom_img_cfgp; + +void __attribute__((noreturn)) start_c(void) { + struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; + int *src = img_cfg->img_start; + int *dst = (int*)&__data_start__; + int exit_code; + + /* Initialize .data, if necessary. */ + if (src != dst) { + int *end = (int*)&__data_end__; + while (dst < end) { + *dst++ = *src++; + } + } + + /* Zero .bss. */ + dst = (int*)&__bss_start__; + while (dst < (int*)&__bss_end__) { + *dst++ = 0; + } + + /* Run initializers. */ + __libc_init_array(); + + /* Jump to main. */ + exit_code = main(0, 0, 0); + if (exit) { + exit(exit_code); + } + + /* If exit is NULL, make sure we don't return. */ + for (;;) + continue; +} From 8ba463a68ceeafa08674a7643ff967172525bea3 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sat, 13 May 2017 14:30:24 +0200 Subject: [PATCH 075/307] improved SPI non-DMA block read routine, taken over from F4 --- STM32F1/libraries/SPI/src/SPI.cpp | 109 ++++++++++++++++-------------- STM32F1/libraries/SPI/src/SPI.h | 2 +- 2 files changed, 58 insertions(+), 53 deletions(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 34c810234..11080148f 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -135,9 +135,8 @@ SPIClass::SPIClass(uint32 spi_num) { _settings[2].spiDmaDev = DMA2; _settings[2].spiTxDmaChannel = DMA_CH2; _settings[2].spiRxDmaChannel = DMA_CH1; -#endif - - //pinMode(BOARD_SPI_DEFAULT_SS,OUTPUT); +#endif + } /* @@ -260,9 +259,6 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) #ifdef SPI_DEBUG Serial.println("SPIClass::beginTransaction"); #endif - //_SSPin=pin; - //pinMode(_SSPin,OUTPUT); - //digitalWrite(_SSPin,LOW); setBitOrder(settings.bitOrder); setDataMode(settings.dataMode); setDataSize(settings.dataSize); @@ -316,14 +312,23 @@ uint16 SPIClass::read(void) void SPIClass::read(uint8 *buf, uint32 len) { + if ( len == 0 ) return; + spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. spi_reg_map * regs = _currentSetting->spi_d->regs; - uint8 b = (regs->DR); // clear the RX buffer in case a byte is waiting on it. - // start sequence - while ( (len--)>0) { - regs->DR = 0x00FF; // " write the data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while ( (regs->SR & SPI_SR_RXNE)==0 ) ; // wait till data is available in the Rx register - *buf++ = (uint8)(regs->DR); // read and store the received byte - } + // start sequence: write byte 0 + regs->DR = 0x00FF; // write the first byte + // main loop + while ( (--len) ) { + while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag + noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data + regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register + *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. + interrupts(); // let systick do its job + } + // read remaining last byte + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register + *buf++ = (uint8)(regs->DR); // read and store the received byte } void SPIClass::write(uint16 data) @@ -344,32 +349,37 @@ void SPIClass::write(uint16 data, uint32 n) spi_reg_map * regs = _currentSetting->spi_d->regs; while ( (n--)>0 ) { regs->DR = data; // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) - while ( (regs->SR & SPI_SR_TXE)==0 ) ; // wait till Tx empty + while ( (regs->SR & SPI_SR_TXE)==0 ) ; // wait till Tx empty } while ( (regs->SR & SPI_SR_BSY) != 0); // wait until BSY=0 before returning } -void SPIClass::write(const void *data, uint32 length) +void SPIClass::write(void *data, uint32 length) { - spi_tx(_currentSetting->spi_d, data, length); // data can be array of bytes or words - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - // taken from SdSpiSTM32F1.cpp - Victor's lib, and adapted to support device selection - uint16 b = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! + spi_dev * spi_d = _currentSetting->spi_d; + spi_tx(spi_d, (void*)data, length); // data can be array of bytes or words + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } -uint8 SPIClass::transfer(uint8 byte) const { - spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint8)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." +uint8 SPIClass::transfer(uint8 byte) const +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, byte); // Write the data item to be transmitted into the SPI_DR register + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint8)spi_rx_reg(spi_d); // "... and read the last received data." } -uint16_t SPIClass::transfer16(uint16_t wr_data) const { - spi_tx_reg(_currentSetting->spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint16)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." +uint16_t SPIClass::transfer16(uint16_t wr_data) const +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint16)spi_rx_reg(spi_d); // "... and read the last received data." } /* Roger Clark and Victor Perez, 2015 @@ -382,21 +392,19 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length { if (length == 0) return 0; uint8 b = 0; - spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. // dma1_ch3_Active=true; dma_init(_currentSetting->spiDmaDev); // dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); // RX - spi_rx_dma_enable(_currentSetting->spi_d); dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, receiveBuf, dma_bit_size, (DMA_MINC_MODE));// receive buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive // TX uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM); - spi_tx_dma_enable(_currentSetting->spi_d); if ( transmitBuf==0 ) { static uint8_t ff = 0XFF; transmitBuf = &ff; @@ -405,23 +413,25 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + + spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. + spi_rx_dma_enable(_currentSetting->spi_d); + spi_tx_dma_enable(_currentSetting->spi_d); // must be the last enable to avoid DMA error flag uint32_t m = millis(); while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + //delayMicroseconds(10); if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - spi_rx_dma_disable(_currentSetting->spi_d); // And disable generation of DMA request from the SPI port so other peripherals can use the channels spi_tx_dma_disable(_currentSetting->spi_d); - uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! + spi_rx_dma_disable(_currentSetting->spi_d); // And disable generation of DMA request from the SPI port so other peripherals can use the channels + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); return b; } @@ -438,25 +448,25 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) uint8 b = 0; dma_init(_currentSetting->spiDmaDev); // TX - spi_tx_dma_enable(_currentSetting->spi_d); dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + spi_tx_dma_enable(_currentSetting->spi_d); uint32_t m = millis(); while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + //delayMicroseconds(10); if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); spi_tx_dma_disable(_currentSetting->spi_d); - uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! - return b; + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + return b; } void SPIClass::attachInterrupt(void) { @@ -492,18 +502,13 @@ uint8 SPIClass::nssPin(void) { */ uint8 SPIClass::send(uint8 data) { - uint8 buf[] = {data}; - return this->send(buf, 1); + this->write(data); + return 1; } uint8 SPIClass::send(uint8 *buf, uint32 len) { - uint32 txed = 0; - uint8 ret = 0; - while (txed < len) { - this->write(buf[txed++]); - ret = this->read(); - } - return ret; + this->write(buf, len); + return len; } uint8 SPIClass::recv(void) { diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 717a2e90c..b66238426 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -256,7 +256,7 @@ class SPIClass { * @param buffer Bytes/words to transmit. * @param length Number of bytes/words in buffer to transmit. */ - void write(const void * buffer, uint32 length); + void write(void * buffer, uint32 length); /** * @brief Transmit a byte, then return the next unread byte. From fbd6927d56f333510f045de10a4bd1ad4a983a43 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sun, 14 May 2017 16:27:43 +0200 Subject: [PATCH 076/307] resolve Invalid library version number --- STM32F4/libraries/arduino_uip/library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F4/libraries/arduino_uip/library.properties b/STM32F4/libraries/arduino_uip/library.properties index d707a448d..ce2c43b5d 100644 --- a/STM32F4/libraries/arduino_uip/library.properties +++ b/STM32F4/libraries/arduino_uip/library.properties @@ -6,6 +6,6 @@ paragraph=implements the same API as stock Ethernet-lib. Just replace the includ category=Communication url=https://github.com/ntruchsess/arduino_uip architectures=STM32F4 -version=1.04 +version=1.0.4 dependencies= core-dependencies=arduino (>=1.5.0) From b8afde026a89ad63fc7e3faf4910381c6169ba7a Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sun, 14 May 2017 16:31:11 +0200 Subject: [PATCH 077/307] increase digitalWrite() value parameter width to 16 bit - this useful for the 16 bit parallel TFT lib --- STM32F4/cores/maple/libmaple/gpio.h | 2 +- STM32F4/cores/maple/wirish_digital.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/gpio.h b/STM32F4/cores/maple/libmaple/gpio.h index f1a141fee..dcf1151c1 100644 --- a/STM32F4/cores/maple/libmaple/gpio.h +++ b/STM32F4/cores/maple/libmaple/gpio.h @@ -59,7 +59,7 @@ static inline afio_exti_port gpio_exti_port(const gpio_dev *dev) { * @param pin Pin on to set or reset * @param val If true, set the pin. If false, reset the pin. */ -static inline void gpio_write_pin(uint8_t pin, uint8 val) { +static inline void gpio_write_pin(uint8_t pin, uint16 val) { if (val) { (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(pin&0x0F); } else { diff --git a/STM32F4/cores/maple/wirish_digital.cpp b/STM32F4/cores/maple/wirish_digital.cpp index 4a656199b..47690515a 100644 --- a/STM32F4/cores/maple/wirish_digital.cpp +++ b/STM32F4/cores/maple/wirish_digital.cpp @@ -94,7 +94,7 @@ uint32 digitalRead(uint8 pin) HIGH : LOW; } -void digitalWrite(uint8 pin, uint8 val) +void digitalWrite(uint8 pin, uint16 val) { if (pin >= BOARD_NR_GPIO_PINS) { return; From 20fbc3613dc11b75c2763defcc3592855ea07ed1 Mon Sep 17 00:00:00 2001 From: MicroBahner Date: Sun, 14 May 2017 21:21:03 +0200 Subject: [PATCH 078/307] donot disable Timer in pinMode --- STM32F1/cores/maple/stm32f1/wirish_digital_f1.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/STM32F1/cores/maple/stm32f1/wirish_digital_f1.cpp b/STM32F1/cores/maple/stm32f1/wirish_digital_f1.cpp index f16181dd1..74c6dc377 100644 --- a/STM32F1/cores/maple/stm32f1/wirish_digital_f1.cpp +++ b/STM32F1/cores/maple/stm32f1/wirish_digital_f1.cpp @@ -79,11 +79,10 @@ void pinMode(uint8 pin, WiringPinMode mode) { gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, outputMode); - if (PIN_MAP[pin].timer_device != NULL) { - /* Enable/disable timer channels if we're switching into or - * out of PWM. */ + if (pwm && PIN_MAP[pin].timer_device != NULL) { + /* Enable/disable timer channels if we're switching into PWM. */ timer_set_mode(PIN_MAP[pin].timer_device, PIN_MAP[pin].timer_channel, - pwm ? TIMER_PWM : TIMER_DISABLED); + TIMER_PWM ); } } From 3d5c54e344ee8d8f769c318d034dd567da6ba25f Mon Sep 17 00:00:00 2001 From: edogaldo Date: Tue, 16 May 2017 00:00:59 +0200 Subject: [PATCH 079/307] Make HardwareSerial.flush() compatible with Arduino 1.0 api --- STM32F1/cores/maple/HardwareSerial.cpp | 5 +++-- STM32F1/system/libmaple/include/libmaple/ring_buffer.h | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/STM32F1/cores/maple/HardwareSerial.cpp b/STM32F1/cores/maple/HardwareSerial.cpp index c993bdfff..024efbc7d 100644 --- a/STM32F1/cores/maple/HardwareSerial.cpp +++ b/STM32F1/cores/maple/HardwareSerial.cpp @@ -193,7 +193,8 @@ size_t HardwareSerial::write(unsigned char ch) { return 1; } +/* edogaldo: Waits for the transmission of outgoing serial data to complete (Arduino 1.0 api specs) */ void HardwareSerial::flush(void) { - usart_reset_rx(this->usart_device); - usart_reset_tx(this->usart_device); + while(!rb_is_empty(this->usart_device->wb)); // wait for TX buffer empty + while(!((this->usart_device->regs->SR) & (1< Date: Fri, 19 May 2017 17:24:26 +0200 Subject: [PATCH 080/307] digital IO write optimizations for 16bit parallel display types - digitalWrite value increased to 16 bit width - added IO device bit access functions - removed PWM enable/disable from pinMode() --- STM32F4/cores/maple/io.h | 2 +- STM32F4/cores/maple/libmaple/gpio.h | 14 ++++++++++++-- STM32F4/cores/maple/wirish_digital.cpp | 6 +++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/STM32F4/cores/maple/io.h b/STM32F4/cores/maple/io.h index aeaf0fd3a..14546b83d 100644 --- a/STM32F4/cores/maple/io.h +++ b/STM32F4/cores/maple/io.h @@ -121,7 +121,7 @@ void pinMode(uint8 pin, WiringPinMode mode); * @param value Either LOW (write a 0) or HIGH (write a 1). * @see pinMode() */ -void digitalWrite(uint8 pin, uint8 value); +void digitalWrite(uint8 pin, uint16 value); /** * Read a digital value from a pin. The pin must have its mode set to diff --git a/STM32F4/cores/maple/libmaple/gpio.h b/STM32F4/cores/maple/libmaple/gpio.h index dcf1151c1..308324754 100644 --- a/STM32F4/cores/maple/libmaple/gpio.h +++ b/STM32F4/cores/maple/libmaple/gpio.h @@ -60,10 +60,12 @@ static inline afio_exti_port gpio_exti_port(const gpio_dev *dev) { * @param val If true, set the pin. If false, reset the pin. */ static inline void gpio_write_pin(uint8_t pin, uint16 val) { + uint16_t bit = BIT(pin&0x0F); + gpio_reg_map *regs = (PIN_MAP[pin].gpio_device)->regs; if (val) { - (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(pin&0x0F); + regs->BSRRL = bit; } else { - (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(pin&0x0F); + regs->BSRRH = bit; } } @@ -71,10 +73,18 @@ static inline void gpio_set_pin(uint8_t pin) { (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(pin&0x0F); } +static inline void gpio_set_dev_bit(const gpio_dev * dev, uint8_t bit) { + dev->regs->BSRRL = BIT(bit); +} + static inline void gpio_clear_pin(uint8_t pin) { (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(pin&0x0F); } +static inline void gpio_clear_dev_bit(const gpio_dev * dev, uint8_t bit) { + dev->regs->BSRRH = BIT(bit); +} + /** * Determine whether or not a GPIO pin is set. * diff --git a/STM32F4/cores/maple/wirish_digital.cpp b/STM32F4/cores/maple/wirish_digital.cpp index 47690515a..4630da7bf 100644 --- a/STM32F4/cores/maple/wirish_digital.cpp +++ b/STM32F4/cores/maple/wirish_digital.cpp @@ -73,14 +73,14 @@ void pinMode(uint8 pin, WiringPinMode mode) { } gpio_set_mode(pin, outputMode); - +/* if (PIN_MAP[pin].timer_device != NULL) { - /* Enable/disable timer channels if we're switching into or - * out of PWM. */ + // Enable/disable timer channels if we're switching into or out of PWM. timer_set_mode(PIN_MAP[pin].timer_device, PIN_MAP[pin].timer_channel, pwm ? TIMER_PWM : TIMER_DISABLED); } +*/ } From c294b0d0dcad974e66b85295933a16807d3a0637 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 19 May 2017 17:25:51 +0200 Subject: [PATCH 081/307] SPI DMA cleanup --- STM32F4/libraries/SPI/src/SPI.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/STM32F4/libraries/SPI/src/SPI.cpp b/STM32F4/libraries/SPI/src/SPI.cpp index cb8f561c9..18c54cb2b 100644 --- a/STM32F4/libraries/SPI/src/SPI.cpp +++ b/STM32F4/libraries/SPI/src/SPI.cpp @@ -428,14 +428,13 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length ); dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream, length); dma_set_fifo_flags(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream, 0); - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream); // TX - uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM); // | DMA_TRNS_CMPLT); + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM); if ( transmitBuf==0 ) { - static uint8_t ff = 0XFF; + static uint16_t ff = 0XFFFF; transmitBuf = &ff; - flags &= ~((uint32)DMA_MINC_MODE); // remove increment mode + flags ^= DMA_MINC_MODE; // remove increment mode } dma_setup_transfer( _currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream, @@ -457,19 +456,18 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length spi_tx_dma_enable(_currentSetting->spi_d); // must be the last enable to avoid DMA error flag uint32_t m = millis(); - while ((b = dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set - if ( b&(DMA_ISR_TEIF|DMA_ISR_DMEIF|DMA_ISR_FEIF) ) { b = 1; break; } // break on any error flag + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - if (b & DMA_ISR_TCIF) b = 0; while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." // software disable sequence, see AN4031, chapter 4.1 spi_tx_dma_disable(_currentSetting->spi_d); spi_rx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); + return b; } @@ -502,11 +500,9 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) spi_tx_dma_enable(_currentSetting->spi_d); uint32_t m = millis(); - while ((b = dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set - if ( b&(DMA_ISR_TEIF|DMA_ISR_DMEIF|DMA_ISR_FEIF) ) { b = 1; break; } // break on any error flag + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - if (b & DMA_ISR_TCIF) b = 0; while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." From a84b8b209ab4a143816c5221f94240551e4221ff Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 19 May 2017 17:26:16 +0200 Subject: [PATCH 082/307] cosmetics --- STM32F4/variants/generic_f407v/generic_f407v.h | 2 +- STM32F4/variants/generic_f407v/pin_map.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F4/variants/generic_f407v/generic_f407v.h b/STM32F4/variants/generic_f407v/generic_f407v.h index 927f9cd9c..f8a747f3d 100644 --- a/STM32F4/variants/generic_f407v/generic_f407v.h +++ b/STM32F4/variants/generic_f407v/generic_f407v.h @@ -87,7 +87,7 @@ #define BOARD_SPI2A_NSS_PIN PB9 //Port2Pin('B', 9) #define BOARD_SPI2A_SCK_PIN PB10 //Port2Pin('B',10) #define BOARD_SPI2A_MISO_PIN PC2 //Port2Pin('C', 2) -#define BOARD_SPI2A_MOSI_PIN pc3 //Port2Pin('C', 3) +#define BOARD_SPI2A_MOSI_PIN PC3 //Port2Pin('C', 3) #define BOARD_SPI3_NSS_PIN PA15 //Port2Pin('A',15) #define BOARD_SPI3_SCK_PIN PB3 //Port2Pin('B', 3) diff --git a/STM32F4/variants/generic_f407v/pin_map.c b/STM32F4/variants/generic_f407v/pin_map.c index 2189902d6..b21fac885 100644 --- a/STM32F4/variants/generic_f407v/pin_map.c +++ b/STM32F4/variants/generic_f407v/pin_map.c @@ -56,7 +56,7 @@ extern timer_dev timer8; /* typedef struct stm32_pin_info { - gpio_dev *gpio_device; // Maple pin's GPIO device + const gpio_dev * gpio_device; // Maple pin's GPIO device timer_dev *timer_device; // Pin's timer device, if any. uint8 timer_channel; // Timer channel, or 0 if none. uint8 adc_channel; // Pin ADC channel, or ADCx if none. From ba4f3808c2799ecbc53c78cb1514b195188b70d4 Mon Sep 17 00:00:00 2001 From: MicroBahner Date: Sat, 20 May 2017 16:11:00 +0200 Subject: [PATCH 083/307] channel output disabled in non pwm-mode pwmMode disables the channel output in non pwm modes. Attached ISRs are left unchanged --- STM32F1/cores/maple/stm32f1/wirish_digital_f1.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/STM32F1/cores/maple/stm32f1/wirish_digital_f1.cpp b/STM32F1/cores/maple/stm32f1/wirish_digital_f1.cpp index 74c6dc377..3ea5ed00a 100644 --- a/STM32F1/cores/maple/stm32f1/wirish_digital_f1.cpp +++ b/STM32F1/cores/maple/stm32f1/wirish_digital_f1.cpp @@ -79,10 +79,14 @@ void pinMode(uint8 pin, WiringPinMode mode) { gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, outputMode); - if (pwm && PIN_MAP[pin].timer_device != NULL) { - /* Enable/disable timer channels if we're switching into PWM. */ + if (PIN_MAP[pin].timer_device != NULL) { + if ( pwm ) { // we're switching into PWM, enable timer channels timer_set_mode(PIN_MAP[pin].timer_device, PIN_MAP[pin].timer_channel, TIMER_PWM ); + } else { // disable channel output in non pwm-Mode + timer_cc_disable(PIN_MAP[pin].timer_device, + PIN_MAP[pin].timer_channel); + } } } From f7a444b9ef0a269febcf1ebab50177690fa18c45 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sun, 21 May 2017 11:01:22 +0200 Subject: [PATCH 084/307] implemented FSMC for driving an LCD on 16 bit parallel data bus --- STM32F4/cores/maple/libmaple/fsmc.c | 97 +++++++++---------- STM32F4/cores/maple/libmaple/fsmc.h | 44 +++++++-- STM32F4/cores/maple/libmaple/gpio.h | 16 +-- STM32F4/cores/maple/wirish_digital.cpp | 6 +- .../variants/generic_f407v/generic_f407v.h | 29 ++++++ 5 files changed, 119 insertions(+), 73 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/fsmc.c b/STM32F4/cores/maple/libmaple/fsmc.c index 42b0d77b4..04c75555b 100644 --- a/STM32F4/cores/maple/libmaple/fsmc.c +++ b/STM32F4/cores/maple/libmaple/fsmc.c @@ -35,62 +35,53 @@ #ifdef STM32_HIGH_DENSITY /** - * Configure FSMC GPIOs for use with SRAM. - */ -void fsmc_sram_init_gpios(void) { - /* Data lines... */ - gpio_set_mode(PD0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE7, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE15, GPIO_AF_OUTPUT_PP); + * Configure FSMC GPIOs for use with LCDs. + */ - /* Address lines... */ - gpio_set_mode(PD11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD13, GPIO_AF_OUTPUT_PP); -#if 0 // not available on LQFP package - gpio_set_mode(GPIOF, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 2, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 3, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 4, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 5, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 2, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 3, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 4, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 5, GPIO_AF_OUTPUT_PP); -#endif // not available on LQFP package - /* And control lines... */ - gpio_set_mode(PD4, GPIO_AF_OUTPUT_PP); // NOE - gpio_set_mode(PD5, GPIO_AF_OUTPUT_PP); // NWE +void fsmc_init(void) { + rcc_clk_enable(RCC_FSMC); + rcc_reset_dev(RCC_FSMC); +} - gpio_set_mode(PD7, GPIO_AF_OUTPUT_PP); // NE1 -#if 0 // not available on LQFP package - gpio_set_mode(GPIOG, 9, GPIO_AF_OUTPUT_PP); // NE2 - gpio_set_mode(GPIOG, 10, GPIO_AF_OUTPUT_PP); // NE3 - gpio_set_mode(GPIOG, 12, GPIO_AF_OUTPUT_PP); // NE4 -#endif // not available on LQFP package +// used control, address and data lines +// NOE -> RD, NWE -> WR, A18 -> RS, NE1 -> CS +const uint8_t fsmc_pins[]= {FSMC_NOE, FSMC_NWE, FSMC_NE1, FSMC_A18, + FSMC_D0, FSMC_D1, FSMC_D2, FSMC_D3, + FSMC_D4, FSMC_D5, FSMC_D6, FSMC_D7, + FSMC_D8, FSMC_D9, FSMC_D10, FSMC_D11, + FSMC_D12, FSMC_D13, FSMC_D14, FSMC_D15}; - gpio_set_mode(PE0, GPIO_AF_OUTPUT_PP); // NBL0 - gpio_set_mode(PE1, GPIO_AF_OUTPUT_PP); // NBL1 +void fsmc_lcd_init_gpios(void) { + uint8_t i; + for (i=0; i +#include "libmaple_types.h" + #ifdef __cplusplus extern "C"{ #endif @@ -62,27 +63,27 @@ typedef struct fsmc_reg_map { __io uint32 BTR3; /**< SRAM/NOR-Flash chip-select timing register 3 */ __io uint32 BCR4; /**< SRAM/NOR-Flash chip-select control register 4 */ __io uint32 BTR4; /**< SRAM/NOR-Flash chip-select timing register 4 */ - const uint8 RESERVED1[64]; /**< Reserved */ + const uint32 RESERVED1[16]; /**< Reserved */ __io uint32 PCR2; /**< PC Card/NAND Flash control register 2 */ __io uint32 SR2; /**< FIFO status and interrupt register 2 */ __io uint32 PMEM2; /**< Common memory space timing register 2 */ __io uint32 PATT2; /**< Attribute memory space timing register 2 */ - const uint8 RESERVED2[4]; /**< Reserved */ + const uint32 RESERVED2; /**< Reserved */ __io uint32 ECCR2; /**< ECC result register 2 */ - const uint8 RESERVED3[2]; + const uint32 RESERVED3[2]; /**< Reserved */ __io uint32 PCR3; /**< PC Card/NAND Flash control register 3 */ __io uint32 SR3; /**< FIFO status and interrupt register 3 */ __io uint32 PMEM3; /**< Common memory space timing register 3 */ __io uint32 PATT3; /**< Attribute memory space timing register 3 */ const uint32 RESERVED4; /**< Reserved */ __io uint32 ECCR3; /**< ECC result register 3 */ - const uint8 RESERVED5[8]; /**< Reserved */ + const uint32 RESERVED5[2]; /**< Reserved */ __io uint32 PCR4; /**< PC Card/NAND Flash control register 4 */ __io uint32 SR4; /**< FIFO status and interrupt register 4 */ __io uint32 PMEM4; /**< Common memory space timing register 4 */ __io uint32 PATT4; /**< Attribute memory space timing register 4 */ __io uint32 PIO4; /**< I/O space timing register 4 */ - const uint8 RESERVED6[80]; /**< Reserved */ + const uint32 RESERVED6[20]; /**< Reserved */ __io uint32 BWTR1; /**< SRAM/NOR-Flash write timing register 1 */ const uint32 RESERVED7; /**< Reserved */ __io uint32 BWTR2; /**< SRAM/NOR-Flash write timing register 2 */ @@ -101,7 +102,7 @@ typedef struct fsmc_reg_map { typedef struct fsmc_nor_psram_reg_map { __io uint32 BCR; /**< Chip-select control register */ __io uint32 BTR; /**< Chip-select timing register */ - const uint8 RESERVED[252]; /**< Reserved */ + const uint32 RESERVED[64]; /**< Reserved */ __io uint32 BWTR; /**< Write timing register */ } fsmc_nor_psram_reg_map; @@ -170,6 +171,13 @@ typedef struct fsmc_nor_psram_reg_map { #define FSMC_BTR_ADDHLD (0xF << 4) #define FSMC_BTR_ADDSET 0xF +#define FSMC_BTR_DATLAT_(x) ((x<<24)&FSMC_BTR_DATLAT) +#define FSMC_BTR_CLKDIV_(x) ((x<<20)&FSMC_BTR_CLKDIV) +#define FSMC_BTR_BUSTURN_(x) ((x<<16)&FSMC_BTR_BUSTURN) +#define FSMC_BTR_DATAST_(x) ((x<<8)&FSMC_BTR_DATAST) +#define FSMC_BTR_ADDHLD_(x) ((x<<4)&FSMC_BTR_ADDHLD) +#define FSMC_BTR_ADDSET_(x) ((x<<0)&FSMC_BTR_ADDSET) + /* SRAM/NOR-Flash write timing registers */ #define FSMC_BWTR_ACCMOD (0x3 << 28) @@ -280,8 +288,26 @@ typedef struct fsmc_nor_psram_reg_map { /* * SRAM/NOR Flash routines */ +extern volatile uint16_t * fsmcData; +extern volatile uint16_t * fsmcCommand; + +void fsmc_lcd_init(void); -void fsmc_sram_init_gpios(void); +static inline void fsmc_nor_psram_set_BCR(fsmc_nor_psram_reg_map *regs, uint32_t bcr) { + regs->BCR = bcr; +} + +static inline void fsmc_nor_psram_set_BTR(fsmc_nor_psram_reg_map *regs, uint32_t btr) { + regs->BTR = btr; +} + +static inline void fsmc_nor_psram_bank_enable(fsmc_nor_psram_reg_map *regs) { + regs->BCR |= FSMC_BCR_MBKEN; +} + +static inline void fsmc_nor_psram_bank_disable(fsmc_nor_psram_reg_map *regs) { + regs->BCR ^= FSMC_BCR_MBKEN; +} /** * Set the DATAST bits in the given NOR/PSRAM register map's diff --git a/STM32F4/cores/maple/libmaple/gpio.h b/STM32F4/cores/maple/libmaple/gpio.h index 308324754..7f2e7f522 100644 --- a/STM32F4/cores/maple/libmaple/gpio.h +++ b/STM32F4/cores/maple/libmaple/gpio.h @@ -69,22 +69,22 @@ static inline void gpio_write_pin(uint8_t pin, uint16 val) { } } -static inline void gpio_set_pin(uint8_t pin) { - (PIN_MAP[pin].gpio_device)->regs->BSRRL = BIT(pin&0x0F); -} - static inline void gpio_set_dev_bit(const gpio_dev * dev, uint8_t bit) { dev->regs->BSRRL = BIT(bit); } -static inline void gpio_clear_pin(uint8_t pin) { - (PIN_MAP[pin].gpio_device)->regs->BSRRH = BIT(pin&0x0F); -} - static inline void gpio_clear_dev_bit(const gpio_dev * dev, uint8_t bit) { dev->regs->BSRRH = BIT(bit); } +static inline void gpio_set_pin(uint8_t pin) { + gpio_set_dev_bit(PIN_MAP[pin].gpio_device, (pin&0x0F)); +} + +static inline void gpio_clear_pin(uint8_t pin) { + gpio_clear_dev_bit(PIN_MAP[pin].gpio_device, (pin&0x0F)); +} + /** * Determine whether or not a GPIO pin is set. * diff --git a/STM32F4/cores/maple/wirish_digital.cpp b/STM32F4/cores/maple/wirish_digital.cpp index 4630da7bf..c976fbf1a 100644 --- a/STM32F4/cores/maple/wirish_digital.cpp +++ b/STM32F4/cores/maple/wirish_digital.cpp @@ -33,7 +33,7 @@ void pinMode(uint8 pin, WiringPinMode mode) { gpio_pin_mode outputMode; - boolean pwm = false; +// boolean pwm = false; if (pin >= BOARD_NR_GPIO_PINS) { return; @@ -61,11 +61,11 @@ void pinMode(uint8 pin, WiringPinMode mode) { break; case PWM: outputMode = GPIO_AF_OUTPUT_PP; - pwm = true; +// pwm = true; break; case PWM_OPEN_DRAIN: outputMode = GPIO_AF_OUTPUT_OD; - pwm = true; +// pwm = true; break; default: ASSERT(0); diff --git a/STM32F4/variants/generic_f407v/generic_f407v.h b/STM32F4/variants/generic_f407v/generic_f407v.h index f8a747f3d..24fae506c 100644 --- a/STM32F4/variants/generic_f407v/generic_f407v.h +++ b/STM32F4/variants/generic_f407v/generic_f407v.h @@ -106,6 +106,35 @@ #define BOARD_SDIO_CK PC12 //Port2Pin('C',12) #define BOARD_SDIO_CMD PD2 //Port2Pin('D', 2) +#define FSMC_NOE PD4 +#define FSMC_NWE PD5 +#define FSMC_NE1 PD7 +#define FSMC_A18 PD13 +#define FSMC_A17 PD12 +#define FSMC_A16 PD11 +#define FSMC_D0 PD14 +#define FSMC_D1 PD15 +#define FSMC_D2 PD0 +#define FSMC_D3 PD1 +#define FSMC_D4 PE7 +#define FSMC_D5 PE8 +#define FSMC_D6 PE9 +#define FSMC_D7 PE10 +#define FSMC_D8 PE11 +#define FSMC_D9 PE12 +#define FSMC_D10 PE13 +#define FSMC_D11 PE14 +#define FSMC_D12 PE15 +#define FSMC_D13 PD8 +#define FSMC_D14 PD9 +#define FSMC_D15 PD10 + +#define BOARD_T_CS BOARD_SPI2_NSS_PIN +#define BOARD_T_SCK BOARD_SPI2_SCK_PIN +#define BOARD_T_MISO BOARD_SPI2_MISO_PIN +#define BOARD_T_MOSI BOARD_SPI2_MOSI_PIN +#define BOARD_T_PEN PC5 + #define BOARD_NR_GPIO_PINS 80 #define BOARD_NR_PWM_PINS 22 #define BOARD_NR_ADC_PINS 16 From 8574d238e8ebd1700c98bb099f6da847046269b2 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 22 May 2017 17:36:50 +0200 Subject: [PATCH 085/307] added FSMC + SPI brought in line with F1 --- STM32F4/cores/maple/libmaple/fsmc.c | 97 +++++++++---------- STM32F4/cores/maple/libmaple/fsmc.h | 44 +++++++-- STM32F4/libraries/SPI/src/SPI.cpp | 10 +- .../variants/generic_f407v/generic_f407v.h | 31 +++++- 4 files changed, 112 insertions(+), 70 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/fsmc.c b/STM32F4/cores/maple/libmaple/fsmc.c index 42b0d77b4..04c75555b 100644 --- a/STM32F4/cores/maple/libmaple/fsmc.c +++ b/STM32F4/cores/maple/libmaple/fsmc.c @@ -35,62 +35,53 @@ #ifdef STM32_HIGH_DENSITY /** - * Configure FSMC GPIOs for use with SRAM. - */ -void fsmc_sram_init_gpios(void) { - /* Data lines... */ - gpio_set_mode(PD0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE7, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE15, GPIO_AF_OUTPUT_PP); + * Configure FSMC GPIOs for use with LCDs. + */ - /* Address lines... */ - gpio_set_mode(PD11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD13, GPIO_AF_OUTPUT_PP); -#if 0 // not available on LQFP package - gpio_set_mode(GPIOF, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 2, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 3, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 4, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 5, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 2, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 3, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 4, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 5, GPIO_AF_OUTPUT_PP); -#endif // not available on LQFP package - /* And control lines... */ - gpio_set_mode(PD4, GPIO_AF_OUTPUT_PP); // NOE - gpio_set_mode(PD5, GPIO_AF_OUTPUT_PP); // NWE +void fsmc_init(void) { + rcc_clk_enable(RCC_FSMC); + rcc_reset_dev(RCC_FSMC); +} - gpio_set_mode(PD7, GPIO_AF_OUTPUT_PP); // NE1 -#if 0 // not available on LQFP package - gpio_set_mode(GPIOG, 9, GPIO_AF_OUTPUT_PP); // NE2 - gpio_set_mode(GPIOG, 10, GPIO_AF_OUTPUT_PP); // NE3 - gpio_set_mode(GPIOG, 12, GPIO_AF_OUTPUT_PP); // NE4 -#endif // not available on LQFP package +// used control, address and data lines +// NOE -> RD, NWE -> WR, A18 -> RS, NE1 -> CS +const uint8_t fsmc_pins[]= {FSMC_NOE, FSMC_NWE, FSMC_NE1, FSMC_A18, + FSMC_D0, FSMC_D1, FSMC_D2, FSMC_D3, + FSMC_D4, FSMC_D5, FSMC_D6, FSMC_D7, + FSMC_D8, FSMC_D9, FSMC_D10, FSMC_D11, + FSMC_D12, FSMC_D13, FSMC_D14, FSMC_D15}; - gpio_set_mode(PE0, GPIO_AF_OUTPUT_PP); // NBL0 - gpio_set_mode(PE1, GPIO_AF_OUTPUT_PP); // NBL1 +void fsmc_lcd_init_gpios(void) { + uint8_t i; + for (i=0; i +#include "libmaple_types.h" + #ifdef __cplusplus extern "C"{ #endif @@ -62,27 +63,27 @@ typedef struct fsmc_reg_map { __io uint32 BTR3; /**< SRAM/NOR-Flash chip-select timing register 3 */ __io uint32 BCR4; /**< SRAM/NOR-Flash chip-select control register 4 */ __io uint32 BTR4; /**< SRAM/NOR-Flash chip-select timing register 4 */ - const uint8 RESERVED1[64]; /**< Reserved */ + const uint32 RESERVED1[16]; /**< Reserved */ __io uint32 PCR2; /**< PC Card/NAND Flash control register 2 */ __io uint32 SR2; /**< FIFO status and interrupt register 2 */ __io uint32 PMEM2; /**< Common memory space timing register 2 */ __io uint32 PATT2; /**< Attribute memory space timing register 2 */ - const uint8 RESERVED2[4]; /**< Reserved */ + const uint32 RESERVED2; /**< Reserved */ __io uint32 ECCR2; /**< ECC result register 2 */ - const uint8 RESERVED3[2]; + const uint32 RESERVED3[2]; /**< Reserved */ __io uint32 PCR3; /**< PC Card/NAND Flash control register 3 */ __io uint32 SR3; /**< FIFO status and interrupt register 3 */ __io uint32 PMEM3; /**< Common memory space timing register 3 */ __io uint32 PATT3; /**< Attribute memory space timing register 3 */ const uint32 RESERVED4; /**< Reserved */ __io uint32 ECCR3; /**< ECC result register 3 */ - const uint8 RESERVED5[8]; /**< Reserved */ + const uint32 RESERVED5[2]; /**< Reserved */ __io uint32 PCR4; /**< PC Card/NAND Flash control register 4 */ __io uint32 SR4; /**< FIFO status and interrupt register 4 */ __io uint32 PMEM4; /**< Common memory space timing register 4 */ __io uint32 PATT4; /**< Attribute memory space timing register 4 */ __io uint32 PIO4; /**< I/O space timing register 4 */ - const uint8 RESERVED6[80]; /**< Reserved */ + const uint32 RESERVED6[20]; /**< Reserved */ __io uint32 BWTR1; /**< SRAM/NOR-Flash write timing register 1 */ const uint32 RESERVED7; /**< Reserved */ __io uint32 BWTR2; /**< SRAM/NOR-Flash write timing register 2 */ @@ -101,7 +102,7 @@ typedef struct fsmc_reg_map { typedef struct fsmc_nor_psram_reg_map { __io uint32 BCR; /**< Chip-select control register */ __io uint32 BTR; /**< Chip-select timing register */ - const uint8 RESERVED[252]; /**< Reserved */ + const uint32 RESERVED[63]; /**< Reserved */ __io uint32 BWTR; /**< Write timing register */ } fsmc_nor_psram_reg_map; @@ -170,6 +171,13 @@ typedef struct fsmc_nor_psram_reg_map { #define FSMC_BTR_ADDHLD (0xF << 4) #define FSMC_BTR_ADDSET 0xF +#define FSMC_BTR_DATLAT_(x) ((x<<24)&FSMC_BTR_DATLAT) +#define FSMC_BTR_CLKDIV_(x) ((x<<20)&FSMC_BTR_CLKDIV) +#define FSMC_BTR_BUSTURN_(x) ((x<<16)&FSMC_BTR_BUSTURN) +#define FSMC_BTR_DATAST_(x) ((x<<8)&FSMC_BTR_DATAST) +#define FSMC_BTR_ADDHLD_(x) ((x<<4)&FSMC_BTR_ADDHLD) +#define FSMC_BTR_ADDSET_(x) ((x<<0)&FSMC_BTR_ADDSET) + /* SRAM/NOR-Flash write timing registers */ #define FSMC_BWTR_ACCMOD (0x3 << 28) @@ -280,8 +288,26 @@ typedef struct fsmc_nor_psram_reg_map { /* * SRAM/NOR Flash routines */ +extern volatile uint16_t * fsmcData; +extern volatile uint16_t * fsmcCommand; + +void fsmc_lcd_init(void); -void fsmc_sram_init_gpios(void); +static inline void fsmc_nor_psram_set_BCR(fsmc_nor_psram_reg_map *regs, uint32_t bcr) { + regs->BCR = bcr; +} + +static inline void fsmc_nor_psram_set_BTR(fsmc_nor_psram_reg_map *regs, uint32_t btr) { + regs->BTR = btr; +} + +static inline void fsmc_nor_psram_bank_enable(fsmc_nor_psram_reg_map *regs) { + regs->BCR |= FSMC_BCR_MBKEN; +} + +static inline void fsmc_nor_psram_bank_disable(fsmc_nor_psram_reg_map *regs) { + regs->BCR ^= FSMC_BCR_MBKEN; +} /** * Set the DATAST bits in the given NOR/PSRAM register map's diff --git a/STM32F4/libraries/SPI/src/SPI.cpp b/STM32F4/libraries/SPI/src/SPI.cpp index cb8f561c9..c4ad5f298 100644 --- a/STM32F4/libraries/SPI/src/SPI.cpp +++ b/STM32F4/libraries/SPI/src/SPI.cpp @@ -457,19 +457,17 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length spi_tx_dma_enable(_currentSetting->spi_d); // must be the last enable to avoid DMA error flag uint32_t m = millis(); - while ((b = dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set - if ( b&(DMA_ISR_TEIF|DMA_ISR_DMEIF|DMA_ISR_FEIF) ) { b = 1; break; } // break on any error flag + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - if (b & DMA_ISR_TCIF) b = 0; while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." // software disable sequence, see AN4031, chapter 4.1 spi_tx_dma_disable(_currentSetting->spi_d); spi_rx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaStream); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream); return b; } @@ -502,11 +500,9 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) spi_tx_dma_enable(_currentSetting->spi_d); uint32_t m = millis(); - while ((b = dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set - if ( b&(DMA_ISR_TEIF|DMA_ISR_DMEIF|DMA_ISR_FEIF) ) { b = 1; break; } // break on any error flag + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - if (b & DMA_ISR_TCIF) b = 0; while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." diff --git a/STM32F4/variants/generic_f407v/generic_f407v.h b/STM32F4/variants/generic_f407v/generic_f407v.h index 927f9cd9c..24fae506c 100644 --- a/STM32F4/variants/generic_f407v/generic_f407v.h +++ b/STM32F4/variants/generic_f407v/generic_f407v.h @@ -87,7 +87,7 @@ #define BOARD_SPI2A_NSS_PIN PB9 //Port2Pin('B', 9) #define BOARD_SPI2A_SCK_PIN PB10 //Port2Pin('B',10) #define BOARD_SPI2A_MISO_PIN PC2 //Port2Pin('C', 2) -#define BOARD_SPI2A_MOSI_PIN pc3 //Port2Pin('C', 3) +#define BOARD_SPI2A_MOSI_PIN PC3 //Port2Pin('C', 3) #define BOARD_SPI3_NSS_PIN PA15 //Port2Pin('A',15) #define BOARD_SPI3_SCK_PIN PB3 //Port2Pin('B', 3) @@ -106,6 +106,35 @@ #define BOARD_SDIO_CK PC12 //Port2Pin('C',12) #define BOARD_SDIO_CMD PD2 //Port2Pin('D', 2) +#define FSMC_NOE PD4 +#define FSMC_NWE PD5 +#define FSMC_NE1 PD7 +#define FSMC_A18 PD13 +#define FSMC_A17 PD12 +#define FSMC_A16 PD11 +#define FSMC_D0 PD14 +#define FSMC_D1 PD15 +#define FSMC_D2 PD0 +#define FSMC_D3 PD1 +#define FSMC_D4 PE7 +#define FSMC_D5 PE8 +#define FSMC_D6 PE9 +#define FSMC_D7 PE10 +#define FSMC_D8 PE11 +#define FSMC_D9 PE12 +#define FSMC_D10 PE13 +#define FSMC_D11 PE14 +#define FSMC_D12 PE15 +#define FSMC_D13 PD8 +#define FSMC_D14 PD9 +#define FSMC_D15 PD10 + +#define BOARD_T_CS BOARD_SPI2_NSS_PIN +#define BOARD_T_SCK BOARD_SPI2_SCK_PIN +#define BOARD_T_MISO BOARD_SPI2_MISO_PIN +#define BOARD_T_MOSI BOARD_SPI2_MOSI_PIN +#define BOARD_T_PEN PC5 + #define BOARD_NR_GPIO_PINS 80 #define BOARD_NR_PWM_PINS 22 #define BOARD_NR_ADC_PINS 16 From 70aa720e34afcb7f3278a5c368b91ba26cfde2f4 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 22 May 2017 17:53:17 +0200 Subject: [PATCH 086/307] corrected RESERVED size in fsmc_nor_psram_reg_map --- STM32F4/cores/maple/libmaple/fsmc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F4/cores/maple/libmaple/fsmc.h b/STM32F4/cores/maple/libmaple/fsmc.h index e9754927a..3501583b4 100644 --- a/STM32F4/cores/maple/libmaple/fsmc.h +++ b/STM32F4/cores/maple/libmaple/fsmc.h @@ -102,7 +102,7 @@ typedef struct fsmc_reg_map { typedef struct fsmc_nor_psram_reg_map { __io uint32 BCR; /**< Chip-select control register */ __io uint32 BTR; /**< Chip-select timing register */ - const uint32 RESERVED[64]; /**< Reserved */ + const uint32 RESERVED[63]; /**< Reserved */ __io uint32 BWTR; /**< Write timing register */ } fsmc_nor_psram_reg_map; From f1608abe0b8e250d22999a804fc105f391974305 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 22 May 2017 21:09:12 +0200 Subject: [PATCH 087/307] SPI update - cleaned up commented out lines - run-time optimized write and transfer functions - run-time optimized non-DMA block read routine - function call order within DMA routines tied to F4 structure - in line with AN4031, chapter 4.3 - reworked send functions (currently not used, deprecated, but still) --- STM32F1/libraries/SPI/src/SPI.cpp | 118 +++++++++++++++--------------- STM32F1/libraries/SPI/src/SPI.h | 2 +- 2 files changed, 62 insertions(+), 58 deletions(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 45ee25ab4..11080148f 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -135,9 +135,8 @@ SPIClass::SPIClass(uint32 spi_num) { _settings[2].spiDmaDev = DMA2; _settings[2].spiTxDmaChannel = DMA_CH2; _settings[2].spiRxDmaChannel = DMA_CH1; -#endif - - //pinMode(BOARD_SPI_DEFAULT_SS,OUTPUT); +#endif + } /* @@ -260,9 +259,6 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) #ifdef SPI_DEBUG Serial.println("SPIClass::beginTransaction"); #endif - //_SSPin=pin; - //pinMode(_SSPin,OUTPUT); - //digitalWrite(_SSPin,LOW); setBitOrder(settings.bitOrder); setDataMode(settings.dataMode); setDataSize(settings.dataSize); @@ -316,14 +312,23 @@ uint16 SPIClass::read(void) void SPIClass::read(uint8 *buf, uint32 len) { + if ( len == 0 ) return; + spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. spi_reg_map * regs = _currentSetting->spi_d->regs; - uint8 b = (regs->DR); // clear the RX buffer in case a byte is waiting on it. - // start sequence - while ( (len--)>0) { - regs->DR = 0x00FF; // " write the data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while ( (regs->SR & SPI_SR_RXNE)==0 ) ; // wait till data is available in the Rx register - *buf++ = (uint8)(regs->DR); // read and store the received byte - } + // start sequence: write byte 0 + regs->DR = 0x00FF; // write the first byte + // main loop + while ( (--len) ) { + while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag + noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data + regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register + *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. + interrupts(); // let systick do its job + } + // read remaining last byte + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register + *buf++ = (uint8)(regs->DR); // read and store the received byte } void SPIClass::write(uint16 data) @@ -344,32 +349,37 @@ void SPIClass::write(uint16 data, uint32 n) spi_reg_map * regs = _currentSetting->spi_d->regs; while ( (n--)>0 ) { regs->DR = data; // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) - while ( (regs->SR & SPI_SR_TXE)==0 ) ; // wait till Tx empty + while ( (regs->SR & SPI_SR_TXE)==0 ) ; // wait till Tx empty } while ( (regs->SR & SPI_SR_BSY) != 0); // wait until BSY=0 before returning } -void SPIClass::write(const void *data, uint32 length) +void SPIClass::write(void *data, uint32 length) { - spi_tx(_currentSetting->spi_d, data, length); // data can be array of bytes or words - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - // taken from SdSpiSTM32F1.cpp - Victor's lib, and adapted to support device selection - uint16 b = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! + spi_dev * spi_d = _currentSetting->spi_d; + spi_tx(spi_d, (void*)data, length); // data can be array of bytes or words + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } -uint8 SPIClass::transfer(uint8 byte) const { - spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint8)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." +uint8 SPIClass::transfer(uint8 byte) const +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, byte); // Write the data item to be transmitted into the SPI_DR register + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint8)spi_rx_reg(spi_d); // "... and read the last received data." } -uint16_t SPIClass::transfer16(uint16_t wr_data) const { - spi_tx_reg(_currentSetting->spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint16)spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." +uint16_t SPIClass::transfer16(uint16_t wr_data) const +{ + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint16)spi_rx_reg(spi_d); // "... and read the last received data." } /* Roger Clark and Victor Perez, 2015 @@ -382,21 +392,19 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length { if (length == 0) return 0; uint8 b = 0; - spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. // dma1_ch3_Active=true; dma_init(_currentSetting->spiDmaDev); // dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); // RX - spi_rx_dma_enable(_currentSetting->spi_d); dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA + receiveBuf, dma_bit_size, (DMA_MINC_MODE));// receive buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive // TX - uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT); - spi_tx_dma_enable(_currentSetting->spi_d); + uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM); if ( transmitBuf==0 ) { static uint8_t ff = 0XFF; transmitBuf = &ff; @@ -405,23 +413,25 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + + spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. + spi_rx_dma_enable(_currentSetting->spi_d); + spi_tx_dma_enable(_currentSetting->spi_d); // must be the last enable to avoid DMA error flag uint32_t m = millis(); while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + //delayMicroseconds(10); if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - spi_rx_dma_disable(_currentSetting->spi_d); // And disable generation of DMA request from the SPI port so other peripherals can use the channels spi_tx_dma_disable(_currentSetting->spi_d); - uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! + spi_rx_dma_disable(_currentSetting->spi_d); // And disable generation of DMA request from the SPI port so other peripherals can use the channels + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); return b; } @@ -438,26 +448,25 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) uint8 b = 0; dma_init(_currentSetting->spiDmaDev); // TX - spi_tx_dma_enable(_currentSetting->spi_d); dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + spi_tx_dma_enable(_currentSetting->spi_d); -// while (dma1_ch3_Active); uint32_t m = millis(); while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + //delayMicroseconds(10); if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); spi_tx_dma_disable(_currentSetting->spi_d); - uint16 x = spi_rx_reg(_currentSetting->spi_d); // dummy read, needed, don't remove! - return b; + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + return b; } void SPIClass::attachInterrupt(void) { @@ -493,18 +502,13 @@ uint8 SPIClass::nssPin(void) { */ uint8 SPIClass::send(uint8 data) { - uint8 buf[] = {data}; - return this->send(buf, 1); + this->write(data); + return 1; } uint8 SPIClass::send(uint8 *buf, uint32 len) { - uint32 txed = 0; - uint8 ret = 0; - while (txed < len) { - this->write(buf[txed++]); - ret = this->read(); - } - return ret; + this->write(buf, len); + return len; } uint8 SPIClass::recv(void) { diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 717a2e90c..b66238426 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -256,7 +256,7 @@ class SPIClass { * @param buffer Bytes/words to transmit. * @param length Number of bytes/words in buffer to transmit. */ - void write(const void * buffer, uint32 length); + void write(void * buffer, uint32 length); /** * @brief Transmit a byte, then return the next unread byte. From aa79ea1d6e5838bba1041f333c20f0758536452c Mon Sep 17 00:00:00 2001 From: stevstrong Date: Wed, 24 May 2017 18:40:41 +0200 Subject: [PATCH 088/307] Adafruit_ILI9341_STM - reworked for 16 bit SPI register accesses --- .../Adafruit_ILI9341_STM.cpp | 24 ++++--------------- .../Adafruit_ILI9341_STM.h | 8 +++++-- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp index e21f33cbd..db57b3e56 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp @@ -36,7 +36,7 @@ Adafruit_ILI9341_STM::Adafruit_ILI9341_STM(int8_t cs, int8_t dc, int8_t rst) : A } -void Adafruit_ILI9341_STM::spiwrite(uint8_t c) { +void Adafruit_ILI9341_STM::spiwrite(uint16_t c) { //Serial.print("0x"); Serial.print(c, HEX); Serial.print(", "); @@ -178,10 +178,7 @@ void Adafruit_ILI9341_STM::begin(void) { SPI.setBitOrder(MSBFIRST); SPI.setDataMode(SPI_MODE0); #elif defined (__STM32F1__) - SPI.begin(); - SPI.setClockDivider(SPI_CLOCK_DIV2); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); + SPI.beginTransaction(SPISettings(36000000)); #elif defined (__arm__) SPI.begin(); @@ -335,6 +332,7 @@ void Adafruit_ILI9341_STM::begin(void) { if (hwSPI) spi_begin(); writecommand(ILI9341_DISPON); //Display on if (hwSPI) spi_end(); + if (hwSPI) SPI.setDataSize(SPI_CR1_DFF); } @@ -345,18 +343,14 @@ void Adafruit_ILI9341_STM::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, writecommand(ILI9341_CASET); // Column addr set *dcport |= dcpinmask; *csport &= ~cspinmask; - SPI.setDataSize (SPI_CR1_DFF); SPI.write(x0); SPI.write(x1); -// SPI.setDataSize (0); writecommand(ILI9341_PASET); // Row addr set *dcport |= dcpinmask; *csport &= ~cspinmask; -// SPI.setDataSize (SPI_CR1_DFF); SPI.write(y0); SPI.write(y1); - SPI.setDataSize (0); writecommand(ILI9341_RAMWR); // write to RAM @@ -385,7 +379,6 @@ void Adafruit_ILI9341_STM::pushColor(uint16_t color) { //digitalWrite(_cs, LOW); *csport &= ~cspinmask; - spiwrite(color >> 8); spiwrite(color); *csport |= cspinmask; @@ -403,7 +396,6 @@ void Adafruit_ILI9341_STM::drawPixel(int16_t x, int16_t y, uint16_t color) { *dcport |= dcpinmask; *csport &= ~cspinmask; - spiwrite(color >> 8); spiwrite(color); *csport |= cspinmask; @@ -431,10 +423,8 @@ void Adafruit_ILI9341_STM::drawFastVLine(int16_t x, int16_t y, int16_t h, *csport &= ~cspinmask; #if defined (__STM32F1__) - SPI.setDataSize (SPI_CR1_DFF); // Set SPI 16bit mode lineBuffer[0] = color; SPI.dmaSend(lineBuffer, h, 0); - SPI.setDataSize (0); #else uint8_t hi = color >> 8, lo = color; while (h--) { @@ -464,10 +454,8 @@ void Adafruit_ILI9341_STM::drawFastHLine(int16_t x, int16_t y, int16_t w, *csport &= ~cspinmask; #if defined (__STM32F1__) - SPI.setDataSize (SPI_CR1_DFF); // Set spi 16bit mode lineBuffer[0] = color; SPI.dmaSend(lineBuffer, w, 0); - SPI.setDataSize (0); #else uint8_t hi = color >> 8, lo = color; while (w--) { @@ -485,11 +473,9 @@ void Adafruit_ILI9341_STM::fillScreen(uint16_t color) { setAddrWindow(0, 0, _width - 1, _height - 1); *dcport |= dcpinmask; *csport &= ~cspinmask; - SPI.setDataSize (SPI_CR1_DFF); // Set spi 16bit mode lineBuffer[0] = color; SPI.dmaSend(lineBuffer, (65535), 0); SPI.dmaSend(lineBuffer, ((_width * _height) - 65535), 0); - SPI.setDataSize (0); #else fillRect(0, 0, _width, _height, color); @@ -515,7 +501,6 @@ void Adafruit_ILI9341_STM::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, *dcport |= dcpinmask; *csport &= ~cspinmask; #if defined (__STM32F1__) - SPI.setDataSize (SPI_CR1_DFF); // Set spi 16bit mode lineBuffer[0] = color; if (w*h <= 65535) { SPI.dmaSend(lineBuffer, (w*h), 0); @@ -524,7 +509,6 @@ void Adafruit_ILI9341_STM::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, SPI.dmaSend(lineBuffer, (65535), 0); SPI.dmaSend(lineBuffer, ((w*h) - 65535), 0); } - SPI.setDataSize (0); #else uint8_t hi = color >> 8, lo = color; for(y=h; y>0; y--) @@ -672,6 +656,7 @@ uint16_t Adafruit_ILI9341_STM::color565(uint8_t r, uint8_t g, uint8_t b) { void Adafruit_ILI9341_STM::setRotation(uint8_t m) { if (hwSPI) spi_begin(); + if (hwSPI) SPI.setDataSize(0); writecommand(ILI9341_MADCTL); rotation = m % 4; // can't be higher than 3 switch (rotation) { @@ -696,6 +681,7 @@ void Adafruit_ILI9341_STM::setRotation(uint8_t m) { _height = ILI9341_TFTWIDTH; break; } + if (hwSPI) SPI.setDataSize(SPI_CR1_DFF); if (hwSPI) spi_end(); } diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h index a716c2769..6554bc046 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h @@ -8,9 +8,13 @@ This library has been modified for the Maple Mini #include "Arduino.h" #include "Print.h" -#include +#include #include +#ifndef swap + #define swap(a, b) { int16_t t = a; a = b; b = t; } +#endif + #define ILI9341_TFTWIDTH 240 #define ILI9341_TFTHEIGHT 320 @@ -125,7 +129,7 @@ class Adafruit_ILI9341_STM : public Adafruit_GFX { void dummyclock(void); */ - void spiwrite(uint8_t), + void spiwrite(uint16_t), writecommand(uint8_t c), writedata(uint8_t d), commandList(uint8_t *addr); From c6fe342d0f46256a5ccf581237f4b42c5c7b163c Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 25 May 2017 17:59:48 +1000 Subject: [PATCH 089/307] Add prototype for systick_attach_callback (thanks to @ag123) --- STM32F1/system/libmaple/include/libmaple/systick.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/STM32F1/system/libmaple/include/libmaple/systick.h b/STM32F1/system/libmaple/include/libmaple/systick.h index 551f8000a..51d0c567f 100644 --- a/STM32F1/system/libmaple/include/libmaple/systick.h +++ b/STM32F1/system/libmaple/include/libmaple/systick.h @@ -108,6 +108,12 @@ static inline uint32 systick_check_underflow(void) { return SYSTICK_BASE->CSR & SYSTICK_CSR_COUNTFLAG; } +/** + * @brief prototype for systick_attach_callback + * + */ +extern void systick_attach_callback(void (*callback)(void)); + #ifdef __cplusplus } // extern "C" #endif From c3d9d1bc1e36b44a3d5f1c39bb145194df8d8b1f Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 25 May 2017 18:16:47 +1000 Subject: [PATCH 090/307] Added define for LED_BUILTIN to Maple mini and generic STM32F103C (on PC13 to suit the BluePill) --- STM32F1/variants/generic_stm32f103c/board/board.h | 2 ++ STM32F1/variants/maple_mini/board/board.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/STM32F1/variants/generic_stm32f103c/board/board.h b/STM32F1/variants/generic_stm32f103c/board/board.h index d2a4fd659..97231e09f 100644 --- a/STM32F1/variants/generic_stm32f103c/board/board.h +++ b/STM32F1/variants/generic_stm32f103c/board/board.h @@ -73,6 +73,8 @@ #define BOARD_USB_DISC_DEV GPIOB #define BOARD_USB_DISC_BIT 10 +#define LED_BUILTIN PC13 + // Note this needs to match with the PIN_MAP array in board.cpp enum { PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9, PA10, PA11, PA12, PA13,PA14,PA15, diff --git a/STM32F1/variants/maple_mini/board/board.h b/STM32F1/variants/maple_mini/board/board.h index b7a54a8b1..10bcb5a69 100644 --- a/STM32F1/variants/maple_mini/board/board.h +++ b/STM32F1/variants/maple_mini/board/board.h @@ -71,6 +71,8 @@ #define BOARD_USB_DISC_DEV GPIOB #define BOARD_USB_DISC_BIT 9 +#define LED_BUILTIN PB1 + enum { PB11, PB10, PB2, PB0, PA7, PA6, PA5, PA4, PA3, PA2, PA1, PA0, PC15, PC14, PC13, PB7, PB6, PB5, PB4, PB3, PA15, PA14, PA13, PA12, PA11, PA10, PA9, From 782b53119d7ee0c8dec605421c5bf5be60f622a4 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Thu, 25 May 2017 10:18:27 +0200 Subject: [PATCH 091/307] used GFX library changed back to GFX_AS --- STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h index 6554bc046..137b7a4b5 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h @@ -8,7 +8,7 @@ This library has been modified for the Maple Mini #include "Arduino.h" #include "Print.h" -#include +#include #include #ifndef swap From 437834a91fafc15bac2f24b9e889ddd259e86a72 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 25 May 2017 20:06:37 +1000 Subject: [PATCH 092/307] Added code by @danieleff to delay leaving the maple_upload script (in all platforms) until the Serial device has reconnected - this helps resolve the problem of needing to close the Arduino Serial Monitor prior to upload --- tools/linux/maple_upload | 9 +++++++++ tools/linux64/maple_upload | 9 +++++++++ tools/macosx/maple_upload | 9 +++++++++ tools/win/maple_upload.bat | 10 ++++++++++ 4 files changed, 37 insertions(+) diff --git a/tools/linux/maple_upload b/tools/linux/maple_upload index e799f3a90..195317468 100755 --- a/tools/linux/maple_upload +++ b/tools/linux/maple_upload @@ -38,3 +38,12 @@ if [ ! -x "${DFU_UTIL}" ]; then fi "${DFU_UTIL}" -d ${usbID} -a ${altID} -D ${binfile} ${dfuse_addr} -R + +echo -n Waiting for ${dummy_port_fullpath} serial... + +COUNTER=0 +while [ ! -c ${dummy_port_fullpath} ] && ((COUNTER++ < 40)); do + sleep 0.1 +done + +echo Done diff --git a/tools/linux64/maple_upload b/tools/linux64/maple_upload index e799f3a90..27e006c22 100755 --- a/tools/linux64/maple_upload +++ b/tools/linux64/maple_upload @@ -38,3 +38,12 @@ if [ ! -x "${DFU_UTIL}" ]; then fi "${DFU_UTIL}" -d ${usbID} -a ${altID} -D ${binfile} ${dfuse_addr} -R + +echo -n Waiting for ${dummy_port_fullpath} serial... + +COUNTER=0 +while [ ! -c ${dummy_port_fullpath} ] && ((COUNTER++ < 40)); do + sleep 0.1 +done + +echo Done \ No newline at end of file diff --git a/tools/macosx/maple_upload b/tools/macosx/maple_upload index 8d15eff8f..3521aa1ef 100755 --- a/tools/macosx/maple_upload +++ b/tools/macosx/maple_upload @@ -51,3 +51,12 @@ if [ ! -x ${DFU_UTIL} ]; then fi ${DFU_UTIL} -d ${usbID} -a ${altID} -D ${binfile} -R ${dfuse_addr} -R + +echo -n Waiting for ${dummy_port_fullpath} serial... + +COUNTER=0 +while [ ! -c ${dummy_port_fullpath} ] && ((COUNTER++ < 40)); do + sleep 0.1 +done + +echo Done diff --git a/tools/win/maple_upload.bat b/tools/win/maple_upload.bat index 678969c56..7d59bf53b 100644 --- a/tools/win/maple_upload.bat +++ b/tools/win/maple_upload.bat @@ -6,3 +6,13 @@ set driverLetter=%driverLetter:~0,2% %driverLetter% cd %~dp0 java -jar maple_loader.jar %1 %2 %3 %4 %5 %6 %7 %8 %9 + +for /l %%x in (1, 1, 40) do ( + ping -w 50 -n 1 192.0.2.1 > nul + mode %1 > nul + if ERRORLEVEL 0 goto comPortFound +) + +echo timeout waiting for %1 serial + +:comPortFound From d3058d39f077daceea2573fd1fbe6255b5cc1497 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 25 May 2017 20:29:01 +1000 Subject: [PATCH 093/307] Fixed F4 ADC typo as noted by @stevstrong in reply to issue #265 --- STM32F4/cores/maple/libmaple/adc.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/adc.h b/STM32F4/cores/maple/libmaple/adc.h index 3a40d4c58..bff18d904 100644 --- a/STM32F4/cores/maple/libmaple/adc.h +++ b/STM32F4/cores/maple/libmaple/adc.h @@ -166,7 +166,7 @@ extern const adc_dev *ADC3; #define ADC_CR2_ALIGN_BIT 11 #define ADC_CR2_JEXTTRIG_BIT 15 #define ADC_CR2_EXTTRIG_BIT 20 -#define ADC_CR2_TSEREFE_BIT 23 +#define ADC_CR2_TSVREFE_BIT 23 #ifdef STM32F2 #define ADC_CR2_JSWSTART_BIT 22 #define ADC_CR2_SWSTART_BIT 30 @@ -191,7 +191,7 @@ extern const adc_dev *ADC3; #define ADC_CR2_EXTTRIG BIT(ADC_CR2_EXTTRIG_BIT) #define ADC_CR2_JSWSTART BIT(ADC_CR2_JSWSTART_BIT) #define ADC_CR2_SWSTART BIT(ADC_CR2_SWSTART_BIT) -#define ADC_CR2_TSEREFE BIT(ADC_CR2_TSEREFE_BIT) +#define ADC_CR2_TSVREFE BIT(ADC_CR2_TSVREFE_BIT) /* Sample time register 1 */ From 84dd9162304a21c3b0799cb113d87b014662706c Mon Sep 17 00:00:00 2001 From: Tom Vijlbrief Date: Thu, 25 May 2017 20:53:24 +0200 Subject: [PATCH 094/307] Fix documentation for usart_putc() --- STM32F1/system/libmaple/include/libmaple/usart.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/system/libmaple/include/libmaple/usart.h b/STM32F1/system/libmaple/include/libmaple/usart.h index fa7c7fbdb..245ddab16 100644 --- a/STM32F1/system/libmaple/include/libmaple/usart.h +++ b/STM32F1/system/libmaple/include/libmaple/usart.h @@ -439,8 +439,8 @@ static inline void usart_disable_all(void) { /** * @brief Transmit one character on a serial port. * - * This function blocks until the character has been successfully - * transmitted. + * This function blocks until the character has been queued + * for transmission. * * @param dev Serial port to send on. * @param byte Byte to transmit. From 66579ef8ef822fd188c11efd4e682d75b95126d8 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 26 May 2017 16:03:49 +1000 Subject: [PATCH 095/307] Added -std=gnu++11 and -std=gnu11 compile flags to F1 and F4 platform.txt compile recipes --- STM32F1/platform.txt | 4 ++-- STM32F4/platform.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/STM32F1/platform.txt b/STM32F1/platform.txt index 3ffde2e45..3da3070c9 100644 --- a/STM32F1/platform.txt +++ b/STM32F1/platform.txt @@ -16,13 +16,13 @@ compiler.warning_flags.all=-Wall -Wextra -DDEBUG_LEVEL=DEBUG_ALL # ---------------------- compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g -Os {compiler.warning_flags} -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g -Os {compiler.warning_flags} -std=gnu11 -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ compiler.c.elf.flags=-Os -Wl,--gc-sections compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index 99ae55549..c43a061a3 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -12,13 +12,13 @@ version=0.1.0 compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g -Os -w -MMD -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ compiler.c.elf.flags=-Os -Wl,--gc-sections compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g -Os -w -MMD -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy From f2c2323afde16917b5ba7059c677c54ef9ee0e8c Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 26 May 2017 16:22:16 +1000 Subject: [PATCH 096/307] Changed board variants to use calculate value from F_CPU for CYCLES_PER_MICROSECOND --- STM32F1/variants/STM32VLD/board/board.h | 3 ++- STM32F1/variants/generic_gd32f103c/board/board.h | 2 +- STM32F1/variants/generic_stm32f103c/board/board.h | 2 +- STM32F1/variants/generic_stm32f103r8/board/board.h | 2 +- STM32F1/variants/generic_stm32f103t/board/board.h | 2 +- STM32F1/variants/generic_stm32f103v/board/board.h | 2 +- STM32F1/variants/hytiny_stm32f103t/board/board.h | 2 +- STM32F1/variants/maple/board/board.h | 2 +- STM32F1/variants/maple_mini/board/board.h | 2 +- STM32F1/variants/microduino/board/board.h | 2 +- STM32F1/variants/nucleo_f103rb/board/board.h | 2 +- STM32F3/variants/discovery_f3/board/board.h | 4 ++-- 12 files changed, 14 insertions(+), 13 deletions(-) diff --git a/STM32F1/variants/STM32VLD/board/board.h b/STM32F1/variants/STM32VLD/board/board.h index ba8d556c8..be2f19e7f 100644 --- a/STM32F1/variants/STM32VLD/board/board.h +++ b/STM32F1/variants/STM32VLD/board/board.h @@ -38,7 +38,8 @@ -#define CYCLES_PER_MICROSECOND 24 +//#define CYCLES_PER_MICROSECOND 24 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) //#define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ #define SYSTICK_RELOAD_VAL 23999 /* takes a cycle to reload */ diff --git a/STM32F1/variants/generic_gd32f103c/board/board.h b/STM32F1/variants/generic_gd32f103c/board/board.h index 209bc3637..50dd98904 100644 --- a/STM32F1/variants/generic_gd32f103c/board/board.h +++ b/STM32F1/variants/generic_gd32f103c/board/board.h @@ -36,7 +36,7 @@ #ifndef _BOARD_GENERIC_STM32F103C_H_ #define _BOARD_GENERIC_STM32F103C_H_ -#define CYCLES_PER_MICROSECOND 72 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) #define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ #define BOARD_NR_USARTS 3 diff --git a/STM32F1/variants/generic_stm32f103c/board/board.h b/STM32F1/variants/generic_stm32f103c/board/board.h index 97231e09f..09351a61a 100644 --- a/STM32F1/variants/generic_stm32f103c/board/board.h +++ b/STM32F1/variants/generic_stm32f103c/board/board.h @@ -36,7 +36,7 @@ #ifndef _BOARD_GENERIC_STM32F103C_H_ #define _BOARD_GENERIC_STM32F103C_H_ -#define CYCLES_PER_MICROSECOND 72 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) #define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ #define BOARD_NR_USARTS 3 diff --git a/STM32F1/variants/generic_stm32f103r8/board/board.h b/STM32F1/variants/generic_stm32f103r8/board/board.h index 5f6855dca..c274d64a7 100644 --- a/STM32F1/variants/generic_stm32f103r8/board/board.h +++ b/STM32F1/variants/generic_stm32f103r8/board/board.h @@ -36,7 +36,7 @@ #ifndef _BOARD_GENERIC_STM32F103R8_H_ #define _BOARD_GENERIC_STM32F103R8_H_ -#define CYCLES_PER_MICROSECOND 72 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) #define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ #define BOARD_NR_USARTS 3 diff --git a/STM32F1/variants/generic_stm32f103t/board/board.h b/STM32F1/variants/generic_stm32f103t/board/board.h index 5454958ee..9b261f6d5 100644 --- a/STM32F1/variants/generic_stm32f103t/board/board.h +++ b/STM32F1/variants/generic_stm32f103t/board/board.h @@ -36,7 +36,7 @@ #ifndef _BOARD_GENERIC_STM32F103T_H_ #define _BOARD_GENERIC_STM32F103T_H_ -#define CYCLES_PER_MICROSECOND 72 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) #define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ #define BOARD_NR_USARTS 2 diff --git a/STM32F1/variants/generic_stm32f103v/board/board.h b/STM32F1/variants/generic_stm32f103v/board/board.h index 210dbf888..92f2bf8a1 100644 --- a/STM32F1/variants/generic_stm32f103v/board/board.h +++ b/STM32F1/variants/generic_stm32f103v/board/board.h @@ -38,7 +38,7 @@ /* A few of these values will seem strange given that it's a * high-density board. */ -#define CYCLES_PER_MICROSECOND 72 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) #define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ #define BOARD_BUTTON_PIN PC0 diff --git a/STM32F1/variants/hytiny_stm32f103t/board/board.h b/STM32F1/variants/hytiny_stm32f103t/board/board.h index 194b2e581..179e5e5aa 100644 --- a/STM32F1/variants/hytiny_stm32f103t/board/board.h +++ b/STM32F1/variants/hytiny_stm32f103t/board/board.h @@ -36,7 +36,7 @@ #ifndef _BOARD_GENERIC_STM32F103C_H_ #define _BOARD_GENERIC_STM32F103C_H_ -#define CYCLES_PER_MICROSECOND 72 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) #define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ #define BOARD_NR_USARTS 2 diff --git a/STM32F1/variants/maple/board/board.h b/STM32F1/variants/maple/board/board.h index caebcc78d..5a092861b 100644 --- a/STM32F1/variants/maple/board/board.h +++ b/STM32F1/variants/maple/board/board.h @@ -34,7 +34,7 @@ #define _BOARD_MAPLE_H_ /* 72 MHz -> 72 cycles per microsecond. */ -#define CYCLES_PER_MICROSECOND 72 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) /* Roger clark diff --git a/STM32F1/variants/maple_mini/board/board.h b/STM32F1/variants/maple_mini/board/board.h index 10bcb5a69..9064807c7 100644 --- a/STM32F1/variants/maple_mini/board/board.h +++ b/STM32F1/variants/maple_mini/board/board.h @@ -36,7 +36,7 @@ #ifndef _BOARD_MAPLE_MINI_H_ #define _BOARD_MAPLE_MINI_H_ -#define CYCLES_PER_MICROSECOND 72 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) #define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ #define BOARD_NR_USARTS 3 diff --git a/STM32F1/variants/microduino/board/board.h b/STM32F1/variants/microduino/board/board.h index 2a1295fa6..0c06363d1 100644 --- a/STM32F1/variants/microduino/board/board.h +++ b/STM32F1/variants/microduino/board/board.h @@ -37,7 +37,7 @@ #ifndef _BOARD_MICRODUINO_STM32_H_ #define _BOARD_MICRODUINO_STM32_H_ -#define CYCLES_PER_MICROSECOND 72 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) #define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ /* Roger Clark. diff --git a/STM32F1/variants/nucleo_f103rb/board/board.h b/STM32F1/variants/nucleo_f103rb/board/board.h index 02f46d9c3..b27862dc3 100644 --- a/STM32F1/variants/nucleo_f103rb/board/board.h +++ b/STM32F1/variants/nucleo_f103rb/board/board.h @@ -33,7 +33,7 @@ #ifndef _BOARD_MAPLE_H_ #define _BOARD_MAPLE_H_ #define _BOARD_NUCLEOF103RB_ 1 // hack for HardwareSerial.cpp for a new order of serials -#define CYCLES_PER_MICROSECOND 72 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) #define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ /* Roger clark. Removed defines for LED pin and Button pin as they are not Arduino API defines */ diff --git a/STM32F3/variants/discovery_f3/board/board.h b/STM32F3/variants/discovery_f3/board/board.h index 179dede0b..6b04a8be1 100644 --- a/STM32F3/variants/discovery_f3/board/board.h +++ b/STM32F3/variants/discovery_f3/board/board.h @@ -38,8 +38,8 @@ #include -#define CYCLES_PER_MICROSECOND 72 -#define SYSTICK_RELOAD_VAL 71999 /* takes a cycle to reload */ +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000U) +#define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ enum { PC13, PC14, PC15, From b19fc38e5e8e57f5df399e972edbc5968b5b16b3 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 26 May 2017 17:00:47 +1000 Subject: [PATCH 097/307] Applied change to fix issue in itoa.c and itoa.h with newer versions of GCC (using the changes from STM's fix, in Arduino_Core_STM32) --- STM32F1/cores/maple/itoa.c | 6 +++++- STM32F1/cores/maple/itoa.h | 5 +++++ STM32F4/cores/maple/itoa.c | 6 +++++- STM32F4/cores/maple/itoa.h | 5 +++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/STM32F1/cores/maple/itoa.c b/STM32F1/cores/maple/itoa.c index fc3576602..ee74f829f 100644 --- a/STM32F1/cores/maple/itoa.c +++ b/STM32F1/cores/maple/itoa.c @@ -120,8 +120,12 @@ extern char* ltoa( long value, char *string, int radix ) return string; } - +#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 9 || \ + (__GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ > 2))) +extern char* utoa( unsigned value, char *string, int radix ) +#else extern char* utoa( unsigned long value, char *string, int radix ) +#endif { return ultoa( value, string, radix ) ; } diff --git a/STM32F1/cores/maple/itoa.h b/STM32F1/cores/maple/itoa.h index 59af10947..b88204c0e 100644 --- a/STM32F1/cores/maple/itoa.h +++ b/STM32F1/cores/maple/itoa.h @@ -31,7 +31,12 @@ extern void itoa( int n, char s[] ) ; extern char* itoa( int value, char *string, int radix ) ; extern char* ltoa( long value, char *string, int radix ) ; +#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 9 || \ + (__GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ > 2))) +extern char* utoa( unsigned value, char *string, int radix ) ; +#else extern char* utoa( unsigned long value, char *string, int radix ) ; +#endif extern char* ultoa( unsigned long value, char *string, int radix ) ; #endif /* 0 */ diff --git a/STM32F4/cores/maple/itoa.c b/STM32F4/cores/maple/itoa.c index fc3576602..ee74f829f 100644 --- a/STM32F4/cores/maple/itoa.c +++ b/STM32F4/cores/maple/itoa.c @@ -120,8 +120,12 @@ extern char* ltoa( long value, char *string, int radix ) return string; } - +#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 9 || \ + (__GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ > 2))) +extern char* utoa( unsigned value, char *string, int radix ) +#else extern char* utoa( unsigned long value, char *string, int radix ) +#endif { return ultoa( value, string, radix ) ; } diff --git a/STM32F4/cores/maple/itoa.h b/STM32F4/cores/maple/itoa.h index 59af10947..b88204c0e 100644 --- a/STM32F4/cores/maple/itoa.h +++ b/STM32F4/cores/maple/itoa.h @@ -31,7 +31,12 @@ extern void itoa( int n, char s[] ) ; extern char* itoa( int value, char *string, int radix ) ; extern char* ltoa( long value, char *string, int radix ) ; +#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 9 || \ + (__GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ > 2))) +extern char* utoa( unsigned value, char *string, int radix ) ; +#else extern char* utoa( unsigned long value, char *string, int radix ) ; +#endif extern char* ultoa( unsigned long value, char *string, int radix ) ; #endif /* 0 */ From 54a23097839088747206b363bf477bc53fdba01c Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 2 Jun 2017 17:25:32 +0200 Subject: [PATCH 098/307] corrected digitalPinToBitMask(P) --- STM32F4/variants/generic_f407v/variant.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F4/variants/generic_f407v/variant.h b/STM32F4/variants/generic_f407v/variant.h index cd0a96de4..95a7f3928 100644 --- a/STM32F4/variants/generic_f407v/variant.h +++ b/STM32F4/variants/generic_f407v/variant.h @@ -3,7 +3,7 @@ #define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) -#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) +#define digitalPinToBitMask(P) ( BIT(P&0x0F) ) #define portOutputRegister(port) ( &(port->regs->ODR) ) #define portInputRegister(port) ( &(port->regs->IDR) ) From 9e4b05289cff9067289bb32873c02c108a21b63d Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 2 Jun 2017 19:28:50 +0200 Subject: [PATCH 099/307] corrected digitalPinToBitMask(P) --- STM32F4/variants/generic_f407v/variant.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F4/variants/generic_f407v/variant.h b/STM32F4/variants/generic_f407v/variant.h index cd0a96de4..95a7f3928 100644 --- a/STM32F4/variants/generic_f407v/variant.h +++ b/STM32F4/variants/generic_f407v/variant.h @@ -3,7 +3,7 @@ #define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) -#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) +#define digitalPinToBitMask(P) ( BIT(P&0x0F) ) #define portOutputRegister(port) ( &(port->regs->ODR) ) #define portInputRegister(port) ( &(port->regs->IDR) ) From 1c097cc8c3bfa2eb15dd92794aa9cc3d828d18ce Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 2 Jun 2017 19:32:34 +0200 Subject: [PATCH 100/307] added pin modes: GPIO_AF_OUTPUT_PP_PU (for SDIO) and GPIO_AF_INPUT_PU/PD --- .../cores/maple/libmaple/HardwareSerial.cpp | 4 ++-- STM32F4/cores/maple/libmaple/gpio_def.h | 21 ++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp index f9387d15a..7f3d281a9 100644 --- a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp +++ b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp @@ -100,8 +100,8 @@ void HardwareSerial::begin(uint32 baud) { gpio_set_af_mode(tx_pin, 7); gpio_set_af_mode(rx_pin, 7); } - gpio_set_mode(tx_pin, (gpio_pin_mode)(GPIO_AF_OUTPUT_PP | GPIO_PUPD_INPUT_PU | 0x700)); - gpio_set_mode(rx_pin, (gpio_pin_mode)(GPIO_MODE_AF | GPIO_PUPD_INPUT_PU | 0x700)); + gpio_set_mode(tx_pin, (gpio_pin_mode)(GPIO_AF_OUTPUT_PP_PU | 0x700)); + gpio_set_mode(rx_pin, (gpio_pin_mode)(GPIO_AF_INPUT_PU | 0x700)); //gpio_set_mode(txi->gpio_device, txi->gpio_bit, (gpio_pin_mode)(GPIO_PUPD_INPUT_PU)); //gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, (gpio_pin_mode)(GPIO_PUPD_INPUT_PU)); #else diff --git a/STM32F4/cores/maple/libmaple/gpio_def.h b/STM32F4/cores/maple/libmaple/gpio_def.h index cd1fb3843..4a8e61e26 100644 --- a/STM32F4/cores/maple/libmaple/gpio_def.h +++ b/STM32F4/cores/maple/libmaple/gpio_def.h @@ -125,9 +125,9 @@ extern gpio_dev* const GPIOG; #define GPIO_MODE_AF 2 #define GPIO_MODE_ANALOG 3 -#define GPIO_PUPD_INPUT_FLOATING (0 << 2) -#define GPIO_PUPD_INPUT_PU (1 << 2) -#define GPIO_PUPD_INPUT_PD (2 << 2) +#define GPIO_PUPD_NONE (0 << 2) +#define GPIO_PUPD_PU (1 << 2) +#define GPIO_PUPD_PD (2 << 2) #define GPIO_OSPEED_2MHZ (0 << 4) #define GPIO_OSPEED_25MHZ (1 << 4) @@ -177,18 +177,19 @@ typedef enum gpio_pin_mode { GPIO_AF_OUTPUT_PP = (GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_50MHZ), /**< Alternate function output push-pull. */ + GPIO_AF_OUTPUT_PP_PU = (GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_PUPD_PU | + GPIO_OSPEED_50MHZ), /**< Alternate function + output push-pull. */ GPIO_AF_OUTPUT_OD = (GPIO_MODE_AF | GPIO_OTYPE_OD | GPIO_OSPEED_50MHZ), /**< Alternate function output open drain. */ GPIO_INPUT_ANALOG = (GPIO_MODE_ANALOG), /**< Analog input. */ GPIO_INPUT_FLOATING = (GPIO_MODE_INPUT | - GPIO_PUPD_INPUT_FLOATING), /**< Input floating. */ - GPIO_INPUT_PD = (GPIO_MODE_INPUT | - GPIO_PUPD_INPUT_PD), /**< Input pull-down. */ - GPIO_INPUT_PU = (GPIO_MODE_INPUT | - GPIO_PUPD_INPUT_PU), /**< Input pull-up. */ - GPIO_AF_INPUT_PD = (GPIO_MODE_AF | - GPIO_PUPD_INPUT_PD), /**< Input pull-down. */ + GPIO_PUPD_NONE), /**< Input floating. */ + GPIO_INPUT_PU = (GPIO_MODE_INPUT | GPIO_PUPD_PU), /**< Input pull-up. */ + GPIO_INPUT_PD = (GPIO_MODE_INPUT | GPIO_PUPD_PD), /**< Input pull-down. */ + GPIO_AF_INPUT_PU = (GPIO_MODE_AF | GPIO_PUPD_PU), /**< Alternate input pull-up. */ + GPIO_AF_INPUT_PD = (GPIO_MODE_AF | GPIO_PUPD_PD), /**< Alternate input pull-down. */ GPIO_BIGNUMBER = 0xfff } gpio_pin_mode; From cbd20e93844fac77258e635b9cf208ca1178b5b2 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 2 Jun 2017 19:35:32 +0200 Subject: [PATCH 101/307] corrected digitalPinToBitMask(P) for disco F4, too --- STM32F4/variants/discovery_f407/variant.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F4/variants/discovery_f407/variant.h b/STM32F4/variants/discovery_f407/variant.h index 8a88623e7..8782ccc71 100644 --- a/STM32F4/variants/discovery_f407/variant.h +++ b/STM32F4/variants/discovery_f407/variant.h @@ -2,7 +2,7 @@ #define _VARIANT_ARDUINO_STM32_ #define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) -#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) +#define digitalPinToBitMask(P) ( BIT(P&0x0F) ) #define portOutputRegister(port) ( &(port->regs->ODR) ) #define portInputRegister(port) ( &(port->regs->IDR) ) From 642495bec9cbb4b8176bfa4ff208b78c7f84c48c Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 2 Jun 2017 19:37:36 +0200 Subject: [PATCH 102/307] corrected typo for BOARD_SDIO_CLK (generic F4) --- STM32F4/variants/generic_f407v/generic_f407v.h | 2 +- STM32F4/variants/generic_f407v/pin_map.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F4/variants/generic_f407v/generic_f407v.h b/STM32F4/variants/generic_f407v/generic_f407v.h index 24fae506c..bc3b77b69 100644 --- a/STM32F4/variants/generic_f407v/generic_f407v.h +++ b/STM32F4/variants/generic_f407v/generic_f407v.h @@ -103,7 +103,7 @@ #define BOARD_SDIO_D1 PC9 //Port2Pin('C', 9) #define BOARD_SDIO_D2 PC10 //Port2Pin('C',10) #define BOARD_SDIO_D3 PC11 //Port2Pin('C',11) -#define BOARD_SDIO_CK PC12 //Port2Pin('C',12) +#define BOARD_SDIO_CLK PC12 //Port2Pin('C',12) #define BOARD_SDIO_CMD PD2 //Port2Pin('D', 2) #define FSMC_NOE PD4 diff --git a/STM32F4/variants/generic_f407v/pin_map.c b/STM32F4/variants/generic_f407v/pin_map.c index 2189902d6..5ecde5367 100644 --- a/STM32F4/variants/generic_f407v/pin_map.c +++ b/STM32F4/variants/generic_f407v/pin_map.c @@ -198,7 +198,7 @@ const uint8 boardUsedPins[BOARD_NR_USED_PINS] = { BOARD_JTMS_SWDIO_PIN, BOARD_JTCK_SWCLK_PIN, FLASH_CS_PIN, FLASH_CLK_PIN, FLASH_DO_PIN, FLASH_DI_PIN, NRF24_CE_PIN, NRF24_CS_PIN, NRF24_IRQ_PIN, - BOARD_SDIO_D0, BOARD_SDIO_D1, BOARD_SDIO_D2, BOARD_SDIO_D3, BOARD_SDIO_CK, BOARD_SDIO_CMD, + BOARD_SDIO_D0, BOARD_SDIO_D1, BOARD_SDIO_D2, BOARD_SDIO_D3, BOARD_SDIO_CLK, BOARD_SDIO_CMD, USB_DM_PIN, USB_DP_PIN }; From 6dde3d39b401b01695c2844635331df1a1226b4e Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 2 Jun 2017 20:26:55 +0200 Subject: [PATCH 103/307] added serial bool operator for "if(!Serial)" --- STM32F4/cores/maple/libmaple/HardwareSerial.h | 1 + 1 file changed, 1 insertion(+) diff --git a/STM32F4/cores/maple/libmaple/HardwareSerial.h b/STM32F4/cores/maple/libmaple/HardwareSerial.h index d7e8a3d1f..b49c4cfca 100644 --- a/STM32F4/cores/maple/libmaple/HardwareSerial.h +++ b/STM32F4/cores/maple/libmaple/HardwareSerial.h @@ -57,6 +57,7 @@ class HardwareSerial : public Stream { void begin(uint32 baud); void end(void); + operator bool() { return true; } // This is needed because of "if (!Serial)" /* I/O */ virtual int available(void); virtual int peek(void); From 9ae2f6fa78bc258d61a11fc3f0157fd3537780d0 Mon Sep 17 00:00:00 2001 From: Zou Hanya Date: Sat, 3 Jun 2017 08:27:33 +0900 Subject: [PATCH 104/307] Avoid initializing USB serial twice --- STM32F1/cores/maple/usb_serial.cpp | 5 +++++ STM32F1/cores/maple/usb_serial.h | 3 +++ 2 files changed, 8 insertions(+) diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index 5eaf70efb..32fe47191 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -55,6 +55,7 @@ static void ifaceSetupHook(unsigned, void*); #define USB_TIMEOUT 50 +bool USBSerial::_hasBegun = false; USBSerial::USBSerial(void) { #if !BOARD_HAVE_SERIALUSB ASSERT(0); @@ -62,6 +63,9 @@ USBSerial::USBSerial(void) { } void USBSerial::begin(void) { + if (_hasBegun) + return; + _hasBegun = true; #if BOARD_HAVE_SERIALUSB usb_cdcacm_enable(BOARD_USB_DISC_DEV, BOARD_USB_DISC_BIT); usb_cdcacm_set_hooks(USB_CDCACM_HOOK_RX, rxHook); @@ -90,6 +94,7 @@ void USBSerial::end(void) { usb_cdcacm_disable(BOARD_USB_DISC_DEV, BOARD_USB_DISC_BIT); usb_cdcacm_remove_hooks(USB_CDCACM_HOOK_RX | USB_CDCACM_HOOK_IFACE_SETUP); #endif + _hasBegun = false; } size_t USBSerial::write(uint8 ch) { diff --git a/STM32F1/cores/maple/usb_serial.h b/STM32F1/cores/maple/usb_serial.h index 96bbefc25..3146a3ca4 100644 --- a/STM32F1/cores/maple/usb_serial.h +++ b/STM32F1/cores/maple/usb_serial.h @@ -71,6 +71,9 @@ class USBSerial : public Stream { uint8 getDTR(); uint8 isConnected(); uint8 pending(); + +protected: + static bool _hasBegun; }; #ifdef SERIAL_USB From df78777e98a411036036388cb0ab809f35c6741a Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 6 Jun 2017 20:45:50 +1000 Subject: [PATCH 105/307] Add yield() call in delay() to support the Arduino Scheduler library. Ref issue #299 --- STM32F1/cores/maple/wirish_time.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/STM32F1/cores/maple/wirish_time.cpp b/STM32F1/cores/maple/wirish_time.cpp index 08fd2d189..6404bec15 100644 --- a/STM32F1/cores/maple/wirish_time.cpp +++ b/STM32F1/cores/maple/wirish_time.cpp @@ -32,11 +32,15 @@ #include #include +#include "Arduino.h" void delay(unsigned long ms) { uint32 start = millis(); - while (millis() - start < ms) - ; + do + { + yield(); + } + while (millis() - start < ms); } void delayMicroseconds(uint32 us) { From 3c4307ebac3102bf95bc6fd7b637449860bef053 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Wed, 7 Jun 2017 14:00:24 +1000 Subject: [PATCH 106/307] Fix issue where USB Serial begin(xx) begin(xx,yy) did nothing, when they should ahave called begin() --- STM32F1/cores/maple/usb_serial.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index 32fe47191..1fe2bf48e 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -54,8 +54,10 @@ static void ifaceSetupHook(unsigned, void*); */ #define USB_TIMEOUT 50 - +#if BOARD_HAVE_SERIALUSB bool USBSerial::_hasBegun = false; +#endif + USBSerial::USBSerial(void) { #if !BOARD_HAVE_SERIALUSB ASSERT(0); @@ -63,10 +65,12 @@ USBSerial::USBSerial(void) { } void USBSerial::begin(void) { + +#if BOARD_HAVE_SERIALUSB if (_hasBegun) return; _hasBegun = true; -#if BOARD_HAVE_SERIALUSB + usb_cdcacm_enable(BOARD_USB_DISC_DEV, BOARD_USB_DISC_BIT); usb_cdcacm_set_hooks(USB_CDCACM_HOOK_RX, rxHook); usb_cdcacm_set_hooks(USB_CDCACM_HOOK_IFACE_SETUP, ifaceSetupHook); @@ -79,6 +83,7 @@ void USBSerial::begin(unsigned long ignoreBaud) volatile unsigned long removeCompilerWarningsIgnoreBaud=ignoreBaud; ignoreBaud=removeCompilerWarningsIgnoreBaud; + begin(); } void USBSerial::begin(unsigned long ignoreBaud, uint8_t ignore) { @@ -87,14 +92,16 @@ volatile uint8_t removeCompilerWarningsIgnore=ignore; ignoreBaud=removeCompilerWarningsIgnoreBaud; ignore=removeCompilerWarningsIgnore; + begin(); } void USBSerial::end(void) { #if BOARD_HAVE_SERIALUSB usb_cdcacm_disable(BOARD_USB_DISC_DEV, BOARD_USB_DISC_BIT); usb_cdcacm_remove_hooks(USB_CDCACM_HOOK_RX | USB_CDCACM_HOOK_IFACE_SETUP); + _hasBegun = false; #endif - _hasBegun = false; + } size_t USBSerial::write(uint8 ch) { From bf138eb389c50f68de28d708033442f8d4584c2b Mon Sep 17 00:00:00 2001 From: SukkoPera Date: Fri, 9 Jun 2017 22:07:05 +0200 Subject: [PATCH 107/307] Remove isConnected() usage from examples --- .../examples/General/BlinkNcount/BlinkNcount.ino | 2 +- .../examples/General/IntegerInput/IntegerInput.ino | 2 +- .../IntegerInput_FloatOutput/IntegerInput_FloatOutput.ino | 2 +- .../General/InternalTempSensor/InternalTempSensor.ino | 6 +++--- .../A_STM32_Examples/examples/General/PrimeNos/PrimeNos.ino | 2 +- .../examples/General/PrimeNos2/PrimeNos2.ino | 2 +- .../examples/General/PrimeNos3/PrimeNos3.ino | 2 +- .../examples/General/Print_Binary/Print_Binary.ino | 2 +- .../examples/General/Print_Float/Print_Float.ino | 2 +- .../examples/General/Print_HEX/Print_HEX.ino | 2 +- .../examples/General/SerialReadUntil/SerialReadUntil.ino | 2 +- .../examples/General/USB_ASCII/USB_ASCII.ino | 2 +- .../General/strtol_DecEquivalents/strtol_DecEquivalents.ino | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino index 7cabfde09..1b1f58a9f 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino @@ -15,7 +15,7 @@ void setup() { // Initialize virtual COM over USB on Maple Mini Serial.begin(9600); // BAUD has no effect on USB serial: placeholder for physical UART // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/IntegerInput/IntegerInput.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/IntegerInput/IntegerInput.ino index 55a68e8c8..4a1d16acb 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/IntegerInput/IntegerInput.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/IntegerInput/IntegerInput.ino @@ -18,7 +18,7 @@ void setup() Serial.begin(BAUD); // BAUD has no effect on USB serial: placeholder for physical UART Serial.setTimeout(timeoutPeriod); // default is 1 second // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/IntegerInput_FloatOutput/IntegerInput_FloatOutput.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/IntegerInput_FloatOutput/IntegerInput_FloatOutput.ino index 6f0484022..b82394ec8 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/IntegerInput_FloatOutput/IntegerInput_FloatOutput.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/IntegerInput_FloatOutput/IntegerInput_FloatOutput.ino @@ -19,7 +19,7 @@ void setup() Serial.begin(BAUD); // BAUD has no effect on USB serial: placeholder for physical UART Serial.setTimeout(timeoutPeriod); // default is 1 second // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/InternalTempSensor/InternalTempSensor.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/InternalTempSensor/InternalTempSensor.ino index d6000cdf8..871ae254d 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/InternalTempSensor/InternalTempSensor.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/InternalTempSensor/InternalTempSensor.ino @@ -38,7 +38,7 @@ void setup(void) pinMode(A_RANDOM_ANALOG_PIN, INPUT_ANALOG); // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink @@ -48,7 +48,7 @@ void setup(void) setup_temperature_sensor(); // announce start up - if(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS())) + if(Serial) Serial.println("Temp mon startup"); } @@ -69,7 +69,7 @@ void loop(void) t2 = micros(); vsense = adc_read(ADC1, 16); t3 = micros(); - if(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS())) { + if(Serial) { sprintf(buf,"%04x %08x %04x %08x" , vsense, t3-t2, alogpin, t2-t1); Serial.println(buf); } diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos/PrimeNos.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos/PrimeNos.ino index 09a7a3fbe..c744219d4 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos/PrimeNos.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos/PrimeNos.ino @@ -29,7 +29,7 @@ void setup() pinMode(33, OUTPUT); Serial.begin(BAUD); // BAUD has no effect on USB serial: placeholder for physical UART // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos2/PrimeNos2.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos2/PrimeNos2.ino index 51fe33216..a2fd1c99e 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos2/PrimeNos2.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos2/PrimeNos2.ino @@ -18,7 +18,7 @@ void setup() { pinMode(33, OUTPUT); Serial.begin(BAUD); // BAUD has no effect on USB serial: placeholder for physical UART // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos3/PrimeNos3.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos3/PrimeNos3.ino index eec3dc0f3..8e8fe88d7 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos3/PrimeNos3.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/PrimeNos3/PrimeNos3.ino @@ -18,7 +18,7 @@ void setup() { pinMode(33, OUTPUT); Serial.begin(BAUD); // BAUD has no effect on USB serial: placeholder for physical UART // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/Print_Binary/Print_Binary.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/Print_Binary/Print_Binary.ino index c9c4b883a..7409ba5fb 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/Print_Binary/Print_Binary.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/Print_Binary/Print_Binary.ino @@ -15,7 +15,7 @@ void setup() pinMode(33, OUTPUT); Serial.begin(BAUD); // BAUD has no effect on USB serial: placeholder for physical UART // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/Print_Float/Print_Float.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/Print_Float/Print_Float.ino index 289db9e58..4351d3189 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/Print_Float/Print_Float.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/Print_Float/Print_Float.ino @@ -17,7 +17,7 @@ void setup() // run once, when the sketch starts pinMode(33, OUTPUT); Serial.begin(BAUD); // BAUD has no effect on USB serial: placeholder for physical UART // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/Print_HEX/Print_HEX.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/Print_HEX/Print_HEX.ino index cfdb977b8..2dc41fe53 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/Print_HEX/Print_HEX.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/Print_HEX/Print_HEX.ino @@ -16,7 +16,7 @@ void setup() // run once, when the sketch starts pinMode(33, OUTPUT); Serial.begin(BAUD); // BAUD has no effect on USB serial: placeholder for physical UART // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/SerialReadUntil/SerialReadUntil.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/SerialReadUntil/SerialReadUntil.ino index 1e7d400be..80d3b3bea 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/SerialReadUntil/SerialReadUntil.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/SerialReadUntil/SerialReadUntil.ino @@ -13,7 +13,7 @@ void setup() { pinMode(33, OUTPUT); Serial.begin(BAUD); // BAUD has no effect on USB serial: placeholder for physical UAR // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/USB_ASCII/USB_ASCII.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/USB_ASCII/USB_ASCII.ino index e38b17602..a884978dc 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/USB_ASCII/USB_ASCII.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/USB_ASCII/USB_ASCII.ino @@ -34,7 +34,7 @@ void setup() { pinMode(33, OUTPUT); Serial.begin(); // USB does not require BAUD // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/strtol_DecEquivalents/strtol_DecEquivalents.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/strtol_DecEquivalents/strtol_DecEquivalents.ino index 7d799af8d..f75947112 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/strtol_DecEquivalents/strtol_DecEquivalents.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/strtol_DecEquivalents/strtol_DecEquivalents.ino @@ -19,7 +19,7 @@ void setup() { pinMode(33, OUTPUT); Serial.begin(9600); // wait for serial monitor to be connected. - while (!(Serial.isConnected() && (Serial.getDTR() || Serial.getRTS()))) + while (!Serial) { digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off delay(100); // fast blink From c4643b265ec344365d9d547ac4f8859d2e20083c Mon Sep 17 00:00:00 2001 From: SukkoPera Date: Fri, 9 Jun 2017 22:07:33 +0200 Subject: [PATCH 108/307] Remove isConnected() usage and binary zeros from StringEx_Parsinge xample --- .../StringEx_Parsing/StringEx_Parsing.ino | Bin 3285 -> 3217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/StringEx_Parsing/StringEx_Parsing.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/StringEx_Parsing/StringEx_Parsing.ino index d98193c351739023a243a659979419438b658719..fd30b4ca30fcbbae814efffd42c6611eba5a2119 100644 GIT binary patch delta 69 zcmV-L0J{Ix8Ic*Vcmb1n0apWBL@blq0d$j30(G;+0yYB%Q)O~#VQjNG24V%1oeTX5 bTrfH?crs&LFq5GS7y$~CuL~6f3MwxOLQEB= delta 157 zcmbOzc~x>l1tX)v Date: Sun, 11 Jun 2017 15:35:14 +1000 Subject: [PATCH 109/307] Added an additional SPI API function dmaSendAsync which will start the a DMA send of a buffer and return immediately. The next time dmaSendAsync is called it waits if the previous transfer is not complete. Note the buffer is not copied, so ddouble buffering is needed to use this function --- STM32F1/libraries/SPI/src/SPI.cpp | 42 +++++++++++++++++++++++++++++++ STM32F1/libraries/SPI/src/SPI.h | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 11080148f..f0d9f7f57 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -469,6 +469,48 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) return b; } + +uint8 SPIClass::dmaSendAsync(void * transmitBuf, uint16 length, bool minc) +{ + static bool isRunning=false; + uint8 b = 0; + + if (isRunning) + { + + uint32_t m = millis(); + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + //delayMicroseconds(10); + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } + + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + isRunning=false; + } + + + if (length == 0) return 0; + uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); + + dma_init(_currentSetting->spiDmaDev); + // TX + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + spi_tx_dma_enable(_currentSetting->spi_d); + + isRunning=true; + + return b; +} + + void SPIClass::attachInterrupt(void) { // Should be enableInterrupt() } diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index b66238426..4d9b563ed 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -291,7 +291,7 @@ class SPIClass { * @param length Number of bytes in buffer to transmit. */ uint8 dmaSend(void * transmitBuf, uint16 length, bool minc = 1); - + uint8 dmaSendAsync(void * transmitBuf, uint16 length, bool minc = 1); /* * Pin accessors */ From f47846662db1c7aa61430ca5ffcde8ce9d6b9579 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 11 Jun 2017 15:42:05 +1000 Subject: [PATCH 110/307] Added Wire.end() for bit banged version (TwoWire.cpp) --- STM32F1/libraries/Wire/Wire.cpp | 12 ++++++++++++ STM32F1/libraries/Wire/Wire.h | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/STM32F1/libraries/Wire/Wire.cpp b/STM32F1/libraries/Wire/Wire.cpp index abc57f8fb..01ee72fd3 100644 --- a/STM32F1/libraries/Wire/Wire.cpp +++ b/STM32F1/libraries/Wire/Wire.cpp @@ -184,6 +184,18 @@ void TwoWire::begin(uint8 self_addr) { set_sda(HIGH); } +void TwoWire::end() +{ + if (this->scl_pin) + { + pinMode(this->scl_pin, INPUT); + } + if (this->sda_pin) + { + pinMode(this->sda_pin, INPUT); + } +} + TwoWire::~TwoWire() { this->scl_pin=0; this->sda_pin=0; diff --git a/STM32F1/libraries/Wire/Wire.h b/STM32F1/libraries/Wire/Wire.h index add0ac972..c7edfefa6 100644 --- a/STM32F1/libraries/Wire/Wire.h +++ b/STM32F1/libraries/Wire/Wire.h @@ -111,6 +111,10 @@ class TwoWire : public WireBase { * Shifts out the data through SDA and clocks SCL for the slave device */ void i2c_shift_out(uint8); + + + + protected: /* * Processes the incoming I2C message defined by WireBase @@ -130,6 +134,11 @@ class TwoWire : public WireBase { */ void begin(uint8 = 0x00); + /* + * Sets pins SDA and SCL to INPUT + */ + void end(); + /* * If object is destroyed, set pin numbers to 0. */ From 953aa8b88e0c9479e591c693a03b6fa37a64a73a Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 11 Jun 2017 15:55:08 +1000 Subject: [PATCH 111/307] Added end() to HardWire (I2C) --- STM32F1/libraries/Wire/HardWire.cpp | 5 +++++ STM32F1/libraries/Wire/HardWire.h | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/STM32F1/libraries/Wire/HardWire.cpp b/STM32F1/libraries/Wire/HardWire.cpp index 8a6318379..b3c1850df 100644 --- a/STM32F1/libraries/Wire/HardWire.cpp +++ b/STM32F1/libraries/Wire/HardWire.cpp @@ -75,3 +75,8 @@ HardWire::~HardWire() { void HardWire::begin(uint8 self_addr) { i2c_master_enable(sel_hard, dev_flags); } + +void HardWire:end() { + i2c_disable(sel_hard); + sel_hard = 0; +} diff --git a/STM32F1/libraries/Wire/HardWire.h b/STM32F1/libraries/Wire/HardWire.h index 6f137b850..6f30cb331 100644 --- a/STM32F1/libraries/Wire/HardWire.h +++ b/STM32F1/libraries/Wire/HardWire.h @@ -59,6 +59,11 @@ class HardWire : public WireBase { * passed flags */ HardWire(uint8, uint8 = 0); + + /* + * Shuts down (disables) the hardware I2C + */ + void end(); /* * Disables the I2C device and remove the device address. From cc355255ac9b6358a4cd6e32b1d8216a49364764 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 12 Jun 2017 16:42:49 +1000 Subject: [PATCH 112/307] Added WS2812B (aka Neopixel) library using SPI DMA asynchronous transfers and double buffering --- STM32F1/libraries/WS2812B | 1 + 1 file changed, 1 insertion(+) create mode 160000 STM32F1/libraries/WS2812B diff --git a/STM32F1/libraries/WS2812B b/STM32F1/libraries/WS2812B new file mode 160000 index 000000000..b7f1e2709 --- /dev/null +++ b/STM32F1/libraries/WS2812B @@ -0,0 +1 @@ +Subproject commit b7f1e2709e48f533e4d43aec3d36f8c48337bc31 From 7487d96f70ba3f78c00623556267cff6fb3a223c Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 13 Jun 2017 08:32:56 +1000 Subject: [PATCH 113/307] Fix typo in Hardware end() --- STM32F1/libraries/Wire/HardWire.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Wire/HardWire.cpp b/STM32F1/libraries/Wire/HardWire.cpp index b3c1850df..1f3ebf25e 100644 --- a/STM32F1/libraries/Wire/HardWire.cpp +++ b/STM32F1/libraries/Wire/HardWire.cpp @@ -76,7 +76,7 @@ void HardWire::begin(uint8 self_addr) { i2c_master_enable(sel_hard, dev_flags); } -void HardWire:end() { +void HardWire::end() { i2c_disable(sel_hard); sel_hard = 0; } From 40dd7c6fe1a3f48a9657f54516737e80a78291a3 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 13 Jun 2017 10:37:16 +1000 Subject: [PATCH 114/307] Removed WS2812B lib as it had a .git folder in it which was causing problems --- STM32F1/libraries/WS2812B | 1 - 1 file changed, 1 deletion(-) delete mode 160000 STM32F1/libraries/WS2812B diff --git a/STM32F1/libraries/WS2812B b/STM32F1/libraries/WS2812B deleted file mode 160000 index b7f1e2709..000000000 --- a/STM32F1/libraries/WS2812B +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b7f1e2709e48f533e4d43aec3d36f8c48337bc31 From ca484b4fdd2efcc1338381021ac267a211751639 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 13 Jun 2017 10:38:05 +1000 Subject: [PATCH 115/307] Add WS2812B library again, but this time without the .git folder in it --- STM32F1/libraries/WS2812B/README.md | 78 +++++ .../examples/WS2812B_test/WS2812B_test.ino | 303 ++++++++++++++++++ STM32F1/libraries/WS2812B/keywords.txt | 27 ++ STM32F1/libraries/WS2812B/library.properties | 10 + STM32F1/libraries/WS2812B/src/WS2812B.cpp | 238 ++++++++++++++ STM32F1/libraries/WS2812B/src/WS2812B.h | 81 +++++ 6 files changed, 737 insertions(+) create mode 100644 STM32F1/libraries/WS2812B/README.md create mode 100644 STM32F1/libraries/WS2812B/examples/WS2812B_test/WS2812B_test.ino create mode 100644 STM32F1/libraries/WS2812B/keywords.txt create mode 100644 STM32F1/libraries/WS2812B/library.properties create mode 100644 STM32F1/libraries/WS2812B/src/WS2812B.cpp create mode 100644 STM32F1/libraries/WS2812B/src/WS2812B.h diff --git a/STM32F1/libraries/WS2812B/README.md b/STM32F1/libraries/WS2812B/README.md new file mode 100644 index 000000000..3f101445d --- /dev/null +++ b/STM32F1/libraries/WS2812B/README.md @@ -0,0 +1,78 @@ +# WS2812B_STM32_Libmaple +WS2812B (Neopixel) library for Arduino STM32 (Libmaple core) + +Written by Roger Clark www.rogerclark.net, from first principals + +This library uses SPI DMA to control a strip of WS2812B (NeoPixel) LEDS + +It should be generally compatible with the Adafruit NeoPixel library, +except I have not had chance to implement one or two of the lesser used functions + +Connect Data In of the strip to SPI1 MOSI + +This library has only been tested on the WS2812B LED. It may not work with the older WS2812 or +other types of addressable RGB LED, becuase it relies on a division multiple of the 72Mhz clock +frequence on the STM32 SPI to generate the correct width T0H pulse, of 400ns +/- 150nS +SPI DIV32 gives a pulse width of 444nS which is well within spec for the WS2812B but +is probably too long for the WS2812 which needs a 350ns pulse for T0H + +##Technical details + +The library uses SPI to send the mark/space encoded data to the LED's + +Each mark/space squarewave is generated by 3 bits of data +A pixel 0 value is achieved by sending the bit pattern 100 +A pixel 1 value is achieved by sending the bit pattern 110 + +Where the duration of each bit is 444nS +Hence 100 generates a mark space value of 444/888nS +and 110 generates a mark space value of 888/444nS + +This method results in the smallest storage requirement and the fastest send times, +however because the 8 bit pixel channel data is encoded in 24 bits, (3 bytes) the values required in each of the 3 bytes to represent +a specific value is not easy to generate. + +The bit pattern in the 3 bytes is +88877766 65554443 33222111 + +For speed of operation the values reqired for each byte for each of the 256 possible values is held in 3 separate 256 byte LUTS +which were pre-computed by this function (which generates the full 24 bit pattern for a given input value (0-255) + +``` +uint32_t convert(uint8_t data) +{ + uint32_t out=0; + for(uint8_t mask = 0x80; mask; mask >>= 1) + { + out=out<<3; + if (data & mask) + { + out = out | 0B110;//Bit high + } + else + { + out = out | 0B100;// bit low + } + } + return out; +} +``` + +The STM32F103 has plenty of flash space (either 64 or 128k), so I used 256 byte LUTs even though the number of unique values in each LUT is +only 8,4 and 8 bytes respectively. +However to use small LUTS requires shifting and masking of the input data, and the code was written with a preference for speed over binary size + +The encoded pixel buffer is 2 bytes longer than the actual encoded data. +The first and last encoded bytes are all zeros. This is because the SPI hardware seems to preload MOSI with its output value before the start +of the DMA transfer, which causes the first encoded pulse to be around 50ns longer than the subsequent bits, (around 490 or 500ns) +This had the effect of causing the first LED to always think the MS bit of the green channel was set to High. + +So having the first encoded byte of zeros, is a work-around , as although the first encoded bit is still 490nS wide its a logic zero and is therefore +not visible, becuase the default state is of the SPI when not transmitting data is logic zero +The last byte was also set to all zeros, as occasionally MOSI seemed to be left set to logic high on completion of the SPI DMA send + +Adding these 2 bytes does slightly slow down the transfer, as it add 444ns * 8 = just over 3.5uS to both end. +But the WS2812B theoretically requires a reset time of more than 50uS between transmissions, so 3.5uS can be part of that time. +In reality the WS2812B seems to only need around 6uS of reset time, so for all practical purposes, there no delays are needed at all in the +library to enforce the reset time, as the overead of the function call and the SPI DMA setup plus the 3.5uS gives the enough reset time. + diff --git a/STM32F1/libraries/WS2812B/examples/WS2812B_test/WS2812B_test.ino b/STM32F1/libraries/WS2812B/examples/WS2812B_test/WS2812B_test.ino new file mode 100644 index 000000000..bf4934f88 --- /dev/null +++ b/STM32F1/libraries/WS2812B/examples/WS2812B_test/WS2812B_test.ino @@ -0,0 +1,303 @@ +#include + +#define NUM_LEDS 30 +/* + * Note. Library uses SPI1 + * Connect the WS2812B data input to MOSI on your board. + * + */ +WS2812B strip = WS2812B(NUM_LEDS); +// Note. Gamma is not really supported in the library, its only included as some functions used in this example require Gamma +uint8_t LEDGamma[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, + 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, + 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, + 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, + 25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, + 37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, + 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, + 69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, + 90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114, + 115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142, + 144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175, + 177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213, +215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 }; + +void setup() +{ + strip.begin();// Sets up the SPI + strip.show();// Clears the strip, as by default the strip data is set to all LED's off. + // strip.setBrightness(8); +} + +void loop() +{ + colorWipe(strip.Color(0, 255, 0), 20); // Green + colorWipe(strip.Color(255, 0, 0), 20); // Red + colorWipe(strip.Color(0, 0, 255), 20); // Blue + rainbow(10); + rainbowCycle(10); + theaterChase(strip.Color(255, 0, 0), 20); // Red + theaterChase(strip.Color(0, 255, 0), 20); // Green + theaterChase(strip.Color(0, 0, 255), 20); // Blue + theaterChaseRainbow(10); + whiteOverRainbow(20,75,5); + pulseWhite(5); + delay(250); + fullWhite(); + delay(250); + rainbowFade2White(3,3,1); +} + +// Fill the dots one after the other with a color +void colorWipe(uint32_t c, uint8_t wait) +{ + for(uint16_t i=0; i= 0 ; j--){ + for(uint16_t i=0; i 255 - fadeMax ){ + fadeVal--; + } + + strip.show(); + delay(wait); + } + + } + + + + delay(500); + + + for(int k = 0 ; k < whiteLoops ; k ++){ + + for(int j = 0; j < 256 ; j++){ + + for(uint16_t i=0; i < strip.numPixels(); i++) { + strip.setPixelColor(i, strip.Color(0,0,0, LEDGamma[j] ) ); + } + strip.show(); + } + + delay(2000); + for(int j = 255; j >= 0 ; j--){ + + for(uint16_t i=0; i < strip.numPixels(); i++) { + strip.setPixelColor(i, strip.Color(0,0,0, LEDGamma[j] ) ); + } + strip.show(); + } + } + + delay(500); + + +} + +void whiteOverRainbow(uint8_t wait, uint8_t whiteSpeed, uint8_t whiteLength ) { + + if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1; + + int head = whiteLength - 1; + int tail = 0; + + int loops = 3; + int loopNum = 0; + + static unsigned long lastTime = 0; + + + while(true){ + for(int j=0; j<256; j++) { + for(uint16_t i=0; i= tail && i <= head) || (tail > head && i >= tail) || (tail > head && i <= head) ){ + strip.setPixelColor(i, strip.Color(0,0,0, 255 ) ); + } + else{ + strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); + } + + } + + if(millis() - lastTime > whiteSpeed) { + head++; + tail++; + if(head == strip.numPixels()){ + loopNum++; + } + lastTime = millis(); + } + + if(loopNum == loops) return; + + head%=strip.numPixels(); + tail%=strip.numPixels(); + strip.show(); + delay(wait); + } + } + +} +void fullWhite() { + + for(uint16_t i=0; i> 16); +} +uint8_t green(uint32_t c) { + return (c >> 8); +} +uint8_t blue(uint32_t c) { + return (c); +} diff --git a/STM32F1/libraries/WS2812B/keywords.txt b/STM32F1/libraries/WS2812B/keywords.txt new file mode 100644 index 000000000..2d8b83a59 --- /dev/null +++ b/STM32F1/libraries/WS2812B/keywords.txt @@ -0,0 +1,27 @@ +####################################### +# Syntax Coloring Map For WS2812B +# Class +####################################### + +WS2812B KEYWORD1 + +####################################### +# Methods and Functions +####################################### + +setPixelColor KEYWORD2 +numPixels KEYWORD2 +Color KEYWORD2 +show KEYWORD2 + +clear KEYWORD2 +updateLength KEYWORD2 + +canShow KEYWORD2 + + +####################################### +# Constants +####################################### + + diff --git a/STM32F1/libraries/WS2812B/library.properties b/STM32F1/libraries/WS2812B/library.properties new file mode 100644 index 000000000..936976ddf --- /dev/null +++ b/STM32F1/libraries/WS2812B/library.properties @@ -0,0 +1,10 @@ +name=WS2812B +version=1.0 +author=Roger Clark, based on the Adafruit Neopixel library API +email= +sentence=WS2812B (Neopixel) library +paragraph=WS2812B (Neopixel) library for STM32F1 LibMaple +url= +architectures=STM32F1 +maintainer=Roger Clark +category=Uncategorized \ No newline at end of file diff --git a/STM32F1/libraries/WS2812B/src/WS2812B.cpp b/STM32F1/libraries/WS2812B/src/WS2812B.cpp new file mode 100644 index 000000000..36483fccd --- /dev/null +++ b/STM32F1/libraries/WS2812B/src/WS2812B.cpp @@ -0,0 +1,238 @@ +/*----------------------------------------------------------------------------------------------- + Arduino library to control WS2812B RGB Led strips using the Arduino STM32 LibMaple core + ----------------------------------------------------------------------------------------------- + + Note. + This library has only been tested on the WS2812B LED. It may not work with the older WS2812 or + other types of addressable RGB LED, becuase it relies on a division multiple of the 72Mhz clock + frequence on the STM32 SPI to generate the correct width T0H pulse, of 400ns +/- 150nS + SPI DIV32 gives a pulse width of 444nS which is well within spec for the WS2812B but + is probably too long for the WS2812 which needs a 350ns pulse for T0H + + This WS2811B library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + It is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + See . + -----------------------------------------------------------------------------------------------*/ + +#include "WS2812B.h" +#include "pins_arduino.h" +#include "wiring_private.h" +#include + + +// Constructor when n is the number of LEDs in the strip +WS2812B::WS2812B(uint16_t number_of_leds) : + brightness(0), pixels(NULL) +{ + updateLength(number_of_leds); +} + + +WS2812B::~WS2812B() +{ + if(pixels) + { + free(pixels); + } + SPI.end(); +} + +void WS2812B::begin(void) { + +if (!begun) +{ + SPI.setClockDivider(SPI_CLOCK_DIV32);// need bit rate of 400nS but closest we can do @ 72Mhz is 444ns (which is within spec) + SPI.begin(); + begun = true; +} +} + +void WS2812B::updateLength(uint16_t n) +{ + if(doubleBuffer) + { + free(doubleBuffer); + } + + numBytes = (n<<3) + n + 2; // 9 encoded bytes per pixel. 1 byte empty peamble to fix issue with SPI MOSI and on byte at the end to clear down MOSI + // Note. (n<<3) +n is a fast way of doing n*9 + if((doubleBuffer = (uint8_t *)malloc(numBytes*2))) + { + numLEDs = n; + pixels = doubleBuffer; + // Only need to init the part of the double buffer which will be interacted with by the API e.g. setPixelColor + *pixels=0;//clear the preamble byte + *(pixels+numBytes-1)=0;// clear the post send cleardown byte. + clear();// Set the encoded data to all encoded zeros + } + else + { + numLEDs = numBytes = 0; + } +} + +// Sends the current buffer to the leds +void WS2812B::show(void) +{ + SPI.dmaSendAsync(pixels,numBytes);// Start the DMA transfer of the current pixel buffer to the LEDs and return immediately. + + // Need to copy the last / current buffer to the other half of the double buffer as most API code does not rebuild the entire contents + // from scratch. Often just a few pixels are changed e.g in a chaser effect + + if (pixels==doubleBuffer) + { + // pixels was using the first buffer + pixels = doubleBuffer+numBytes; // set pixels to second buffer + memcpy(pixels,doubleBuffer,numBytes);// copy first buffer to second buffer + } + else + { + // pixels was using the second buffer + pixels = doubleBuffer; // set pixels to first buffer + memcpy(pixels,doubleBuffer+numBytes,numBytes); // copy second buffer to first buffer + } +} + +/*Sets a specific pixel to a specific r,g,b colour +* Because the pixels buffer contains the encoded bitstream, which is in triplets +* the lookup table need to be used to find the correct pattern for each byte in the 3 byte sequence. +*/ +void WS2812B::setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b) + { + uint8_t *bptr = pixels + (n<<3) + n +1; + uint8_t *tPtr = (uint8_t *)encoderLookup + g*2 + g;// need to index 3 x g into the lookup + + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + + tPtr = (uint8_t *)encoderLookup + r*2 + r; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + + tPtr = (uint8_t *)encoderLookup + b*2 + b; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + } + +void WS2812B::setPixelColor(uint16_t n, uint32_t c) + { + uint8_t r,g,b; + + if(brightness) + { + r = ((int)((uint8_t)(c >> 16)) * (int)brightness) >> 8; + g = ((int)((uint8_t)(c >> 8)) * (int)brightness) >> 8; + b = ((int)((uint8_t)c) * (int)brightness) >> 8; + } + else + { + r = (uint8_t)(c >> 16), + g = (uint8_t)(c >> 8), + b = (uint8_t)c; + } + + uint8_t *bptr = pixels + (n<<3) + n +1; + uint8_t *tPtr = (uint8_t *)encoderLookup + g*2 + g;// need to index 3 x g into the lookup + + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + + tPtr = (uint8_t *)encoderLookup + r*2 + r; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + + tPtr = (uint8_t *)encoderLookup + b*2 + b; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; +} + +// Convert separate R,G,B into packed 32-bit RGB color. +// Packed format is always RGB, regardless of LED strand color order. +uint32_t WS2812B::Color(uint8_t r, uint8_t g, uint8_t b) { + return ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; +} + +// Convert separate R,G,B,W into packed 32-bit WRGB color. +// Packed format is always WRGB, regardless of LED strand color order. +uint32_t WS2812B::Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { + return ((uint32_t)w << 24) | ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; +} + + +uint16_t WS2812B::numPixels(void) const { + return numLEDs; +} + +// Adjust output brightness; 0=darkest (off), 255=brightest. This does +// NOT immediately affect what's currently displayed on the LEDs. The +// next call to show() will refresh the LEDs at this level. However, +// this process is potentially "lossy," especially when increasing +// brightness. The tight timing in the WS2811/WS2812 code means there +// aren't enough free cycles to perform this scaling on the fly as data +// is issued. So we make a pass through the existing color data in RAM +// and scale it (subsequent graphics commands also work at this +// brightness level). If there's a significant step up in brightness, +// the limited number of steps (quantization) in the old data will be +// quite visible in the re-scaled version. For a non-destructive +// change, you'll need to re-render the full strip data. C'est la vie. +void WS2812B::setBrightness(uint8_t b) { + // Stored brightness value is different than what's passed. + // This simplifies the actual scaling math later, allowing a fast + // 8x8-bit multiply and taking the MSB. 'brightness' is a uint8_t, + // adding 1 here may (intentionally) roll over...so 0 = max brightness + // (color values are interpreted literally; no scaling), 1 = min + // brightness (off), 255 = just below max brightness. + uint8_t newBrightness = b + 1; + if(newBrightness != brightness) { // Compare against prior value + // Brightness has changed -- re-scale existing data in RAM + uint8_t c, + *ptr = pixels, + oldBrightness = brightness - 1; // De-wrap old brightness value + uint16_t scale; + if(oldBrightness == 0) scale = 0; // Avoid /0 + else if(b == 255) scale = 65535 / oldBrightness; + else scale = (((uint16_t)newBrightness << 8) - 1) / oldBrightness; + for(uint16_t i=0; i> 8; + } + brightness = newBrightness; + } +} + +//Return the brightness value +uint8_t WS2812B::getBrightness(void) const { + return brightness - 1; +} + +/* +* Sets the encoded pixel data to turn all the LEDs off. +*/ +void WS2812B::clear() +{ + uint8_t * bptr= pixels+1;// Note first byte in the buffer is a preable and is always zero. hence the +1 + uint8_t *tPtr; + + for(int i=0;i< (numLEDs *3);i++) + { + tPtr = (uint8_t *)encoderLookup; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + *bptr++ = *tPtr++; + } +} diff --git a/STM32F1/libraries/WS2812B/src/WS2812B.h b/STM32F1/libraries/WS2812B/src/WS2812B.h new file mode 100644 index 000000000..30bc8753a --- /dev/null +++ b/STM32F1/libraries/WS2812B/src/WS2812B.h @@ -0,0 +1,81 @@ +/*-------------------------------------------------------------------- + The WS2812B library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + It is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + See . + --------------------------------------------------------------------*/ + +#ifndef WS2812B_H +#define WS2812B_H + +#include +/* + * old version used 3 separate tables, one per byte of the 24 bit encoded data + * +static const uint8_t byte0Lookup[256]={0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD2,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xD3,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDA,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB}; +static const uint8_t byte1Lookup[256]={0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D}; +static const uint8_t byte2Lookup[256]={0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6}; +*/ + +// New version uses one large LUT as its faster index into sequential bytes for the GRB pattern +static const uint8_t encoderLookup[256*3]={ 0x92,0x49,0x24,0x92,0x49,0x26,0x92,0x49,0x34,0x92,0x49,0x36,0x92,0x49,0xA4,0x92,0x49,0xA6,0x92,0x49,0xB4,0x92,0x49,0xB6,0x92,0x4D,0x24,0x92,0x4D,0x26,0x92,0x4D,0x34,0x92,0x4D,0x36,0x92,0x4D,0xA4,0x92,0x4D,0xA6,0x92,0x4D,0xB4,0x92,0x4D,0xB6,0x92,0x69,0x24,0x92,0x69,0x26,0x92,0x69,0x34,0x92,0x69,0x36,0x92,0x69,0xA4,0x92,0x69,0xA6,0x92,0x69,0xB4,0x92,0x69,0xB6,0x92,0x6D,0x24,0x92,0x6D,0x26,0x92,0x6D,0x34,0x92,0x6D,0x36,0x92,0x6D,0xA4,0x92,0x6D,0xA6,0x92,0x6D,0xB4,0x92,0x6D,0xB6,0x93,0x49,0x24,0x93,0x49,0x26,0x93,0x49,0x34,0x93,0x49,0x36,0x93,0x49,0xA4,0x93,0x49,0xA6,0x93,0x49,0xB4,0x93,0x49,0xB6,0x93,0x4D,0x24,0x93,0x4D,0x26,0x93,0x4D,0x34,0x93,0x4D,0x36,0x93,0x4D,0xA4,0x93,0x4D,0xA6,0x93,0x4D,0xB4,0x93,0x4D,0xB6,0x93,0x69,0x24,0x93,0x69,0x26,0x93,0x69,0x34,0x93,0x69,0x36,0x93,0x69,0xA4,0x93,0x69,0xA6,0x93,0x69,0xB4,0x93,0x69,0xB6,0x93,0x6D,0x24,0x93,0x6D,0x26,0x93,0x6D,0x34,0x93,0x6D,0x36,0x93,0x6D,0xA4,0x93,0x6D,0xA6,0x93,0x6D,0xB4,0x93,0x6D,0xB6,0x9A,0x49,0x24,0x9A,0x49,0x26,0x9A,0x49,0x34,0x9A,0x49,0x36,0x9A,0x49,0xA4,0x9A,0x49,0xA6,0x9A,0x49,0xB4,0x9A,0x49,0xB6,0x9A,0x4D,0x24,0x9A,0x4D,0x26,0x9A,0x4D,0x34,0x9A,0x4D,0x36,0x9A,0x4D,0xA4,0x9A,0x4D,0xA6,0x9A,0x4D,0xB4,0x9A,0x4D,0xB6,0x9A,0x69,0x24,0x9A,0x69,0x26,0x9A,0x69,0x34,0x9A,0x69,0x36,0x9A,0x69,0xA4,0x9A,0x69,\ + 0xA6,0x9A,0x69,0xB4,0x9A,0x69,0xB6,0x9A,0x6D,0x24,0x9A,0x6D,0x26,0x9A,0x6D,0x34,0x9A,0x6D,0x36,0x9A,0x6D,0xA4,0x9A,0x6D,0xA6,0x9A,0x6D,0xB4,0x9A,0x6D,0xB6,0x9B,0x49,0x24,0x9B,0x49,0x26,0x9B,0x49,0x34,0x9B,0x49,0x36,0x9B,0x49,0xA4,0x9B,0x49,0xA6,0x9B,0x49,0xB4,0x9B,0x49,0xB6,0x9B,0x4D,0x24,0x9B,0x4D,0x26,0x9B,0x4D,0x34,0x9B,0x4D,0x36,0x9B,0x4D,0xA4,0x9B,0x4D,0xA6,0x9B,0x4D,0xB4,0x9B,0x4D,0xB6,0x9B,0x69,0x24,0x9B,0x69,0x26,0x9B,0x69,0x34,0x9B,0x69,0x36,0x9B,0x69,0xA4,0x9B,0x69,0xA6,0x9B,0x69,0xB4,0x9B,0x69,0xB6,0x9B,0x6D,0x24,0x9B,0x6D,0x26,0x9B,0x6D,0x34,0x9B,0x6D,0x36,0x9B,0x6D,0xA4,0x9B,0x6D,0xA6,0x9B,0x6D,0xB4,0x9B,0x6D,0xB6,0xD2,0x49,0x24,0xD2,0x49,0x26,0xD2,0x49,0x34,0xD2,0x49,0x36,0xD2,0x49,0xA4,0xD2,0x49,0xA6,0xD2,0x49,0xB4,0xD2,0x49,0xB6,0xD2,0x4D,0x24,0xD2,0x4D,0x26,0xD2,0x4D,0x34,0xD2,0x4D,0x36,0xD2,0x4D,0xA4,0xD2,0x4D,0xA6,0xD2,0x4D,0xB4,0xD2,0x4D,0xB6,0xD2,0x69,0x24,0xD2,0x69,0x26,0xD2,0x69,0x34,0xD2,0x69,0x36,0xD2,0x69,0xA4,0xD2,0x69,0xA6,0xD2,0x69,0xB4,0xD2,0x69,0xB6,0xD2,0x6D,0x24,0xD2,0x6D,0x26,0xD2,0x6D,0x34,0xD2,0x6D,0x36,0xD2,0x6D,0xA4,0xD2,0x6D,0xA6,0xD2,0x6D,0xB4,0xD2,0x6D,0xB6,0xD3,0x49,0x24,0xD3,0x49,0x26,0xD3,0x49,0x34,0xD3,0x49,0x36,0xD3,0x49,0xA4,0xD3,0x49,0xA6,0xD3,0x49,0xB4,0xD3,0x49,0xB6,0xD3,0x4D,0x24,0xD3,0x4D,0x26,0xD3,0x4D,0x34,0xD3,\ + 0x4D,0x36,0xD3,0x4D,0xA4,0xD3,0x4D,0xA6,0xD3,0x4D,0xB4,0xD3,0x4D,0xB6,0xD3,0x69,0x24,0xD3,0x69,0x26,0xD3,0x69,0x34,0xD3,0x69,0x36,0xD3,0x69,0xA4,0xD3,0x69,0xA6,0xD3,0x69,0xB4,0xD3,0x69,0xB6,0xD3,0x6D,0x24,0xD3,0x6D,0x26,0xD3,0x6D,0x34,0xD3,0x6D,0x36,0xD3,0x6D,0xA4,0xD3,0x6D,0xA6,0xD3,0x6D,0xB4,0xD3,0x6D,0xB6,0xDA,0x49,0x24,0xDA,0x49,0x26,0xDA,0x49,0x34,0xDA,0x49,0x36,0xDA,0x49,0xA4,0xDA,0x49,0xA6,0xDA,0x49,0xB4,0xDA,0x49,0xB6,0xDA,0x4D,0x24,0xDA,0x4D,0x26,0xDA,0x4D,0x34,0xDA,0x4D,0x36,0xDA,0x4D,0xA4,0xDA,0x4D,0xA6,0xDA,0x4D,0xB4,0xDA,0x4D,0xB6,0xDA,0x69,0x24,0xDA,0x69,0x26,0xDA,0x69,0x34,0xDA,0x69,0x36,0xDA,0x69,0xA4,0xDA,0x69,0xA6,0xDA,0x69,0xB4,0xDA,0x69,0xB6,0xDA,0x6D,0x24,0xDA,0x6D,0x26,0xDA,0x6D,0x34,0xDA,0x6D,0x36,0xDA,0x6D,0xA4,0xDA,0x6D,0xA6,0xDA,0x6D,0xB4,0xDA,0x6D,0xB6,0xDB,0x49,0x24,0xDB,0x49,0x26,0xDB,0x49,0x34,0xDB,0x49,0x36,0xDB,0x49,0xA4,0xDB,0x49,0xA6,0xDB,0x49,0xB4,0xDB,0x49,0xB6,0xDB,0x4D,0x24,0xDB,0x4D,0x26,0xDB,0x4D,0x34,0xDB,0x4D,0x36,0xDB,0x4D,0xA4,0xDB,0x4D,0xA6,0xDB,0x4D,0xB4,0xDB,0x4D,0xB6,0xDB,0x69,0x24,0xDB,0x69,0x26,0xDB,0x69,0x34,0xDB,0x69,0x36,0xDB,0x69,0xA4,0xDB,0x69,0xA6,0xDB,0x69,0xB4,0xDB,0x69,0xB6,0xDB,0x6D,0x24,0xDB,0x6D,0x26,0xDB,0x6D,0x34,0xDB,0x6D,0x36,0xDB,0x6D,0xA4,0xDB,0x6D,0xA6,0xDB,0x6D,0xB4,0xDB,0x6D,0xB6}; + +class WS2812B { + public: + + // Constructor: number of LEDs + WS2812B (uint16_t number_of_leds);// Constuctor + ~WS2812B(); + void + begin(void), + show(void), + setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b), + // setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w), + setPixelColor(uint16_t n, uint32_t c), + setBrightness(uint8_t), + clear(), + updateLength(uint16_t n); + uint8_t +// *getPixels(void) const, + getBrightness(void) const; + uint16_t + numPixels(void) const; + static uint32_t + Color(uint8_t r, uint8_t g, uint8_t b), + Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w); + // uint32_t + // getPixelColor(uint16_t n) const; + inline bool + canShow(void) { return (micros() - endTime) >= 300L; } + + private: + + boolean + begun; // true if begin() previously called + uint16_t + numLEDs, // Number of RGB LEDs in strip + numBytes; // Size of 'pixels' buffer + + uint8_t + brightness, + *pixels, // Holds the current LED color values, which the external API calls interact with 9 bytes per pixel + start + end empty bytes + *doubleBuffer, // Holds the start of the double buffer (1 buffer for async DMA transfer and one for the API interaction. + rOffset, // Index of red byte within each 3- or 4-byte pixel + gOffset, // Index of green byte + bOffset, // Index of blue byte + wOffset; // Index of white byte (same as rOffset if no white) + uint32_t + endTime; // Latch timing reference +}; + + +#endif // WS2812B_H From aef93f74cde8f1127eb9b4c571d9f8fe910854b8 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 13 Jun 2017 10:39:42 +1000 Subject: [PATCH 116/307] Moved encoderLookup LUT from flash to RAM to give 30% speed increase of setPixelColor() - at the expense of 768 bytes of RAM --- STM32F1/libraries/WS2812B/src/WS2812B.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/WS2812B/src/WS2812B.h b/STM32F1/libraries/WS2812B/src/WS2812B.h index 30bc8753a..3a6bcb60c 100644 --- a/STM32F1/libraries/WS2812B/src/WS2812B.h +++ b/STM32F1/libraries/WS2812B/src/WS2812B.h @@ -25,7 +25,7 @@ static const uint8_t byte2Lookup[256]={0x24,0x26,0x34,0x36,0xA4,0xA6,0xB4,0xB6,0 */ // New version uses one large LUT as its faster index into sequential bytes for the GRB pattern -static const uint8_t encoderLookup[256*3]={ 0x92,0x49,0x24,0x92,0x49,0x26,0x92,0x49,0x34,0x92,0x49,0x36,0x92,0x49,0xA4,0x92,0x49,0xA6,0x92,0x49,0xB4,0x92,0x49,0xB6,0x92,0x4D,0x24,0x92,0x4D,0x26,0x92,0x4D,0x34,0x92,0x4D,0x36,0x92,0x4D,0xA4,0x92,0x4D,0xA6,0x92,0x4D,0xB4,0x92,0x4D,0xB6,0x92,0x69,0x24,0x92,0x69,0x26,0x92,0x69,0x34,0x92,0x69,0x36,0x92,0x69,0xA4,0x92,0x69,0xA6,0x92,0x69,0xB4,0x92,0x69,0xB6,0x92,0x6D,0x24,0x92,0x6D,0x26,0x92,0x6D,0x34,0x92,0x6D,0x36,0x92,0x6D,0xA4,0x92,0x6D,0xA6,0x92,0x6D,0xB4,0x92,0x6D,0xB6,0x93,0x49,0x24,0x93,0x49,0x26,0x93,0x49,0x34,0x93,0x49,0x36,0x93,0x49,0xA4,0x93,0x49,0xA6,0x93,0x49,0xB4,0x93,0x49,0xB6,0x93,0x4D,0x24,0x93,0x4D,0x26,0x93,0x4D,0x34,0x93,0x4D,0x36,0x93,0x4D,0xA4,0x93,0x4D,0xA6,0x93,0x4D,0xB4,0x93,0x4D,0xB6,0x93,0x69,0x24,0x93,0x69,0x26,0x93,0x69,0x34,0x93,0x69,0x36,0x93,0x69,0xA4,0x93,0x69,0xA6,0x93,0x69,0xB4,0x93,0x69,0xB6,0x93,0x6D,0x24,0x93,0x6D,0x26,0x93,0x6D,0x34,0x93,0x6D,0x36,0x93,0x6D,0xA4,0x93,0x6D,0xA6,0x93,0x6D,0xB4,0x93,0x6D,0xB6,0x9A,0x49,0x24,0x9A,0x49,0x26,0x9A,0x49,0x34,0x9A,0x49,0x36,0x9A,0x49,0xA4,0x9A,0x49,0xA6,0x9A,0x49,0xB4,0x9A,0x49,0xB6,0x9A,0x4D,0x24,0x9A,0x4D,0x26,0x9A,0x4D,0x34,0x9A,0x4D,0x36,0x9A,0x4D,0xA4,0x9A,0x4D,0xA6,0x9A,0x4D,0xB4,0x9A,0x4D,0xB6,0x9A,0x69,0x24,0x9A,0x69,0x26,0x9A,0x69,0x34,0x9A,0x69,0x36,0x9A,0x69,0xA4,0x9A,0x69,\ +static uint8_t encoderLookup[256*3]={ 0x92,0x49,0x24,0x92,0x49,0x26,0x92,0x49,0x34,0x92,0x49,0x36,0x92,0x49,0xA4,0x92,0x49,0xA6,0x92,0x49,0xB4,0x92,0x49,0xB6,0x92,0x4D,0x24,0x92,0x4D,0x26,0x92,0x4D,0x34,0x92,0x4D,0x36,0x92,0x4D,0xA4,0x92,0x4D,0xA6,0x92,0x4D,0xB4,0x92,0x4D,0xB6,0x92,0x69,0x24,0x92,0x69,0x26,0x92,0x69,0x34,0x92,0x69,0x36,0x92,0x69,0xA4,0x92,0x69,0xA6,0x92,0x69,0xB4,0x92,0x69,0xB6,0x92,0x6D,0x24,0x92,0x6D,0x26,0x92,0x6D,0x34,0x92,0x6D,0x36,0x92,0x6D,0xA4,0x92,0x6D,0xA6,0x92,0x6D,0xB4,0x92,0x6D,0xB6,0x93,0x49,0x24,0x93,0x49,0x26,0x93,0x49,0x34,0x93,0x49,0x36,0x93,0x49,0xA4,0x93,0x49,0xA6,0x93,0x49,0xB4,0x93,0x49,0xB6,0x93,0x4D,0x24,0x93,0x4D,0x26,0x93,0x4D,0x34,0x93,0x4D,0x36,0x93,0x4D,0xA4,0x93,0x4D,0xA6,0x93,0x4D,0xB4,0x93,0x4D,0xB6,0x93,0x69,0x24,0x93,0x69,0x26,0x93,0x69,0x34,0x93,0x69,0x36,0x93,0x69,0xA4,0x93,0x69,0xA6,0x93,0x69,0xB4,0x93,0x69,0xB6,0x93,0x6D,0x24,0x93,0x6D,0x26,0x93,0x6D,0x34,0x93,0x6D,0x36,0x93,0x6D,0xA4,0x93,0x6D,0xA6,0x93,0x6D,0xB4,0x93,0x6D,0xB6,0x9A,0x49,0x24,0x9A,0x49,0x26,0x9A,0x49,0x34,0x9A,0x49,0x36,0x9A,0x49,0xA4,0x9A,0x49,0xA6,0x9A,0x49,0xB4,0x9A,0x49,0xB6,0x9A,0x4D,0x24,0x9A,0x4D,0x26,0x9A,0x4D,0x34,0x9A,0x4D,0x36,0x9A,0x4D,0xA4,0x9A,0x4D,0xA6,0x9A,0x4D,0xB4,0x9A,0x4D,0xB6,0x9A,0x69,0x24,0x9A,0x69,0x26,0x9A,0x69,0x34,0x9A,0x69,0x36,0x9A,0x69,0xA4,0x9A,0x69,\ 0xA6,0x9A,0x69,0xB4,0x9A,0x69,0xB6,0x9A,0x6D,0x24,0x9A,0x6D,0x26,0x9A,0x6D,0x34,0x9A,0x6D,0x36,0x9A,0x6D,0xA4,0x9A,0x6D,0xA6,0x9A,0x6D,0xB4,0x9A,0x6D,0xB6,0x9B,0x49,0x24,0x9B,0x49,0x26,0x9B,0x49,0x34,0x9B,0x49,0x36,0x9B,0x49,0xA4,0x9B,0x49,0xA6,0x9B,0x49,0xB4,0x9B,0x49,0xB6,0x9B,0x4D,0x24,0x9B,0x4D,0x26,0x9B,0x4D,0x34,0x9B,0x4D,0x36,0x9B,0x4D,0xA4,0x9B,0x4D,0xA6,0x9B,0x4D,0xB4,0x9B,0x4D,0xB6,0x9B,0x69,0x24,0x9B,0x69,0x26,0x9B,0x69,0x34,0x9B,0x69,0x36,0x9B,0x69,0xA4,0x9B,0x69,0xA6,0x9B,0x69,0xB4,0x9B,0x69,0xB6,0x9B,0x6D,0x24,0x9B,0x6D,0x26,0x9B,0x6D,0x34,0x9B,0x6D,0x36,0x9B,0x6D,0xA4,0x9B,0x6D,0xA6,0x9B,0x6D,0xB4,0x9B,0x6D,0xB6,0xD2,0x49,0x24,0xD2,0x49,0x26,0xD2,0x49,0x34,0xD2,0x49,0x36,0xD2,0x49,0xA4,0xD2,0x49,0xA6,0xD2,0x49,0xB4,0xD2,0x49,0xB6,0xD2,0x4D,0x24,0xD2,0x4D,0x26,0xD2,0x4D,0x34,0xD2,0x4D,0x36,0xD2,0x4D,0xA4,0xD2,0x4D,0xA6,0xD2,0x4D,0xB4,0xD2,0x4D,0xB6,0xD2,0x69,0x24,0xD2,0x69,0x26,0xD2,0x69,0x34,0xD2,0x69,0x36,0xD2,0x69,0xA4,0xD2,0x69,0xA6,0xD2,0x69,0xB4,0xD2,0x69,0xB6,0xD2,0x6D,0x24,0xD2,0x6D,0x26,0xD2,0x6D,0x34,0xD2,0x6D,0x36,0xD2,0x6D,0xA4,0xD2,0x6D,0xA6,0xD2,0x6D,0xB4,0xD2,0x6D,0xB6,0xD3,0x49,0x24,0xD3,0x49,0x26,0xD3,0x49,0x34,0xD3,0x49,0x36,0xD3,0x49,0xA4,0xD3,0x49,0xA6,0xD3,0x49,0xB4,0xD3,0x49,0xB6,0xD3,0x4D,0x24,0xD3,0x4D,0x26,0xD3,0x4D,0x34,0xD3,\ 0x4D,0x36,0xD3,0x4D,0xA4,0xD3,0x4D,0xA6,0xD3,0x4D,0xB4,0xD3,0x4D,0xB6,0xD3,0x69,0x24,0xD3,0x69,0x26,0xD3,0x69,0x34,0xD3,0x69,0x36,0xD3,0x69,0xA4,0xD3,0x69,0xA6,0xD3,0x69,0xB4,0xD3,0x69,0xB6,0xD3,0x6D,0x24,0xD3,0x6D,0x26,0xD3,0x6D,0x34,0xD3,0x6D,0x36,0xD3,0x6D,0xA4,0xD3,0x6D,0xA6,0xD3,0x6D,0xB4,0xD3,0x6D,0xB6,0xDA,0x49,0x24,0xDA,0x49,0x26,0xDA,0x49,0x34,0xDA,0x49,0x36,0xDA,0x49,0xA4,0xDA,0x49,0xA6,0xDA,0x49,0xB4,0xDA,0x49,0xB6,0xDA,0x4D,0x24,0xDA,0x4D,0x26,0xDA,0x4D,0x34,0xDA,0x4D,0x36,0xDA,0x4D,0xA4,0xDA,0x4D,0xA6,0xDA,0x4D,0xB4,0xDA,0x4D,0xB6,0xDA,0x69,0x24,0xDA,0x69,0x26,0xDA,0x69,0x34,0xDA,0x69,0x36,0xDA,0x69,0xA4,0xDA,0x69,0xA6,0xDA,0x69,0xB4,0xDA,0x69,0xB6,0xDA,0x6D,0x24,0xDA,0x6D,0x26,0xDA,0x6D,0x34,0xDA,0x6D,0x36,0xDA,0x6D,0xA4,0xDA,0x6D,0xA6,0xDA,0x6D,0xB4,0xDA,0x6D,0xB6,0xDB,0x49,0x24,0xDB,0x49,0x26,0xDB,0x49,0x34,0xDB,0x49,0x36,0xDB,0x49,0xA4,0xDB,0x49,0xA6,0xDB,0x49,0xB4,0xDB,0x49,0xB6,0xDB,0x4D,0x24,0xDB,0x4D,0x26,0xDB,0x4D,0x34,0xDB,0x4D,0x36,0xDB,0x4D,0xA4,0xDB,0x4D,0xA6,0xDB,0x4D,0xB4,0xDB,0x4D,0xB6,0xDB,0x69,0x24,0xDB,0x69,0x26,0xDB,0x69,0x34,0xDB,0x69,0x36,0xDB,0x69,0xA4,0xDB,0x69,0xA6,0xDB,0x69,0xB4,0xDB,0x69,0xB6,0xDB,0x6D,0x24,0xDB,0x6D,0x26,0xDB,0x6D,0x34,0xDB,0x6D,0x36,0xDB,0x6D,0xA4,0xDB,0x6D,0xA6,0xDB,0x6D,0xB4,0xDB,0x6D,0xB6}; From f58a96e0f62aaa1415a3816fa0fb2d2bc5742950 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sun, 18 Jun 2017 17:27:02 +0200 Subject: [PATCH 117/307] implemented SDIO + small changes in DMA - reworked get and clear ISR bits + wirish_time compatible with "C" --- .gitignore | 1 + STM32F4/cores/maple/libmaple/dmaF4.c | 12 +- STM32F4/cores/maple/libmaple/dmaF4.h | 159 ++++++++++------- STM32F4/cores/maple/libmaple/sdio.c | 194 +++++++++++++++++++++ STM32F4/cores/maple/libmaple/sdio.h | 250 +++++++++++++++++++++++++++ STM32F4/cores/maple/wirish_time.h | 8 + 6 files changed, 555 insertions(+), 69 deletions(-) create mode 100644 STM32F4/cores/maple/libmaple/sdio.c create mode 100644 STM32F4/cores/maple/libmaple/sdio.h diff --git a/.gitignore b/.gitignore index 05bb0a597..b538f89ed 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ other/maple-bootloader/build other/maple-bootloader/*~ *.o tools/src/stm32flash_serial/src/parsers/parsers.a +*.bak diff --git a/STM32F4/cores/maple/libmaple/dmaF4.c b/STM32F4/cores/maple/libmaple/dmaF4.c index add3d8e51..173f3a222 100644 --- a/STM32F4/cores/maple/libmaple/dmaF4.c +++ b/STM32F4/cores/maple/libmaple/dmaF4.c @@ -119,14 +119,14 @@ void dma_detach_interrupt(dma_dev *dev, dma_stream stream) { const uint8 dma_isr_bits_shift[] = { 0, 6, 16, 22}; -uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream) { - if ( stream&0xFC ) return ((dev->regs->HISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; - else return ((dev->regs->LISR)>>dma_isr_bits_shift[stream&0x03]) & 0x3d; +uint8 dma_get_isr_bit(dma_dev *dev, dma_stream stream, uint8_t mask) { + if ( stream&0xFC ) return ((dev->regs->HISR)>>dma_isr_bits_shift[stream&0x03]) & mask; + else return ((dev->regs->LISR)>>dma_isr_bits_shift[stream&0x03]) & mask; } -void dma_clear_isr_bits(dma_dev *dev, dma_stream stream) { - if ( stream&0xFC ) dev->regs->HIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; - else dev->regs->LIFCR = (uint32)0x0000003d << dma_isr_bits_shift[stream&0x03]; +void dma_clear_isr_bit(dma_dev *dev, dma_stream stream, uint8_t mask) { + if ( stream&0xFC ) dev->regs->HIFCR = (uint32)mask << dma_isr_bits_shift[stream&0x03]; + else dev->regs->LIFCR = (uint32)mask << dma_isr_bits_shift[stream&0x03]; } /* diff --git a/STM32F4/cores/maple/libmaple/dmaF4.h b/STM32F4/cores/maple/libmaple/dmaF4.h index 757906c82..cb2376069 100644 --- a/STM32F4/cores/maple/libmaple/dmaF4.h +++ b/STM32F4/cores/maple/libmaple/dmaF4.h @@ -62,30 +62,30 @@ typedef struct dma_stream_t { __io uint32 PAR; /**< Stream peripheral address register */ __io uint32 M0AR; /**< Stream memory address register 0 */ __io uint32 M1AR; /**< Stream memory address register 1 */ - __io uint32 FCR; /**< Stream FIFO configuration register */ + __io uint32 FCR; /**< Stream FIFO configuration register */ } dma_stream_t; /** * @brief DMA register map type. * */ typedef struct dma_reg_map { - __io uint32 LISR; /**< Low interrupt status register */ - __io uint32 HISR; /**< High interrupt status register */ - __io uint32 LIFCR; /**< Low interrupt flag clear register */ - __io uint32 HIFCR; /**< High interrupt flag clear register */ - dma_stream_t STREAM[8]; + __io uint32 LISR; /**< Low interrupt status register */ + __io uint32 HISR; /**< High interrupt status register */ + __io uint32 LIFCR; /**< Low interrupt flag clear register */ + __io uint32 HIFCR; /**< High interrupt flag clear register */ + dma_stream_t STREAM[8]; } dma_reg_map; /** DMA controller register map base pointers */ #define DMA1_BASE ((struct dma_reg_map*)0x40026000) #define DMA2_BASE ((struct dma_reg_map*)0x40026400) + /* * Register bit definitions */ -/* Stream configuration register */ - +// Stream configuration register #define DMA_CR_CH0 (0x0 << 25) #define DMA_CR_CH1 (0x1 << 25) #define DMA_CR_CH2 (0x2 << 25) @@ -134,7 +134,34 @@ typedef struct dma_reg_map { #define DMA_CR_HTIE (0x1 << 3) #define DMA_CR_TEIE (0x1 << 2) #define DMA_CR_DMEIE (0x1 << 1) -#define DMA_CR_EN (0x1) +#define DMA_CR_EN (0x1 << 0) + +// Device interrupt status register flags +#define DMA_ISR_TCIF (1 << 5) +#define DMA_ISR_HTIF (1 << 4) +#define DMA_ISR_TEIF (1 << 3) +#define DMA_ISR_DMEIF (1 << 2) +#define DMA_ISR_FEIF (1 << 0) + +#define DMA_ISR_ERROR_BITS (DMA_ISR_TEIF | DMA_ISR_DMEIF | DMA_ISR_FEIF) +#define DMA_ISR_BIT_MASK 0x3D + +// FIFO control register flags +#define DMA_FCR_FEIE (0x1 << 7) // FIFO error interrupt enable +#define DMA_FCR_FS (0x7 << 3) // FIFO status (READ_ONLY): +#define DMA_FCR_FS_LEVEL_1 (0x0 << 3) // 000: 0 < fifo_level < 1/4 +#define DMA_FCR_FS_LEVEL_2 (0x1 << 3) // 001: 1/4 ≤ fifo_level < 1/2 +#define DMA_FCR_FS_LEVEL_3 (0x2 << 3) // 010: 1/2 ≤ fifo_level < 3/4 +#define DMA_FCR_FS_LEVEL_4 (0x3 << 3) // 011: 3/4 ≤ fifo_level < full +#define DMA_FCR_FS_EMPTY (0x4 << 3) // 100: FIFO is empty +#define DMA_FCR_FS_FULL (0x5 << 3) // 101: FIFO is full +#define DMA_FCR_DMDIS (0x1 << 2) // Direct mode disable +#define DMA_FCR_FTH (0x3 << 0) // FIFO threshold selection +#define DMA_FCR_FTH_1_4 (0x0 << 0) // 1/4 full FIFO +#define DMA_FCR_FTH_2_4 (0x1 << 0) // 2/4 full FIFO +#define DMA_FCR_FTH_3_4 (0x2 << 0) // 3/4 full FIFO +#define DMA_FCR_FTH_FULL (0x3 << 0) // full FIFO + typedef enum dma_channel { DMA_CH0 = DMA_CR_CH0, /**< Channel 0 */ @@ -147,18 +174,6 @@ typedef enum dma_channel { DMA_CH7 = DMA_CR_CH7, /**< Channel 7 */ } dma_channel; -/* Device interrupt status register flags */ - -#define DMA_ISR_TCIF (1 << 5) -#define DMA_ISR_HTIF (1 << 4) -#define DMA_ISR_TEIF (1 << 3) -#define DMA_ISR_DMEIF (1 << 2) -#define DMA_ISR_FEIF (1 << 0) - -/* - * Devices - */ - /** Encapsulates state related to a DMA channel interrupt. */ typedef struct dma_handler_config { void (*handler)(void); /**< User-specified channel interrupt @@ -172,50 +187,53 @@ typedef struct dma_dev { rcc_clk_id clk_id; /**< Clock ID */ dma_handler_config handlers[]; /**< * @brief IRQ handlers and NVIC numbers. - * - * @see dma_attach_interrupt() * @see dma_detach_interrupt() */ } dma_dev; -extern dma_dev *DMA1; -extern dma_dev *DMA2; - /* - * Convenience functions + * Devices */ - -extern void dma_init(dma_dev *dev); +extern dma_dev *DMA1; +extern dma_dev *DMA2; /** Flags for DMA transfer configuration. */ typedef enum dma_mode_flags { - DMA_MEM_BUF_0 = DMA_CR_CT0, /**< Current memory target buffer 0 */ - DMA_MEM_BUF_1 = DMA_CR_CT1, /**< Current memory target buffer 1 */ - DMA_DBL_BUF_MODE = DMA_CR_DBM, /**< Current memory double buffer mode */ - DMA_PINC_OFFSET = DMA_CR_PINCOS, /**< Peripheral increment offset size */ - DMA_MINC_MODE = DMA_CR_MINC, /**< Memory increment mode */ - DMA_PINC_MODE = DMA_CR_PINC, /**< Peripheral increment mode */ - DMA_CIRC_MODE = DMA_CR_CIRC, /**< Memory Circular mode */ - DMA_FROM_PER = DMA_CR_DIR_P2M, /**< Read from memory to peripheral */ - DMA_FROM_MEM = DMA_CR_DIR_M2P, /**< Read from memory to peripheral */ - DMA_MEM_TO_MEM = DMA_CR_DIR_M2M, /**< Read from memory to memory */ - DMA_PERIF_CTRL = DMA_CR_PFCTRL, /**< Peripheral flow controller */ + DMA_MEM_BUF_0 = DMA_CR_CT0, /**< Current memory target buffer 0 */ + DMA_MEM_BUF_1 = DMA_CR_CT1, /**< Current memory target buffer 1 */ + DMA_DBL_BUF_MODE = DMA_CR_DBM, /**< Current memory double buffer mode */ + DMA_PINC_OFFSET = DMA_CR_PINCOS, /**< Peripheral increment offset size */ + DMA_MINC_MODE = DMA_CR_MINC, /**< Memory increment mode */ + DMA_PINC_MODE = DMA_CR_PINC, /**< Peripheral increment mode */ + DMA_CIRC_MODE = DMA_CR_CIRC, /**< Memory Circular mode */ + DMA_FROM_PER = DMA_CR_DIR_P2M, /**< Read from memory to peripheral */ + DMA_FROM_MEM = DMA_CR_DIR_M2P, /**< Read from memory to peripheral */ + DMA_MEM_TO_MEM = DMA_CR_DIR_M2M, /**< Read from memory to memory */ + DMA_PERIF_CTRL = DMA_CR_PFCTRL, /**< Peripheral flow controller */ DMA_PRIO_MEDIUM = DMA_CR_PL_MEDIUM, /**< Medium priority */ DMA_PRIO_HIGH = DMA_CR_PL_HIGH, /**< High priority */ DMA_PRIO_VERY_HIGH = DMA_CR_PL_VERY_HIGH, /**< Very high priority */ - DMA_TRNS_CMPLT = DMA_CR_TCIE, /**< Interrupt on transfer completion */ - DMA_TRNS_HALF = DMA_CR_HTIE, /**< Interrupt on half-transfer */ + DMA_TRNS_CMPLT = DMA_CR_TCIE, /**< Interrupt on transfer completion */ + DMA_TRNS_HALF = DMA_CR_HTIE, /**< Interrupt on half-transfer */ DMA_TRNS_ERR = DMA_CR_TEIE, /**< Interrupt on transfer error */ DMA_DIR_MODE_ERR = DMA_CR_DMEIE /**< Interrupt on direct mode error */ } dma_mode_flags; -/** Source and destination transfer sizes. */ +// Source and destination transfer sizes. typedef enum dma_xfer_size { - DMA_SIZE_8BITS = ( DMA_CR_MSIZE_8BITS|DMA_CR_PSIZE_8BITS ), /**< 8-bit transfers */ - DMA_SIZE_16BITS = (DMA_CR_MSIZE_16BITS|DMA_CR_PSIZE_16BITS), /**< 16-bit transfers */ - DMA_SIZE_32BITS = (DMA_CR_MSIZE_32BITS|DMA_CR_PSIZE_32BITS) /**< 32-bit transfers */ + DMA_SIZE_8BITS = ( DMA_CR_MSIZE_8BITS|DMA_CR_PSIZE_8BITS ), // 8-bit transfers + DMA_SIZE_16BITS = (DMA_CR_MSIZE_16BITS|DMA_CR_PSIZE_16BITS), // 16-bit transfers + DMA_SIZE_32BITS = (DMA_CR_MSIZE_32BITS|DMA_CR_PSIZE_32BITS) // 32-bit transfers } dma_xfer_size; +// Source and destination burst sizes. +typedef enum dma_burst_size { + DMA_BURST_INCR0 = ( DMA_CR_MBURST0|DMA_CR_PBURST0 ), // single transfer + DMA_BURST_INCR4 = ( DMA_CR_MBURST4|DMA_CR_PBURST4 ), // incremental burst of 4 beats + DMA_BURST_INCR8 = ( DMA_CR_MBURST8|DMA_CR_PBURST8 ), // incremental burst of 8 beats + DMA_BURST_INCR16 = (DMA_CR_MBURST16|DMA_CR_PBURST16) // incremental burst of 16 beats +} dma_burst_size; + /** DMA channel */ typedef enum dma_stream { DMA_STREAM0 = 0, /**< Stream 0 */ @@ -227,7 +245,12 @@ typedef enum dma_stream { DMA_STREAM6 = 6, /**< Stream 6 */ DMA_STREAM7 = 7, /**< Stream 7 */ } dma_stream; - + +/* + * Convenience functions + */ +extern void dma_init(dma_dev *dev); + static inline void dma_setup_transfer(dma_dev *dev, dma_stream stream, dma_channel channel, @@ -235,24 +258,24 @@ static inline void dma_setup_transfer(dma_dev *dev, __io void *peripheral_address, __io void *memory_address0, __io void *memory_address1, - uint32 flags) { + uint32 flags) +{ dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; // disable + while( (dev->regs->STREAM[stream].CR)&DMA_CR_EN ); // wait till enable bit is cleared dev->regs->STREAM[stream].PAR = (uint32)peripheral_address; dev->regs->STREAM[stream].M0AR = (uint32)memory_address0; dev->regs->STREAM[stream].M1AR = (uint32)memory_address1; - dev->regs->STREAM[stream].CR = ((flags|channel|trx_size) & 0x0feffffe); // mask out reserved and enable + dev->regs->STREAM[stream].CR = (uint32)((flags|channel|trx_size) & 0x0feffffe); // mask out reserved and enable } -static inline void dma_set_num_transfers(dma_dev *dev, - dma_stream stream, - uint16 num_transfers) { - dev->regs->STREAM[stream].NDTR = num_transfers; +static inline void dma_set_num_transfers(dma_dev *dev, dma_stream stream, uint16 num_transfers) +{ + dev->regs->STREAM[stream].NDTR = (uint32)num_transfers; } -static inline void dma_set_fifo_flags(dma_dev *dev, - dma_stream stream, - uint8 fifo_flags) { - dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits +static inline void dma_set_fifo_flags(dma_dev *dev, dma_stream stream, uint8 fifo_flags) +{ + dev->regs->STREAM[stream].FCR = (uint32)(fifo_flags & 0x87); // mask out reserved bits } void dma_attach_interrupt(dma_dev *dev, @@ -261,12 +284,14 @@ void dma_attach_interrupt(dma_dev *dev, void dma_detach_interrupt(dma_dev *dev, dma_stream stream); -static inline void dma_enable(dma_dev *dev, dma_stream stream) { - dev->regs->STREAM[stream].CR |= DMA_CR_EN; +static inline void dma_enable(dma_dev *dev, dma_stream stream) +{ + dev->regs->STREAM[stream].CR |= (uint32)DMA_CR_EN; } -static inline void dma_disable(dma_dev *dev, dma_stream stream) { - dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; +static inline void dma_disable(dma_dev *dev, dma_stream stream) +{ + dev->regs->STREAM[stream].CR &= (uint32)(~DMA_CR_EN); while (dev->regs->STREAM[stream].CR & DMA_CR_EN); // wait till EN bit is reset, see AN4031, chapter 4.1 } @@ -289,7 +314,11 @@ static inline uint8 dma_is_stream_enabled(dma_dev *dev, dma_stream stream) { * @param dev DMA device * @param stream Stream whose ISR bits to return. */ -uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream); +uint8 dma_get_isr_bit(dma_dev *dev, dma_stream stream, uint8_t mask); + +static inline uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream) { + return dma_get_isr_bit(dev, stream, DMA_ISR_BIT_MASK); +} /** * @brief Clear the ISR status bits for a given DMA stream. @@ -297,7 +326,11 @@ uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream); * @param dev DMA device * @param stream Stream whose ISR bits to clear. */ -void dma_clear_isr_bits(dma_dev *dev, dma_stream stream); +void dma_clear_isr_bit(dma_dev *dev, dma_stream stream, uint8_t mask); + +static inline void dma_clear_isr_bits(dma_dev *dev, dma_stream stream) { + dma_clear_isr_bit(dev, stream, DMA_ISR_BIT_MASK); +} #ifdef __cplusplus } // extern "C" diff --git a/STM32F4/cores/maple/libmaple/sdio.c b/STM32F4/cores/maple/libmaple/sdio.c new file mode 100644 index 000000000..1a9113a7c --- /dev/null +++ b/STM32F4/cores/maple/libmaple/sdio.c @@ -0,0 +1,194 @@ +/****************************************************************************** + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file libmaple/sdio.c + * @author stevstrong + * @brief Secure digital input/output interface. + */ + +#include "sdio.h" +#include "gpio.h" +#include "wirish_time.h" + +#if defined(BOARD_generic_f407v) + +sdio_dev * SDIO = SDIO_BASE; + +#define DELAY_LONG 10 +#define DELAY_SHORT 1 + +uint8_t dly = DELAY_LONG; // microseconds delay after accessing registers + +/* + * SDIO convenience routines + */ +static void sdio_gpios_init(void) +{ + gpio_set_mode(BOARD_SDIO_D0, GPIO_AF_OUTPUT_PP_PU); + gpio_set_mode(BOARD_SDIO_D1, GPIO_AF_OUTPUT_PP_PU); + gpio_set_mode(BOARD_SDIO_D2, GPIO_AF_OUTPUT_PP_PU); + gpio_set_mode(BOARD_SDIO_D3, GPIO_AF_OUTPUT_PP_PU); + gpio_set_mode(BOARD_SDIO_CLK, GPIO_AF_OUTPUT_PP); + gpio_set_mode(BOARD_SDIO_CMD, GPIO_AF_OUTPUT_PP_PU); + // + gpio_set_af_mode(BOARD_SDIO_D0, 12); + gpio_set_af_mode(BOARD_SDIO_D1, 12); + gpio_set_af_mode(BOARD_SDIO_D2, 12); + gpio_set_af_mode(BOARD_SDIO_D3, 12); + gpio_set_af_mode(BOARD_SDIO_CLK, 12); + gpio_set_af_mode(BOARD_SDIO_CMD, 12); +} + +static void sdio_gpios_deinit(void) +{ + gpio_set_mode(BOARD_SDIO_D0, GPIO_INPUT_FLOATING); + gpio_set_mode(BOARD_SDIO_D1, GPIO_INPUT_FLOATING); + gpio_set_mode(BOARD_SDIO_D2, GPIO_INPUT_FLOATING); + gpio_set_mode(BOARD_SDIO_D3, GPIO_INPUT_FLOATING); + gpio_set_mode(BOARD_SDIO_CLK, GPIO_INPUT_FLOATING); + gpio_set_mode(BOARD_SDIO_CMD, GPIO_INPUT_FLOATING); + // + gpio_set_af_mode(BOARD_SDIO_D0, 0); + gpio_set_af_mode(BOARD_SDIO_D1, 0); + gpio_set_af_mode(BOARD_SDIO_D2, 0); + gpio_set_af_mode(BOARD_SDIO_D3, 0); + gpio_set_af_mode(BOARD_SDIO_CLK, 0); + gpio_set_af_mode(BOARD_SDIO_CMD, 0); +} + +/** + * @brief Initialize and reset the SDIO device. + */ +void sdio_init(void) +{ + rcc_clk_enable(RCC_SDIO); + rcc_reset_dev(RCC_SDIO); +} + +void sdio_power_on(void) +{ + SDIO->POWER = SDIO_POWER_PWRCTRL_ON; +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. + delayMicroseconds(DELAY_LONG); +} + +void sdio_power_off(void) +{ + SDIO->POWER = SDIO_POWER_PWRCTRL_OFF; +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. + delayMicroseconds(DELAY_LONG); +} + +/** + * @brief Enable the SDIO peripheral + +void sdio_peripheral_enable(void) { + bb_peri_set_bit(SDIO->CR1, SPI_CR1_SPE_BIT, 1); +} + */ +/** + * @brief Disable a SPI peripheral + +void sdio_peripheral_disable(spi_dev *dev) { + bb_peri_set_bit(&dev->regs->CR1, SPI_CR1_SPE_BIT, 0); +} + */ +void sdio_set_clock(uint32_t clk) +{ + if (clk>24000000UL) clk = 24000000UL; // limit the SDIO master clock to 24MHz + + if (clk<1000000) dly = DELAY_LONG; + else dly = DELAY_SHORT; + + sdio_disable(); + SDIO->CLKCR = (SDIO->CLKCR & (~(SDIO_CLKCR_CLKDIV|SDIO_CLKCR_BYPASS))) | SDIO_CLKCR_CLKEN | (((SDIOCLK/clk)-2)&SDIO_CLKCR_CLKDIV); + delayMicroseconds(dly); +} + +void sdio_set_dbus_width(uint16_t bus_w) +{ + SDIO->CLKCR = (SDIO->CLKCR & (~SDIO_CLKCR_WIDBUS)) | bus_w; + delayMicroseconds(dly); +} + +void sdio_set_dblock_size(uint8_t dbsize) +{ + SDIO->DCTRL = (SDIO->DCTRL&(~SDIO_DCTRL_DBLOCKSIZE)) | ((dbsize&0xF)<<4); + delayMicroseconds(dly); +} + +void sdio_enable(void) +{ + SDIO->CLKCR |= SDIO_CLKCR_CLKEN; + delayMicroseconds(dly); +} + +void sdio_disable(void) +{ + SDIO->CLKCR ^= SDIO_CLKCR_CLKEN; + delayMicroseconds(dly); +} + +/** + * @brief Configure and enable the SDIO device. + */ +void sdio_begin(void) +{ + sdio_gpios_init(); + sdio_init(); + sdio_power_on(); + // Set initial SCK rate. + sdio_set_clock(400000); + delayMicroseconds(200); // generate 80 pulses at 400kHz +} + +/** + * @brief Disables the SDIO device. + */ +void sdio_end(void) +{ + sdio_disable(); + while ( sdio_cmd_xfer_ongoing() ); + sdio_power_off(); + rcc_clk_disable(RCC_SDIO); + sdio_gpios_deinit(); +} + +/** + * @brief Send command by the SDIO device. + */ +uint8_t sdio_cmd_send(uint16_t cmd_index_resp_type, uint32_t arg) +{ + uint8_t retries = 10; // in case of errors + do { // retry command if errors detected + // clear interrupt flags - IMPORTANT!!! + SDIO->ICR = SDIO_ICR_CMD_FLAGS; + // write command + SDIO->ARG = arg; + SDIO->CMD = (uint32_t)(SDIO_CMD_CPSMEN | cmd_index_resp_type ); + while ( (SDIO->STA&SDIO_STA_CMDACT) ) ; // wait for actual command transfer to finish + // wait for response, if the case + if ( cmd_index_resp_type&(SDIO_CMD_WAIT_SHORT_RESP|SDIO_CMD_WAIT_LONG_RESP) ) { + while ( !(SDIO->STA&(SDIO_STA_CMDREND|SDIO_STA_CMD_ERROR_FLAGS)) ) ; + } else break; // no response required + if ( SDIO->STA&(SDIO_STA_CMDREND|SDIO_STA_CTIMEOUT) ) + break; // response received or timeout + // ignore CRC error for CMD5 and ACMD41 + if ( ((cmd_index_resp_type&SDIO_CMD_CMDINDEX)==5) || ((cmd_index_resp_type&SDIO_CMD_CMDINDEX)==41) ) + break; + } while ( (--retries) ); + return (uint8_t)retries; +} + +#endif // BOARD_generic_f407v diff --git a/STM32F4/cores/maple/libmaple/sdio.h b/STM32F4/cores/maple/libmaple/sdio.h new file mode 100644 index 000000000..f0afaa163 --- /dev/null +++ b/STM32F4/cores/maple/libmaple/sdio.h @@ -0,0 +1,250 @@ +/****************************************************************************** + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file sdio.h + * @brief Secure digital input/output interface. + */ + +#ifndef _SDIO_H_ +#define _SDIO_H_ + + +#include "libmaple_types.h" + + +#ifdef __cplusplus +extern "C"{ +#endif + +#ifdef STM32_HIGH_DENSITY + +/* + * Register maps and devices + */ + +// SDIO register map type +typedef struct sdio_reg_map { + __io uint32 POWER; // 0x00 + __io uint32 CLKCR; // 0x04 + __io uint32 ARG; // 0x08 + __io uint32 CMD; // 0x0C + __io uint32 RESPCMD; // 0x10 (0x3F) + const uint32 RESP[4]; // 0x14 - contain the card status, which is part of the received response. + __io uint32 DTIMER; // 0x24 - contains the data timeout period, in card bus clock periods. + __io uint32 DLEN; // 0x28 (0x01FF FFFF) - contains the number of data bytes to be transferred + __io uint32 DCTRL; // 0x2C + __io uint32 DCOUNT; // 0x30 (0x01FF FFFF) + __io uint32 STA; // 0x34 + __io uint32 ICR; // 0x38 + __io uint32 MASK; // 0x3C + const uint32 RESERVED1[2]; + __io uint32 FIFOCNT; // 0x48 (0x01FF FFFF) + const uint32 RESERVED2[13]; + __io uint32 FIFO; // 0x80 +} sdio_reg_map; +#define sdio_dev sdio_reg_map + +/** SDIO register map base pointer */ +#define SDIO_BASE ((struct sdio_reg_map*)0x40012C00) + +extern sdio_dev * SDIO; + +/* + * Register bit definitions + */ + +/* NOR/PSRAM chip-select control registers */ + +// SDIO_POWER register bits +// At least seven HCLK clock periods are needed between two write accesses to this register. +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. +#define SDIO_POWER_PWRCTRL_OFF 0x00 +#define SDIO_POWER_PWRCTRL_ON 0x03 + +// SDIO_CLKCR register bits +// Controls the SDIO_CK output clock. +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. SDIO_CK can also be stopped during the read wait interval +// for SD I/O cards: in this case the SDIO_CLKCR register does not control SDIO_CK. +#define SDIO_CLKCR_HWFC_EN (1<<14) // HW Flow Control enable - DON'T USE!!! (see errata sheet 2.12.1) + // Overrun errors (Rx mode) and FIFO underrun (Tx mode) + // should be managed by the application software. +#define SDIO_CLKCR_NEGEDGE (1<<13) // SDIO_CK de-phasing selection bit - DON'T USE!!! (see errata sheet 2.12.4) +#define SDIO_CLKCR_WIDBUS (3<<11) // Data bus width +#define SDIO_CLKCR_WIDBUS_1BIT (0<<11) // 1 bit (SDIO_D0 used) +#define SDIO_CLKCR_WIDBUS_4BIT (1<<11) // 4-bit (SDIO_D[3:0] used) +#define SDIO_CLKCR_BYPASS (1<<10) // Clock divider bypass enable bit - SDIO_CK = SDIOCLK, CLKDIV not relevant. +#define SDIO_CLKCR_PWRSAV (1<<9) // 0: SDIO_CK clock is always enabled, 1: SDIO_CK is only enabled when the bus is active +#define SDIO_CLKCR_CLKEN (1<<8) // Clock enable +#define SDIO_CLKCR_CLKDIV (0xFF) // SDIO_CK = SDIOCLK / [CLKDIV + 2] +#define SDIOCLK 48000000UL // SDIO master clock frequency + +// SDIO_CMD register bits +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. +// MultiMediaCards can send two kinds of response: short responses, 48 bits long, or long +// responses,136 bits long. SD card and SD I/O card can send only short responses, the +// argument can vary according to the type of response: the software will distinguish the type +// of response according to the sent command. CE-ATA devices send only short responses. +#define SDIO_CMD_ATACMD (1<<14) +#define SDIO_CMD_NIEN (1<<13) +#define SDIO_CMD_ENCMDCOMPL (1<<12) +#define SDIO_CMD_SDIOSUSPEND (1<<11) +#define SDIO_CMD_CPSMEN (1<<10) +#define SDIO_CMD_WAITPEND (1<<9) +#define SDIO_CMD_WAITINT (1<<8) +#define SDIO_CMD_WAITRESP (3<<6) +#define SDIO_CMD_WAIT_NO_RESP (0<<6) +#define SDIO_CMD_WAIT_SHORT_RESP (1<<6) +#define SDIO_CMD_WAIT_LONG_RESP (3<<6) +#define SDIO_CMD_CMDINDEX (0x3F) + +// SDIO_DLEN register bits +// For a block data transfer, the value in the data length register must be a multiple of the block +// size (see SDIO_DCTRL). A data transfer must be written to the data timer register and the +// data length register before being written to the data control register. +// For an SDIO multibyte transfer the value in the data length register must be between 1 and 512. +#define SDIO_DLEN_DATALENGTH (0x01FFFFFF) + +// SDIO_DCTRL register bits +// Controls the data path state machine (DPSM). +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. +#define SDIO_DCTRL_SDIOEN (1<<11) // the DPSM performs an SD I/O-card-specific operation. +#define SDIO_DCTRL_RWMODE (1<<10) // 0: Read Wait control stopping SDIO_D2, 1:Read Wait control using SDIO_CK +#define SDIO_DCTRL_RWSTOP (1<<9) // 0: Read wait in progress if RWSTART bit is set, 1: Enable for read wait stop if RWSTART bit is set +#define SDIO_DCTRL_RWSTART (1<<8) // read wait operation starts +#define SDIO_DCTRL_DBLOCKSIZE (0xF<<4) // Define the data block length when the block data transfer mode is selected: 2^N bytes +#define SDIO_BLOCKSIZE_64 (6<<4) +#define SDIO_BLOCKSIZE_512 (9<<4) +#define SDIO_DCTRL_DMAEN (1<<3) // DMA enable +#define SDIO_DCTRL_DTMODE (1<<2) // Data transfer mode selection: 0: Block data transfer, 1: Stream or SDIO multi-byte data transfer +#define SDIO_DCTRL_DTDIR (1<<1) // Data transfer direction selection: 0: From controller to card, 1: From card to controller. +#define SDIO_DIR_TX (0<<1) +#define SDIO_DIR_RX (1<<1) +#define SDIO_DCTRL_DTEN (1<<0) // Start data transfer. Depending on the direction bit, DTDIR, + // the DPSM moves to the Wait_S, Wait_R state or Readwait if RW Start is set immediately at + // the beginning of the transfer. It is not necessary to clear the enable bit after the end of a data + // transfer but the SDIO_DCTRL must be updated to enable a new data transfer +// The meaning of the DTMODE bit changes according to the value of the SDIOEN bit: +// When DTEN=0 and DTMODE=1, the MultiMediaCard stream mode is enabled. +// When DTEN=1 and DTMODE=1, the peripheral enables an SDIO multi-byte transfer. + +// SDIO_STA register bits +#define SDIO_STA_CEATAEND (1<<23) // CE-ATA command completion signal received for CMD61 +#define SDIO_STA_SDIOIT (1<<22) // SDIO interrupt received +#define SDIO_STA_RXDAVL (1<<21) // Data available in receive FIFO +#define SDIO_STA_TXDAVL (1<<20) // Data available in transmit FIFO +#define SDIO_STA_RXFIFOE (1<<19) // Receive FIFO empty +#define SDIO_STA_TXFIFOE (1<<18) // Transmit FIFO empty (2 words) +#define SDIO_STA_RXFIFOF (1<<17) // Receive FIFO full (2 words before the FIFO is full.) +#define SDIO_STA_TXFIFOF (1<<16) // Transmit FIFO full +#define SDIO_STA_RXFIFOHF (1<<15) // Receive FIFO half full: there are at least 8 words in the FIFO +#define SDIO_STA_TXFIFOHE (1<<14) // Transmit FIFO half empty: at least 8 words can be written into the FIFO +#define SDIO_STA_RXACT (1<<13) // Data receive in progress +#define SDIO_STA_TXACT (1<<12) // Data transmit in progress +#define SDIO_STA_CMDACT (1<<11) // Command transfer in progress +#define SDIO_STA_DBCKEND (1<<10) // Data block sent/received (CRC check passed) +#define SDIO_STA_STBITERR (1<<9) // Start bit not detected on all data signals in wide bus mode +#define SDIO_STA_DATAEND (1<<8) // Data end (data counter SDIOCOUNT is zero) +#define SDIO_STA_CMDSENT (1<<7) // Command sent (no response required) +#define SDIO_STA_CMDREND (1<<6) // Command response received (CRC check passed) +#define SDIO_STA_RXOVERR (1<<5) // Received FIFO overrun error +#define SDIO_STA_TXUNDERR (1<<4) // Transmit FIFO underrun error +#define SDIO_STA_DTIMEOUT (1<<3) // Data timeout +#define SDIO_STA_CTIMEOUT (1<<2) // Command response timeout. The Command TimeOut period has a fixed value of 64 SDIO_CK clock periods. +#define SDIO_STA_DCRCFAIL (1<<1) // Data block sent/received (CRC check failed) +#define SDIO_STA_CCRCFAIL (1<<0) // Command response received (CRC check failed) + +#define SDIO_STA_CMD_ERROR_FLAGS (SDIO_STA_CTIMEOUT | SDIO_STA_CCRCFAIL) +#define SDIO_STA_TRX_ERROR_FLAGS (SDIO_STA_STBITERR | SDIO_STA_RXOVERR | SDIO_STA_TXUNDERR | SDIO_STA_DTIMEOUT | SDIO_STA_DCRCFAIL) +#define SDIO_STA_TRX_ACT_FLAGS (SDIO_STA_RXACT|SDIO_STA_TXACT) + +// SDIO_ICR register bits (WO - write only) +#define SDIO_ICR_CEATAENDC (1<<23) // clear CEATAEND flag +#define SDIO_ICR_SDIOITC (1<<22) // clear SDIOIT flag +#define SDIO_ICR_DBCKENDC (1<<10) // clear DBCKENDC flag +#define SDIO_ICR_STBITERRC (1<<9) // clear STBITERRC flag +#define SDIO_ICR_DATAENDC (1<<8) // clear DATAENDC flag +#define SDIO_ICR_CMDSENTC (1<<7) // clear CMDSENTC flag +#define SDIO_ICR_CMDRENDC (1<<6) // clear CMDREND flag +#define SDIO_ICR_RXOVERRC (1<<5) // clear RXOVERR flag +#define SDIO_ICR_TXUNDERRC (1<<4) // clear TXUNDERR flag +#define SDIO_ICR_DTIMEOUTC (1<<3) // clear DTIMEOUT flag +#define SDIO_ICR_CTIMEOUTC (1<<2) // clear CTIMEOUT flag +#define SDIO_ICR_DCRCFAILC (1<<1) // clear DCRCFAIL flag +#define SDIO_ICR_CCRCFAILC (1<<0) // clear CCRCFAIL flag + +#define SDIO_ICR_CMD_FLAGS (SDIO_ICR_CEATAENDC | SDIO_ICR_SDIOITC | SDIO_ICR_CMDSENTC | SDIO_ICR_CMDRENDC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CCRCFAILC) +#define SDIO_ICR_DATA_FLAGS (SDIO_ICR_DBCKENDC | SDIO_ICR_STBITERRC | SDIO_ICR_DATAENDC | SDIO_ICR_RXOVERRC | SDIO_ICR_TXUNDERRC | SDIO_ICR_DTIMEOUTC | SDIO_ICR_DCRCFAILC) + +// SDIO_MASK register bits +// Determines which status flags generate an interrupt request by setting the corresponding bit to 1b. +#define SDIO_MASK_CEATAENDIE (1<<23) // enable CEATAEND interrupt +#define SDIO_MASK_SDIOITIE (1<<22) // enable SDIOIT interrupt +#define SDIO_MASK_RXDAVLIE (1<<21) // enable RXDAVL interrupt +#define SDIO_MASK_TXDAVLIE (1<<20) // enable TXDAVL interrupt +#define SDIO_MASK_RXFIFOEIE (1<<19) // enable RXFIFOE interrupt +#define SDIO_MASK_TXFIFOEIE (1<<18) // enable TXFIFOE interrupt +#define SDIO_MASK_RXFIFOFIE (1<<17) // enable RXFIFOF interrupt +#define SDIO_MASK_TXFIFOFIE (1<<16) // enable TXFIFOF interrupt +#define SDIO_MASK_RXFIFOHFIE (1<<15) // enable RXFIFOHF interrupt +#define SDIO_MASK_TXFIFOHEIE (1<<14) // enable TXFIFOHE interrupt +#define SDIO_MASK_RXACTIE (1<<13) // enable RXACT interrupt +#define SDIO_MASK_TXACTIE (1<<12) // enable TXACT interrupt +#define SDIO_MASK_CMDACTIE (1<<11) // enable CMDACT interrupt +#define SDIO_MASK_DBCKENDIE (1<<10) // enable DBCKENDC interrupt +#define SDIO_MASK_STBITERRIE (1<<9) // enable STBITERR interrupt +#define SDIO_MASK_DATAENDIE (1<<8) // enable DATAENDC interrupt +#define SDIO_MASK_CMDSENTIE (1<<7) // enable CMDSENTC interrupt +#define SDIO_MASK_CMDRENDIE (1<<6) // enable CMDREND interrupt +#define SDIO_MASK_RXOVERRIE (1<<5) // enable RXOVERR interrupt +#define SDIO_MASK_TXUNDERRIE (1<<4) // enable TXUNDERR interrupt +#define SDIO_MASK_DTIMEOUTIE (1<<3) // enable DTIMEOUT interrupt +#define SDIO_MASK_CTIMEOUTIE (1<<2) // enable CTIMEOUT interrupt +#define SDIO_MASK_DCRCFAILIE (1<<1) // enable DCRCFAIL interrupt +#define SDIO_MASK_CCRCFAILIE (1<<0) // enable CCRCFAIL interrupt + + +void sdio_enable(void); +void sdio_disable(void); +void sdio_begin(void); +uint8_t sdio_cmd_send(uint16_t cmd_index_resp_type, uint32_t arg); +void sdio_set_clock(uint32_t clk); +void sdio_set_dbus_width(uint16_t bus_w); +void sdio_set_dblock_size(uint8_t dbsize); +//void sdio_trx_enable(uint8_t dir); +inline void sdio_trx_enable(void) +{ + SDIO->DCTRL |= SDIO_DCTRL_DTEN; // enable data transfer +} + +inline uint32_t sdio_cmd_xfer_ongoing(void) { return (SDIO->STA&SDIO_STA_CMDACT); } +inline uint32_t sdio_cmd_complete(void) { return (SDIO->STA&SDIO_STA_CMDSENT); } + +inline void sdio_setup_transfer(uint32_t dtimer, uint32_t dlen, uint16_t flags) +{ + SDIO->ICR = SDIO_ICR_DATA_FLAGS; // clear data access relevant flags + SDIO->DTIMER = dtimer; + SDIO->DLEN = dlen; + SDIO->DCTRL = flags;// | SDIO_DCTRL_DTEN; // enable data transfer +} + +#endif /* STM32_HIGH_DENSITY */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/STM32F4/cores/maple/wirish_time.h b/STM32F4/cores/maple/wirish_time.h index 3a117863c..87091a307 100644 --- a/STM32F4/cores/maple/wirish_time.h +++ b/STM32F4/cores/maple/wirish_time.h @@ -36,6 +36,10 @@ #include #include +#ifdef __cplusplus +extern "C"{ +#endif + #define US_PER_MS 1000 /** @@ -101,4 +105,8 @@ void delay(unsigned long ms); */ void delayMicroseconds(uint32 us); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif From 4aa44ee0e0eb99707a0aa8d407444eb8c539a694 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sun, 18 Jun 2017 18:40:40 +0200 Subject: [PATCH 118/307] added SDIO lib files --- STM32F4/libraries/SDIO/SdioF4.cpp | 801 ++++++++++++++++++++++++++++++ STM32F4/libraries/SDIO/SdioF4.h | 7 + 2 files changed, 808 insertions(+) create mode 100644 STM32F4/libraries/SDIO/SdioF4.cpp create mode 100644 STM32F4/libraries/SDIO/SdioF4.h diff --git a/STM32F4/libraries/SDIO/SdioF4.cpp b/STM32F4/libraries/SDIO/SdioF4.cpp new file mode 100644 index 000000000..1d533a0a3 --- /dev/null +++ b/STM32F4/libraries/SDIO/SdioF4.cpp @@ -0,0 +1,801 @@ +/* Arduino SdCard Library + * Copyright (C) 2016 by William Greiman + * + * This file is part of the Arduino SdSpiCard Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdSpiCard Library. If not, see + * . + */ + +#include "SdioF4.h" +#include +#include +#include + +#define USE_DEBUG_MODE 0 + +//============================================================================== +//#define SDHC_PROCTL_DTW_4BIT 0x01 +#define CMD8_RETRIES 10 +#define BUSY_TIMEOUT_MILLIS 500 +//============================================================================== +#define CMD_RESP_NONE SDIO_CMD_WAIT_NO_RESP +#define CMD_RESP_R1 SDIO_CMD_WAIT_SHORT_RESP // normal response +#define CMD_RESP_R1b SDIO_CMD_WAIT_SHORT_RESP // normal response + busy data line (optional) +#define CMD_RESP_R2 SDIO_CMD_WAIT_LONG_RESP // CID, CSD +#define CMD_RESP_R3 SDIO_CMD_WAIT_SHORT_RESP // OCR register, response to ACMD41 +#define CMD_RESP_R6 SDIO_CMD_WAIT_SHORT_RESP // published RCA response, response to CMD3 +#define CMD_RESP_R7 SDIO_CMD_WAIT_SHORT_RESP // response to CMD8 + +#define CMD0_XFERTYP (uint16_t)( CMD0 | CMD_RESP_NONE ) +#define CMD2_XFERTYP (uint16_t)( CMD2 | CMD_RESP_R2 ) +#define CMD3_XFERTYP (uint16_t)( CMD3 | CMD_RESP_R6 ) +#define CMD6_XFERTYP (uint16_t)( CMD6 | CMD_RESP_R1 ) +#define ACMD6_XFERTYP (uint16_t)( ACMD6 | CMD_RESP_R1 ) +#define CMD7_XFERTYP (uint16_t)( CMD7 | CMD_RESP_R1b ) +#define CMD8_XFERTYP (uint16_t)( CMD8 | CMD_RESP_R7 ) +#define CMD9_XFERTYP (uint16_t)( CMD9 | CMD_RESP_R2 ) +#define CMD10_XFERTYP (uint16_t)( CMD10 | CMD_RESP_R2 ) +#define CMD12_XFERTYP (uint16_t)( CMD12 | CMD_RESP_R1b ) +#define CMD13_XFERTYP (uint16_t)( CMD13 | CMD_RESP_R1 ) +#define CMD17_XFERTYP (uint16_t)( CMD17 | CMD_RESP_R1 ) +#define CMD18_XFERTYP (uint16_t)( CMD18 | CMD_RESP_R1 ) +#define ACMD23_XFERTYP (uint16_t)( ACMD23 | CMD_RESP_R1 ) +#define CMD24_XFERTYP (uint16_t)( CMD24 | CMD_RESP_R1 ) +#define CMD25_XFERTYP (uint16_t)( CMD25 | CMD_RESP_R1 ) +#define CMD32_XFERTYP (uint16_t)( CMD32 | CMD_RESP_R1 ) +#define CMD33_XFERTYP (uint16_t)( CMD32 | CMD_RESP_R1 ) +#define CMD38_XFERTYP (uint16_t)( CMD38 | CMD_RESP_R1b ) +#define ACMD41_XFERTYP (uint16_t)( ACMD41 | CMD_RESP_R3 ) + +#define CMD55_XFERTYP (uint16_t)( CMD55 | CMD_RESP_R1 ) + +//============================================================================= +//static void enableGPIO(bool enable); +//static void enableDmaIrs(); +static void initSDHC(void); +static bool isBusyCMD13(void); +static bool isBusyTransferComplete(void); +//static bool isBusyCommandComplete(); +//static bool isBusyCommandInhibit(); +static bool readReg16(uint32_t xfertyp, void* data); +//static void setSdclk(uint32_t kHzMax); +static bool yieldTimeout(bool (*fcn)(void)); +static bool waitDmaStatus(void); +static bool waitTimeout(bool (*fcn)(void)); +//----------------------------------------------------------------------------- +#define TRX_RD 0 +#define TRX_WR 1 +static uint8_t m_dir = TRX_RD; +static bool (*m_busyFcn)() = 0; +static bool m_initDone = false; +static uint32_t m_lba; // for raw non-DMA read(write)Start, read(write)Data, read(write)Stop +static uint32_t m_cnt; // for raw non-DMA read(write)Start, read(write)Data, read(write)Stop +static bool m_version2; +static bool m_highCapacity; +static uint8_t m_errorCode = SD_CARD_ERROR_INIT_NOT_CALLED; +static uint32_t m_errorLine = 0; +static uint32_t m_rca; +//static volatile bool m_dmaBusy = false; +static volatile uint32_t m_irqstat; +static uint32_t m_sdClkKhz = 0; +static uint32_t m_ocr; +static cid_t m_cid; +static csd_t m_csd; +static uint32_t t = 0; +//============================================================================= +#if USE_DEBUG_MODE +#define DBG_PRINT() { \ + Serial.write('_'); Serial.print(__FUNCTION__); Serial.write('_'); Serial.print(__LINE__); Serial.print(": "); \ + Serial.print("DMA->LISR: "); Serial.print(DMA2->regs->LISR, HEX); \ + /*Serial.print("DMA->HISR: "); Serial.println(DMA2->regs->HISR, HEX);*/ \ + Serial.print(", DMA->CR: "); Serial.print(DMA2->regs->STREAM[DMA_STREAM3].CR, HEX); \ + Serial.print(", DMA->NDTR: "); Serial.print(DMA2->regs->STREAM[DMA_STREAM3].NDTR, HEX); \ + /**/Serial.print(", DMA->PAR: "); Serial.print(DMA2->regs->STREAM[DMA_STREAM3].PAR, HEX); \ + /**/Serial.print(", DMA->M0AR: "); Serial.print(DMA2->regs->STREAM[DMA_STREAM3].M0AR, HEX); \ + Serial.print(", DMA->FCR: "); Serial.print(DMA2->regs->STREAM[DMA_STREAM3].FCR, HEX); \ + \ + /*Serial.print(" SDIO->POWER: "); Serial.println(SDIO->POWER, HEX);*/ \ + Serial.print(", SDIO->CLKCR: "); Serial.print(SDIO->CLKCR, HEX); \ + Serial.print(", SDIO->DTIMER: "); Serial.print(SDIO->DTIMER, HEX); \ + Serial.print(", SDIO->DCTRL: "); Serial.print(SDIO->DCTRL, HEX); \ + /**/Serial.print(", SDIO->DLEN: "); Serial.print(SDIO->DLEN); \ + Serial.print(", SDIO->DCOUNT: "); Serial.print(SDIO->DCOUNT); \ + Serial.print(", SDIO->STA: "); Serial.println(SDIO->STA, HEX); \ + /*delay(1);*/ \ +} +#define DBG_PIN PD0 + +#else // USE_DEBUG_MODE +#define DBG_PRINT() +#endif // USE_DEBUG_MODE + +/*****************************************************************************/ +static void _panic(const char *message, uint32_t code) +{ + Serial.print(message); Serial.println(code, HEX); + //Block the execution with blinky leds + pinMode(BOARD_LED_PIN, OUTPUT); + pinMode(BOARD_LED2_PIN, OUTPUT); + while (1) { + digitalWrite(BOARD_LED_PIN, HIGH); + digitalWrite(BOARD_LED2_PIN, LOW); + delay(250); + digitalWrite(BOARD_LED_PIN, LOW); + digitalWrite(BOARD_LED2_PIN, HIGH); + delay(250); + } +} +/*=========================================================================== +void yield(void) +{ + uint32_t val = SDIO->STA; + if ( val & SDIO_STA_TRX_ERROR_FLAGS ) { + Serial.print("SDIO ERROR:: SDIO->CLKCR: "); Serial.print(SDIO->CLKCR, HEX); \ + Serial.print(", SDIO->DTIMER: "); Serial.print(SDIO->DTIMER, HEX); \ + Serial.print(", SDIO->DCTRL: "); Serial.print(SDIO->DCTRL, HEX); \ + Serial.print(", SDIO->DLEN: "); Serial.print(SDIO->DLEN); \ + Serial.print(", SDIO->DCOUNT: "); Serial.print(SDIO->DCOUNT); \ + Serial.print(", SDIO->STA: "); Serial.print(SDIO->STA, HEX); \ + Serial.print(", SDIO->RESP0: "); Serial.println(SDIO->RESP[0], HEX); \ + if (val & SDIO_STA_STBITERR) Serial.print(" STBITERR"); + if (val & SDIO_STA_RXOVERR) Serial.print(" RXOVERR"); + if (val & SDIO_STA_TXUNDERR) Serial.print(" TXUNDERR"); + if (val & SDIO_STA_DTIMEOUT) Serial.print(" DTIMEOUT"); + if (val & SDIO_STA_DCRCFAIL) Serial.print(" DCRCFAIL"); + _panic(" - SDIO: Data Transmission Error ", val); + } + + val = dma_get_isr_bit(DMA2, DMA_STREAM3, DMA_ISR_ERROR_BITS); + if ( val & DMA_ISR_FEIF ) { + val ^= DMA_ISR_FEIF; + dma_clear_isr_bit(DMA2, DMA_STREAM3, DMA_ISR_FEIF); + } + if ( val ) { + if (val & DMA_ISR_TEIF) Serial.print(" TEIF"); + if (val & DMA_ISR_DMEIF) Serial.print(" DMEIF"); + //if (val & DMA_ISR_FEIF) Serial.print(" FEIF"); + _panic(" - DMA: Data Transmission Error ", val); + } + //Serial.write('.'); +}*/ +//============================================================================= +// Error function and macro. +inline bool setSdErrorCode(uint8_t code, uint32_t line) { + m_errorCode = code; + m_errorLine = line; + return false; // setSdErrorCode +} +#define sdError(code) setSdErrorCode(code, __LINE__) +//============================================================================= +/* ISR +void sdhc_isr() { + SDHC_IRQSIGEN = 0; + m_irqstat = SDHC_IRQSTAT; + SDHC_IRQSTAT = m_irqstat; + m_dmaBusy = false; +}*/ +//============================================================================= +// Static functions. +//----------------------------------------------------------------------------- +static bool cardCommand(uint16_t xfertyp, uint32_t arg) +{ +#if USE_DEBUG_MODE + Serial.print("cardCommand: "); Serial.print(xfertyp&SDIO_CMD_CMDINDEX); Serial.print(", arg: "); Serial.print(arg, HEX); +#endif + uint8_t resp = sdio_cmd_send(xfertyp, arg); // returns non-zero if fails, zero if OK +#if USE_DEBUG_MODE + Serial.print(", resp: "); Serial.print(resp, HEX); + Serial.print(", SDIO->STA: "); Serial.print(SDIO->STA, HEX); Serial.print(", cmd_resp: "); Serial.print(SDIO->RESP[0], HEX); + if ( (xfertyp&SDIO_CMD_WAIT_LONG_RESP)==SDIO_CMD_WAIT_LONG_RESP ) { + Serial.print(", "); Serial.print(SDIO->RESP[1], HEX); Serial.print(", "); Serial.print(SDIO->RESP[2], HEX); Serial.print(", "); Serial.println(SDIO->RESP[3], HEX); + } else Serial.println(); +#endif + return resp; // return non-zero when OK +} +//----------------------------------------------------------------------------- +static bool cardAcmd(uint32_t rca, uint32_t xfertyp, uint32_t arg) { + return cardCommand(CMD55_XFERTYP, rca) && cardCommand((uint16_t)xfertyp, arg); +} +/*---------------------------------------------------------------------------*/ +static bool cardCMD6(uint32_t arg, uint8_t* status) { + // CMD6 returns 64 bytes. + // use polling only for the moment + if (waitTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_CMD13); + } + // get the 64 bytes over data lines + sdio_setup_transfer(80000, 64, (SDIO_BLOCKSIZE_64 | SDIO_DIR_RX | SDIO_DCTRL_DTEN)); + + cardCommand(CMD6_XFERTYP, arg); + + // wait data Rx response + if (waitTimeout(isBusyTransferComplete)) { + return sdError(SD_CARD_ERROR_CMD6); + } +DBG_PRINT(); + // copy 64 bytes as 16 words from FIFO to buffer + for (uint8_t i=0; i<16; i++) { + *(uint32_t*)(&status[i<<2]) = SDIO->FIFO; + } + //SDIO->DCTRL = 0; // disable data controller + +#if USE_DEBUG_MODE + Serial.print("read data: "); for (uint8_t i=0; i<17; i++) { Serial.print(status[i], HEX); Serial.print(", "); } Serial.println(); +#endif +return true; +} +//----------------------------------------------------------------------------- +static void initSDHC(void) +{ + sdio_begin(); + DBG_PRINT(); +} +/*---------------------------------------------------------------------------*/ +static bool isBusyCMD13(void) { + if (!cardCommand(CMD13_XFERTYP, m_rca)) { // SEND_STATUS + // Caller will timeout. + return true; + } + return !(SDIO->RESP[0] & CARD_STATUS_READY_FOR_DATA); +} +/*---------------------------------------------------------------------------*/ +static bool isBusyDMA(void) +{ + uint8_t isr = dma_get_isr_bit(DMA2, DMA_STREAM3, (DMA_ISR_TCIF | DMA_ISR_ERROR_BITS)); + //if (isr&DMA_ISR_TCIF) dma_disable(DMA2, DMA_STREAM3); + return !(isr^DMA_ISR_FEIF); // ignore transfer error flag +} +/*---------------------------------------------------------------------------*/ +static bool isBusyTransferComplete(void) +{ + uint32_t mask = SDIO->STA &(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS); +#if USE_DEBUG_MODE + if ( mask & SDIO_STA_TRX_ERROR_FLAGS ) { + Serial.print("XFER ERROR: SDIO->STA: "); Serial.print(SDIO->STA, HEX); + if (mask & SDIO_STA_STBITERR) Serial.print(" STBITERR"); + if (mask & SDIO_STA_RXOVERR) Serial.print(" RXOVERR"); + if (mask & SDIO_STA_TXUNDERR) Serial.print(" TXUNDERR"); + if (mask & SDIO_STA_DTIMEOUT) Serial.print(" DTIMEOUT"); + if (mask & SDIO_STA_DCRCFAIL) Serial.print(" DCRCFAIL"); + Serial.println(); + } +#endif + if (mask) { + dma_disable(DMA2, DMA_STREAM3); + return false; + } + return true; +} +/*---------------------------------------------------------------------------*/ +static void trxStart(uint8_t* buf, uint32_t n, uint8_t dir) +{ + m_dir = dir; + uint32_t flags = (SDIO_BLOCKSIZE_512 | SDIO_DCTRL_DTEN); + if (dir==TRX_RD) flags |= SDIO_DIR_RX; + // setup SDIO to transfer n blocks of 512 bytes + sdio_setup_transfer(0x00FFFFFF, n, flags); +} +/*---------------------------------------------------------------------------*/ +static bool trxStop() +{ + if (!cardCommand(CMD12_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD12); + } + if ( t ) { + Serial.print(", in "); Serial.println(millis()-t); + t = 0; + } + return true; +} +/*---------------------------------------------------------------------------*/ +static bool dmaTrxStart(uint8_t* buf, uint32_t n, uint8_t dir) +{ + m_dir = dir; + if ((3 & (uint32_t)buf) || n == 0) { // check alignment + _panic("- transferStart: unaligned buffer address ", (uint32_t)buf); + return sdError(SD_CARD_ERROR_DMA); + } + if (dir==TRX_RD && yieldTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_CMD13); + } + uint32_t flags = (SDIO_BLOCKSIZE_512 | SDIO_DCTRL_DMAEN | SDIO_DCTRL_DTEN); + if (dir==TRX_RD) flags |= SDIO_DIR_RX; + // setup SDIO to transfer n blocks of 512 bytes + sdio_setup_transfer(0x00FFFFFF, n, flags); + // setup DMA2 stream 3 channel 4 + dma_init(DMA2); + flags = (DMA_PERIF_CTRL | DMA_BURST_INCR4 | DMA_MINC_MODE | DMA_PRIO_VERY_HIGH); + if (dir==TRX_RD) flags |= DMA_FROM_PER; // read + else flags |= DMA_FROM_MEM; // write + dma_setup_transfer(DMA2, DMA_STREAM3, DMA_CH4, DMA_SIZE_32BITS, &SDIO->FIFO, buf, NULL, flags); + dma_set_num_transfers(DMA2, DMA_STREAM3, n); + dma_set_fifo_flags(DMA2, DMA_STREAM3, (DMA_FCR_DMDIS | DMA_FCR_FTH_FULL)); // disable direct mode | threshold FULL + dma_clear_isr_bits(DMA2, DMA_STREAM3); + dma_enable(DMA2, DMA_STREAM3); + return true; +} +/*---------------------------------------------------------------------------*/ +static bool dmaTrxEnd(bool multi_block) +{ + if ( !waitDmaStatus() ) { + return sdError(SD_CARD_ERROR_DMA); + } + if ( waitTimeout(isBusyTransferComplete) ) { + if (m_dir==TRX_RD) + return sdError(SD_CARD_ERROR_READ_TIMEOUT); + else + return sdError(SD_CARD_ERROR_WRITE_TIMEOUT); + } + if (multi_block) { + return trxStop(); + } else { + if ( t ) { + Serial.print(", in "); Serial.println(millis()-t); + t = 0; + } + return true; + } +} +//----------------------------------------------------------------------------- +// Read 16 byte CID or CSD register. +static bool readReg16(uint32_t xfertyp, void* data) +{ + uint8_t* d = reinterpret_cast(data); + if (!cardCommand(xfertyp, m_rca)) { + return false; // Caller will set errorCode. + } + *(uint32_t*)(&d[0]) = __builtin_bswap32(SDIO->RESP[0]); + *(uint32_t*)(&d[4]) = __builtin_bswap32(SDIO->RESP[1]); + *(uint32_t*)(&d[8]) = __builtin_bswap32(SDIO->RESP[2]); + *(uint32_t*)(&d[12]) = __builtin_bswap32(SDIO->RESP[3]); + d[15] = 0; + return true; +} +/*---------------------------------------------------------------------------*/ +// Return true if timeout occurs. +static bool yieldTimeout(bool (*fcn)()) { + uint32_t m = millis(); + while (fcn()) { + if ((millis() - m) > BUSY_TIMEOUT_MILLIS) { + return true; + } + yield(); + } + return false; // Caller will set errorCode. +} +/*---------------------------------------------------------------------------*/ +static bool waitDmaStatus(void) +{ + if (yieldTimeout(isBusyDMA)) { + return false; // Caller will set errorCode. + } + return true; +} +/*---------------------------------------------------------------------------*/ +// Return true if timeout occurs. +static bool waitTimeout(bool (*fcn)(void)) { + uint32_t m = millis(); + while (fcn()) { + if ((millis() - m) > BUSY_TIMEOUT_MILLIS) { + return true; + } + delayMicroseconds(1); + } + return false; // Caller will set errorCode. +} + +uint32_t aligned[128]; // temporary buffer for misaligned buffers +//============================================================================= +bool SdioCard::begin(void) +{ + m_initDone = false; + m_errorCode = SD_CARD_ERROR_NONE; + m_highCapacity = false; + m_version2 = false; + +#if USE_DEBUG_MODE +pinMode(DBG_PIN, OUTPUT); +digitalWrite(DBG_PIN, HIGH); +delay(100); +#endif + // initialize controller. + initSDHC(); + + if (!cardCommand(CMD0_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD0); + } + // Try several times for case of reset delay. + for (uint32_t i = 0; i < CMD8_RETRIES; i++) { + if (cardCommand(CMD8_XFERTYP, 0X1AA)) { + if (SDIO->RESP[0] != 0X1AA) { + return sdError(SD_CARD_ERROR_CMD8); + } + m_version2 = true; + break; + } + } + uint32_t arg = m_version2 ? 0X40300000 : 0x00300000; + uint32_t m = millis(); + do { + if (!cardAcmd(0, ACMD41_XFERTYP, arg) || + ((millis() - m) > BUSY_TIMEOUT_MILLIS)) { + return sdError(SD_CARD_ERROR_ACMD41); + } + } while ((SDIO->RESP[0] & 0x80000000) == 0); + + m_ocr = SDIO->RESP[0]; + if (m_ocr & 0x40000000) { + // Is high capacity. + m_highCapacity = true; + } + if (!cardCommand(CMD2_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD2); + } + if (!cardCommand(CMD3_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD3); + } + m_rca = SDIO->RESP[0] & 0xFFFF0000; + if (!readReg16(CMD9_XFERTYP, &m_csd)) { + return sdError(SD_CARD_ERROR_CMD9); + } + if (!readReg16(CMD10_XFERTYP, &m_cid)) { + return sdError(SD_CARD_ERROR_CMD10); + } + if (!cardCommand(CMD7_XFERTYP, m_rca)) { + return sdError(SD_CARD_ERROR_CMD7); + } + // Set card to bus width four. + if (!cardAcmd(m_rca, ACMD6_XFERTYP, 2)) { + return sdError(SD_CARD_ERROR_ACMD6); + } + sdio_set_dbus_width(SDIO_CLKCR_WIDBUS_4BIT); + + // Determine if High Speed mode is supported and set frequency. + uint8_t status[64]; + // see "Physical Layer Simplified Specification Version 6.00", chapter 4.3.10, Table 4-13. + // Support Bits of Functions in Function Group 1: bits 415:400, which are bytes [12][13] + // Function Selection of Function Group 1: bits 379:376, which is low nibble of byte [16] + if (cardCMD6(0X00FFFFFF, status) && (2 & status[13]) && + cardCMD6(0X80FFFFF1, status) && (status[16] & 0XF) == 1) { + //Serial.println("\n*** 50MHz clock supported ***"); + } else { + _panic("*** Only 25MHz clock supported! ***", 0); + } + + m_sdClkKhz = 24000; + sdio_set_clock(m_sdClkKhz*1000); // set clock to 24MHz + + m_initDone = true; + return true; +} +//----------------------------------------------------------------------------- +uint32_t SdioCard::cardSize(void) { + return sdCardCapacity(&m_csd); +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::erase(uint32_t firstBlock, uint32_t lastBlock) { + // check for single block erase + if (!m_csd.v1.erase_blk_en) { + // erase size mask + uint8_t m = (m_csd.v1.sector_size_high << 1) | m_csd.v1.sector_size_low; + if ((firstBlock & m) != 0 || ((lastBlock + 1) & m) != 0) { + // error card can't erase specified area + return sdError(SD_CARD_ERROR_ERASE_SINGLE_BLOCK); + } + } + if (!m_highCapacity) { + firstBlock <<= 9; + lastBlock <<= 9; + } + if (!cardCommand(CMD32_XFERTYP, firstBlock)) { + return sdError(SD_CARD_ERROR_CMD32); + } + if (!cardCommand(CMD33_XFERTYP, lastBlock)) { + return sdError(SD_CARD_ERROR_CMD33); + } + if (!cardCommand(CMD38_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD38); + } + if (waitTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_ERASE_TIMEOUT); + } + return true; +} +//----------------------------------------------------------------------------- +uint8_t SdioCard::errorCode() { + return m_errorCode; +} +//----------------------------------------------------------------------------- +uint32_t SdioCard::errorData() { + return m_irqstat; +} +//----------------------------------------------------------------------------- +uint32_t SdioCard::errorLine() { + return m_errorLine; +} +//----------------------------------------------------------------------------- +bool SdioCard::isBusy() { + return m_busyFcn ? m_busyFcn() : m_initDone && isBusyCMD13(); +} +//----------------------------------------------------------------------------- +uint32_t SdioCard::kHzSdClk() { + return m_sdClkKhz; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::readBlock(uint32_t lba, uint8_t* buf) +{ + // prepare SDIO and DMA for data read transfer + dmaTrxStart((uint32_t)buf & 3 ? (uint8_t*)aligned : buf, 512, TRX_RD); + // send command to start data transfer + if ( !cardCommand(CMD17_XFERTYP, (m_highCapacity ? lba : 512*lba)) ) { + return sdError(SD_CARD_ERROR_CMD17); + } + if ( dmaTrxEnd(0)) { + if ( (uint32_t)buf & 3 ) { + //memcpy(buf, aligned, 512); + register uint8_t * dst = buf; + register uint8_t * src = (uint8_t *)aligned; + register uint16_t i = 64; + while ( i-- ) { // do 8 byte copies, is much faster than single byte copy + *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; + *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; + } + } + return true; + } + return false; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::readBlocks(uint32_t lba, uint8_t* buf, size_t n) +{ + if ((uint32_t)buf & 3) { + for (size_t i = 0; i < n; i++, lba++, buf += 512) { + if (!readBlock(lba, buf)) { + return false; // readBlock will set errorCode. + } + } + return true; + } + // prepare SDIO and DMA for data read transfer + dmaTrxStart(buf, 512*n, TRX_RD); + // send command to start data transfer + if ( !cardCommand(CMD18_XFERTYP, (m_highCapacity ? lba : 512*lba)) ) { + return sdError(SD_CARD_ERROR_CMD18); + } + return dmaTrxEnd(1); +} +//----------------------------------------------------------------------------- +bool SdioCard::readCID(void* cid) { + memcpy(cid, &m_cid, 16); + return true; +} +//----------------------------------------------------------------------------- +bool SdioCard::readCSD(void* csd) { + memcpy(csd, &m_csd, 16); + return true; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::readData(uint8_t *dst) +{ + //Serial.print("readData: "); Serial.print(m_lba); Serial.print(", m_cnt: "); Serial.println(m_cnt); + if ( m_cnt==0 ) return false; + if (yieldTimeout(isBusyCMD13)) { // wait for previous transmission end + return sdError(SD_CARD_ERROR_CMD13); + } + // non-DMA block read + trxStart(dst, 512, TRX_RD); + // send command to start data transfer + if ( !cardCommand(CMD17_XFERTYP, (m_highCapacity ? m_lba : 512*m_lba)) ) { + return sdError(SD_CARD_ERROR_CMD17); + } + // Receive a data block from the SDIO + register uint32_t STA; // to speed up SDIO flags checking + register uint16_t cnt = 512; + register uint32_t * ptr = (uint32_t *)dst; + // ----> TIME CRITICAL SECTION BEGIN <---- + do { + STA = SDIO->STA; + if (STA & SDIO_STA_RXFIFOHF) { + // Receive FIFO half full, there are at least 8 words in it + noInterrupts(); + *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; + *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; + interrupts(); + cnt -= 8; + } + } while ( !(STA & (SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) ); + // <---- TIME CRITICAL SECTION END ----> + + // read data still available in FIFO + while ( (SDIO->STA & SDIO_STA_RXDAVL) && (cnt--) ) { + *ptr++ = SDIO->FIFO; + } + // check error, temporary stuff, remove for final version + if ( SDIO->STA & SDIO_STA_TRX_ERROR_FLAGS ) { + _panic("ERROR: non-DMA read error ", SDIO->STA); + return false; + } + m_lba++; + m_cnt--; + return !(SDIO->STA&SDIO_STA_TRX_ERROR_FLAGS); +} +//----------------------------------------------------------------------------- +bool SdioCard::readOCR(uint32_t* ocr) { + *ocr = m_ocr; + return true; +} +//----------------------------------------------------------------------------- +bool SdioCard::readStart(uint32_t lba) +{ + m_lba = lba; + m_cnt = 1024; + return true; +} +/*---------------------------------------------------------------------------*/ +// SDHC will do Auto CMD12 after count blocks. +bool SdioCard::readStart(uint32_t lba, uint32_t count) +{ + //Serial.print("readStart: "); Serial.print(lba); Serial.print(", cnt: "); Serial.println(count); + m_lba = lba; + m_cnt = count; + return true; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::readStop() +{ + //Serial.println("readStop."); + m_lba = 0; + m_cnt = 0; + return true; +} +//----------------------------------------------------------------------------- +bool SdioCard::syncBlocks() { + return true; +} +//----------------------------------------------------------------------------- +uint8_t SdioCard::type() { + return m_version2 ? m_highCapacity ? + SD_CARD_TYPE_SDHC : SD_CARD_TYPE_SD2 : SD_CARD_TYPE_SD1; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::writeBlock(uint32_t lba, const uint8_t* buf) +{ + uint8_t * ptr = (uint8_t *)buf; + if (3 & (uint32_t)ptr) { + //Serial.print("writeBlock: "); Serial.print(lba); + Serial.print(", buf: "); Serial.print((uint32_t)ptr, HEX); + //memcpy(aligned, buf, 512); + register uint8_t * src = (uint8_t *)ptr; + ptr = (uint8_t *)aligned; + register uint8_t * dst = ptr; + register uint16_t i = 64; + while ( i-- ) { // do 8 byte copies, is much faster than single byte copy + *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; + *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; + } + } + if (yieldTimeout(isBusyCMD13)) { // wait for previous transmission end + return sdError(SD_CARD_ERROR_CMD13); + } + // send command to start data transfer + if ( !cardCommand(CMD24_XFERTYP, (m_highCapacity ? lba : 512*lba)) ) { + return sdError(SD_CARD_ERROR_CMD24); + } + // prepare SDIO and DMA for data transfer + dmaTrxStart(ptr, 512, TRX_WR); // 1 block, write transfer + + return dmaTrxEnd(0); +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::writeBlocks(uint32_t lba, const uint8_t* buf, size_t n) +{ + if (3 & (uint32_t)buf) { // misaligned buffer address, write single blocks + for (size_t i = 0; i < n; i++, lba++, buf += 512) { + if (!writeBlock(lba, buf)) { + return false; // writeBlock will set errorCode. + } + } + return true; + } + //Serial.print("writeBlocks: "); Serial.print(lba); Serial.print(", "); Serial.print(n); + if (yieldTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_CMD13); + } +#if 0 + // set number of blocks to write - this can speed up block write + if ( !cardAcmd(m_rca, ACMD23_XFERTYP, n) ) { + return sdError(SD_CARD_ERROR_ACMD23); + } +#endif + // send command to start data transfer + if ( !cardCommand(CMD25_XFERTYP, (m_highCapacity ? lba : 512*lba)) ) { + return sdError(SD_CARD_ERROR_CMD25); + } + // prepare SDIO and DMA for data transfer + dmaTrxStart((uint8_t *)buf, 512*n, TRX_WR); // n blocks, write transfer + + return dmaTrxEnd(1); +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::writeData(const uint8_t* src) +{ + //Serial.print("writeData: "); Serial.print(m_lba); Serial.print(", cnt: "); Serial.println(m_cnt); + if ( !m_cnt ) return false; + if (yieldTimeout(isBusyCMD13)) { // wait for previous transmission end + return sdError(SD_CARD_ERROR_CMD13); + } + // send command to start block data transfer + if ( !cardCommand(CMD24_XFERTYP, (m_highCapacity ? m_lba : 512*m_lba)) ) { + return sdError(SD_CARD_ERROR_CMD24); + } + // non-DMA block write + trxStart((uint8_t*)src, 512, TRX_WR); + // Receive a data block from the SDIO + register uint32_t STA; // to speed up SDIO flags checking + register uint16_t cnt = 512; + register uint32_t * ptr = (uint32_t*)src; + // pre-fill up the FIFO with 32 words + noInterrupts(); + while ( (cnt--)>(512-32) ) SDIO->FIFO = *ptr++; + interrupts(); + // ----> TIME CRITICAL SECTION BEGIN <---- + do { + STA = SDIO->STA; + if (STA & SDIO_STA_TXFIFOHE) { + // Transmit FIFO half empty, fill up the remaining 16 words + noInterrupts(); + SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; + SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; + SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; + SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; + interrupts(); + cnt -= 16; + } + } while ( !(STA & (SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) && cnt); + // <---- TIME CRITICAL SECTION END ----> + if ( waitTimeout(isBusyTransferComplete) ) { + return sdError(SD_CARD_ERROR_WRITE_TIMEOUT); + } + m_lba++; + m_cnt--; + if (SDIO->STA&SDIO_STA_TRX_ERROR_FLAGS) { + _panic("writeData error: ", SDIO->STA); + } + return !(SDIO->STA&SDIO_STA_TRX_ERROR_FLAGS); +} +//----------------------------------------------------------------------------- +bool SdioCard::writeStart(uint32_t lba) +{ + m_lba = lba; + m_cnt = 1024; + return true; +} +/*---------------------------------------------------------------------------*/ +// SDHC will do Auto CMD12 after count blocks. +bool SdioCard::writeStart(uint32_t lba, uint32_t count) +{ + //Serial.print("writeStart: "); Serial.print(lba); Serial.print(", cnt: "); Serial.println(count); + m_lba = lba; + m_cnt = count; + return true; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::writeStop() +{ + //Serial.println("writeStop."); + m_lba = 0; + m_cnt = 0; + return true; +} diff --git a/STM32F4/libraries/SDIO/SdioF4.h b/STM32F4/libraries/SDIO/SdioF4.h new file mode 100644 index 000000000..c995b1c5c --- /dev/null +++ b/STM32F4/libraries/SDIO/SdioF4.h @@ -0,0 +1,7 @@ + +#ifndef _SDIOF4_H_ +#define _SDIOF4_H_ + +#include + +#endif From 8af6002812e15379ac75e1494558a894ed24970b Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 19 Jun 2017 17:11:04 +1000 Subject: [PATCH 119/307] Added link to gitter chat room in the readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 019cb2b26..b6c60f686 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ This repo contains, the "Hardware" files to support STM32 based boards on Arduin ***PRIMARY SUPPORT FORUM: http://www.stm32duino.com/*** +*** We are also on Gitter https://gitter.im/stm32duino/Lobby *** + ##Background & Support: * Based on https://github.com/bobc/maple-asp, which is in turn based on LibMaple by Leaflabs * **Please read the wiki (https://github.com/rogerclarkmelbourne/Arduino_STM32/wiki) for full details** From 6fa060c05a702f5d68c4c63752cdb2911b0764b1 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 19 Jun 2017 17:11:31 +1000 Subject: [PATCH 120/307] Updated readme for gitter (again) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b6c60f686..b77db0128 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This repo contains, the "Hardware" files to support STM32 based boards on Arduin ***PRIMARY SUPPORT FORUM: http://www.stm32duino.com/*** -*** We are also on Gitter https://gitter.im/stm32duino/Lobby *** +***We are also on Gitter https://gitter.im/stm32duino/Lobby/*** ##Background & Support: * Based on https://github.com/bobc/maple-asp, which is in turn based on LibMaple by Leaflabs From b7fb21aa0ca9a3a679233ee403d4ae2e88ccc300 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 20 Jun 2017 18:33:00 +0200 Subject: [PATCH 121/307] make USB serial Tx blocking (bugfix for lost TX characters) --- STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c index 28a2d1ff2..bc4374795 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.c @@ -25,7 +25,6 @@ /* Includes ------------------------------------------------------------------*/ #include "usbd_cdc_vcp.h" -//#include "stm32f4_discovery.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ @@ -57,7 +56,7 @@ uint8_t UsbRecBuffer[UsbRecBufferSize]; volatile int UsbRecRead = 0; volatile int UsbRecWrite = 0; volatile int VCP_DTRHIGH = 0; -uint8_t UsbTXBlock = 0; +uint8_t UsbTXBlock = 1; uint32_t VCPBytesAvailable(void) { return (UsbRecWrite - UsbRecRead + UsbRecBufferSize) % UsbRecBufferSize; From d872cb1963b39384c7344a1229179f59a09a2c17 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 20 Jun 2017 18:50:23 +0200 Subject: [PATCH 122/307] avoid multiple USB serial begin (taken from F1) --- STM32F4/cores/maple/usb_serial.cpp | 7 ++++++- STM32F4/cores/maple/usb_serial.h | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/STM32F4/cores/maple/usb_serial.cpp b/STM32F4/cores/maple/usb_serial.cpp index fadcb91af..1764e86fd 100644 --- a/STM32F4/cores/maple/usb_serial.cpp +++ b/STM32F4/cores/maple/usb_serial.cpp @@ -36,20 +36,25 @@ #ifdef SERIAL_USB #define USB_TIMEOUT 50 +bool USBSerial::_hasBegun = false; USBSerial::USBSerial(void) { } void USBSerial::begin(void) { + if (_hasBegun) + return; + _hasBegun = true; setupUSB(); } void USBSerial::begin(int) { - setupUSB(); + this->begin(); } void USBSerial::end(void) { disableUSB(); + _hasBegun = false; } size_t USBSerial::write(uint8 ch) { diff --git a/STM32F4/cores/maple/usb_serial.h b/STM32F4/cores/maple/usb_serial.h index 8eeed966a..228802566 100644 --- a/STM32F4/cores/maple/usb_serial.h +++ b/STM32F4/cores/maple/usb_serial.h @@ -65,6 +65,9 @@ class USBSerial : public Stream { void enableBlockingTx(void); void disableBlockingTx(void); + +protected: + static bool _hasBegun; }; extern USBSerial SerialUSB; From f6dea1e50efa6694b9ccc577fb6b4103a7fa9272 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 20 Jun 2017 21:03:18 +0200 Subject: [PATCH 123/307] added CCMRAM definitions --- STM32F4/variants/generic_f407v/ld/common.inc | 9 +++++++++ STM32F4/variants/generic_f407v/ld/jtag.ld | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/STM32F4/variants/generic_f407v/ld/common.inc b/STM32F4/variants/generic_f407v/ld/common.inc index f5a0f5b6e..30c49c2d0 100644 --- a/STM32F4/variants/generic_f407v/ld/common.inc +++ b/STM32F4/variants/generic_f407v/ld/common.inc @@ -183,6 +183,15 @@ SECTIONS } > REGION_BSS /* + * .ccmram + */ + .ccmram (NOLOAD): + { + . = ALIGN(8); + *(.ccmram .ccmram.*) + } > ccmram + + /* * Debugging sections */ .stab 0 (NOLOAD) : { *(.stab) } diff --git a/STM32F4/variants/generic_f407v/ld/jtag.ld b/STM32F4/variants/generic_f407v/ld/jtag.ld index 1001db518..2156f15c1 100644 --- a/STM32F4/variants/generic_f407v/ld/jtag.ld +++ b/STM32F4/variants/generic_f407v/ld/jtag.ld @@ -5,8 +5,9 @@ MEMORY { - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K - rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K + ccmram (rw): ORIGIN = 0x10000000, LENGTH = 64K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K } /* GROUP(libcs3_stm32_high_density.a) */ From 747634a31acd6b1aca33a8fdd9160e5a557dd6c6 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sat, 24 Jun 2017 17:23:54 +1000 Subject: [PATCH 124/307] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b77db0128..7e13786a2 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ This repo contains, the "Hardware" files to support STM32 based boards on Arduin ***PRIMARY SUPPORT FORUM: http://www.stm32duino.com/*** ***We are also on Gitter https://gitter.im/stm32duino/Lobby/*** +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/stm32duino/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) ##Background & Support: * Based on https://github.com/bobc/maple-asp, which is in turn based on LibMaple by Leaflabs From f7a576f2e0efcee958bdfd737d9af7a2f6c76051 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 25 Jun 2017 13:08:30 +1000 Subject: [PATCH 125/307] Fixed issue with PB10 being set to OUTPUT for use as a USB Disconnect control on boards which do not have the additional USB disconnect hardware e.g. the Blue Pill. Note. Some variants seem to have the disconnect control on another pin, so I did not change those in case they were actually used --- .../cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c | 15 +++++++++++---- STM32F1/variants/generic_gd32f103c/board/board.h | 4 ++-- STM32F1/variants/generic_stm32f103c/board/board.h | 4 ++-- .../variants/generic_stm32f103r8/board/board.h | 4 ++-- STM32F1/variants/nucleo_f103rb/board/board.h | 7 ++----- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c index 7a5a772af..774be42cb 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c @@ -384,9 +384,13 @@ void usb_cdcacm_enable(gpio_dev *disc_dev, uint8 disc_bit) { /* Present ourselves to the host. Writing 0 to "disc" pin must * pull USB_DP pin up while leaving USB_DM pulled down by the * transceiver. See USB 2.0 spec, section 7.1.7.3. */ - gpio_set_mode(disc_dev, disc_bit, GPIO_OUTPUT_PP); - gpio_write_bit(disc_dev, disc_bit, 0); - + + if (disc_dev!=NULL) + { + gpio_set_mode(disc_dev, disc_bit, GPIO_OUTPUT_PP); + gpio_write_bit(disc_dev, disc_bit, 0); + } + /* Initialize the USB peripheral. */ usb_init_usblib(USBLIB, ep_int_in, ep_int_out); } @@ -395,7 +399,10 @@ void usb_cdcacm_disable(gpio_dev *disc_dev, uint8 disc_bit) { /* Turn off the interrupt and signal disconnect (see e.g. USB 2.0 * spec, section 7.1.7.3). */ nvic_irq_disable(NVIC_USB_LP_CAN_RX0); - gpio_write_bit(disc_dev, disc_bit, 1); + if (disc_dev!=NULL) + { + gpio_write_bit(disc_dev, disc_bit, 1); + } } void usb_cdcacm_putc(char ch) { diff --git a/STM32F1/variants/generic_gd32f103c/board/board.h b/STM32F1/variants/generic_gd32f103c/board/board.h index 50dd98904..16295a11a 100644 --- a/STM32F1/variants/generic_gd32f103c/board/board.h +++ b/STM32F1/variants/generic_gd32f103c/board/board.h @@ -70,8 +70,8 @@ #define BOARD_JTDO_PIN 19 #define BOARD_NJTRST_PIN 18 -#define BOARD_USB_DISC_DEV GPIOB -#define BOARD_USB_DISC_BIT 10 +#define BOARD_USB_DISC_DEV NULL +#define BOARD_USB_DISC_BIT NULL // Note this needs to match with the PIN_MAP array in board.cpp enum { diff --git a/STM32F1/variants/generic_stm32f103c/board/board.h b/STM32F1/variants/generic_stm32f103c/board/board.h index 09351a61a..4736dc9ff 100644 --- a/STM32F1/variants/generic_stm32f103c/board/board.h +++ b/STM32F1/variants/generic_stm32f103c/board/board.h @@ -70,8 +70,8 @@ #define BOARD_JTDO_PIN 19 #define BOARD_NJTRST_PIN 18 -#define BOARD_USB_DISC_DEV GPIOB -#define BOARD_USB_DISC_BIT 10 +#define BOARD_USB_DISC_DEV NULL +#define BOARD_USB_DISC_BIT NULL #define LED_BUILTIN PC13 diff --git a/STM32F1/variants/generic_stm32f103r8/board/board.h b/STM32F1/variants/generic_stm32f103r8/board/board.h index c274d64a7..36c224112 100644 --- a/STM32F1/variants/generic_stm32f103r8/board/board.h +++ b/STM32F1/variants/generic_stm32f103r8/board/board.h @@ -70,8 +70,8 @@ #define BOARD_JTDO_PIN 19 #define BOARD_NJTRST_PIN 18 -#define BOARD_USB_DISC_DEV GPIOB -#define BOARD_USB_DISC_BIT 10 +#define BOARD_USB_DISC_DEV NULL +#define BOARD_USB_DISC_BIT NULL // Note this needs to match with the PIN_MAP array in board.cpp enum { diff --git a/STM32F1/variants/nucleo_f103rb/board/board.h b/STM32F1/variants/nucleo_f103rb/board/board.h index b27862dc3..5c7ece719 100644 --- a/STM32F1/variants/nucleo_f103rb/board/board.h +++ b/STM32F1/variants/nucleo_f103rb/board/board.h @@ -102,11 +102,8 @@ /** * Note: there is no USB in this board. */ - // Roger Clark. These USB disconnect pin definitions have been added as a temporary fix in order that the this board compiles - // following changes to add usb serial to other boards - // I will remove them when the code in the core usb_serial.cpp has been tidied up so that they are no longer needed. -#define BOARD_USB_DISC_DEV GPIOB -#define BOARD_USB_DISC_BIT 10 +#define BOARD_USB_DISC_DEV NULL +#define BOARD_USB_DISC_BIT NULL /* Pin aliases: these give the GPIO port/bit for each pin as an * enum. These are optional, but recommended. They make it easier to From 80339e6073d25b58ce0c8dbc0d7c5bbabb8a441f Mon Sep 17 00:00:00 2001 From: "U-MarquisSeven\\Brandon" Date: Mon, 26 Jun 2017 18:57:49 -0500 Subject: [PATCH 126/307] checking out work from master --- STM32F1/libraries/Wire/HardWire.cpp | 6 +++++- STM32F1/libraries/Wire/HardWire.h | 1 + STM32F1/libraries/Wire/Wire.cpp | 22 ++++++++++++++++++++-- STM32F1/libraries/Wire/Wire.h | 8 +++++++- STM32F1/libraries/Wire/WireBase.cpp | 8 ++++++-- STM32F1/libraries/Wire/WireBase.h | 2 ++ 6 files changed, 41 insertions(+), 6 deletions(-) diff --git a/STM32F1/libraries/Wire/HardWire.cpp b/STM32F1/libraries/Wire/HardWire.cpp index 1f3ebf25e..d81f584ae 100644 --- a/STM32F1/libraries/Wire/HardWire.cpp +++ b/STM32F1/libraries/Wire/HardWire.cpp @@ -38,7 +38,7 @@ #include "HardWire.h" -uint8 HardWire::process() { +uint8 HardWire::process(uint8 stop) { int8 res = i2c_master_xfer(sel_hard, &itc_msg, 1, 0); if (res == I2C_ERROR_PROTOCOL) { if (sel_hard->error_flags & I2C_SR1_AF) { /* NACK */ @@ -55,6 +55,10 @@ uint8 HardWire::process() { return res; } +uint8 HardWire::process(){ + return process(true); +} + // TODO: Add in Error Handling if devsel is out of range for other Maples HardWire::HardWire(uint8 dev_sel, uint8 flags) { if (dev_sel == 1) { diff --git a/STM32F1/libraries/Wire/HardWire.h b/STM32F1/libraries/Wire/HardWire.h index 6f30cb331..bf59a2f24 100644 --- a/STM32F1/libraries/Wire/HardWire.h +++ b/STM32F1/libraries/Wire/HardWire.h @@ -52,6 +52,7 @@ class HardWire : public WireBase { * Processes the incoming I2C message defined by WireBase to the * hardware. If an error occured, restart the I2C device. */ + uint8 process(uint8); uint8 process(); public: /* diff --git a/STM32F1/libraries/Wire/Wire.cpp b/STM32F1/libraries/Wire/Wire.cpp index 01ee72fd3..8e8d3e5c7 100644 --- a/STM32F1/libraries/Wire/Wire.cpp +++ b/STM32F1/libraries/Wire/Wire.cpp @@ -40,6 +40,9 @@ * Updated by Roger Clark. 20141111. Fixed issue when process() returned because of missing ACK (often caused by invalid device address being used), caused SCL to be left * LOW so that in the next call to process() , the first clock pulse was not sent, because SCL was LOW when it should have been high. */ + /* + * Updated by Brandon Green. 20172306. Implementing the repeated stop functionality. + */ #include "Wire.h" @@ -76,6 +79,12 @@ void TwoWire::i2c_stop() { set_sda(HIGH); } +void TwoWire::i2c_repeated_start() { + set_sda(HIGH); + set_scl(HIGH); + set_sda(LOW); +} + bool TwoWire::i2c_get_ack() { set_scl(LOW); set_sda(HIGH); @@ -121,7 +130,8 @@ void TwoWire::i2c_shift_out(uint8 val) { } } -uint8 TwoWire::process() { +//process needs to be updated for repeated start. +uint8 TwoWire::process(uint8 stop) { itc_msg.xferred = 0; uint8 sla_addr = (itc_msg.addr << 1); @@ -162,10 +172,18 @@ uint8 TwoWire::process() { itc_msg.xferred++; } } - i2c_stop(); + if(stop == true) + i2c_stop(); + else i2c_repeated_start(); + return SUCCESS; } +// For compatibility with legacy code +uint8 TwoWire::process(){ + return process(true); +} + // TODO: Add in Error Handling if pins is out of range for other Maples // TODO: Make delays more capable TwoWire::TwoWire(uint8 scl, uint8 sda, uint8 delay) : i2c_delay(delay) { diff --git a/STM32F1/libraries/Wire/Wire.h b/STM32F1/libraries/Wire/Wire.h index c7edfefa6..df474da7c 100644 --- a/STM32F1/libraries/Wire/Wire.h +++ b/STM32F1/libraries/Wire/Wire.h @@ -86,7 +86,12 @@ class TwoWire : public WireBase { * Creates a Stop condition on the bus */ void i2c_stop(); - + + /* + * Created a Repeated Start condition on the bus + */ + void i2c_repeated_start(); + /* * Gets an ACK condition from a slave device on the bus */ @@ -119,6 +124,7 @@ class TwoWire : public WireBase { /* * Processes the incoming I2C message defined by WireBase */ + uint8 process(uint8); uint8 process(); public: /* diff --git a/STM32F1/libraries/Wire/WireBase.cpp b/STM32F1/libraries/Wire/WireBase.cpp index ff0dae361..73d039836 100644 --- a/STM32F1/libraries/Wire/WireBase.cpp +++ b/STM32F1/libraries/Wire/WireBase.cpp @@ -59,17 +59,21 @@ void WireBase::beginTransmission(int slave_address) { beginTransmission((uint8)slave_address); } -uint8 WireBase::endTransmission(void) { +uint8 WireBase::endTransmission(uint8 stop) { uint8 retVal; if (tx_buf_overflow) { return EDATA; } - retVal = process();// Changed so that the return value from process is returned by this function see also the return line below + retVal = process(stop);// Changed so that the return value from process is returned by this function see also the return line below tx_buf_idx = 0; tx_buf_overflow = false; return retVal;//SUCCESS; } +uint8 WireBase::endTransmission(){ + endTransmission(true); +} + //TODO: Add the ability to queue messages (adding a boolean to end of function // call, allows for the Arduino style to stay while also giving the flexibility // to bulk send diff --git a/STM32F1/libraries/Wire/WireBase.h b/STM32F1/libraries/Wire/WireBase.h index 4e51c0deb..4038428d5 100644 --- a/STM32F1/libraries/Wire/WireBase.h +++ b/STM32F1/libraries/Wire/WireBase.h @@ -65,6 +65,7 @@ class WireBase { // Abstraction is awesome! boolean tx_buf_overflow; // Force derived classes to define process function + virtual uint8 process(uint8) = 0; virtual uint8 process() = 0; public: WireBase() {} @@ -90,6 +91,7 @@ class WireBase { // Abstraction is awesome! * Call the process function to process the message if the TX * buffer has not overflowed. */ + uint8 endTransmission(uint8); uint8 endTransmission(void); /* From 54044592fb4a05149c6694d429a26b4d3a014626 Mon Sep 17 00:00:00 2001 From: "U-MarquisSeven\\Brandon" Date: Mon, 26 Jun 2017 18:59:33 -0500 Subject: [PATCH 127/307] changing comment --- STM32F1/libraries/Wire/Wire.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Wire/Wire.cpp b/STM32F1/libraries/Wire/Wire.cpp index 8e8d3e5c7..fff850be8 100644 --- a/STM32F1/libraries/Wire/Wire.cpp +++ b/STM32F1/libraries/Wire/Wire.cpp @@ -41,7 +41,7 @@ * LOW so that in the next call to process() , the first clock pulse was not sent, because SCL was LOW when it should have been high. */ /* - * Updated by Brandon Green. 20172306. Implementing the repeated stop functionality. + * Updated by Brandon Green. 20172306. Implementing the repeated start functionality. */ #include "Wire.h" From f7440485833c83405dd9396f034f21a53d9ba5a7 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sun, 2 Jul 2017 15:02:55 +0200 Subject: [PATCH 128/307] include backslashes replaced by slashes --- STM32F4/libraries/SDIO/SdioF4.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F4/libraries/SDIO/SdioF4.cpp b/STM32F4/libraries/SDIO/SdioF4.cpp index 1d533a0a3..e32e9f2d6 100644 --- a/STM32F4/libraries/SDIO/SdioF4.cpp +++ b/STM32F4/libraries/SDIO/SdioF4.cpp @@ -19,8 +19,8 @@ */ #include "SdioF4.h" -#include -#include +#include +#include #include #define USE_DEBUG_MODE 0 From 753d92977ddfec1dba4344ff750c87b207f43210 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 3 Jul 2017 20:47:25 +0200 Subject: [PATCH 129/307] remove duplicated generic variant --- STM32F4/boards.txt | 37 ------------------------------------- 1 file changed, 37 deletions(-) diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 035acc952..8fc143071 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -74,43 +74,6 @@ generic_f407v.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB generic_f407v.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) generic_f407v.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC -############################################################## -generic_f407v.name=Generic STM32F407V series - -generic_f407v.upload.tool=stlink_upload -generic_f407v.upload.protocol=stlink - -generic_f407v.upload.file_type=bin -generic_f407v.upload.ram.maximum_size=131072 -generic_f407v.upload.flash.maximum_size=514288 -generic_f407v.upload.maximum_size=514288 - -#generic_f407v.upload.usbID=0483:3748 -#generic_f407v.upload.altID=1 -#generic_f407v.upload.auto_reset=true - -generic_f407v.build.mcu=cortex-m4 -generic_f407v.build.f_cpu=168000000L -generic_f407v.build.core=maple -generic_f407v.build.extra_flags=-mthumb -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_generic_f407v -generic_f407v.build.ldscript=ld/jtag.ld -generic_f407v.build.variant=generic_f407v -generic_f407v.build.variant_system_lib=lib_f407.a -generic_f407v.build.vect=VECT_TAB_BASE -generic_f407v.build.density=STM32_HIGH_DENSITY -generic_f407v.build.error_led_port=GPIOA -generic_f407v.build.error_led_pin=7 -generic_f407v.build.board=STM32GenericF407VET6 - -generic_f407v.menu.usb_cfg.usb_nc=USB inactive -generic_f407v.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC - -generic_f407v.menu.usb_cfg.usb_serial=USB serial (CDC) -generic_f407v.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB - -generic_f407v.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) -generic_f407v.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC - ############################################################## stm32f4stamp.name=STM32F4Stamp F405 From 832f10209075e4ff4f283281a636cd2a263f3f31 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 3 Jul 2017 20:50:53 +0200 Subject: [PATCH 130/307] bring up in sync with master --- STM32F4/cores/maple/libmaple/dmaF4.h | 73 ------------------- STM32F4/cores/maple/libmaple/fsmc.c | 57 --------------- STM32F4/libraries/SPI/src/SPI.cpp | 1 + STM32F4/system/libmaple/Arduino.h~HEAD | 46 ------------ .../Arduino.h~refs_remotes_origin_master | 46 ------------ 5 files changed, 1 insertion(+), 222 deletions(-) delete mode 100644 STM32F4/system/libmaple/Arduino.h~HEAD delete mode 100644 STM32F4/system/libmaple/Arduino.h~refs_remotes_origin_master diff --git a/STM32F4/cores/maple/libmaple/dmaF4.h b/STM32F4/cores/maple/libmaple/dmaF4.h index 5815f1c05..cb2376069 100644 --- a/STM32F4/cores/maple/libmaple/dmaF4.h +++ b/STM32F4/cores/maple/libmaple/dmaF4.h @@ -85,12 +85,7 @@ typedef struct dma_reg_map { * Register bit definitions */ -<<<<<<< HEAD:STM32F4/cores/maple/libmaple/dmaF4.h -/* Stream configuration register */ - -======= // Stream configuration register ->>>>>>> refs/remotes/origin/master:STM32F4/cores/maple/libmaple/dmaF4.h #define DMA_CR_CH0 (0x0 << 25) #define DMA_CR_CH1 (0x1 << 25) #define DMA_CR_CH2 (0x2 << 25) @@ -139,9 +134,6 @@ typedef struct dma_reg_map { #define DMA_CR_HTIE (0x1 << 3) #define DMA_CR_TEIE (0x1 << 2) #define DMA_CR_DMEIE (0x1 << 1) -<<<<<<< HEAD:STM32F4/cores/maple/libmaple/dmaF4.h -#define DMA_CR_EN (0x1) -======= #define DMA_CR_EN (0x1 << 0) // Device interrupt status register flags @@ -170,7 +162,6 @@ typedef struct dma_reg_map { #define DMA_FCR_FTH_3_4 (0x2 << 0) // 3/4 full FIFO #define DMA_FCR_FTH_FULL (0x3 << 0) // full FIFO ->>>>>>> refs/remotes/origin/master:STM32F4/cores/maple/libmaple/dmaF4.h typedef enum dma_channel { DMA_CH0 = DMA_CR_CH0, /**< Channel 0 */ @@ -182,21 +173,6 @@ typedef enum dma_channel { DMA_CH6 = DMA_CR_CH6, /**< Channel 6 */ DMA_CH7 = DMA_CR_CH7, /**< Channel 7 */ } dma_channel; -<<<<<<< HEAD:STM32F4/cores/maple/libmaple/dmaF4.h - -/* Device interrupt status register flags */ - -#define DMA_ISR_TCIF (1 << 5) -#define DMA_ISR_HTIF (1 << 4) -#define DMA_ISR_TEIF (1 << 3) -#define DMA_ISR_DMEIF (1 << 2) -#define DMA_ISR_FEIF (1 << 0) - -/* - * Devices - */ -======= ->>>>>>> refs/remotes/origin/master:STM32F4/cores/maple/libmaple/dmaF4.h /** Encapsulates state related to a DMA channel interrupt. */ typedef struct dma_handler_config { @@ -218,29 +194,6 @@ typedef struct dma_dev { /* * Devices */ -<<<<<<< HEAD:STM32F4/cores/maple/libmaple/dmaF4.h - -extern void dma_init(dma_dev *dev); - -/** Flags for DMA transfer configuration. */ -typedef enum dma_mode_flags { - DMA_MEM_BUF_0 = DMA_CR_CT0, /**< Current memory target buffer 0 */ - DMA_MEM_BUF_1 = DMA_CR_CT1, /**< Current memory target buffer 1 */ - DMA_DBL_BUF_MODE = DMA_CR_DBM, /**< Current memory double buffer mode */ - DMA_PINC_OFFSET = DMA_CR_PINCOS, /**< Peripheral increment offset size */ - DMA_MINC_MODE = DMA_CR_MINC, /**< Memory increment mode */ - DMA_PINC_MODE = DMA_CR_PINC, /**< Peripheral increment mode */ - DMA_CIRC_MODE = DMA_CR_CIRC, /**< Memory Circular mode */ - DMA_FROM_PER = DMA_CR_DIR_P2M, /**< Read from memory to peripheral */ - DMA_FROM_MEM = DMA_CR_DIR_M2P, /**< Read from memory to peripheral */ - DMA_MEM_TO_MEM = DMA_CR_DIR_M2M, /**< Read from memory to memory */ - DMA_PERIF_CTRL = DMA_CR_PFCTRL, /**< Peripheral flow controller */ - DMA_PRIO_MEDIUM = DMA_CR_PL_MEDIUM, /**< Medium priority */ - DMA_PRIO_HIGH = DMA_CR_PL_HIGH, /**< High priority */ - DMA_PRIO_VERY_HIGH = DMA_CR_PL_VERY_HIGH, /**< Very high priority */ - DMA_TRNS_CMPLT = DMA_CR_TCIE, /**< Interrupt on transfer completion */ - DMA_TRNS_HALF = DMA_CR_HTIE, /**< Interrupt on half-transfer */ -======= extern dma_dev *DMA1; extern dma_dev *DMA2; @@ -262,22 +215,15 @@ typedef enum dma_mode_flags { DMA_PRIO_VERY_HIGH = DMA_CR_PL_VERY_HIGH, /**< Very high priority */ DMA_TRNS_CMPLT = DMA_CR_TCIE, /**< Interrupt on transfer completion */ DMA_TRNS_HALF = DMA_CR_HTIE, /**< Interrupt on half-transfer */ ->>>>>>> refs/remotes/origin/master:STM32F4/cores/maple/libmaple/dmaF4.h DMA_TRNS_ERR = DMA_CR_TEIE, /**< Interrupt on transfer error */ DMA_DIR_MODE_ERR = DMA_CR_DMEIE /**< Interrupt on direct mode error */ } dma_mode_flags; // Source and destination transfer sizes. typedef enum dma_xfer_size { -<<<<<<< HEAD:STM32F4/cores/maple/libmaple/dmaF4.h - DMA_SIZE_8BITS = ( DMA_CR_MSIZE_8BITS|DMA_CR_PSIZE_8BITS ), /**< 8-bit transfers */ - DMA_SIZE_16BITS = (DMA_CR_MSIZE_16BITS|DMA_CR_PSIZE_16BITS), /**< 16-bit transfers */ - DMA_SIZE_32BITS = (DMA_CR_MSIZE_32BITS|DMA_CR_PSIZE_32BITS) /**< 32-bit transfers */ -======= DMA_SIZE_8BITS = ( DMA_CR_MSIZE_8BITS|DMA_CR_PSIZE_8BITS ), // 8-bit transfers DMA_SIZE_16BITS = (DMA_CR_MSIZE_16BITS|DMA_CR_PSIZE_16BITS), // 16-bit transfers DMA_SIZE_32BITS = (DMA_CR_MSIZE_32BITS|DMA_CR_PSIZE_32BITS) // 32-bit transfers ->>>>>>> refs/remotes/origin/master:STM32F4/cores/maple/libmaple/dmaF4.h } dma_xfer_size; // Source and destination burst sizes. @@ -312,22 +258,14 @@ static inline void dma_setup_transfer(dma_dev *dev, __io void *peripheral_address, __io void *memory_address0, __io void *memory_address1, -<<<<<<< HEAD:STM32F4/cores/maple/libmaple/dmaF4.h - uint32 flags) { -======= uint32 flags) { ->>>>>>> refs/remotes/origin/master:STM32F4/cores/maple/libmaple/dmaF4.h dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; // disable while( (dev->regs->STREAM[stream].CR)&DMA_CR_EN ); // wait till enable bit is cleared dev->regs->STREAM[stream].PAR = (uint32)peripheral_address; dev->regs->STREAM[stream].M0AR = (uint32)memory_address0; dev->regs->STREAM[stream].M1AR = (uint32)memory_address1; -<<<<<<< HEAD:STM32F4/cores/maple/libmaple/dmaF4.h - dev->regs->STREAM[stream].CR = ((flags|channel|trx_size) & 0x0feffffe); // mask out reserved and enable -======= dev->regs->STREAM[stream].CR = (uint32)((flags|channel|trx_size) & 0x0feffffe); // mask out reserved and enable ->>>>>>> refs/remotes/origin/master:STM32F4/cores/maple/libmaple/dmaF4.h } static inline void dma_set_num_transfers(dma_dev *dev, dma_stream stream, uint16 num_transfers) @@ -340,12 +278,6 @@ static inline void dma_set_fifo_flags(dma_dev *dev, dma_stream stream, uint8 fif dev->regs->STREAM[stream].FCR = (uint32)(fifo_flags & 0x87); // mask out reserved bits } -static inline void dma_set_fifo_flags(dma_dev *dev, - dma_stream stream, - uint8 fifo_flags) { - dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits -} - void dma_attach_interrupt(dma_dev *dev, dma_stream stream, void (*handler)(void)); @@ -357,14 +289,9 @@ static inline void dma_enable(dma_dev *dev, dma_stream stream) dev->regs->STREAM[stream].CR |= (uint32)DMA_CR_EN; } -<<<<<<< HEAD:STM32F4/cores/maple/libmaple/dmaF4.h -static inline void dma_disable(dma_dev *dev, dma_stream stream) { - dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; -======= static inline void dma_disable(dma_dev *dev, dma_stream stream) { dev->regs->STREAM[stream].CR &= (uint32)(~DMA_CR_EN); ->>>>>>> refs/remotes/origin/master:STM32F4/cores/maple/libmaple/dmaF4.h while (dev->regs->STREAM[stream].CR & DMA_CR_EN); // wait till EN bit is reset, see AN4031, chapter 4.1 } diff --git a/STM32F4/cores/maple/libmaple/fsmc.c b/STM32F4/cores/maple/libmaple/fsmc.c index 301a855c4..1e3691adf 100644 --- a/STM32F4/cores/maple/libmaple/fsmc.c +++ b/STM32F4/cores/maple/libmaple/fsmc.c @@ -37,62 +37,6 @@ /** * Configure FSMC GPIOs for use with LCDs. */ -<<<<<<< HEAD -void fsmc_sram_init_gpios(void) { - /* Data lines... */ - gpio_set_mode(PD0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE7, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PE15, GPIO_AF_OUTPUT_PP); - - /* Address lines... */ - gpio_set_mode(PD11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(PD13, GPIO_AF_OUTPUT_PP); -#if 0 // not available on LQFP package - gpio_set_mode(GPIOF, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 2, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 3, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 4, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 5, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF, 15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 2, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 3, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 4, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG, 5, GPIO_AF_OUTPUT_PP); -#endif // not available on LQFP package - /* And control lines... */ - gpio_set_mode(PD4, GPIO_AF_OUTPUT_PP); // NOE - gpio_set_mode(PD5, GPIO_AF_OUTPUT_PP); // NWE - - gpio_set_mode(PD7, GPIO_AF_OUTPUT_PP); // NE1 -#if 0 // not available on LQFP package - gpio_set_mode(GPIOG, 9, GPIO_AF_OUTPUT_PP); // NE2 - gpio_set_mode(GPIOG, 10, GPIO_AF_OUTPUT_PP); // NE3 - gpio_set_mode(GPIOG, 12, GPIO_AF_OUTPUT_PP); // NE4 -#endif // not available on LQFP package - - gpio_set_mode(PE0, GPIO_AF_OUTPUT_PP); // NBL0 - gpio_set_mode(PE1, GPIO_AF_OUTPUT_PP); // NBL1 -======= void fsmc_init(void) { rcc_clk_enable(RCC_FSMC); @@ -137,7 +81,6 @@ void fsmc_lcd_init(void) fsmc_nor_psram_set_BTR(FSMC_NOR_PSRAM1_BASE, val); // enable FSCM fsmc_nor_psram_bank_enable(FSMC_NOR_PSRAM1_BASE); ->>>>>>> refs/remotes/origin/master } diff --git a/STM32F4/libraries/SPI/src/SPI.cpp b/STM32F4/libraries/SPI/src/SPI.cpp index eb07c8f1e..63ed4db65 100644 --- a/STM32F4/libraries/SPI/src/SPI.cpp +++ b/STM32F4/libraries/SPI/src/SPI.cpp @@ -460,6 +460,7 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaStream) & DMA_ISR_TCIF)==0 ) {// wait for completion flag to be set if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." // software disable sequence, see AN4031, chapter 4.1 diff --git a/STM32F4/system/libmaple/Arduino.h~HEAD b/STM32F4/system/libmaple/Arduino.h~HEAD deleted file mode 100644 index cef8f089f..000000000 --- a/STM32F4/system/libmaple/Arduino.h~HEAD +++ /dev/null @@ -1,46 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -#ifndef _WIRISH_ARDUINO_H_ -#define _WIRISH_ARDUINO_H_ - -//#warning Include Arduino.h from system\libmaple - -#include "wirish.h" - -void setup(); -void loop(); -#ifdef __cplusplus -extern "C"{ -#endif // __cplusplus -void yield(void); -#ifdef __cplusplus -} -#endif // __cplusplus - -#include "variant.h" - -#endif diff --git a/STM32F4/system/libmaple/Arduino.h~refs_remotes_origin_master b/STM32F4/system/libmaple/Arduino.h~refs_remotes_origin_master deleted file mode 100644 index cef8f089f..000000000 --- a/STM32F4/system/libmaple/Arduino.h~refs_remotes_origin_master +++ /dev/null @@ -1,46 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -#ifndef _WIRISH_ARDUINO_H_ -#define _WIRISH_ARDUINO_H_ - -//#warning Include Arduino.h from system\libmaple - -#include "wirish.h" - -void setup(); -void loop(); -#ifdef __cplusplus -extern "C"{ -#endif // __cplusplus -void yield(void); -#ifdef __cplusplus -} -#endif // __cplusplus - -#include "variant.h" - -#endif From 66df08b6bb1c6c5559531b5af4994a1b567faf00 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 3 Jul 2017 20:59:56 +0200 Subject: [PATCH 131/307] update .gitignore --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6ef98005c..078faf600 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,5 @@ other/maple-bootloader/cscope.out other/maple-bootloader/build other/maple-bootloader/*~ *.o -tools/src/stm32flash_serial/src/parsers/parsers.a *.bak *.1 -STM32F4/cores/maple/libmaple/adc.h From 85f8b8237af7f580fbcd823e42d4ba4e9c530b58 Mon Sep 17 00:00:00 2001 From: Testato Date: Tue, 4 Jul 2017 10:05:01 +0200 Subject: [PATCH 132/307] Update boards.txt - Exluded CCM Ram --- STM32F4/boards.txt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 0df9990dd..60d4fc473 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -11,7 +11,7 @@ discovery_f407.upload.protocol=stlink #discovery_f407.upload.use_1200bps_touch=false discovery_f407.upload.file_type=bin discovery_f407.upload.maximum_size=1048576 -discovery_f407.upload.maximum_data_size=196608 +discovery_f407.upload.maximum_data_size=131072 #discovery_f407.upload.usbID=1EAF:0003 #discovery_f407.upload.altID=1 @@ -43,9 +43,8 @@ generic_f407v.upload.tool=stlink_upload generic_f407v.upload.protocol=stlink generic_f407v.upload.file_type=bin -generic_f407v.upload.ram.maximum_size=131072 -generic_f407v.upload.flash.maximum_size=514288 generic_f407v.upload.maximum_size=514288 +generic_f407v.upload.ram.maximum_size=131072 #generic_f407v.upload.usbID=0483:3748 #generic_f407v.upload.altID=1 @@ -82,7 +81,7 @@ stm32f4stamp.upload.protocol=maple_dfu #stm32f4stamp.upload.use_1200bps_touch=false stm32f4stamp.upload.file_type=bin stm32f4stamp.upload.maximum_size=1048576 -stm32f4stamp.upload.maximum_data_size=196608 +stm32f4stamp.upload.maximum_data_size=131072 stm32f4stamp.upload.usbID=0483:df11 stm32f4stamp.upload.altID=0 @@ -117,7 +116,7 @@ netduino2plus.upload.protocol=maple_dfu #netduino2plus.upload.use_1200bps_touch=false netduino2plus.upload.file_type=bin netduino2plus.upload.maximum_size=1048576 -netduino2plus.upload.maximum_data_size=196608 +netduino2plus.upload.maximum_data_size=131072 netduino2plus.upload.usbID=0483:df11 netduino2plus.upload.altID=0 From 4467592149551b87e2c31f82658feb6f20c108e8 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 4 Jul 2017 19:11:48 +0200 Subject: [PATCH 133/307] adapt flash and RAM maximum sizes for Arduino --- STM32F4/boards.txt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 8fc143071..514c8a564 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -10,9 +10,8 @@ discovery_f407.upload.protocol=stlink #discovery_f407.upload.use_1200bps_touch=false discovery_f407.upload.file_type=bin -discovery_f407.upload.ram.maximum_size=17000 -discovery_f407.upload.flash.maximum_size=1048576 discovery_f407.upload.maximum_size=1048576 +discovery_f407.upload.maximum_data_size=131072 #discovery_f407.upload.usbID=1EAF:0003 #discovery_f407.upload.altID=1 @@ -44,9 +43,8 @@ generic_f407v.upload.tool=stlink_upload generic_f407v.upload.protocol=stlink generic_f407v.upload.file_type=bin -generic_f407v.upload.ram.maximum_size=131072 -generic_f407v.upload.flash.maximum_size=514288 generic_f407v.upload.maximum_size=514288 +generic_f407v.upload.maximum_data_size=131072 #generic_f407v.upload.usbID=0483:3748 #generic_f407v.upload.altID=1 @@ -82,9 +80,8 @@ stm32f4stamp.upload.protocol=maple_dfu #stm32f4stamp.upload.use_1200bps_touch=false stm32f4stamp.upload.file_type=bin -stm32f4stamp.upload.ram.maximum_size=196608 -stm32f4stamp.upload.flash.maximum_size=1048576 stm32f4stamp.upload.maximum_size=1048576 +stm32f4stamp.upload.maximum_data_size=131072 stm32f4stamp.upload.usbID=0483:df11 stm32f4stamp.upload.altID=0 From 9b30346bfa379df4fd41c4985650a14c674a9c76 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 4 Jul 2017 19:13:20 +0200 Subject: [PATCH 134/307] default activated SPI class - needed by external libs --- STM32F4/libraries/SPI/src/SPI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F4/libraries/SPI/src/SPI.cpp b/STM32F4/libraries/SPI/src/SPI.cpp index 63ed4db65..45aa366b2 100644 --- a/STM32F4/libraries/SPI/src/SPI.cpp +++ b/STM32F4/libraries/SPI/src/SPI.cpp @@ -651,4 +651,4 @@ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { } -//SPIClass SPI(3); +SPIClass SPI(3); // needed for external libs From 597f77ac1d2824ebe369fc33b500cd9358d5d6db Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 4 Jul 2017 19:28:50 +0200 Subject: [PATCH 135/307] replace all backslaches by slashes in include paths --- STM32F4/cores/maple/libmaple/fsmc.h | 2 +- .../Class/audio/inc/usbd_audio_core.h | 2 +- .../Class/cdc/inc/usbd_cdc_core.h | 4 ++-- .../Class/cdc/src/usbd_cdc_core.c | 8 ++++---- .../STM32_USB_Device_Library/Core/inc/usbd_core.h | 2 +- .../usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h | 2 +- .../usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h | 2 +- .../STM32_USB_Device_Library/Core/src/usbd_core.c | 10 +++++----- .../STM32_USB_Device_Library/Core/src/usbd_ioreq.c | 2 +- .../usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c | 6 +++--- .../libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h | 2 +- .../usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h | 2 +- .../libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h | 4 ++-- .../libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c | 4 ++-- .../libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c | 4 ++-- .../usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c | 4 ++-- STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c | 2 +- STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h | 2 +- STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c | 6 +++--- STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h | 2 +- STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c | 4 ++-- STM32F4/cores/maple/libmaple/usbF4/usb.c | 6 +++--- STM32F4/cores/maple/libmaple/usbF4/usb.h | 2 +- STM32F4/system/libmaple/Arduino.h | 1 - STM32F4/variants/discovery_f407/discovery_f4.cpp | 4 ++-- STM32F4/variants/generic_f407v/pin_map.c | 6 +++--- 26 files changed, 47 insertions(+), 48 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/fsmc.h b/STM32F4/cores/maple/libmaple/fsmc.h index 3501583b4..03a6acfce 100644 --- a/STM32F4/cores/maple/libmaple/fsmc.h +++ b/STM32F4/cores/maple/libmaple/fsmc.h @@ -40,7 +40,7 @@ #ifndef _FSMC_H_ #define _FSMC_H_ -#include +#include #include "libmaple_types.h" #ifdef __cplusplus diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h index 7ac987dcb..69f7ffaaa 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/audio/inc/usbd_audio_core.h @@ -26,7 +26,7 @@ #include "usbd_ioreq.h" #include "usbd_req.h" -#include +#include diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h index b1c8cc117..29a38e96d 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h @@ -24,8 +24,8 @@ #ifndef __USB_CDC_CORE_H_ #define __USB_CDC_CORE_H_ -#include -#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c index 8f97c5176..8963a8a2a 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c @@ -58,10 +58,10 @@ */ /* Includes ------------------------------------------------------------------*/ -#include -#include -#include -#include +#include +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h index 063a30e69..3e4db9b33 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_core.h @@ -26,7 +26,7 @@ /* Includes ------------------------------------------------------------------*/ #include #include "usbd_def.h" -#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h index f2a31153a..03a8afc9d 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_def.h @@ -24,7 +24,7 @@ #ifndef __USBD_DEF_H #define __USBD_DEF_H /* Includes ------------------------------------------------------------------*/ -#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h index f9849c6f9..fd3c05561 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc/usbd_req.h @@ -27,7 +27,7 @@ /* Includes ------------------------------------------------------------------*/ #include "usbd_def.h" #include "usbd_core.h" -#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c index 00bb25140..2c5e82206 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_core.c @@ -20,11 +20,11 @@ */ /* Includes ------------------------------------------------------------------*/ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c index 20ee5a0f1..620b9e5cf 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_ioreq.c @@ -20,7 +20,7 @@ */ /* Includes ------------------------------------------------------------------*/ -#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ */ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c index 5fc2e036c..2233d1504 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/src/usbd_req.c @@ -20,9 +20,9 @@ */ /* Includes ------------------------------------------------------------------*/ -#include -#include -#include +#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h index 43c478126..dd6a86ad2 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_core.h @@ -24,7 +24,7 @@ #define __USB_CORE_H__ /* Includes ------------------------------------------------------------------*/ -#include +#include #include "usb_regs.h" #include "usb_defines.h" diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h index ee2c1a009..546f5ab8b 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_defines.h @@ -24,7 +24,7 @@ #define __USB_DEF_H__ /* Includes ------------------------------------------------------------------*/ -#include +#include /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h index 99f844e58..3038f0d86 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc/usb_regs.h @@ -24,8 +24,8 @@ #define __USB_OTG_REGS_H__ /* Includes ------------------------------------------------------------------*/ -#include -#include +#include +#include /** @addtogroup USB_OTG_DRIVER * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c index 1687afa7c..dd3856f12 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_core.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include -#include +#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c index dc9e53839..0d23a9769 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include -#include +#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c index f9e561f14..fb3bb9d44 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c +++ b/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/src/usb_dcd_int.c @@ -20,12 +20,12 @@ */ /* Includes ------------------------------------------------------------------*/ -#include +#include typedef int IRQn_Type; #define __NVIC_PRIO_BITS 4 #define __Vendor_SysTickConfig 1 -#include +#include /** @addtogroup USB_OTG_DRIVER diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c index e794cb144..c3650384c 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usb_bsp.c @@ -21,7 +21,7 @@ */ /* Includes ------------------------------------------------------------------*/ -#include +#include #include "usbd_conf.h" #include typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h index 8398dbdbb..1ac6c2fb3 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_cdc_vcp.h @@ -26,7 +26,7 @@ /* Includes ------------------------------------------------------------------*/ //#include "stm32f4xx.h" -#include +#include #include "usbd_conf.h" diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c index 0153858fc..e37e28c72 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.c @@ -20,11 +20,11 @@ */ /* Includes ------------------------------------------------------------------*/ -#include +#include #include "usbd_desc.h" -#include +#include #include "usbd_conf.h" -#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h index 4ae998cee..987767ff2 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_desc.h @@ -25,7 +25,7 @@ #define __USB_DESC_H /* Includes ------------------------------------------------------------------*/ -#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ diff --git a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c index a16ce40c5..44eef15e1 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c +++ b/STM32F4/cores/maple/libmaple/usbF4/VCP/usbd_usr.c @@ -20,8 +20,8 @@ */ /* Includes ------------------------------------------------------------------*/ -#include -#include +#include +#include /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.c b/STM32F4/cores/maple/libmaple/usbF4/usb.c index 385071982..3e9218609 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.c +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.c @@ -4,11 +4,11 @@ #include #include -#include +#include #include "usb.h" #include #include -#include +#include #include USB_OTG_CORE_HANDLE USB_OTG_dev; @@ -96,7 +96,7 @@ RESULT usbPowerOff(void) { void usbDsbISR(void) {}; -#include +#include void __irq_OTG_FS_IRQHandler(void) { USBD_OTG_ISR_Handler (&USB_OTG_dev); diff --git a/STM32F4/cores/maple/libmaple/usbF4/usb.h b/STM32F4/cores/maple/libmaple/usbF4/usb.h index ce1a5585f..7f0b2aa7e 100644 --- a/STM32F4/cores/maple/libmaple/usbF4/usb.h +++ b/STM32F4/cores/maple/libmaple/usbF4/usb.h @@ -5,7 +5,7 @@ extern "C" { #endif -#include +#include typedef enum _RESULT { diff --git a/STM32F4/system/libmaple/Arduino.h b/STM32F4/system/libmaple/Arduino.h index cef8f089f..d445126b0 100644 --- a/STM32F4/system/libmaple/Arduino.h +++ b/STM32F4/system/libmaple/Arduino.h @@ -27,7 +27,6 @@ #ifndef _WIRISH_ARDUINO_H_ #define _WIRISH_ARDUINO_H_ -//#warning Include Arduino.h from system\libmaple #include "wirish.h" diff --git a/STM32F4/variants/discovery_f407/discovery_f4.cpp b/STM32F4/variants/discovery_f407/discovery_f4.cpp index 74660f0b9..7d288d583 100644 --- a/STM32F4/variants/discovery_f407/discovery_f4.cpp +++ b/STM32F4/variants/discovery_f407/discovery_f4.cpp @@ -34,8 +34,8 @@ #include "discovery_f4.h" -#include -#include +#include +#include #include "wirish_types.h" diff --git a/STM32F4/variants/generic_f407v/pin_map.c b/STM32F4/variants/generic_f407v/pin_map.c index 5ecde5367..db5247b02 100644 --- a/STM32F4/variants/generic_f407v/pin_map.c +++ b/STM32F4/variants/generic_f407v/pin_map.c @@ -39,9 +39,9 @@ extern "C"{ //#include "generic_f407v.h" //#include "fsmc.h" -#include -#include -#include +#include +#include +#include #include From 8f46bf3c9e3a5c575eb9850ad0285d4189514664 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 4 Jul 2017 20:09:11 +0200 Subject: [PATCH 136/307] remove leaflasb USB CDC ACM warning --- STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c index 774be42cb..cba050f54 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c @@ -62,8 +62,8 @@ #if !(defined(BOARD_maple) || defined(BOARD_maple_RET6) || \ defined(BOARD_maple_mini) || defined(BOARD_maple_native)) -#warning USB CDC ACM relies on LeafLabs board-specific configuration.\ - You may have problems on non-LeafLabs boards. +//#warning USB CDC ACM relies on LeafLabs board-specific configuration.\ +// You may have problems on non-LeafLabs boards. #endif static void vcomDataTxCb(void); From 6fcecec2b02f96791041257850a18fa20d1400c8 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 4 Jul 2017 20:20:14 +0200 Subject: [PATCH 137/307] remove compiler warning about passing NULL to non-pointer argument --- STM32F1/cores/maple/usb_serial.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index 1fe2bf48e..6cffbf573 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -71,7 +71,7 @@ void USBSerial::begin(void) { return; _hasBegun = true; - usb_cdcacm_enable(BOARD_USB_DISC_DEV, BOARD_USB_DISC_BIT); + usb_cdcacm_enable(BOARD_USB_DISC_DEV, (uint8_t)BOARD_USB_DISC_BIT); usb_cdcacm_set_hooks(USB_CDCACM_HOOK_RX, rxHook); usb_cdcacm_set_hooks(USB_CDCACM_HOOK_IFACE_SETUP, ifaceSetupHook); #endif @@ -97,7 +97,7 @@ volatile uint8_t removeCompilerWarningsIgnore=ignore; void USBSerial::end(void) { #if BOARD_HAVE_SERIALUSB - usb_cdcacm_disable(BOARD_USB_DISC_DEV, BOARD_USB_DISC_BIT); + usb_cdcacm_disable(BOARD_USB_DISC_DEV, (uint8_t)BOARD_USB_DISC_BIT); usb_cdcacm_remove_hooks(USB_CDCACM_HOOK_RX | USB_CDCACM_HOOK_IFACE_SETUP); _hasBegun = false; #endif From 6f2effadac3d703b45fe4c4cbacba79df544ebfb Mon Sep 17 00:00:00 2001 From: stevstrong Date: Thu, 6 Jul 2017 00:29:45 +0200 Subject: [PATCH 138/307] update SdioF4.cpp - fix for CL4 cards --- STM32F4/libraries/SDIO/SdioF4.cpp | 33 ++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/STM32F4/libraries/SDIO/SdioF4.cpp b/STM32F4/libraries/SDIO/SdioF4.cpp index e32e9f2d6..63c928a80 100644 --- a/STM32F4/libraries/SDIO/SdioF4.cpp +++ b/STM32F4/libraries/SDIO/SdioF4.cpp @@ -24,11 +24,12 @@ #include #define USE_DEBUG_MODE 0 +#define USE_YIELD 0 //============================================================================== //#define SDHC_PROCTL_DTW_4BIT 0x01 #define CMD8_RETRIES 10 -#define BUSY_TIMEOUT_MILLIS 500 +#define BUSY_TIMEOUT_MILLIS 750 //============================================================================== #define CMD_RESP_NONE SDIO_CMD_WAIT_NO_RESP #define CMD_RESP_R1 SDIO_CMD_WAIT_SHORT_RESP // normal response @@ -137,7 +138,8 @@ static void _panic(const char *message, uint32_t code) delay(250); } } -/*=========================================================================== +/*===========================================================================*/ +#if USE_YIELD void yield(void) { uint32_t val = SDIO->STA; @@ -169,7 +171,8 @@ void yield(void) _panic(" - DMA: Data Transmission Error ", val); } //Serial.write('.'); -}*/ +} +#endif //============================================================================= // Error function and macro. inline bool setSdErrorCode(uint8_t code, uint32_t line) { @@ -191,11 +194,11 @@ void sdhc_isr() { //----------------------------------------------------------------------------- static bool cardCommand(uint16_t xfertyp, uint32_t arg) { -#if USE_DEBUG_MODE +#if USE_DEBUG_MODE==2 Serial.print("cardCommand: "); Serial.print(xfertyp&SDIO_CMD_CMDINDEX); Serial.print(", arg: "); Serial.print(arg, HEX); #endif uint8_t resp = sdio_cmd_send(xfertyp, arg); // returns non-zero if fails, zero if OK -#if USE_DEBUG_MODE +#if USE_DEBUG_MODE==2 Serial.print(", resp: "); Serial.print(resp, HEX); Serial.print(", SDIO->STA: "); Serial.print(SDIO->STA, HEX); Serial.print(", cmd_resp: "); Serial.print(SDIO->RESP[0], HEX); if ( (xfertyp&SDIO_CMD_WAIT_LONG_RESP)==SDIO_CMD_WAIT_LONG_RESP ) { @@ -330,6 +333,7 @@ static bool dmaTrxStart(uint8_t* buf, uint32_t n, uint8_t dir) static bool dmaTrxEnd(bool multi_block) { if ( !waitDmaStatus() ) { + DBG_PRINT(); return sdError(SD_CARD_ERROR_DMA); } if ( waitTimeout(isBusyTransferComplete) ) { @@ -536,6 +540,9 @@ uint32_t SdioCard::kHzSdClk() { /*---------------------------------------------------------------------------*/ bool SdioCard::readBlock(uint32_t lba, uint8_t* buf) { +#if USE_DEBUG_MODE + Serial.print("readBlock: "); Serial.println(lba); //Serial.print(", buf: "); Serial.println((uint32_t)buf, HEX); +#endif // prepare SDIO and DMA for data read transfer dmaTrxStart((uint32_t)buf & 3 ? (uint8_t*)aligned : buf, 512, TRX_RD); // send command to start data transfer @@ -560,6 +567,11 @@ bool SdioCard::readBlock(uint32_t lba, uint8_t* buf) /*---------------------------------------------------------------------------*/ bool SdioCard::readBlocks(uint32_t lba, uint8_t* buf, size_t n) { +#if USE_DEBUG_MODE + Serial.print("readBlocks: "); Serial.print(lba); + //Serial.print(", buf: "); Serial.print((uint32_t)buf, HEX); + Serial.print(", "); Serial.println(n); +#endif if ((uint32_t)buf & 3) { for (size_t i = 0; i < n; i++, lba++, buf += 512) { if (!readBlock(lba, buf)) { @@ -672,9 +684,12 @@ uint8_t SdioCard::type() { /*---------------------------------------------------------------------------*/ bool SdioCard::writeBlock(uint32_t lba, const uint8_t* buf) { +#if USE_DEBUG_MODE + Serial.print("writeBlock: "); Serial.println(lba); //Serial.print(", buf: "); Serial.println((uint32_t)buf, HEX); +#endif uint8_t * ptr = (uint8_t *)buf; if (3 & (uint32_t)ptr) { - //Serial.print("writeBlock: "); Serial.print(lba); + Serial.print("writeBlock: "); Serial.print(lba); Serial.print(", buf: "); Serial.print((uint32_t)ptr, HEX); //memcpy(aligned, buf, 512); register uint8_t * src = (uint8_t *)ptr; @@ -701,6 +716,11 @@ bool SdioCard::writeBlock(uint32_t lba, const uint8_t* buf) /*---------------------------------------------------------------------------*/ bool SdioCard::writeBlocks(uint32_t lba, const uint8_t* buf, size_t n) { +#if USE_DEBUG_MODE + Serial.print("writeBlocks: "); Serial.print(lba); + //Serial.print(", buf: "); Serial.print((uint32_t)buf, HEX); + Serial.print(", "); Serial.println(n); +#endif if (3 & (uint32_t)buf) { // misaligned buffer address, write single blocks for (size_t i = 0; i < n; i++, lba++, buf += 512) { if (!writeBlock(lba, buf)) { @@ -709,7 +729,6 @@ bool SdioCard::writeBlocks(uint32_t lba, const uint8_t* buf, size_t n) } return true; } - //Serial.print("writeBlocks: "); Serial.print(lba); Serial.print(", "); Serial.print(n); if (yieldTimeout(isBusyCMD13)) { return sdError(SD_CARD_ERROR_CMD13); } From 54dd788f2b223869854532d2df64ee9ab9e6d507 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 6 Jul 2017 10:57:20 +1000 Subject: [PATCH 139/307] Fix warning caused by commit #f7a576f2e0efcee958bdfd737d9af7a2f6c76051 --- STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c | 4 ++-- STM32F1/cores/maple/usb_serial.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c index 774be42cb..cba050f54 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c @@ -62,8 +62,8 @@ #if !(defined(BOARD_maple) || defined(BOARD_maple_RET6) || \ defined(BOARD_maple_mini) || defined(BOARD_maple_native)) -#warning USB CDC ACM relies on LeafLabs board-specific configuration.\ - You may have problems on non-LeafLabs boards. +//#warning USB CDC ACM relies on LeafLabs board-specific configuration.\ +// You may have problems on non-LeafLabs boards. #endif static void vcomDataTxCb(void); diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index 1fe2bf48e..6cffbf573 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -71,7 +71,7 @@ void USBSerial::begin(void) { return; _hasBegun = true; - usb_cdcacm_enable(BOARD_USB_DISC_DEV, BOARD_USB_DISC_BIT); + usb_cdcacm_enable(BOARD_USB_DISC_DEV, (uint8_t)BOARD_USB_DISC_BIT); usb_cdcacm_set_hooks(USB_CDCACM_HOOK_RX, rxHook); usb_cdcacm_set_hooks(USB_CDCACM_HOOK_IFACE_SETUP, ifaceSetupHook); #endif @@ -97,7 +97,7 @@ volatile uint8_t removeCompilerWarningsIgnore=ignore; void USBSerial::end(void) { #if BOARD_HAVE_SERIALUSB - usb_cdcacm_disable(BOARD_USB_DISC_DEV, BOARD_USB_DISC_BIT); + usb_cdcacm_disable(BOARD_USB_DISC_DEV, (uint8_t)BOARD_USB_DISC_BIT); usb_cdcacm_remove_hooks(USB_CDCACM_HOOK_RX | USB_CDCACM_HOOK_IFACE_SETUP); _hasBegun = false; #endif From 8683035cb7f95127b18b386be24b0fac537bb1f8 Mon Sep 17 00:00:00 2001 From: victorpv Date: Sat, 8 Jul 2017 10:46:49 -0500 Subject: [PATCH 140/307] Update usb_serial.h --- STM32F1/cores/maple/usb_serial.h | 1 + 1 file changed, 1 insertion(+) diff --git a/STM32F1/cores/maple/usb_serial.h b/STM32F1/cores/maple/usb_serial.h index d6c3e026f..153eb8ef8 100644 --- a/STM32F1/cores/maple/usb_serial.h +++ b/STM32F1/cores/maple/usb_serial.h @@ -51,6 +51,7 @@ class USBSerial : public Stream { virtual int available(void);// Changed to virtual + size_t usb_serial_class::readBytes(char *buf, const size_t& len); uint32 read(uint8 * buf, uint32 len); // uint8 read(void); From 1c07e25bd71f4e823aa9d61e2194731a9d9aee8a Mon Sep 17 00:00:00 2001 From: victorpv Date: Sat, 8 Jul 2017 10:49:14 -0500 Subject: [PATCH 141/307] Update usb_serial.h --- STM32F1/cores/maple/usb_serial.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/cores/maple/usb_serial.h b/STM32F1/cores/maple/usb_serial.h index 153eb8ef8..835159370 100644 --- a/STM32F1/cores/maple/usb_serial.h +++ b/STM32F1/cores/maple/usb_serial.h @@ -51,7 +51,7 @@ class USBSerial : public Stream { virtual int available(void);// Changed to virtual - size_t usb_serial_class::readBytes(char *buf, const size_t& len); + size_t readBytes(char *buf, const size_t& len); uint32 read(uint8 * buf, uint32 len); // uint8 read(void); From fd95b999146be0ffbb607551370bf4cd0d7bfaff Mon Sep 17 00:00:00 2001 From: victorpv Date: Sat, 8 Jul 2017 10:52:50 -0500 Subject: [PATCH 142/307] Added readBytes function to usbSerial Add Arduino USB implementation of Arduino Stream class readBytes, which reads bytes in blocks with a timeout. Increases the speed from 300KB/s to 500KB/s over the Stream class readBytes function. --- STM32F1/cores/maple/usb_serial.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index 994cd7a62..0902c50e6 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -168,6 +168,19 @@ uint32 USBSerial::read(uint8 * buf, uint32 len) { return rxed; } +size_t USBSerial::readBytes(char *buf, const size_t& len) +{ + size_t rxed=0; + unsigned long startMillis; + startMillis = millis(); + if (len <= 0) return 0; + do { + rxed += usb_cdcacm_rx((uint8 *)buf + rxed, len - rxed); + if (rxed == len) return rxed; + } while(millis() - startMillis < _timeout); + return rxed; +} + /* Blocks forever until 1 byte is received */ int USBSerial::read(void) { uint8 b; From b892004cc236553618c29c7afb43663f00af9016 Mon Sep 17 00:00:00 2001 From: victorpv Date: Mon, 10 Jul 2017 12:00:29 -0500 Subject: [PATCH 143/307] Add files via upload --- STM32F1/libraries/SPI/src/SPI.cpp | 358 +++++++++++++++++++++--------- STM32F1/libraries/SPI/src/SPI.h | 81 +++++-- 2 files changed, 311 insertions(+), 128 deletions(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index f0d9f7f57..998f9b0f2 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -101,16 +101,19 @@ SPIClass::SPIClass(uint32 spi_num) { #if BOARD_NR_SPI >= 1 case 1: _currentSetting->spi_d = SPI1; + _spi1_this = (void*) this; break; #endif #if BOARD_NR_SPI >= 2 case 2: _currentSetting->spi_d = SPI2; + _spi2_this = (void*) this; break; #endif #if BOARD_NR_SPI >= 3 case 3: _currentSetting->spi_d = SPI3; + _spi3_this = (void*) this; break; #endif default: @@ -137,6 +140,8 @@ SPIClass::SPIClass(uint32 spi_num) { _settings[2].spiRxDmaChannel = DMA_CH1; #endif + // added for DMA callbacks. + _currentSetting->state = SPI_STATE_IDLE; } /* @@ -154,6 +159,8 @@ void SPIClass::begin(void) { spi_init(_currentSetting->spi_d); configure_gpios(_currentSetting->spi_d, 1); updateSettings(); + // added for DMA callbacks. + _currentSetting->state = SPI_STATE_READY; } void SPIClass::beginSlave(void) { @@ -164,6 +171,8 @@ void SPIClass::beginSlave(void) { Serial.print("spi_slave_enable("); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif spi_slave_enable(_currentSetting->spi_d, (spi_mode)_currentSetting->dataMode, flags); + // added for DMA callbacks. + _currentSetting->state = SPI_STATE_READY; } void SPIClass::end(void) { @@ -182,6 +191,9 @@ void SPIClass::end(void) { while (spi_is_busy(_currentSetting->spi_d)) ; spi_peripheral_disable(_currentSetting->spi_d); + // added for DMA callbacks. + // Need to add unsetting the callbacks for the DMA channels. + _currentSetting->state = SPI_STATE_IDLE; } /* Roger Clark added 3 functions */ @@ -384,98 +396,126 @@ uint16_t SPIClass::transfer16(uint16_t wr_data) const /* Roger Clark and Victor Perez, 2015 * Performs a DMA SPI transfer with at least a receive buffer. -* If a TX buffer is not provided, FF is sent over and over for the length of the transfer. -* On exit TX buffer is not modified, and RX buffer contains the received data. +* If a TX buffer is not provided, FF is sent over and over for the lenght of the transfer. +* On exit TX buffer is not modified, and RX buffer cotains the received data. * Still in progress. */ -uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length) -{ - if (length == 0) return 0; - uint8 b = 0; -// dma1_ch3_Active=true; +void SPIClass::dmaTransferSet(void *transmitBuf, void *receiveBuf) { dma_init(_currentSetting->spiDmaDev); -// dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); - - // RX + //spi_rx_dma_enable(_currentSetting->spi_d); + //spi_tx_dma_enable(_currentSetting->spi_d); dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - receiveBuf, dma_bit_size, (DMA_MINC_MODE));// receive buffer DMA - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive - - // TX - uint32 flags = (DMA_MINC_MODE | DMA_FROM_MEM); - if ( transmitBuf==0 ) { - static uint8_t ff = 0XFF; - transmitBuf = &ff; - flags ^= DMA_MINC_MODE; // remove increment mode + receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT ));// receive buffer DMA + if (!transmitBuf) { + transmitBuf = &ff; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, (DMA_FROM_MEM));// Transmit FF repeatedly } + else { dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + transmitBuf, dma_bit_size, (DMA_MINC_MODE | DMA_FROM_MEM ));// Transmit buffer DMA + } + dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, DMA_PRIORITY_LOW); + dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, DMA_PRIORITY_VERY_HIGH); +} + +uint8 SPIClass::dmaTransferRepeat(uint16 length) { + if (length == 0) return 0; + if (spi_is_rx_nonempty(_currentSetting->spi_d) == 1) spi_rx_reg(_currentSetting->spi_d); + _currentSetting->state = SPI_STATE_TRANSFER; + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - - spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. spi_rx_dma_enable(_currentSetting->spi_d); - spi_tx_dma_enable(_currentSetting->spi_d); // must be the last enable to avoid DMA error flag - + spi_tx_dma_enable(_currentSetting->spi_d); + if (_currentSetting->receiveCallback){ + return 0; + } + //uint32_t m = millis(); + uint8 b = 0; uint32_t m = millis(); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. - //delayMicroseconds(10); + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) { + //Avoid interrupts and just loop waiting for the flag to be set. if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." spi_tx_dma_disable(_currentSetting->spi_d); - spi_rx_dma_disable(_currentSetting->spi_d); // And disable generation of DMA request from the SPI port so other peripherals can use the channels - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + spi_rx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + _currentSetting->state = SPI_STATE_READY; return b; } +/* Roger Clark and Victor Perez, 2015 +* Performs a DMA SPI transfer with at least a receive buffer. +* If a TX buffer is not provided, FF is sent over and over for the length of the transfer. +* On exit TX buffer is not modified, and RX buffer contains the received data. +* Still in progress. +*/ + +uint8 SPIClass::dmaTransfer(void *transmitBuf, void *receiveBuf, uint16 length) { + dmaTransferSet(transmitBuf, receiveBuf); + return dmaTransferRepeat(length); +} + /* Roger Clark and Victor Perez, 2015 * Performs a DMA SPI send using a TX buffer. * On exit TX buffer is not modified. * Still in progress. * 2016 - stevstrong - reworked to automatically detect bit size from SPI setting */ -uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) -{ + +void SPIClass::dmaSendSet(void * transmitBuf, bool minc) { + uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); + dma_init(_currentSetting->spiDmaDev); + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, DMA_PRIORITY_LOW); +} + +uint8 SPIClass::dmaSendRepeat(uint16 length) { if (length == 0) return 0; - uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - uint8 b = 0; - dma_init(_currentSetting->spiDmaDev); - // TX - dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, flags);// Transmit buffer DMA - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + _currentSetting->state = SPI_STATE_TRANSMIT; dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - spi_tx_dma_enable(_currentSetting->spi_d); - - uint32_t m = millis(); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. - //delayMicroseconds(10); + spi_tx_dma_enable(_currentSetting->spi_d); + if (_currentSetting->transmitCallback) + { + return 0; + } + uint32_t m = millis(); + uint8 b = 0; + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) { + //Avoid interrupts and just loop waiting for the flag to be set. if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } - } - + } while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." spi_tx_dma_disable(_currentSetting->spi_d); dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + _currentSetting->state = SPI_STATE_READY; return b; } +uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) { + dmaSendSet(transmitBuf, minc); + return dmaSendRepeat(length); +} -uint8 SPIClass::dmaSendAsync(void * transmitBuf, uint16 length, bool minc) -{ - static bool isRunning=false; +uint8 SPIClass::dmaSendAsync(void * transmitBuf, uint16 length, bool minc) { uint8 b = 0; - if (isRunning) + if (_currentSetting->state != SPI_STATE_READY) { uint32_t m = millis(); @@ -488,29 +528,121 @@ uint8 SPIClass::dmaSendAsync(void * transmitBuf, uint16 length, bool minc) while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." spi_tx_dma_disable(_currentSetting->spi_d); dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - isRunning=false; + _currentSetting->state = SPI_STATE_READY; } if (length == 0) return 0; uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - dma_init(_currentSetting->spiDmaDev); + + dma_init(_currentSetting->spiDmaDev); // TX dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit spi_tx_dma_enable(_currentSetting->spi_d); - isRunning=true; + _currentSetting->state = SPI_STATE_TRANSMIT; return b; } +/* + New functions added to manage callbacks. + Victor Perez 2017 +*/ + +void SPIClass::onReceive(void(*callback)(void)) { + _currentSetting->receiveCallback = callback; + if (callback){ + switch (_currentSetting->spi_d->clk_id) { + case RCC_SPI1: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi1EventCallback); + break; + case RCC_SPI2: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi2EventCallback); + break; + #if BOARD_NR_SPI >= 3 + case RCC_SPI3: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi3EventCallback); + break; + #endif + default: + ASSERT(0); + } + } + else { + dma_detach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + } +} + +void SPIClass::onTransmit(void(*callback)(void)) { + _currentSetting->transmitCallback = callback; + if (callback){ + switch (_currentSetting->spi_d->clk_id) { + case RCC_SPI1: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi1EventCallback); + break; + case RCC_SPI2: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi2EventCallback); + break; + #if BOARD_NR_SPI >= 3 + case RCC_SPI3: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi3EventCallback); + break; + #endif + default: + ASSERT(0); + } + } + else { + dma_detach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + } +} + +/* + TODO: check if better to first call the customer code, next disable the DMA requests. + Also see if we need to check whether callbacks are set or not, may be better to be checked during the initial setup and only set the callback to EventCallback if they are set. +*/ + +void SPIClass::EventCallback() { + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0" + switch (_currentSetting->state) { + case SPI_STATE_TRANSFER: + while (spi_is_rx_nonempty(_currentSetting->spi_d)); + _currentSetting->state = SPI_STATE_READY; + spi_tx_dma_disable(_currentSetting->spi_d); + spi_rx_dma_disable(_currentSetting->spi_d); + //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + + if (_currentSetting->receiveCallback) + { + _currentSetting->receiveCallback(); + } + break; + case SPI_STATE_TRANSMIT: + _currentSetting->state = SPI_STATE_READY; + spi_tx_dma_disable(_currentSetting->spi_d); + //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + if (_currentSetting->transmitCallback) + { + _currentSetting->transmitCallback(); + } + + break; + default: + // we shouldn't get here, so better to add an assert and fail. + return; + } +} + void SPIClass::attachInterrupt(void) { // Should be enableInterrupt() } @@ -557,85 +689,101 @@ uint8 SPIClass::recv(void) { return this->read(); } +/* + DMA call back functions, one per port. +*/ + +void SPIClass::_spi1EventCallback() +{ + reinterpret_cast(_spi1_this)->EventCallback(); +} +void SPIClass::_spi2EventCallback() { + reinterpret_cast(_spi2_this)->EventCallback(); +} +#if BOARD_NR_SPI >= 3 +void SPIClass::_spi3EventCallback() { + reinterpret_cast(_spi3_this)->EventCallback(); +} +#endif /* - * Auxiliary functions - */ +* Auxiliary functions +*/ static const spi_pins* dev_to_spi_pins(spi_dev *dev) { - switch (dev->clk_id) { + switch (dev->clk_id) { #if BOARD_NR_SPI >= 1 - case RCC_SPI1: return board_spi_pins; + case RCC_SPI1: return board_spi_pins; #endif #if BOARD_NR_SPI >= 2 - case RCC_SPI2: return board_spi_pins + 1; + case RCC_SPI2: return board_spi_pins + 1; #endif #if BOARD_NR_SPI >= 3 - case RCC_SPI3: return board_spi_pins + 2; + case RCC_SPI3: return board_spi_pins + 2; #endif - default: return NULL; - } + default: return NULL; + } } static void disable_pwm(const stm32_pin_info *i) { - if (i->timer_device) { - timer_set_mode(i->timer_device, i->timer_channel, TIMER_DISABLED); - } + if (i->timer_device) { + timer_set_mode(i->timer_device, i->timer_channel, TIMER_DISABLED); + } } static void configure_gpios(spi_dev *dev, bool as_master) { - const spi_pins *pins = dev_to_spi_pins(dev); + const spi_pins *pins = dev_to_spi_pins(dev); - if (!pins) { - return; - } + if (!pins) { + return; + } - const stm32_pin_info *nssi = &PIN_MAP[pins->nss]; - const stm32_pin_info *scki = &PIN_MAP[pins->sck]; - const stm32_pin_info *misoi = &PIN_MAP[pins->miso]; - const stm32_pin_info *mosii = &PIN_MAP[pins->mosi]; + const stm32_pin_info *nssi = &PIN_MAP[pins->nss]; + const stm32_pin_info *scki = &PIN_MAP[pins->sck]; + const stm32_pin_info *misoi = &PIN_MAP[pins->miso]; + const stm32_pin_info *mosii = &PIN_MAP[pins->mosi]; - disable_pwm(nssi); - disable_pwm(scki); - disable_pwm(misoi); - disable_pwm(mosii); + disable_pwm(nssi); + disable_pwm(scki); + disable_pwm(misoi); + disable_pwm(mosii); - spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, - scki->gpio_device, scki->gpio_bit, misoi->gpio_bit, - mosii->gpio_bit); + spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, + scki->gpio_device, scki->gpio_bit, misoi->gpio_bit, + mosii->gpio_bit); } static const spi_baud_rate baud_rates[8] __FLASH__ = { - SPI_BAUD_PCLK_DIV_2, - SPI_BAUD_PCLK_DIV_4, - SPI_BAUD_PCLK_DIV_8, - SPI_BAUD_PCLK_DIV_16, - SPI_BAUD_PCLK_DIV_32, - SPI_BAUD_PCLK_DIV_64, - SPI_BAUD_PCLK_DIV_128, - SPI_BAUD_PCLK_DIV_256, + SPI_BAUD_PCLK_DIV_2, + SPI_BAUD_PCLK_DIV_4, + SPI_BAUD_PCLK_DIV_8, + SPI_BAUD_PCLK_DIV_16, + SPI_BAUD_PCLK_DIV_32, + SPI_BAUD_PCLK_DIV_64, + SPI_BAUD_PCLK_DIV_128, + SPI_BAUD_PCLK_DIV_256, }; /* - * Note: This assumes you're on a LeafLabs-style board - * (CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). - */ +* Note: This assumes you're on a LeafLabs-style board +* (CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). +*/ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { uint32_t clock = 0, i; #ifdef SPI_DEBUG Serial.print("determine_baud_rate("); Serial.print(freq); Serial.println(")"); #endif - switch (rcc_dev_clk(dev->clk_id)) - { - case RCC_APB2: clock = STM32_PCLK2; break; // 72 Mhz - case RCC_APB1: clock = STM32_PCLK1; break; // 36 Mhz - } - clock /= 2; - i = 0; - while (i < 7 && freq < clock) { - clock /= 2; - i++; - } + switch (rcc_dev_clk(dev->clk_id)) + { + case RCC_APB2: clock = STM32_PCLK2; break; // 72 Mhz + case RCC_APB1: clock = STM32_PCLK1; break; // 36 Mhz + } + clock /= 2; + i = 0; + while (i < 7 && freq < clock) { + clock /= 2; + i++; + } return baud_rates[i]; } diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 4d9b563ed..2160d2696 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -99,6 +99,13 @@ #define DATA_SIZE_8BIT SPI_CR1_DFF_8_BIT #define DATA_SIZE_16BIT SPI_CR1_DFF_16_BIT +typedef enum { + SPI_STATE_IDLE, + SPI_STATE_READY, + SPI_STATE_RECEIVE, + SPI_STATE_TRANSMIT, + SPI_STATE_TRANSFER + } spi_mode_t; class SPISettings { public: SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { @@ -134,21 +141,31 @@ class SPISettings { this->dataSize = dataSize; } uint32_t clock; + uint32_t dataSize; + uint32_t clockDivider; BitOrder bitOrder; uint8_t dataMode; - uint32_t dataSize; - + uint8_t _SSPin; + volatile spi_mode_t state; spi_dev *spi_d; - uint8_t _SSPin; - uint32_t clockDivider; dma_channel spiRxDmaChannel, spiTxDmaChannel; dma_dev* spiDmaDev; + void (*receiveCallback)(void) = NULL; + void (*transmitCallback)(void) = NULL; friend class SPIClass; }; -volatile static bool dma1_ch3_Active; +/* + Should move this to within the class once tested out, just for tidyness +*/ +static uint8_t ff = 0XFF; +static void (*_spi1_this); +static void (*_spi2_this); +#if BOARD_NR_SPI >= 3 +static void (*_spi3_this); +#endif /** * @brief Wirish SPI interface. @@ -217,7 +234,15 @@ class SPIClass { */ void setDataSize(uint32 ds); - + /* Victor Perez 2017. Added to set and clear callback functions for callback + * on DMA transfer completion. + * onReceive used to set the callback in case of dmaTransfer (tx/rx), once rx is completed + * onTransmit used to set the callback in case of dmaSend (tx only). That function + * will NOT be called in case of TX/RX + */ + void onReceive(void(*)(void)); + void onTransmit(void(*)(void)); + /* * I/O */ @@ -279,7 +304,9 @@ class SPIClass { * @param receiveBuf buffer Bytes to save received data. * @param length Number of bytes in buffer to transmit. */ - uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); + uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); + void dmaTransferSet(void *transmitBuf, void *receiveBuf); + uint8 dmaTransferRepeat(uint16 length); /** * @brief Sets up a DMA Transmit for SPI 8 or 16 bit transfer mode. @@ -289,9 +316,13 @@ class SPIClass { * * @param data buffer half words to transmit, * @param length Number of bytes in buffer to transmit. + * @param minc Set to use Memory Increment mode, clear to use Circular mode. */ - uint8 dmaSend(void * transmitBuf, uint16 length, bool minc = 1); - uint8 dmaSendAsync(void * transmitBuf, uint16 length, bool minc = 1); + uint8 dmaSend(void * transmitBuf, uint16 length, bool minc = 1); + void dmaSendSet(void * transmitBuf, bool minc); + uint8 dmaSendRepeat(uint16 length); + + uint8 dmaSendAsync(void * transmitBuf, uint16 length, bool minc = 1); /* * Pin accessors */ @@ -325,7 +356,7 @@ class SPIClass { spi_dev* c_dev(void) { return _currentSetting->spi_d; } - spi_dev *dev(){ return _currentSetting->spi_d;} + spi_dev *dev(){ return _currentSetting->spi_d;} /** * @brief Sets the number of the SPI peripheral to be used by @@ -335,10 +366,10 @@ class SPIClass { * or 1-3 in high density devices. */ - void setModule(int spi_num) - { - _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed - } + void setModule(int spi_num) + { + _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed + } /* -- The following methods are deprecated --------------------------- */ @@ -374,19 +405,23 @@ class SPIClass { uint8 recv(void); private: -/* - static inline void DMA1_CH3_Event() { - dma1_ch3_Active = 0; -// dma_disable(DMA1, DMA_CH3); -// dma_disable(DMA1, DMA_CH2); - - // To Do. Need to wait for - } -*/ + SPISettings _settings[BOARD_NR_SPI]; SPISettings *_currentSetting; void updateSettings(void); + /* + * Functions added for DMA transfers with Callback. + * Experimental. + */ + + void EventCallback(void); + + static void _spi1EventCallback(void); + static void _spi2EventCallback(void); + #if BOARD_NR_SPI >= 3 + static void _spi3EventCallback(void); + #endif /* spi_dev *spi_d; uint8_t _SSPin; From 910072c7db2c0f81452589cc8fdf965457824aa1 Mon Sep 17 00:00:00 2001 From: victorpv Date: Mon, 10 Jul 2017 12:08:59 -0500 Subject: [PATCH 144/307] Changes tabs for spaces. --- STM32F1/libraries/SPI/src/SPI.cpp | 692 +++++++++++++++--------------- 1 file changed, 346 insertions(+), 346 deletions(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 998f9b0f2..94e5031c8 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -94,14 +94,14 @@ static const spi_pins board_spi_pins[] __FLASH__ = { SPIClass::SPIClass(uint32 spi_num) { - _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed + _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed - + switch (spi_num) { #if BOARD_NR_SPI >= 1 case 1: _currentSetting->spi_d = SPI1; - _spi1_this = (void*) this; + _spi1_this = (void*) this; break; #endif #if BOARD_NR_SPI >= 2 @@ -119,25 +119,25 @@ SPIClass::SPIClass(uint32 spi_num) { default: ASSERT(0); } - - // Init things specific to each SPI device - // clock divider setup is a bit of hack, and needs to be improved at a later date. - _settings[0].spi_d = SPI1; - _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); - _settings[0].spiDmaDev = DMA1; - _settings[0].spiTxDmaChannel = DMA_CH3; - _settings[0].spiRxDmaChannel = DMA_CH2; - _settings[1].spi_d = SPI2; - _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); - _settings[1].spiDmaDev = DMA1; - _settings[1].spiTxDmaChannel = DMA_CH5; - _settings[1].spiRxDmaChannel = DMA_CH4; + + // Init things specific to each SPI device + // clock divider setup is a bit of hack, and needs to be improved at a later date. + _settings[0].spi_d = SPI1; + _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); + _settings[0].spiDmaDev = DMA1; + _settings[0].spiTxDmaChannel = DMA_CH3; + _settings[0].spiRxDmaChannel = DMA_CH2; + _settings[1].spi_d = SPI2; + _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); + _settings[1].spiDmaDev = DMA1; + _settings[1].spiTxDmaChannel = DMA_CH5; + _settings[1].spiRxDmaChannel = DMA_CH4; #if BOARD_NR_SPI >= 3 - _settings[2].spi_d = SPI3; - _settings[2].clockDivider = determine_baud_rate(_settings[2].spi_d, _settings[2].clock); - _settings[2].spiDmaDev = DMA2; - _settings[2].spiTxDmaChannel = DMA_CH2; - _settings[2].spiRxDmaChannel = DMA_CH1; + _settings[2].spi_d = SPI3; + _settings[2].clockDivider = determine_baud_rate(_settings[2].spi_d, _settings[2].clock); + _settings[2].spiDmaDev = DMA2; + _settings[2].spiTxDmaChannel = DMA_CH2; + _settings[2].spiRxDmaChannel = DMA_CH1; #endif // added for DMA callbacks. @@ -148,11 +148,11 @@ SPIClass::SPIClass(uint32 spi_num) { * Set up/tear down */ void SPIClass::updateSettings(void) { - uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE | SPI_SOFT_SS); - #ifdef SPI_DEBUG - Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); - #endif - spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags); + uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE | SPI_SOFT_SS); + #ifdef SPI_DEBUG + Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + #endif + spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags); } void SPIClass::begin(void) { @@ -167,9 +167,9 @@ void SPIClass::beginSlave(void) { spi_init(_currentSetting->spi_d); configure_gpios(_currentSetting->spi_d, 0); uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_RX_ONLY); - #ifdef SPI_DEBUG - Serial.print("spi_slave_enable("); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); - #endif + #ifdef SPI_DEBUG + Serial.print("spi_slave_enable("); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + #endif spi_slave_enable(_currentSetting->spi_d, (spi_mode)_currentSetting->dataMode, flags); // added for DMA callbacks. _currentSetting->state = SPI_STATE_READY; @@ -199,23 +199,23 @@ void SPIClass::end(void) { /* Roger Clark added 3 functions */ void SPIClass::setClockDivider(uint32_t clockDivider) { - #ifdef SPI_DEBUG - Serial.print("Clock divider set to "); Serial.println(clockDivider); - #endif - _currentSetting->clockDivider = clockDivider; - uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_BR); - _currentSetting->spi_d->regs->CR1 = cr1 | (clockDivider & SPI_CR1_BR); + #ifdef SPI_DEBUG + Serial.print("Clock divider set to "); Serial.println(clockDivider); + #endif + _currentSetting->clockDivider = clockDivider; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_BR); + _currentSetting->spi_d->regs->CR1 = cr1 | (clockDivider & SPI_CR1_BR); } void SPIClass::setBitOrder(BitOrder bitOrder) { - #ifdef SPI_DEBUG - Serial.print("Bit order set to "); Serial.println(bitOrder); - #endif - _currentSetting->bitOrder = bitOrder; - uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_LSBFIRST); - if ( bitOrder==LSBFIRST ) cr1 |= SPI_CR1_LSBFIRST; - _currentSetting->spi_d->regs->CR1 = cr1; + #ifdef SPI_DEBUG + Serial.print("Bit order set to "); Serial.println(bitOrder); + #endif + _currentSetting->bitOrder = bitOrder; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_LSBFIRST); + if ( bitOrder==LSBFIRST ) cr1 |= SPI_CR1_LSBFIRST; + _currentSetting->spi_d->regs->CR1 = cr1; } /* Victor Perez. Added to test changing datasize from 8 to 16 bit modes on the fly. @@ -224,11 +224,11 @@ void SPIClass::setBitOrder(BitOrder bitOrder) */ void SPIClass::setDataSize(uint32 datasize) { - _currentSetting->dataSize = datasize; - uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF); - uint8 en = spi_is_enabled(_currentSetting->spi_d); - spi_peripheral_disable(_currentSetting->spi_d); - _currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF) | en; + _currentSetting->dataSize = datasize; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF); + uint8 en = spi_is_enabled(_currentSetting->spi_d); + spi_peripheral_disable(_currentSetting->spi_d); + _currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF) | en; } void SPIClass::setDataMode(uint8_t dataMode) @@ -258,56 +258,56 @@ bit 0 - CPHA : Clock phase If someone finds this is not the case or sees a logic error with this let me know ;-) */ - #ifdef SPI_DEBUG - Serial.print("Data mode set to "); Serial.println(dataMode); - #endif - _currentSetting->dataMode = dataMode; - uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA); - _currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA)); + #ifdef SPI_DEBUG + Serial.print("Data mode set to "); Serial.println(dataMode); + #endif + _currentSetting->dataMode = dataMode; + uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA); + _currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA)); } void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) { - #ifdef SPI_DEBUG - Serial.println("SPIClass::beginTransaction"); - #endif - setBitOrder(settings.bitOrder); - setDataMode(settings.dataMode); - setDataSize(settings.dataSize); - setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); - begin(); + #ifdef SPI_DEBUG + Serial.println("SPIClass::beginTransaction"); + #endif + setBitOrder(settings.bitOrder); + setDataMode(settings.dataMode); + setDataSize(settings.dataSize); + setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); + begin(); } void SPIClass::beginTransactionSlave(SPISettings settings) { - #ifdef SPI_DEBUG - Serial.println(F("SPIClass::beginTransactionSlave")); - #endif - setBitOrder(settings.bitOrder); - setDataMode(settings.dataMode); - setDataSize(settings.dataSize); - beginSlave(); + #ifdef SPI_DEBUG + Serial.println(F("SPIClass::beginTransactionSlave")); + #endif + setBitOrder(settings.bitOrder); + setDataMode(settings.dataMode); + setDataSize(settings.dataSize); + beginSlave(); } void SPIClass::endTransaction(void) { - #ifdef SPI_DEBUG - Serial.println("SPIClass::endTransaction"); - #endif - //digitalWrite(_SSPin,HIGH); + #ifdef SPI_DEBUG + Serial.println("SPIClass::endTransaction"); + #endif + //digitalWrite(_SSPin,HIGH); #if false // code from SAM core - uint8_t mode = interruptMode; - if (mode > 0) { - if (mode < 16) { - if (mode & 1) PIOA->PIO_IER = interruptMask[0]; - if (mode & 2) PIOB->PIO_IER = interruptMask[1]; - if (mode & 4) PIOC->PIO_IER = interruptMask[2]; - if (mode & 8) PIOD->PIO_IER = interruptMask[3]; - } else { - if (interruptSave) interrupts(); - } - } + uint8_t mode = interruptMode; + if (mode > 0) { + if (mode < 16) { + if (mode & 1) PIOA->PIO_IER = interruptMask[0]; + if (mode & 2) PIOB->PIO_IER = interruptMask[1]; + if (mode & 4) PIOC->PIO_IER = interruptMask[2]; + if (mode & 8) PIOD->PIO_IER = interruptMask[3]; + } else { + if (interruptSave) interrupts(); + } + } #endif } @@ -318,80 +318,80 @@ void SPIClass::endTransaction(void) uint16 SPIClass::read(void) { - while ( spi_is_rx_nonempty(_currentSetting->spi_d)==0 ) ; - return (uint16)spi_rx_reg(_currentSetting->spi_d); + while ( spi_is_rx_nonempty(_currentSetting->spi_d)==0 ) ; + return (uint16)spi_rx_reg(_currentSetting->spi_d); } void SPIClass::read(uint8 *buf, uint32 len) { - if ( len == 0 ) return; - spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. - spi_reg_map * regs = _currentSetting->spi_d->regs; - // start sequence: write byte 0 - regs->DR = 0x00FF; // write the first byte - // main loop - while ( (--len) ) { - while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag - noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data - regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. - while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register - *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. - interrupts(); // let systick do its job - } - // read remaining last byte - while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register - *buf++ = (uint8)(regs->DR); // read and store the received byte + if ( len == 0 ) return; + spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. + spi_reg_map * regs = _currentSetting->spi_d->regs; + // start sequence: write byte 0 + regs->DR = 0x00FF; // write the first byte + // main loop + while ( (--len) ) { + while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag + noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data + regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register + *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. + interrupts(); // let systick do its job + } + // read remaining last byte + while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register + *buf++ = (uint8)(regs->DR); // read and store the received byte } void SPIClass::write(uint16 data) { - /* Added for 16bit data Victor Perez. Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, - * by taking the Tx code from transfer(byte) - * This almost doubles the speed of this function. - */ - spi_tx_reg(_currentSetting->spi_d, data); // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + /* Added for 16bit data Victor Perez. Roger Clark + * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, + * by taking the Tx code from transfer(byte) + * This almost doubles the speed of this function. + */ + spi_tx_reg(_currentSetting->spi_d, data); // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } void SPIClass::write(uint16 data, uint32 n) { - // Added by stevstrong: Repeatedly send same data by the specified number of times - spi_reg_map * regs = _currentSetting->spi_d->regs; - while ( (n--)>0 ) { - regs->DR = data; // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) - while ( (regs->SR & SPI_SR_TXE)==0 ) ; // wait till Tx empty - } - while ( (regs->SR & SPI_SR_BSY) != 0); // wait until BSY=0 before returning + // Added by stevstrong: Repeatedly send same data by the specified number of times + spi_reg_map * regs = _currentSetting->spi_d->regs; + while ( (n--)>0 ) { + regs->DR = data; // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + while ( (regs->SR & SPI_SR_TXE)==0 ) ; // wait till Tx empty + } + while ( (regs->SR & SPI_SR_BSY) != 0); // wait until BSY=0 before returning } void SPIClass::write(void *data, uint32 length) { - spi_dev * spi_d = _currentSetting->spi_d; - spi_tx(spi_d, (void*)data, length); // data can be array of bytes or words - while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_dev * spi_d = _currentSetting->spi_d; + spi_tx(spi_d, (void*)data, length); // data can be array of bytes or words + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } uint8 SPIClass::transfer(uint8 byte) const { - spi_dev * spi_d = _currentSetting->spi_d; - spi_rx_reg(spi_d); // read any previous data - spi_tx_reg(spi_d, byte); // Write the data item to be transmitted into the SPI_DR register - while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint8)spi_rx_reg(spi_d); // "... and read the last received data." + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, byte); // Write the data item to be transmitted into the SPI_DR register + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint8)spi_rx_reg(spi_d); // "... and read the last received data." } uint16_t SPIClass::transfer16(uint16_t wr_data) const { - spi_dev * spi_d = _currentSetting->spi_d; - spi_rx_reg(spi_d); // read any previous data - spi_tx_reg(spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint16)spi_rx_reg(spi_d); // "... and read the last received data." + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + return (uint16)spi_rx_reg(spi_d); // "... and read the last received data." } /* Roger Clark and Victor Perez, 2015 @@ -402,54 +402,54 @@ uint16_t SPIClass::transfer16(uint16_t wr_data) const */ void SPIClass::dmaTransferSet(void *transmitBuf, void *receiveBuf) { dma_init(_currentSetting->spiDmaDev); - //spi_rx_dma_enable(_currentSetting->spi_d); - //spi_tx_dma_enable(_currentSetting->spi_d); - dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + //spi_rx_dma_enable(_currentSetting->spi_d); + //spi_tx_dma_enable(_currentSetting->spi_d); + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT ));// receive buffer DMA - if (!transmitBuf) { - transmitBuf = &ff; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + if (!transmitBuf) { + transmitBuf = &ff; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, transmitBuf, dma_bit_size, (DMA_FROM_MEM));// Transmit FF repeatedly - } - else { + } + else { dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, transmitBuf, dma_bit_size, (DMA_MINC_MODE | DMA_FROM_MEM ));// Transmit buffer DMA - } - dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, DMA_PRIORITY_LOW); - dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, DMA_PRIORITY_VERY_HIGH); + } + dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, DMA_PRIORITY_LOW); + dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, DMA_PRIORITY_VERY_HIGH); } uint8 SPIClass::dmaTransferRepeat(uint16 length) { - if (length == 0) return 0; - if (spi_is_rx_nonempty(_currentSetting->spi_d) == 1) spi_rx_reg(_currentSetting->spi_d); - _currentSetting->state = SPI_STATE_TRANSFER; - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - spi_rx_dma_enable(_currentSetting->spi_d); - spi_tx_dma_enable(_currentSetting->spi_d); + if (length == 0) return 0; + if (spi_is_rx_nonempty(_currentSetting->spi_d) == 1) spi_rx_reg(_currentSetting->spi_d); + _currentSetting->state = SPI_STATE_TRANSFER; + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + spi_rx_dma_enable(_currentSetting->spi_d); + spi_tx_dma_enable(_currentSetting->spi_d); if (_currentSetting->receiveCallback){ return 0; } //uint32_t m = millis(); uint8 b = 0; uint32_t m = millis(); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) { - //Avoid interrupts and just loop waiting for the flag to be set. - if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) { + //Avoid interrupts and just loop waiting for the flag to be set. + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - spi_tx_dma_disable(_currentSetting->spi_d); - spi_rx_dma_disable(_currentSetting->spi_d); + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_dma_disable(_currentSetting->spi_d); + spi_rx_dma_disable(_currentSetting->spi_d); dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - _currentSetting->state = SPI_STATE_READY; + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + _currentSetting->state = SPI_STATE_READY; return b; } @@ -461,8 +461,8 @@ uint8 SPIClass::dmaTransferRepeat(uint16 length) { */ uint8 SPIClass::dmaTransfer(void *transmitBuf, void *receiveBuf, uint16 length) { - dmaTransferSet(transmitBuf, receiveBuf); - return dmaTransferRepeat(length); + dmaTransferSet(transmitBuf, receiveBuf); + return dmaTransferRepeat(length); } /* Roger Clark and Victor Perez, 2015 @@ -482,29 +482,29 @@ void SPIClass::dmaSendSet(void * transmitBuf, bool minc) { } uint8 SPIClass::dmaSendRepeat(uint16 length) { - if (length == 0) return 0; - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - _currentSetting->state = SPI_STATE_TRANSMIT; - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - spi_tx_dma_enable(_currentSetting->spi_d); - if (_currentSetting->transmitCallback) - { - return 0; - } - uint32_t m = millis(); - uint8 b = 0; - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) { - //Avoid interrupts and just loop waiting for the flag to be set. - if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } - } - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - spi_tx_dma_disable(_currentSetting->spi_d); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - _currentSetting->state = SPI_STATE_READY; - return b; + if (length == 0) return 0; + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + _currentSetting->state = SPI_STATE_TRANSMIT; + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + spi_tx_dma_enable(_currentSetting->spi_d); + if (_currentSetting->transmitCallback) + { + return 0; + } + uint32_t m = millis(); + uint8 b = 0; + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) { + //Avoid interrupts and just loop waiting for the flag to be set. + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + _currentSetting->state = SPI_STATE_READY; + return b; } uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) { @@ -513,42 +513,42 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) { } uint8 SPIClass::dmaSendAsync(void * transmitBuf, uint16 length, bool minc) { - uint8 b = 0; - - if (_currentSetting->state != SPI_STATE_READY) - { - - uint32_t m = millis(); - while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. - //delayMicroseconds(10); - if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } - } - - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - spi_tx_dma_disable(_currentSetting->spi_d); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - _currentSetting->state = SPI_STATE_READY; - } + uint8 b = 0; + + if (_currentSetting->state != SPI_STATE_READY) + { + + uint32_t m = millis(); + while ((dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)==0) {//Avoid interrupts and just loop waiting for the flag to be set. + //delayMicroseconds(10); + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } + + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + _currentSetting->state = SPI_STATE_READY; + } - - if (length == 0) return 0; - uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); + + if (length == 0) return 0; + uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - - dma_init(_currentSetting->spiDmaDev); - // TX - dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, flags);// Transmit buffer DMA - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - spi_tx_dma_enable(_currentSetting->spi_d); + + dma_init(_currentSetting->spiDmaDev); + // TX + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + spi_tx_dma_enable(_currentSetting->spi_d); - _currentSetting->state = SPI_STATE_TRANSMIT; + _currentSetting->state = SPI_STATE_TRANSMIT; - return b; + return b; } @@ -558,51 +558,51 @@ uint8 SPIClass::dmaSendAsync(void * transmitBuf, uint16 length, bool minc) { */ void SPIClass::onReceive(void(*callback)(void)) { - _currentSetting->receiveCallback = callback; - if (callback){ - switch (_currentSetting->spi_d->clk_id) { - case RCC_SPI1: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi1EventCallback); - break; - case RCC_SPI2: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi2EventCallback); - break; - #if BOARD_NR_SPI >= 3 - case RCC_SPI3: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi3EventCallback); - break; - #endif - default: - ASSERT(0); - } - } - else { - dma_detach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - } + _currentSetting->receiveCallback = callback; + if (callback){ + switch (_currentSetting->spi_d->clk_id) { + case RCC_SPI1: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi1EventCallback); + break; + case RCC_SPI2: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi2EventCallback); + break; + #if BOARD_NR_SPI >= 3 + case RCC_SPI3: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi3EventCallback); + break; + #endif + default: + ASSERT(0); + } + } + else { + dma_detach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + } } void SPIClass::onTransmit(void(*callback)(void)) { - _currentSetting->transmitCallback = callback; - if (callback){ - switch (_currentSetting->spi_d->clk_id) { - case RCC_SPI1: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi1EventCallback); - break; - case RCC_SPI2: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi2EventCallback); - break; - #if BOARD_NR_SPI >= 3 - case RCC_SPI3: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi3EventCallback); - break; - #endif - default: - ASSERT(0); - } - } - else { - dma_detach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - } + _currentSetting->transmitCallback = callback; + if (callback){ + switch (_currentSetting->spi_d->clk_id) { + case RCC_SPI1: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi1EventCallback); + break; + case RCC_SPI2: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi2EventCallback); + break; + #if BOARD_NR_SPI >= 3 + case RCC_SPI3: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi3EventCallback); + break; + #endif + default: + ASSERT(0); + } + } + else { + dma_detach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + } } /* @@ -611,44 +611,44 @@ void SPIClass::onTransmit(void(*callback)(void)) { */ void SPIClass::EventCallback() { - while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0" - switch (_currentSetting->state) { - case SPI_STATE_TRANSFER: - while (spi_is_rx_nonempty(_currentSetting->spi_d)); - _currentSetting->state = SPI_STATE_READY; - spi_tx_dma_disable(_currentSetting->spi_d); - spi_rx_dma_disable(_currentSetting->spi_d); - //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - - if (_currentSetting->receiveCallback) - { - _currentSetting->receiveCallback(); - } - break; - case SPI_STATE_TRANSMIT: - _currentSetting->state = SPI_STATE_READY; - spi_tx_dma_disable(_currentSetting->spi_d); - //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - if (_currentSetting->transmitCallback) - { - _currentSetting->transmitCallback(); - } - - break; - default: - // we shouldn't get here, so better to add an assert and fail. - return; - } + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0" + switch (_currentSetting->state) { + case SPI_STATE_TRANSFER: + while (spi_is_rx_nonempty(_currentSetting->spi_d)); + _currentSetting->state = SPI_STATE_READY; + spi_tx_dma_disable(_currentSetting->spi_d); + spi_rx_dma_disable(_currentSetting->spi_d); + //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + + if (_currentSetting->receiveCallback) + { + _currentSetting->receiveCallback(); + } + break; + case SPI_STATE_TRANSMIT: + _currentSetting->state = SPI_STATE_READY; + spi_tx_dma_disable(_currentSetting->spi_d); + //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + if (_currentSetting->transmitCallback) + { + _currentSetting->transmitCallback(); + } + + break; + default: + // we shouldn't get here, so better to add an assert and fail. + return; + } } void SPIClass::attachInterrupt(void) { - // Should be enableInterrupt() + // Should be enableInterrupt() } void SPIClass::detachInterrupt(void) { - // Should be disableInterrupt() + // Should be disableInterrupt() } /* @@ -699,11 +699,11 @@ void SPIClass::_spi1EventCallback() } void SPIClass::_spi2EventCallback() { - reinterpret_cast(_spi2_this)->EventCallback(); + reinterpret_cast(_spi2_this)->EventCallback(); } #if BOARD_NR_SPI >= 3 void SPIClass::_spi3EventCallback() { - reinterpret_cast(_spi3_this)->EventCallback(); + reinterpret_cast(_spi3_this)->EventCallback(); } #endif /* @@ -711,57 +711,57 @@ void SPIClass::_spi3EventCallback() { */ static const spi_pins* dev_to_spi_pins(spi_dev *dev) { - switch (dev->clk_id) { + switch (dev->clk_id) { #if BOARD_NR_SPI >= 1 - case RCC_SPI1: return board_spi_pins; + case RCC_SPI1: return board_spi_pins; #endif #if BOARD_NR_SPI >= 2 - case RCC_SPI2: return board_spi_pins + 1; + case RCC_SPI2: return board_spi_pins + 1; #endif #if BOARD_NR_SPI >= 3 - case RCC_SPI3: return board_spi_pins + 2; + case RCC_SPI3: return board_spi_pins + 2; #endif - default: return NULL; - } + default: return NULL; + } } static void disable_pwm(const stm32_pin_info *i) { - if (i->timer_device) { - timer_set_mode(i->timer_device, i->timer_channel, TIMER_DISABLED); - } + if (i->timer_device) { + timer_set_mode(i->timer_device, i->timer_channel, TIMER_DISABLED); + } } static void configure_gpios(spi_dev *dev, bool as_master) { - const spi_pins *pins = dev_to_spi_pins(dev); + const spi_pins *pins = dev_to_spi_pins(dev); - if (!pins) { - return; - } + if (!pins) { + return; + } - const stm32_pin_info *nssi = &PIN_MAP[pins->nss]; - const stm32_pin_info *scki = &PIN_MAP[pins->sck]; - const stm32_pin_info *misoi = &PIN_MAP[pins->miso]; - const stm32_pin_info *mosii = &PIN_MAP[pins->mosi]; + const stm32_pin_info *nssi = &PIN_MAP[pins->nss]; + const stm32_pin_info *scki = &PIN_MAP[pins->sck]; + const stm32_pin_info *misoi = &PIN_MAP[pins->miso]; + const stm32_pin_info *mosii = &PIN_MAP[pins->mosi]; - disable_pwm(nssi); - disable_pwm(scki); - disable_pwm(misoi); - disable_pwm(mosii); + disable_pwm(nssi); + disable_pwm(scki); + disable_pwm(misoi); + disable_pwm(mosii); - spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, - scki->gpio_device, scki->gpio_bit, misoi->gpio_bit, - mosii->gpio_bit); + spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, + scki->gpio_device, scki->gpio_bit, misoi->gpio_bit, + mosii->gpio_bit); } static const spi_baud_rate baud_rates[8] __FLASH__ = { - SPI_BAUD_PCLK_DIV_2, - SPI_BAUD_PCLK_DIV_4, - SPI_BAUD_PCLK_DIV_8, - SPI_BAUD_PCLK_DIV_16, - SPI_BAUD_PCLK_DIV_32, - SPI_BAUD_PCLK_DIV_64, - SPI_BAUD_PCLK_DIV_128, - SPI_BAUD_PCLK_DIV_256, + SPI_BAUD_PCLK_DIV_2, + SPI_BAUD_PCLK_DIV_4, + SPI_BAUD_PCLK_DIV_8, + SPI_BAUD_PCLK_DIV_16, + SPI_BAUD_PCLK_DIV_32, + SPI_BAUD_PCLK_DIV_64, + SPI_BAUD_PCLK_DIV_128, + SPI_BAUD_PCLK_DIV_256, }; /* @@ -769,22 +769,22 @@ static const spi_baud_rate baud_rates[8] __FLASH__ = { * (CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). */ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { - uint32_t clock = 0, i; - #ifdef SPI_DEBUG - Serial.print("determine_baud_rate("); Serial.print(freq); Serial.println(")"); - #endif - switch (rcc_dev_clk(dev->clk_id)) - { - case RCC_APB2: clock = STM32_PCLK2; break; // 72 Mhz - case RCC_APB1: clock = STM32_PCLK1; break; // 36 Mhz - } - clock /= 2; - i = 0; - while (i < 7 && freq < clock) { - clock /= 2; - i++; - } - return baud_rates[i]; + uint32_t clock = 0, i; + #ifdef SPI_DEBUG + Serial.print("determine_baud_rate("); Serial.print(freq); Serial.println(")"); + #endif + switch (rcc_dev_clk(dev->clk_id)) + { + case RCC_APB2: clock = STM32_PCLK2; break; // 72 Mhz + case RCC_APB1: clock = STM32_PCLK1; break; // 36 Mhz + } + clock /= 2; + i = 0; + while (i < 7 && freq < clock) { + clock /= 2; + i++; + } + return baud_rates[i]; } SPIClass SPI(1); From 0393be34008f663b99141d46a9919b901e522dac Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sat, 15 Jul 2017 18:31:02 +1000 Subject: [PATCH 145/307] Added setClock() to Wire and Hardware - only 100000Hz and 400000Hz are supported --- STM32F1/libraries/Wire/HardWire.cpp | 15 +++++++++++++++ STM32F1/libraries/Wire/HardWire.h | 1 + STM32F1/libraries/Wire/Wire.cpp | 26 ++++++++++++++++++++++++-- STM32F1/libraries/Wire/Wire.h | 9 ++++++++- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/STM32F1/libraries/Wire/HardWire.cpp b/STM32F1/libraries/Wire/HardWire.cpp index d81f584ae..51af7ad76 100644 --- a/STM32F1/libraries/Wire/HardWire.cpp +++ b/STM32F1/libraries/Wire/HardWire.cpp @@ -84,3 +84,18 @@ void HardWire::end() { i2c_disable(sel_hard); sel_hard = 0; } + +void HardWire::setClock(uint32_t frequencyHz) +{ + switch(frequencyHz) + { + case 400000: + dev_flags |= I2C_FAST_MODE;// set FAST_MODE bit + break; + case 100000: + default: + dev_flags &= ~I2C_FAST_MODE;// clear FAST_MODE bit + break; + } + +} diff --git a/STM32F1/libraries/Wire/HardWire.h b/STM32F1/libraries/Wire/HardWire.h index bf59a2f24..4d49e1a28 100644 --- a/STM32F1/libraries/Wire/HardWire.h +++ b/STM32F1/libraries/Wire/HardWire.h @@ -66,6 +66,7 @@ class HardWire : public WireBase { */ void end(); + void setClock(uint32_t frequencyHz); /* * Disables the I2C device and remove the device address. */ diff --git a/STM32F1/libraries/Wire/Wire.cpp b/STM32F1/libraries/Wire/Wire.cpp index fff850be8..712adf45b 100644 --- a/STM32F1/libraries/Wire/Wire.cpp +++ b/STM32F1/libraries/Wire/Wire.cpp @@ -56,7 +56,9 @@ void TwoWire::set_scl(bool state) { I2C_DELAY(this->i2c_delay); - digitalWrite(this->scl_pin,state); + + gpio_write_bit(sclDevice,sclBit, state); +// digitalWrite(this->scl_pin,state); //Allow for clock stretching - dangerous currently if (state == HIGH) { while(digitalRead(this->scl_pin) == 0); @@ -65,7 +67,8 @@ void TwoWire::set_scl(bool state) { void TwoWire::set_sda(bool state) { I2C_DELAY(this->i2c_delay); - digitalWrite(this->sda_pin, state); + gpio_write_bit(sdaDevice,sdaBit, state); + //digitalWrite(this->sda_pin, state); } void TwoWire::i2c_start() { @@ -198,6 +201,11 @@ void TwoWire::begin(uint8 self_addr) { rx_buf_len = 0; pinMode(this->scl_pin, OUTPUT_OPEN_DRAIN); pinMode(this->sda_pin, OUTPUT_OPEN_DRAIN); + + sclDevice = PIN_MAP[this->scl_pin].gpio_device; + sclBit = PIN_MAP[this->scl_pin].gpio_bit; + sdaDevice = PIN_MAP[this->sda_pin].gpio_device; + sdaBit = PIN_MAP[this->sda_pin].gpio_bit; set_scl(HIGH); set_sda(HIGH); } @@ -214,6 +222,20 @@ void TwoWire::end() } } +void TwoWire::setClock(uint32_t frequencyHz) +{ + switch(frequencyHz) + { + case 400000: + i2c_delay = SOFT_FAST; + break; + case 100000: + default: + i2c_delay = SOFT_STANDARD; + break; + } +} + TwoWire::~TwoWire() { this->scl_pin=0; this->sda_pin=0; diff --git a/STM32F1/libraries/Wire/Wire.h b/STM32F1/libraries/Wire/Wire.h index df474da7c..8fbddaae9 100644 --- a/STM32F1/libraries/Wire/Wire.h +++ b/STM32F1/libraries/Wire/Wire.h @@ -50,7 +50,7 @@ #define SDA PB7 #define SCL PB6 -#define SOFT_STANDARD 27 +#define SOFT_STANDARD 19 #define SOFT_FAST 0 @@ -126,6 +126,11 @@ class TwoWire : public WireBase { */ uint8 process(uint8); uint8 process(); + private: + gpio_dev *sdaDevice; + uint8 sdaBit; + gpio_dev *sclDevice; + uint8 sclBit; public: /* * Accept pin numbers for SCL and SDA lines. Set the delay needed @@ -139,6 +144,8 @@ class TwoWire : public WireBase { * .begin(uint8) in WireBase */ void begin(uint8 = 0x00); + + void setClock(uint32_t frequencyHz); /* * Sets pins SDA and SCL to INPUT From 4bfb444447905cd04c833d6538b6a0cee27f0d6a Mon Sep 17 00:00:00 2001 From: Cristi Marius Tiutiu Date: Mon, 17 Jul 2017 10:35:23 +0300 Subject: [PATCH 146/307] added teensy like ide compiler opts menus --- STM32F1/boards.txt | 419 ++++++++++++++++++++++++++++++++++++++++++- STM32F1/platform.txt | 10 +- STM32F3/boards.txt | 32 ++++ STM32F3/platform.txt | 8 +- STM32F4/boards.txt | 132 +++++++++++++- STM32F4/platform.txt | 8 +- 6 files changed, 593 insertions(+), 16 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 10a6591e6..b52623640 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -4,6 +4,7 @@ menu.device_variant=Variant menu.bootloader_version=Bootloader version menu.upload_method=Upload method menu.cpu_speed=CPU Speed(MHz) +menu.opt=Optimize ############################################################## mapleMini.name=Maple Mini @@ -43,6 +44,38 @@ mapleMini.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L mapleMini.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) mapleMini.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L +#-- Optimizations +mapleMini.menu.opt.o2std=Faster +mapleMini.menu.opt.o2std.build.flags.optimize=-O2 +mapleMini.menu.opt.o2std.build.flags.ldspecs= +mapleMini.menu.opt.o2lto=Faster with LTO +mapleMini.menu.opt.o2lto.build.flags.optimize=-O2 -flto +mapleMini.menu.opt.o2lto.build.flags.ldspecs=-flto +mapleMini.menu.opt.o1std=Fast +mapleMini.menu.opt.o1std.build.flags.optimize=-O1 +mapleMini.menu.opt.o1std.build.flags.ldspecs= +mapleMini.menu.opt.o1lto=Fast with LTO +mapleMini.menu.opt.o1lto.build.flags.optimize=-O1 -flto +mapleMini.menu.opt.o1lto.build.flags.ldspecs=-flto +mapleMini.menu.opt.o3std=Fastest +mapleMini.menu.opt.o3std.build.flags.optimize=-O3 +mapleMini.menu.opt.o3std.build.flags.ldspecs= +mapleMini.menu.opt.o3lto=Fastest with LTO +mapleMini.menu.opt.o3lto.build.flags.optimize=-O3 -flto +mapleMini.menu.opt.o3lto.build.flags.ldspecs=-flto +mapleMini.menu.opt.ogstd=Debug +mapleMini.menu.opt.ogstd.build.flags.optimize=-Og +mapleMini.menu.opt.ogstd.build.flags.ldspecs= +mapleMini.menu.opt.oglto=Debug with LTO +mapleMini.menu.opt.oglto.build.flags.optimize=-Og -flto +mapleMini.menu.opt.oglto.build.flags.ldspecs=-flto +mapleMini.menu.opt.osstd=Smallest Code +mapleMini.menu.opt.osstd.build.flags.optimize=-Os +mapleMini.menu.opt.osstd.build.flags.ldspecs= +mapleMini.menu.opt.oslto=Smallest Code with LTO +mapleMini.menu.opt.oslto.build.flags.optimize=-Os -flto +mapleMini.menu.opt.oslto.build.flags.ldspecs=-flto + ############################################################## maple.name=Maple (Rev 3) @@ -66,6 +99,38 @@ maple.build.ldscript=ld/flash.ld maple.build.variant=maple maple.build.vect=VECT_TAB_ADDR=0x8005000 +#-- Optimizations +maple.menu.opt.o2std=Faster +maple.menu.opt.o2std.build.flags.optimize=-O2 +maple.menu.opt.o2std.build.flags.ldspecs= +maple.menu.opt.o2lto=Faster with LTO +maple.menu.opt.o2lto.build.flags.optimize=-O2 -flto +maple.menu.opt.o2lto.build.flags.ldspecs=-flto +maple.menu.opt.o1std=Fast +maple.menu.opt.o1std.build.flags.optimize=-O1 +maple.menu.opt.o1std.build.flags.ldspecs= +maple.menu.opt.o1lto=Fast with LTO +maple.menu.opt.o1lto.build.flags.optimize=-O1 -flto +maple.menu.opt.o1lto.build.flags.ldspecs=-flto +maple.menu.opt.o3std=Fastest +maple.menu.opt.o3std.build.flags.optimize=-O3 +maple.menu.opt.o3std.build.flags.ldspecs= +maple.menu.opt.o3lto=Fastest with LTO +maple.menu.opt.o3lto.build.flags.optimize=-O3 -flto +maple.menu.opt.o3lto.build.flags.ldspecs=-flto +maple.menu.opt.ogstd=Debug +maple.menu.opt.ogstd.build.flags.optimize=-Og +maple.menu.opt.ogstd.build.flags.ldspecs= +maple.menu.opt.oglto=Debug with LTO +maple.menu.opt.oglto.build.flags.optimize=-Og -flto +maple.menu.opt.oglto.build.flags.ldspecs=-flto +maple.menu.opt.osstd=Smallest Code +maple.menu.opt.osstd.build.flags.optimize=-Os +maple.menu.opt.osstd.build.flags.ldspecs= +maple.menu.opt.oslto=Smallest Code with LTO +maple.menu.opt.oslto.build.flags.optimize=-Os -flto +maple.menu.opt.oslto.build.flags.ldspecs=-flto + ############################################################## mapleRET6.name=Maple (RET6) @@ -89,6 +154,38 @@ mapleRET6.upload.usbID=1EAF:0003 mapleRET6.upload.altID=1 mapleRET6.upload.auto_reset=true +#-- Optimizations +mapleRET6.menu.opt.o2std=Faster +mapleRET6.menu.opt.o2std.build.flags.optimize=-O2 +mapleRET6.menu.opt.o2std.build.flags.ldspecs= +mapleRET6.menu.opt.o2lto=Faster with LTO +mapleRET6.menu.opt.o2lto.build.flags.optimize=-O2 -flto +mapleRET6.menu.opt.o2lto.build.flags.ldspecs=-flto +mapleRET6.menu.opt.o1std=Fast +mapleRET6.menu.opt.o1std.build.flags.optimize=-O1 +mapleRET6.menu.opt.o1std.build.flags.ldspecs= +mapleRET6.menu.opt.o1lto=Fast with LTO +mapleRET6.menu.opt.o1lto.build.flags.optimize=-O1 -flto +mapleRET6.menu.opt.o1lto.build.flags.ldspecs=-flto +mapleRET6.menu.opt.o3std=Fastest +mapleRET6.menu.opt.o3std.build.flags.optimize=-O3 +mapleRET6.menu.opt.o3std.build.flags.ldspecs= +mapleRET6.menu.opt.o3lto=Fastest with LTO +mapleRET6.menu.opt.o3lto.build.flags.optimize=-O3 -flto +mapleRET6.menu.opt.o3lto.build.flags.ldspecs=-flto +mapleRET6.menu.opt.ogstd=Debug +mapleRET6.menu.opt.ogstd.build.flags.optimize=-Og +mapleRET6.menu.opt.ogstd.build.flags.ldspecs= +mapleRET6.menu.opt.oglto=Debug with LTO +mapleRET6.menu.opt.oglto.build.flags.optimize=-Og -flto +mapleRET6.menu.opt.oglto.build.flags.ldspecs=-flto +mapleRET6.menu.opt.osstd=Smallest Code +mapleRET6.menu.opt.osstd.build.flags.optimize=-Os +mapleRET6.menu.opt.osstd.build.flags.ldspecs= +mapleRET6.menu.opt.oslto=Smallest Code with LTO +mapleRET6.menu.opt.oslto.build.flags.optimize=-Os -flto +mapleRET6.menu.opt.oslto.build.flags.ldspecs=-flto + ############################################################## microduino32_flash.name=Microduino Core STM32 to Flash @@ -120,6 +217,38 @@ microduino32_flash.build.error_led_port=GPIOB microduino32_flash.build.error_led_pin=1 microduino32_flash.build.gcc_ver=gcc-arm-none-eabi-4.8.3-2014q1 +#-- Optimizations +microduino32_flash.menu.opt.o2std=Faster +microduino32_flash.menu.opt.o2std.build.flags.optimize=-O2 +microduino32_flash.menu.opt.o2std.build.flags.ldspecs= +microduino32_flash.menu.opt.o2lto=Faster with LTO +microduino32_flash.menu.opt.o2lto.build.flags.optimize=-O2 -flto +microduino32_flash.menu.opt.o2lto.build.flags.ldspecs=-flto +microduino32_flash.menu.opt.o1std=Fast +microduino32_flash.menu.opt.o1std.build.flags.optimize=-O1 +microduino32_flash.menu.opt.o1std.build.flags.ldspecs= +microduino32_flash.menu.opt.o1lto=Fast with LTO +microduino32_flash.menu.opt.o1lto.build.flags.optimize=-O1 -flto +microduino32_flash.menu.opt.o1lto.build.flags.ldspecs=-flto +microduino32_flash.menu.opt.o3std=Fastest +microduino32_flash.menu.opt.o3std.build.flags.optimize=-O3 +microduino32_flash.menu.opt.o3std.build.flags.ldspecs= +microduino32_flash.menu.opt.o3lto=Fastest with LTO +microduino32_flash.menu.opt.o3lto.build.flags.optimize=-O3 -flto +microduino32_flash.menu.opt.o3lto.build.flags.ldspecs=-flto +microduino32_flash.menu.opt.ogstd=Debug +microduino32_flash.menu.opt.ogstd.build.flags.optimize=-Og +microduino32_flash.menu.opt.ogstd.build.flags.ldspecs= +microduino32_flash.menu.opt.oglto=Debug with LTO +microduino32_flash.menu.opt.oglto.build.flags.optimize=-Og -flto +microduino32_flash.menu.opt.oglto.build.flags.ldspecs=-flto +microduino32_flash.menu.opt.osstd=Smallest Code +microduino32_flash.menu.opt.osstd.build.flags.optimize=-Os +microduino32_flash.menu.opt.osstd.build.flags.ldspecs= +microduino32_flash.menu.opt.oslto=Smallest Code with LTO +microduino32_flash.menu.opt.oslto.build.flags.optimize=-Os -flto +microduino32_flash.menu.opt.oslto.build.flags.ldspecs=-flto + ############################################################## nucleo_f103rb.name=STM Nucleo F103RB (STLink) @@ -158,6 +287,38 @@ nucleo_f103rb.menu.device_variant.NucleoF103_HSE=Nucleo F103 @ 72 MHz w/ crystal nucleo_f103rb.menu.device_variant.NucleoF103_HSE.build.f_cpu=72000000L nucleo_f103rb.menu.device_variant.NucleoF103_HSE.build.extra_flags=-DNUCLEO_HSE_CRYSTAL -DMCU_STM32F103RB -mthumb -march=armv7-m -D__STM32F1__ +#-- Optimizations +nucleo_f103rb.menu.opt.o2std=Faster +nucleo_f103rb.menu.opt.o2std.build.flags.optimize=-O2 +nucleo_f103rb.menu.opt.o2std.build.flags.ldspecs= +nucleo_f103rb.menu.opt.o2lto=Faster with LTO +nucleo_f103rb.menu.opt.o2lto.build.flags.optimize=-O2 -flto +nucleo_f103rb.menu.opt.o2lto.build.flags.ldspecs=-flto +nucleo_f103rb.menu.opt.o1std=Fast +nucleo_f103rb.menu.opt.o1std.build.flags.optimize=-O1 +nucleo_f103rb.menu.opt.o1std.build.flags.ldspecs= +nucleo_f103rb.menu.opt.o1lto=Fast with LTO +nucleo_f103rb.menu.opt.o1lto.build.flags.optimize=-O1 -flto +nucleo_f103rb.menu.opt.o1lto.build.flags.ldspecs=-flto +nucleo_f103rb.menu.opt.o3std=Fastest +nucleo_f103rb.menu.opt.o3std.build.flags.optimize=-O3 +nucleo_f103rb.menu.opt.o3std.build.flags.ldspecs= +nucleo_f103rb.menu.opt.o3lto=Fastest with LTO +nucleo_f103rb.menu.opt.o3lto.build.flags.optimize=-O3 -flto +nucleo_f103rb.menu.opt.o3lto.build.flags.ldspecs=-flto +nucleo_f103rb.menu.opt.ogstd=Debug +nucleo_f103rb.menu.opt.ogstd.build.flags.optimize=-Og +nucleo_f103rb.menu.opt.ogstd.build.flags.ldspecs= +nucleo_f103rb.menu.opt.oglto=Debug with LTO +nucleo_f103rb.menu.opt.oglto.build.flags.optimize=-Og -flto +nucleo_f103rb.menu.opt.oglto.build.flags.ldspecs=-flto +nucleo_f103rb.menu.opt.osstd=Smallest Code +nucleo_f103rb.menu.opt.osstd.build.flags.optimize=-Os +nucleo_f103rb.menu.opt.osstd.build.flags.ldspecs= +nucleo_f103rb.menu.opt.oslto=Smallest Code with LTO +nucleo_f103rb.menu.opt.oslto.build.flags.optimize=-Os -flto +nucleo_f103rb.menu.opt.oslto.build.flags.ldspecs=-flto + ###################### Generic STM32F103C ######################################## genericSTM32F103C.name=Generic STM32F103C series @@ -223,6 +384,38 @@ genericSTM32F103C.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L genericSTM32F103C.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) genericSTM32F103C.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L +#-- Optimizations +genericSTM32F103C.menu.opt.o2std=Faster +genericSTM32F103C.menu.opt.o2std.build.flags.optimize=-O2 +genericSTM32F103C.menu.opt.o2std.build.flags.ldspecs= +genericSTM32F103C.menu.opt.o2lto=Faster with LTO +genericSTM32F103C.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericSTM32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto +genericSTM32F103C.menu.opt.o1std=Fast +genericSTM32F103C.menu.opt.o1std.build.flags.optimize=-O1 +genericSTM32F103C.menu.opt.o1std.build.flags.ldspecs= +genericSTM32F103C.menu.opt.o1lto=Fast with LTO +genericSTM32F103C.menu.opt.o1lto.build.flags.optimize=-O1 -flto +genericSTM32F103C.menu.opt.o1lto.build.flags.ldspecs=-flto +genericSTM32F103C.menu.opt.o3std=Fastest +genericSTM32F103C.menu.opt.o3std.build.flags.optimize=-O3 +genericSTM32F103C.menu.opt.o3std.build.flags.ldspecs= +genericSTM32F103C.menu.opt.o3lto=Fastest with LTO +genericSTM32F103C.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericSTM32F103C.menu.opt.o3lto.build.flags.ldspecs=-flto +genericSTM32F103C.menu.opt.ogstd=Debug +genericSTM32F103C.menu.opt.ogstd.build.flags.optimize=-Og +genericSTM32F103C.menu.opt.ogstd.build.flags.ldspecs= +genericSTM32F103C.menu.opt.oglto=Debug with LTO +genericSTM32F103C.menu.opt.oglto.build.flags.optimize=-Og -flto +genericSTM32F103C.menu.opt.oglto.build.flags.ldspecs=-flto +genericSTM32F103C.menu.opt.osstd=Smallest Code +genericSTM32F103C.menu.opt.osstd.build.flags.optimize=-Os +genericSTM32F103C.menu.opt.osstd.build.flags.ldspecs= +genericSTM32F103C.menu.opt.oslto=Smallest Code with LTO +genericSTM32F103C.menu.opt.oslto.build.flags.optimize=-Os -flto +genericSTM32F103C.menu.opt.oslto.build.flags.ldspecs=-flto + ########################### Generic STM32F103R ########################### genericSTM32F103R.name=Generic STM32F103R series @@ -292,6 +485,38 @@ genericSTM32F103R.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp genericSTM32F103R.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103R.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG +#-- Optimizations +genericSTM32F103R.menu.opt.o2std=Faster +genericSTM32F103R.menu.opt.o2std.build.flags.optimize=-O2 +genericSTM32F103R.menu.opt.o2std.build.flags.ldspecs= +genericSTM32F103R.menu.opt.o2lto=Faster with LTO +genericSTM32F103R.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericSTM32F103R.menu.opt.o2lto.build.flags.ldspecs=-flto +genericSTM32F103R.menu.opt.o1std=Fast +genericSTM32F103R.menu.opt.o1std.build.flags.optimize=-O1 +genericSTM32F103R.menu.opt.o1std.build.flags.ldspecs= +genericSTM32F103R.menu.opt.o1lto=Fast with LTO +genericSTM32F103R.menu.opt.o1lto.build.flags.optimize=-O1 -flto +genericSTM32F103R.menu.opt.o1lto.build.flags.ldspecs=-flto +genericSTM32F103R.menu.opt.o3std=Fastest +genericSTM32F103R.menu.opt.o3std.build.flags.optimize=-O3 +genericSTM32F103R.menu.opt.o3std.build.flags.ldspecs= +genericSTM32F103R.menu.opt.o3lto=Fastest with LTO +genericSTM32F103R.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericSTM32F103R.menu.opt.o3lto.build.flags.ldspecs=-flto +genericSTM32F103R.menu.opt.ogstd=Debug +genericSTM32F103R.menu.opt.ogstd.build.flags.optimize=-Og +genericSTM32F103R.menu.opt.ogstd.build.flags.ldspecs= +genericSTM32F103R.menu.opt.oglto=Debug with LTO +genericSTM32F103R.menu.opt.oglto.build.flags.optimize=-Og -flto +genericSTM32F103R.menu.opt.oglto.build.flags.ldspecs=-flto +genericSTM32F103R.menu.opt.osstd=Smallest Code +genericSTM32F103R.menu.opt.osstd.build.flags.optimize=-Os +genericSTM32F103R.menu.opt.osstd.build.flags.ldspecs= +genericSTM32F103R.menu.opt.oslto=Smallest Code with LTO +genericSTM32F103R.menu.opt.oslto.build.flags.optimize=-Os -flto +genericSTM32F103R.menu.opt.oslto.build.flags.ldspecs=-flto + ###################### Generic STM32F103T ######################################## genericSTM32F103T.name=Generic STM32F103T series @@ -345,6 +570,38 @@ genericSTM32F103T.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp genericSTM32F103T.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103T.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG +#-- Optimizations +genericSTM32F103T.menu.opt.o2std=Faster +genericSTM32F103T.menu.opt.o2std.build.flags.optimize=-O2 +genericSTM32F103T.menu.opt.o2std.build.flags.ldspecs= +genericSTM32F103T.menu.opt.o2lto=Faster with LTO +genericSTM32F103T.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericSTM32F103T.menu.opt.o2lto.build.flags.ldspecs=-flto +genericSTM32F103T.menu.opt.o1std=Fast +genericSTM32F103T.menu.opt.o1std.build.flags.optimize=-O1 +genericSTM32F103T.menu.opt.o1std.build.flags.ldspecs= +genericSTM32F103T.menu.opt.o1lto=Fast with LTO +genericSTM32F103T.menu.opt.o1lto.build.flags.optimize=-O1 -flto +genericSTM32F103T.menu.opt.o1lto.build.flags.ldspecs=-flto +genericSTM32F103T.menu.opt.o3std=Fastest +genericSTM32F103T.menu.opt.o3std.build.flags.optimize=-O3 +genericSTM32F103T.menu.opt.o3std.build.flags.ldspecs= +genericSTM32F103T.menu.opt.o3lto=Fastest with LTO +genericSTM32F103T.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericSTM32F103T.menu.opt.o3lto.build.flags.ldspecs=-flto +genericSTM32F103T.menu.opt.ogstd=Debug +genericSTM32F103T.menu.opt.ogstd.build.flags.optimize=-Og +genericSTM32F103T.menu.opt.ogstd.build.flags.ldspecs= +genericSTM32F103T.menu.opt.oglto=Debug with LTO +genericSTM32F103T.menu.opt.oglto.build.flags.optimize=-Og -flto +genericSTM32F103T.menu.opt.oglto.build.flags.ldspecs=-flto +genericSTM32F103T.menu.opt.osstd=Smallest Code +genericSTM32F103T.menu.opt.osstd.build.flags.optimize=-Os +genericSTM32F103T.menu.opt.osstd.build.flags.ldspecs= +genericSTM32F103T.menu.opt.oslto=Smallest Code with LTO +genericSTM32F103T.menu.opt.oslto.build.flags.optimize=-Os -flto +genericSTM32F103T.menu.opt.oslto.build.flags.ldspecs=-flto + ########################### Generic STM32F103V ########################### genericSTM32F103V.name=Generic STM32F103V series @@ -405,6 +662,38 @@ genericSTM32F103V.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp genericSTM32F103V.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103V.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG +#-- Optimizations +genericSTM32F103V.menu.opt.o2std=Faster +genericSTM32F103V.menu.opt.o2std.build.flags.optimize=-O2 +genericSTM32F103V.menu.opt.o2std.build.flags.ldspecs= +genericSTM32F103V.menu.opt.o2lto=Faster with LTO +genericSTM32F103V.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericSTM32F103V.menu.opt.o2lto.build.flags.ldspecs=-flto +genericSTM32F103V.menu.opt.o1std=Fast +genericSTM32F103V.menu.opt.o1std.build.flags.optimize=-O1 +genericSTM32F103V.menu.opt.o1std.build.flags.ldspecs= +genericSTM32F103V.menu.opt.o1lto=Fast with LTO +genericSTM32F103V.menu.opt.o1lto.build.flags.optimize=-O1 -flto +genericSTM32F103V.menu.opt.o1lto.build.flags.ldspecs=-flto +genericSTM32F103V.menu.opt.o3std=Fastest +genericSTM32F103V.menu.opt.o3std.build.flags.optimize=-O3 +genericSTM32F103V.menu.opt.o3std.build.flags.ldspecs= +genericSTM32F103V.menu.opt.o3lto=Fastest with LTO +genericSTM32F103V.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericSTM32F103V.menu.opt.o3lto.build.flags.ldspecs=-flto +genericSTM32F103V.menu.opt.ogstd=Debug +genericSTM32F103V.menu.opt.ogstd.build.flags.optimize=-Og +genericSTM32F103V.menu.opt.ogstd.build.flags.ldspecs= +genericSTM32F103V.menu.opt.oglto=Debug with LTO +genericSTM32F103V.menu.opt.oglto.build.flags.optimize=-Og -flto +genericSTM32F103V.menu.opt.oglto.build.flags.ldspecs=-flto +genericSTM32F103V.menu.opt.osstd=Smallest Code +genericSTM32F103V.menu.opt.osstd.build.flags.optimize=-Os +genericSTM32F103V.menu.opt.osstd.build.flags.ldspecs= +genericSTM32F103V.menu.opt.oslto=Smallest Code with LTO +genericSTM32F103V.menu.opt.oslto.build.flags.optimize=-Os -flto +genericSTM32F103V.menu.opt.oslto.build.flags.ldspecs=-flto + ########################### Generic STM32F103Z ########################### genericSTM32F103Z.name=Generic STM32F103Z series @@ -462,6 +751,38 @@ genericSTM32F103Z.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp genericSTM32F103Z.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103Z.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG +#-- Optimizations +genericSTM32F103Z.menu.opt.o2std=Faster +genericSTM32F103Z.menu.opt.o2std.build.flags.optimize=-O2 +genericSTM32F103Z.menu.opt.o2std.build.flags.ldspecs= +genericSTM32F103Z.menu.opt.o2lto=Faster with LTO +genericSTM32F103Z.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericSTM32F103Z.menu.opt.o2lto.build.flags.ldspecs=-flto +genericSTM32F103Z.menu.opt.o1std=Fast +genericSTM32F103Z.menu.opt.o1std.build.flags.optimize=-O1 +genericSTM32F103Z.menu.opt.o1std.build.flags.ldspecs= +genericSTM32F103Z.menu.opt.o1lto=Fast with LTO +genericSTM32F103Z.menu.opt.o1lto.build.flags.optimize=-O1 -flto +genericSTM32F103Z.menu.opt.o1lto.build.flags.ldspecs=-flto +genericSTM32F103Z.menu.opt.o3std=Fastest +genericSTM32F103Z.menu.opt.o3std.build.flags.optimize=-O3 +genericSTM32F103Z.menu.opt.o3std.build.flags.ldspecs= +genericSTM32F103Z.menu.opt.o3lto=Fastest with LTO +genericSTM32F103Z.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericSTM32F103Z.menu.opt.o3lto.build.flags.ldspecs=-flto +genericSTM32F103Z.menu.opt.ogstd=Debug +genericSTM32F103Z.menu.opt.ogstd.build.flags.optimize=-Og +genericSTM32F103Z.menu.opt.ogstd.build.flags.ldspecs= +genericSTM32F103Z.menu.opt.oglto=Debug with LTO +genericSTM32F103Z.menu.opt.oglto.build.flags.optimize=-Og -flto +genericSTM32F103Z.menu.opt.oglto.build.flags.ldspecs=-flto +genericSTM32F103Z.menu.opt.osstd=Smallest Code +genericSTM32F103Z.menu.opt.osstd.build.flags.optimize=-Os +genericSTM32F103Z.menu.opt.osstd.build.flags.ldspecs= +genericSTM32F103Z.menu.opt.oslto=Smallest Code with LTO +genericSTM32F103Z.menu.opt.oslto.build.flags.optimize=-Os -flto +genericSTM32F103Z.menu.opt.oslto.build.flags.ldspecs=-flto + ###################### HYTiny STM32F103T ######################################## hytiny-stm32f103t.name=HYTiny STM32F103TB @@ -513,6 +834,37 @@ hytiny-stm32f103t.menu.upload_method.jlinkMethod.upload.protocol=jlink hytiny-stm32f103t.menu.upload_method.jlinkMethod.upload.tool=jlink_upload hytiny-stm32f103t.menu.upload_method.jlinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER +#-- Optimizations +hytiny-stm32f103t.menu.opt.o2std=Faster +hytiny-stm32f103t.menu.opt.o2std.build.flags.optimize=-O2 +hytiny-stm32f103t.menu.opt.o2std.build.flags.ldspecs= +hytiny-stm32f103t.menu.opt.o2lto=Faster with LTO +hytiny-stm32f103t.menu.opt.o2lto.build.flags.optimize=-O2 -flto +hytiny-stm32f103t.menu.opt.o2lto.build.flags.ldspecs=-flto +hytiny-stm32f103t.menu.opt.o1std=Fast +hytiny-stm32f103t.menu.opt.o1std.build.flags.optimize=-O1 +hytiny-stm32f103t.menu.opt.o1std.build.flags.ldspecs= +hytiny-stm32f103t.menu.opt.o1lto=Fast with LTO +hytiny-stm32f103t.menu.opt.o1lto.build.flags.optimize=-O1 -flto +hytiny-stm32f103t.menu.opt.o1lto.build.flags.ldspecs=-flto +hytiny-stm32f103t.menu.opt.o3std=Fastest +hytiny-stm32f103t.menu.opt.o3std.build.flags.optimize=-O3 +hytiny-stm32f103t.menu.opt.o3std.build.flags.ldspecs= +hytiny-stm32f103t.menu.opt.o3lto=Fastest with LTO +hytiny-stm32f103t.menu.opt.o3lto.build.flags.optimize=-O3 -flto +hytiny-stm32f103t.menu.opt.o3lto.build.flags.ldspecs=-flto +hytiny-stm32f103t.menu.opt.ogstd=Debug +hytiny-stm32f103t.menu.opt.ogstd.build.flags.optimize=-Og +hytiny-stm32f103t.menu.opt.ogstd.build.flags.ldspecs= +hytiny-stm32f103t.menu.opt.oglto=Debug with LTO +hytiny-stm32f103t.menu.opt.oglto.build.flags.optimize=-Og -flto +hytiny-stm32f103t.menu.opt.oglto.build.flags.ldspecs=-flto +hytiny-stm32f103t.menu.opt.osstd=Smallest Code +hytiny-stm32f103t.menu.opt.osstd.build.flags.optimize=-Os +hytiny-stm32f103t.menu.opt.osstd.build.flags.ldspecs= +hytiny-stm32f103t.menu.opt.oslto=Smallest Code with LTO +hytiny-stm32f103t.menu.opt.oslto.build.flags.optimize=-Os -flto +hytiny-stm32f103t.menu.opt.oslto.build.flags.ldspecs=-flto ###################### Generic GD32F103C ######################################## @@ -576,6 +928,38 @@ genericGD32F103C.menu.cpu_speed.speed_96mhz.build.f_cpu=96000000L genericGD32F103C.menu.cpu_speed.speed_72mhz=72Mhz (compatibility) genericGD32F103C.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L +#-- Optimizations +genericGD32F103C.menu.opt.o2std=Faster +genericGD32F103C.menu.opt.o2std.build.flags.optimize=-O2 +genericGD32F103C.menu.opt.o2std.build.flags.ldspecs= +genericGD32F103C.menu.opt.o2lto=Faster with LTO +genericGD32F103C.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericGD32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto +genericGD32F103C.menu.opt.o1std=Fast +genericGD32F103C.menu.opt.o1std.build.flags.optimize=-O1 +genericGD32F103C.menu.opt.o1std.build.flags.ldspecs= +genericGD32F103C.menu.opt.o1lto=Fast with LTO +genericGD32F103C.menu.opt.o1lto.build.flags.optimize=-O1 -flto +genericGD32F103C.menu.opt.o1lto.build.flags.ldspecs=-flto +genericGD32F103C.menu.opt.o3std=Fastest +genericGD32F103C.menu.opt.o3std.build.flags.optimize=-O3 +genericGD32F103C.menu.opt.o3std.build.flags.ldspecs= +genericGD32F103C.menu.opt.o3lto=Fastest with LTO +genericGD32F103C.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericGD32F103C.menu.opt.o3lto.build.flags.ldspecs=-flto +genericGD32F103C.menu.opt.ogstd=Debug +genericGD32F103C.menu.opt.ogstd.build.flags.optimize=-Og +genericGD32F103C.menu.opt.ogstd.build.flags.ldspecs= +genericGD32F103C.menu.opt.oglto=Debug with LTO +genericGD32F103C.menu.opt.oglto.build.flags.optimize=-Og -flto +genericGD32F103C.menu.opt.oglto.build.flags.ldspecs=-flto +genericGD32F103C.menu.opt.osstd=Smallest Code +genericGD32F103C.menu.opt.osstd.build.flags.optimize=-Os +genericGD32F103C.menu.opt.osstd.build.flags.ldspecs= +genericGD32F103C.menu.opt.oslto=Smallest Code with LTO +genericGD32F103C.menu.opt.oslto.build.flags.optimize=-Os -flto +genericGD32F103C.menu.opt.oslto.build.flags.ldspecs=-flto + ########################### STM32VLD to FLASH ########################### STM32VLD.name=STM32VLD to FLASH @@ -604,5 +988,36 @@ STM32VLD.menu.upload_method.STLinkMethod.upload.protocol=STLink STM32VLD.menu.upload_method.STLinkMethod.upload.tool=stlink_upload STM32VLD.menu.upload_method.STLinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG - -################################################################################ +#-- Optimizations +STM32VLD.menu.opt.o2std=Faster +STM32VLD.menu.opt.o2std.build.flags.optimize=-O2 +STM32VLD.menu.opt.o2std.build.flags.ldspecs= +STM32VLD.menu.opt.o2lto=Faster with LTO +STM32VLD.menu.opt.o2lto.build.flags.optimize=-O2 -flto +STM32VLD.menu.opt.o2lto.build.flags.ldspecs=-flto +STM32VLD.menu.opt.o1std=Fast +STM32VLD.menu.opt.o1std.build.flags.optimize=-O1 +STM32VLD.menu.opt.o1std.build.flags.ldspecs= +STM32VLD.menu.opt.o1lto=Fast with LTO +STM32VLD.menu.opt.o1lto.build.flags.optimize=-O1 -flto +STM32VLD.menu.opt.o1lto.build.flags.ldspecs=-flto +STM32VLD.menu.opt.o3std=Fastest +STM32VLD.menu.opt.o3std.build.flags.optimize=-O3 +STM32VLD.menu.opt.o3std.build.flags.ldspecs= +STM32VLD.menu.opt.o3lto=Fastest with LTO +STM32VLD.menu.opt.o3lto.build.flags.optimize=-O3 -flto +STM32VLD.menu.opt.o3lto.build.flags.ldspecs=-flto +STM32VLD.menu.opt.ogstd=Debug +STM32VLD.menu.opt.ogstd.build.flags.optimize=-Og +STM32VLD.menu.opt.ogstd.build.flags.ldspecs= +STM32VLD.menu.opt.oglto=Debug with LTO +STM32VLD.menu.opt.oglto.build.flags.optimize=-Og -flto +STM32VLD.menu.opt.oglto.build.flags.ldspecs=-flto +STM32VLD.menu.opt.osstd=Smallest Code +STM32VLD.menu.opt.osstd.build.flags.optimize=-Os +STM32VLD.menu.opt.osstd.build.flags.ldspecs= +STM32VLD.menu.opt.oslto=Smallest Code with LTO +STM32VLD.menu.opt.oslto.build.flags.optimize=-Os -flto +STM32VLD.menu.opt.oslto.build.flags.ldspecs=-flto + +################################################################################ \ No newline at end of file diff --git a/STM32F1/platform.txt b/STM32F1/platform.txt index 3da3070c9..de1f206dc 100644 --- a/STM32F1/platform.txt +++ b/STM32F1/platform.txt @@ -16,20 +16,20 @@ compiler.warning_flags.all=-Wall -Wextra -DDEBUG_LEVEL=DEBUG_ALL # ---------------------- compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g -Os {compiler.warning_flags} -std=gnu11 -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g {build.flags.optimize} {compiler.warning_flags} -std=gnu11 -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ -compiler.c.elf.flags=-Os -Wl,--gc-sections +compiler.c.elf.flags={build.flags.optimize} -Wl,--gc-sections {build.flags.ldspecs} compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g {build.flags.optimize} {compiler.warning_flags} -std=gnu++11 -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 compiler.elf2hex.flags=-O binary compiler.elf2hex.cmd=arm-none-eabi-objcopy -compiler.ldflags= +compiler.ldflags={build.flags.ldspecs} compiler.size.cmd=arm-none-eabi-size compiler.define=-DARDUINO= @@ -160,4 +160,4 @@ tools.jlink_upload.path.linux={runtime.hardware.path}/tools/linux tools.jlink_upload.path.linux64={runtime.hardware.path}/tools/linux64 tools.jlink_upload.upload.params.verbose=-d tools.jlink_upload.upload.params.quiet=n -tools.jlink_upload.upload.pattern="{path}/{cmd}" "{build.path}/{build.project_name}.bin" +tools.jlink_upload.upload.pattern="{path}/{cmd}" "{build.path}/{build.project_name}.bin" \ No newline at end of file diff --git a/STM32F3/boards.txt b/STM32F3/boards.txt index 6c011bce3..bfe24bbf9 100644 --- a/STM32F3/boards.txt +++ b/STM32F3/boards.txt @@ -28,5 +28,37 @@ discovery_f3.build.error_led_port=GPIOE discovery_f3.build.error_led_pin=8 discovery_f3.build.board=STM32F3Discovery +#-- Optimizations +discovery_f3.menu.opt.o2std=Faster +discovery_f3.menu.opt.o2std.build.flags.optimize=-O2 +discovery_f3.menu.opt.o2std.build.flags.ldspecs= +discovery_f3.menu.opt.o2lto=Faster with LTO +discovery_f3.menu.opt.o2lto.build.flags.optimize=-O2 -flto +discovery_f3.menu.opt.o2lto.build.flags.ldspecs=-flto +discovery_f3.menu.opt.o1std=Fast +discovery_f3.menu.opt.o1std.build.flags.optimize=-O1 +discovery_f3.menu.opt.o1std.build.flags.ldspecs= +discovery_f3.menu.opt.o1lto=Fast with LTO +discovery_f3.menu.opt.o1lto.build.flags.optimize=-O1 -flto +discovery_f3.menu.opt.o1lto.build.flags.ldspecs=-flto +discovery_f3.menu.opt.o3std=Fastest +discovery_f3.menu.opt.o3std.build.flags.optimize=-O3 +discovery_f3.menu.opt.o3std.build.flags.ldspecs= +discovery_f3.menu.opt.o3lto=Fastest with LTO +discovery_f3.menu.opt.o3lto.build.flags.optimize=-O3 -flto +discovery_f3.menu.opt.o3lto.build.flags.ldspecs=-flto +discovery_f3.menu.opt.ogstd=Debug +discovery_f3.menu.opt.ogstd.build.flags.optimize=-Og +discovery_f3.menu.opt.ogstd.build.flags.ldspecs= +discovery_f3.menu.opt.oglto=Debug with LTO +discovery_f3.menu.opt.oglto.build.flags.optimize=-Og -flto +discovery_f3.menu.opt.oglto.build.flags.ldspecs=-flto +discovery_f3.menu.opt.osstd=Smallest Code +discovery_f3.menu.opt.osstd.build.flags.optimize=-Os +discovery_f3.menu.opt.osstd.build.flags.ldspecs= +discovery_f3.menu.opt.oslto=Smallest Code with LTO +discovery_f3.menu.opt.oslto.build.flags.optimize=-Os -flto +discovery_f3.menu.opt.oslto.build.flags.ldspecs=-flto + ############################################################## diff --git a/STM32F3/platform.txt b/STM32F3/platform.txt index 3218f85c1..94f787c81 100644 --- a/STM32F3/platform.txt +++ b/STM32F3/platform.txt @@ -12,20 +12,20 @@ version=0.1.0 compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g {build.flags.optimize} -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ -compiler.c.elf.flags=-Os -Wl,--gc-sections +compiler.c.elf.flags={build.flags.optimize} -Wl,--gc-sections {build.flags.ldspecs} compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g {build.flags.optimize} -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 compiler.elf2hex.flags=-O binary compiler.elf2hex.cmd=arm-none-eabi-objcopy -compiler.ldflags= +compiler.ldflags={build.flags.ldspecs} compiler.size.cmd=arm-none-eabi-size compiler.define=-DARDUINO= diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index baf6f6e03..25a9c3197 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -36,6 +36,39 @@ discovery_f407.menu.usb_cfg.usb_serial=USB serial (CDC) discovery_f407.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB discovery_f407.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) discovery_f407.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC + +#-- Optimizations +discovery_f407.menu.opt.o2std=Faster +discovery_f407.menu.opt.o2std.build.flags.optimize=-O2 +discovery_f407.menu.opt.o2std.build.flags.ldspecs= +discovery_f407.menu.opt.o2lto=Faster with LTO +discovery_f407.menu.opt.o2lto.build.flags.optimize=-O2 -flto +discovery_f407.menu.opt.o2lto.build.flags.ldspecs=-flto +discovery_f407.menu.opt.o1std=Fast +discovery_f407.menu.opt.o1std.build.flags.optimize=-O1 +discovery_f407.menu.opt.o1std.build.flags.ldspecs= +discovery_f407.menu.opt.o1lto=Fast with LTO +discovery_f407.menu.opt.o1lto.build.flags.optimize=-O1 -flto +discovery_f407.menu.opt.o1lto.build.flags.ldspecs=-flto +discovery_f407.menu.opt.o3std=Fastest +discovery_f407.menu.opt.o3std.build.flags.optimize=-O3 +discovery_f407.menu.opt.o3std.build.flags.ldspecs= +discovery_f407.menu.opt.o3lto=Fastest with LTO +discovery_f407.menu.opt.o3lto.build.flags.optimize=-O3 -flto +discovery_f407.menu.opt.o3lto.build.flags.ldspecs=-flto +discovery_f407.menu.opt.ogstd=Debug +discovery_f407.menu.opt.ogstd.build.flags.optimize=-Og +discovery_f407.menu.opt.ogstd.build.flags.ldspecs= +discovery_f407.menu.opt.oglto=Debug with LTO +discovery_f407.menu.opt.oglto.build.flags.optimize=-Og -flto +discovery_f407.menu.opt.oglto.build.flags.ldspecs=-flto +discovery_f407.menu.opt.osstd=Smallest Code +discovery_f407.menu.opt.osstd.build.flags.optimize=-Os +discovery_f407.menu.opt.osstd.build.flags.ldspecs= +discovery_f407.menu.opt.oslto=Smallest Code with LTO +discovery_f407.menu.opt.oslto.build.flags.optimize=-Os -flto +discovery_f407.menu.opt.oslto.build.flags.ldspecs=-flto + ############################################################## generic_f407v.name=Generic STM32F407V series @@ -72,6 +105,38 @@ generic_f407v.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB generic_f407v.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) generic_f407v.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC +#-- Optimizations +generic_f407v.menu.opt.o2std=Faster +generic_f407v.menu.opt.o2std.build.flags.optimize=-O2 +generic_f407v.menu.opt.o2std.build.flags.ldspecs= +generic_f407v.menu.opt.o2lto=Faster with LTO +generic_f407v.menu.opt.o2lto.build.flags.optimize=-O2 -flto +generic_f407v.menu.opt.o2lto.build.flags.ldspecs=-flto +generic_f407v.menu.opt.o1std=Fast +generic_f407v.menu.opt.o1std.build.flags.optimize=-O1 +generic_f407v.menu.opt.o1std.build.flags.ldspecs= +generic_f407v.menu.opt.o1lto=Fast with LTO +generic_f407v.menu.opt.o1lto.build.flags.optimize=-O1 -flto +generic_f407v.menu.opt.o1lto.build.flags.ldspecs=-flto +generic_f407v.menu.opt.o3std=Fastest +generic_f407v.menu.opt.o3std.build.flags.optimize=-O3 +generic_f407v.menu.opt.o3std.build.flags.ldspecs= +generic_f407v.menu.opt.o3lto=Fastest with LTO +generic_f407v.menu.opt.o3lto.build.flags.optimize=-O3 -flto +generic_f407v.menu.opt.o3lto.build.flags.ldspecs=-flto +generic_f407v.menu.opt.ogstd=Debug +generic_f407v.menu.opt.ogstd.build.flags.optimize=-Og +generic_f407v.menu.opt.ogstd.build.flags.ldspecs= +generic_f407v.menu.opt.oglto=Debug with LTO +generic_f407v.menu.opt.oglto.build.flags.optimize=-Og -flto +generic_f407v.menu.opt.oglto.build.flags.ldspecs=-flto +generic_f407v.menu.opt.osstd=Smallest Code +generic_f407v.menu.opt.osstd.build.flags.optimize=-Os +generic_f407v.menu.opt.osstd.build.flags.ldspecs= +generic_f407v.menu.opt.oslto=Smallest Code with LTO +generic_f407v.menu.opt.oslto.build.flags.optimize=-Os -flto +generic_f407v.menu.opt.oslto.build.flags.ldspecs=-flto + ############################################################## stm32f4stamp.name=STM32F4Stamp F405 @@ -107,6 +172,39 @@ stm32f4stamp.menu.usb_cfg.usb_serial=USB serial (CDC) stm32f4stamp.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB stm32f4stamp.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) stm32f4stamp.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC + +#-- Optimizations +stm32f4stamp.menu.opt.o2std=Faster +stm32f4stamp.menu.opt.o2std.build.flags.optimize=-O2 +stm32f4stamp.menu.opt.o2std.build.flags.ldspecs= +stm32f4stamp.menu.opt.o2lto=Faster with LTO +stm32f4stamp.menu.opt.o2lto.build.flags.optimize=-O2 -flto +stm32f4stamp.menu.opt.o2lto.build.flags.ldspecs=-flto +stm32f4stamp.menu.opt.o1std=Fast +stm32f4stamp.menu.opt.o1std.build.flags.optimize=-O1 +stm32f4stamp.menu.opt.o1std.build.flags.ldspecs= +stm32f4stamp.menu.opt.o1lto=Fast with LTO +stm32f4stamp.menu.opt.o1lto.build.flags.optimize=-O1 -flto +stm32f4stamp.menu.opt.o1lto.build.flags.ldspecs=-flto +stm32f4stamp.menu.opt.o3std=Fastest +stm32f4stamp.menu.opt.o3std.build.flags.optimize=-O3 +stm32f4stamp.menu.opt.o3std.build.flags.ldspecs= +stm32f4stamp.menu.opt.o3lto=Fastest with LTO +stm32f4stamp.menu.opt.o3lto.build.flags.optimize=-O3 -flto +stm32f4stamp.menu.opt.o3lto.build.flags.ldspecs=-flto +stm32f4stamp.menu.opt.ogstd=Debug +stm32f4stamp.menu.opt.ogstd.build.flags.optimize=-Og +stm32f4stamp.menu.opt.ogstd.build.flags.ldspecs= +stm32f4stamp.menu.opt.oglto=Debug with LTO +stm32f4stamp.menu.opt.oglto.build.flags.optimize=-Og -flto +stm32f4stamp.menu.opt.oglto.build.flags.ldspecs=-flto +stm32f4stamp.menu.opt.osstd=Smallest Code +stm32f4stamp.menu.opt.osstd.build.flags.optimize=-Os +stm32f4stamp.menu.opt.osstd.build.flags.ldspecs= +stm32f4stamp.menu.opt.oslto=Smallest Code with LTO +stm32f4stamp.menu.opt.oslto.build.flags.optimize=-Os -flto +stm32f4stamp.menu.opt.oslto.build.flags.ldspecs=-flto + ############################################################## netduino2plus.name=Netduino2 F405 @@ -142,5 +240,37 @@ netduino2plus.menu.usb_cfg.usb_serial=USB serial (CDC) netduino2plus.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB netduino2plus.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) netduino2plus.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC -############################################################## +#-- Optimizations +netduino2plus.menu.opt.o2std=Faster +netduino2plus.menu.opt.o2std.build.flags.optimize=-O2 +netduino2plus.menu.opt.o2std.build.flags.ldspecs= +netduino2plus.menu.opt.o2lto=Faster with LTO +netduino2plus.menu.opt.o2lto.build.flags.optimize=-O2 -flto +netduino2plus.menu.opt.o2lto.build.flags.ldspecs=-flto +netduino2plus.menu.opt.o1std=Fast +netduino2plus.menu.opt.o1std.build.flags.optimize=-O1 +netduino2plus.menu.opt.o1std.build.flags.ldspecs= +netduino2plus.menu.opt.o1lto=Fast with LTO +netduino2plus.menu.opt.o1lto.build.flags.optimize=-O1 -flto +netduino2plus.menu.opt.o1lto.build.flags.ldspecs=-flto +netduino2plus.menu.opt.o3std=Fastest +netduino2plus.menu.opt.o3std.build.flags.optimize=-O3 +netduino2plus.menu.opt.o3std.build.flags.ldspecs= +netduino2plus.menu.opt.o3lto=Fastest with LTO +netduino2plus.menu.opt.o3lto.build.flags.optimize=-O3 -flto +netduino2plus.menu.opt.o3lto.build.flags.ldspecs=-flto +netduino2plus.menu.opt.ogstd=Debug +netduino2plus.menu.opt.ogstd.build.flags.optimize=-Og +netduino2plus.menu.opt.ogstd.build.flags.ldspecs= +netduino2plus.menu.opt.oglto=Debug with LTO +netduino2plus.menu.opt.oglto.build.flags.optimize=-Og -flto +netduino2plus.menu.opt.oglto.build.flags.ldspecs=-flto +netduino2plus.menu.opt.osstd=Smallest Code +netduino2plus.menu.opt.osstd.build.flags.optimize=-Os +netduino2plus.menu.opt.osstd.build.flags.ldspecs= +netduino2plus.menu.opt.oslto=Smallest Code with LTO +netduino2plus.menu.opt.oslto.build.flags.optimize=-Os -flto +netduino2plus.menu.opt.oslto.build.flags.ldspecs=-flto + +############################################################## diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index b64fe3eee..92dc1ea9a 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -10,20 +10,20 @@ version=0.1.0 # ---------------------- compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g -Os -Wall -MMD -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g {build.flags.optimize} -Wall -MMD -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ -compiler.c.elf.flags=-Os -Wl,--gc-sections +compiler.c.elf.flags={build.flags.optimize} -Wl,--gc-sections {build.flags.ldspecs} compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g -Os -Wall -MMD -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g {build.flags.optimize} -Wall -MMD -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 compiler.elf2hex.flags=-O binary compiler.elf2hex.cmd=arm-none-eabi-objcopy -compiler.ldflags= +compiler.ldflags={build.flags.ldspecs} compiler.size.cmd=arm-none-eabi-size compiler.define=-DARDUINO= From 4f3c4da648a72633a17d0ed3c105a02df277489f Mon Sep 17 00:00:00 2001 From: Cristi Marius Tiutiu Date: Mon, 17 Jul 2017 10:45:37 +0300 Subject: [PATCH 147/307] added missing menu opts for F3/F4 boards --- STM32F3/boards.txt | 2 ++ STM32F4/boards.txt | 1 + 2 files changed, 3 insertions(+) diff --git a/STM32F3/boards.txt b/STM32F3/boards.txt index bfe24bbf9..d3a37353e 100644 --- a/STM32F3/boards.txt +++ b/STM32F3/boards.txt @@ -1,5 +1,7 @@ # +menu.opt=Optimize + ############################################################## discovery_f3.name=STM32F3Discovery diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 25a9c3197..429ba4b96 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -1,6 +1,7 @@ # menu.usb_cfg=USB configuration +menu.opt=Optimize ############################################################## discovery_f407.name=STM32 Discovery F407 From 01de9ee977a9335aed2b8dd07ff332c52a8f7386 Mon Sep 17 00:00:00 2001 From: Hemal Chevli Date: Wed, 19 Jul 2017 10:46:25 +0530 Subject: [PATCH 148/307] Fixed headings --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7e13786a2..4ffc9ed66 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ Arduino STM32 ============= -##Notice +## Notice This software is experimental and a work in progress. Under no circumstances should these files be used in relation to any critical system(s). Use of these files is at your own risk. -##Summary: +## Summary: This repo contains, the "Hardware" files to support STM32 based boards on Arduino version 1.6.13 or 1.6.12 (some older versions may also work) including [LeafLabs Maple, and Maple mini](http://www.leaflabs.com/about-maple/), and other generic STM32F103 boards ***PRIMARY SUPPORT FORUM: http://www.stm32duino.com/*** @@ -16,7 +16,7 @@ This repo contains, the "Hardware" files to support STM32 based boards on Arduin ***We are also on Gitter https://gitter.im/stm32duino/Lobby/*** [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/stm32duino/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -##Background & Support: +## Background & Support: * Based on https://github.com/bobc/maple-asp, which is in turn based on LibMaple by Leaflabs * **Please read the wiki (https://github.com/rogerclarkmelbourne/Arduino_STM32/wiki) for full details** * See also my blog: http://www.rogerclark.net/stm32f103-and-maple-maple-mini-with-arduino-1-5-x-ide/ @@ -29,11 +29,11 @@ This repo contains, the "Hardware" files to support STM32 based boards on Arduin * 20150413: [STM32 for Arduino 1.6.2 or newer (update)](https://www.youtube.com/watch?v=TePglhSkghg) * 20150419: [Uploading via USB to Serial to STM32F103 boards](https://www.youtube.com/watch?v=G_RF0a0hrak) -##Additional Links & Info: +## Additional Links & Info: * https://www.hackster.io/rayburne/4-dollar-90-mips-32-bit-72-mhz-arm-arduino -##Purchase info: -###Entry level boards +## Purchase info: +### Entry level boards * [Ebay search for "arduino maple"](http://www.ebay.com/sch/i.html?_from=R40&_sacat=0&LH_BIN=1&_nkw=arduino+maple&_sop=15) (currently costs <$5 with shipping) * [AliExpress search for "leaflabs maple"] (http://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20150607085526&SearchText=leaflabs+maple) From b29fed855b440f3d55c627b9d4478940b7fff29d Mon Sep 17 00:00:00 2001 From: stevstrong Date: Wed, 19 Jul 2017 19:11:44 +0200 Subject: [PATCH 149/307] reworked RTC - no need for extra time library http://www.stm32duino.com/viewtopic.php?f=39&t=775&p=31218#p31218 --- .../examples/Test_RTClock/Test_RTClock.ino | 209 +++++++++++++ STM32F4/libraries/RTClock/library.properties | 1 + STM32F4/libraries/RTClock/src/RTClock.cpp | 293 ++++++++++-------- STM32F4/libraries/RTClock/src/RTClock.h | 136 ++++++-- 4 files changed, 485 insertions(+), 154 deletions(-) create mode 100644 STM32F4/libraries/RTClock/examples/Test_RTClock/Test_RTClock.ino diff --git a/STM32F4/libraries/RTClock/examples/Test_RTClock/Test_RTClock.ino b/STM32F4/libraries/RTClock/examples/Test_RTClock/Test_RTClock.ino new file mode 100644 index 000000000..ec6afa432 --- /dev/null +++ b/STM32F4/libraries/RTClock/examples/Test_RTClock/Test_RTClock.ino @@ -0,0 +1,209 @@ +/* + This is an example of how to use the RTclock of STM32F4 device + + This example can also be used to set the RTC to the current epoch time: + - goto: http://www.unixtimestamp.com/ + - enter the current date and time to the right field "Timestamp converter" + - press the "Convert" button + - +*/ + +#include + +#include + + +//RTClock rt(RTCSEL_LSE); // initialise +RTClock rtc; + +time_t tt; +tm_t tm; + +const uint32_t DEFAULT_TIME = 1498944019; // 2017.07.01, 21:20:19 used as reference epoch time + +#define TIME_HEADER 'T' // Header tag for serial time sync message +#define TIME_REQUEST 7 // ASCII bell character requests a time sync message + +#define LED_PIN BOARD_LED_PIN + +//----------------------------------------------------------------------------- +void blink () +{ + digitalWrite(LED_PIN, digitalRead(LED_PIN)?LOW:HIGH); +} + +uint8_t s[20]; // for serial parsing + +//----------------------------------------------------------------------------- +char * read_line() +{ + while ( Serial.available() ) Serial.read(); // empty Rx buffer + while ( Serial.available()<=0 ) ; // wait for new characters + uint8_t c, i = 0; + s[0] = 0; + while ( Serial.available() && (i<20) ) { + c = Serial.read(); + if ( c=='\n' || c== '\r') { + s[i] = 0; + break; + } + s[i++] = c; + } + while ( Serial.available() ) Serial.read(); // flush Rx + return (char*)&s[0]; +} + +//----------------------------------------------------------------------------- +void processSyncMessage(void) +{ + if ( Serial.available() ) { + if( *read_line()==(TIME_HEADER) ) { + uint32_t pctime = atoi((const char*)&s[1]); + Serial << ("Epoch time received: ") << pctime << endl; + if ( pctime >= DEFAULT_TIME) { // check the integer is a valid epoch time + rtc.setTime(pctime); // Set RTC to the time received via the serial port + } + } + Serial << endl; + } +} + +//----------------------------------------------------------------------------- +void Change_DateTime(void) +{ + // check and correct the weekday if necessary + rtc.getTime(tm); + Serial << "Current weekday is " << (tm.weekday); + // get time elements + tt = rtc.makeTime(tm); + uint16_t tmp = rtc.weekday(tt); + if ( tmp!=tm.weekday ) {// correct weekday + rtc.setTime(tt); + Serial << " instead of " << tmp << ". Now is corrected.\n"; + } else { + Serial << " - seems to be fine, no need to change it.\n"; + } + + uint8_t chg = 0; + // get time elements + rtc.getTime(tm); + Serial << "\nCurrent RTC date: " << (1970+tm.year) << "." << (tm.month) << (".") << (tm.day) << (", weekday: ") << (tm.weekday) << endl; + Serial << "Do you want to change it? (y/n)\n"; + if ( *read_line()=='y' ) { + // change here the date +change_year: + Serial << "Current year: " << (1970+tm.year) << ". Enter new year in \"YYYY\" format (numbers only) or press enter to skip.\n"; + if (*read_line()==0) goto change_month; + tmp = atoi((const char*)s); + if ( tmp<1970 ) { Serial << "Please enter a valid number greater than 1970\n"; goto change_year; } + Serial << "You entered: " << tmp << ". Accept value? (y/n)\n"; + if ( *read_line()=='n' ) goto change_year; + tm.year = tmp-1970; + chg = 1; +change_month: + Serial << "Current month: " << tm.month << ". Enter new month in \"MM\" format [1..12] or press enter to skip.\n"; + if (*read_line()==0) goto change_day; + tmp = atoi((const char*)s); + if ( tmp<1 || tmp>12 ) { Serial << "Please enter a valid number [1..12]\n"; goto change_month; } + Serial << "You entered: " << tmp << ". Accept value? (y/n)\n"; + if ( *read_line()=='n' ) goto change_month; + tm.month = tmp; + chg = 1; +change_day: + Serial << "Current day: " << tm.day << ". Enter new day in \"DD\" format [1..31] or press enter to skip.\n"; + if (*read_line()==0) goto change_weekday; + tmp = atoi((const char*)s); + if ( tmp<1 || tmp>31 ) { Serial << "Please enter a valid number [1..31]\n"; goto change_day; } + Serial << "You entered: " << tmp << ". Accept value? (y/n)\n"; + if ( *read_line()=='n' ) goto change_day; + tm.day = tmp; + chg = 1; +change_weekday: + Serial << "Current weekday: " << tm.weekday << ". Enter new weekday [1(=Monday)..7(=Sunday)] or press enter to skip.\n"; + if (*read_line()==0) goto change_time; + tmp = atoi((const char*)s); + if ( tmp<1 || tmp>7 ) { Serial << "Please enter a valid number [1..7]\n"; goto change_weekday; } + Serial << "You entered: " << tmp << ". Accept value? (y/n)\n"; + if ( *read_line()=='n' ) goto change_weekday; + tm.weekday = tmp; + chg = 1; +change_time: + Serial << "Current RTC time: " << _TIME(tm.hour, tm.minute, tm.second) << endl; + Serial << "Do you want to change it? (y/n)\n"; + if ( *read_line()=='n' ) goto change_end; +change_hour: + Serial << "Current hour: " << tm.hour << ". Enter new hour [0..23] or press enter to skip.\n"; + if (*read_line()==0) goto change_minute; + tmp = atoi((const char*)s); + if ( tmp>23 ) { Serial << "Please enter a valid number [0..23]\n"; goto change_hour; } + Serial << "You entered: " << tmp << ". Accept value? (y/n)\n"; + if ( *read_line()=='n' ) goto change_hour; + tm.hour = tmp; + chg = 1; +change_minute: + Serial << "Current minute: " << tm.minute << ". Enter new minute [0..59] or press enter to skip.\n"; + if (*read_line()==0) goto change_second; + tmp = atoi((const char*)s); + if ( tmp>59 ) { Serial << "Please enter a valid number [0..59]\n"; goto change_minute; } + Serial << "You entered: " << tmp << ". Accept value? (y/n)\n"; + if ( *read_line()=='n' ) goto change_minute; + tm.minute = tmp; + chg = 1; +change_second: + Serial << "Current second: " << tm.second << ". Enter new second [0..59] or press enter to skip.\n"; + if (*read_line()==0) goto change_end; + tmp = atoi((const char*)s); + if ( tmp>59 ) { Serial << "Please enter a valid number [0..59]\n"; goto change_second; } + Serial << "You entered: " << tmp << ". Accept value? (y/n)\n"; + if ( *read_line()=='n' ) goto change_second; + tm.second = tmp; + chg = 1; + } else { + goto change_time; + } + +change_end: + if ( chg ) { + // set here the RTC time. + Serial << "Changed date & time: " << (1970+tm.year) << "." << (tm.month) << (".") << (tm.day) << (", weekday: ") << (tm.weekday) << ", " << _TIME(tm.hour, tm.minute, tm.second) << endl; + Serial << "Write now to RTC? (y/n)\n"; + read_line(); + if ( s[0]=='y' ) { + rtc.setTime(tm); + Serial << "Data written to RTC.\n\n"; + } + } else + Serial << "RTC was not changed.\n\n"; +} +//----------------------------------------------------------------------------- +void setup() +{ + Serial.begin(); + delay(3000); + + pinMode(LED_PIN, OUTPUT); + + Serial << "This is an example of how to use the STM32F4 RTC library.\n\n"; + + Change_DateTime(); +} + +//----------------------------------------------------------------------------- +void loop() +{ + if ( Serial.available() ) { + // adjust time according to received epoch time from PC + processSyncMessage(); + } + + if (tt!=rtc.now()) { + // get epoch time + tt = rtc.now(); + Serial << ("- RTC epoch timestamp = ") << (tt); + // get time elements + rtc.getTime(tm); + //rtc.breakTime(tt, tm); + Serial << (" == ") << (1970+tm.year) << "." << (tm.month) << (".") << (tm.day) << (", weekday ") << (tm.weekday) << (", "); + Serial << _TIME(tm.hour, tm.minute, tm.second) << endl; + } +} \ No newline at end of file diff --git a/STM32F4/libraries/RTClock/library.properties b/STM32F4/libraries/RTClock/library.properties index 5a5e4b71d..a8878f6ac 100644 --- a/STM32F4/libraries/RTClock/library.properties +++ b/STM32F4/libraries/RTClock/library.properties @@ -7,3 +7,4 @@ paragraph=Real Time Clock for STM32F4 category=Other url= architectures=STM32F4 +maintainer=www.stm32duino.com diff --git a/STM32F4/libraries/RTClock/src/RTClock.cpp b/STM32F4/libraries/RTClock/src/RTClock.cpp index ee82c95b3..e7c2ca8da 100644 --- a/STM32F4/libraries/RTClock/src/RTClock.cpp +++ b/STM32F4/libraries/RTClock/src/RTClock.cpp @@ -42,15 +42,7 @@ voidFuncPtr handlerAlarmA = NULL; voidFuncPtr handlerAlarmB = NULL; voidFuncPtr handlerPeriodicWakeup = NULL; - -RTClock::RTClock() { - RTClock(RTCSEL_HSE, 7999, 124); -} - -RTClock::RTClock(rtc_clk_src src) { - RTClock(src, 0, 0); -} - +//----------------------------------------------------------------------------- RTClock::RTClock(rtc_clk_src src, uint16 sync_prescaler, uint16 async_prescaler) { uint32 t = 0; RCC_BASE->APB1ENR |= RCC_APB1RSTR_PWRRST; @@ -144,117 +136,155 @@ RTClock::~RTClock() { } */ -void RTClock::setTime (time_t time_stamp) { - unsigned char years = 0; - unsigned char months = 0; - unsigned char monthLength = 0; - unsigned char wdays = 0; - unsigned char hours = 0; - unsigned char mins = 0; - unsigned char secs = 0; - unsigned long days; - - secs = time_stamp % 60; - time_stamp /= 60; // now it is minutes - mins = time_stamp % 60; - time_stamp /= 60; // now it is hours - hours = time_stamp % 24; - time_stamp /= 24; // now it is days - wdays = ((time_stamp + 4) % 7) + 1; // Sunday is day 1 - - while((unsigned)(days += (LEAP_YEAR(years) ? 366 : 365)) <= time_stamp) { - years++; - } - - days -= LEAP_YEAR(years) ? 366 : 365; - time_stamp -= days; // now it is days in this year, starting at 0 - - for (months = 0; months < 12; months++) { - if (months == 1) { // february - if (LEAP_YEAR(years)) { - monthLength = 29; - } else { - monthLength = 28; - } - } else { - monthLength = monthDays[months]; - } - - if (time_stamp >= monthLength) { - time_stamp -= monthLength; - } else { - break; - } - } - months++; // jan is month 1 - days = time_stamp + 1; // day of month - rtc_enter_config_mode(); - RTC_BASE->TR = ((hours / 10) << 20) | ((hours % 10) << 16) | ((mins / 10) << 12) | ((mins % 10) << 8) | ((secs / 10) << 4) | (secs % 10); - RTC_BASE->DR = ((years / 10) << 20) | ((years % 10) << 16) | (wdays << 13) | ((months / 10) << 12) | ((months % 10) << 8) | ((days / 10) << 4) | (days % 10); - rtc_exit_config_mode(); +//----------------------------------------------------------------------------- +void RTClock::setTime (time_t time_stamp) +{ + breakTime(time_stamp, tm); // time will be broken to tm + setTime(tm); } - -void RTClock::setTime (struct tm* tm_ptr) { + +//----------------------------------------------------------------------------- +void RTClock::setTime (tm_t & tm) +{ + if (tm.year > 99) + tm.year = tm.year % 100; rtc_enter_config_mode(); - if (tm_ptr->tm_year > 99) - tm_ptr->tm_year = tm_ptr->tm_year % 100; - tm_ptr->tm_wday = tm_ptr->tm_wday & 0x7; - RTC_BASE->TR = ((tm_ptr->tm_hour / 10) << 20) | ((tm_ptr->tm_hour % 10) << 16) | - ((tm_ptr->tm_min / 10) << 12) | ((tm_ptr->tm_min % 10) << 8) | - ((tm_ptr->tm_sec / 10) << 4) | (tm_ptr->tm_sec % 10); - RTC_BASE->DR = ((tm_ptr->tm_year / 10) << 20) | ((tm_ptr->tm_year % 10) << 16) | (tm_ptr->tm_wday << 13) | - ((tm_ptr->tm_mon / 10) << 12) | ((tm_ptr->tm_mon % 10) << 8) | - ((tm_ptr->tm_mday / 10) << 4) | (tm_ptr->tm_mday % 10); + RTC_BASE->TR = BUILD_TIME_REGISTER(tm.hour, tm.minute, tm.second); + RTC_BASE->DR = BUILD_DATE_REGISTER(tm.year, tm.month, tm.day, tm.weekday); rtc_exit_config_mode(); } - -time_t RTClock::getTime() { - uint32 dr_reg = RTC_BASE->DR; - uint32 tr_reg = RTC_BASE->TR; - int years = 10 * ((dr_reg & 0x00F00000) >> 20) + ((dr_reg & 0x000F0000) >> 16); - int months = 10 * ((dr_reg & 0x00001000) >> 12) + ((dr_reg & 0x00000F00) >> 8); - int days = 10 * ((dr_reg & 0x00000030) >> 4) + (dr_reg & 0x000000F); - int hours = 10 * ((tr_reg & 0x00300000) >> 20) + ((tr_reg & 0x000F0000) >> 16); - int mins = 10 * ((tr_reg & 0x00007000) >> 12) + ((tr_reg & 0x0000F00) >> 8); - int secs = 10 * ((tr_reg & 0x00000070) >> 4) + (tr_reg & 0x0000000F); - // seconds from 1970 till 1 jan 00:00:00 of the given year - time_t t = (years + 30) * SECS_PER_DAY * 365; - for (int i = 0; i < (years + 30); i++) { - if (LEAP_YEAR(i)) { - t += SECS_PER_DAY; // add extra days for leap years + +/*============================================================================*/ +/* functions to convert to and from system time */ +/* These are for interfacing with time serivces and are not normally needed in a sketch */ + +// leap year calulator expects year argument as years offset from 1970 +#define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) ) + +//static const uint8_t monthDays[]={31,28,31,30,31,30,31,31,30,31,30,31}; // API starts months from 1, this array starts from 0 + +//----------------------------------------------------------------------------- +void RTClock::breakTime(time_t timeInput, tm_t & tm) +{ +// break the given time_t into time components +// this is a more compact version of the C library localtime function +// note that year is offset from 1970 !!! + + uint8_t year; + uint8_t month, monthLength; + uint32_t time; + uint32_t days; + + time = (uint32_t)timeInput; + tm.second = time % 60; + time /= 60; // now it is minutes + tm.minute = time % 60; + time /= 60; // now it is hours + tm.hour = time % 24; + time /= 24; // now it is days + tm.weekday = ((time + 4) % 7); // Monday is day 1 // + 1; // Sunday is day 1 + + year = 0; + days = 0; + while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { + year++; } - } - // add days for this year, months start from 1 - for (int i = 1; i < months; i++) { - if ( (i == 2) && LEAP_YEAR(years)) { - t += SECS_PER_DAY * 29; - } else { - t += SECS_PER_DAY * monthDays[i - 1]; //monthDays array starts from 0 + tm.year = year; // year is offset from 1970 + + days -= LEAP_YEAR(year) ? 366 : 365; + time -= days; // now it is days in this year, starting at 0 + + days = 0; + month = 0; + monthLength = 0; + for (month=0; month<12; month++) { + if (month==1) { // february + if (LEAP_YEAR(year)) { + monthLength=29; + } else { + monthLength=28; + } + } else { + monthLength = monthDays[month]; + } + + if (time >= monthLength) { + time -= monthLength; + } else { + break; + } } - } - t += (days - 1) * SECS_PER_DAY + hours * SECS_PER_HOUR + mins * SECS_PER_MIN + secs; - return t; + tm.month = month + 1; // jan is month 1 + tm.day = time + 1; // day of month } - -struct tm* RTClock::getTime(struct tm* tm_ptr) { - uint32 dr_reg = RTC_BASE->DR; - uint32 tr_reg = RTC_BASE->TR; - tm_ptr->tm_year = 10 * ((dr_reg & 0x00F00000) >> 20) + ((dr_reg & 0x000F0000) >> 16); - tm_ptr->tm_mon = 10 * ((dr_reg & 0x00001000) >> 12) + ((dr_reg & 0x00000F00) >> 8); - tm_ptr->tm_mday = 10 * ((dr_reg & 0x00000030) >> 4) + (dr_reg & 0x000000F); - tm_ptr->tm_hour = 10 * ((tr_reg & 0x00300000) >> 20) + ((tr_reg & 0x000F0000) >> 16); - tm_ptr->tm_min = 10 * ((tr_reg & 0x00007000) >> 12) + ((tr_reg & 0x0000F00) >> 8); - tm_ptr->tm_sec = 10 * ((tr_reg & 0x00000070) >> 4) + (tr_reg & 0x0000000F); - return tm_ptr; + +//----------------------------------------------------------------------------- +time_t RTClock::makeTime(tm_t & tm) +{ +// assemble time elements into time_t +// note year argument is offset from 1970 (see macros in time.h to convert to other formats) +// previous version used full four digit year (or digits since 2000),i.e. 2009 was 2009 or 9 + + int i; + uint32_t seconds; + + // seconds from 1970 till 1 jan 00:00:00 of the given year + seconds = tm.year*(SECS_PER_DAY * 365); + for (i = 0; i < tm.year; i++) { + if (LEAP_YEAR(i)) { + seconds += SECS_PER_DAY; // add extra days for leap years + } + } + + // add days for this year, months start from 1 + for (i = 1; i < tm.month; i++) { + if ( (i == 2) && LEAP_YEAR(tm.year)) { + seconds += SECS_PER_DAY * 29; + } else { + seconds += SECS_PER_DAY * monthDays[i-1]; //monthDay array starts from 0 + } + } + seconds+= (tm.day-1) * SECS_PER_DAY; + seconds+= tm.hour * SECS_PER_HOUR; + seconds+= tm.minute * SECS_PER_MIN; + seconds+= tm.second; + return (time_t)seconds; } - -void RTClock::setAlarmATime (tm * tm_ptr, bool hours_match, bool mins_match, bool secs_match, bool date_match) { + +//----------------------------------------------------------------------------- +void RTClock::getTime(tm_t & tm) +{ + uint32_t dr_reg, tr_reg; + do { // read multiple time till both readings are equal + dr_reg = getDReg(); + tr_reg = getTReg(); + } while ( (dr_reg!=getDReg()) || (tr_reg!=getTReg()) ); + tm.year = _year(dr_reg); + tm.month = _month(dr_reg); + tm.day = _day(dr_reg); + tm.weekday = _weekday(dr_reg); + tm.pm = _pm(tr_reg); + tm.hour = _hour(tr_reg); + tm.minute = _minute(tr_reg); + tm.second = _second(tr_reg); +} + +//----------------------------------------------------------------------------- +time_t RTClock::getTime() +{ + getTime(tm); + return makeTime(tm); +} + +//----------------------------------------------------------------------------- +void RTClock::setAlarmATime (tm_t * tm_ptr, bool hours_match, bool mins_match, bool secs_match, bool date_match) +{ uint32 t = 0; rtc_enter_config_mode(); - unsigned int bits = ((tm_ptr->tm_mday / 10) << 28) | ((tm_ptr->tm_mday % 10) << 24) | - ((tm_ptr->tm_hour / 10) << 20) | ((tm_ptr->tm_hour % 10) << 16) | - ((tm_ptr->tm_min / 10) << 12) | ((tm_ptr->tm_min % 10) << 8) | - ((tm_ptr->tm_sec / 10) << 4) | (tm_ptr->tm_sec % 10); + unsigned int bits = ((tm_ptr->day / 10) << 28) | ((tm.day % 10) << 24) | + ((tm_ptr->hour / 10) << 20) | ((tm_ptr->hour % 10) << 16) | + ((tm_ptr->minute / 10) << 12) | ((tm_ptr->minute % 10) << 8) | + ((tm_ptr->second / 10) << 4) | (tm_ptr->second % 10); if (!date_match) bits |= (1 << 31); if (!hours_match) bits |= (1 << 23); if (!mins_match) bits |= (1 << 15); @@ -276,27 +306,30 @@ void RTClock::setAlarmATime (tm * tm_ptr, bool hours_match, bool mins_match, boo rtc_enable_alarm_event(); } - -void RTClock::setAlarmATime (time_t alarm_time, bool hours_match, bool mins_match, bool secs_match, bool date_match) { - struct tm* tm_ptr = gmtime(&alarm_time); - setAlarmATime(tm_ptr, hours_match, mins_match, secs_match, date_match); +//----------------------------------------------------------------------------- +void RTClock::setAlarmATime (time_t alarm_time, bool hours_match, bool mins_match, bool secs_match, bool date_match) +{ + breakTime(alarm_time, tm); + setAlarmATime(&tm, hours_match, mins_match, secs_match, date_match); } - -void RTClock::turnOffAlarmA() { +//----------------------------------------------------------------------------- +void RTClock::turnOffAlarmA(void) +{ rtc_enter_config_mode(); RTC_BASE->CR &= ~(1 << RTC_CR_ALRAIE_BIT); // turn off ALRAIE rtc_exit_config_mode(); } - -void RTClock::setAlarmBTime (tm * tm_ptr, bool hours_match, bool mins_match, bool secs_match, bool date_match) { +//----------------------------------------------------------------------------- +void RTClock::setAlarmBTime (tm_t * tm_ptr, bool hours_match, bool mins_match, bool secs_match, bool date_match) +{ uint32 t = 0; rtc_enter_config_mode(); - unsigned int bits = ((tm_ptr->tm_mday / 10) << 28) | ((tm_ptr->tm_mday % 10) << 24) | - ((tm_ptr->tm_hour / 10) << 20) | ((tm_ptr->tm_hour % 10) << 16) | - ((tm_ptr->tm_min / 10) << 12) | ((tm_ptr->tm_min % 10) << 8) | - ((tm_ptr->tm_sec / 10) << 4) | (tm_ptr->tm_sec % 10); + unsigned int bits = ((tm_ptr->day / 10) << 28) | ((tm_ptr->day % 10) << 24) | + ((tm_ptr->hour / 10) << 20) | ((tm_ptr->hour % 10) << 16) | + ((tm_ptr->minute / 10) << 12) | ((tm_ptr->minute % 10) << 8) | + ((tm_ptr->second / 10) << 4) | (tm_ptr->second % 10); if (!date_match) bits |= (1 << 31); if (!hours_match) bits |= (1 << 23); if (!mins_match) bits |= (1 << 15); @@ -318,21 +351,23 @@ void RTClock::setAlarmBTime (tm * tm_ptr, bool hours_match, bool mins_match, boo rtc_enable_alarm_event(); } - -void RTClock::setAlarmBTime (time_t alarm_time, bool hours_match, bool mins_match, bool secs_match, bool date_match) { - struct tm* tm_ptr = gmtime(&alarm_time); - setAlarmBTime(tm_ptr, hours_match, mins_match, secs_match, date_match); +//----------------------------------------------------------------------------- +void RTClock::setAlarmBTime (time_t alarm_time, bool hours_match, bool mins_match, bool secs_match, bool date_match) +{ + breakTime(alarm_time, tm); + setAlarmBTime(&tm, hours_match, mins_match, secs_match, date_match); } - +//----------------------------------------------------------------------------- void RTClock::turnOffAlarmB() { rtc_enter_config_mode(); RTC_BASE->CR &= ~(1 << RTC_CR_ALRBIE_BIT); // turn off ALRBIE rtc_exit_config_mode(); } - -void RTClock::setPeriodicWakeup(uint16 period) { +//----------------------------------------------------------------------------- +void RTClock::setPeriodicWakeup(uint16 period) +{ uint32 t = 0; rtc_enter_config_mode(); RTC_BASE->CR &= ~(1 << RTC_CR_WUTE_BIT); diff --git a/STM32F4/libraries/RTClock/src/RTClock.h b/STM32F4/libraries/RTClock/src/RTClock.h index facaa0043..c13bf5f52 100644 --- a/STM32F4/libraries/RTClock/src/RTClock.h +++ b/STM32F4/libraries/RTClock/src/RTClock.h @@ -1,29 +1,35 @@ -#include -#include -#include -#include -#include -#include -#include - #ifndef _RTCLOCK_H_ #define _RTCLOCK_H_ -//#define RTC_DEBUG #ifdef __cplusplus extern "C" { #endif + + +#include // for __time_t_defined +#include +#include +#include +#include +#include +#include + +//#define RTC_DEBUG + + +#if !defined(__time_t_defined) // avoid conflict with newlib or other posix libc + #warning "Using private time_t definintion" + typedef uint32_t time_t; +#endif + #ifdef RTC_DEBUG extern void dbg_printf(const char *fmt, ... ); #define rtc_debug_printf(fmt, ...) dbg_printf(fmt, ##__VA_ARGS__); #else #define rtc_debug_printf(...) #endif -#ifdef __cplusplus -} -#endif #define SECS_PER_MIN (60UL) @@ -33,7 +39,7 @@ extern "C" { #define SECS_PER_WEEK (SECS_PER_DAY * DAYS_PER_WEEK) #define SECS_PER_YEAR (SECS_PER_WEEK * 52UL) #define SECS_YR_2000 (946684800UL) // the time at the start of y2k -#define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) ) +#define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) ) static const unsigned char monthDays[]={31,28,31,30,31,30,31,31,30,31,30,31}; // API starts months from 1, this array starts from 0 @@ -91,6 +97,28 @@ typedef enum rtc_clk_src { RTCSEL_HSE = 0x13, } rtc_clk_src; +// Time register +#define RTC_TR_PM_BIT 22 +#define RTC_TR_HOUR_BIT 16 +#define RTC_TR_MINUTE_BIT 8 +#define RTC_TR_SECOND_BIT 0 + +#define RTC_TR_PM_MASK (0x01)//<>4)) + (b&0x0F) ); } +static inline uint8_t bin2bcd(uint8_t b) { return ( ((b/10)<<4) + (b%10) ); } class RTClock { - public: - RTClock(); - RTClock(rtc_clk_src src ); + public: + RTClock() { RTClock(RTCSEL_LSE, 0, 0); } + RTClock(rtc_clk_src src ) { RTClock(src, 0, 0); } RTClock(rtc_clk_src src, uint16 sync_prescaler, uint16 async_prescaler); //~RTClock(); //to implement + + void breakTime(time_t epoch_time, tm_t & tm); + time_t makeTime(tm_t & tm); void setTime (time_t time_stamp); - void setTime (struct tm * tm_ptr); + void setTime (tm_t & tm); - struct tm* getTime(struct tm* tm_ptr); time_t getTime(); + void getTime(tm_t & tm); + #define now getTime + + uint8_t year(void) { getTime(tm); return tm.year; } + uint8_t month(void) { getTime(tm); return tm.month; } + uint8_t day(void) { getTime(tm); return tm.day; } + uint8_t weekday(void) { getTime(tm); return tm.weekday; } + uint8_t hour(void) { getTime(tm); return tm.hour; } + uint8_t minute(void) { getTime(tm); return tm.minute; } + uint8_t second(void) { getTime(tm); return tm.second; } + //uint8_t pm(void) { return _pm(RTC_BASE->TR); } + uint8_t isPM(void) { return ( hour()>=12 ); } - void setAlarmATime (tm * tm_ptr, bool hours_match = true, bool mins_match = true, bool secs_match = true, bool date_match = false); + uint8_t year(time_t t) { breakTime(t, tm); return tm.year; } + uint8_t month(time_t t) { breakTime(t, tm); return tm.month; } + uint8_t day(time_t t) { breakTime(t, tm); return tm.day; } + uint8_t weekday(time_t t) { breakTime(t, tm); return tm.weekday; } + uint8_t hour(time_t t) { breakTime(t, tm); return tm.hour; } + uint8_t minute(time_t t) { breakTime(t, tm); return tm.minute; } + uint8_t second(time_t t) { breakTime(t, tm); return tm.second; } + uint8_t isPM(time_t t) { return (hour(t)>=12); } + + void setAlarmATime (tm_t * tm_ptr, bool hours_match = true, bool mins_match = true, bool secs_match = true, bool date_match = false); void setAlarmATime (time_t alarm_time, bool hours_match = true, bool mins_match = true, bool secs_match = true, bool date_match = false); void turnOffAlarmA(); - void setAlarmBTime (tm * tm_ptr, bool hours_match = true, bool mins_match = true, bool secs_match = true, bool date_match = false); + void setAlarmBTime (tm_t * tm_ptr, bool hours_match = true, bool mins_match = true, bool secs_match = true, bool date_match = false); void setAlarmBTime (time_t alarm_time, bool hours_match = true, bool mins_match = true, bool secs_match = true, bool date_match = false); void turnOffAlarmB(); @@ -143,17 +216,29 @@ class RTClock { void attachPeriodicWakeupInterrupt(voidFuncPtr function); void detachPeriodicWakeupInterrupt(); + inline void attachSecondsInterrupt(voidFuncPtr function) { attachPeriodicWakeupInterrupt(function); } + inline void detachSecondsInterrupt() { detachPeriodicWakeupInterrupt(); } void attachAlarmAInterrupt(voidFuncPtr function); void detachAlarmAInterrupt(); void attachAlarmBInterrupt(voidFuncPtr function); void detachAlarmBInterrupt(); - //private: - -} ; + private: + inline uint8_t _year(uint32_t dr) { return bcd2bin( (dr>>RTC_DR_YEAR_BIT) & RTC_DR_YEAR_MASK ); } + inline uint8_t _month(uint32_t dr) { return bcd2bin( (dr>>RTC_DR_MONTH_BIT) & RTC_DR_MONTH_MASK ); } + inline uint8_t _day(uint32_t dr) { return bcd2bin( (dr>>RTC_DR_DAY_BIT) & RTC_DR_DAY_MASK ); } + inline uint8_t _weekday(uint32_t dr) { return bcd2bin( (dr>>RTC_DR_WEEKDAY_BIT) & RTC_DR_WEEKDAY_MASK ); } + inline uint8_t _pm(uint32_t tr) { return ( (tr>>RTC_TR_PM_BIT) & RTC_TR_PM_MASK ); } + inline uint8_t _hour(uint32_t tr) { return bcd2bin( (tr>>RTC_TR_HOUR_BIT) & RTC_TR_HOUR_MASK ); } + inline uint8_t _minute(uint32_t tr) { return bcd2bin( (tr>>RTC_TR_MINUTE_BIT) & RTC_TR_MINUTE_MASK ); } + inline uint8_t _second(uint32_t tr) { return bcd2bin( (tr>>RTC_TR_SECOND_BIT) & RTC_TR_SECOND_MASK ); } + tm_t tm; +}; +inline uint32_t getTReg(void) { return (uint32_t)(RTC_BASE->TR); } +inline uint32_t getDReg(void) { return (uint32_t)(RTC_BASE->DR); } /** * @brief Clear the register synchronized flag. The flag is then set by hardware after a write to PRL/DIV or CNT. @@ -246,7 +331,8 @@ static inline void rtc_disable_wakeup_event() { *bb_perip(&EXTI_BASE->RTSR, EXTI_RTC_WAKEUP_BIT) = 0; } - +#ifdef __cplusplus +} +#endif #endif // _RTCLOCK_H_ - \ No newline at end of file From 6b856152216df10212454461043930fd8e0f3bc8 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 20 Jul 2017 17:43:13 +1000 Subject: [PATCH 150/307] Change Wire endTransmission to have bool instead of unit8 argument - to match with the Arduino API --- STM32F1/libraries/Wire/WireBase.cpp | 2 +- STM32F1/libraries/Wire/WireBase.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/Wire/WireBase.cpp b/STM32F1/libraries/Wire/WireBase.cpp index 73d039836..90ec37044 100644 --- a/STM32F1/libraries/Wire/WireBase.cpp +++ b/STM32F1/libraries/Wire/WireBase.cpp @@ -59,7 +59,7 @@ void WireBase::beginTransmission(int slave_address) { beginTransmission((uint8)slave_address); } -uint8 WireBase::endTransmission(uint8 stop) { +uint8 WireBase::endTransmission(bool stop) { uint8 retVal; if (tx_buf_overflow) { return EDATA; diff --git a/STM32F1/libraries/Wire/WireBase.h b/STM32F1/libraries/Wire/WireBase.h index 4038428d5..5e51ab78c 100644 --- a/STM32F1/libraries/Wire/WireBase.h +++ b/STM32F1/libraries/Wire/WireBase.h @@ -91,7 +91,7 @@ class WireBase { // Abstraction is awesome! * Call the process function to process the message if the TX * buffer has not overflowed. */ - uint8 endTransmission(uint8); + uint8 endTransmission(bool); uint8 endTransmission(void); /* From 0db43ae36f8e2f378fbd3d7fd4b834febd20dc0c Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 28 Jul 2017 17:51:54 +0200 Subject: [PATCH 151/307] SPI clean up + add 16 bit access functions in 8 bit mode --- STM32F1/libraries/SPI/src/SPI.cpp | 68 ++++++++++++------------------- STM32F1/libraries/SPI/src/SPI.h | 44 +++++++++----------- 2 files changed, 46 insertions(+), 66 deletions(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 94e5031c8..34df62e33 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -31,7 +31,6 @@ #include "SPI.h" -//#define SPI_DEBUG #include #include @@ -92,11 +91,10 @@ static const spi_pins board_spi_pins[] __FLASH__ = { * Constructor */ -SPIClass::SPIClass(uint32 spi_num) { - +SPIClass::SPIClass(uint32 spi_num) +{ _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed - switch (spi_num) { #if BOARD_NR_SPI >= 1 case 1: @@ -119,7 +117,7 @@ SPIClass::SPIClass(uint32 spi_num) { default: ASSERT(0); } - + // Init things specific to each SPI device // clock divider setup is a bit of hack, and needs to be improved at a later date. _settings[0].spi_d = SPI1; @@ -149,9 +147,6 @@ SPIClass::SPIClass(uint32 spi_num) { */ void SPIClass::updateSettings(void) { uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE | SPI_SOFT_SS); - #ifdef SPI_DEBUG - Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); - #endif spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags); } @@ -167,9 +162,6 @@ void SPIClass::beginSlave(void) { spi_init(_currentSetting->spi_d); configure_gpios(_currentSetting->spi_d, 0); uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_RX_ONLY); - #ifdef SPI_DEBUG - Serial.print("spi_slave_enable("); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); - #endif spi_slave_enable(_currentSetting->spi_d, (spi_mode)_currentSetting->dataMode, flags); // added for DMA callbacks. _currentSetting->state = SPI_STATE_READY; @@ -199,9 +191,6 @@ void SPIClass::end(void) { /* Roger Clark added 3 functions */ void SPIClass::setClockDivider(uint32_t clockDivider) { - #ifdef SPI_DEBUG - Serial.print("Clock divider set to "); Serial.println(clockDivider); - #endif _currentSetting->clockDivider = clockDivider; uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_BR); _currentSetting->spi_d->regs->CR1 = cr1 | (clockDivider & SPI_CR1_BR); @@ -209,9 +198,6 @@ void SPIClass::setClockDivider(uint32_t clockDivider) void SPIClass::setBitOrder(BitOrder bitOrder) { - #ifdef SPI_DEBUG - Serial.print("Bit order set to "); Serial.println(bitOrder); - #endif _currentSetting->bitOrder = bitOrder; uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_LSBFIRST); if ( bitOrder==LSBFIRST ) cr1 |= SPI_CR1_LSBFIRST; @@ -258,9 +244,6 @@ bit 0 - CPHA : Clock phase If someone finds this is not the case or sees a logic error with this let me know ;-) */ - #ifdef SPI_DEBUG - Serial.print("Data mode set to "); Serial.println(dataMode); - #endif _currentSetting->dataMode = dataMode; uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA); _currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA)); @@ -268,9 +251,6 @@ If someone finds this is not the case or sees a logic error with this let me kno void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) { - #ifdef SPI_DEBUG - Serial.println("SPIClass::beginTransaction"); - #endif setBitOrder(settings.bitOrder); setDataMode(settings.dataMode); setDataSize(settings.dataSize); @@ -280,9 +260,6 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) void SPIClass::beginTransactionSlave(SPISettings settings) { - #ifdef SPI_DEBUG - Serial.println(F("SPIClass::beginTransactionSlave")); - #endif setBitOrder(settings.bitOrder); setDataMode(settings.dataMode); setDataSize(settings.dataSize); @@ -291,9 +268,6 @@ void SPIClass::beginTransactionSlave(SPISettings settings) void SPIClass::endTransaction(void) { - #ifdef SPI_DEBUG - Serial.println("SPIClass::endTransaction"); - #endif //digitalWrite(_SSPin,HIGH); #if false // code from SAM core @@ -355,6 +329,16 @@ void SPIClass::write(uint16 data) while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } +void SPIClass::write16(uint16 data) +{ + // Added by stevestrong: write two consecutive bytes in 8 bit mode (DFF=0) + spi_tx_reg(_currentSetting->spi_d, data>>8); // write high byte + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // Wait until TXE=1 + spi_tx_reg(_currentSetting->spi_d, data); // write low byte + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // Wait until TXE=1 + while (spi_is_busy(_currentSetting->spi_d) != 0); // wait until BSY=0 +} + void SPIClass::write(uint16 data, uint32 n) { // Added by stevstrong: Repeatedly send same data by the specified number of times @@ -384,14 +368,21 @@ uint8 SPIClass::transfer(uint8 byte) const return (uint8)spi_rx_reg(spi_d); // "... and read the last received data." } -uint16_t SPIClass::transfer16(uint16_t wr_data) const +uint16_t SPIClass::transfer16(uint16_t data) const { + // Modified by stevestrong: write & read two consecutive bytes in 8 bit mode (DFF=0) + // This is more effective than two distinct byte transfers spi_dev * spi_d = _currentSetting->spi_d; - spi_rx_reg(spi_d); // read any previous data - spi_tx_reg(spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." - return (uint16)spi_rx_reg(spi_d); // "... and read the last received data." + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, data>>8); // write high byte + while (spi_is_tx_empty(spi_d) == 0); // wait until TXE=1 + while (spi_is_busy(spi_d) != 0); // wait until BSY=0 + uint16_t ret = spi_rx_reg(spi_d)<<8; // read and shift high byte + spi_tx_reg(spi_d, data); // write low byte + while (spi_is_tx_empty(spi_d) == 0); // wait until TXE=1 + while (spi_is_busy(spi_d) != 0); // wait until BSY=0 + ret += spi_rx_reg(spi_d); // read low byte + return ret; } /* Roger Clark and Victor Perez, 2015 @@ -523,7 +514,7 @@ uint8 SPIClass::dmaSendAsync(void * transmitBuf, uint16 length, bool minc) { //delayMicroseconds(10); if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } } - + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." spi_tx_dma_disable(_currentSetting->spi_d); @@ -531,11 +522,9 @@ uint8 SPIClass::dmaSendAsync(void * transmitBuf, uint16 length, bool minc) { _currentSetting->state = SPI_STATE_READY; } - if (length == 0) return 0; uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - dma_init(_currentSetting->spiDmaDev); // TX dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; @@ -770,9 +759,6 @@ static const spi_baud_rate baud_rates[8] __FLASH__ = { */ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { uint32_t clock = 0, i; - #ifdef SPI_DEBUG - Serial.print("determine_baud_rate("); Serial.print(freq); Serial.println(")"); - #endif switch (rcc_dev_clk(dev->clk_id)) { case RCC_APB2: clock = STM32_PCLK2; break; // 72 Mhz diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 2160d2696..25eea861c 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -176,8 +176,6 @@ static void (*_spi3_this); class SPIClass { public: - - /** * @param spiPortNumber Number of the SPI port to manage. */ @@ -187,8 +185,6 @@ class SPIClass { * Set up/tear down */ - - /** * @brief Equivalent to begin(SPI_1_125MHZ, MSBFIRST, 0). */ @@ -268,14 +264,15 @@ class SPIClass { * @brief Transmit one byte/word. * @param data to transmit. */ - void write(uint16 data); - + void write(uint16 data); + void write16(uint16 data); // write 2 bytes in 8 bit mode (DFF=0) + /** * @brief Transmit one byte/word a specified number of times. * @param data to transmit. */ void write(uint16 data, uint32 n); - + /** * @brief Transmit multiple bytes/words. * @param buffer Bytes/words to transmit. @@ -293,7 +290,7 @@ class SPIClass { */ uint8 transfer(uint8 data) const; uint16_t transfer16(uint16_t data) const; - + /** * @brief Sets up a DMA Transfer for "length" bytes. * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. @@ -321,7 +318,7 @@ class SPIClass { uint8 dmaSend(void * transmitBuf, uint16 length, bool minc = 1); void dmaSendSet(void * transmitBuf, bool minc); uint8 dmaSendRepeat(uint16 length); - + uint8 dmaSendAsync(void * transmitBuf, uint16 length, bool minc = 1); /* * Pin accessors @@ -354,24 +351,21 @@ class SPIClass { * this HardwareSPI instance. */ spi_dev* c_dev(void) { return _currentSetting->spi_d; } - - + spi_dev *dev(){ return _currentSetting->spi_d;} - - /** - * @brief Sets the number of the SPI peripheral to be used by - * this HardwareSPI instance. - * - * @param spi_num Number of the SPI port. 1-2 in low density devices - * or 1-3 in high density devices. - */ - + + /** + * @brief Sets the number of the SPI peripheral to be used by + * this HardwareSPI instance. + * + * @param spi_num Number of the SPI port. 1-2 in low density devices + * or 1-3 in high density devices. + */ void setModule(int spi_num) { _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed } - /* -- The following methods are deprecated --------------------------- */ /** @@ -403,20 +397,20 @@ class SPIClass { * @see HardwareSPI::read() */ uint8 recv(void); - + private: SPISettings _settings[BOARD_NR_SPI]; SPISettings *_currentSetting; - + void updateSettings(void); /* * Functions added for DMA transfers with Callback. * Experimental. */ - + void EventCallback(void); - + static void _spi1EventCallback(void); static void _spi2EventCallback(void); #if BOARD_NR_SPI >= 3 From 0aae3d31f1ca1a43b1afc3619acf215406837e39 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 30 Jul 2017 16:07:30 +1000 Subject: [PATCH 152/307] Changed order of optimisation options, so that current settings (-Os) are the default, and reverted F4 and F3 boards.txt to current master to remove these changes from those boards, as they will need to be updated in the same way I did for the F1, and I don't have time to do it now --- STM32F1/boards.txt | 442 ++++++++++++++++++++++----------------------- STM32F3/boards.txt | 34 ---- STM32F4/boards.txt | 133 +------------- 3 files changed, 222 insertions(+), 387 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index b52623640..fe18609e1 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -45,36 +45,36 @@ mapleMini.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) mapleMini.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L #-- Optimizations -mapleMini.menu.opt.o2std=Faster -mapleMini.menu.opt.o2std.build.flags.optimize=-O2 -mapleMini.menu.opt.o2std.build.flags.ldspecs= -mapleMini.menu.opt.o2lto=Faster with LTO -mapleMini.menu.opt.o2lto.build.flags.optimize=-O2 -flto -mapleMini.menu.opt.o2lto.build.flags.ldspecs=-flto -mapleMini.menu.opt.o1std=Fast +mapleMini.menu.opt.osstd=Smallest (default) +mapleMini.menu.opt.osstd.build.flags.optimize=-Os +mapleMini.menu.opt.osstd.build.flags.ldspecs= +mapleMini.menu.opt.oslto=Smallest Code with LTO +mapleMini.menu.opt.oslto.build.flags.optimize=-Os -flto +mapleMini.menu.opt.oslto.build.flags.ldspecs=-flto +mapleMini.menu.opt.o1std=Fast (-O1) mapleMini.menu.opt.o1std.build.flags.optimize=-O1 mapleMini.menu.opt.o1std.build.flags.ldspecs= -mapleMini.menu.opt.o1lto=Fast with LTO +mapleMini.menu.opt.o1lto=Fast (-O1) with LTO mapleMini.menu.opt.o1lto.build.flags.optimize=-O1 -flto mapleMini.menu.opt.o1lto.build.flags.ldspecs=-flto -mapleMini.menu.opt.o3std=Fastest +mapleMini.menu.opt.o2std=Faster (-O2) +mapleMini.menu.opt.o2std.build.flags.optimize=-O2 +mapleMini.menu.opt.o2std.build.flags.ldspecs= +mapleMini.menu.opt.o2lto=Faster (-O2) with LTO +mapleMini.menu.opt.o2lto.build.flags.optimize=-O2 -flto +mapleMini.menu.opt.o2lto.build.flags.ldspecs=-flto +mapleMini.menu.opt.o3std=Fastest (-03) mapleMini.menu.opt.o3std.build.flags.optimize=-O3 mapleMini.menu.opt.o3std.build.flags.ldspecs= -mapleMini.menu.opt.o3lto=Fastest with LTO +mapleMini.menu.opt.o3lto=Fastest (-0) with LTO mapleMini.menu.opt.o3lto.build.flags.optimize=-O3 -flto mapleMini.menu.opt.o3lto.build.flags.ldspecs=-flto -mapleMini.menu.opt.ogstd=Debug +mapleMini.menu.opt.ogstd=Debug (-g) mapleMini.menu.opt.ogstd.build.flags.optimize=-Og mapleMini.menu.opt.ogstd.build.flags.ldspecs= mapleMini.menu.opt.oglto=Debug with LTO mapleMini.menu.opt.oglto.build.flags.optimize=-Og -flto mapleMini.menu.opt.oglto.build.flags.ldspecs=-flto -mapleMini.menu.opt.osstd=Smallest Code -mapleMini.menu.opt.osstd.build.flags.optimize=-Os -mapleMini.menu.opt.osstd.build.flags.ldspecs= -mapleMini.menu.opt.oslto=Smallest Code with LTO -mapleMini.menu.opt.oslto.build.flags.optimize=-Os -flto -mapleMini.menu.opt.oslto.build.flags.ldspecs=-flto ############################################################## @@ -100,36 +100,36 @@ maple.build.variant=maple maple.build.vect=VECT_TAB_ADDR=0x8005000 #-- Optimizations -maple.menu.opt.o2std=Faster -maple.menu.opt.o2std.build.flags.optimize=-O2 -maple.menu.opt.o2std.build.flags.ldspecs= -maple.menu.opt.o2lto=Faster with LTO -maple.menu.opt.o2lto.build.flags.optimize=-O2 -flto -maple.menu.opt.o2lto.build.flags.ldspecs=-flto -maple.menu.opt.o1std=Fast +maple.menu.opt.osstd=Smallest (default) +maple.menu.opt.osstd.build.flags.optimize=-Os +maple.menu.opt.osstd.build.flags.ldspecs= +maple.menu.opt.oslto=Smallest Code with LTO +maple.menu.opt.oslto.build.flags.optimize=-Os -flto +maple.menu.opt.oslto.build.flags.ldspecs=-flto +maple.menu.opt.o1std=Fast (-O1) maple.menu.opt.o1std.build.flags.optimize=-O1 maple.menu.opt.o1std.build.flags.ldspecs= -maple.menu.opt.o1lto=Fast with LTO +maple.menu.opt.o1lto=Fast (-O1) with LTO maple.menu.opt.o1lto.build.flags.optimize=-O1 -flto maple.menu.opt.o1lto.build.flags.ldspecs=-flto -maple.menu.opt.o3std=Fastest +maple.menu.opt.o2std=Faster (-O2) +maple.menu.opt.o2std.build.flags.optimize=-O2 +maple.menu.opt.o2std.build.flags.ldspecs= +maple.menu.opt.o2lto=Faster (-O2) with LTO +maple.menu.opt.o2lto.build.flags.optimize=-O2 -flto +maple.menu.opt.o2lto.build.flags.ldspecs=-flto +maple.menu.opt.o3std=Fastest (-03) maple.menu.opt.o3std.build.flags.optimize=-O3 maple.menu.opt.o3std.build.flags.ldspecs= -maple.menu.opt.o3lto=Fastest with LTO +maple.menu.opt.o3lto=Fastest (-0) with LTO maple.menu.opt.o3lto.build.flags.optimize=-O3 -flto maple.menu.opt.o3lto.build.flags.ldspecs=-flto -maple.menu.opt.ogstd=Debug +maple.menu.opt.ogstd=Debug (-g) maple.menu.opt.ogstd.build.flags.optimize=-Og maple.menu.opt.ogstd.build.flags.ldspecs= maple.menu.opt.oglto=Debug with LTO maple.menu.opt.oglto.build.flags.optimize=-Og -flto maple.menu.opt.oglto.build.flags.ldspecs=-flto -maple.menu.opt.osstd=Smallest Code -maple.menu.opt.osstd.build.flags.optimize=-Os -maple.menu.opt.osstd.build.flags.ldspecs= -maple.menu.opt.oslto=Smallest Code with LTO -maple.menu.opt.oslto.build.flags.optimize=-Os -flto -maple.menu.opt.oslto.build.flags.ldspecs=-flto ############################################################## mapleRET6.name=Maple (RET6) @@ -155,36 +155,36 @@ mapleRET6.upload.altID=1 mapleRET6.upload.auto_reset=true #-- Optimizations -mapleRET6.menu.opt.o2std=Faster -mapleRET6.menu.opt.o2std.build.flags.optimize=-O2 -mapleRET6.menu.opt.o2std.build.flags.ldspecs= -mapleRET6.menu.opt.o2lto=Faster with LTO -mapleRET6.menu.opt.o2lto.build.flags.optimize=-O2 -flto -mapleRET6.menu.opt.o2lto.build.flags.ldspecs=-flto -mapleRET6.menu.opt.o1std=Fast +mapleRET6.menu.opt.osstd=Smallest (default) +mapleRET6.menu.opt.osstd.build.flags.optimize=-Os +mapleRET6.menu.opt.osstd.build.flags.ldspecs= +mapleRET6.menu.opt.oslto=Smallest Code with LTO +mapleRET6.menu.opt.oslto.build.flags.optimize=-Os -flto +mapleRET6.menu.opt.oslto.build.flags.ldspecs=-flto +mapleRET6.menu.opt.o1std=Fast (-O1) mapleRET6.menu.opt.o1std.build.flags.optimize=-O1 mapleRET6.menu.opt.o1std.build.flags.ldspecs= -mapleRET6.menu.opt.o1lto=Fast with LTO +mapleRET6.menu.opt.o1lto=Fast (-O1) with LTO mapleRET6.menu.opt.o1lto.build.flags.optimize=-O1 -flto mapleRET6.menu.opt.o1lto.build.flags.ldspecs=-flto -mapleRET6.menu.opt.o3std=Fastest +mapleRET6.menu.opt.o2std=Faster (-O2) +mapleRET6.menu.opt.o2std.build.flags.optimize=-O2 +mapleRET6.menu.opt.o2std.build.flags.ldspecs= +mapleRET6.menu.opt.o2lto=Faster (-O2) with LTO +mapleRET6.menu.opt.o2lto.build.flags.optimize=-O2 -flto +mapleRET6.menu.opt.o2lto.build.flags.ldspecs=-flto +mapleRET6.menu.opt.o3std=Fastest (-03) mapleRET6.menu.opt.o3std.build.flags.optimize=-O3 mapleRET6.menu.opt.o3std.build.flags.ldspecs= -mapleRET6.menu.opt.o3lto=Fastest with LTO +mapleRET6.menu.opt.o3lto=Fastest (-0) with LTO mapleRET6.menu.opt.o3lto.build.flags.optimize=-O3 -flto +mapleRET6.menu.opt.ogstd=Debug (-g) mapleRET6.menu.opt.o3lto.build.flags.ldspecs=-flto -mapleRET6.menu.opt.ogstd=Debug mapleRET6.menu.opt.ogstd.build.flags.optimize=-Og mapleRET6.menu.opt.ogstd.build.flags.ldspecs= mapleRET6.menu.opt.oglto=Debug with LTO mapleRET6.menu.opt.oglto.build.flags.optimize=-Og -flto mapleRET6.menu.opt.oglto.build.flags.ldspecs=-flto -mapleRET6.menu.opt.osstd=Smallest Code -mapleRET6.menu.opt.osstd.build.flags.optimize=-Os -mapleRET6.menu.opt.osstd.build.flags.ldspecs= -mapleRET6.menu.opt.oslto=Smallest Code with LTO -mapleRET6.menu.opt.oslto.build.flags.optimize=-Os -flto -mapleRET6.menu.opt.oslto.build.flags.ldspecs=-flto ############################################################## @@ -218,36 +218,36 @@ microduino32_flash.build.error_led_pin=1 microduino32_flash.build.gcc_ver=gcc-arm-none-eabi-4.8.3-2014q1 #-- Optimizations -microduino32_flash.menu.opt.o2std=Faster -microduino32_flash.menu.opt.o2std.build.flags.optimize=-O2 -microduino32_flash.menu.opt.o2std.build.flags.ldspecs= -microduino32_flash.menu.opt.o2lto=Faster with LTO -microduino32_flash.menu.opt.o2lto.build.flags.optimize=-O2 -flto -microduino32_flash.menu.opt.o2lto.build.flags.ldspecs=-flto -microduino32_flash.menu.opt.o1std=Fast +microduino32_flash.menu.opt.osstd=Smallest (default) +microduino32_flash.menu.opt.osstd.build.flags.optimize=-Os +microduino32_flash.menu.opt.osstd.build.flags.ldspecs= +microduino32_flash.menu.opt.oslto=Smallest Code with LTO +microduino32_flash.menu.opt.oslto.build.flags.optimize=-Os -flto +microduino32_flash.menu.opt.oslto.build.flags.ldspecs=-flto +microduino32_flash.menu.opt.o1std=Fast (-O1) microduino32_flash.menu.opt.o1std.build.flags.optimize=-O1 microduino32_flash.menu.opt.o1std.build.flags.ldspecs= -microduino32_flash.menu.opt.o1lto=Fast with LTO +microduino32_flash.menu.opt.o1lto=Fast (-O1) with LTO microduino32_flash.menu.opt.o1lto.build.flags.optimize=-O1 -flto microduino32_flash.menu.opt.o1lto.build.flags.ldspecs=-flto -microduino32_flash.menu.opt.o3std=Fastest +microduino32_flash.menu.opt.o2std=Faster (-O2) +microduino32_flash.menu.opt.o2std.build.flags.optimize=-O2 +microduino32_flash.menu.opt.o2std.build.flags.ldspecs= +microduino32_flash.menu.opt.o2lto=Faster (-O2) with LTO +microduino32_flash.menu.opt.o2lto.build.flags.optimize=-O2 -flto +microduino32_flash.menu.opt.o2lto.build.flags.ldspecs=-flto +microduino32_flash.menu.opt.o3std=Fastest (-03) microduino32_flash.menu.opt.o3std.build.flags.optimize=-O3 microduino32_flash.menu.opt.o3std.build.flags.ldspecs= -microduino32_flash.menu.opt.o3lto=Fastest with LTO +microduino32_flash.menu.opt.o3lto=Fastest (-0) with LTO microduino32_flash.menu.opt.o3lto.build.flags.optimize=-O3 -flto +microduino32_flash.menu.opt.ogstd=Debug (-g) microduino32_flash.menu.opt.o3lto.build.flags.ldspecs=-flto -microduino32_flash.menu.opt.ogstd=Debug microduino32_flash.menu.opt.ogstd.build.flags.optimize=-Og microduino32_flash.menu.opt.ogstd.build.flags.ldspecs= microduino32_flash.menu.opt.oglto=Debug with LTO microduino32_flash.menu.opt.oglto.build.flags.optimize=-Og -flto microduino32_flash.menu.opt.oglto.build.flags.ldspecs=-flto -microduino32_flash.menu.opt.osstd=Smallest Code -microduino32_flash.menu.opt.osstd.build.flags.optimize=-Os -microduino32_flash.menu.opt.osstd.build.flags.ldspecs= -microduino32_flash.menu.opt.oslto=Smallest Code with LTO -microduino32_flash.menu.opt.oslto.build.flags.optimize=-Os -flto -microduino32_flash.menu.opt.oslto.build.flags.ldspecs=-flto ############################################################## nucleo_f103rb.name=STM Nucleo F103RB (STLink) @@ -288,36 +288,36 @@ nucleo_f103rb.menu.device_variant.NucleoF103_HSE.build.f_cpu=72000000L nucleo_f103rb.menu.device_variant.NucleoF103_HSE.build.extra_flags=-DNUCLEO_HSE_CRYSTAL -DMCU_STM32F103RB -mthumb -march=armv7-m -D__STM32F1__ #-- Optimizations -nucleo_f103rb.menu.opt.o2std=Faster -nucleo_f103rb.menu.opt.o2std.build.flags.optimize=-O2 -nucleo_f103rb.menu.opt.o2std.build.flags.ldspecs= -nucleo_f103rb.menu.opt.o2lto=Faster with LTO -nucleo_f103rb.menu.opt.o2lto.build.flags.optimize=-O2 -flto -nucleo_f103rb.menu.opt.o2lto.build.flags.ldspecs=-flto -nucleo_f103rb.menu.opt.o1std=Fast +nucleo_f103rb.menu.opt.osstd=Smallest (default) +nucleo_f103rb.menu.opt.osstd.build.flags.optimize=-Os +nucleo_f103rb.menu.opt.osstd.build.flags.ldspecs= +nucleo_f103rb.menu.opt.oslto=Smallest Code with LTO +nucleo_f103rb.menu.opt.oslto.build.flags.optimize=-Os -flto +nucleo_f103rb.menu.opt.oslto.build.flags.ldspecs=-flto +nucleo_f103rb.menu.opt.o1std=Fast (-O1) nucleo_f103rb.menu.opt.o1std.build.flags.optimize=-O1 nucleo_f103rb.menu.opt.o1std.build.flags.ldspecs= -nucleo_f103rb.menu.opt.o1lto=Fast with LTO +nucleo_f103rb.menu.opt.o1lto=Fast (-O1) with LTO nucleo_f103rb.menu.opt.o1lto.build.flags.optimize=-O1 -flto nucleo_f103rb.menu.opt.o1lto.build.flags.ldspecs=-flto -nucleo_f103rb.menu.opt.o3std=Fastest +nucleo_f103rb.menu.opt.o2std=Faster (-O2) +nucleo_f103rb.menu.opt.o2std.build.flags.optimize=-O2 +nucleo_f103rb.menu.opt.o2std.build.flags.ldspecs= +nucleo_f103rb.menu.opt.o2lto=Faster (-O2) with LTO +nucleo_f103rb.menu.opt.o2lto.build.flags.optimize=-O2 -flto +nucleo_f103rb.menu.opt.o2lto.build.flags.ldspecs=-flto +nucleo_f103rb.menu.opt.o3std=Fastest (-03) nucleo_f103rb.menu.opt.o3std.build.flags.optimize=-O3 nucleo_f103rb.menu.opt.o3std.build.flags.ldspecs= -nucleo_f103rb.menu.opt.o3lto=Fastest with LTO +nucleo_f103rb.menu.opt.o3lto=Fastest (-0) with LTO nucleo_f103rb.menu.opt.o3lto.build.flags.optimize=-O3 -flto +nucleo_f103rb.menu.opt.ogstd=Debug (-g) nucleo_f103rb.menu.opt.o3lto.build.flags.ldspecs=-flto -nucleo_f103rb.menu.opt.ogstd=Debug nucleo_f103rb.menu.opt.ogstd.build.flags.optimize=-Og nucleo_f103rb.menu.opt.ogstd.build.flags.ldspecs= nucleo_f103rb.menu.opt.oglto=Debug with LTO nucleo_f103rb.menu.opt.oglto.build.flags.optimize=-Og -flto nucleo_f103rb.menu.opt.oglto.build.flags.ldspecs=-flto -nucleo_f103rb.menu.opt.osstd=Smallest Code -nucleo_f103rb.menu.opt.osstd.build.flags.optimize=-Os -nucleo_f103rb.menu.opt.osstd.build.flags.ldspecs= -nucleo_f103rb.menu.opt.oslto=Smallest Code with LTO -nucleo_f103rb.menu.opt.oslto.build.flags.optimize=-Os -flto -nucleo_f103rb.menu.opt.oslto.build.flags.ldspecs=-flto ###################### Generic STM32F103C ######################################## @@ -385,36 +385,36 @@ genericSTM32F103C.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) genericSTM32F103C.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L #-- Optimizations -genericSTM32F103C.menu.opt.o2std=Faster -genericSTM32F103C.menu.opt.o2std.build.flags.optimize=-O2 -genericSTM32F103C.menu.opt.o2std.build.flags.ldspecs= -genericSTM32F103C.menu.opt.o2lto=Faster with LTO -genericSTM32F103C.menu.opt.o2lto.build.flags.optimize=-O2 -flto -genericSTM32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto -genericSTM32F103C.menu.opt.o1std=Fast +genericSTM32F103C.menu.opt.osstd=Smallest (default) +genericSTM32F103C.menu.opt.osstd.build.flags.optimize=-Os +genericSTM32F103C.menu.opt.osstd.build.flags.ldspecs= +genericSTM32F103C.menu.opt.oslto=Smallest Code with LTO +genericSTM32F103C.menu.opt.oslto.build.flags.optimize=-Os -flto +genericSTM32F103C.menu.opt.oslto.build.flags.ldspecs=-flto +genericSTM32F103C.menu.opt.o1std=Fast (-O1) genericSTM32F103C.menu.opt.o1std.build.flags.optimize=-O1 genericSTM32F103C.menu.opt.o1std.build.flags.ldspecs= -genericSTM32F103C.menu.opt.o1lto=Fast with LTO +genericSTM32F103C.menu.opt.o1lto=Fast (-O1) with LTO genericSTM32F103C.menu.opt.o1lto.build.flags.optimize=-O1 -flto genericSTM32F103C.menu.opt.o1lto.build.flags.ldspecs=-flto -genericSTM32F103C.menu.opt.o3std=Fastest +genericSTM32F103C.menu.opt.o2std=Faster (-O2) +genericSTM32F103C.menu.opt.o2std.build.flags.optimize=-O2 +genericSTM32F103C.menu.opt.o2std.build.flags.ldspecs= +genericSTM32F103C.menu.opt.o2lto=Faster (-O2) with LTO +genericSTM32F103C.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericSTM32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto +genericSTM32F103C.menu.opt.o3std=Fastest (-03) genericSTM32F103C.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103C.menu.opt.o3std.build.flags.ldspecs= -genericSTM32F103C.menu.opt.o3lto=Fastest with LTO +genericSTM32F103C.menu.opt.o3lto=Fastest (-0) with LTO genericSTM32F103C.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericSTM32F103C.menu.opt.ogstd=Debug (-g) genericSTM32F103C.menu.opt.o3lto.build.flags.ldspecs=-flto -genericSTM32F103C.menu.opt.ogstd=Debug genericSTM32F103C.menu.opt.ogstd.build.flags.optimize=-Og genericSTM32F103C.menu.opt.ogstd.build.flags.ldspecs= genericSTM32F103C.menu.opt.oglto=Debug with LTO genericSTM32F103C.menu.opt.oglto.build.flags.optimize=-Og -flto genericSTM32F103C.menu.opt.oglto.build.flags.ldspecs=-flto -genericSTM32F103C.menu.opt.osstd=Smallest Code -genericSTM32F103C.menu.opt.osstd.build.flags.optimize=-Os -genericSTM32F103C.menu.opt.osstd.build.flags.ldspecs= -genericSTM32F103C.menu.opt.oslto=Smallest Code with LTO -genericSTM32F103C.menu.opt.oslto.build.flags.optimize=-Os -flto -genericSTM32F103C.menu.opt.oslto.build.flags.ldspecs=-flto ########################### Generic STM32F103R ########################### @@ -486,36 +486,36 @@ genericSTM32F103R.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103R.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG #-- Optimizations -genericSTM32F103R.menu.opt.o2std=Faster -genericSTM32F103R.menu.opt.o2std.build.flags.optimize=-O2 -genericSTM32F103R.menu.opt.o2std.build.flags.ldspecs= -genericSTM32F103R.menu.opt.o2lto=Faster with LTO -genericSTM32F103R.menu.opt.o2lto.build.flags.optimize=-O2 -flto -genericSTM32F103R.menu.opt.o2lto.build.flags.ldspecs=-flto -genericSTM32F103R.menu.opt.o1std=Fast +genericSTM32F103R.menu.opt.osstd=Smallest (default) +genericSTM32F103R.menu.opt.osstd.build.flags.optimize=-Os +genericSTM32F103R.menu.opt.osstd.build.flags.ldspecs= +genericSTM32F103R.menu.opt.oslto=Smallest Code with LTO +genericSTM32F103R.menu.opt.oslto.build.flags.optimize=-Os -flto +genericSTM32F103R.menu.opt.oslto.build.flags.ldspecs=-flto +genericSTM32F103R.menu.opt.o1std=Fast (-O1) genericSTM32F103R.menu.opt.o1std.build.flags.optimize=-O1 genericSTM32F103R.menu.opt.o1std.build.flags.ldspecs= -genericSTM32F103R.menu.opt.o1lto=Fast with LTO +genericSTM32F103R.menu.opt.o1lto=Fast (-O1) with LTO genericSTM32F103R.menu.opt.o1lto.build.flags.optimize=-O1 -flto genericSTM32F103R.menu.opt.o1lto.build.flags.ldspecs=-flto -genericSTM32F103R.menu.opt.o3std=Fastest +genericSTM32F103R.menu.opt.o2std=Faster (-O2) +genericSTM32F103R.menu.opt.o2std.build.flags.optimize=-O2 +genericSTM32F103R.menu.opt.o2std.build.flags.ldspecs= +genericSTM32F103R.menu.opt.o2lto=Faster (-O2) with LTO +genericSTM32F103R.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericSTM32F103R.menu.opt.o2lto.build.flags.ldspecs=-flto +genericSTM32F103R.menu.opt.o3std=Fastest (-03) genericSTM32F103R.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103R.menu.opt.o3std.build.flags.ldspecs= -genericSTM32F103R.menu.opt.o3lto=Fastest with LTO +genericSTM32F103R.menu.opt.o3lto=Fastest (-0) with LTO genericSTM32F103R.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericSTM32F103R.menu.opt.ogstd=Debug (-g) genericSTM32F103R.menu.opt.o3lto.build.flags.ldspecs=-flto -genericSTM32F103R.menu.opt.ogstd=Debug genericSTM32F103R.menu.opt.ogstd.build.flags.optimize=-Og genericSTM32F103R.menu.opt.ogstd.build.flags.ldspecs= genericSTM32F103R.menu.opt.oglto=Debug with LTO genericSTM32F103R.menu.opt.oglto.build.flags.optimize=-Og -flto genericSTM32F103R.menu.opt.oglto.build.flags.ldspecs=-flto -genericSTM32F103R.menu.opt.osstd=Smallest Code -genericSTM32F103R.menu.opt.osstd.build.flags.optimize=-Os -genericSTM32F103R.menu.opt.osstd.build.flags.ldspecs= -genericSTM32F103R.menu.opt.oslto=Smallest Code with LTO -genericSTM32F103R.menu.opt.oslto.build.flags.optimize=-Os -flto -genericSTM32F103R.menu.opt.oslto.build.flags.ldspecs=-flto ###################### Generic STM32F103T ######################################## @@ -571,36 +571,36 @@ genericSTM32F103T.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103T.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG #-- Optimizations -genericSTM32F103T.menu.opt.o2std=Faster -genericSTM32F103T.menu.opt.o2std.build.flags.optimize=-O2 -genericSTM32F103T.menu.opt.o2std.build.flags.ldspecs= -genericSTM32F103T.menu.opt.o2lto=Faster with LTO -genericSTM32F103T.menu.opt.o2lto.build.flags.optimize=-O2 -flto -genericSTM32F103T.menu.opt.o2lto.build.flags.ldspecs=-flto -genericSTM32F103T.menu.opt.o1std=Fast +genericSTM32F103T.menu.opt.osstd=Smallest (default) +genericSTM32F103T.menu.opt.osstd.build.flags.optimize=-Os +genericSTM32F103T.menu.opt.osstd.build.flags.ldspecs= +genericSTM32F103T.menu.opt.oslto=Smallest Code with LTO +genericSTM32F103T.menu.opt.oslto.build.flags.optimize=-Os -flto +genericSTM32F103T.menu.opt.oslto.build.flags.ldspecs=-flto +genericSTM32F103T.menu.opt.o1std=Fast (-O1) genericSTM32F103T.menu.opt.o1std.build.flags.optimize=-O1 genericSTM32F103T.menu.opt.o1std.build.flags.ldspecs= -genericSTM32F103T.menu.opt.o1lto=Fast with LTO +genericSTM32F103T.menu.opt.o1lto=Fast (-O1) with LTO genericSTM32F103T.menu.opt.o1lto.build.flags.optimize=-O1 -flto genericSTM32F103T.menu.opt.o1lto.build.flags.ldspecs=-flto -genericSTM32F103T.menu.opt.o3std=Fastest +genericSTM32F103T.menu.opt.o2std=Faster (-O2) +genericSTM32F103T.menu.opt.o2std.build.flags.optimize=-O2 +genericSTM32F103T.menu.opt.o2std.build.flags.ldspecs= +genericSTM32F103T.menu.opt.o2lto=Faster (-O2) with LTO +genericSTM32F103T.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericSTM32F103T.menu.opt.o2lto.build.flags.ldspecs=-flto +genericSTM32F103T.menu.opt.o3std=Fastest (-03) genericSTM32F103T.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103T.menu.opt.o3std.build.flags.ldspecs= -genericSTM32F103T.menu.opt.o3lto=Fastest with LTO +genericSTM32F103T.menu.opt.o3lto=Fastest (-0) with LTO genericSTM32F103T.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericSTM32F103T.menu.opt.ogstd=Debug (-g) genericSTM32F103T.menu.opt.o3lto.build.flags.ldspecs=-flto -genericSTM32F103T.menu.opt.ogstd=Debug genericSTM32F103T.menu.opt.ogstd.build.flags.optimize=-Og genericSTM32F103T.menu.opt.ogstd.build.flags.ldspecs= genericSTM32F103T.menu.opt.oglto=Debug with LTO genericSTM32F103T.menu.opt.oglto.build.flags.optimize=-Og -flto genericSTM32F103T.menu.opt.oglto.build.flags.ldspecs=-flto -genericSTM32F103T.menu.opt.osstd=Smallest Code -genericSTM32F103T.menu.opt.osstd.build.flags.optimize=-Os -genericSTM32F103T.menu.opt.osstd.build.flags.ldspecs= -genericSTM32F103T.menu.opt.oslto=Smallest Code with LTO -genericSTM32F103T.menu.opt.oslto.build.flags.optimize=-Os -flto -genericSTM32F103T.menu.opt.oslto.build.flags.ldspecs=-flto ########################### Generic STM32F103V ########################### @@ -663,36 +663,36 @@ genericSTM32F103V.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103V.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG #-- Optimizations -genericSTM32F103V.menu.opt.o2std=Faster -genericSTM32F103V.menu.opt.o2std.build.flags.optimize=-O2 -genericSTM32F103V.menu.opt.o2std.build.flags.ldspecs= -genericSTM32F103V.menu.opt.o2lto=Faster with LTO -genericSTM32F103V.menu.opt.o2lto.build.flags.optimize=-O2 -flto -genericSTM32F103V.menu.opt.o2lto.build.flags.ldspecs=-flto -genericSTM32F103V.menu.opt.o1std=Fast +genericSTM32F103V.menu.opt.osstd=Smallest (default) +genericSTM32F103V.menu.opt.osstd.build.flags.optimize=-Os +genericSTM32F103V.menu.opt.osstd.build.flags.ldspecs= +genericSTM32F103V.menu.opt.oslto=Smallest Code with LTO +genericSTM32F103V.menu.opt.oslto.build.flags.optimize=-Os -flto +genericSTM32F103V.menu.opt.oslto.build.flags.ldspecs=-flto +genericSTM32F103V.menu.opt.o1std=Fast (-O1) genericSTM32F103V.menu.opt.o1std.build.flags.optimize=-O1 genericSTM32F103V.menu.opt.o1std.build.flags.ldspecs= -genericSTM32F103V.menu.opt.o1lto=Fast with LTO +genericSTM32F103V.menu.opt.o1lto=Fast (-O1) with LTO genericSTM32F103V.menu.opt.o1lto.build.flags.optimize=-O1 -flto genericSTM32F103V.menu.opt.o1lto.build.flags.ldspecs=-flto -genericSTM32F103V.menu.opt.o3std=Fastest +genericSTM32F103V.menu.opt.o2std=Faster (-O2) +genericSTM32F103V.menu.opt.o2std.build.flags.optimize=-O2 +genericSTM32F103V.menu.opt.o2std.build.flags.ldspecs= +genericSTM32F103V.menu.opt.o2lto=Faster (-O2) with LTO +genericSTM32F103V.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericSTM32F103V.menu.opt.o2lto.build.flags.ldspecs=-flto +genericSTM32F103V.menu.opt.o3std=Fastest (-03) genericSTM32F103V.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103V.menu.opt.o3std.build.flags.ldspecs= -genericSTM32F103V.menu.opt.o3lto=Fastest with LTO +genericSTM32F103V.menu.opt.o3lto=Fastest (-0) with LTO genericSTM32F103V.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericSTM32F103V.menu.opt.ogstd=Debug (-g) genericSTM32F103V.menu.opt.o3lto.build.flags.ldspecs=-flto -genericSTM32F103V.menu.opt.ogstd=Debug genericSTM32F103V.menu.opt.ogstd.build.flags.optimize=-Og genericSTM32F103V.menu.opt.ogstd.build.flags.ldspecs= genericSTM32F103V.menu.opt.oglto=Debug with LTO genericSTM32F103V.menu.opt.oglto.build.flags.optimize=-Og -flto genericSTM32F103V.menu.opt.oglto.build.flags.ldspecs=-flto -genericSTM32F103V.menu.opt.osstd=Smallest Code -genericSTM32F103V.menu.opt.osstd.build.flags.optimize=-Os -genericSTM32F103V.menu.opt.osstd.build.flags.ldspecs= -genericSTM32F103V.menu.opt.oslto=Smallest Code with LTO -genericSTM32F103V.menu.opt.oslto.build.flags.optimize=-Os -flto -genericSTM32F103V.menu.opt.oslto.build.flags.ldspecs=-flto ########################### Generic STM32F103Z ########################### @@ -752,36 +752,36 @@ genericSTM32F103Z.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103Z.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG #-- Optimizations -genericSTM32F103Z.menu.opt.o2std=Faster -genericSTM32F103Z.menu.opt.o2std.build.flags.optimize=-O2 -genericSTM32F103Z.menu.opt.o2std.build.flags.ldspecs= -genericSTM32F103Z.menu.opt.o2lto=Faster with LTO -genericSTM32F103Z.menu.opt.o2lto.build.flags.optimize=-O2 -flto -genericSTM32F103Z.menu.opt.o2lto.build.flags.ldspecs=-flto -genericSTM32F103Z.menu.opt.o1std=Fast +genericSTM32F103Z.menu.opt.osstd=Smallest (default) +genericSTM32F103Z.menu.opt.osstd.build.flags.optimize=-Os +genericSTM32F103Z.menu.opt.osstd.build.flags.ldspecs= +genericSTM32F103Z.menu.opt.oslto=Smallest Code with LTO +genericSTM32F103Z.menu.opt.oslto.build.flags.optimize=-Os -flto +genericSTM32F103Z.menu.opt.oslto.build.flags.ldspecs=-flto +genericSTM32F103Z.menu.opt.o1std=Fast (-O1) genericSTM32F103Z.menu.opt.o1std.build.flags.optimize=-O1 genericSTM32F103Z.menu.opt.o1std.build.flags.ldspecs= -genericSTM32F103Z.menu.opt.o1lto=Fast with LTO +genericSTM32F103Z.menu.opt.o1lto=Fast (-O1) with LTO genericSTM32F103Z.menu.opt.o1lto.build.flags.optimize=-O1 -flto genericSTM32F103Z.menu.opt.o1lto.build.flags.ldspecs=-flto -genericSTM32F103Z.menu.opt.o3std=Fastest +genericSTM32F103Z.menu.opt.o2std=Faster (-O2) +genericSTM32F103Z.menu.opt.o2std.build.flags.optimize=-O2 +genericSTM32F103Z.menu.opt.o2std.build.flags.ldspecs= +genericSTM32F103Z.menu.opt.o2lto=Faster (-O2) with LTO +genericSTM32F103Z.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericSTM32F103Z.menu.opt.o2lto.build.flags.ldspecs=-flto +genericSTM32F103Z.menu.opt.o3std=Fastest (-03) genericSTM32F103Z.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103Z.menu.opt.o3std.build.flags.ldspecs= -genericSTM32F103Z.menu.opt.o3lto=Fastest with LTO +genericSTM32F103Z.menu.opt.o3lto=Fastest (-0) with LTO genericSTM32F103Z.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericSTM32F103Z.menu.opt.ogstd=Debug (-g) genericSTM32F103Z.menu.opt.o3lto.build.flags.ldspecs=-flto -genericSTM32F103Z.menu.opt.ogstd=Debug genericSTM32F103Z.menu.opt.ogstd.build.flags.optimize=-Og genericSTM32F103Z.menu.opt.ogstd.build.flags.ldspecs= genericSTM32F103Z.menu.opt.oglto=Debug with LTO genericSTM32F103Z.menu.opt.oglto.build.flags.optimize=-Og -flto genericSTM32F103Z.menu.opt.oglto.build.flags.ldspecs=-flto -genericSTM32F103Z.menu.opt.osstd=Smallest Code -genericSTM32F103Z.menu.opt.osstd.build.flags.optimize=-Os -genericSTM32F103Z.menu.opt.osstd.build.flags.ldspecs= -genericSTM32F103Z.menu.opt.oslto=Smallest Code with LTO -genericSTM32F103Z.menu.opt.oslto.build.flags.optimize=-Os -flto -genericSTM32F103Z.menu.opt.oslto.build.flags.ldspecs=-flto ###################### HYTiny STM32F103T ######################################## @@ -835,36 +835,36 @@ hytiny-stm32f103t.menu.upload_method.jlinkMethod.upload.tool=jlink_upload hytiny-stm32f103t.menu.upload_method.jlinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER #-- Optimizations -hytiny-stm32f103t.menu.opt.o2std=Faster -hytiny-stm32f103t.menu.opt.o2std.build.flags.optimize=-O2 -hytiny-stm32f103t.menu.opt.o2std.build.flags.ldspecs= -hytiny-stm32f103t.menu.opt.o2lto=Faster with LTO -hytiny-stm32f103t.menu.opt.o2lto.build.flags.optimize=-O2 -flto -hytiny-stm32f103t.menu.opt.o2lto.build.flags.ldspecs=-flto -hytiny-stm32f103t.menu.opt.o1std=Fast +hytiny-stm32f103t.menu.opt.osstd=Smallest (default) +hytiny-stm32f103t.menu.opt.osstd.build.flags.optimize=-Os +hytiny-stm32f103t.menu.opt.osstd.build.flags.ldspecs= +hytiny-stm32f103t.menu.opt.oslto=Smallest Code with LTO +hytiny-stm32f103t.menu.opt.oslto.build.flags.optimize=-Os -flto +hytiny-stm32f103t.menu.opt.oslto.build.flags.ldspecs=-flto +hytiny-stm32f103t.menu.opt.o1std=Fast (-O1) hytiny-stm32f103t.menu.opt.o1std.build.flags.optimize=-O1 hytiny-stm32f103t.menu.opt.o1std.build.flags.ldspecs= -hytiny-stm32f103t.menu.opt.o1lto=Fast with LTO +hytiny-stm32f103t.menu.opt.o1lto=Fast (-O1) with LTO hytiny-stm32f103t.menu.opt.o1lto.build.flags.optimize=-O1 -flto hytiny-stm32f103t.menu.opt.o1lto.build.flags.ldspecs=-flto -hytiny-stm32f103t.menu.opt.o3std=Fastest +hytiny-stm32f103t.menu.opt.o2std=Faster (-O2) +hytiny-stm32f103t.menu.opt.o2std.build.flags.optimize=-O2 +hytiny-stm32f103t.menu.opt.o2std.build.flags.ldspecs= +hytiny-stm32f103t.menu.opt.o2lto=Faster (-O2) with LTO +hytiny-stm32f103t.menu.opt.o2lto.build.flags.optimize=-O2 -flto +hytiny-stm32f103t.menu.opt.o2lto.build.flags.ldspecs=-flto +hytiny-stm32f103t.menu.opt.o3std=Fastest (-03) hytiny-stm32f103t.menu.opt.o3std.build.flags.optimize=-O3 hytiny-stm32f103t.menu.opt.o3std.build.flags.ldspecs= -hytiny-stm32f103t.menu.opt.o3lto=Fastest with LTO +hytiny-stm32f103t.menu.opt.o3lto=Fastest (-0) with LTO hytiny-stm32f103t.menu.opt.o3lto.build.flags.optimize=-O3 -flto +hytiny-stm32f103t.menu.opt.ogstd=Debug (-g) hytiny-stm32f103t.menu.opt.o3lto.build.flags.ldspecs=-flto -hytiny-stm32f103t.menu.opt.ogstd=Debug hytiny-stm32f103t.menu.opt.ogstd.build.flags.optimize=-Og hytiny-stm32f103t.menu.opt.ogstd.build.flags.ldspecs= hytiny-stm32f103t.menu.opt.oglto=Debug with LTO hytiny-stm32f103t.menu.opt.oglto.build.flags.optimize=-Og -flto hytiny-stm32f103t.menu.opt.oglto.build.flags.ldspecs=-flto -hytiny-stm32f103t.menu.opt.osstd=Smallest Code -hytiny-stm32f103t.menu.opt.osstd.build.flags.optimize=-Os -hytiny-stm32f103t.menu.opt.osstd.build.flags.ldspecs= -hytiny-stm32f103t.menu.opt.oslto=Smallest Code with LTO -hytiny-stm32f103t.menu.opt.oslto.build.flags.optimize=-Os -flto -hytiny-stm32f103t.menu.opt.oslto.build.flags.ldspecs=-flto ###################### Generic GD32F103C ######################################## @@ -929,36 +929,36 @@ genericGD32F103C.menu.cpu_speed.speed_72mhz=72Mhz (compatibility) genericGD32F103C.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L #-- Optimizations -genericGD32F103C.menu.opt.o2std=Faster -genericGD32F103C.menu.opt.o2std.build.flags.optimize=-O2 -genericGD32F103C.menu.opt.o2std.build.flags.ldspecs= -genericGD32F103C.menu.opt.o2lto=Faster with LTO -genericGD32F103C.menu.opt.o2lto.build.flags.optimize=-O2 -flto -genericGD32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto -genericGD32F103C.menu.opt.o1std=Fast +genericGD32F103C.menu.opt.osstd=Smallest (default) +genericGD32F103C.menu.opt.osstd.build.flags.optimize=-Os +genericGD32F103C.menu.opt.osstd.build.flags.ldspecs= +genericGD32F103C.menu.opt.oslto=Smallest Code with LTO +genericGD32F103C.menu.opt.oslto.build.flags.optimize=-Os -flto +genericGD32F103C.menu.opt.oslto.build.flags.ldspecs=-flto +genericGD32F103C.menu.opt.o1std=Fast (-O1) genericGD32F103C.menu.opt.o1std.build.flags.optimize=-O1 genericGD32F103C.menu.opt.o1std.build.flags.ldspecs= -genericGD32F103C.menu.opt.o1lto=Fast with LTO +genericGD32F103C.menu.opt.o1lto=Fast (-O1) with LTO genericGD32F103C.menu.opt.o1lto.build.flags.optimize=-O1 -flto genericGD32F103C.menu.opt.o1lto.build.flags.ldspecs=-flto -genericGD32F103C.menu.opt.o3std=Fastest +genericGD32F103C.menu.opt.o2std=Faster (-O2) +genericGD32F103C.menu.opt.o2std.build.flags.optimize=-O2 +genericGD32F103C.menu.opt.o2std.build.flags.ldspecs= +genericGD32F103C.menu.opt.o2lto=Faster (-O2) with LTO +genericGD32F103C.menu.opt.o2lto.build.flags.optimize=-O2 -flto +genericGD32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto +genericGD32F103C.menu.opt.o3std=Fastest (-03) genericGD32F103C.menu.opt.o3std.build.flags.optimize=-O3 genericGD32F103C.menu.opt.o3std.build.flags.ldspecs= -genericGD32F103C.menu.opt.o3lto=Fastest with LTO +genericGD32F103C.menu.opt.o3lto=Fastest (-0) with LTO genericGD32F103C.menu.opt.o3lto.build.flags.optimize=-O3 -flto +genericGD32F103C.menu.opt.ogstd=Debug (-g) genericGD32F103C.menu.opt.o3lto.build.flags.ldspecs=-flto -genericGD32F103C.menu.opt.ogstd=Debug genericGD32F103C.menu.opt.ogstd.build.flags.optimize=-Og genericGD32F103C.menu.opt.ogstd.build.flags.ldspecs= genericGD32F103C.menu.opt.oglto=Debug with LTO genericGD32F103C.menu.opt.oglto.build.flags.optimize=-Og -flto genericGD32F103C.menu.opt.oglto.build.flags.ldspecs=-flto -genericGD32F103C.menu.opt.osstd=Smallest Code -genericGD32F103C.menu.opt.osstd.build.flags.optimize=-Os -genericGD32F103C.menu.opt.osstd.build.flags.ldspecs= -genericGD32F103C.menu.opt.oslto=Smallest Code with LTO -genericGD32F103C.menu.opt.oslto.build.flags.optimize=-Os -flto -genericGD32F103C.menu.opt.oslto.build.flags.ldspecs=-flto ########################### STM32VLD to FLASH ########################### @@ -989,35 +989,35 @@ STM32VLD.menu.upload_method.STLinkMethod.upload.tool=stlink_upload STM32VLD.menu.upload_method.STLinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG #-- Optimizations -STM32VLD.menu.opt.o2std=Faster -STM32VLD.menu.opt.o2std.build.flags.optimize=-O2 -STM32VLD.menu.opt.o2std.build.flags.ldspecs= -STM32VLD.menu.opt.o2lto=Faster with LTO -STM32VLD.menu.opt.o2lto.build.flags.optimize=-O2 -flto -STM32VLD.menu.opt.o2lto.build.flags.ldspecs=-flto -STM32VLD.menu.opt.o1std=Fast +STM32VLD.menu.opt.osstd=Smallest (default) +STM32VLD.menu.opt.osstd.build.flags.optimize=-Os +STM32VLD.menu.opt.osstd.build.flags.ldspecs= +STM32VLD.menu.opt.oslto=Smallest Code with LTO +STM32VLD.menu.opt.oslto.build.flags.optimize=-Os -flto +STM32VLD.menu.opt.oslto.build.flags.ldspecs=-flto +STM32VLD.menu.opt.o1std=Fast (-O1) STM32VLD.menu.opt.o1std.build.flags.optimize=-O1 STM32VLD.menu.opt.o1std.build.flags.ldspecs= -STM32VLD.menu.opt.o1lto=Fast with LTO +STM32VLD.menu.opt.o1lto=Fast (-O1) with LTO STM32VLD.menu.opt.o1lto.build.flags.optimize=-O1 -flto STM32VLD.menu.opt.o1lto.build.flags.ldspecs=-flto -STM32VLD.menu.opt.o3std=Fastest +STM32VLD.menu.opt.o2std=Faster (-O2) +STM32VLD.menu.opt.o2std.build.flags.optimize=-O2 +STM32VLD.menu.opt.o2std.build.flags.ldspecs= +STM32VLD.menu.opt.o2lto=Faster (-O2) with LTO +STM32VLD.menu.opt.o2lto.build.flags.optimize=-O2 -flto +STM32VLD.menu.opt.o2lto.build.flags.ldspecs=-flto +STM32VLD.menu.opt.o3std=Fastest (-03) STM32VLD.menu.opt.o3std.build.flags.optimize=-O3 STM32VLD.menu.opt.o3std.build.flags.ldspecs= -STM32VLD.menu.opt.o3lto=Fastest with LTO +STM32VLD.menu.opt.o3lto=Fastest (-0) with LTO STM32VLD.menu.opt.o3lto.build.flags.optimize=-O3 -flto +STM32VLD.menu.opt.ogstd=Debug (-g) STM32VLD.menu.opt.o3lto.build.flags.ldspecs=-flto -STM32VLD.menu.opt.ogstd=Debug STM32VLD.menu.opt.ogstd.build.flags.optimize=-Og STM32VLD.menu.opt.ogstd.build.flags.ldspecs= STM32VLD.menu.opt.oglto=Debug with LTO STM32VLD.menu.opt.oglto.build.flags.optimize=-Og -flto STM32VLD.menu.opt.oglto.build.flags.ldspecs=-flto -STM32VLD.menu.opt.osstd=Smallest Code -STM32VLD.menu.opt.osstd.build.flags.optimize=-Os -STM32VLD.menu.opt.osstd.build.flags.ldspecs= -STM32VLD.menu.opt.oslto=Smallest Code with LTO -STM32VLD.menu.opt.oslto.build.flags.optimize=-Os -flto -STM32VLD.menu.opt.oslto.build.flags.ldspecs=-flto ################################################################################ \ No newline at end of file diff --git a/STM32F3/boards.txt b/STM32F3/boards.txt index d3a37353e..6c011bce3 100644 --- a/STM32F3/boards.txt +++ b/STM32F3/boards.txt @@ -1,7 +1,5 @@ # -menu.opt=Optimize - ############################################################## discovery_f3.name=STM32F3Discovery @@ -30,37 +28,5 @@ discovery_f3.build.error_led_port=GPIOE discovery_f3.build.error_led_pin=8 discovery_f3.build.board=STM32F3Discovery -#-- Optimizations -discovery_f3.menu.opt.o2std=Faster -discovery_f3.menu.opt.o2std.build.flags.optimize=-O2 -discovery_f3.menu.opt.o2std.build.flags.ldspecs= -discovery_f3.menu.opt.o2lto=Faster with LTO -discovery_f3.menu.opt.o2lto.build.flags.optimize=-O2 -flto -discovery_f3.menu.opt.o2lto.build.flags.ldspecs=-flto -discovery_f3.menu.opt.o1std=Fast -discovery_f3.menu.opt.o1std.build.flags.optimize=-O1 -discovery_f3.menu.opt.o1std.build.flags.ldspecs= -discovery_f3.menu.opt.o1lto=Fast with LTO -discovery_f3.menu.opt.o1lto.build.flags.optimize=-O1 -flto -discovery_f3.menu.opt.o1lto.build.flags.ldspecs=-flto -discovery_f3.menu.opt.o3std=Fastest -discovery_f3.menu.opt.o3std.build.flags.optimize=-O3 -discovery_f3.menu.opt.o3std.build.flags.ldspecs= -discovery_f3.menu.opt.o3lto=Fastest with LTO -discovery_f3.menu.opt.o3lto.build.flags.optimize=-O3 -flto -discovery_f3.menu.opt.o3lto.build.flags.ldspecs=-flto -discovery_f3.menu.opt.ogstd=Debug -discovery_f3.menu.opt.ogstd.build.flags.optimize=-Og -discovery_f3.menu.opt.ogstd.build.flags.ldspecs= -discovery_f3.menu.opt.oglto=Debug with LTO -discovery_f3.menu.opt.oglto.build.flags.optimize=-Og -flto -discovery_f3.menu.opt.oglto.build.flags.ldspecs=-flto -discovery_f3.menu.opt.osstd=Smallest Code -discovery_f3.menu.opt.osstd.build.flags.optimize=-Os -discovery_f3.menu.opt.osstd.build.flags.ldspecs= -discovery_f3.menu.opt.oslto=Smallest Code with LTO -discovery_f3.menu.opt.oslto.build.flags.optimize=-Os -flto -discovery_f3.menu.opt.oslto.build.flags.ldspecs=-flto - ############################################################## diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index 429ba4b96..baf6f6e03 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -1,7 +1,6 @@ # menu.usb_cfg=USB configuration -menu.opt=Optimize ############################################################## discovery_f407.name=STM32 Discovery F407 @@ -37,39 +36,6 @@ discovery_f407.menu.usb_cfg.usb_serial=USB serial (CDC) discovery_f407.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB discovery_f407.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) discovery_f407.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC - -#-- Optimizations -discovery_f407.menu.opt.o2std=Faster -discovery_f407.menu.opt.o2std.build.flags.optimize=-O2 -discovery_f407.menu.opt.o2std.build.flags.ldspecs= -discovery_f407.menu.opt.o2lto=Faster with LTO -discovery_f407.menu.opt.o2lto.build.flags.optimize=-O2 -flto -discovery_f407.menu.opt.o2lto.build.flags.ldspecs=-flto -discovery_f407.menu.opt.o1std=Fast -discovery_f407.menu.opt.o1std.build.flags.optimize=-O1 -discovery_f407.menu.opt.o1std.build.flags.ldspecs= -discovery_f407.menu.opt.o1lto=Fast with LTO -discovery_f407.menu.opt.o1lto.build.flags.optimize=-O1 -flto -discovery_f407.menu.opt.o1lto.build.flags.ldspecs=-flto -discovery_f407.menu.opt.o3std=Fastest -discovery_f407.menu.opt.o3std.build.flags.optimize=-O3 -discovery_f407.menu.opt.o3std.build.flags.ldspecs= -discovery_f407.menu.opt.o3lto=Fastest with LTO -discovery_f407.menu.opt.o3lto.build.flags.optimize=-O3 -flto -discovery_f407.menu.opt.o3lto.build.flags.ldspecs=-flto -discovery_f407.menu.opt.ogstd=Debug -discovery_f407.menu.opt.ogstd.build.flags.optimize=-Og -discovery_f407.menu.opt.ogstd.build.flags.ldspecs= -discovery_f407.menu.opt.oglto=Debug with LTO -discovery_f407.menu.opt.oglto.build.flags.optimize=-Og -flto -discovery_f407.menu.opt.oglto.build.flags.ldspecs=-flto -discovery_f407.menu.opt.osstd=Smallest Code -discovery_f407.menu.opt.osstd.build.flags.optimize=-Os -discovery_f407.menu.opt.osstd.build.flags.ldspecs= -discovery_f407.menu.opt.oslto=Smallest Code with LTO -discovery_f407.menu.opt.oslto.build.flags.optimize=-Os -flto -discovery_f407.menu.opt.oslto.build.flags.ldspecs=-flto - ############################################################## generic_f407v.name=Generic STM32F407V series @@ -106,38 +72,6 @@ generic_f407v.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB generic_f407v.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) generic_f407v.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC -#-- Optimizations -generic_f407v.menu.opt.o2std=Faster -generic_f407v.menu.opt.o2std.build.flags.optimize=-O2 -generic_f407v.menu.opt.o2std.build.flags.ldspecs= -generic_f407v.menu.opt.o2lto=Faster with LTO -generic_f407v.menu.opt.o2lto.build.flags.optimize=-O2 -flto -generic_f407v.menu.opt.o2lto.build.flags.ldspecs=-flto -generic_f407v.menu.opt.o1std=Fast -generic_f407v.menu.opt.o1std.build.flags.optimize=-O1 -generic_f407v.menu.opt.o1std.build.flags.ldspecs= -generic_f407v.menu.opt.o1lto=Fast with LTO -generic_f407v.menu.opt.o1lto.build.flags.optimize=-O1 -flto -generic_f407v.menu.opt.o1lto.build.flags.ldspecs=-flto -generic_f407v.menu.opt.o3std=Fastest -generic_f407v.menu.opt.o3std.build.flags.optimize=-O3 -generic_f407v.menu.opt.o3std.build.flags.ldspecs= -generic_f407v.menu.opt.o3lto=Fastest with LTO -generic_f407v.menu.opt.o3lto.build.flags.optimize=-O3 -flto -generic_f407v.menu.opt.o3lto.build.flags.ldspecs=-flto -generic_f407v.menu.opt.ogstd=Debug -generic_f407v.menu.opt.ogstd.build.flags.optimize=-Og -generic_f407v.menu.opt.ogstd.build.flags.ldspecs= -generic_f407v.menu.opt.oglto=Debug with LTO -generic_f407v.menu.opt.oglto.build.flags.optimize=-Og -flto -generic_f407v.menu.opt.oglto.build.flags.ldspecs=-flto -generic_f407v.menu.opt.osstd=Smallest Code -generic_f407v.menu.opt.osstd.build.flags.optimize=-Os -generic_f407v.menu.opt.osstd.build.flags.ldspecs= -generic_f407v.menu.opt.oslto=Smallest Code with LTO -generic_f407v.menu.opt.oslto.build.flags.optimize=-Os -flto -generic_f407v.menu.opt.oslto.build.flags.ldspecs=-flto - ############################################################## stm32f4stamp.name=STM32F4Stamp F405 @@ -173,39 +107,6 @@ stm32f4stamp.menu.usb_cfg.usb_serial=USB serial (CDC) stm32f4stamp.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB stm32f4stamp.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) stm32f4stamp.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC - -#-- Optimizations -stm32f4stamp.menu.opt.o2std=Faster -stm32f4stamp.menu.opt.o2std.build.flags.optimize=-O2 -stm32f4stamp.menu.opt.o2std.build.flags.ldspecs= -stm32f4stamp.menu.opt.o2lto=Faster with LTO -stm32f4stamp.menu.opt.o2lto.build.flags.optimize=-O2 -flto -stm32f4stamp.menu.opt.o2lto.build.flags.ldspecs=-flto -stm32f4stamp.menu.opt.o1std=Fast -stm32f4stamp.menu.opt.o1std.build.flags.optimize=-O1 -stm32f4stamp.menu.opt.o1std.build.flags.ldspecs= -stm32f4stamp.menu.opt.o1lto=Fast with LTO -stm32f4stamp.menu.opt.o1lto.build.flags.optimize=-O1 -flto -stm32f4stamp.menu.opt.o1lto.build.flags.ldspecs=-flto -stm32f4stamp.menu.opt.o3std=Fastest -stm32f4stamp.menu.opt.o3std.build.flags.optimize=-O3 -stm32f4stamp.menu.opt.o3std.build.flags.ldspecs= -stm32f4stamp.menu.opt.o3lto=Fastest with LTO -stm32f4stamp.menu.opt.o3lto.build.flags.optimize=-O3 -flto -stm32f4stamp.menu.opt.o3lto.build.flags.ldspecs=-flto -stm32f4stamp.menu.opt.ogstd=Debug -stm32f4stamp.menu.opt.ogstd.build.flags.optimize=-Og -stm32f4stamp.menu.opt.ogstd.build.flags.ldspecs= -stm32f4stamp.menu.opt.oglto=Debug with LTO -stm32f4stamp.menu.opt.oglto.build.flags.optimize=-Og -flto -stm32f4stamp.menu.opt.oglto.build.flags.ldspecs=-flto -stm32f4stamp.menu.opt.osstd=Smallest Code -stm32f4stamp.menu.opt.osstd.build.flags.optimize=-Os -stm32f4stamp.menu.opt.osstd.build.flags.ldspecs= -stm32f4stamp.menu.opt.oslto=Smallest Code with LTO -stm32f4stamp.menu.opt.oslto.build.flags.optimize=-Os -flto -stm32f4stamp.menu.opt.oslto.build.flags.ldspecs=-flto - ############################################################## netduino2plus.name=Netduino2 F405 @@ -241,37 +142,5 @@ netduino2plus.menu.usb_cfg.usb_serial=USB serial (CDC) netduino2plus.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB netduino2plus.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) netduino2plus.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC - -#-- Optimizations -netduino2plus.menu.opt.o2std=Faster -netduino2plus.menu.opt.o2std.build.flags.optimize=-O2 -netduino2plus.menu.opt.o2std.build.flags.ldspecs= -netduino2plus.menu.opt.o2lto=Faster with LTO -netduino2plus.menu.opt.o2lto.build.flags.optimize=-O2 -flto -netduino2plus.menu.opt.o2lto.build.flags.ldspecs=-flto -netduino2plus.menu.opt.o1std=Fast -netduino2plus.menu.opt.o1std.build.flags.optimize=-O1 -netduino2plus.menu.opt.o1std.build.flags.ldspecs= -netduino2plus.menu.opt.o1lto=Fast with LTO -netduino2plus.menu.opt.o1lto.build.flags.optimize=-O1 -flto -netduino2plus.menu.opt.o1lto.build.flags.ldspecs=-flto -netduino2plus.menu.opt.o3std=Fastest -netduino2plus.menu.opt.o3std.build.flags.optimize=-O3 -netduino2plus.menu.opt.o3std.build.flags.ldspecs= -netduino2plus.menu.opt.o3lto=Fastest with LTO -netduino2plus.menu.opt.o3lto.build.flags.optimize=-O3 -flto -netduino2plus.menu.opt.o3lto.build.flags.ldspecs=-flto -netduino2plus.menu.opt.ogstd=Debug -netduino2plus.menu.opt.ogstd.build.flags.optimize=-Og -netduino2plus.menu.opt.ogstd.build.flags.ldspecs= -netduino2plus.menu.opt.oglto=Debug with LTO -netduino2plus.menu.opt.oglto.build.flags.optimize=-Og -flto -netduino2plus.menu.opt.oglto.build.flags.ldspecs=-flto -netduino2plus.menu.opt.osstd=Smallest Code -netduino2plus.menu.opt.osstd.build.flags.optimize=-Os -netduino2plus.menu.opt.osstd.build.flags.ldspecs= -netduino2plus.menu.opt.oslto=Smallest Code with LTO -netduino2plus.menu.opt.oslto.build.flags.optimize=-Os -flto -netduino2plus.menu.opt.oslto.build.flags.ldspecs=-flto - ############################################################## + From a683dfccca19bbe84322c7b56152961e0f59cb0c Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 30 Jul 2017 16:16:24 +1000 Subject: [PATCH 153/307] revert changes to STM32F3/platform.txt and STM32F4/platform.txt as they should not have been changed in the previous commit --- STM32F3/platform.txt | 8 ++++---- STM32F4/platform.txt | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/STM32F3/platform.txt b/STM32F3/platform.txt index 94f787c81..3218f85c1 100644 --- a/STM32F3/platform.txt +++ b/STM32F3/platform.txt @@ -12,20 +12,20 @@ version=0.1.0 compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g {build.flags.optimize} -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ -compiler.c.elf.flags={build.flags.optimize} -Wl,--gc-sections {build.flags.ldspecs} +compiler.c.elf.flags=-Os -Wl,--gc-sections compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g {build.flags.optimize} -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 compiler.elf2hex.flags=-O binary compiler.elf2hex.cmd=arm-none-eabi-objcopy -compiler.ldflags={build.flags.ldspecs} +compiler.ldflags= compiler.size.cmd=arm-none-eabi-size compiler.define=-DARDUINO= diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index 92dc1ea9a..b64fe3eee 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -10,20 +10,20 @@ version=0.1.0 # ---------------------- compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g {build.flags.optimize} -Wall -MMD -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g -Os -Wall -MMD -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ -compiler.c.elf.flags={build.flags.optimize} -Wl,--gc-sections {build.flags.ldspecs} +compiler.c.elf.flags=-Os -Wl,--gc-sections compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g {build.flags.optimize} -Wall -MMD -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g -Os -Wall -MMD -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 compiler.elf2hex.flags=-O binary compiler.elf2hex.cmd=arm-none-eabi-objcopy -compiler.ldflags={build.flags.ldspecs} +compiler.ldflags= compiler.size.cmd=arm-none-eabi-size compiler.define=-DARDUINO= From 86d823a3b5f80121e3f5b51f653b7bf83de2a668 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 30 Jul 2017 16:21:26 +1000 Subject: [PATCH 154/307] Fixed typo in optimisation menu --- STM32F1/boards.txt | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index fe18609e1..3ed5158c2 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -66,7 +66,7 @@ mapleMini.menu.opt.o2lto.build.flags.ldspecs=-flto mapleMini.menu.opt.o3std=Fastest (-03) mapleMini.menu.opt.o3std.build.flags.optimize=-O3 mapleMini.menu.opt.o3std.build.flags.ldspecs= -mapleMini.menu.opt.o3lto=Fastest (-0) with LTO +mapleMini.menu.opt.o3lto=Fastest (-O3) with LTO mapleMini.menu.opt.o3lto.build.flags.optimize=-O3 -flto mapleMini.menu.opt.o3lto.build.flags.ldspecs=-flto mapleMini.menu.opt.ogstd=Debug (-g) @@ -121,7 +121,7 @@ maple.menu.opt.o2lto.build.flags.ldspecs=-flto maple.menu.opt.o3std=Fastest (-03) maple.menu.opt.o3std.build.flags.optimize=-O3 maple.menu.opt.o3std.build.flags.ldspecs= -maple.menu.opt.o3lto=Fastest (-0) with LTO +maple.menu.opt.o3lto=Fastest (-O3) with LTO maple.menu.opt.o3lto.build.flags.optimize=-O3 -flto maple.menu.opt.o3lto.build.flags.ldspecs=-flto maple.menu.opt.ogstd=Debug (-g) @@ -176,7 +176,7 @@ mapleRET6.menu.opt.o2lto.build.flags.ldspecs=-flto mapleRET6.menu.opt.o3std=Fastest (-03) mapleRET6.menu.opt.o3std.build.flags.optimize=-O3 mapleRET6.menu.opt.o3std.build.flags.ldspecs= -mapleRET6.menu.opt.o3lto=Fastest (-0) with LTO +mapleRET6.menu.opt.o3lto=Fastest (-O3) with LTO mapleRET6.menu.opt.o3lto.build.flags.optimize=-O3 -flto mapleRET6.menu.opt.ogstd=Debug (-g) mapleRET6.menu.opt.o3lto.build.flags.ldspecs=-flto @@ -239,7 +239,7 @@ microduino32_flash.menu.opt.o2lto.build.flags.ldspecs=-flto microduino32_flash.menu.opt.o3std=Fastest (-03) microduino32_flash.menu.opt.o3std.build.flags.optimize=-O3 microduino32_flash.menu.opt.o3std.build.flags.ldspecs= -microduino32_flash.menu.opt.o3lto=Fastest (-0) with LTO +microduino32_flash.menu.opt.o3lto=Fastest (-O3) with LTO microduino32_flash.menu.opt.o3lto.build.flags.optimize=-O3 -flto microduino32_flash.menu.opt.ogstd=Debug (-g) microduino32_flash.menu.opt.o3lto.build.flags.ldspecs=-flto @@ -309,7 +309,7 @@ nucleo_f103rb.menu.opt.o2lto.build.flags.ldspecs=-flto nucleo_f103rb.menu.opt.o3std=Fastest (-03) nucleo_f103rb.menu.opt.o3std.build.flags.optimize=-O3 nucleo_f103rb.menu.opt.o3std.build.flags.ldspecs= -nucleo_f103rb.menu.opt.o3lto=Fastest (-0) with LTO +nucleo_f103rb.menu.opt.o3lto=Fastest (-O3) with LTO nucleo_f103rb.menu.opt.o3lto.build.flags.optimize=-O3 -flto nucleo_f103rb.menu.opt.ogstd=Debug (-g) nucleo_f103rb.menu.opt.o3lto.build.flags.ldspecs=-flto @@ -406,7 +406,7 @@ genericSTM32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto genericSTM32F103C.menu.opt.o3std=Fastest (-03) genericSTM32F103C.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103C.menu.opt.o3std.build.flags.ldspecs= -genericSTM32F103C.menu.opt.o3lto=Fastest (-0) with LTO +genericSTM32F103C.menu.opt.o3lto=Fastest (-O3) with LTO genericSTM32F103C.menu.opt.o3lto.build.flags.optimize=-O3 -flto genericSTM32F103C.menu.opt.ogstd=Debug (-g) genericSTM32F103C.menu.opt.o3lto.build.flags.ldspecs=-flto @@ -507,7 +507,7 @@ genericSTM32F103R.menu.opt.o2lto.build.flags.ldspecs=-flto genericSTM32F103R.menu.opt.o3std=Fastest (-03) genericSTM32F103R.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103R.menu.opt.o3std.build.flags.ldspecs= -genericSTM32F103R.menu.opt.o3lto=Fastest (-0) with LTO +genericSTM32F103R.menu.opt.o3lto=Fastest (-O3) with LTO genericSTM32F103R.menu.opt.o3lto.build.flags.optimize=-O3 -flto genericSTM32F103R.menu.opt.ogstd=Debug (-g) genericSTM32F103R.menu.opt.o3lto.build.flags.ldspecs=-flto @@ -592,7 +592,7 @@ genericSTM32F103T.menu.opt.o2lto.build.flags.ldspecs=-flto genericSTM32F103T.menu.opt.o3std=Fastest (-03) genericSTM32F103T.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103T.menu.opt.o3std.build.flags.ldspecs= -genericSTM32F103T.menu.opt.o3lto=Fastest (-0) with LTO +genericSTM32F103T.menu.opt.o3lto=Fastest (-O3) with LTO genericSTM32F103T.menu.opt.o3lto.build.flags.optimize=-O3 -flto genericSTM32F103T.menu.opt.ogstd=Debug (-g) genericSTM32F103T.menu.opt.o3lto.build.flags.ldspecs=-flto @@ -684,7 +684,7 @@ genericSTM32F103V.menu.opt.o2lto.build.flags.ldspecs=-flto genericSTM32F103V.menu.opt.o3std=Fastest (-03) genericSTM32F103V.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103V.menu.opt.o3std.build.flags.ldspecs= -genericSTM32F103V.menu.opt.o3lto=Fastest (-0) with LTO +genericSTM32F103V.menu.opt.o3lto=Fastest (-O3) with LTO genericSTM32F103V.menu.opt.o3lto.build.flags.optimize=-O3 -flto genericSTM32F103V.menu.opt.ogstd=Debug (-g) genericSTM32F103V.menu.opt.o3lto.build.flags.ldspecs=-flto @@ -773,7 +773,7 @@ genericSTM32F103Z.menu.opt.o2lto.build.flags.ldspecs=-flto genericSTM32F103Z.menu.opt.o3std=Fastest (-03) genericSTM32F103Z.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103Z.menu.opt.o3std.build.flags.ldspecs= -genericSTM32F103Z.menu.opt.o3lto=Fastest (-0) with LTO +genericSTM32F103Z.menu.opt.o3lto=Fastest (-O3) with LTO genericSTM32F103Z.menu.opt.o3lto.build.flags.optimize=-O3 -flto genericSTM32F103Z.menu.opt.ogstd=Debug (-g) genericSTM32F103Z.menu.opt.o3lto.build.flags.ldspecs=-flto @@ -856,7 +856,7 @@ hytiny-stm32f103t.menu.opt.o2lto.build.flags.ldspecs=-flto hytiny-stm32f103t.menu.opt.o3std=Fastest (-03) hytiny-stm32f103t.menu.opt.o3std.build.flags.optimize=-O3 hytiny-stm32f103t.menu.opt.o3std.build.flags.ldspecs= -hytiny-stm32f103t.menu.opt.o3lto=Fastest (-0) with LTO +hytiny-stm32f103t.menu.opt.o3lto=Fastest (-O3) with LTO hytiny-stm32f103t.menu.opt.o3lto.build.flags.optimize=-O3 -flto hytiny-stm32f103t.menu.opt.ogstd=Debug (-g) hytiny-stm32f103t.menu.opt.o3lto.build.flags.ldspecs=-flto @@ -950,7 +950,7 @@ genericGD32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto genericGD32F103C.menu.opt.o3std=Fastest (-03) genericGD32F103C.menu.opt.o3std.build.flags.optimize=-O3 genericGD32F103C.menu.opt.o3std.build.flags.ldspecs= -genericGD32F103C.menu.opt.o3lto=Fastest (-0) with LTO +genericGD32F103C.menu.opt.o3lto=Fastest (-O3) with LTO genericGD32F103C.menu.opt.o3lto.build.flags.optimize=-O3 -flto genericGD32F103C.menu.opt.ogstd=Debug (-g) genericGD32F103C.menu.opt.o3lto.build.flags.ldspecs=-flto @@ -1010,7 +1010,7 @@ STM32VLD.menu.opt.o2lto.build.flags.ldspecs=-flto STM32VLD.menu.opt.o3std=Fastest (-03) STM32VLD.menu.opt.o3std.build.flags.optimize=-O3 STM32VLD.menu.opt.o3std.build.flags.ldspecs= -STM32VLD.menu.opt.o3lto=Fastest (-0) with LTO +STM32VLD.menu.opt.o3lto=Fastest (-O3) with LTO STM32VLD.menu.opt.o3lto.build.flags.optimize=-O3 -flto STM32VLD.menu.opt.ogstd=Debug (-g) STM32VLD.menu.opt.o3lto.build.flags.ldspecs=-flto From 7aae010eae645972e8bab22ff2a5c69a4a205407 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 30 Jul 2017 17:05:57 +1000 Subject: [PATCH 155/307] Fixed yet another of my typos in the optimisation menu --- STM32F1/boards.txt | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 3ed5158c2..c80bda9ac 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -63,7 +63,7 @@ mapleMini.menu.opt.o2std.build.flags.ldspecs= mapleMini.menu.opt.o2lto=Faster (-O2) with LTO mapleMini.menu.opt.o2lto.build.flags.optimize=-O2 -flto mapleMini.menu.opt.o2lto.build.flags.ldspecs=-flto -mapleMini.menu.opt.o3std=Fastest (-03) +mapleMini.menu.opt.o3std=Fastest (-O3) mapleMini.menu.opt.o3std.build.flags.optimize=-O3 mapleMini.menu.opt.o3std.build.flags.ldspecs= mapleMini.menu.opt.o3lto=Fastest (-O3) with LTO @@ -118,7 +118,7 @@ maple.menu.opt.o2std.build.flags.ldspecs= maple.menu.opt.o2lto=Faster (-O2) with LTO maple.menu.opt.o2lto.build.flags.optimize=-O2 -flto maple.menu.opt.o2lto.build.flags.ldspecs=-flto -maple.menu.opt.o3std=Fastest (-03) +maple.menu.opt.o3std=Fastest (-O3) maple.menu.opt.o3std.build.flags.optimize=-O3 maple.menu.opt.o3std.build.flags.ldspecs= maple.menu.opt.o3lto=Fastest (-O3) with LTO @@ -173,7 +173,7 @@ mapleRET6.menu.opt.o2std.build.flags.ldspecs= mapleRET6.menu.opt.o2lto=Faster (-O2) with LTO mapleRET6.menu.opt.o2lto.build.flags.optimize=-O2 -flto mapleRET6.menu.opt.o2lto.build.flags.ldspecs=-flto -mapleRET6.menu.opt.o3std=Fastest (-03) +mapleRET6.menu.opt.o3std=Fastest (-O3) mapleRET6.menu.opt.o3std.build.flags.optimize=-O3 mapleRET6.menu.opt.o3std.build.flags.ldspecs= mapleRET6.menu.opt.o3lto=Fastest (-O3) with LTO @@ -236,7 +236,7 @@ microduino32_flash.menu.opt.o2std.build.flags.ldspecs= microduino32_flash.menu.opt.o2lto=Faster (-O2) with LTO microduino32_flash.menu.opt.o2lto.build.flags.optimize=-O2 -flto microduino32_flash.menu.opt.o2lto.build.flags.ldspecs=-flto -microduino32_flash.menu.opt.o3std=Fastest (-03) +microduino32_flash.menu.opt.o3std=Fastest (-O3) microduino32_flash.menu.opt.o3std.build.flags.optimize=-O3 microduino32_flash.menu.opt.o3std.build.flags.ldspecs= microduino32_flash.menu.opt.o3lto=Fastest (-O3) with LTO @@ -306,7 +306,7 @@ nucleo_f103rb.menu.opt.o2std.build.flags.ldspecs= nucleo_f103rb.menu.opt.o2lto=Faster (-O2) with LTO nucleo_f103rb.menu.opt.o2lto.build.flags.optimize=-O2 -flto nucleo_f103rb.menu.opt.o2lto.build.flags.ldspecs=-flto -nucleo_f103rb.menu.opt.o3std=Fastest (-03) +nucleo_f103rb.menu.opt.o3std=Fastest (-O3) nucleo_f103rb.menu.opt.o3std.build.flags.optimize=-O3 nucleo_f103rb.menu.opt.o3std.build.flags.ldspecs= nucleo_f103rb.menu.opt.o3lto=Fastest (-O3) with LTO @@ -403,7 +403,7 @@ genericSTM32F103C.menu.opt.o2std.build.flags.ldspecs= genericSTM32F103C.menu.opt.o2lto=Faster (-O2) with LTO genericSTM32F103C.menu.opt.o2lto.build.flags.optimize=-O2 -flto genericSTM32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto -genericSTM32F103C.menu.opt.o3std=Fastest (-03) +genericSTM32F103C.menu.opt.o3std=Fastest (-O3) genericSTM32F103C.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103C.menu.opt.o3std.build.flags.ldspecs= genericSTM32F103C.menu.opt.o3lto=Fastest (-O3) with LTO @@ -504,7 +504,7 @@ genericSTM32F103R.menu.opt.o2std.build.flags.ldspecs= genericSTM32F103R.menu.opt.o2lto=Faster (-O2) with LTO genericSTM32F103R.menu.opt.o2lto.build.flags.optimize=-O2 -flto genericSTM32F103R.menu.opt.o2lto.build.flags.ldspecs=-flto -genericSTM32F103R.menu.opt.o3std=Fastest (-03) +genericSTM32F103R.menu.opt.o3std=Fastest (-O3) genericSTM32F103R.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103R.menu.opt.o3std.build.flags.ldspecs= genericSTM32F103R.menu.opt.o3lto=Fastest (-O3) with LTO @@ -589,7 +589,7 @@ genericSTM32F103T.menu.opt.o2std.build.flags.ldspecs= genericSTM32F103T.menu.opt.o2lto=Faster (-O2) with LTO genericSTM32F103T.menu.opt.o2lto.build.flags.optimize=-O2 -flto genericSTM32F103T.menu.opt.o2lto.build.flags.ldspecs=-flto -genericSTM32F103T.menu.opt.o3std=Fastest (-03) +genericSTM32F103T.menu.opt.o3std=Fastest (-O3) genericSTM32F103T.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103T.menu.opt.o3std.build.flags.ldspecs= genericSTM32F103T.menu.opt.o3lto=Fastest (-O3) with LTO @@ -681,7 +681,7 @@ genericSTM32F103V.menu.opt.o2std.build.flags.ldspecs= genericSTM32F103V.menu.opt.o2lto=Faster (-O2) with LTO genericSTM32F103V.menu.opt.o2lto.build.flags.optimize=-O2 -flto genericSTM32F103V.menu.opt.o2lto.build.flags.ldspecs=-flto -genericSTM32F103V.menu.opt.o3std=Fastest (-03) +genericSTM32F103V.menu.opt.o3std=Fastest (-O3) genericSTM32F103V.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103V.menu.opt.o3std.build.flags.ldspecs= genericSTM32F103V.menu.opt.o3lto=Fastest (-O3) with LTO @@ -770,7 +770,7 @@ genericSTM32F103Z.menu.opt.o2std.build.flags.ldspecs= genericSTM32F103Z.menu.opt.o2lto=Faster (-O2) with LTO genericSTM32F103Z.menu.opt.o2lto.build.flags.optimize=-O2 -flto genericSTM32F103Z.menu.opt.o2lto.build.flags.ldspecs=-flto -genericSTM32F103Z.menu.opt.o3std=Fastest (-03) +genericSTM32F103Z.menu.opt.o3std=Fastest (-O3) genericSTM32F103Z.menu.opt.o3std.build.flags.optimize=-O3 genericSTM32F103Z.menu.opt.o3std.build.flags.ldspecs= genericSTM32F103Z.menu.opt.o3lto=Fastest (-O3) with LTO @@ -853,7 +853,7 @@ hytiny-stm32f103t.menu.opt.o2std.build.flags.ldspecs= hytiny-stm32f103t.menu.opt.o2lto=Faster (-O2) with LTO hytiny-stm32f103t.menu.opt.o2lto.build.flags.optimize=-O2 -flto hytiny-stm32f103t.menu.opt.o2lto.build.flags.ldspecs=-flto -hytiny-stm32f103t.menu.opt.o3std=Fastest (-03) +hytiny-stm32f103t.menu.opt.o3std=Fastest (-O3) hytiny-stm32f103t.menu.opt.o3std.build.flags.optimize=-O3 hytiny-stm32f103t.menu.opt.o3std.build.flags.ldspecs= hytiny-stm32f103t.menu.opt.o3lto=Fastest (-O3) with LTO @@ -947,7 +947,7 @@ genericGD32F103C.menu.opt.o2std.build.flags.ldspecs= genericGD32F103C.menu.opt.o2lto=Faster (-O2) with LTO genericGD32F103C.menu.opt.o2lto.build.flags.optimize=-O2 -flto genericGD32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto -genericGD32F103C.menu.opt.o3std=Fastest (-03) +genericGD32F103C.menu.opt.o3std=Fastest (-O3) genericGD32F103C.menu.opt.o3std.build.flags.optimize=-O3 genericGD32F103C.menu.opt.o3std.build.flags.ldspecs= genericGD32F103C.menu.opt.o3lto=Fastest (-O3) with LTO @@ -1007,7 +1007,7 @@ STM32VLD.menu.opt.o2std.build.flags.ldspecs= STM32VLD.menu.opt.o2lto=Faster (-O2) with LTO STM32VLD.menu.opt.o2lto.build.flags.optimize=-O2 -flto STM32VLD.menu.opt.o2lto.build.flags.ldspecs=-flto -STM32VLD.menu.opt.o3std=Fastest (-03) +STM32VLD.menu.opt.o3std=Fastest (-O3) STM32VLD.menu.opt.o3std.build.flags.optimize=-O3 STM32VLD.menu.opt.o3std.build.flags.ldspecs= STM32VLD.menu.opt.o3lto=Fastest (-O3) with LTO From cb901b4e4f8c8630bf570ffbf30a4ca46cbcb840 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 30 Jul 2017 17:43:40 +1000 Subject: [PATCH 156/307] Added CPU Speed menu to all boards except Nucleo RB, with additional entry for 128Mhz Turbo - NO USB. Note only tested on the Blue Pill --- STM32F1/boards.txt | 105 ++++++++++++++++++ .../wirish/boards_setup.cpp | 12 +- .../wirish/boards_setup.cpp | 12 +- .../wirish/boards_setup.cpp | 12 +- .../wirish/boards_setup.cpp | 12 +- .../wirish/boards_setup.cpp | 12 +- .../wirish/boards_setup.cpp | 12 +- .../hytiny_stm32f103t/wirish/boards_setup.cpp | 12 +- .../variants/maple/wirish/boards_setup.cpp | 12 +- .../maple_mini/wirish/boards_setup.cpp | 12 +- .../maple_ret6/wirish/boards_setup.cpp | 12 +- .../microduino/wirish/boards_setup.cpp | 12 +- 12 files changed, 182 insertions(+), 55 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index c80bda9ac..adb200625 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -44,6 +44,16 @@ mapleMini.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L mapleMini.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) mapleMini.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L +#-- CPU Clock frequency +mapleMini.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +mapleMini.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +mapleMini.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +mapleMini.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + +mapleMini.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +mapleMini.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + #-- Optimizations mapleMini.menu.opt.osstd=Smallest (default) mapleMini.menu.opt.osstd.build.flags.optimize=-Os @@ -99,6 +109,16 @@ maple.build.ldscript=ld/flash.ld maple.build.variant=maple maple.build.vect=VECT_TAB_ADDR=0x8005000 +#-- CPU Clock frequency +maple.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +maple.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +maple.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +maple.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + +maple.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +maple.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + #-- Optimizations maple.menu.opt.osstd=Smallest (default) maple.menu.opt.osstd.build.flags.optimize=-Os @@ -154,6 +174,17 @@ mapleRET6.upload.usbID=1EAF:0003 mapleRET6.upload.altID=1 mapleRET6.upload.auto_reset=true +#-- CPU Clock frequency +mapleRET6.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +mapleRET6.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +mapleRET6.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +mapleRET6.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + +mapleRET6.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +mapleRET6.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + + #-- Optimizations mapleRET6.menu.opt.osstd=Smallest (default) mapleRET6.menu.opt.osstd.build.flags.optimize=-Os @@ -217,6 +248,16 @@ microduino32_flash.build.error_led_port=GPIOB microduino32_flash.build.error_led_pin=1 microduino32_flash.build.gcc_ver=gcc-arm-none-eabi-4.8.3-2014q1 +#-- CPU Clock frequency +microduino32_flash.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +microduino32_flash.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +microduino32_flash.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +microduino32_flash.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + +microduino32_flash.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +microduino32_flash.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + #-- Optimizations microduino32_flash.menu.opt.osstd=Smallest (default) microduino32_flash.menu.opt.osstd.build.flags.optimize=-Os @@ -384,6 +425,9 @@ genericSTM32F103C.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L genericSTM32F103C.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) genericSTM32F103C.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L +genericSTM32F103C.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +genericSTM32F103C.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + #-- Optimizations genericSTM32F103C.menu.opt.osstd=Smallest (default) genericSTM32F103C.menu.opt.osstd.build.flags.optimize=-Os @@ -485,6 +529,17 @@ genericSTM32F103R.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp genericSTM32F103R.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103R.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG +#-- CPU Clock frequency +genericSTM32F103R.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +genericSTM32F103R.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +genericSTM32F103R.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +genericSTM32F103R.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + +genericSTM32F103R.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +genericSTM32F103R.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + + #-- Optimizations genericSTM32F103R.menu.opt.osstd=Smallest (default) genericSTM32F103R.menu.opt.osstd.build.flags.optimize=-Os @@ -570,6 +625,16 @@ genericSTM32F103T.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp genericSTM32F103T.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103T.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG +#-- CPU Clock frequency +genericSTM32F103T.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +genericSTM32F103T.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +genericSTM32F103T.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +genericSTM32F103T.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + +genericSTM32F103T.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +genericSTM32F103T.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + #-- Optimizations genericSTM32F103T.menu.opt.osstd=Smallest (default) genericSTM32F103T.menu.opt.osstd.build.flags.optimize=-Os @@ -662,6 +727,16 @@ genericSTM32F103V.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp genericSTM32F103V.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103V.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG +#-- CPU Clock frequency +genericSTM32F103V.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +genericSTM32F103V.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +genericSTM32F103V.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +genericSTM32F103V.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + +genericSTM32F103V.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +genericSTM32F103V.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + #-- Optimizations genericSTM32F103V.menu.opt.osstd=Smallest (default) genericSTM32F103V.menu.opt.osstd.build.flags.optimize=-Os @@ -751,6 +826,16 @@ genericSTM32F103Z.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp genericSTM32F103Z.menu.upload_method.BMPMethod.upload.tool=bmp_upload genericSTM32F103Z.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG +#-- CPU Clock frequency +genericSTM32F103Z.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +genericSTM32F103Z.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +genericSTM32F103Z.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +genericSTM32F103Z.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + +genericSTM32F103Z.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +genericSTM32F103Z.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + #-- Optimizations genericSTM32F103Z.menu.opt.osstd=Smallest (default) genericSTM32F103Z.menu.opt.osstd.build.flags.optimize=-Os @@ -834,6 +919,16 @@ hytiny-stm32f103t.menu.upload_method.jlinkMethod.upload.protocol=jlink hytiny-stm32f103t.menu.upload_method.jlinkMethod.upload.tool=jlink_upload hytiny-stm32f103t.menu.upload_method.jlinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER +#-- CPU Clock frequency +hytiny-stm32f103t.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +hytiny-stm32f103t.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +hytiny-stm32f103t.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +hytiny-stm32f103t.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + +hytiny-stm32f103t.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +hytiny-stm32f103t.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + #-- Optimizations hytiny-stm32f103t.menu.opt.osstd=Smallest (default) hytiny-stm32f103t.menu.opt.osstd.build.flags.optimize=-Os @@ -988,6 +1083,16 @@ STM32VLD.menu.upload_method.STLinkMethod.upload.protocol=STLink STM32VLD.menu.upload_method.STLinkMethod.upload.tool=stlink_upload STM32VLD.menu.upload_method.STLinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG +#-- CPU Clock frequency +STM32VLD.menu.cpu_speed.speed_72mhz=72Mhz (Normal) +STM32VLD.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L + +STM32VLD.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) +STM32VLD.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L + +STM32VLD.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +STM32VLD.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L + #-- Optimizations STM32VLD.menu.opt.osstd=Smallest (default) STM32VLD.menu.opt.osstd.build.flags.optimize=-Os diff --git a/STM32F1/variants/generic_stm32f103c/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103c/wirish/boards_setup.cpp index 551628264..9e8332eec 100644 --- a/STM32F1/variants/generic_stm32f103c/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103c/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { diff --git a/STM32F1/variants/generic_stm32f103r/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103r/wirish/boards_setup.cpp index d7774f763..04130152c 100644 --- a/STM32F1/variants/generic_stm32f103r/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103r/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { diff --git a/STM32F1/variants/generic_stm32f103r8/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103r8/wirish/boards_setup.cpp index 7c939771e..8da724ded 100644 --- a/STM32F1/variants/generic_stm32f103r8/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103r8/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { diff --git a/STM32F1/variants/generic_stm32f103t/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103t/wirish/boards_setup.cpp index 551628264..9e8332eec 100644 --- a/STM32F1/variants/generic_stm32f103t/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103t/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { diff --git a/STM32F1/variants/generic_stm32f103v/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103v/wirish/boards_setup.cpp index 1f23679ab..dba014b91 100644 --- a/STM32F1/variants/generic_stm32f103v/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103v/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { diff --git a/STM32F1/variants/generic_stm32f103z/wirish/boards_setup.cpp b/STM32F1/variants/generic_stm32f103z/wirish/boards_setup.cpp index e2cfe4ad8..3d4e4e8cf 100644 --- a/STM32F1/variants/generic_stm32f103z/wirish/boards_setup.cpp +++ b/STM32F1/variants/generic_stm32f103z/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { diff --git a/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp b/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp index df393473b..f10fcf864 100644 --- a/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp +++ b/STM32F1/variants/hytiny_stm32f103t/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { diff --git a/STM32F1/variants/maple/wirish/boards_setup.cpp b/STM32F1/variants/maple/wirish/boards_setup.cpp index 1071d6da5..c4b55c099 100644 --- a/STM32F1/variants/maple/wirish/boards_setup.cpp +++ b/STM32F1/variants/maple/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { diff --git a/STM32F1/variants/maple_mini/wirish/boards_setup.cpp b/STM32F1/variants/maple_mini/wirish/boards_setup.cpp index df393473b..f10fcf864 100644 --- a/STM32F1/variants/maple_mini/wirish/boards_setup.cpp +++ b/STM32F1/variants/maple_mini/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { diff --git a/STM32F1/variants/maple_ret6/wirish/boards_setup.cpp b/STM32F1/variants/maple_ret6/wirish/boards_setup.cpp index 1071d6da5..c4b55c099 100644 --- a/STM32F1/variants/maple_ret6/wirish/boards_setup.cpp +++ b/STM32F1/variants/maple_ret6/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { diff --git a/STM32F1/variants/microduino/wirish/boards_setup.cpp b/STM32F1/variants/microduino/wirish/boards_setup.cpp index e8998435b..785753a20 100644 --- a/STM32F1/variants/microduino/wirish/boards_setup.cpp +++ b/STM32F1/variants/microduino/wirish/boards_setup.cpp @@ -48,11 +48,13 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL - #if F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #endif + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #endif #endif namespace wirish { From 375a8f84b570077d6260babe6c040aef14f6235e Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 30 Jul 2017 20:08:20 +1000 Subject: [PATCH 157/307] Fixed typo in F1 boards.txt for STM32F103CB RAM size --- STM32F1/boards.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index adb200625..9c2def417 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -385,7 +385,7 @@ genericSTM32F103C.menu.device_variant.STM32F103CB=STM32F103CB (20k RAM. 128k Fla genericSTM32F103C.menu.device_variant.STM32F103CB.build.cpu_flags=-DMCU_STM32F103CB genericSTM32F103C.menu.device_variant.STM32F103CB.build.ldscript=ld/jtag.ld genericSTM32F103C.menu.device_variant.STM32F103CB.upload.maximum_size=131072 -genericSTM32F103C.menu.device_variant.STM32F103C8.upload.maximum_data_size=20480 +genericSTM32F103C.menu.device_variant.STM32F103CB.upload.maximum_data_size=20480 #---------------------------- UPLOAD METHODS --------------------------- From 14ddcfd97dd82d0e1f91b9fb90307bcf7d597fc9 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 31 Jul 2017 10:51:52 +1000 Subject: [PATCH 158/307] Changed text on 128Mhz CPU speed option - to add warning that there is No USB and also Manual reset needed to upload --- STM32F1/boards.txt | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 9c2def417..ef6fc8e2c 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -51,7 +51,7 @@ mapleMini.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L mapleMini.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) mapleMini.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -mapleMini.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +mapleMini.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD mapleMini.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L #-- Optimizations @@ -116,7 +116,7 @@ maple.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L maple.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) maple.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -maple.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +maple.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD maple.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L #-- Optimizations @@ -181,7 +181,7 @@ mapleRET6.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L mapleRET6.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) mapleRET6.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -mapleRET6.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +mapleRET6.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD mapleRET6.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L @@ -255,7 +255,7 @@ microduino32_flash.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L microduino32_flash.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) microduino32_flash.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -microduino32_flash.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +microduino32_flash.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD microduino32_flash.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L #-- Optimizations @@ -425,7 +425,7 @@ genericSTM32F103C.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L genericSTM32F103C.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) genericSTM32F103C.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -genericSTM32F103C.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +genericSTM32F103C.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD genericSTM32F103C.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L #-- Optimizations @@ -536,7 +536,7 @@ genericSTM32F103R.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L genericSTM32F103R.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) genericSTM32F103R.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -genericSTM32F103R.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +genericSTM32F103R.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD genericSTM32F103R.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L @@ -632,7 +632,7 @@ genericSTM32F103T.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L genericSTM32F103T.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) genericSTM32F103T.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -genericSTM32F103T.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +genericSTM32F103T.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD genericSTM32F103T.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L #-- Optimizations @@ -734,7 +734,7 @@ genericSTM32F103V.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L genericSTM32F103V.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) genericSTM32F103V.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -genericSTM32F103V.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +genericSTM32F103V.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD genericSTM32F103V.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L #-- Optimizations @@ -833,7 +833,7 @@ genericSTM32F103Z.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L genericSTM32F103Z.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) genericSTM32F103Z.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -genericSTM32F103Z.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +genericSTM32F103Z.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD genericSTM32F103Z.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L #-- Optimizations @@ -926,7 +926,7 @@ hytiny-stm32f103t.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L hytiny-stm32f103t.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) hytiny-stm32f103t.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -hytiny-stm32f103t.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +hytiny-stm32f103t.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD hytiny-stm32f103t.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L #-- Optimizations @@ -1090,7 +1090,7 @@ STM32VLD.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L STM32VLD.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) STM32VLD.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -STM32VLD.menu.cpu_speed.speed_128mhz=128Mhz (Turbo NO USB!) +STM32VLD.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD STM32VLD.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L #-- Optimizations From 7d1119ee3456e6db4e44dc8a621671d83af76f88 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 31 Jul 2017 10:56:31 +1000 Subject: [PATCH 159/307] Removed Debug with LTO optimisation option, to fix issue #320 --- STM32F1/boards.txt | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index ef6fc8e2c..9cef20747 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -82,9 +82,6 @@ mapleMini.menu.opt.o3lto.build.flags.ldspecs=-flto mapleMini.menu.opt.ogstd=Debug (-g) mapleMini.menu.opt.ogstd.build.flags.optimize=-Og mapleMini.menu.opt.ogstd.build.flags.ldspecs= -mapleMini.menu.opt.oglto=Debug with LTO -mapleMini.menu.opt.oglto.build.flags.optimize=-Og -flto -mapleMini.menu.opt.oglto.build.flags.ldspecs=-flto ############################################################## @@ -147,9 +144,6 @@ maple.menu.opt.o3lto.build.flags.ldspecs=-flto maple.menu.opt.ogstd=Debug (-g) maple.menu.opt.ogstd.build.flags.optimize=-Og maple.menu.opt.ogstd.build.flags.ldspecs= -maple.menu.opt.oglto=Debug with LTO -maple.menu.opt.oglto.build.flags.optimize=-Og -flto -maple.menu.opt.oglto.build.flags.ldspecs=-flto ############################################################## mapleRET6.name=Maple (RET6) @@ -213,9 +207,6 @@ mapleRET6.menu.opt.ogstd=Debug (-g) mapleRET6.menu.opt.o3lto.build.flags.ldspecs=-flto mapleRET6.menu.opt.ogstd.build.flags.optimize=-Og mapleRET6.menu.opt.ogstd.build.flags.ldspecs= -mapleRET6.menu.opt.oglto=Debug with LTO -mapleRET6.menu.opt.oglto.build.flags.optimize=-Og -flto -mapleRET6.menu.opt.oglto.build.flags.ldspecs=-flto ############################################################## @@ -286,9 +277,6 @@ microduino32_flash.menu.opt.ogstd=Debug (-g) microduino32_flash.menu.opt.o3lto.build.flags.ldspecs=-flto microduino32_flash.menu.opt.ogstd.build.flags.optimize=-Og microduino32_flash.menu.opt.ogstd.build.flags.ldspecs= -microduino32_flash.menu.opt.oglto=Debug with LTO -microduino32_flash.menu.opt.oglto.build.flags.optimize=-Og -flto -microduino32_flash.menu.opt.oglto.build.flags.ldspecs=-flto ############################################################## nucleo_f103rb.name=STM Nucleo F103RB (STLink) @@ -356,9 +344,6 @@ nucleo_f103rb.menu.opt.ogstd=Debug (-g) nucleo_f103rb.menu.opt.o3lto.build.flags.ldspecs=-flto nucleo_f103rb.menu.opt.ogstd.build.flags.optimize=-Og nucleo_f103rb.menu.opt.ogstd.build.flags.ldspecs= -nucleo_f103rb.menu.opt.oglto=Debug with LTO -nucleo_f103rb.menu.opt.oglto.build.flags.optimize=-Og -flto -nucleo_f103rb.menu.opt.oglto.build.flags.ldspecs=-flto ###################### Generic STM32F103C ######################################## @@ -456,9 +441,6 @@ genericSTM32F103C.menu.opt.ogstd=Debug (-g) genericSTM32F103C.menu.opt.o3lto.build.flags.ldspecs=-flto genericSTM32F103C.menu.opt.ogstd.build.flags.optimize=-Og genericSTM32F103C.menu.opt.ogstd.build.flags.ldspecs= -genericSTM32F103C.menu.opt.oglto=Debug with LTO -genericSTM32F103C.menu.opt.oglto.build.flags.optimize=-Og -flto -genericSTM32F103C.menu.opt.oglto.build.flags.ldspecs=-flto ########################### Generic STM32F103R ########################### @@ -568,9 +550,6 @@ genericSTM32F103R.menu.opt.ogstd=Debug (-g) genericSTM32F103R.menu.opt.o3lto.build.flags.ldspecs=-flto genericSTM32F103R.menu.opt.ogstd.build.flags.optimize=-Og genericSTM32F103R.menu.opt.ogstd.build.flags.ldspecs= -genericSTM32F103R.menu.opt.oglto=Debug with LTO -genericSTM32F103R.menu.opt.oglto.build.flags.optimize=-Og -flto -genericSTM32F103R.menu.opt.oglto.build.flags.ldspecs=-flto ###################### Generic STM32F103T ######################################## @@ -663,9 +642,6 @@ genericSTM32F103T.menu.opt.ogstd=Debug (-g) genericSTM32F103T.menu.opt.o3lto.build.flags.ldspecs=-flto genericSTM32F103T.menu.opt.ogstd.build.flags.optimize=-Og genericSTM32F103T.menu.opt.ogstd.build.flags.ldspecs= -genericSTM32F103T.menu.opt.oglto=Debug with LTO -genericSTM32F103T.menu.opt.oglto.build.flags.optimize=-Og -flto -genericSTM32F103T.menu.opt.oglto.build.flags.ldspecs=-flto ########################### Generic STM32F103V ########################### @@ -765,9 +741,6 @@ genericSTM32F103V.menu.opt.ogstd=Debug (-g) genericSTM32F103V.menu.opt.o3lto.build.flags.ldspecs=-flto genericSTM32F103V.menu.opt.ogstd.build.flags.optimize=-Og genericSTM32F103V.menu.opt.ogstd.build.flags.ldspecs= -genericSTM32F103V.menu.opt.oglto=Debug with LTO -genericSTM32F103V.menu.opt.oglto.build.flags.optimize=-Og -flto -genericSTM32F103V.menu.opt.oglto.build.flags.ldspecs=-flto ########################### Generic STM32F103Z ########################### @@ -864,9 +837,6 @@ genericSTM32F103Z.menu.opt.ogstd=Debug (-g) genericSTM32F103Z.menu.opt.o3lto.build.flags.ldspecs=-flto genericSTM32F103Z.menu.opt.ogstd.build.flags.optimize=-Og genericSTM32F103Z.menu.opt.ogstd.build.flags.ldspecs= -genericSTM32F103Z.menu.opt.oglto=Debug with LTO -genericSTM32F103Z.menu.opt.oglto.build.flags.optimize=-Og -flto -genericSTM32F103Z.menu.opt.oglto.build.flags.ldspecs=-flto ###################### HYTiny STM32F103T ######################################## @@ -957,9 +927,6 @@ hytiny-stm32f103t.menu.opt.ogstd=Debug (-g) hytiny-stm32f103t.menu.opt.o3lto.build.flags.ldspecs=-flto hytiny-stm32f103t.menu.opt.ogstd.build.flags.optimize=-Og hytiny-stm32f103t.menu.opt.ogstd.build.flags.ldspecs= -hytiny-stm32f103t.menu.opt.oglto=Debug with LTO -hytiny-stm32f103t.menu.opt.oglto.build.flags.optimize=-Og -flto -hytiny-stm32f103t.menu.opt.oglto.build.flags.ldspecs=-flto ###################### Generic GD32F103C ######################################## @@ -1051,9 +1018,6 @@ genericGD32F103C.menu.opt.ogstd=Debug (-g) genericGD32F103C.menu.opt.o3lto.build.flags.ldspecs=-flto genericGD32F103C.menu.opt.ogstd.build.flags.optimize=-Og genericGD32F103C.menu.opt.ogstd.build.flags.ldspecs= -genericGD32F103C.menu.opt.oglto=Debug with LTO -genericGD32F103C.menu.opt.oglto.build.flags.optimize=-Og -flto -genericGD32F103C.menu.opt.oglto.build.flags.ldspecs=-flto ########################### STM32VLD to FLASH ########################### @@ -1121,8 +1085,5 @@ STM32VLD.menu.opt.ogstd=Debug (-g) STM32VLD.menu.opt.o3lto.build.flags.ldspecs=-flto STM32VLD.menu.opt.ogstd.build.flags.optimize=-Og STM32VLD.menu.opt.ogstd.build.flags.ldspecs= -STM32VLD.menu.opt.oglto=Debug with LTO -STM32VLD.menu.opt.oglto.build.flags.optimize=-Og -flto -STM32VLD.menu.opt.oglto.build.flags.ldspecs=-flto ################################################################################ \ No newline at end of file From ac27993d10a9d910890b6c655a4435fcd1f10ab6 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 31 Jul 2017 13:33:00 +1000 Subject: [PATCH 160/307] Added makeWord macro and functions to fix #316 --- STM32F1/cores/maple/wirish_math.cpp | 9 +++++++++ STM32F1/cores/maple/wirish_math.h | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/STM32F1/cores/maple/wirish_math.cpp b/STM32F1/cores/maple/wirish_math.cpp index 3b682d388..f8ada9f96 100644 --- a/STM32F1/cores/maple/wirish_math.cpp +++ b/STM32F1/cores/maple/wirish_math.cpp @@ -47,3 +47,12 @@ long random(long howsmall, long howbig) { return random(diff) + howsmall; } +extern uint16_t makeWord( uint16_t w ) +{ + return w ; +} + +extern uint16_t makeWord( uint8_t h, uint8_t l ) +{ + return (h << 8) | l ; +} diff --git a/STM32F1/cores/maple/wirish_math.h b/STM32F1/cores/maple/wirish_math.h index d103d8632..9140d066e 100644 --- a/STM32F1/cores/maple/wirish_math.h +++ b/STM32F1/cores/maple/wirish_math.h @@ -33,6 +33,7 @@ #define _WIRISH_WIRISH_MATH_H_ #include +#include /** * @brief Initialize the pseudo-random number generator. @@ -161,4 +162,9 @@ double sqrt(double x); */ double pow(double x, double y); +extern uint16_t makeWord( uint16_t w ) ; +extern uint16_t makeWord( uint8_t h, uint8_t l ) ; + +#define word(...) makeWord(__VA_ARGS__) + #endif From c0f655f90ff0a89e7c88b05e94c2826bace60510 Mon Sep 17 00:00:00 2001 From: Cristi Marius Tiutiu Date: Mon, 31 Jul 2017 11:42:28 +0300 Subject: [PATCH 161/307] added menu optimizations support for F3/F4 boards --- STM32F3/boards.txt | 30 +++++++++++ STM32F3/platform.txt | 8 +-- STM32F4/boards.txt | 116 +++++++++++++++++++++++++++++++++++++++++++ STM32F4/platform.txt | 8 +-- 4 files changed, 154 insertions(+), 8 deletions(-) diff --git a/STM32F3/boards.txt b/STM32F3/boards.txt index 6c011bce3..98a184df4 100644 --- a/STM32F3/boards.txt +++ b/STM32F3/boards.txt @@ -1,5 +1,7 @@ # +menu.opt=Optimize + ############################################################## discovery_f3.name=STM32F3Discovery @@ -28,5 +30,33 @@ discovery_f3.build.error_led_port=GPIOE discovery_f3.build.error_led_pin=8 discovery_f3.build.board=STM32F3Discovery +#-- Optimizations +discovery_f3.menu.opt.osstd=Smallest (default) +discovery_f3.menu.opt.osstd.build.flags.optimize=-Os +discovery_f3.menu.opt.osstd.build.flags.ldspecs= +discovery_f3.menu.opt.oslto=Smallest Code with LTO +discovery_f3.menu.opt.oslto.build.flags.optimize=-Os -flto +discovery_f3.menu.opt.oslto.build.flags.ldspecs=-flto +discovery_f3.menu.opt.o1std=Fast (-O1) +discovery_f3.menu.opt.o1std.build.flags.optimize=-O1 +discovery_f3.menu.opt.o1std.build.flags.ldspecs= +discovery_f3.menu.opt.o1lto=Fast (-O1) with LTO +discovery_f3.menu.opt.o1lto.build.flags.optimize=-O1 -flto +discovery_f3.menu.opt.o1lto.build.flags.ldspecs=-flto +discovery_f3.menu.opt.o2std=Faster (-O2) +discovery_f3.menu.opt.o2std.build.flags.optimize=-O2 +discovery_f3.menu.opt.o2std.build.flags.ldspecs= +discovery_f3.menu.opt.o2lto=Faster (-O2) with LTO +discovery_f3.menu.opt.o2lto.build.flags.optimize=-O2 -flto +discovery_f3.menu.opt.o2lto.build.flags.ldspecs=-flto +discovery_f3.menu.opt.o3std=Fastest (-O3) +discovery_f3.menu.opt.o3std.build.flags.optimize=-O3 +discovery_f3.menu.opt.o3std.build.flags.ldspecs= +discovery_f3.menu.opt.o3lto=Fastest (-O3) with LTO +discovery_f3.menu.opt.o3lto.build.flags.optimize=-O3 -flto +discovery_f3.menu.opt.o3lto.build.flags.ldspecs=-flto +discovery_f3.menu.opt.ogstd=Debug (-g) +discovery_f3.menu.opt.ogstd.build.flags.optimize=-Og +discovery_f3.menu.opt.ogstd.build.flags.ldspecs= ############################################################## diff --git a/STM32F3/platform.txt b/STM32F3/platform.txt index 3218f85c1..94f787c81 100644 --- a/STM32F3/platform.txt +++ b/STM32F3/platform.txt @@ -12,20 +12,20 @@ version=0.1.0 compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g {build.flags.optimize} -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ -compiler.c.elf.flags=-Os -Wl,--gc-sections +compiler.c.elf.flags={build.flags.optimize} -Wl,--gc-sections {build.flags.ldspecs} compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g -Os -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g {build.flags.optimize} -w -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 compiler.elf2hex.flags=-O binary compiler.elf2hex.cmd=arm-none-eabi-objcopy -compiler.ldflags= +compiler.ldflags={build.flags.ldspecs} compiler.size.cmd=arm-none-eabi-size compiler.define=-DARDUINO= diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index baf6f6e03..abc40f02b 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -1,6 +1,7 @@ # menu.usb_cfg=USB configuration +menu.opt=Optimize ############################################################## discovery_f407.name=STM32 Discovery F407 @@ -36,6 +37,35 @@ discovery_f407.menu.usb_cfg.usb_serial=USB serial (CDC) discovery_f407.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB discovery_f407.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) discovery_f407.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC + +#-- Optimizations +discovery_f407.menu.opt.osstd=Smallest (default) +discovery_f407.menu.opt.osstd.build.flags.optimize=-Os +discovery_f407.menu.opt.osstd.build.flags.ldspecs= +discovery_f407.menu.opt.oslto=Smallest Code with LTO +discovery_f407.menu.opt.oslto.build.flags.optimize=-Os -flto +discovery_f407.menu.opt.oslto.build.flags.ldspecs=-flto +discovery_f407.menu.opt.o1std=Fast (-O1) +discovery_f407.menu.opt.o1std.build.flags.optimize=-O1 +discovery_f407.menu.opt.o1std.build.flags.ldspecs= +discovery_f407.menu.opt.o1lto=Fast (-O1) with LTO +discovery_f407.menu.opt.o1lto.build.flags.optimize=-O1 -flto +discovery_f407.menu.opt.o1lto.build.flags.ldspecs=-flto +discovery_f407.menu.opt.o2std=Faster (-O2) +discovery_f407.menu.opt.o2std.build.flags.optimize=-O2 +discovery_f407.menu.opt.o2std.build.flags.ldspecs= +discovery_f407.menu.opt.o2lto=Faster (-O2) with LTO +discovery_f407.menu.opt.o2lto.build.flags.optimize=-O2 -flto +discovery_f407.menu.opt.o2lto.build.flags.ldspecs=-flto +discovery_f407.menu.opt.o3std=Fastest (-O3) +discovery_f407.menu.opt.o3std.build.flags.optimize=-O3 +discovery_f407.menu.opt.o3std.build.flags.ldspecs= +discovery_f407.menu.opt.o3lto=Fastest (-O3) with LTO +discovery_f407.menu.opt.o3lto.build.flags.optimize=-O3 -flto +discovery_f407.menu.opt.o3lto.build.flags.ldspecs=-flto +discovery_f407.menu.opt.ogstd=Debug (-g) +discovery_f407.menu.opt.ogstd.build.flags.optimize=-Og +discovery_f407.menu.opt.ogstd.build.flags.ldspecs= ############################################################## generic_f407v.name=Generic STM32F407V series @@ -72,6 +102,34 @@ generic_f407v.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB generic_f407v.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) generic_f407v.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC +#-- Optimizations +generic_f407v.menu.opt.osstd=Smallest (default) +generic_f407v.menu.opt.osstd.build.flags.optimize=-Os +generic_f407v.menu.opt.osstd.build.flags.ldspecs= +generic_f407v.menu.opt.oslto=Smallest Code with LTO +generic_f407v.menu.opt.oslto.build.flags.optimize=-Os -flto +generic_f407v.menu.opt.oslto.build.flags.ldspecs=-flto +generic_f407v.menu.opt.o1std=Fast (-O1) +generic_f407v.menu.opt.o1std.build.flags.optimize=-O1 +generic_f407v.menu.opt.o1std.build.flags.ldspecs= +generic_f407v.menu.opt.o1lto=Fast (-O1) with LTO +generic_f407v.menu.opt.o1lto.build.flags.optimize=-O1 -flto +generic_f407v.menu.opt.o1lto.build.flags.ldspecs=-flto +generic_f407v.menu.opt.o2std=Faster (-O2) +generic_f407v.menu.opt.o2std.build.flags.optimize=-O2 +generic_f407v.menu.opt.o2std.build.flags.ldspecs= +generic_f407v.menu.opt.o2lto=Faster (-O2) with LTO +generic_f407v.menu.opt.o2lto.build.flags.optimize=-O2 -flto +generic_f407v.menu.opt.o2lto.build.flags.ldspecs=-flto +generic_f407v.menu.opt.o3std=Fastest (-O3) +generic_f407v.menu.opt.o3std.build.flags.optimize=-O3 +generic_f407v.menu.opt.o3std.build.flags.ldspecs= +generic_f407v.menu.opt.o3lto=Fastest (-O3) with LTO +generic_f407v.menu.opt.o3lto.build.flags.optimize=-O3 -flto +generic_f407v.menu.opt.o3lto.build.flags.ldspecs=-flto +generic_f407v.menu.opt.ogstd=Debug (-g) +generic_f407v.menu.opt.ogstd.build.flags.optimize=-Og +generic_f407v.menu.opt.ogstd.build.flags.ldspecs= ############################################################## stm32f4stamp.name=STM32F4Stamp F405 @@ -107,6 +165,35 @@ stm32f4stamp.menu.usb_cfg.usb_serial=USB serial (CDC) stm32f4stamp.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB stm32f4stamp.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) stm32f4stamp.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC + +#-- Optimizations +stm32f4stamp.menu.opt.osstd=Smallest (default) +stm32f4stamp.menu.opt.osstd.build.flags.optimize=-Os +stm32f4stamp.menu.opt.osstd.build.flags.ldspecs= +stm32f4stamp.menu.opt.oslto=Smallest Code with LTO +stm32f4stamp.menu.opt.oslto.build.flags.optimize=-Os -flto +stm32f4stamp.menu.opt.oslto.build.flags.ldspecs=-flto +stm32f4stamp.menu.opt.o1std=Fast (-O1) +stm32f4stamp.menu.opt.o1std.build.flags.optimize=-O1 +stm32f4stamp.menu.opt.o1std.build.flags.ldspecs= +stm32f4stamp.menu.opt.o1lto=Fast (-O1) with LTO +stm32f4stamp.menu.opt.o1lto.build.flags.optimize=-O1 -flto +stm32f4stamp.menu.opt.o1lto.build.flags.ldspecs=-flto +stm32f4stamp.menu.opt.o2std=Faster (-O2) +stm32f4stamp.menu.opt.o2std.build.flags.optimize=-O2 +stm32f4stamp.menu.opt.o2std.build.flags.ldspecs= +stm32f4stamp.menu.opt.o2lto=Faster (-O2) with LTO +stm32f4stamp.menu.opt.o2lto.build.flags.optimize=-O2 -flto +stm32f4stamp.menu.opt.o2lto.build.flags.ldspecs=-flto +stm32f4stamp.menu.opt.o3std=Fastest (-O3) +stm32f4stamp.menu.opt.o3std.build.flags.optimize=-O3 +stm32f4stamp.menu.opt.o3std.build.flags.ldspecs= +stm32f4stamp.menu.opt.o3lto=Fastest (-O3) with LTO +stm32f4stamp.menu.opt.o3lto.build.flags.optimize=-O3 -flto +stm32f4stamp.menu.opt.o3lto.build.flags.ldspecs=-flto +stm32f4stamp.menu.opt.ogstd=Debug (-g) +stm32f4stamp.menu.opt.ogstd.build.flags.optimize=-Og +stm32f4stamp.menu.opt.ogstd.build.flags.ldspecs= ############################################################## netduino2plus.name=Netduino2 F405 @@ -142,5 +229,34 @@ netduino2plus.menu.usb_cfg.usb_serial=USB serial (CDC) netduino2plus.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB netduino2plus.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) netduino2plus.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC + +#-- Optimizations +netduino2plus.menu.opt.osstd=Smallest (default) +netduino2plus.menu.opt.osstd.build.flags.optimize=-Os +netduino2plus.menu.opt.osstd.build.flags.ldspecs= +netduino2plus.menu.opt.oslto=Smallest Code with LTO +netduino2plus.menu.opt.oslto.build.flags.optimize=-Os -flto +netduino2plus.menu.opt.oslto.build.flags.ldspecs=-flto +netduino2plus.menu.opt.o1std=Fast (-O1) +netduino2plus.menu.opt.o1std.build.flags.optimize=-O1 +netduino2plus.menu.opt.o1std.build.flags.ldspecs= +netduino2plus.menu.opt.o1lto=Fast (-O1) with LTO +netduino2plus.menu.opt.o1lto.build.flags.optimize=-O1 -flto +netduino2plus.menu.opt.o1lto.build.flags.ldspecs=-flto +netduino2plus.menu.opt.o2std=Faster (-O2) +netduino2plus.menu.opt.o2std.build.flags.optimize=-O2 +netduino2plus.menu.opt.o2std.build.flags.ldspecs= +netduino2plus.menu.opt.o2lto=Faster (-O2) with LTO +netduino2plus.menu.opt.o2lto.build.flags.optimize=-O2 -flto +netduino2plus.menu.opt.o2lto.build.flags.ldspecs=-flto +netduino2plus.menu.opt.o3std=Fastest (-O3) +netduino2plus.menu.opt.o3std.build.flags.optimize=-O3 +netduino2plus.menu.opt.o3std.build.flags.ldspecs= +netduino2plus.menu.opt.o3lto=Fastest (-O3) with LTO +netduino2plus.menu.opt.o3lto.build.flags.optimize=-O3 -flto +netduino2plus.menu.opt.o3lto.build.flags.ldspecs=-flto +netduino2plus.menu.opt.ogstd=Debug (-g) +netduino2plus.menu.opt.ogstd.build.flags.optimize=-Og +netduino2plus.menu.opt.ogstd.build.flags.ldspecs= ############################################################## diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index b64fe3eee..92dc1ea9a 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -10,20 +10,20 @@ version=0.1.0 # ---------------------- compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g -Os -Wall -MMD -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g {build.flags.optimize} -Wall -MMD -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ -compiler.c.elf.flags=-Os -Wl,--gc-sections +compiler.c.elf.flags={build.flags.optimize} -Wl,--gc-sections {build.flags.ldspecs} compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g -Os -Wall -MMD -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g {build.flags.optimize} -Wall -MMD -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 compiler.elf2hex.flags=-O binary compiler.elf2hex.cmd=arm-none-eabi-objcopy -compiler.ldflags= +compiler.ldflags={build.flags.ldspecs} compiler.size.cmd=arm-none-eabi-size compiler.define=-DARDUINO= From bc41851ce49b2ab669c1ad649387fc8eda8254e6 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 1 Aug 2017 16:47:39 +1000 Subject: [PATCH 162/307] Changed default Wire (I2C) to use hardware I2C rather than bit banged software. The existing software Wire implementation has been retained as SoftWare. Examples have also been updated to include Wire, HardWire and Softwire. --- STM32F1/libraries/Wire/HardWire.cpp | 101 ------- STM32F1/libraries/Wire/HardWire.h | 78 ------ STM32F1/libraries/Wire/SoftWire.cpp | 246 ++++++++++++++++++ STM32F1/libraries/Wire/SoftWire.h | 163 ++++++++++++ STM32F1/libraries/Wire/Wire.cpp | 229 +++------------- STM32F1/libraries/Wire/Wire.h | 145 +++-------- .../i2c_scanner_hardwire.ino} | 2 +- .../i2c_scanner_softwire.ino | 54 ++++ 8 files changed, 537 insertions(+), 481 deletions(-) delete mode 100644 STM32F1/libraries/Wire/HardWire.cpp delete mode 100644 STM32F1/libraries/Wire/HardWire.h create mode 100644 STM32F1/libraries/Wire/SoftWire.cpp create mode 100644 STM32F1/libraries/Wire/SoftWire.h rename STM32F1/libraries/Wire/examples/{i2c_scanner_hwire/i2c_scanner_hwire.ino => i2c_scanner_hardwire/i2c_scanner_hardwire.ino} (98%) create mode 100644 STM32F1/libraries/Wire/examples/i2c_scanner_softwire/i2c_scanner_softwire.ino diff --git a/STM32F1/libraries/Wire/HardWire.cpp b/STM32F1/libraries/Wire/HardWire.cpp deleted file mode 100644 index 51af7ad76..000000000 --- a/STM32F1/libraries/Wire/HardWire.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file HardWire.cpp - * @author Trystan Jones - * @brief Wire library, uses the hardware I2C available in the Maple to - * interact with I2C slave devices. - */ - -/* - * Library created by crenn to use the new WireBase system and allow Arduino - * users easy interaction with the I2C Hardware in a familiar method. - */ - -#include "HardWire.h" - -uint8 HardWire::process(uint8 stop) { - int8 res = i2c_master_xfer(sel_hard, &itc_msg, 1, 0); - if (res == I2C_ERROR_PROTOCOL) { - if (sel_hard->error_flags & I2C_SR1_AF) { /* NACK */ - res = (sel_hard->error_flags & I2C_SR1_ADDR ? ENACKADDR : - ENACKTRNS); - } else if (sel_hard->error_flags & I2C_SR1_OVR) { /* Over/Underrun */ - res = EDATA; - } else { /* Bus or Arbitration error */ - res = EOTHER; - } - i2c_disable(sel_hard); - i2c_master_enable(sel_hard, (I2C_BUS_RESET | dev_flags)); - } - return res; -} - -uint8 HardWire::process(){ - return process(true); -} - -// TODO: Add in Error Handling if devsel is out of range for other Maples -HardWire::HardWire(uint8 dev_sel, uint8 flags) { - if (dev_sel == 1) { - sel_hard = I2C1; - } else if (dev_sel == 2) { - sel_hard = I2C2; - } else { - ASSERT(1); - } - dev_flags = flags; -} - -HardWire::~HardWire() { - i2c_disable(sel_hard); - sel_hard = 0; -} - -void HardWire::begin(uint8 self_addr) { - i2c_master_enable(sel_hard, dev_flags); -} - -void HardWire::end() { - i2c_disable(sel_hard); - sel_hard = 0; -} - -void HardWire::setClock(uint32_t frequencyHz) -{ - switch(frequencyHz) - { - case 400000: - dev_flags |= I2C_FAST_MODE;// set FAST_MODE bit - break; - case 100000: - default: - dev_flags &= ~I2C_FAST_MODE;// clear FAST_MODE bit - break; - } - -} diff --git a/STM32F1/libraries/Wire/HardWire.h b/STM32F1/libraries/Wire/HardWire.h deleted file mode 100644 index 4d49e1a28..000000000 --- a/STM32F1/libraries/Wire/HardWire.h +++ /dev/null @@ -1,78 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file HardWire.h - * @author Trystan Jones - * @brief Wire library, uses the hardware I2C available in the Maple to - * interact with I2C slave devices. - */ - -/* - * Library created by crenn to use the new WireBase system and allow Arduino - * users easy interaction with the I2C Hardware in a familiar method. - */ - -#ifndef _HARDWIRE_H_ -#define _HARDWIRE_H_ - -#include "WireBase.h" -#include "wirish.h" -#include - -class HardWire : public WireBase { -private: - i2c_dev* sel_hard; - uint8 dev_flags; -protected: - /* - * Processes the incoming I2C message defined by WireBase to the - * hardware. If an error occured, restart the I2C device. - */ - uint8 process(uint8); - uint8 process(); -public: - /* - * Check if devsel is within range and enable selected I2C interface with - * passed flags - */ - HardWire(uint8, uint8 = 0); - - /* - * Shuts down (disables) the hardware I2C - */ - void end(); - - void setClock(uint32_t frequencyHz); - /* - * Disables the I2C device and remove the device address. - */ - ~HardWire(); - - void begin(uint8 = 0x00); -}; -extern HardWire HWire; -#endif // _HARDWIRE_H_ diff --git a/STM32F1/libraries/Wire/SoftWire.cpp b/STM32F1/libraries/Wire/SoftWire.cpp new file mode 100644 index 000000000..781bb976f --- /dev/null +++ b/STM32F1/libraries/Wire/SoftWire.cpp @@ -0,0 +1,246 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 LeafLabs LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file Wire.cpp + * @author Trystan Jones + * @brief Wire library, uses the WireBase to create the primary interface + * while keeping low level interactions invisible to the user. + */ + +/* + * Library updated by crenn to follow new Wire system. + * Code was derived from the original Wire for maple code by leaflabs and the + * modifications by gke and ala42. + */ + /* + * Updated by Roger Clark. 20141111. Fixed issue when process() returned because of missing ACK (often caused by invalid device address being used), caused SCL to be left + * LOW so that in the next call to process() , the first clock pulse was not sent, because SCL was LOW when it should have been high. + */ + /* + * Updated by Brandon Green. 20172306. Implementing the repeated start functionality. + */ + +#include "SoftWire.h" + +#define I2C_WRITE 0 +#define I2C_READ 1 + +/* low level conventions: + * - SDA/SCL idle high (expected high) + * - always start with i2c_delay rather than end + */ + +void TwoWire::set_scl(bool state) { + I2C_DELAY(this->i2c_delay); + + gpio_write_bit(sclDevice,sclBit, state); +// digitalWrite(this->scl_pin,state); + //Allow for clock stretching - dangerous currently + if (state == HIGH) { + while(digitalRead(this->scl_pin) == 0); + } +} + +void TwoWire::set_sda(bool state) { + I2C_DELAY(this->i2c_delay); + gpio_write_bit(sdaDevice,sdaBit, state); + //digitalWrite(this->sda_pin, state); +} + +void TwoWire::i2c_start() { + set_sda(LOW); + set_scl(LOW); +} + +void TwoWire::i2c_stop() { + set_sda(LOW); + set_scl(HIGH); + set_sda(HIGH); +} + +void TwoWire::i2c_repeated_start() { + set_sda(HIGH); + set_scl(HIGH); + set_sda(LOW); +} + +bool TwoWire::i2c_get_ack() { + set_scl(LOW); + set_sda(HIGH); + set_scl(HIGH); + + bool ret = !digitalRead(this->sda_pin); + set_scl(LOW); + return ret; +} + +void TwoWire::i2c_send_ack() { + set_sda(LOW); + set_scl(HIGH); + set_scl(LOW); +} + +void TwoWire::i2c_send_nack() { + set_sda(HIGH); + set_scl(HIGH); + set_scl(LOW); +} + +uint8 TwoWire::i2c_shift_in() { + uint8 data = 0; + set_sda(HIGH); + + int i; + for (i = 0; i < 8; i++) { + set_scl(HIGH); + data |= digitalRead(this->sda_pin) << (7-i); + set_scl(LOW); + } + + return data; +} + +void TwoWire::i2c_shift_out(uint8 val) { + int i; + for (i = 0; i < 8; i++) { + set_sda(!!(val & (1 << (7 - i)) ) ); + set_scl(HIGH); + set_scl(LOW); + } +} + +//process needs to be updated for repeated start. +uint8 TwoWire::process(uint8 stop) { + itc_msg.xferred = 0; + + uint8 sla_addr = (itc_msg.addr << 1); + if (itc_msg.flags == I2C_MSG_READ) { + sla_addr |= I2C_READ; + } + i2c_start(); + // shift out the address we're transmitting to + i2c_shift_out(sla_addr); + if (!i2c_get_ack()) + { + i2c_stop();// Roger Clark. 20141110 added to set clock high again, as it will be left in a low state otherwise + return ENACKADDR; + } + // Recieving + if (itc_msg.flags == I2C_MSG_READ) { + while (itc_msg.xferred < itc_msg.length) { + itc_msg.data[itc_msg.xferred++] = i2c_shift_in(); + if (itc_msg.xferred < itc_msg.length) + { + i2c_send_ack(); + } + else + { + i2c_send_nack(); + } + } + } + // Sending + else { + for (uint8 i = 0; i < itc_msg.length; i++) { + i2c_shift_out(itc_msg.data[i]); + if (!i2c_get_ack()) + { + i2c_stop();// Roger Clark. 20141110 added to set clock high again, as it will be left in a low state otherwise + return ENACKTRNS; + } + itc_msg.xferred++; + } + } + if(stop == true) + i2c_stop(); + else i2c_repeated_start(); + + return SUCCESS; +} + +// For compatibility with legacy code +uint8 TwoWire::process(){ + return process(true); +} + +// TODO: Add in Error Handling if pins is out of range for other Maples +// TODO: Make delays more capable +TwoWire::TwoWire(uint8 scl, uint8 sda, uint8 delay) : i2c_delay(delay) { + this->scl_pin=scl; + this->sda_pin=sda; +} + +void TwoWire::begin(uint8 self_addr) { + tx_buf_idx = 0; + tx_buf_overflow = false; + rx_buf_idx = 0; + rx_buf_len = 0; + pinMode(this->scl_pin, OUTPUT_OPEN_DRAIN); + pinMode(this->sda_pin, OUTPUT_OPEN_DRAIN); + + sclDevice = PIN_MAP[this->scl_pin].gpio_device; + sclBit = PIN_MAP[this->scl_pin].gpio_bit; + sdaDevice = PIN_MAP[this->sda_pin].gpio_device; + sdaBit = PIN_MAP[this->sda_pin].gpio_bit; + set_scl(HIGH); + set_sda(HIGH); +} + +void TwoWire::end() +{ + if (this->scl_pin) + { + pinMode(this->scl_pin, INPUT); + } + if (this->sda_pin) + { + pinMode(this->sda_pin, INPUT); + } +} + +void TwoWire::setClock(uint32_t frequencyHz) +{ + switch(frequencyHz) + { + case 400000: + i2c_delay = SOFT_FAST; + break; + case 100000: + default: + i2c_delay = SOFT_STANDARD; + break; + } +} + +TwoWire::~TwoWire() { + this->scl_pin=0; + this->sda_pin=0; +} + +// Declare the instance that the users of the library can use +//TwoWire Wire(SCL, SDA, SOFT_STANDARD); +//TwoWire Wire(PB6, PB7, SOFT_FAST); diff --git a/STM32F1/libraries/Wire/SoftWire.h b/STM32F1/libraries/Wire/SoftWire.h new file mode 100644 index 000000000..0804c0f11 --- /dev/null +++ b/STM32F1/libraries/Wire/SoftWire.h @@ -0,0 +1,163 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 LeafLabs LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file Wire.h + * @author Trystan Jones + * @brief Wire library, uses the WireBase to create the primary interface + * while keeping low level interactions invisible to the user. + */ + +/* + * Library updated by crenn to follow new Wire system. + * Code was derived from the original Wire for maple code by leaflabs and the + * modifications by gke and ala42. + */ + +#ifndef _SOFTWIRE_H_ +#define _SOFTWIRE_H_ + +#include "WireBase.h" +#include "wirish.h" + +/* + * On the Maple, let the default pins be in the same location as the Arduino + * pins + */ +#define SDA PB7 +#define SCL PB6 + +#define SOFT_STANDARD 19 +#define SOFT_FAST 0 + + +//#define I2C_DELAY(x) {uint32 time=micros(); while(time>(micros()+x));} +#define I2C_DELAY(x) do{for(int i=0;i - * @brief Wire library, uses the WireBase to create the primary interface - * while keeping low level interactions invisible to the user. + * @brief Wire library, uses the hardware I2C available in the Maple to + * interact with I2C slave devices. */ /* - * Library updated by crenn to follow new Wire system. - * Code was derived from the original Wire for maple code by leaflabs and the - * modifications by gke and ala42. + * Library created by crenn to use the new WireBase system and allow Arduino + * users easy interaction with the I2C Hardware in a familiar method. */ - /* - * Updated by Roger Clark. 20141111. Fixed issue when process() returned because of missing ACK (often caused by invalid device address being used), caused SCL to be left - * LOW so that in the next call to process() , the first clock pulse was not sent, because SCL was LOW when it should have been high. - */ - /* - * Updated by Brandon Green. 20172306. Implementing the repeated start functionality. - */ #include "Wire.h" -#define I2C_WRITE 0 -#define I2C_READ 1 - -/* low level conventions: - * - SDA/SCL idle high (expected high) - * - always start with i2c_delay rather than end - */ - -void TwoWire::set_scl(bool state) { - I2C_DELAY(this->i2c_delay); - - gpio_write_bit(sclDevice,sclBit, state); -// digitalWrite(this->scl_pin,state); - //Allow for clock stretching - dangerous currently - if (state == HIGH) { - while(digitalRead(this->scl_pin) == 0); +uint8 HardWire::process(uint8 stop) { + int8 res = i2c_master_xfer(sel_hard, &itc_msg, 1, 0); + if (res == I2C_ERROR_PROTOCOL) { + if (sel_hard->error_flags & I2C_SR1_AF) { /* NACK */ + res = (sel_hard->error_flags & I2C_SR1_ADDR ? ENACKADDR : + ENACKTRNS); + } else if (sel_hard->error_flags & I2C_SR1_OVR) { /* Over/Underrun */ + res = EDATA; + } else { /* Bus or Arbitration error */ + res = EOTHER; + } + i2c_disable(sel_hard); + i2c_master_enable(sel_hard, (I2C_BUS_RESET | dev_flags)); } + return res; } -void TwoWire::set_sda(bool state) { - I2C_DELAY(this->i2c_delay); - gpio_write_bit(sdaDevice,sdaBit, state); - //digitalWrite(this->sda_pin, state); -} - -void TwoWire::i2c_start() { - set_sda(LOW); - set_scl(LOW); -} - -void TwoWire::i2c_stop() { - set_sda(LOW); - set_scl(HIGH); - set_sda(HIGH); -} - -void TwoWire::i2c_repeated_start() { - set_sda(HIGH); - set_scl(HIGH); - set_sda(LOW); -} - -bool TwoWire::i2c_get_ack() { - set_scl(LOW); - set_sda(HIGH); - set_scl(HIGH); - - bool ret = !digitalRead(this->sda_pin); - set_scl(LOW); - return ret; -} - -void TwoWire::i2c_send_ack() { - set_sda(LOW); - set_scl(HIGH); - set_scl(LOW); -} - -void TwoWire::i2c_send_nack() { - set_sda(HIGH); - set_scl(HIGH); - set_scl(LOW); -} - -uint8 TwoWire::i2c_shift_in() { - uint8 data = 0; - set_sda(HIGH); - - int i; - for (i = 0; i < 8; i++) { - set_scl(HIGH); - data |= digitalRead(this->sda_pin) << (7-i); - set_scl(LOW); - } - - return data; -} - -void TwoWire::i2c_shift_out(uint8 val) { - int i; - for (i = 0; i < 8; i++) { - set_sda(!!(val & (1 << (7 - i)) ) ); - set_scl(HIGH); - set_scl(LOW); - } +uint8 HardWire::process(){ + return process(true); } -//process needs to be updated for repeated start. -uint8 TwoWire::process(uint8 stop) { - itc_msg.xferred = 0; - - uint8 sla_addr = (itc_msg.addr << 1); - if (itc_msg.flags == I2C_MSG_READ) { - sla_addr |= I2C_READ; - } - i2c_start(); - // shift out the address we're transmitting to - i2c_shift_out(sla_addr); - if (!i2c_get_ack()) - { - i2c_stop();// Roger Clark. 20141110 added to set clock high again, as it will be left in a low state otherwise - return ENACKADDR; +// TODO: Add in Error Handling if devsel is out of range for other Maples +HardWire::HardWire(uint8 dev_sel, uint8 flags) { + if (dev_sel == 1) { + sel_hard = I2C1; + } else if (dev_sel == 2) { + sel_hard = I2C2; + } else { + ASSERT(1); } - // Recieving - if (itc_msg.flags == I2C_MSG_READ) { - while (itc_msg.xferred < itc_msg.length) { - itc_msg.data[itc_msg.xferred++] = i2c_shift_in(); - if (itc_msg.xferred < itc_msg.length) - { - i2c_send_ack(); - } - else - { - i2c_send_nack(); - } - } - } - // Sending - else { - for (uint8 i = 0; i < itc_msg.length; i++) { - i2c_shift_out(itc_msg.data[i]); - if (!i2c_get_ack()) - { - i2c_stop();// Roger Clark. 20141110 added to set clock high again, as it will be left in a low state otherwise - return ENACKTRNS; - } - itc_msg.xferred++; - } - } - if(stop == true) - i2c_stop(); - else i2c_repeated_start(); - - return SUCCESS; + dev_flags = flags; } -// For compatibility with legacy code -uint8 TwoWire::process(){ - return process(true); +HardWire::~HardWire() { + i2c_disable(sel_hard); + sel_hard = 0; } -// TODO: Add in Error Handling if pins is out of range for other Maples -// TODO: Make delays more capable -TwoWire::TwoWire(uint8 scl, uint8 sda, uint8 delay) : i2c_delay(delay) { - this->scl_pin=scl; - this->sda_pin=sda; +void HardWire::begin(uint8 self_addr) { + i2c_master_enable(sel_hard, dev_flags); } -void TwoWire::begin(uint8 self_addr) { - tx_buf_idx = 0; - tx_buf_overflow = false; - rx_buf_idx = 0; - rx_buf_len = 0; - pinMode(this->scl_pin, OUTPUT_OPEN_DRAIN); - pinMode(this->sda_pin, OUTPUT_OPEN_DRAIN); - - sclDevice = PIN_MAP[this->scl_pin].gpio_device; - sclBit = PIN_MAP[this->scl_pin].gpio_bit; - sdaDevice = PIN_MAP[this->sda_pin].gpio_device; - sdaBit = PIN_MAP[this->sda_pin].gpio_bit; - set_scl(HIGH); - set_sda(HIGH); +void HardWire::end() { + i2c_disable(sel_hard); + sel_hard = 0; } -void TwoWire::end() -{ - if (this->scl_pin) - { - pinMode(this->scl_pin, INPUT); - } - if (this->sda_pin) - { - pinMode(this->sda_pin, INPUT); - } -} - -void TwoWire::setClock(uint32_t frequencyHz) +void HardWire::setClock(uint32_t frequencyHz) { switch(frequencyHz) { case 400000: - i2c_delay = SOFT_FAST; + dev_flags |= I2C_FAST_MODE;// set FAST_MODE bit break; case 100000: default: - i2c_delay = SOFT_STANDARD; + dev_flags &= ~I2C_FAST_MODE;// clear FAST_MODE bit break; } + } -TwoWire::~TwoWire() { - this->scl_pin=0; - this->sda_pin=0; -} - -// Declare the instance that the users of the library can use -TwoWire Wire(SCL, SDA, SOFT_STANDARD); -//TwoWire Wire(PB6, PB7, SOFT_STANDARD); +HardWire Wire(1, I2C_FAST_MODE);; diff --git a/STM32F1/libraries/Wire/Wire.h b/STM32F1/libraries/Wire/Wire.h index 8fbddaae9..88d4a1bd4 100644 --- a/STM32F1/libraries/Wire/Wire.h +++ b/STM32F1/libraries/Wire/Wire.h @@ -25,139 +25,54 @@ *****************************************************************************/ /** - * @file Wire.h + * @file HardWire.h * @author Trystan Jones - * @brief Wire library, uses the WireBase to create the primary interface - * while keeping low level interactions invisible to the user. + * @brief Wire library, uses the hardware I2C available in the Maple to + * interact with I2C slave devices. */ /* - * Library updated by crenn to follow new Wire system. - * Code was derived from the original Wire for maple code by leaflabs and the - * modifications by gke and ala42. + * Library created by crenn to use the new WireBase system and allow Arduino + * users easy interaction with the I2C Hardware in a familiar method. */ -#ifndef _WIRE_H_ -#define _WIRE_H_ +#ifndef _HARDWIRE_H_ +#define _HARDWIRE_H_ #include "WireBase.h" #include "wirish.h" +#include -/* - * On the Maple, let the default pins be in the same location as the Arduino - * pins - */ -#define SDA PB7 -#define SCL PB6 - -#define SOFT_STANDARD 19 -#define SOFT_FAST 0 - - -//#define I2C_DELAY(x) {uint32 time=micros(); while(time>(micros()+x));} -#define I2C_DELAY(x) do{for(int i=0;i +#include HardWire HWire(1, I2C_FAST_MODE); // I2c1 diff --git a/STM32F1/libraries/Wire/examples/i2c_scanner_softwire/i2c_scanner_softwire.ino b/STM32F1/libraries/Wire/examples/i2c_scanner_softwire/i2c_scanner_softwire.ino new file mode 100644 index 000000000..0b4580a1e --- /dev/null +++ b/STM32F1/libraries/Wire/examples/i2c_scanner_softwire/i2c_scanner_softwire.ino @@ -0,0 +1,54 @@ +// -------------------------------------- +// i2c_scanner +// +// + +#include + +TwoWire SWire(PB6, PB7, SOFT_FAST); + + +void setup() { + Serial.begin(115200); + SWire.begin(); + Serial.println("\nSoftware I2C.. Scanner"); +} + + +void loop() { + byte error, address; + int nDevices; + + Serial.println("Scanning..."); + + nDevices = 0; + for(address = 1; address < 127; address++) { + // The i2c_scanner uses the return value of + // the Write.endTransmisstion to see if + // a device did acknowledge to the address. + + SWire.beginTransmission(address); + error = SWire.endTransmission(); + + if (error == 0) { + Serial.print("I2C device found at address 0x"); + if (address < 16) + Serial.print("0"); + Serial.println(address, HEX); + + nDevices++; + } + else if (error == 4) { + Serial.print("Unknown error at address 0x"); + if (address < 16) + Serial.print("0"); + Serial.println(address, HEX); + } + } + if (nDevices == 0) + Serial.println("No I2C devices found"); + else + Serial.println("done"); + + delay(5000); // wait 5 seconds for next scan +} \ No newline at end of file From 859a447ecfb74a4a2b173d05e8e956e23a8aa05a Mon Sep 17 00:00:00 2001 From: Cristi Marius Tiutiu Date: Tue, 1 Aug 2017 10:35:47 +0300 Subject: [PATCH 163/307] linux fix for gd32 variant in boards.txt --- STM32F1/boards.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 9cef20747..b3eac901f 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -931,7 +931,7 @@ hytiny-stm32f103t.menu.opt.ogstd.build.flags.ldspecs= ###################### Generic GD32F103C ######################################## genericGD32F103C.name=Generic GD32F103C series -genericGD32F103C.build.variant=generic_GD32f103c +genericGD32F103C.build.variant=generic_gd32f103c genericGD32F103C.build.vect=VECT_TAB_ADDR=0x8000000 genericGD32F103C.build.core=maple genericGD32F103C.build.board=GENERIC_GD32F103C @@ -1086,4 +1086,4 @@ STM32VLD.menu.opt.o3lto.build.flags.ldspecs=-flto STM32VLD.menu.opt.ogstd.build.flags.optimize=-Og STM32VLD.menu.opt.ogstd.build.flags.ldspecs= -################################################################################ \ No newline at end of file +################################################################################ From 0a9d06b5e5398588df747dcc8c5a5399cf0b157b Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 3 Aug 2017 09:28:14 +1000 Subject: [PATCH 164/307] Fix typo in dma.h (thanks to @stevestrong) --- STM32F1/system/libmaple/stm32f1/include/series/dma.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/system/libmaple/stm32f1/include/series/dma.h b/STM32F1/system/libmaple/stm32f1/include/series/dma.h index ff6185795..56e559ba9 100644 --- a/STM32F1/system/libmaple/stm32f1/include/series/dma.h +++ b/STM32F1/system/libmaple/stm32f1/include/series/dma.h @@ -152,7 +152,7 @@ typedef struct dma_tube_reg_map { #define DMA_ISR_TEIF (1 << DMA_ISR_TEIF_BIT) #define DMA_ISR_HTIF (1 << DMA_ISR_HTIF_BIT) -#define DMA_ISR_TCID (1 << DMA_ISR_TCIF_BIT) +#define DMA_ISR_TCIF (1 << DMA_ISR_TCIF_BIT) #define DMA_ISR_GIF (1 << DMA_ISR_GIF_BIT) #define DMA_ISR_TEIF7_BIT 27 From 1ea988a57d0d5923967722e4cee092db496892c0 Mon Sep 17 00:00:00 2001 From: victorpv Date: Thu, 3 Aug 2017 11:47:15 -0500 Subject: [PATCH 165/307] Correcting FreeRTOS900 examples The examples were still including the 821 version of FreeRTOS, so changing them to include the right one. --- .../libraries/FreeRTOS900/examples/rtos_blink/rtos_blink.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/FreeRTOS900/examples/rtos_blink/rtos_blink.ino b/STM32F1/libraries/FreeRTOS900/examples/rtos_blink/rtos_blink.ino index a972b6c18..935c6294f 100644 --- a/STM32F1/libraries/FreeRTOS900/examples/rtos_blink/rtos_blink.ino +++ b/STM32F1/libraries/FreeRTOS900/examples/rtos_blink/rtos_blink.ino @@ -1,6 +1,6 @@ //#include //#include "libraries/FreeRTOS/MapleFreeRTOS.h" -#include +#include static void vLEDFlashTask(void *pvParameters) { for (;;) { From db9a70c74f76195f2a365482475e373a78f25f56 Mon Sep 17 00:00:00 2001 From: victorpv Date: Thu, 3 Aug 2017 11:48:26 -0500 Subject: [PATCH 166/307] Correcting FreeRTOS900 example. --- .../examples/rtos_display_blink/rtos_display_blink.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/FreeRTOS900/examples/rtos_display_blink/rtos_display_blink.ino b/STM32F1/libraries/FreeRTOS900/examples/rtos_display_blink/rtos_display_blink.ino index bd6c3e4e0..7d9210050 100644 --- a/STM32F1/libraries/FreeRTOS900/examples/rtos_display_blink/rtos_display_blink.ino +++ b/STM32F1/libraries/FreeRTOS900/examples/rtos_display_blink/rtos_display_blink.ino @@ -1,5 +1,5 @@ #define USE_SEMAPHORE_DMA1 -#include +#include #include #include #include From 8f7a0b6d5a47b70093a6f355f6ecf24e3e189f74 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 4 Aug 2017 20:34:48 +1000 Subject: [PATCH 167/307] Added pushColors() to ILI9341 library to better support the OV7670 camera --- .../Adafruit_ILI9341_STM.cpp | 17 +++++++++++++++++ .../Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h | 1 + 2 files changed, 18 insertions(+) diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp index db57b3e56..766b91034 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp @@ -386,6 +386,23 @@ void Adafruit_ILI9341_STM::pushColor(uint16_t color) { if (hwSPI) spi_end(); } +void Adafruit_ILI9341_STM::pushColors(void * colorBuffer, uint16_t nr_pixels, uint8_t async) +{ + *dcport |= dcpinmask; + *csport &= ~cspinmask; + + if (async==0) + { + SPI.dmaSend(colorBuffer, nr_pixels, 1); + *csport |= cspinmask; + } + else + { + SPI.dmaSendAsync(colorBuffer, nr_pixels, 1); + } + +} + void Adafruit_ILI9341_STM::drawPixel(int16_t x, int16_t y, uint16_t color) { if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return; diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h index 137b7a4b5..7ee395c6c 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h @@ -107,6 +107,7 @@ class Adafruit_ILI9341_STM : public Adafruit_GFX { void begin(void), setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1), pushColor(uint16_t color), + pushColors(void * colorBuffer, uint16_t nr_pixels, uint8_t async), fillScreen(uint16_t color), #if defined (__STM32F1__) drawLine(int16_t x0, int16_t y0,int16_t x1, int16_t y1, uint16_t color), From 33411b6e946dc0fc71420420f847c6bac6ce2aad Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 6 Aug 2017 21:04:02 +1000 Subject: [PATCH 168/307] Default Wire to 100khz --- STM32F1/libraries/Wire/Wire.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Wire/Wire.cpp b/STM32F1/libraries/Wire/Wire.cpp index d8252c1c0..c4e9befa7 100644 --- a/STM32F1/libraries/Wire/Wire.cpp +++ b/STM32F1/libraries/Wire/Wire.cpp @@ -100,4 +100,4 @@ void HardWire::setClock(uint32_t frequencyHz) } -HardWire Wire(1, I2C_FAST_MODE);; +HardWire Wire(1); From a9767e4c535e28ecf781f98fc8fbc85e134b406c Mon Sep 17 00:00:00 2001 From: victorpv Date: Fri, 18 Aug 2017 17:33:00 -0500 Subject: [PATCH 169/307] Adding new.cpp as in F1 core. This is to avoid libstdc++ being pulled in when new() is used. Already included in the F1 in 2016. Discussed on this thread: http://www.stm32duino.com/viewtopic.php?f=39&t=2460&p=33163 --- STM32F4/cores/maple/new.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 STM32F4/cores/maple/new.cpp diff --git a/STM32F4/cores/maple/new.cpp b/STM32F4/cores/maple/new.cpp new file mode 100644 index 000000000..7553ddf35 --- /dev/null +++ b/STM32F4/cores/maple/new.cpp @@ -0,0 +1,35 @@ +/* + Copyright (c) 2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include + +void *operator new(size_t size) { + return malloc(size); +} + +void *operator new[](size_t size) { + return malloc(size); +} + +void operator delete(void * ptr) { + free(ptr); +} + +void operator delete[](void * ptr) { + free(ptr); +} From 71d5ab9112ab0c28e2c216a31b3a3ff05d0b1d37 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 25 Aug 2017 18:33:04 +1000 Subject: [PATCH 170/307] Wire lib change buffer size definition to BUFFER_LENGTH for better AVR compatibility --- STM32F1/libraries/Wire/SoftWire.h | 2 +- STM32F1/libraries/Wire/WireBase.cpp | 6 +++--- STM32F1/libraries/Wire/WireBase.h | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/STM32F1/libraries/Wire/SoftWire.h b/STM32F1/libraries/Wire/SoftWire.h index 0804c0f11..136dc3d8c 100644 --- a/STM32F1/libraries/Wire/SoftWire.h +++ b/STM32F1/libraries/Wire/SoftWire.h @@ -57,7 +57,7 @@ //#define I2C_DELAY(x) {uint32 time=micros(); while(time>(micros()+x));} #define I2C_DELAY(x) do{for(int i=0;i WIRE_BUFSIZ) { - num_bytes = WIRE_BUFSIZ; + if (num_bytes > BUFFER_LENGTH) { + num_bytes = BUFFER_LENGTH; } itc_msg.addr = address; itc_msg.flags = I2C_MSG_READ; @@ -96,7 +96,7 @@ uint8 WireBase::requestFrom(int address, int numBytes) { } void WireBase::write(uint8 value) { - if (tx_buf_idx == WIRE_BUFSIZ) { + if (tx_buf_idx == BUFFER_LENGTH) { tx_buf_overflow = true; return; } diff --git a/STM32F1/libraries/Wire/WireBase.h b/STM32F1/libraries/Wire/WireBase.h index 5e51ab78c..72facded6 100644 --- a/STM32F1/libraries/Wire/WireBase.h +++ b/STM32F1/libraries/Wire/WireBase.h @@ -44,7 +44,7 @@ #include "wirish.h" #include -#define WIRE_BUFSIZ 32 +#define BUFFER_LENGTH 32 /* return codes from endTransmission() */ #define SUCCESS 0 /* transmission was successful */ @@ -56,11 +56,11 @@ class WireBase { // Abstraction is awesome! protected: i2c_msg itc_msg; - uint8 rx_buf[WIRE_BUFSIZ]; /* receive buffer */ + uint8 rx_buf[BUFFER_LENGTH]; /* receive buffer */ uint8 rx_buf_idx; /* first unread idx in rx_buf */ uint8 rx_buf_len; /* number of bytes read */ - uint8 tx_buf[WIRE_BUFSIZ]; /* transmit buffer */ + uint8 tx_buf[BUFFER_LENGTH]; /* transmit buffer */ uint8 tx_buf_idx; // next idx available in tx_buf, -1 overflow boolean tx_buf_overflow; From 5058d8f5838b8b5b63ba21f0ea950585d849a4d3 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sat, 26 Aug 2017 14:37:40 +1000 Subject: [PATCH 171/307] Removed support for GD32 - by removing entry from boards.txt --- STM32F1/boards.txt | 91 ---------------------------------------------- 1 file changed, 91 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index b3eac901f..6d110d040 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -928,97 +928,6 @@ hytiny-stm32f103t.menu.opt.o3lto.build.flags.ldspecs=-flto hytiny-stm32f103t.menu.opt.ogstd.build.flags.optimize=-Og hytiny-stm32f103t.menu.opt.ogstd.build.flags.ldspecs= -###################### Generic GD32F103C ######################################## - -genericGD32F103C.name=Generic GD32F103C series -genericGD32F103C.build.variant=generic_gd32f103c -genericGD32F103C.build.vect=VECT_TAB_ADDR=0x8000000 -genericGD32F103C.build.core=maple -genericGD32F103C.build.board=GENERIC_GD32F103C -genericGD32F103C.upload.use_1200bps_touch=false -genericGD32F103C.upload.file_type=bin -genericGD32F103C.upload.auto_reset=true -genericGD32F103C.build.cpu_flags=-DMCU_STM32F103CB -genericGD32F103C.build.f_cpu=72000000L - -## GD32F103C8 ------------------------- -genericGD32F103C.menu.device_variant.GD32F103C8=GD32F103C8 (20k RAM. 64k Flash) -genericGD32F103C.menu.device_variant.GD32F103C8.build.ldscript=ld/jtag_c8.ld -genericGD32F103C.menu.device_variant.GD32F103C8.upload.maximum_size=65536 -genericGD32F103C.menu.device_variant.GD32F103C8.upload.maximum_data_size=20480 - -## GD32F103CB ------------------------- -genericGD32F103C.menu.device_variant.GD32F103CB=GD32F103CB (20k RAM. 128k Flash) -genericGD32F103C.menu.device_variant.GD32F103CB.build.ldscript=ld/jtag.ld -genericGD32F103C.menu.device_variant.GD32F103CB.upload.maximum_size=131072 -genericGD32F103C.menu.device_variant.GD32F103CB.upload.maximum_data_size=20480 - -#---------------------------- UPLOAD METHODS --------------------------- - -genericGD32F103C.menu.upload_method.DFUUploadMethod=GD32duino bootloader - -genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu -genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload -genericGD32F103C.menu.upload_method.DFUUploadMethod.build.upload_flags=-DSERIAL_USB -DGENERIC_BOOTLOADER -genericGD32F103C.menu.upload_method.DFUUploadMethod.build.vect=VECT_TAB_ADDR=0x8002000 -genericGD32F103C.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader_20.ld -genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 -genericGD32F103C.menu.upload_method.DFUUploadMethod.upload.altID=2 - -genericGD32F103C.menu.upload_method.serialMethod=Serial -genericGD32F103C.menu.upload_method.serialMethod.upload.protocol=maple_serial -genericGD32F103C.menu.upload_method.serialMethod.upload.tool=serial_upload -genericGD32F103C.menu.upload_method.serialMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 - -genericGD32F103C.menu.upload_method.STLinkMethod=STLink -genericGD32F103C.menu.upload_method.STLinkMethod.upload.protocol=STLink -genericGD32F103C.menu.upload_method.STLinkMethod.upload.tool=stlink_upload -genericGD32F103C.menu.upload_method.STLinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER - - -genericGD32F103C.menu.upload_method.BMPMethod=BMP (Black Magic Probe) -genericGD32F103C.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp -genericGD32F103C.menu.upload_method.BMPMethod.upload.tool=bmp_upload -genericGD32F103C.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG - -genericGD32F103C.menu.cpu_speed.speed_120mhz=120Mhz (overdrive) -genericGD32F103C.menu.cpu_speed.speed_120mhz.build.f_cpu=120000000L - -genericGD32F103C.menu.cpu_speed.speed_96mhz=96Mhz (Stable) -genericGD32F103C.menu.cpu_speed.speed_96mhz.build.f_cpu=96000000L - -genericGD32F103C.menu.cpu_speed.speed_72mhz=72Mhz (compatibility) -genericGD32F103C.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L - -#-- Optimizations -genericGD32F103C.menu.opt.osstd=Smallest (default) -genericGD32F103C.menu.opt.osstd.build.flags.optimize=-Os -genericGD32F103C.menu.opt.osstd.build.flags.ldspecs= -genericGD32F103C.menu.opt.oslto=Smallest Code with LTO -genericGD32F103C.menu.opt.oslto.build.flags.optimize=-Os -flto -genericGD32F103C.menu.opt.oslto.build.flags.ldspecs=-flto -genericGD32F103C.menu.opt.o1std=Fast (-O1) -genericGD32F103C.menu.opt.o1std.build.flags.optimize=-O1 -genericGD32F103C.menu.opt.o1std.build.flags.ldspecs= -genericGD32F103C.menu.opt.o1lto=Fast (-O1) with LTO -genericGD32F103C.menu.opt.o1lto.build.flags.optimize=-O1 -flto -genericGD32F103C.menu.opt.o1lto.build.flags.ldspecs=-flto -genericGD32F103C.menu.opt.o2std=Faster (-O2) -genericGD32F103C.menu.opt.o2std.build.flags.optimize=-O2 -genericGD32F103C.menu.opt.o2std.build.flags.ldspecs= -genericGD32F103C.menu.opt.o2lto=Faster (-O2) with LTO -genericGD32F103C.menu.opt.o2lto.build.flags.optimize=-O2 -flto -genericGD32F103C.menu.opt.o2lto.build.flags.ldspecs=-flto -genericGD32F103C.menu.opt.o3std=Fastest (-O3) -genericGD32F103C.menu.opt.o3std.build.flags.optimize=-O3 -genericGD32F103C.menu.opt.o3std.build.flags.ldspecs= -genericGD32F103C.menu.opt.o3lto=Fastest (-O3) with LTO -genericGD32F103C.menu.opt.o3lto.build.flags.optimize=-O3 -flto -genericGD32F103C.menu.opt.ogstd=Debug (-g) -genericGD32F103C.menu.opt.o3lto.build.flags.ldspecs=-flto -genericGD32F103C.menu.opt.ogstd.build.flags.optimize=-Og -genericGD32F103C.menu.opt.ogstd.build.flags.ldspecs= - ########################### STM32VLD to FLASH ########################### STM32VLD.name=STM32VLD to FLASH From 47c94bc10ca54c8394f0ff800d6a88a4f90ace22 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sat, 26 Aug 2017 20:34:43 +1000 Subject: [PATCH 172/307] Update Arduino IDE version in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ffc9ed66..9d167cf79 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Use of these files is at your own risk. ## Summary: -This repo contains, the "Hardware" files to support STM32 based boards on Arduino version 1.6.13 or 1.6.12 (some older versions may also work) including [LeafLabs Maple, and Maple mini](http://www.leaflabs.com/about-maple/), and other generic STM32F103 boards +This repo contains, the "Hardware" files to support STM32 based boards on Arduino version 1.8.x (some older versions may also work) including [LeafLabs Maple, and Maple mini](http://www.leaflabs.com/about-maple/), and other generic STM32F103 boards ***PRIMARY SUPPORT FORUM: http://www.stm32duino.com/*** From e6ed2d5cccff1cf6ca4bd98ec42b4d02377587f3 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 29 Aug 2017 11:16:43 +0200 Subject: [PATCH 173/307] Update RTClock.cpp bugfix setAlarmATime - corrected day variable --- STM32F4/libraries/RTClock/src/RTClock.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F4/libraries/RTClock/src/RTClock.cpp b/STM32F4/libraries/RTClock/src/RTClock.cpp index e7c2ca8da..a6ef9f15e 100644 --- a/STM32F4/libraries/RTClock/src/RTClock.cpp +++ b/STM32F4/libraries/RTClock/src/RTClock.cpp @@ -281,7 +281,7 @@ void RTClock::setAlarmATime (tm_t * tm_ptr, bool hours_match, bool mins_match, b { uint32 t = 0; rtc_enter_config_mode(); - unsigned int bits = ((tm_ptr->day / 10) << 28) | ((tm.day % 10) << 24) | + unsigned int bits = ((tm_ptr->day / 10) << 28) | ((tm_ptr->day % 10) << 24) | ((tm_ptr->hour / 10) << 20) | ((tm_ptr->hour % 10) << 16) | ((tm_ptr->minute / 10) << 12) | ((tm_ptr->minute % 10) << 8) | ((tm_ptr->second / 10) << 4) | (tm_ptr->second % 10); From fbe6264003935b48cf12ff1790d0c11f3342edd6 Mon Sep 17 00:00:00 2001 From: csnol Date: Tue, 29 Aug 2017 10:07:42 -0500 Subject: [PATCH 174/307] Rewrite the RTClock library. --- STM32F1/libraries/RTClock/src/RTClock.cpp | 114 +++++++++++++++++++--- STM32F1/libraries/RTClock/src/RTClock.h | 63 ++++++++++-- 2 files changed, 157 insertions(+), 20 deletions(-) diff --git a/STM32F1/libraries/RTClock/src/RTClock.cpp b/STM32F1/libraries/RTClock/src/RTClock.cpp index 869e15219..f2f8501ef 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.cpp +++ b/STM32F1/libraries/RTClock/src/RTClock.cpp @@ -81,21 +81,108 @@ */ void RTClock::setTime (time_t time_stamp) { - rtc_set_count(time_stamp); + breakTime(time_stamp, tmm); // time will be broken to tm + setTime(tmm); + //rtc_set_count(time_stamp); } - void RTClock::setTime (struct tm* tm_ptr) { - rtc_set_count(mktime (tm_ptr)); - } + #define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) ) + //----------------------------------------------------------------------------- +void RTClock::breakTime(time_t timeInput, tm_t & tmm) +{ +// break the given time_t into time components +// this is a more compact version of the C library localtime function +// note that year is offset from 1970 !!! + + uint8_t year; + uint8_t month, monthLength; + uint32_t time; + uint32_t days; + + time = (uint32_t)timeInput; + tmm.second = time % 60; + time /= 60; // now it is minutes + tmm.minute = time % 60; + time /= 60; // now it is hours + tmm.hour = time % 24; + time /= 24; // now it is days + tmm.weekday = ((time + 4) % 7); // Monday is day 1 // + 1; // Sunday is day 1 + + year = 0; + days = 0; + while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { + year++; + } + tmm.year = year; // year is offset from 1970 + + days -= LEAP_YEAR(year) ? 366 : 365; + time -= days; // now it is days in this year, starting at 0 + + days = 0; + month = 0; + monthLength = 0; + for (month=0; month<12; month++) { + if (month==1) { // february + if (LEAP_YEAR(year)) { + monthLength=29; + } else { + monthLength=28; + } + } else { + monthLength = monthDays[month]; + } + + if (time >= monthLength) { + time -= monthLength; + } else { + break; + } + } + tmm.month = month + 1; // jan is month 1 + tmm.day = time + 1; // day of month +} + +//----------------------------------------------------------------------------- +time_t RTClock::makeTime(tm_t & tmm) +{ +// assemble time elements into time_t +// note year argument is offset from 1970 (see macros in time.h to convert to other formats) +// previous version used full four digit year (or digits since 2000),i.e. 2009 was 2009 or 9 + + int i; + uint32_t seconds; + + // seconds from 1970 till 1 jan 00:00:00 of the given year + seconds = tmm.year*(SECS_PER_DAY * 365); + for (i = 0; i < tmm.year; i++) { + if (LEAP_YEAR(i)) { + seconds += SECS_PER_DAY; // add extra days for leap years + } + } + + // add days for this year, months start from 1 + for (i = 1; i < tmm.month; i++) { + if ( (i == 2) && LEAP_YEAR(tmm.year)) { + seconds += SECS_PER_DAY * 29; + } else { + seconds += SECS_PER_DAY * monthDays[i-1]; //monthDay array starts from 0 + } + } + seconds+= (tmm.day-1) * SECS_PER_DAY; + seconds+= tmm.hour * SECS_PER_HOUR; + seconds+= tmm.minute * SECS_PER_MIN; + seconds+= tmm.second; + return (time_t)seconds; +} + time_t RTClock::getTime() { return rtc_get_count(); } - - struct tm* RTClock::getTime(struct tm* tm_ptr) { + + void RTClock::getTime(tm_t & tm_ptr) { time_t res = rtc_get_count(); - tm_ptr = gmtime(&res); //why not gmtime? - return tm_ptr; + breakTime(res, tm_ptr); } void RTClock::createAlarm(voidFuncPtr function, time_t alarm_time_t) { @@ -110,15 +197,16 @@ rtc_detach_interrupt(RTC_SECONDS_INTERRUPT); } - - void RTClock::createAlarm(voidFuncPtr function, tm* alarm_tm) { - time_t alarm = mktime(alarm_tm);//convert to time_t + + void RTClock::createAlarm(voidFuncPtr function, tm_t & alarm_tm) { + time_t alarm = makeTime(alarm_tm);//convert to time_t createAlarm(function, alarm); } //change alarm time - void RTClock::setAlarmTime (tm * tm_ptr) { - time_t time = mktime(tm_ptr);//convert to time_t + + void RTClock::setAlarmTime (tm_t & tm_ptr) { + time_t time = makeTime(tm_ptr);//convert to time_t rtc_set_alarm(time); //must be int... for standardization sake. } diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h index 443a30b5d..711992e1f 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -7,9 +7,35 @@ #ifndef _RTCLOCK_H_ #define _RTCLOCK_H_ +#define SECS_PER_MIN (60UL) +#define SECS_PER_HOUR (3600UL) +#define SECS_PER_DAY (SECS_PER_HOUR * 24UL) +#define DAYS_PER_WEEK (7UL) +#define SECS_PER_WEEK (SECS_PER_DAY * DAYS_PER_WEEK) +#define SECS_PER_YEAR (SECS_PER_WEEK * 52UL) +#define SECS_YR_2000 (946684800UL) // the time at the start of y2k +#define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) ) +#if !defined(__time_t_defined) // avoid conflict with newlib or other posix libc + #warning "Using private time_t definintion" + typedef uint32_t time_t; +#endif +static const unsigned char monthDays[]={31,28,31,30,31,30,31,31,30,31,30,31}; // API starts months from 1, this array starts from 0 +typedef struct tm_t { + uint8_t year; // years since 1970 + uint8_t month; // month of a year - [ 1 to 12 ] + uint8_t day; // day of a month - [ 1 to 31 ] + uint8_t weekday; // day of a week (first day is Sunday) - [ 0 to 6 ] + uint8_t pm; // AM: 0, PM: 1 + uint8_t hour; // hour of a day - [ 0 to 23 ] + uint8_t minute; // minute of an hour - [ 0 to 59 ] + uint8_t second; // second of a minute - [ 0 to 59 ] +} tm_t; + +static inline uint8_t bcd2bin(uint8_t b) { return ( (10*(b>>4)) + (b&0x0F) ); } +static inline uint8_t bin2bcd(uint8_t b) { return ( ((b/10)<<4) + (b%10) ); } class RTClock { public: @@ -18,24 +44,47 @@ class RTClock { RTClock(rtc_clk_src src, uint16 prescaler ); //~RTClock(); //to implement - + void breakTime(time_t epoch_time, tm_t & tmm); + time_t makeTime(tm_t & tmm); + void setTime (time_t time_stamp); - void setTime (struct tm * tm_ptr); + void setTime (tm_t & tmm); - struct tm* getTime(struct tm* tm_ptr); time_t getTime(); + void getTime(tm_t & tmm ); + #define now getTime + + uint8_t year(void) { getTime(tmm); return tmm.year; } + uint8_t month(void) { getTime(tmm); return tmm.month; } + uint8_t day(void) { getTime(tmm); return tmm.day; } + uint8_t weekday(void) { getTime(tmm); return tmm.weekday; } + uint8_t hour(void) { getTime(tmm); return tmm.hour; } + uint8_t minute(void) { getTime(tmm); return tmm.minute; } + uint8_t second(void) { getTime(tmm); return tmm.second; } + uint8_t isPM(void) { return ( hour()>=12 ); } + + uint8_t year(time_t t) { breakTime(t, tmm); return tmm.year; } + uint8_t month(time_t t) { breakTime(t, tmm); return tmm.month; } + uint8_t day(time_t t) { breakTime(t, tmm); return tmm.day; } + uint8_t weekday(time_t t) { breakTime(t, tmm); return tmm.weekday; } + uint8_t hour(time_t t) { breakTime(t, tmm); return tmm.hour; } + uint8_t minute(time_t t) { breakTime(t, tmm); return tmm.minute; } + uint8_t second(time_t t) { breakTime(t, tmm); return tmm.second; } + uint8_t isPM(time_t t) { return (hour(t)>=12); } void createAlarm(voidFuncPtr function, time_t alarm_time_t); - void createAlarm(voidFuncPtr function, struct tm* alarm_tm); + void createAlarm(voidFuncPtr function, struct tm_t & alarm_tm); void attachSecondsInterrupt(voidFuncPtr function); void detachSecondsInterrupt(); - void setAlarmTime (tm * tm_ptr); + void setAlarmTime (tm_t & tm_ptr); void setAlarmTime (time_t alarm_time); - //private: + + + tm_t tmm; +}; -} ; From 27f8e127a4d9bdd5c77c026088a3655b9e57f95a Mon Sep 17 00:00:00 2001 From: csnol Date: Tue, 29 Aug 2017 23:13:02 +0800 Subject: [PATCH 175/307] Create a RTC example for new library. --- .../examples/RTC-Serial-Set-Newlibrary.ino | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 STM32F1/libraries/RTClock/examples/RTC-Serial-Set-Newlibrary.ino diff --git a/STM32F1/libraries/RTClock/examples/RTC-Serial-Set-Newlibrary.ino b/STM32F1/libraries/RTClock/examples/RTC-Serial-Set-Newlibrary.ino new file mode 100644 index 000000000..ba89a4e02 --- /dev/null +++ b/STM32F1/libraries/RTClock/examples/RTC-Serial-Set-Newlibrary.ino @@ -0,0 +1,80 @@ +/* STM32F103C8 Black Pill ( PB12) + + Serialport set and display RTC clock , Write by CSNOL https://github.com/csnol/STM32-Examples + based on https://github.com/rogerclarkmelbourne/Arduino_STM32 + + 1. Blink on PB12 per 1s. + 2. change to your timezone in the sketch; . + 3. get Unix epoch time from https://www.epochconverter.com/ ; + 4. last step input the 10 bits number( example: 1503945555) to Serialport ; + 5. the clock will be reset to you wanted. + + ## Why the 10 bits Unix epoch time be used? +****Because I wanna connect to NTP server by ESP-8266. +****in the library. getNtpTime() will return this 10 bits Unix epoch time. +*/ + + +#include + +RTClock rtclock (RTCSEL_LSE); // initialise +time_t tt; +tm_t mtt = { 47, 8, 27, 0, 1, 20, 30, 30 }; +char weekday1[][7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; // 0,1,2,3,4,5,6 +uint8_t timeread[11]; +int timezone = 8 * 3600; // timezone -8 + DST +1 = -7 CA USA +time_t tt1; + +#define LED_PIN PB12 + +// This function is called in the attachSecondsInterrpt +void blink () +{ + digitalWrite(LED_PIN, !digitalRead(LED_PIN)); + tt++; +} + +void setup() +{ + Serial.begin(115200); + pinMode(LED_PIN, OUTPUT); + tt = rtclock.makeTime(mtt); + tt1 = tt; + rtclock.attachSecondsInterrupt(blink);// Call blink +} + + +int i = 0; +void loop() +{ + while (Serial.available()) + { timeread[i] = Serial.read(); + if (i < 11) { + i++; + } + else { + i = 0; + tt = (timeread[0] - '0') * 1000000000 + (timeread[1] - '0') * 100000000 + (timeread[2] - '0') * 10000000 + (timeread[3] - '0') * 1000000 + (timeread[4] - '0') * 100000; + tt += (timeread[5] - '0') * 10000 + (timeread[6] - '0') * 1000 + (timeread[7] - '0') * 100 + (timeread[8] - '0') * 10 + (timeread[9] - '0') + timezone; + } + } + if (tt1 != tt) + { + tt1 = tt; + rtclock.breakTime(tt, mtt); + Serial.print("Date: "); + Serial.print(mtt.day); + Serial.print("- "); + Serial.print(mtt.month); + Serial.print(" "); + Serial.print(mtt.year + 1970); + Serial.print(" "); + Serial.print(weekday1[mtt.weekday]); + Serial.print(" Time: "); + Serial.print(mtt.hour); + Serial.print(" : "); + Serial.print(mtt.minute); + Serial.print(" : "); + Serial.println(mtt.second); + } +} From 6e92ddd8bc0a723359a52d86a3cd004be178385d Mon Sep 17 00:00:00 2001 From: csnol Date: Tue, 29 Aug 2017 10:30:27 -0500 Subject: [PATCH 176/307] Add STM32F103-RTC-Serial-Set.jpg --- .../examples/STM32F103-RTC-Serial-Set.jpg | Bin 0 -> 131470 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 STM32F1/libraries/RTClock/examples/STM32F103-RTC-Serial-Set.jpg diff --git a/STM32F1/libraries/RTClock/examples/STM32F103-RTC-Serial-Set.jpg b/STM32F1/libraries/RTClock/examples/STM32F103-RTC-Serial-Set.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2e701ea9e4789dd48ad0bbfe2c93534d7c61c19 GIT binary patch literal 131470 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 AO$pHf*yADG%HUemy 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%0ACJfMVz1%{y?hP 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 literal 0 HcmV?d00001 From 6c0be70f2efa2706e8ad0eb617dcb9226c0d335e Mon Sep 17 00:00:00 2001 From: csnol Date: Wed, 30 Aug 2017 23:28:01 +0800 Subject: [PATCH 177/307] Update RTClock.cpp --- STM32F1/libraries/RTClock/src/RTClock.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/STM32F1/libraries/RTClock/src/RTClock.cpp b/STM32F1/libraries/RTClock/src/RTClock.cpp index f2f8501ef..5baaa40a1 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.cpp +++ b/STM32F1/libraries/RTClock/src/RTClock.cpp @@ -81,12 +81,16 @@ */ void RTClock::setTime (time_t time_stamp) { - breakTime(time_stamp, tmm); // time will be broken to tm - setTime(tmm); + breakTime(time_stamp, tmm); // time will be broken to tmm + setTime(tmm); //rtc_set_count(time_stamp); } - #define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) ) + void RTClock::setTime (time_t time_stamp) { + rtc_set_count(time_stamp); + } + +#define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) ) //----------------------------------------------------------------------------- void RTClock::breakTime(time_t timeInput, tm_t & tmm) From d53cacdb1ec2298382fec602164562690e815eec Mon Sep 17 00:00:00 2001 From: csnol Date: Wed, 30 Aug 2017 23:37:41 +0800 Subject: [PATCH 178/307] Update RTClock.cpp --- STM32F1/libraries/RTClock/src/RTClock.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STM32F1/libraries/RTClock/src/RTClock.cpp b/STM32F1/libraries/RTClock/src/RTClock.cpp index 5baaa40a1..cc7b63e8d 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.cpp +++ b/STM32F1/libraries/RTClock/src/RTClock.cpp @@ -80,9 +80,9 @@ } */ - void RTClock::setTime (time_t time_stamp) { - breakTime(time_stamp, tmm); // time will be broken to tmm - setTime(tmm); + void RTClock::setTime (tm_t & tmm) { + time_t mktm = makeTime(tmm); // time will be make to mktm + setTime(mktm); //rtc_set_count(time_stamp); } From f12bad6790eff27e7f107ca689298473153fdf49 Mon Sep 17 00:00:00 2001 From: Jan Chrillesen Date: Thu, 31 Aug 2017 20:54:29 +0200 Subject: [PATCH 179/307] add JLink upload support for OSX --- tools/macosx/jlink_upload | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 tools/macosx/jlink_upload diff --git a/tools/macosx/jlink_upload b/tools/macosx/jlink_upload new file mode 100755 index 000000000..a9e981026 --- /dev/null +++ b/tools/macosx/jlink_upload @@ -0,0 +1,9 @@ +#!/bin/bash + +echo erase > "$1".jlink +echo loadbin "$1" , 0x8000000 >> "$1".jlink +echo r >> "$1".jlink +echo q >> "$1".jlink + +/Applications/SEGGER/JLink/JLinkExe -device STM32F103C8 -if SWD -speed auto -CommanderScript "$1".jlink + From 58e50e7fd9062e45ec23d575a16cd411522c37cb Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 3 Sep 2017 10:51:08 +1000 Subject: [PATCH 180/307] Add partial support for a DFU bootloader for the F4 --- STM32F4/boards.txt | 26 ++++++++++++++++++- STM32F4/cores/maple/libmaple/libmaple.h | 2 ++ STM32F4/platform.txt | 10 +++---- .../generic_f407v/ld/bootloader_8004000.ld | 21 +++++++++++++++ 4 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 STM32F4/variants/generic_f407v/ld/bootloader_8004000.ld diff --git a/STM32F4/boards.txt b/STM32F4/boards.txt index abc40f02b..907e6f7f4 100644 --- a/STM32F4/boards.txt +++ b/STM32F4/boards.txt @@ -2,6 +2,7 @@ menu.usb_cfg=USB configuration menu.opt=Optimize +menu.upload_method=Upload method ############################################################## discovery_f407.name=STM32 Discovery F407 @@ -30,6 +31,7 @@ discovery_f407.build.density=STM32_HIGH_DENSITY discovery_f407.build.error_led_port=GPIOD discovery_f407.build.error_led_pin=14 discovery_f407.build.board=STM32DiscoveryF407 +discovery_f407.build.vect_flags=-DVECT_TAB_FLASH -DUSER_ADDR_ROM=(uint32)0x08000000 discovery_f407.menu.usb_cfg.usb_nc=USB inactive discovery_f407.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC @@ -92,16 +94,37 @@ generic_f407v.build.density=STM32_HIGH_DENSITY generic_f407v.build.error_led_port=GPIOA generic_f407v.build.error_led_pin=7 generic_f407v.build.board=STM32GenericF407VET6 +generic_f407v.build.vect_flags=-DVECT_TAB_FLASH -DUSER_ADDR_ROM=(uint32)0x08000000 generic_f407v.menu.usb_cfg.usb_nc=USB inactive generic_f407v.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC generic_f407v.menu.usb_cfg.usb_serial=USB serial (CDC) generic_f407v.menu.usb_cfg.usb_serial.build.cpu_flags=-DSERIAL_USB - generic_f407v.menu.usb_cfg.usb_msc=USB Mass Storage (MSC) generic_f407v.menu.usb_cfg.usb_msc.build.cpu_flags=-DUSB_MSC +#note STLink is the default from the main block of config above, so does not need settings for everything +generic_f407v.menu.upload_method.STLinkMethod=STLink +generic_f407v.menu.upload_method.STLinkMethod.upload.protocol=STLink +generic_f407v.menu.upload_method.STLinkMethod.upload.tool=stlink_upload +generic_f407v.menu.upload_method.STLinkMethod.upload.dfuse_addr=0x08004000 +generic_f407v.menu.upload_method.STLinkMethod.build.vect_flags=-DVECT_TAB_FLASH -DUSER_ADDR_ROM=(uint32)0x08000000 + + +generic_f407v.menu.upload_method.DFUUploadMethod=STM32duino bootloader +generic_f407v.menu.upload_method.DFUUploadMethod.upload.protocol=maple_dfu +generic_f407v.menu.upload_method.DFUUploadMethod.upload.tool=maple_upload +generic_f407v.menu.upload_method.DFUUploadMethod.build.vect_flags=-DVECT_TAB_FLASH -DUSER_ADDR_ROM=(uint32)0x08004000 +generic_f407v.menu.upload_method.DFUUploadMethod.build.ldscript=ld/bootloader_8004000.ld +generic_f407v.menu.upload_method.DFUUploadMethod.upload.usbID=1EAF:0003 +generic_f407v.menu.upload_method.DFUUploadMethod.upload.altID=2 + + + + + + #-- Optimizations generic_f407v.menu.opt.osstd=Smallest (default) generic_f407v.menu.opt.osstd.build.flags.optimize=-Os @@ -158,6 +181,7 @@ stm32f4stamp.build.density=STM32_HIGH_DENSITY stm32f4stamp.build.error_led_port=GPIOD stm32f4stamp.build.error_led_pin=14 stm32f4stamp.build.board=STM32F4StampF405 +stm32f4stamp.build.vect_flags=-DVECT_TAB_FLASH -DUSER_ADDR_ROM=(uint32)0x08000000 stm32f4stamp.menu.usb_cfg.usb_nc=USB inactive stm32f4stamp.menu.usb_cfg.usb_nc.build.cpu_flags=-DUSB_NC diff --git a/STM32F4/cores/maple/libmaple/libmaple.h b/STM32F4/cores/maple/libmaple/libmaple.h index 8360ba390..2ec0b2836 100644 --- a/STM32F4/cores/maple/libmaple/libmaple.h +++ b/STM32F4/cores/maple/libmaple/libmaple.h @@ -47,7 +47,9 @@ #define STACK_TOP 0x20000800 #elif defined(BOARD_freeflight) */ +#ifndef USER_ADDR_ROM #define USER_ADDR_ROM 0x08000000 +#endif #define USER_ADDR_RAM 0x20000C00 #define STACK_TOP 0x20000800 /* diff --git a/STM32F4/platform.txt b/STM32F4/platform.txt index 92dc1ea9a..d115210cc 100755 --- a/STM32F4/platform.txt +++ b/STM32F4/platform.txt @@ -10,13 +10,13 @@ version=0.1.0 # ---------------------- compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -g {build.flags.optimize} -Wall -MMD -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.c.flags=-c -g {build.flags.optimize} -Wall -MMD -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_{build.variant} {build.vect_flags} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.c.elf.cmd=arm-none-eabi-g++ compiler.c.elf.flags={build.flags.optimize} -Wl,--gc-sections {build.flags.ldspecs} compiler.S.cmd=arm-none-eabi-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -g {build.flags.optimize} -Wall -MMD -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} -D{build.vect} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} +compiler.cpp.flags=-c -g {build.flags.optimize} -Wall -MMD -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_{build.variant} {build.vect_flags} -DERROR_LED_PORT={build.error_led_port} -DERROR_LED_PIN={build.error_led_pin} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs compiler.objcopy.cmd=arm-none-eabi-objcopy @@ -64,13 +64,13 @@ compiler.libs.c.flags="-I{build.system.path}/libmaple" "-I{build.core.path}/libm # --------------------- ## Compile c files -recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {build.cpu_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" +recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {build.cpu_flags} {build.vect_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" ## Compile c++ files -recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {build.cpu_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" +recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {build.cpu_flags} {build.vect_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" ## Compile S files -recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.S.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {build.cpu_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" +recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.S.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {build.cpu_flags} {build.vect_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" ## Create archives recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}" diff --git a/STM32F4/variants/generic_f407v/ld/bootloader_8004000.ld b/STM32F4/variants/generic_f407v/ld/bootloader_8004000.ld new file mode 100644 index 000000000..677683e24 --- /dev/null +++ b/STM32F4/variants/generic_f407v/ld/bootloader_8004000.ld @@ -0,0 +1,21 @@ +/* + * STM32F4xx high density linker script for + * JTAG (bare metal, no bootloader) builds. + */ + +MEMORY +{ + ccmram (rw): ORIGIN = 0x10000000, LENGTH = 64K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K + rom (rx) : ORIGIN = 0x08004000, LENGTH = 496K +} + +/* GROUP(libcs3_stm32_high_density.a) */ + +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +_FLASH_BUILD = 1; +INCLUDE common.inc From b1e1782019265992abf115a513be6facec68d259 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 3 Sep 2017 11:00:16 +1000 Subject: [PATCH 181/307] Fix for map() function - supplied by @Pito --- STM32F1/cores/maple/wirish_math.h | 11 ++++++----- STM32F4/cores/maple/wirish_math.h | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/STM32F1/cores/maple/wirish_math.h b/STM32F1/cores/maple/wirish_math.h index 9140d066e..b85253fb5 100644 --- a/STM32F1/cores/maple/wirish_math.h +++ b/STM32F1/cores/maple/wirish_math.h @@ -79,11 +79,12 @@ long random(long min, long max); * @param toEnd the end of the value's mapped range. * @return the mapped value. */ -static inline long map(long value, long fromStart, long fromEnd, - long toStart, long toEnd) { - return (value - fromStart) * (toEnd - toStart) / (fromEnd - fromStart) + - toStart; -} + // Fix by Pito 9/2017 + static inline int32_t map(int32_t value, int32_t fromStart, int32_t fromEnd, + int32_t toStart, int32_t toEnd) { + return ((int64_t)(value - fromStart) * (toEnd - toStart)) / (fromEnd - fromStart) + + toStart; + } #define PI 3.1415926535897932384626433832795 #define HALF_PI 1.5707963267948966192313216916398 diff --git a/STM32F4/cores/maple/wirish_math.h b/STM32F4/cores/maple/wirish_math.h index 0b8b22260..e0373728d 100644 --- a/STM32F4/cores/maple/wirish_math.h +++ b/STM32F4/cores/maple/wirish_math.h @@ -78,11 +78,12 @@ long random(long min, long max); * @param toEnd the end of the value's mapped range. * @return the mapped value. */ -static inline long map(long value, long fromStart, long fromEnd, - long toStart, long toEnd) { - return (value - fromStart) * (toEnd - toStart) / (fromEnd - fromStart) + - toStart; -} + // Fix by Pito 9/2017 + static inline int32_t map(int32_t value, int32_t fromStart, int32_t fromEnd, + int32_t toStart, int32_t toEnd) { + return ((int64_t)(value - fromStart) * (toEnd - toStart)) / (fromEnd - fromStart) + + toStart; + } #define PI 3.1415926535897932384626433832795 #define HALF_PI 1.5707963267948966192313216916398 From 56abaa31735b0c7137cedef5484178cd0855866e Mon Sep 17 00:00:00 2001 From: victorpv Date: Mon, 4 Sep 2017 10:41:58 -0500 Subject: [PATCH 182/307] Correction to upload issue in Sloeber As discussed in http://stm32duino.com/viewtopic.php?f=41&t=2535 Changes to the Generic Boards options so the maple dfu option is the default one and Sloeber uploads correctly. --- STM32F1/boards.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 6d110d040..10379ec55 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -357,6 +357,8 @@ genericSTM32F103C.build.board=GENERIC_STM32F103C genericSTM32F103C.upload.use_1200bps_touch=false genericSTM32F103C.upload.file_type=bin genericSTM32F103C.upload.auto_reset=true +genericSTM32F103C.upload.tool=maple_upload +genericSTM32F103C.upload.protocol=maple_dfu ## STM32F103C8 ------------------------- genericSTM32F103C.menu.device_variant.STM32F103C8=STM32F103C8 (20k RAM. 64k Flash) @@ -454,6 +456,8 @@ genericSTM32F103R.build.board=GENERIC_STM32F103R genericSTM32F103R.upload.use_1200bps_touch=false genericSTM32F103R.upload.file_type=bin genericSTM32F103R.upload.auto_reset=true +genericSTM32F103R.upload.tool=maple_upload +genericSTM32F103R.upload.protocol=maple_dfu genericSTM32F103R.menu.device_variant.STM32F103R8=STM32F103R8 (20k RAM. 64k Flash) genericSTM32F103R.menu.device_variant.STM32F103R8.build.variant=generic_stm32f103r8 @@ -563,6 +567,8 @@ genericSTM32F103T.build.board=GENERIC_STM32F103T genericSTM32F103T.upload.use_1200bps_touch=false genericSTM32F103T.upload.file_type=bin genericSTM32F103T.upload.auto_reset=true +genericSTM32F103T.upload.tool=maple_upload +genericSTM32F103T.upload.protocol=maple_dfu ## STM32F103T8 ------------------------- genericSTM32F103T.menu.device_variant.STM32F103T8=STM32F103T8 (20k RAM. 64k Flash) @@ -655,6 +661,8 @@ genericSTM32F103V.build.board=GENERIC_STM32F103V genericSTM32F103V.upload.use_1200bps_touch=false genericSTM32F103V.upload.file_type=bin genericSTM32F103V.upload.auto_reset=true +genericSTM32F103V.upload.tool=maple_upload +genericSTM32F103V.upload.protocol=maple_dfu genericSTM32F103V.build.error_led_port=GPIOE genericSTM32F103V.build.error_led_pin=6 @@ -754,6 +762,8 @@ genericSTM32F103Z.build.board=GENERIC_STM32F103Z genericSTM32F103Z.upload.use_1200bps_touch=false genericSTM32F103Z.upload.file_type=bin genericSTM32F103Z.upload.auto_reset=true +genericSTM32F103Z.upload.tool=maple_upload +genericSTM32F103Z.upload.protocol=maple_dfu genericSTM32F103Z.menu.device_variant.STM32F103ZC=STM32F103ZC genericSTM32F103Z.menu.device_variant.STM32F103ZC.build.cpu_flags=-DMCU_STM32F103ZC From 81100beeea63040ff429ac87420f1162bcaf909c Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 5 Sep 2017 17:03:16 +1000 Subject: [PATCH 183/307] Updated readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9d167cf79..9493be94e 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ This software is experimental and a work in progress. Under no circumstances should these files be used in relation to any critical system(s). Use of these files is at your own risk. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ## Summary: This repo contains, the "Hardware" files to support STM32 based boards on Arduino version 1.8.x (some older versions may also work) including [LeafLabs Maple, and Maple mini](http://www.leaflabs.com/about-maple/), and other generic STM32F103 boards From f769556e9a5d74161bba2daff09ea8d25ab216cc Mon Sep 17 00:00:00 2001 From: victorpv Date: Mon, 11 Sep 2017 21:25:09 -0500 Subject: [PATCH 184/307] F1 SDIO initial version --- STM32F1/libraries/SDIO/SdioF1.cpp | 852 ++++++++++++++++++++++++++++++ 1 file changed, 852 insertions(+) create mode 100644 STM32F1/libraries/SDIO/SdioF1.cpp diff --git a/STM32F1/libraries/SDIO/SdioF1.cpp b/STM32F1/libraries/SDIO/SdioF1.cpp new file mode 100644 index 000000000..8957b37d3 --- /dev/null +++ b/STM32F1/libraries/SDIO/SdioF1.cpp @@ -0,0 +1,852 @@ +/* Arduino SdCard Library + * Copyright (C) 2016 by William Greiman + * + * This file is part of the Arduino SdSpiCard Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdSpiCard Library. If not, see + * . + */ + +#include "SdioF1.h" +#include +#include +#include + + +#define USE_DEBUG_MODE 0 +#define USE_YIELD 0 + +//============================================================================== +//#define SDHC_PROCTL_DTW_4BIT 0x01 +#define CMD8_RETRIES 10 +#define BUSY_TIMEOUT_MILLIS 1500 +//============================================================================== +#define CMD_RESP_NONE SDIO_CMD_WAIT_NO_RESP +#define CMD_RESP_R1 SDIO_CMD_WAIT_SHORT_RESP // normal response +#define CMD_RESP_R1b SDIO_CMD_WAIT_SHORT_RESP // normal response + busy data line (optional) +#define CMD_RESP_R2 SDIO_CMD_WAIT_LONG_RESP // CID, CSD +#define CMD_RESP_R3 SDIO_CMD_WAIT_SHORT_RESP // OCR register, response to ACMD41 +#define CMD_RESP_R6 SDIO_CMD_WAIT_SHORT_RESP // published RCA response, response to CMD3 +#define CMD_RESP_R7 SDIO_CMD_WAIT_SHORT_RESP // response to CMD8 + +#define CMD0_XFERTYP (uint16_t)( CMD0 | CMD_RESP_NONE ) +#define CMD2_XFERTYP (uint16_t)( CMD2 | CMD_RESP_R2 ) +#define CMD3_XFERTYP (uint16_t)( CMD3 | CMD_RESP_R6 ) +#define CMD6_XFERTYP (uint16_t)( CMD6 | CMD_RESP_R1 ) +#define ACMD6_XFERTYP (uint16_t)( ACMD6 | CMD_RESP_R1 ) +#define CMD7_XFERTYP (uint16_t)( CMD7 | CMD_RESP_R1b ) +#define CMD8_XFERTYP (uint16_t)( CMD8 | CMD_RESP_R7 ) +#define CMD9_XFERTYP (uint16_t)( CMD9 | CMD_RESP_R2 ) +#define CMD10_XFERTYP (uint16_t)( CMD10 | CMD_RESP_R2 ) +#define CMD12_XFERTYP (uint16_t)( CMD12 | CMD_RESP_R1b ) +#define CMD13_XFERTYP (uint16_t)( CMD13 | CMD_RESP_R1 ) +#define CMD17_XFERTYP (uint16_t)( CMD17 | CMD_RESP_R1 ) +#define CMD18_XFERTYP (uint16_t)( CMD18 | CMD_RESP_R1 ) +#define ACMD23_XFERTYP (uint16_t)( ACMD23 | CMD_RESP_R1 ) +#define CMD24_XFERTYP (uint16_t)( CMD24 | CMD_RESP_R1 ) +#define CMD25_XFERTYP (uint16_t)( CMD25 | CMD_RESP_R1 ) +#define CMD32_XFERTYP (uint16_t)( CMD32 | CMD_RESP_R1 ) +#define CMD33_XFERTYP (uint16_t)( CMD32 | CMD_RESP_R1 ) +#define CMD38_XFERTYP (uint16_t)( CMD38 | CMD_RESP_R1b ) +#define ACMD41_XFERTYP (uint16_t)( ACMD41 | CMD_RESP_R3 ) + +#define CMD55_XFERTYP (uint16_t)( CMD55 | CMD_RESP_R1 ) + +//============================================================================= +//static void enableGPIO(bool enable); +//static void enableDmaIrs(); +static void initSDHC(void); +static bool isBusyCMD13(void); +static bool isBusyTransferComplete(void); +//static bool isBusyCommandComplete(); +//static bool isBusyCommandInhibit(); +static bool readReg16(uint32_t xfertyp, void* data); +//static void setSdclk(uint32_t kHzMax); +static bool yieldTimeout(bool (*fcn)(void)); +static bool waitDmaStatus(void); +static bool waitTimeout(bool (*fcn)(void)); +//----------------------------------------------------------------------------- +#define TRX_RD 0 +#define TRX_WR 1 +static uint8_t m_dir = TRX_RD; +static bool (*m_busyFcn)() = 0; +static bool m_initDone = false; +static uint32_t m_lba; // for raw non-DMA read(write)Start, read(write)Data, read(write)Stop +static uint32_t m_cnt; // for raw non-DMA read(write)Start, read(write)Data, read(write)Stop +static bool m_version2; +static bool m_highCapacity; +static uint8_t m_errorCode = SD_CARD_ERROR_INIT_NOT_CALLED; +static uint32_t m_errorLine = 0; +static uint32_t m_rca; +//static volatile bool m_dmaBusy = false; +static volatile uint32_t m_irqstat; +static uint32_t m_sdClkKhz = 0; +static uint32_t m_ocr; +static cid_t m_cid; +static csd_t m_csd; +static uint32_t t = 0; +//============================================================================= +/* + * Todo Remove this or change it, but rather remove since this can be checked with debugger. + */ +#if USE_DEBUG_MODE +#define DBG_PRINT() { \ + Serial.write('_'); Serial.print(__FUNCTION__); Serial.write('_'); Serial.print(__LINE__); Serial.print(": "); \ + Serial.print("DMA->LISR: "); Serial.print(SDIO_DMA_DEV->regs->LISR, HEX); \ + /*Serial.print("DMA->HISR: "); Serial.println(SDIO_DMA_DEV->regs->HISR, HEX);*/ \ + Serial.print(", DMA->CR: "); Serial.print(SDIO_DMA_DEV->regs->STREAM[SDIO_DMA_CHANNEL].CR, HEX); \ + Serial.print(", DMA->NDTR: "); Serial.print(SDIO_DMA_DEV->regs->STREAM[SDIO_DMA_CHANNEL].NDTR, HEX); \ + /**/Serial.print(", DMA->PAR: "); Serial.print(SDIO_DMA_DEV->regs->STREAM[SDIO_DMA_CHANNEL].PAR, HEX); \ + /**/Serial.print(", DMA->M0AR: "); Serial.print(SDIO_DMA_DEV->regs->STREAM[SDIO_DMA_CHANNEL].M0AR, HEX); \ + Serial.print(", DMA->FCR: "); Serial.print(SDIO_DMA_DEV->regs->STREAM[SDIO_DMA_CHANNEL].FCR, HEX); \ + \ + /*Serial.print(" SDIO->POWER: "); Serial.println(SDIO->POWER, HEX);*/ \ + Serial.print(", SDIO->CLKCR: "); Serial.print(SDIO->CLKCR, HEX); \ + Serial.print(", SDIO->DTIMER: "); Serial.print(SDIO->DTIMER, HEX); \ + Serial.print(", SDIO->DCTRL: "); Serial.print(SDIO->DCTRL, HEX); \ + /**/Serial.print(", SDIO->DLEN: "); Serial.print(SDIO->DLEN); \ + Serial.print(", SDIO->DCOUNT: "); Serial.print(SDIO->DCOUNT); \ + Serial.print(", SDIO->STA: "); Serial.println(SDIO->STA, HEX); \ + /*delay(1);*/ \ +} +#define DBG_PIN PD0 + +#else // USE_DEBUG_MODE +#define DBG_PRINT() +#endif // USE_DEBUG_MODE + +/*****************************************************************************/ +static void _panic(const char *message, uint32_t code) +{ + Serial.print(message); Serial.println(code, HEX); + //Block the execution with blinky leds + while (1); +/* + pinMode(BOARD_LED_PIN, OUTPUT); + //pinMode(BOARD_LED2_PIN, OUTPUT); + while (1) { + digitalWrite(BOARD_LED_PIN, HIGH); + //digitalWrite(BOARD_LED2_PIN, LOW); + delay(250); + digitalWrite(BOARD_LED_PIN, LOW); + //digitalWrite(BOARD_LED2_PIN, HIGH); + delay(250); + } + */ +} +/*===========================================================================*/ +/* + * Todo: Change the DMA parts so it works with F1 DMA, but since yield is disabled, we can ignore it for now. +*/ + +#if USE_YIELD +void yield(void) +{ + uint32_t val = SDIO->STA; + if ( val & SDIO_STA_TRX_ERROR_FLAGS ) { + Serial.print("SDIO ERROR:: SDIO->CLKCR: "); Serial.print(SDIO->CLKCR, HEX); \ + Serial.print(", SDIO->DTIMER: "); Serial.print(SDIO->DTIMER, HEX); \ + Serial.print(", SDIO->DCTRL: "); Serial.print(SDIO->DCTRL, HEX); \ + Serial.print(", SDIO->DLEN: "); Serial.print(SDIO->DLEN); \ + Serial.print(", SDIO->DCOUNT: "); Serial.print(SDIO->DCOUNT); \ + Serial.print(", SDIO->STA: "); Serial.print(SDIO->STA, HEX); \ + Serial.print(", SDIO->RESP0: "); Serial.println(SDIO->RESP[0], HEX); \ + if (val & SDIO_STA_STBITERR) Serial.print(" STBITERR"); + if (val & SDIO_STA_RXOVERR) Serial.print(" RXOVERR"); + if (val & SDIO_STA_TXUNDERR) Serial.print(" TXUNDERR"); + if (val & SDIO_STA_DTIMEOUT) Serial.print(" DTIMEOUT"); + if (val & SDIO_STA_DCRCFAIL) Serial.print(" DCRCFAIL"); + _panic(" - SDIO: Data Transmission Error ", val); + } + + val = dma_get_isr_bits(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + if ( val & DMA_ISR_FEIF ) { + val ^= DMA_ISR_FEIF; + dma_clear_isr_bits(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + } + if ( val ) { + if (val & DMA_ISR_TEIF) Serial.print(" TEIF"); + if (val & DMA_ISR_DMEIF) Serial.print(" DMEIF"); + //if (val & DMA_ISR_FEIF) Serial.print(" FEIF"); + _panic(" - DMA: Data Transmission Error ", val); + } + //Serial.write('.'); +} +#endif +//============================================================================= +// Error function and macro. +inline bool setSdErrorCode(uint8_t code, uint32_t line) { + m_errorCode = code; + m_errorLine = line; + return false; // setSdErrorCode +} +#define sdError(code) setSdErrorCode(code, __LINE__) +//============================================================================= +/* ISR +void sdhc_isr() { + SDHC_IRQSIGEN = 0; + m_irqstat = SDHC_IRQSTAT; + SDHC_IRQSTAT = m_irqstat; + m_dmaBusy = false; +}*/ +//============================================================================= +// Static functions. +//----------------------------------------------------------------------------- +static bool cardCommand(uint16_t xfertyp, uint32_t arg) +{ +#if USE_DEBUG_MODE==2 + Serial.print("cardCommand: "); Serial.print(xfertyp&SDIO_CMD_CMDINDEX); Serial.print(", arg: "); Serial.print(arg, HEX); +#endif + uint8_t resp = sdio_cmd_send(xfertyp, arg); // returns non-zero if fails, zero if OK +#if USE_DEBUG_MODE==2 + Serial.print(", resp: "); Serial.print(resp, HEX); + Serial.print(", SDIO->STA: "); Serial.print(SDIO->STA, HEX); Serial.print(", cmd_resp: "); Serial.print(SDIO->RESP[0], HEX); + if ( (xfertyp&SDIO_CMD_WAIT_LONG_RESP)==SDIO_CMD_WAIT_LONG_RESP ) { + Serial.print(", "); Serial.print(SDIO->RESP[1], HEX); Serial.print(", "); Serial.print(SDIO->RESP[2], HEX); Serial.print(", "); Serial.println(SDIO->RESP[3], HEX); + } else Serial.println(); +#endif + return resp; // return non-zero when OK +} +//----------------------------------------------------------------------------- +static bool cardAcmd(uint32_t rca, uint32_t xfertyp, uint32_t arg) { + return cardCommand(CMD55_XFERTYP, rca) && cardCommand((uint16_t)xfertyp, arg); +} +/*---------------------------------------------------------------------------*/ +static bool cardCMD6(uint32_t arg, uint8_t* status) { + // CMD6 returns 64 bytes. + // use polling only for the moment + if (waitTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_CMD13); + } + // get the 64 bytes over data lines + sdio_setup_transfer(80000, 64, (SDIO_BLOCKSIZE_64 | SDIO_DIR_RX | SDIO_DCTRL_DTEN)); + + cardCommand(CMD6_XFERTYP, arg); + + // wait data Rx response + if (waitTimeout(isBusyTransferComplete)) { + return sdError(SD_CARD_ERROR_CMD6); + } +DBG_PRINT(); + // copy 64 bytes as 16 words from FIFO to buffer + for (uint8_t i=0; i<16; i++) { + *(uint32_t*)(&status[i<<2]) = SDIO->FIFO; + } + //SDIO->DCTRL = 0; // disable data controller + +#if USE_DEBUG_MODE + Serial.print("read data: "); for (uint8_t i=0; i<17; i++) { Serial.print(status[i], HEX); Serial.print(", "); } Serial.println(); +#endif +return true; +} +//----------------------------------------------------------------------------- +static void initSDHC(void) +{ + sdio_begin(); + DBG_PRINT(); +} +/*---------------------------------------------------------------------------*/ +static bool isBusyCMD13(void) { + if (!cardCommand(CMD13_XFERTYP, m_rca)) { // SEND_STATUS + // Caller will timeout. + return true; + } + return !(SDIO->RESP[0] & CARD_STATUS_READY_FOR_DATA); +} +/*---------------------------------------------------------------------------*/ +static bool isBusyDMA(void) +{ + uint8_t isr = dma_get_isr_bits(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + isr &= DMA_ISR_TCIF | DMA_ISR_TEIF; + //if (isr&DMA_ISR_TCIF) dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + return !(isr); // ignore transfer error flag +} +/*---------------------------------------------------------------------------*/ +static bool isBusyTransferComplete(void) +{ + uint32_t mask = SDIO->STA &(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS); +#if USE_DEBUG_MODE + if ( mask & SDIO_STA_TRX_ERROR_FLAGS ) { + Serial.print("XFER ERROR: SDIO->STA: "); Serial.print(SDIO->STA, HEX); + if (mask & SDIO_STA_STBITERR) Serial.print(" STBITERR"); + if (mask & SDIO_STA_RXOVERR) Serial.print(" RXOVERR"); + if (mask & SDIO_STA_TXUNDERR) Serial.print(" TXUNDERR"); + if (mask & SDIO_STA_DTIMEOUT) Serial.print(" DTIMEOUT"); + if (mask & SDIO_STA_DCRCFAIL) Serial.print(" DCRCFAIL"); + Serial.println(); + } +#endif + if (mask) { + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + return false; + } + return true; +} +/*---------------------------------------------------------------------------*/ +static void trxStart(uint8_t* buf, uint32_t n, uint8_t dir) +{ + m_dir = dir; + uint32_t flags = (SDIO_BLOCKSIZE_512 | SDIO_DCTRL_DTEN); + if (dir==TRX_RD) flags |= SDIO_DIR_RX; + // setup SDIO to transfer n blocks of 512 bytes + sdio_setup_transfer(0x00FFFFFF, n, flags); +} +/*---------------------------------------------------------------------------*/ +static bool trxStop() +{ + if (!cardCommand(CMD12_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD12); + } + if ( t ) { + Serial.print(", in "); Serial.println(millis()-t); + t = 0; + } + return true; +} +/*---------------------------------------------------------------------------*/ +static bool dmaTrxStart(uint8_t* buf, uint32_t n, uint8_t dir) +{ + m_dir = dir; + if ((3 & (uint32_t)buf) || n == 0) { // check alignment + _panic("- transferStart: unaligned buffer address ", (uint32_t)buf); + return sdError(SD_CARD_ERROR_DMA); + } + if (dir==TRX_RD && yieldTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_CMD13); + } + uint32_t flags = (SDIO_BLOCKSIZE_512 | SDIO_DCTRL_DMAEN | SDIO_DCTRL_DTEN); + if (dir==TRX_RD) flags |= SDIO_DIR_RX; + // setup SDIO to transfer n blocks of 512 bytes + sdio_setup_transfer(0x00FFFFFF, n, flags); + // setup SDIO_DMA_DEV stream 3 channel 4 + /* + * Moved to begin. + */ + //dma_init(SDIO_DMA_DEV); + /* + * Todo. Check this, channel must be disabled to change DMA priority, and seems like channel is not completing transfers + */ + //dma_set_priority(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, DMA_PRIORITY_VERY_HIGH); + flags = (DMA_MINC_MODE); + // not extra flag if read + if (dir!=TRX_RD) flags |= DMA_FROM_MEM;// write + dma_setup_transfer(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, &SDIO->FIFO, DMA_SIZE_32BITS, buf, DMA_SIZE_32BITS, flags); + dma_set_num_transfers(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, n>>2); // F1 DMA controller counts each word as 1 data item. + //dma_set_fifo_flags(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, (DMA_FCR_DMDIS | DMA_FCR_FTH_FULL)); // disable direct mode | threshold FULL + dma_clear_isr_bits(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + dma_enable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + return true; +} +/*---------------------------------------------------------------------------*/ +static bool dmaTrxEnd(bool multi_block) +{ + if ( !waitDmaStatus() ) { + DBG_PRINT(); + return sdError(SD_CARD_ERROR_DMA); + } + if ( waitTimeout(isBusyTransferComplete) ) { + if (m_dir==TRX_RD) + return sdError(SD_CARD_ERROR_READ_TIMEOUT); + else + return sdError(SD_CARD_ERROR_WRITE_TIMEOUT); + } + if (multi_block) { + return trxStop(); + } else { + if ( t ) { + Serial.print(", in "); Serial.println(millis()-t); + t = 0; + } + return true; + } +} +//----------------------------------------------------------------------------- +// Read 16 byte CID or CSD register. +static bool readReg16(uint32_t xfertyp, void* data) +{ + uint8_t* d = reinterpret_cast(data); + if (!cardCommand(xfertyp, m_rca)) { + return false; // Caller will set errorCode. + } + *(uint32_t*)(&d[0]) = __builtin_bswap32(SDIO->RESP[0]); + *(uint32_t*)(&d[4]) = __builtin_bswap32(SDIO->RESP[1]); + *(uint32_t*)(&d[8]) = __builtin_bswap32(SDIO->RESP[2]); + *(uint32_t*)(&d[12]) = __builtin_bswap32(SDIO->RESP[3]); + d[15] = 0; + return true; +} +/*---------------------------------------------------------------------------*/ +// Return true if timeout occurs. +static bool yieldTimeout(bool (*fcn)()) { + uint32_t m = millis(); + while (fcn()) { + if ((millis() - m) > BUSY_TIMEOUT_MILLIS) { + return true; + } + yield(); + } + return false; // Caller will set errorCode. +} +/*---------------------------------------------------------------------------*/ +static bool waitDmaStatus(void) +{ + if (yieldTimeout(isBusyDMA)) { + return false; // Caller will set errorCode. + } + return true; +} +/*---------------------------------------------------------------------------*/ +// Return true if timeout occurs. +static bool waitTimeout(bool (*fcn)(void)) { + uint32_t m = millis(); + while (fcn()) { + if ((millis() - m) > BUSY_TIMEOUT_MILLIS) { + return true; + } + delayMicroseconds(1); + } + return false; // Caller will set errorCode. +} + +uint32_t aligned[128]; // temporary buffer for misaligned buffers +//============================================================================= +bool SdioCard::begin(void) +{ + m_initDone = false; + m_errorCode = SD_CARD_ERROR_NONE; + m_highCapacity = false; + m_version2 = false; + +#if USE_DEBUG_MODE +pinMode(DBG_PIN, OUTPUT); +digitalWrite(DBG_PIN, HIGH); +delay(100); +#endif + // initialize controller. + initSDHC(); + + // initialize DMA device + dma_init(SDIO_DMA_DEV); + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); // Disable DMA in case it was left enabled from a previous use. + /* + * Todo. Check this, channel must be disabled to change DMA priority, and seems like channel is not completing transfers + */ + dma_set_priority(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, DMA_PRIORITY_VERY_HIGH); + + if (!cardCommand(CMD0_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD0); + } + // Try several times for case of reset delay. + for (uint32_t i = 0; i < CMD8_RETRIES; i++) { + if (cardCommand(CMD8_XFERTYP, 0X1AA)) { + if (SDIO->RESP[0] != 0X1AA) { + return sdError(SD_CARD_ERROR_CMD8); + } + m_version2 = true; + break; + } + } + uint32_t arg = m_version2 ? 0X40300000 : 0x00300000; + uint32_t m = millis(); + do { + if (!cardAcmd(0, ACMD41_XFERTYP, arg) || + ((millis() - m) > BUSY_TIMEOUT_MILLIS)) { + return sdError(SD_CARD_ERROR_ACMD41); + } + } while ((SDIO->RESP[0] & 0x80000000) == 0); + + m_ocr = SDIO->RESP[0]; + if (m_ocr & 0x40000000) { + // Is high capacity. + m_highCapacity = true; + } + if (!cardCommand(CMD2_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD2); + } + if (!cardCommand(CMD3_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD3); + } + m_rca = SDIO->RESP[0] & 0xFFFF0000; + if (!readReg16(CMD9_XFERTYP, &m_csd)) { + return sdError(SD_CARD_ERROR_CMD9); + } + if (!readReg16(CMD10_XFERTYP, &m_cid)) { + return sdError(SD_CARD_ERROR_CMD10); + } + if (!cardCommand(CMD7_XFERTYP, m_rca)) { + return sdError(SD_CARD_ERROR_CMD7); + } + // Set card to bus width four. + /* + if (!cardAcmd(m_rca, ACMD6_XFERTYP, 2)) { + return sdError(SD_CARD_ERROR_ACMD6); + } + sdio_set_dbus_width(SDIO_CLKCR_WIDBUS_4BIT); + */ + + // Determine if High Speed mode is supported and set frequency. + uint8_t status[64]; + // see "Physical Layer Simplified Specification Version 6.00", chapter 4.3.10, Table 4-13. + // Support Bits of Functions in Function Group 1: bits 415:400, which are bytes [12][13] + // Function Selection of Function Group 1: bits 379:376, which is low nibble of byte [16] + if (cardCMD6(0X00FFFFFF, status) && (2 & status[13]) && + cardCMD6(0X80FFFFF1, status) && (status[16] & 0XF) == 1) { + //Serial.println("\n*** 50MHz clock supported ***"); + } else { + //_panic("*** Only 25MHz clock supported! ***", 0); + } + + /* + * Todo Raise clock to 24Mhz once transfers work + */ + m_sdClkKhz = 24000; // set clock to 24MHz + sdio_set_clock(m_sdClkKhz*1000); + + m_initDone = true; + return true; +} +//----------------------------------------------------------------------------- +uint32_t SdioCard::cardSize(void) { + return sdCardCapacity(&m_csd); +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::erase(uint32_t firstBlock, uint32_t lastBlock) { + // check for single block erase + if (!m_csd.v1.erase_blk_en) { + // erase size mask + uint8_t m = (m_csd.v1.sector_size_high << 1) | m_csd.v1.sector_size_low; + if ((firstBlock & m) != 0 || ((lastBlock + 1) & m) != 0) { + // error card can't erase specified area + return sdError(SD_CARD_ERROR_ERASE_SINGLE_BLOCK); + } + } + if (!m_highCapacity) { + firstBlock <<= 9; + lastBlock <<= 9; + } + if (!cardCommand(CMD32_XFERTYP, firstBlock)) { + return sdError(SD_CARD_ERROR_CMD32); + } + if (!cardCommand(CMD33_XFERTYP, lastBlock)) { + return sdError(SD_CARD_ERROR_CMD33); + } + if (!cardCommand(CMD38_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD38); + } + if (waitTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_ERASE_TIMEOUT); + } + return true; +} +//----------------------------------------------------------------------------- +uint8_t SdioCard::errorCode() { + return m_errorCode; +} +//----------------------------------------------------------------------------- +uint32_t SdioCard::errorData() { + return m_irqstat; +} +//----------------------------------------------------------------------------- +uint32_t SdioCard::errorLine() { + return m_errorLine; +} +//----------------------------------------------------------------------------- +bool SdioCard::isBusy() { + return m_busyFcn ? m_busyFcn() : m_initDone && isBusyCMD13(); +} +//----------------------------------------------------------------------------- +uint32_t SdioCard::kHzSdClk() { + return m_sdClkKhz; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::readBlock(uint32_t lba, uint8_t* buf) +{ +#if USE_DEBUG_MODE + Serial.print("readBlock: "); Serial.println(lba); //Serial.print(", buf: "); Serial.println((uint32_t)buf, HEX); +#endif + // prepare SDIO and DMA for data read transfer + dmaTrxStart((uint32_t)buf & 3 ? (uint8_t*)aligned : buf, 512, TRX_RD); + // send command to start data transfer + if ( !cardCommand(CMD17_XFERTYP, (m_highCapacity ? lba : 512*lba)) ) { + return sdError(SD_CARD_ERROR_CMD17); + } + if ( dmaTrxEnd(0)) { + if ( (uint32_t)buf & 3 ) { + //memcpy(buf, aligned, 512); + register uint8_t * dst = buf; + register uint8_t * src = (uint8_t *)aligned; + register uint16_t i = 64; + while ( i-- ) { // do 8 byte copies, is much faster than single byte copy + *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; + *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; + } + } + return true; + } + return false; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::readBlocks(uint32_t lba, uint8_t* buf, size_t n) +{ +#if USE_DEBUG_MODE + Serial.print("readBlocks: "); Serial.print(lba); + //Serial.print(", buf: "); Serial.print((uint32_t)buf, HEX); + Serial.print(", "); Serial.println(n); +#endif + if ((uint32_t)buf & 3) { + for (size_t i = 0; i < n; i++, lba++, buf += 512) { + if (!readBlock(lba, buf)) { + return false; // readBlock will set errorCode. + } + } + return true; + } + // prepare SDIO and DMA for data read transfer + dmaTrxStart(buf, 512*n, TRX_RD); + // send command to start data transfer + if ( !cardCommand(CMD18_XFERTYP, (m_highCapacity ? lba : 512*lba)) ) { + return sdError(SD_CARD_ERROR_CMD18); + } + return dmaTrxEnd(1); +} +//----------------------------------------------------------------------------- +bool SdioCard::readCID(void* cid) { + memcpy(cid, &m_cid, 16); + return true; +} +//----------------------------------------------------------------------------- +bool SdioCard::readCSD(void* csd) { + memcpy(csd, &m_csd, 16); + return true; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::readData(uint8_t *dst) +{ + //Serial.print("readData: "); Serial.print(m_lba); Serial.print(", m_cnt: "); Serial.println(m_cnt); + if ( m_cnt==0 ) return false; + if (yieldTimeout(isBusyCMD13)) { // wait for previous transmission end + return sdError(SD_CARD_ERROR_CMD13); + } + // non-DMA block read + trxStart(dst, 512, TRX_RD); + // send command to start data transfer + if ( !cardCommand(CMD17_XFERTYP, (m_highCapacity ? m_lba : 512*m_lba)) ) { + return sdError(SD_CARD_ERROR_CMD17); + } + // Receive a data block from the SDIO + register uint32_t STA; // to speed up SDIO flags checking + register uint16_t cnt = 512; + register uint32_t * ptr = (uint32_t *)dst; + // ----> TIME CRITICAL SECTION BEGIN <---- + do { + STA = SDIO->STA; + if (STA & SDIO_STA_RXFIFOHF) { + // Receive FIFO half full, there are at least 8 words in it + noInterrupts(); + *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; + *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; *ptr++ = SDIO->FIFO; + interrupts(); + cnt -= 8; + } + } while ( !(STA & (SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) ); + // <---- TIME CRITICAL SECTION END ----> + + // read data still available in FIFO + while ( (SDIO->STA & SDIO_STA_RXDAVL) && (cnt--) ) { + *ptr++ = SDIO->FIFO; + } + // check error, temporary stuff, remove for final version + if ( SDIO->STA & SDIO_STA_TRX_ERROR_FLAGS ) { + _panic("ERROR: non-DMA read error ", SDIO->STA); + return false; + } + m_lba++; + m_cnt--; + return !(SDIO->STA&SDIO_STA_TRX_ERROR_FLAGS); +} +//----------------------------------------------------------------------------- +bool SdioCard::readOCR(uint32_t* ocr) { + *ocr = m_ocr; + return true; +} +//----------------------------------------------------------------------------- +bool SdioCard::readStart(uint32_t lba) +{ + m_lba = lba; + m_cnt = 1024; + return true; +} +/*---------------------------------------------------------------------------*/ +// SDHC will do Auto CMD12 after count blocks. +bool SdioCard::readStart(uint32_t lba, uint32_t count) +{ + //Serial.print("readStart: "); Serial.print(lba); Serial.print(", cnt: "); Serial.println(count); + m_lba = lba; + m_cnt = count; + return true; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::readStop() +{ + //Serial.println("readStop."); + m_lba = 0; + m_cnt = 0; + return true; +} +//----------------------------------------------------------------------------- +bool SdioCard::syncBlocks() { + return true; +} +//----------------------------------------------------------------------------- +uint8_t SdioCard::type() { + return m_version2 ? m_highCapacity ? + SD_CARD_TYPE_SDHC : SD_CARD_TYPE_SD2 : SD_CARD_TYPE_SD1; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::writeBlock(uint32_t lba, const uint8_t* buf) +{ +#if USE_DEBUG_MODE + Serial.print("writeBlock: "); Serial.println(lba); //Serial.print(", buf: "); Serial.println((uint32_t)buf, HEX); +#endif + uint8_t * ptr = (uint8_t *)buf; + if (3 & (uint32_t)ptr) { + Serial.print("writeBlock: "); Serial.print(lba); + Serial.print(", buf: "); Serial.print((uint32_t)ptr, HEX); + //memcpy(aligned, buf, 512); + register uint8_t * src = (uint8_t *)ptr; + ptr = (uint8_t *)aligned; + register uint8_t * dst = ptr; + register uint16_t i = 64; + while ( i-- ) { // do 8 byte copies, is much faster than single byte copy + *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; + *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; + } + } + if (yieldTimeout(isBusyCMD13)) { // wait for previous transmission end + return sdError(SD_CARD_ERROR_CMD13); + } + // send command to start data transfer + if ( !cardCommand(CMD24_XFERTYP, (m_highCapacity ? lba : 512*lba)) ) { + return sdError(SD_CARD_ERROR_CMD24); + } + // prepare SDIO and DMA for data transfer + dmaTrxStart(ptr, 512, TRX_WR); // 1 block, write transfer + + return dmaTrxEnd(0); +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::writeBlocks(uint32_t lba, const uint8_t* buf, size_t n) +{ +#if USE_DEBUG_MODE + Serial.print("writeBlocks: "); Serial.print(lba); + //Serial.print(", buf: "); Serial.print((uint32_t)buf, HEX); + Serial.print(", "); Serial.println(n); +#endif + if (3 & (uint32_t)buf) { // misaligned buffer address, write single blocks + for (size_t i = 0; i < n; i++, lba++, buf += 512) { + if (!writeBlock(lba, buf)) { + return false; // writeBlock will set errorCode. + } + } + return true; + } + if (yieldTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_CMD13); + } +#if 0 + // set number of blocks to write - this can speed up block write + if ( !cardAcmd(m_rca, ACMD23_XFERTYP, n) ) { + return sdError(SD_CARD_ERROR_ACMD23); + } +#endif + // send command to start data transfer + if ( !cardCommand(CMD25_XFERTYP, (m_highCapacity ? lba : 512*lba)) ) { + return sdError(SD_CARD_ERROR_CMD25); + } + // prepare SDIO and DMA for data transfer + dmaTrxStart((uint8_t *)buf, 512*n, TRX_WR); // n blocks, write transfer + + return dmaTrxEnd(1); +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::writeData(const uint8_t* src) +{ + //Serial.print("writeData: "); Serial.print(m_lba); Serial.print(", cnt: "); Serial.println(m_cnt); + if ( !m_cnt ) return false; + if (yieldTimeout(isBusyCMD13)) { // wait for previous transmission end + return sdError(SD_CARD_ERROR_CMD13); + } + // send command to start block data transfer + if ( !cardCommand(CMD24_XFERTYP, (m_highCapacity ? m_lba : 512*m_lba)) ) { + return sdError(SD_CARD_ERROR_CMD24); + } + // non-DMA block write + trxStart((uint8_t*)src, 512, TRX_WR); + // Receive a data block from the SDIO + register uint32_t STA; // to speed up SDIO flags checking + register uint16_t cnt = 512; + register uint32_t * ptr = (uint32_t*)src; + // pre-fill up the FIFO with 32 words + noInterrupts(); + while ( (cnt--)>(512-32) ) SDIO->FIFO = *ptr++; + interrupts(); + // ----> TIME CRITICAL SECTION BEGIN <---- + do { + STA = SDIO->STA; + if (STA & SDIO_STA_TXFIFOHE) { + // Transmit FIFO half empty, fill up the remaining 16 words + noInterrupts(); + SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; + SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; + SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; + SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; SDIO->FIFO = *ptr++; + interrupts(); + cnt -= 16; + } + } while ( !(STA & (SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) && cnt); + // <---- TIME CRITICAL SECTION END ----> + if ( waitTimeout(isBusyTransferComplete) ) { + return sdError(SD_CARD_ERROR_WRITE_TIMEOUT); + } + m_lba++; + m_cnt--; + if (SDIO->STA&SDIO_STA_TRX_ERROR_FLAGS) { + _panic("writeData error: ", SDIO->STA); + } + return !(SDIO->STA&SDIO_STA_TRX_ERROR_FLAGS); +} +//----------------------------------------------------------------------------- +bool SdioCard::writeStart(uint32_t lba) +{ + m_lba = lba; + m_cnt = 1024; + return true; +} +/*---------------------------------------------------------------------------*/ +// SDHC will do Auto CMD12 after count blocks. +bool SdioCard::writeStart(uint32_t lba, uint32_t count) +{ + //Serial.print("writeStart: "); Serial.print(lba); Serial.print(", cnt: "); Serial.println(count); + m_lba = lba; + m_cnt = count; + return true; +} +/*---------------------------------------------------------------------------*/ +bool SdioCard::writeStop() +{ + //Serial.println("writeStop."); + m_lba = 0; + m_cnt = 0; + return true; +} From 434cb255a56197ab2e686ba04c2ea281ce46ab4f Mon Sep 17 00:00:00 2001 From: victorpv Date: Mon, 11 Sep 2017 21:26:50 -0500 Subject: [PATCH 185/307] F1 SDIO --- STM32F1/libraries/SDIO/SdioF1.h | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 STM32F1/libraries/SDIO/SdioF1.h diff --git a/STM32F1/libraries/SDIO/SdioF1.h b/STM32F1/libraries/SDIO/SdioF1.h new file mode 100644 index 000000000..c995b1c5c --- /dev/null +++ b/STM32F1/libraries/SDIO/SdioF1.h @@ -0,0 +1,7 @@ + +#ifndef _SDIOF4_H_ +#define _SDIOF4_H_ + +#include + +#endif From 7e1cc92d237ea809b715325cab2aae8366af7b3e Mon Sep 17 00:00:00 2001 From: victorpv Date: Mon, 11 Sep 2017 21:28:07 -0500 Subject: [PATCH 186/307] SDIO --- .../system/libmaple/include/libmaple/sdio.h | 270 ++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 STM32F1/system/libmaple/include/libmaple/sdio.h diff --git a/STM32F1/system/libmaple/include/libmaple/sdio.h b/STM32F1/system/libmaple/include/libmaple/sdio.h new file mode 100644 index 000000000..dec31c8b7 --- /dev/null +++ b/STM32F1/system/libmaple/include/libmaple/sdio.h @@ -0,0 +1,270 @@ +/****************************************************************************** + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file sdio.h + * @brief Secure digital input/output interface. + */ + +#ifndef _SDIO_H_ +#define _SDIO_H_ + +#include +#include +#include + + +/* +#include +#include + +//#include +#include +//#include + */ + +#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) + +/* + * DMA controller and channel used in STM32F103 + */ + +#define SDIO_DMA_DEV DMA2 +#define SDIO_DMA_CHANNEL DMA_CH4 +/* +#ifdef __cplusplus +extern "C" { +#endif +*/ + +/* + * Register maps and devices + */ + +// SDIO register map type +typedef struct sdio_reg_map { + __io uint32 POWER; // 0x00 + __io uint32 CLKCR; // 0x04 + __io uint32 ARG; // 0x08 + __io uint32 CMD; // 0x0C + __io uint32 RESPCMD; // 0x10 (0x3F) + const uint32 RESP[4]; // 0x14 - contain the card status, which is part of the received response. + __io uint32 DTIMER; // 0x24 - contains the data timeout period, in card bus clock periods. + __io uint32 DLEN; // 0x28 (0x01FF FFFF) - contains the number of data bytes to be transferred + __io uint32 DCTRL; // 0x2C + __io uint32 DCOUNT; // 0x30 (0x01FF FFFF) + __io uint32 STA; // 0x34 + __io uint32 ICR; // 0x38 + __io uint32 MASK; // 0x3C + const uint32 RESERVED1[2]; + __io uint32 FIFOCNT; // 0x48 (0x01FF FFFF) + const uint32 RESERVED2[13]; + __io uint32 FIFO; // 0x80 +} sdio_reg_map; +#define sdio_dev sdio_reg_map + +/** SDIO register map base pointer */ +#define SDIO_BASE ((struct sdio_reg_map*)0x40018000) + +extern sdio_dev * SDIO; + +/* + * Register bit definitions + */ + +/* NOR/PSRAM chip-select control registers */ + +// SDIO_POWER register bits +// At least seven HCLK clock periods are needed between two write accesses to this register. +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. +#define SDIO_POWER_PWRCTRL_OFF 0x00 +#define SDIO_POWER_PWRCTRL_ON 0x03 + +// SDIO_CLKCR register bits +// Controls the SDIO_CK output clock. +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. SDIO_CK can also be stopped during the read wait interval +// for SD I/O cards: in this case the SDIO_CLKCR register does not control SDIO_CK. +#define SDIO_CLKCR_HWFC_EN (1<<14) // HW Flow Control enable - DON'T USE!!! (see errata sheet 2.12.1) + // Overrun errors (Rx mode) and FIFO underrun (Tx mode) + // should be managed by the application software. +#define SDIO_CLKCR_NEGEDGE (1<<13) // SDIO_CK de-phasing selection bit - DON'T USE!!! (see errata sheet 2.12.4) +#define SDIO_CLKCR_WIDBUS (3<<11) // Data bus width +#define SDIO_CLKCR_WIDBUS_1BIT (0<<11) // 1 bit (SDIO_D0 used) +#define SDIO_CLKCR_WIDBUS_4BIT (1<<11) // 4-bit (SDIO_D[3:0] used) +#define SDIO_CLKCR_BYPASS (1<<10) // Clock divider bypass enable bit - SDIO_CK = SDIOCLK, CLKDIV not relevant. +#define SDIO_CLKCR_PWRSAV (1<<9) // 0: SDIO_CK clock is always enabled, 1: SDIO_CK is only enabled when the bus is active +#define SDIO_CLKCR_CLKEN (1<<8) // Clock enable +#define SDIO_CLKCR_CLKDIV (0xFF) // SDIO_CK = SDIOCLK / [CLKDIV + 2] +#define SDIOCLK 72000000UL // SDIO master clock frequency + +// SDIO_CMD register bits +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. +// MultiMediaCards can send two kinds of response: short responses, 48 bits long, or long +// responses,136 bits long. SD card and SD I/O card can send only short responses, the +// argument can vary according to the type of response: the software will distinguish the type +// of response according to the sent command. CE-ATA devices send only short responses. +#define SDIO_CMD_ATACMD (1<<14) +#define SDIO_CMD_NIEN (1<<13) +#define SDIO_CMD_ENCMDCOMPL (1<<12) +#define SDIO_CMD_SDIOSUSPEND (1<<11) +#define SDIO_CMD_CPSMEN (1<<10) +#define SDIO_CMD_WAITPEND (1<<9) +#define SDIO_CMD_WAITINT (1<<8) +#define SDIO_CMD_WAITRESP (3<<6) +#define SDIO_CMD_WAIT_NO_RESP (0<<6) +#define SDIO_CMD_WAIT_SHORT_RESP (1<<6) +#define SDIO_CMD_WAIT_LONG_RESP (3<<6) +#define SDIO_CMD_CMDINDEX (0x3F) + +// SDIO_DLEN register bits +// For a block data transfer, the value in the data length register must be a multiple of the block +// size (see SDIO_DCTRL). A data transfer must be written to the data timer register and the +// data length register before being written to the data control register. +// For an SDIO multibyte transfer the value in the data length register must be between 1 and 512. +#define SDIO_DLEN_DATALENGTH (0x01FFFFFF) + +// SDIO_DCTRL register bits +// Controls the data path state machine (DPSM). +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. +#define SDIO_DCTRL_SDIOEN (1<<11) // the DPSM performs an SD I/O-card-specific operation. +#define SDIO_DCTRL_RWMODE (1<<10) // 0: Read Wait control stopping SDIO_D2, 1:Read Wait control using SDIO_CK +#define SDIO_DCTRL_RWSTOP (1<<9) // 0: Read wait in progress if RWSTART bit is set, 1: Enable for read wait stop if RWSTART bit is set +#define SDIO_DCTRL_RWSTART (1<<8) // read wait operation starts +#define SDIO_DCTRL_DBLOCKSIZE (0xF<<4) // Define the data block length when the block data transfer mode is selected: 2^N bytes +#define SDIO_BLOCKSIZE_64 (6<<4) +#define SDIO_BLOCKSIZE_512 (9<<4) +#define SDIO_DCTRL_DMAEN (1<<3) // DMA enable +#define SDIO_DCTRL_DTMODE (1<<2) // Data transfer mode selection: 0: Block data transfer, 1: Stream or SDIO multi-byte data transfer +#define SDIO_DCTRL_DTDIR (1<<1) // Data transfer direction selection: 0: From controller to card, 1: From card to controller. +#define SDIO_DIR_TX (0<<1) +#define SDIO_DIR_RX (1<<1) +#define SDIO_DCTRL_DTEN (1<<0) // Start data transfer. Depending on the direction bit, DTDIR, + // the DPSM moves to the Wait_S, Wait_R state or Readwait if RW Start is set immediately at + // the beginning of the transfer. It is not necessary to clear the enable bit after the end of a data + // transfer but the SDIO_DCTRL must be updated to enable a new data transfer +// The meaning of the DTMODE bit changes according to the value of the SDIOEN bit: +// When DTEN=0 and DTMODE=1, the MultiMediaCard stream mode is enabled. +// When DTEN=1 and DTMODE=1, the peripheral enables an SDIO multi-byte transfer. + +// SDIO_STA register bits +#define SDIO_STA_CEATAEND (1<<23) // CE-ATA command completion signal received for CMD61 +#define SDIO_STA_SDIOIT (1<<22) // SDIO interrupt received +#define SDIO_STA_RXDAVL (1<<21) // Data available in receive FIFO +#define SDIO_STA_TXDAVL (1<<20) // Data available in transmit FIFO +#define SDIO_STA_RXFIFOE (1<<19) // Receive FIFO empty +#define SDIO_STA_TXFIFOE (1<<18) // Transmit FIFO empty (2 words) +#define SDIO_STA_RXFIFOF (1<<17) // Receive FIFO full (2 words before the FIFO is full.) +#define SDIO_STA_TXFIFOF (1<<16) // Transmit FIFO full +#define SDIO_STA_RXFIFOHF (1<<15) // Receive FIFO half full: there are at least 8 words in the FIFO +#define SDIO_STA_TXFIFOHE (1<<14) // Transmit FIFO half empty: at least 8 words can be written into the FIFO +#define SDIO_STA_RXACT (1<<13) // Data receive in progress +#define SDIO_STA_TXACT (1<<12) // Data transmit in progress +#define SDIO_STA_CMDACT (1<<11) // Command transfer in progress +#define SDIO_STA_DBCKEND (1<<10) // Data block sent/received (CRC check passed) +#define SDIO_STA_STBITERR (1<<9) // Start bit not detected on all data signals in wide bus mode +#define SDIO_STA_DATAEND (1<<8) // Data end (data counter SDIOCOUNT is zero) +#define SDIO_STA_CMDSENT (1<<7) // Command sent (no response required) +#define SDIO_STA_CMDREND (1<<6) // Command response received (CRC check passed) +#define SDIO_STA_RXOVERR (1<<5) // Received FIFO overrun error +#define SDIO_STA_TXUNDERR (1<<4) // Transmit FIFO underrun error +#define SDIO_STA_DTIMEOUT (1<<3) // Data timeout +#define SDIO_STA_CTIMEOUT (1<<2) // Command response timeout. The Command TimeOut period has a fixed value of 64 SDIO_CK clock periods. +#define SDIO_STA_DCRCFAIL (1<<1) // Data block sent/received (CRC check failed) +#define SDIO_STA_CCRCFAIL (1<<0) // Command response received (CRC check failed) + +#define SDIO_STA_CMD_ERROR_FLAGS (SDIO_STA_CTIMEOUT | SDIO_STA_CCRCFAIL) +#define SDIO_STA_TRX_ERROR_FLAGS (SDIO_STA_STBITERR | SDIO_STA_RXOVERR | SDIO_STA_TXUNDERR | SDIO_STA_DTIMEOUT | SDIO_STA_DCRCFAIL) +#define SDIO_STA_TRX_ACT_FLAGS (SDIO_STA_RXACT|SDIO_STA_TXACT) + +// SDIO_ICR register bits (WO - write only) +#define SDIO_ICR_CEATAENDC (1<<23) // clear CEATAEND flag +#define SDIO_ICR_SDIOITC (1<<22) // clear SDIOIT flag +#define SDIO_ICR_DBCKENDC (1<<10) // clear DBCKENDC flag +#define SDIO_ICR_STBITERRC (1<<9) // clear STBITERRC flag +#define SDIO_ICR_DATAENDC (1<<8) // clear DATAENDC flag +#define SDIO_ICR_CMDSENTC (1<<7) // clear CMDSENTC flag +#define SDIO_ICR_CMDRENDC (1<<6) // clear CMDREND flag +#define SDIO_ICR_RXOVERRC (1<<5) // clear RXOVERR flag +#define SDIO_ICR_TXUNDERRC (1<<4) // clear TXUNDERR flag +#define SDIO_ICR_DTIMEOUTC (1<<3) // clear DTIMEOUT flag +#define SDIO_ICR_CTIMEOUTC (1<<2) // clear CTIMEOUT flag +#define SDIO_ICR_DCRCFAILC (1<<1) // clear DCRCFAIL flag +#define SDIO_ICR_CCRCFAILC (1<<0) // clear CCRCFAIL flag + +#define SDIO_ICR_CMD_FLAGS (SDIO_ICR_CEATAENDC | SDIO_ICR_SDIOITC | SDIO_ICR_CMDSENTC | SDIO_ICR_CMDRENDC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CCRCFAILC) +#define SDIO_ICR_DATA_FLAGS (SDIO_ICR_DBCKENDC | SDIO_ICR_STBITERRC | SDIO_ICR_DATAENDC | SDIO_ICR_RXOVERRC | SDIO_ICR_TXUNDERRC | SDIO_ICR_DTIMEOUTC | SDIO_ICR_DCRCFAILC) + +// SDIO_MASK register bits +// Determines which status flags generate an interrupt request by setting the corresponding bit to 1b. +#define SDIO_MASK_CEATAENDIE (1<<23) // enable CEATAEND interrupt +#define SDIO_MASK_SDIOITIE (1<<22) // enable SDIOIT interrupt +#define SDIO_MASK_RXDAVLIE (1<<21) // enable RXDAVL interrupt +#define SDIO_MASK_TXDAVLIE (1<<20) // enable TXDAVL interrupt +#define SDIO_MASK_RXFIFOEIE (1<<19) // enable RXFIFOE interrupt +#define SDIO_MASK_TXFIFOEIE (1<<18) // enable TXFIFOE interrupt +#define SDIO_MASK_RXFIFOFIE (1<<17) // enable RXFIFOF interrupt +#define SDIO_MASK_TXFIFOFIE (1<<16) // enable TXFIFOF interrupt +#define SDIO_MASK_RXFIFOHFIE (1<<15) // enable RXFIFOHF interrupt +#define SDIO_MASK_TXFIFOHEIE (1<<14) // enable TXFIFOHE interrupt +#define SDIO_MASK_RXACTIE (1<<13) // enable RXACT interrupt +#define SDIO_MASK_TXACTIE (1<<12) // enable TXACT interrupt +#define SDIO_MASK_CMDACTIE (1<<11) // enable CMDACT interrupt +#define SDIO_MASK_DBCKENDIE (1<<10) // enable DBCKENDC interrupt +#define SDIO_MASK_STBITERRIE (1<<9) // enable STBITERR interrupt +#define SDIO_MASK_DATAENDIE (1<<8) // enable DATAENDC interrupt +#define SDIO_MASK_CMDSENTIE (1<<7) // enable CMDSENTC interrupt +#define SDIO_MASK_CMDRENDIE (1<<6) // enable CMDREND interrupt +#define SDIO_MASK_RXOVERRIE (1<<5) // enable RXOVERR interrupt +#define SDIO_MASK_TXUNDERRIE (1<<4) // enable TXUNDERR interrupt +#define SDIO_MASK_DTIMEOUTIE (1<<3) // enable DTIMEOUT interrupt +#define SDIO_MASK_CTIMEOUTIE (1<<2) // enable CTIMEOUT interrupt +#define SDIO_MASK_DCRCFAILIE (1<<1) // enable DCRCFAIL interrupt +#define SDIO_MASK_CCRCFAILIE (1<<0) // enable CCRCFAIL interrupt + + +void sdio_enable(void); +void sdio_disable(void); +void sdio_begin(void); +uint8_t sdio_cmd_send(uint16_t cmd_index_resp_type, uint32_t arg); +void sdio_set_clock(uint32_t clk); +void sdio_set_dbus_width(uint16_t bus_w); +void sdio_set_dblock_size(uint8_t dbsize); +//void sdio_trx_enable(uint8_t dir); +inline void sdio_trx_enable(void) +{ + SDIO->DCTRL |= SDIO_DCTRL_DTEN; // enable data transfer +} + +inline uint32_t sdio_cmd_xfer_ongoing(void) { return (SDIO->STA&SDIO_STA_CMDACT); } +inline uint32_t sdio_cmd_complete(void) { return (SDIO->STA&SDIO_STA_CMDSENT); } + +inline void sdio_setup_transfer(uint32_t dtimer, uint32_t dlen, uint16_t flags) +{ + SDIO->ICR = SDIO_ICR_DATA_FLAGS; // clear data access relevant flags + SDIO->DTIMER = dtimer; + SDIO->DLEN = dlen; + SDIO->DCTRL = flags;// | SDIO_DCTRL_DTEN; // enable data transfer +} + +/* +#ifdef __cplusplus +} // extern "C" +#endif +*/ + +#endif /* (STM32_HIGH_DENSITY) || (STM32_XL_DENSITY) */ + +#endif From 8929bbbde08b1896626c9c2b50e1c865804e918d Mon Sep 17 00:00:00 2001 From: victorpv Date: Mon, 11 Sep 2017 21:29:33 -0500 Subject: [PATCH 187/307] F1 SDIO --- STM32F1/cores/maple/sdio.cpp | 198 +++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 STM32F1/cores/maple/sdio.cpp diff --git a/STM32F1/cores/maple/sdio.cpp b/STM32F1/cores/maple/sdio.cpp new file mode 100644 index 000000000..8bd94915b --- /dev/null +++ b/STM32F1/cores/maple/sdio.cpp @@ -0,0 +1,198 @@ +/****************************************************************************** + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file libmaple/sdio.c + * @author stevstrong + * @brief Secure digital input/output interface. + */ + +#include +#include +#include +#include "wirish.h" + + +//#include +//#include +//#include +//#include "wirish.h" +//#include "boards.h" +// + +#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) + +sdio_dev * SDIO = SDIO_BASE; + +#define DELAY_LONG 10 +#define DELAY_SHORT 1 + +uint8_t dly = DELAY_LONG; // microseconds delay after accessing registers + +/* + * SDIO convenience routines + */ +void sdio_gpios_init(void) +{ + gpio_set_mode(PIN_MAP[BOARD_SDIO_D0].gpio_device, PIN_MAP[BOARD_SDIO_D0].gpio_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PIN_MAP[BOARD_SDIO_D1].gpio_device, PIN_MAP[BOARD_SDIO_D1].gpio_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PIN_MAP[BOARD_SDIO_D2].gpio_device, PIN_MAP[BOARD_SDIO_D2].gpio_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PIN_MAP[BOARD_SDIO_D3].gpio_device, PIN_MAP[BOARD_SDIO_D3].gpio_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PIN_MAP[BOARD_SDIO_CLK].gpio_device, PIN_MAP[BOARD_SDIO_CLK].gpio_bit, GPIO_AF_OUTPUT_PP); + gpio_set_mode(PIN_MAP[BOARD_SDIO_CMD].gpio_device, PIN_MAP[BOARD_SDIO_CMD].gpio_bit, GPIO_AF_OUTPUT_PP); + /* + * Todo just remove it, not needed for F1. + */ + /* + gpio_set_af_mode(BOARD_SDIO_D0, 12); + gpio_set_af_mode(BOARD_SDIO_D1, 12); + gpio_set_af_mode(BOARD_SDIO_D2, 12); + gpio_set_af_mode(BOARD_SDIO_D3, 12); + gpio_set_af_mode(BOARD_SDIO_CLK, 12); + gpio_set_af_mode(BOARD_SDIO_CMD, 12); + */ +} + +void sdio_gpios_deinit(void) +{ + gpio_set_mode(PIN_MAP[BOARD_SDIO_D0].gpio_device, PIN_MAP[BOARD_SDIO_D0].gpio_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(PIN_MAP[BOARD_SDIO_D1].gpio_device, PIN_MAP[BOARD_SDIO_D1].gpio_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(PIN_MAP[BOARD_SDIO_D2].gpio_device, PIN_MAP[BOARD_SDIO_D2].gpio_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(PIN_MAP[BOARD_SDIO_D3].gpio_device, PIN_MAP[BOARD_SDIO_D3].gpio_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(PIN_MAP[BOARD_SDIO_CLK].gpio_device, PIN_MAP[BOARD_SDIO_CLK].gpio_bit, GPIO_INPUT_FLOATING); + gpio_set_mode(PIN_MAP[BOARD_SDIO_CMD].gpio_device, PIN_MAP[BOARD_SDIO_CMD].gpio_bit, GPIO_INPUT_FLOATING); + + /* + * Todo just remove it, not needed for F1. + */ + /* + gpio_set_af_mode(BOARD_SDIO_D0, 0); + gpio_set_af_mode(BOARD_SDIO_D1, 0); + gpio_set_af_mode(BOARD_SDIO_D2, 0); + gpio_set_af_mode(BOARD_SDIO_D3, 0); + gpio_set_af_mode(BOARD_SDIO_CLK, 0); + gpio_set_af_mode(BOARD_SDIO_CMD, 0); + */ +} + +/** + * @brief Initialize and reset the SDIO device. + */ +void sdio_init(void) +{ + rcc_clk_enable(RCC_SDIO); + rcc_reset_dev(RCC_SDIO); +} + +void sdio_power_on(void) +{ + SDIO->POWER = SDIO_POWER_PWRCTRL_ON; +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. + delay_us(DELAY_LONG); +} + +void sdio_power_off(void) +{ + SDIO->POWER = SDIO_POWER_PWRCTRL_OFF; +// After a data write, data cannot be written to this register for three SDIOCLK clock periods +// plus two PCLK2 clock periods. + delay_us(DELAY_LONG); +} + +void sdio_set_clock(uint32_t clk) +{ + if (clk>24000000UL) clk = 24000000UL; // limit the SDIO master clock to 24MHz + + if (clk<1000000) dly = DELAY_LONG; + else dly = DELAY_SHORT; + + sdio_disable(); + SDIO->CLKCR = (SDIO->CLKCR & (~(SDIO_CLKCR_CLKDIV|SDIO_CLKCR_BYPASS))) | SDIO_CLKCR_CLKEN | (((SDIOCLK/clk)-2)&SDIO_CLKCR_CLKDIV); + delay_us(dly); +} + +void sdio_set_dbus_width(uint16_t bus_w) +{ + SDIO->CLKCR = (SDIO->CLKCR & (~SDIO_CLKCR_WIDBUS)) | bus_w; + delay_us(dly); +} + +void sdio_set_dblock_size(uint8_t dbsize) +{ + SDIO->DCTRL = (SDIO->DCTRL&(~SDIO_DCTRL_DBLOCKSIZE)) | ((dbsize&0xF)<<4); + delay_us(dly); +} + +void sdio_enable(void) +{ + SDIO->CLKCR |= SDIO_CLKCR_CLKEN; + delay_us(dly); +} + +void sdio_disable(void) +{ + SDIO->CLKCR ^= SDIO_CLKCR_CLKEN; + delay_us(dly); +} + +/** + * @brief Configure and enable the SDIO device. + */ +void sdio_begin(void) +{ + sdio_gpios_init(); + sdio_init(); + sdio_power_on(); + // Set initial SCK rate. + sdio_set_clock(400000); + delay_us(200); // generate 80 pulses at 400kHz +} + +/** + * @brief Disables the SDIO device. + */ +void sdio_end(void) +{ + sdio_disable(); + while ( sdio_cmd_xfer_ongoing() ); + sdio_power_off(); + rcc_clk_disable(RCC_SDIO); + sdio_gpios_deinit(); +} + +/** + * @brief Send command by the SDIO device. + */ +uint8_t sdio_cmd_send(uint16_t cmd_index_resp_type, uint32_t arg) +{ + uint8_t retries = 10; // in case of errors + do { // retry command if errors detected + // clear interrupt flags - IMPORTANT!!! + SDIO->ICR = SDIO_ICR_CMD_FLAGS; + // write command + SDIO->ARG = arg; + SDIO->CMD = (uint32_t)(SDIO_CMD_CPSMEN | cmd_index_resp_type ); + while ( (SDIO->STA&SDIO_STA_CMDACT) ) ; // wait for actual command transfer to finish + // wait for response, if the case + if ( cmd_index_resp_type&(SDIO_CMD_WAIT_SHORT_RESP|SDIO_CMD_WAIT_LONG_RESP) ) { + while ( !(SDIO->STA&(SDIO_STA_CMDREND|SDIO_STA_CMD_ERROR_FLAGS)) ) ; + } else break; // no response required + if ( SDIO->STA&(SDIO_STA_CMDREND|SDIO_STA_CTIMEOUT) ) + break; // response received or timeout + // ignore CRC error for CMD5 and ACMD41 + if ( ((cmd_index_resp_type&SDIO_CMD_CMDINDEX)==5) || ((cmd_index_resp_type&SDIO_CMD_CMDINDEX)==41) ) + break; + } while ( (--retries) ); + return (uint8_t)retries; +} + +#endif // defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) From 1db95cf251f8100610fd716fbe7a5f970b931207 Mon Sep 17 00:00:00 2001 From: victorpv Date: Mon, 11 Sep 2017 21:40:25 -0500 Subject: [PATCH 188/307] F1 SDIO --- STM32F1/variants/generic_stm32f103r/board/board.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/STM32F1/variants/generic_stm32f103r/board/board.h b/STM32F1/variants/generic_stm32f103r/board/board.h index 0719afaa5..925c882e3 100644 --- a/STM32F1/variants/generic_stm32f103r/board/board.h +++ b/STM32F1/variants/generic_stm32f103r/board/board.h @@ -102,6 +102,16 @@ #define BOARD_USB_DISC_DEV GPIOC #define BOARD_USB_DISC_BIT 12 +/* + * SDIO Pins + */ +#define BOARD_SDIO_D0 PC8 +#define BOARD_SDIO_D1 PC9 +#define BOARD_SDIO_D2 PC10 +#define BOARD_SDIO_D3 PC11 +#define BOARD_SDIO_CLK PC12 +#define BOARD_SDIO_CMD PD2 + /* Pin aliases: these give the GPIO port/bit for each pin as an * enum. These are optional, but recommended. They make it easier to * write code using low-level GPIO functionality. */ From 799f2b3b8a42a180879260dff910d682e3a2d104 Mon Sep 17 00:00:00 2001 From: victorpv Date: Mon, 11 Sep 2017 22:01:55 -0500 Subject: [PATCH 189/307] Correct issue with port speed not changing. The current implementation will not change speed if Wire.setClock is called after begin() since the flags are only applied when the port is enabled from being disabled. Corrected that by adding 2 lines to disable the port, and then enable it again with the new settings. Tested and confirmed the new speed is applied. --- STM32F1/libraries/Wire/Wire.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/STM32F1/libraries/Wire/Wire.cpp b/STM32F1/libraries/Wire/Wire.cpp index c4e9befa7..3f5f16123 100644 --- a/STM32F1/libraries/Wire/Wire.cpp +++ b/STM32F1/libraries/Wire/Wire.cpp @@ -97,7 +97,8 @@ void HardWire::setClock(uint32_t frequencyHz) dev_flags &= ~I2C_FAST_MODE;// clear FAST_MODE bit break; } - + i2c_disable(sel_hard); + i2c_master_enable(sel_hard, dev_flags); } HardWire Wire(1); From a530b6a3d46385586e6ece1202ee505c09157150 Mon Sep 17 00:00:00 2001 From: victorpv Date: Mon, 11 Sep 2017 22:49:03 -0500 Subject: [PATCH 190/307] Update Wire.cpp Adds a check to verify if the port had been already enabled, and only in that case disables/re-enables the port. This also solves the issue of setClock being called after begin(), but doesn't not enable the port if begin() had not been called yet. --- STM32F1/libraries/Wire/Wire.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/Wire/Wire.cpp b/STM32F1/libraries/Wire/Wire.cpp index 3f5f16123..a026e2ef7 100644 --- a/STM32F1/libraries/Wire/Wire.cpp +++ b/STM32F1/libraries/Wire/Wire.cpp @@ -97,8 +97,10 @@ void HardWire::setClock(uint32_t frequencyHz) dev_flags &= ~I2C_FAST_MODE;// clear FAST_MODE bit break; } - i2c_disable(sel_hard); - i2c_master_enable(sel_hard, dev_flags); + if (sel_hard->regs->CR1 & I2C_CR1_PE){ + i2c_disable(sel_hard); + i2c_master_enable(sel_hard, dev_flags); + } } HardWire Wire(1); From 7752fc68f2860afc096c707529d740f3766268f2 Mon Sep 17 00:00:00 2001 From: csnol Date: Wed, 13 Sep 2017 04:08:04 +0800 Subject: [PATCH 191/307] add attachAlarmInterrupt() detachAlarmInterrupt() --- STM32F1/libraries/RTClock/src/RTClock.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/STM32F1/libraries/RTClock/src/RTClock.cpp b/STM32F1/libraries/RTClock/src/RTClock.cpp index cc7b63e8d..deefcf00e 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.cpp +++ b/STM32F1/libraries/RTClock/src/RTClock.cpp @@ -201,6 +201,18 @@ time_t RTClock::makeTime(tm_t & tmm) rtc_detach_interrupt(RTC_SECONDS_INTERRUPT); } + void RTClock::attachAlarmInterrupt(voidFuncPtr function, time_t alarm_time) { // Don't need run RTClock::setAlarmTime(time_t alarm_time) + rtc_set_alarm(alarm_time); + rtc_attach_interrupt(RTC_ALARM_GLOBAL_INTERRUPT, function); + } + + void RTClock::attachAlarmInterrupt(voidFuncPtr function) { // Must run RTClock::setAlarmTime (time_t alarm_time or tm_t & alarm_tm) first + rtc_attach_interrupt(RTC_ALARM_GLOBAL_INTERRUPT, function); + } + + void RTClock::detachAlarmInterrupt() { + rtc_detach_interrupt(RTC_ALARM_GLOBAL_INTERRUPT); + } void RTClock::createAlarm(voidFuncPtr function, tm_t & alarm_tm) { time_t alarm = makeTime(alarm_tm);//convert to time_t From a87ad87fa71bb7190b2e6bdc94d097752c4cd359 Mon Sep 17 00:00:00 2001 From: csnol Date: Wed, 13 Sep 2017 04:10:25 +0800 Subject: [PATCH 192/307] add attachAlarmInterrupt and detachAlarmInterrupt --- STM32F1/libraries/RTClock/src/RTClock.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h index 711992e1f..aa97ac98d 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -78,6 +78,10 @@ class RTClock { void attachSecondsInterrupt(voidFuncPtr function); void detachSecondsInterrupt(); + void attachAlarmInterrupt(voidFuncPtr function); + void attachAlarmInterrupt(voidFuncPtr function, time_t alarm_time); + void detachAlarmInterrupt(); + void setAlarmTime (tm_t & tm_ptr); void setAlarmTime (time_t alarm_time); @@ -89,4 +93,4 @@ class RTClock { #endif // _RTCLOCK_H_ - \ No newline at end of file + From 30f8527eaa67d78fdffdc475a5620bda36bac87e Mon Sep 17 00:00:00 2001 From: csnol Date: Wed, 13 Sep 2017 10:53:08 +0800 Subject: [PATCH 193/307] added TimeZone(time_t xxx, timezone); Usage: time_t localtime; localtime = TimeZone(UnixTime, 8); // Beijing timezone = 8 --- STM32F1/libraries/RTClock/src/RTClock.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h index aa97ac98d..74f7397da 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -72,6 +72,8 @@ class RTClock { uint8_t second(time_t t) { breakTime(t, tmm); return tmm.second; } uint8_t isPM(time_t t) { return (hour(t)>=12); } + time_t TimeZone(time_t t, uint8_t TZ) { return ( t - (TZ * SECS_PER_HOUR)); } // usage: localtime = TimeZone(UnixTime, 8); // Beijing timezone = 8 + void createAlarm(voidFuncPtr function, time_t alarm_time_t); void createAlarm(voidFuncPtr function, struct tm_t & alarm_tm); From 6be069cdb6094bd3957f65184625f4e20287e3d0 Mon Sep 17 00:00:00 2001 From: csnol Date: Wed, 13 Sep 2017 11:02:24 +0800 Subject: [PATCH 194/307] change TZ from unit_8 to int, negatives timezone usage: localtime = TimeZone(UnixTime, -7); // CA USA = -7 --- STM32F1/libraries/RTClock/src/RTClock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h index 74f7397da..e67fcb33b 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -72,7 +72,7 @@ class RTClock { uint8_t second(time_t t) { breakTime(t, tmm); return tmm.second; } uint8_t isPM(time_t t) { return (hour(t)>=12); } - time_t TimeZone(time_t t, uint8_t TZ) { return ( t - (TZ * SECS_PER_HOUR)); } // usage: localtime = TimeZone(UnixTime, 8); // Beijing timezone = 8 + time_t TimeZone(time_t t, int TZ) { return ( t - (TZ * SECS_PER_HOUR)); } // usage: localtime = TimeZone(UnixTime, 8); // Beijing timezone = 8 void createAlarm(voidFuncPtr function, time_t alarm_time_t); void createAlarm(voidFuncPtr function, struct tm_t & alarm_tm); From ed797d43e530087dd8d9deaf3a5684df49c3e1bd Mon Sep 17 00:00:00 2001 From: csnol Date: Thu, 14 Sep 2017 00:03:55 +0800 Subject: [PATCH 195/307] Tested on BluePill for new function of RTC --- .../BlutPill-RTClock-test.ino | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 STM32F1/libraries/RTClock/examples/BlutPill-RTClock-test/BlutPill-RTClock-test.ino diff --git a/STM32F1/libraries/RTClock/examples/BlutPill-RTClock-test/BlutPill-RTClock-test.ino b/STM32F1/libraries/RTClock/examples/BlutPill-RTClock-test/BlutPill-RTClock-test.ino new file mode 100644 index 000000000..b6e661069 --- /dev/null +++ b/STM32F1/libraries/RTClock/examples/BlutPill-RTClock-test/BlutPill-RTClock-test.ino @@ -0,0 +1,130 @@ +/* STM32F103C8 Blue Pill ( PC13) + + Serialport set and display RTC clock , Write by CSNOL https://github.com/csnol/STM32-Examples + based on https://github.com/rogerclarkmelbourne/Arduino_STM32 + + 1. Blink on PC13 per 4s or 7s by attachAlarmInterrupt for 10 times + 2. Second counter by attachSecondsInterrpt + 3. Serial output on(41s) or off(21s) by creatAlarm + 4. change to your timezone in the sketch; . + 3. get Unix epoch time from https://www.epochconverter.com/ ; + 4. last step input the 10 bits number( example: 1503945555) to Serialport ; + 5. the clock will be reset to you wanted. + + ## Why the 10 bits Unix epoch time be used? +****Because I wanna connect to NTP server by ESP-8266. +****in the library. getNtpTime() will return this 10 bits Unix epoch time. +*/ + + +#include + +RTClock rtclock (RTCSEL_LSE); // initialise +int timezone = 8; // change to your timezone +time_t tt; +time_t tt1; +tm_t mtt = { 47, 9, 13, 3, 1, 22, 30, 30 }; // init time 47+1970 = 2017 Unix epoch Time counted from 00:00:00 1 Jan 1970 +char weekday1[][7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; // 0,1,2,3,4,5,6 +uint8_t dateread[11]; +int globAlmCount = 0; +int lastGlobAlmCount; +int SPECAlmCount = 0; +int lastSPECAlmCount; +int i = 0; +int alarmcount = 3; +uint8_t AlarmExchange = 0; +bool dispflag = true; + +#define LED_PIN PC13 + +// This function is called in the attachSecondsInterrpt +void SecondCount () +{ + tt++; +} +// This function is called in the attachAlarmInterrpt +void blink () +{ + digitalWrite(LED_PIN, !digitalRead(LED_PIN)); + globAlmCount++; + //tt++; +} + +void OnOffSerial () +{ + dispflag = !dispflag; + SPECAlmCount++; +} + +void setup() +{ + lastGlobAlmCount = ~globAlmCount; + lastSPECAlmCount = ~SPECAlmCount; + Serial.begin(115200); + pinMode(LED_PIN, OUTPUT); + tt = rtclock.makeTime(mtt); + tt1 = tt; + rtclock.attachAlarmInterrupt(blink);// Call blink + rtclock.attachSecondsInterrupt(SecondCount);// Call SecondCount +} + +void loop() +{ + while (Serial.available()) + { dateread[i] = Serial.read(); + if (i < 11) { + i++; + } + else { + i = 0; + tt = (dateread[0] - '0') * 1000000000 + (dateread[1] - '0') * 100000000 + (dateread[2] - '0') * 10000000 + (dateread[3] - '0') * 1000000 + (dateread[4] - '0') * 100000; + tt += (dateread[5] - '0') * 10000 + (dateread[6] - '0') * 1000 + (dateread[7] - '0') * 100 + (dateread[8] - '0') * 10 + (dateread[9] - '0'); + tt = rtclock.TimeZone(tt, timezone); //adjust to your local date + } + } + if (lastGlobAlmCount != globAlmCount | lastSPECAlmCount != SPECAlmCount ) { + if (globAlmCount == 10) { // to detachAlarmInterrupt and start creatAlarm after 10 times about 110s + rtclock.detachAlarmInterrupt(); + globAlmCount = 0; + rtclock.createAlarm(OnOffSerial, (rtclock.getTime() + 20)); // call OnOffSerial stop output date from Serial after 2 mins + alarmcount = 20; //change to creatAlarm 21S close Serial output and 41s open Serial output. + } + else { + lastGlobAlmCount = globAlmCount; + lastSPECAlmCount = SPECAlmCount; + Serial.println(" Say hello to every guys "); + if(dispflag == false) + Serial.println(" SPECAlarm turn Display Off "); + switch (AlarmExchange) { + case 0: + rtclock.setAlarmTime(rtclock.getTime() + alarmcount); // reset alarm = current time + 4s for attachAlarmInterrupt, 21s for creatAlarm + AlarmExchange = 1; + break; + case 1: + rtclock.breakTime(rtclock.getTime() + alarmcount * 2, mtt); //// reset alarm = current time + 7s for attachAlarmInterrupt, 41s for creatAlarm + rtclock.setAlarmTime(mtt); + AlarmExchange = 0; + break; + } + } + } + if (tt1 != tt & dispflag == true ) + { + tt1 = tt; + rtclock.breakTime(tt, mtt); + Serial.print("Date: "); + Serial.print(mtt.day); + Serial.print("- "); + Serial.print(mtt.month); + Serial.print(" "); + Serial.print(mtt.year + 1970); + Serial.print(" "); + Serial.print(weekday1[mtt.weekday]); + Serial.print(" Time: "); + Serial.print(mtt.hour); + Serial.print(" : "); + Serial.print(mtt.minute); + Serial.print(" : "); + Serial.println(mtt.second); + } +} From 2d6abe679aeaa4d12e19d6a3e3f234b418b956c9 Mon Sep 17 00:00:00 2001 From: csnol Date: Thu, 14 Sep 2017 15:05:42 +0800 Subject: [PATCH 196/307] Add keywords for new functions --- STM32F1/libraries/RTClock/keywords.txt | 29 +++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/STM32F1/libraries/RTClock/keywords.txt b/STM32F1/libraries/RTClock/keywords.txt index ddd0680b8..31bf13e05 100644 --- a/STM32F1/libraries/RTClock/keywords.txt +++ b/STM32F1/libraries/RTClock/keywords.txt @@ -5,16 +5,35 @@ ####################################### # Datatypes (KEYWORD1) ####################################### -RTClock KEYWORD1 +RTClock KEYWORD1 -setTime KEYWORD2 -getTime KEYWORD2 -createAlarm KEYWORD2 +setTime KEYWORD2 +getTime KEYWORD2 + +createAlarm KEYWORD2 +setAlarmTime KEYWORD2 + attachSecondsInterrupt KEYWORD2 detachSecondsInterrupt KEYWORD2 -setAlarmTime KEYWORD2 + +attachAlarmInterrupt KEYWORD2 +detachAlarmInterrupt KEYWORD2 + +breakTime KEYWORD2 +makeTime KEYWORD2 + +TimeZone KEYWORD2 +now KEYWORD2 +year KEYWORD2 +month KEYWORD2 +day KEYWORD2 +weekday KEYWORD2 +hour KEYWORD2 +minute KEYWORD2 +second KEYWORD2 +isPM KEYWORD2 ####################################### From fa7bcde3cd21b50fd23b5ef3e10cf0445aed75ea Mon Sep 17 00:00:00 2001 From: csnol Date: Thu, 14 Sep 2017 16:05:28 +0800 Subject: [PATCH 197/307] Update example for Chinese friends. timezone and filename error --- .../BluePill-RTClock-test.ino} | 31 ++++++++++++------- STM32F1/libraries/RTClock/src/RTClock.h | 4 +-- 2 files changed, 22 insertions(+), 13 deletions(-) rename STM32F1/libraries/RTClock/examples/{BlutPill-RTClock-test/BlutPill-RTClock-test.ino => BluePill-RTClock-test/BluePill-RTClock-test.ino} (74%) diff --git a/STM32F1/libraries/RTClock/examples/BlutPill-RTClock-test/BlutPill-RTClock-test.ino b/STM32F1/libraries/RTClock/examples/BluePill-RTClock-test/BluePill-RTClock-test.ino similarity index 74% rename from STM32F1/libraries/RTClock/examples/BlutPill-RTClock-test/BlutPill-RTClock-test.ino rename to STM32F1/libraries/RTClock/examples/BluePill-RTClock-test/BluePill-RTClock-test.ino index b6e661069..d49025a1d 100644 --- a/STM32F1/libraries/RTClock/examples/BlutPill-RTClock-test/BlutPill-RTClock-test.ino +++ b/STM32F1/libraries/RTClock/examples/BluePill-RTClock-test/BluePill-RTClock-test.ino @@ -14,6 +14,13 @@ ## Why the 10 bits Unix epoch time be used? ****Because I wanna connect to NTP server by ESP-8266. ****in the library. getNtpTime() will return this 10 bits Unix epoch time. +* +* 嗨!朋友们, 这是一个STM32F10x系列的RTC应用的例子,希望对你的编码有所帮助 +* 这个程序基于https://github.com/rogerclarkmelbourne/Arduino_STM32 , 感谢所有贡献者的付出。 +* 程序测试了 F10x系列RTC 的 几种中断, 并通过LED和串口进行表达。 +* RTClock 使用 UTC 作为时间标准, 你可以从https://www.epochconverter.com/ 获得 Unix epoch time数值 +* 并通过串口进行设置, 当然你也可以略微修改一下串口接收处理方法,直接从串口接收日期形式。如 2017-9-13-10:30:00, +* 另外一个方法是通过ESP8266获取NTP网络时间,并定期发送给F10x进行更新。 */ @@ -23,7 +30,7 @@ RTClock rtclock (RTCSEL_LSE); // initialise int timezone = 8; // change to your timezone time_t tt; time_t tt1; -tm_t mtt = { 47, 9, 13, 3, 1, 22, 30, 30 }; // init time 47+1970 = 2017 Unix epoch Time counted from 00:00:00 1 Jan 1970 +tm_t mtt = { 47, 9, 13, 3, 11, 22, 30, 30 }; // init time 47+1970 = 2017 Unix epoch Time counted from 00:00:00 1 Jan 1970 char weekday1[][7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; // 0,1,2,3,4,5,6 uint8_t dateread[11]; int globAlmCount = 0; @@ -62,7 +69,8 @@ void setup() lastSPECAlmCount = ~SPECAlmCount; Serial.begin(115200); pinMode(LED_PIN, OUTPUT); - tt = rtclock.makeTime(mtt); + tt = rtclock.makeTime(mtt); + rtclock.setTime(tt); tt1 = tt; rtclock.attachAlarmInterrupt(blink);// Call blink rtclock.attachSecondsInterrupt(SecondCount);// Call SecondCount @@ -79,7 +87,8 @@ void loop() i = 0; tt = (dateread[0] - '0') * 1000000000 + (dateread[1] - '0') * 100000000 + (dateread[2] - '0') * 10000000 + (dateread[3] - '0') * 1000000 + (dateread[4] - '0') * 100000; tt += (dateread[5] - '0') * 10000 + (dateread[6] - '0') * 1000 + (dateread[7] - '0') * 100 + (dateread[8] - '0') * 10 + (dateread[9] - '0'); - tt = rtclock.TimeZone(tt, timezone); //adjust to your local date + rtclock.TimeZone(tt, timezone); //adjust to your local date + rtclock.setTime(rtclock.TimeZone(tt, timezone)); } } if (lastGlobAlmCount != globAlmCount | lastSPECAlmCount != SPECAlmCount ) { @@ -111,20 +120,20 @@ void loop() if (tt1 != tt & dispflag == true ) { tt1 = tt; - rtclock.breakTime(tt, mtt); + //rtclock.breakTime(tt, mtt); Serial.print("Date: "); - Serial.print(mtt.day); + Serial.print(rtclock.day()); Serial.print("- "); - Serial.print(mtt.month); + Serial.print(rtclock.month()); Serial.print(" "); - Serial.print(mtt.year + 1970); + Serial.print(rtclock.year() + 1970); Serial.print(" "); - Serial.print(weekday1[mtt.weekday]); + Serial.print(weekday1[rtclock.weekday()]); Serial.print(" Time: "); - Serial.print(mtt.hour); + Serial.print(rtclock.hour()); Serial.print(" : "); - Serial.print(mtt.minute); + Serial.print(rtclock.minute()); Serial.print(" : "); - Serial.println(mtt.second); + Serial.println(rtclock.second()); } } diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h index e67fcb33b..6f1cba067 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -72,7 +72,7 @@ class RTClock { uint8_t second(time_t t) { breakTime(t, tmm); return tmm.second; } uint8_t isPM(time_t t) { return (hour(t)>=12); } - time_t TimeZone(time_t t, int TZ) { return ( t - (TZ * SECS_PER_HOUR)); } // usage: localtime = TimeZone(UnixTime, 8); // Beijing timezone = 8 + time_t TimeZone(time_t t, int TZ) { return ( t + (TZ * SECS_PER_HOUR)); } // usage: localtime = TimeZone(UnixTime, 8); // Beijing timezone = 8 void createAlarm(voidFuncPtr function, time_t alarm_time_t); void createAlarm(voidFuncPtr function, struct tm_t & alarm_tm); @@ -95,4 +95,4 @@ class RTClock { #endif // _RTCLOCK_H_ - + \ No newline at end of file From c25957ee21b93686f650d3157714551a6dbbc10f Mon Sep 17 00:00:00 2001 From: csnol Date: Thu, 14 Sep 2017 20:47:12 +0800 Subject: [PATCH 198/307] Add removeAlarm function --- .../examples/RTC-Serial-Set-Newlibrary.ino | 80 ------------------ .../examples/STM32F103-RTC-Serial-Set.jpg | Bin 131470 -> 0 bytes STM32F1/libraries/RTClock/keywords.txt | 1 + STM32F1/libraries/RTClock/src/RTClock.cpp | 4 + STM32F1/libraries/RTClock/src/RTClock.h | 3 +- 5 files changed, 7 insertions(+), 81 deletions(-) delete mode 100644 STM32F1/libraries/RTClock/examples/RTC-Serial-Set-Newlibrary.ino delete mode 100644 STM32F1/libraries/RTClock/examples/STM32F103-RTC-Serial-Set.jpg diff --git a/STM32F1/libraries/RTClock/examples/RTC-Serial-Set-Newlibrary.ino b/STM32F1/libraries/RTClock/examples/RTC-Serial-Set-Newlibrary.ino deleted file mode 100644 index ba89a4e02..000000000 --- a/STM32F1/libraries/RTClock/examples/RTC-Serial-Set-Newlibrary.ino +++ /dev/null @@ -1,80 +0,0 @@ -/* STM32F103C8 Black Pill ( PB12) - - Serialport set and display RTC clock , Write by CSNOL https://github.com/csnol/STM32-Examples - based on https://github.com/rogerclarkmelbourne/Arduino_STM32 - - 1. Blink on PB12 per 1s. - 2. change to your timezone in the sketch; . - 3. get Unix epoch time from https://www.epochconverter.com/ ; - 4. last step input the 10 bits number( example: 1503945555) to Serialport ; - 5. the clock will be reset to you wanted. - - ## Why the 10 bits Unix epoch time be used? -****Because I wanna connect to NTP server by ESP-8266. -****in the library. getNtpTime() will return this 10 bits Unix epoch time. -*/ - - -#include - -RTClock rtclock (RTCSEL_LSE); // initialise -time_t tt; -tm_t mtt = { 47, 8, 27, 0, 1, 20, 30, 30 }; -char weekday1[][7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; // 0,1,2,3,4,5,6 -uint8_t timeread[11]; -int timezone = 8 * 3600; // timezone -8 + DST +1 = -7 CA USA -time_t tt1; - -#define LED_PIN PB12 - -// This function is called in the attachSecondsInterrpt -void blink () -{ - digitalWrite(LED_PIN, !digitalRead(LED_PIN)); - tt++; -} - -void setup() -{ - Serial.begin(115200); - pinMode(LED_PIN, OUTPUT); - tt = rtclock.makeTime(mtt); - tt1 = tt; - rtclock.attachSecondsInterrupt(blink);// Call blink -} - - -int i = 0; -void loop() -{ - while (Serial.available()) - { timeread[i] = Serial.read(); - if (i < 11) { - i++; - } - else { - i = 0; - tt = (timeread[0] - '0') * 1000000000 + (timeread[1] - '0') * 100000000 + (timeread[2] - '0') * 10000000 + (timeread[3] - '0') * 1000000 + (timeread[4] - '0') * 100000; - tt += (timeread[5] - '0') * 10000 + (timeread[6] - '0') * 1000 + (timeread[7] - '0') * 100 + (timeread[8] - '0') * 10 + (timeread[9] - '0') + timezone; - } - } - if (tt1 != tt) - { - tt1 = tt; - rtclock.breakTime(tt, mtt); - Serial.print("Date: "); - Serial.print(mtt.day); - Serial.print("- "); - Serial.print(mtt.month); - Serial.print(" "); - Serial.print(mtt.year + 1970); - Serial.print(" "); - Serial.print(weekday1[mtt.weekday]); - Serial.print(" Time: "); - Serial.print(mtt.hour); - Serial.print(" : "); - Serial.print(mtt.minute); - Serial.print(" : "); - Serial.println(mtt.second); - } -} diff --git a/STM32F1/libraries/RTClock/examples/STM32F103-RTC-Serial-Set.jpg b/STM32F1/libraries/RTClock/examples/STM32F103-RTC-Serial-Set.jpg deleted file mode 100644 index b2e701ea9e4789dd48ad0bbfe2c93534d7c61c19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131470 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 AO$pHf*yADG%HUemy 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%0ACJfMVz1%{y?hP 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 diff --git a/STM32F1/libraries/RTClock/keywords.txt b/STM32F1/libraries/RTClock/keywords.txt index 31bf13e05..7e9a60d18 100644 --- a/STM32F1/libraries/RTClock/keywords.txt +++ b/STM32F1/libraries/RTClock/keywords.txt @@ -13,6 +13,7 @@ setTime KEYWORD2 getTime KEYWORD2 createAlarm KEYWORD2 +removeAlarm KEYWORD2 setAlarmTime KEYWORD2 attachSecondsInterrupt KEYWORD2 diff --git a/STM32F1/libraries/RTClock/src/RTClock.cpp b/STM32F1/libraries/RTClock/src/RTClock.cpp index deefcf00e..e95bead86 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.cpp +++ b/STM32F1/libraries/RTClock/src/RTClock.cpp @@ -194,6 +194,10 @@ time_t RTClock::makeTime(tm_t & tmm) rtc_attach_interrupt(RTC_ALARM_SPECIFIC_INTERRUPT, function); } + void RTClock::removeAlarm() { + rtc_detach_interrupt(RTC_ALARM_SPECIFIC_INTERRUPT); + } + void RTClock::attachSecondsInterrupt(voidFuncPtr function) { rtc_attach_interrupt(RTC_SECONDS_INTERRUPT, function); } diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h index 6f1cba067..4d8399e80 100644 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -76,11 +76,12 @@ class RTClock { void createAlarm(voidFuncPtr function, time_t alarm_time_t); void createAlarm(voidFuncPtr function, struct tm_t & alarm_tm); + void removeAlarm(); void attachSecondsInterrupt(voidFuncPtr function); void detachSecondsInterrupt(); - void attachAlarmInterrupt(voidFuncPtr function); + void attachAlarmInterrupt(voidFuncPtr function); void attachAlarmInterrupt(voidFuncPtr function, time_t alarm_time); void detachAlarmInterrupt(); From f84f73c4a1a350e8eda607a5e6b54f2b39a8c608 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 19 Sep 2017 20:42:16 +0200 Subject: [PATCH 199/307] Create hooks.c similar to F1 - it was missing --- STM32F4/cores/maple/hooks.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 STM32F4/cores/maple/hooks.c diff --git a/STM32F4/cores/maple/hooks.c b/STM32F4/cores/maple/hooks.c new file mode 100644 index 000000000..641eabc73 --- /dev/null +++ b/STM32F4/cores/maple/hooks.c @@ -0,0 +1,31 @@ +/* + Copyright (c) 2012 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/** + * Empty yield() hook. + * + * This function is intended to be used by library writers to build + * libraries or sketches that supports cooperative threads. + * + * Its defined as a weak symbol and it can be redefined to implement a + * real cooperative scheduler. + */ +static void __empty() { + // Empty +} +void yield(void) __attribute__ ((weak, alias("__empty"))); From f8d28b8663a53fa37f75c2f20ed0aebc81c83fba Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 21 Sep 2017 17:35:20 +1000 Subject: [PATCH 200/307] Removed unused cygwin dll's from tools/win --- tools/win/cygiconv-2.dll | Bin 969728 -> 0 bytes tools/win/cygwin1.dll | Bin 1872821 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tools/win/cygiconv-2.dll delete mode 100644 tools/win/cygwin1.dll diff --git a/tools/win/cygiconv-2.dll b/tools/win/cygiconv-2.dll deleted file mode 100644 index 64fd39e3e9e2f266dfbb45bb8e6a6c5799cb14e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 969728 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

    R*}9q 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

    -2n0uMu-Spw~5ejq3GGaEJ{3GWN+B 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

    Cf@j2zgz;rktt5(;7xmXRz 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

    $j)Rv{&QKUzs-Lt>-D$$g|dFXGN=tg3Vl$i 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

    rmIfI-<&LQWK3&=&}5^@>2f?P$eA=i-` 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

    H{CX)Xsu7>WNJry({w%Y>nZD*@X4avXS z8nDCaYA|*4yG@(gofXhoU0(J!=6e3|vv}@OWtMcZL$=6|p@fWBN~_L}?gD~@&#k1F znpqSKN5Asu_<y)y?ZrM7N*yQ!Ze;+Mkh~E>+f|j1>B!>esT#gIduVYNDvq0vTerSfBy>ja(id8{?kfI-r?Ap&6}J0e)>&0^ zAoGj~Pj-Ery;^oz2-N=!SNawIuqznB%b{RAjWTy4}E6W{)G#f-r~8M ze}yf(cnY9*QoyEMSymiQn{B(QjknKH@g=A5w{2GyDTT-@s^Q6<1clxpIW)NVb!{&| zae1RR>Z;8f#RXuKkSH7p=seUEO0vIMVzpF`m7dDuVS!&@$Lp?#Han`N`O-X648DM!O39)v8y4>qwf% zL}7FQsK4_lz&b^BV(;lYKX*vYE7RK<)ke(4IVG$TBr;1pwB8`vPVo(%3z6HQz*~U) zF^M~y8kh1GsuW9UIP;3sstP29_7uiA;m-r2V8SSFqOC%(2B|CD$?&Kn#o2i4<((+X zf28a|IH<@WmffUE8jxkxq61q;oSFi#L+`SY!>Jj#3d?c`L{! zUA&T~mG>joP@yIjFI9TvG}6DoQ-~?`qT?kuPJs>)D#Q1BSj3 z!8f-;!n3}Su^D~J~%dssI-027HB=- zhTGu$_~Ls0j#n?@**o|<-ncINBOV>U2Wys|HO%+h$g79!^VH%r&PPaM#QSKRi8%iE zp~kr~0SfHY3MjTCIT{szaswJ?>$^jOiyvHI2kVQA?vPnGLw3On){Yk~#>ip|lGP?$*&a3R$ z@2J;$_;Vio;_m-9Sf*2+MDEP4So*=tX|cxcAmT{m=*Sn1) zQS`6GG51Q{`B*%A9vqe*nt3weZHzxWJvo*OpHnf;V~emh_N-=(K2$t7K!qmjnE41^ z*S8#TkP@aSVL3fq-!gnCgFWWM(MGHV8;8=)@^@E5_KgA!w@Z%*QSY;^BlHH_^casmHn3P@95!v-q{2JLIn18i-_X zLov&Z5*8r$P+rdXkJd{rnq8v!FG>m?I#E2A%2jsNmnpK+%E7<=iq>ybRPiS!*zpk) zo@=BIv?L`?fmlDql*0y)DoH=Zi(HasaFX;>Ji{d&;Bx7wc#2CxBTz2=6i2!w2|SYY zQyfMT_Ln*&XM>$TKhtB^;>pb=9VI<5v#t(fitQ~0I5GsS4-vF1L{Kvo@+s=yaX1S- zm2&cs8ll&ued;`ZPjB~~edTv$`>C@7zDW;pH9&tXIR$KK~~mRiLZ5M7x^lbz)3O`Y8Ks0Dpo6d4ZIUnQ+n)p>y6 zk1AEwCHoLa*5B@*g_L-?zh6ZTN<`XSOj>v6l2^-p9BgzIFQHNT?!s|AW*CEBR|$WG z07r>^3`qf&{V&y_+Z+R8f`o#~JAWkUj5Y{N-D0pBZ%(4%`Ie&WU`1w?aZhg_e)P?N#;Jw5L(in2Jr+rIX&4x};OV$>wM+7lg2v)OeE=JEP z1twEgulg~7l}_709Z5BO)D>p%W>f)$ zwMGyn@}TariE-v3jOF=EDjio+q7XTV!-{wR1QT^zhaytAgqukyzDHZ-{YT`f0t8t6 zq((dvTYt0}xHmL)cBJ@i#kso8Qci_Tyo~mu?2vlbfbDCBUgV!~nGUIMBsC-FYy6ul z>)V1y=>M+1J>1dUe|@gOytRdyjcB!kg{R>X$0yN}gTVjIS2&>=d`!K%%wNH~vJ4Hg z>@%NO|Nnjcf5g!#sQ)W_)qh@4{{vx`4^;n%5XAHe0`4jbi>K5^@$@Z#oAn;#)5#xz;!a1fyxV~MFy1`kpH?|Ycfz-%Q|e-|G`iM|MPFZe=DW) z0RGx0_9Zjx7<4ZqzVp9$3<0NXe)lY9gnxx4{MK@G^4A7T{t_1DM+k{OyjawYas7{s z<<3Y6N+}ekfXHNdl0ZxRA5HH~5v&Z9#ca!>5g$HdP7(@Bs|AUR%U?l&8c+0^U{@fll zdSJ*#+gTKCoP$S=u#K(O8+k3+IRu`+K~`JO9lXBbK6}>Ryq&T3>=1U|&RKhH4_dnV z?X~G|-i~p5Z92@Izd?S)2aCI}aWMCPM#j=P#Aa zkMGQ zMRtK&=I6QO0*m#;m^UGopIGBfs8QJB35nFy{9t^#-!e+nK0G0EX5gyN_VzHr3MJLJ=s~okIaV{`Xwm%xFAR(@ zvi0<@0so66ZWk8uCO^WQJ==d_;~~?IzA+3J-;i4oT(kXpE)BN`3A?tzi`Xt)eb- zQmCwOh03p-?`o4pr;q1CSXZ99%)Qu+kLy1)6m-EIAqIB{R{P692@e!!hSrj@#<7V6 zPmmJzuQSZl>5wXycx(XsAx3HgN7sWI(lfpDnSiVpWp{gH?nD5b8ZGP$(Q&_fD5JxF z>VQG+Hiw?(gBnuzi$A^K&IMvu(JB>0{r`Sz|A?B}Rui;l9au4PC`$*`+0jf+Yu6p? zml%ckLIi!8Mr=5OhS9qPO&M%I_nLjAGVtUvD+*o6+AhhhT zjz5e_+0EB_Pp5biJrf7Ua7Eyj<$N{%57^Zqvfdf>O6lWoEv;ATQ$--fwnYoHdPsc% ze7IVC>$ z<`4IB>iK|3C-|KrX-k>P%zfZ(+h$RD?zCv{c0b31Ny$T2q#B{Ns~zmaS@TH}uxK=C z8GK!*!fT=&c)@a^xQp#A%^K6Twaa+%m{MQDtR0x+QJPJbBILIFwTsc92n*T;LHIk0 zrU}b(RG(aN>GMcR5k{jWYi3QTs*4Vxs-6EH5Z2Syp9c+k?~iz=+-VSpgD`^f*1wH( z#d=uk!^40aVPTTUbXq3_*%5#r!u@xN=gt2A+~pu&UkCs-U3uLwfctw;c~G^tu`R5; z6wj}1o6QvuI#m1~)YzQz9P4|VO73%aE8Lk>H$tErJx+X2Jj&Xo34Njoo0434%mOOi zwoa96Jo@(HoNoghH%|YJ>k2pfpI_2n2L`AE+do+C4pXayuf6cS7q*Y|N1;;n#frm8 zNv-J%>Ccx5jR5%|o&*elSH`k`QEdRBQDEihRrtelzb+m@UV0}-YrSjV^|}y>bKc=Z zt$>B9!t2lU>Oc2kr+jV7?EGeGSbh#S?&i}w^Ay`QC$K*eqbt)noI5Q2HP0iam|ei_ z;U;NgnOC=qM!xN8VVW76-@pAVF6>D)<}Zj6J_~u5SyTJz)RAMq5KaFx{>aqou@htI zZFz3Ht-9(jT#vPIi}{XsXK5Q{GHBb|IH#mW1o4UU%y=}OWYId(<`kyb(ax0v$#@Oo zh$(o3orc7f!&{#om058&v{03r6n{9gnWyBb?A6Y%s9bQoo=V z6KD-}Rb>4XY#Ed$>lI|}er7Lyvb3J7a2`+OS+N94507qPamNt>g6S)lv)j6k`U_uE z|Fjq7A9+MIT1xmKSYNpH5!hvt6pskO{;?eAbqn{mk=g!6(C7_<-X}F}3g_Dxixu-M z4<^?_C+*O44r{uH3bmjx(CtjP0+plXdIG*!I0Xx&quo*BW@D7}_k#9PtNi~I6p-FZ zHBfjaXwGeYrQCWfR1v0HgT$`ae11)MdRnKOvUHJ3@L^L`NcwLnf#Xgq16`?n7*H|0 zQXE@z2cTM&Z#HOWqM{iY_WWtaf3+~T3;urPXU6Nc@YL~S7!Gs!FB|VjV7KVRaCA&~4w@tQn8PqgJ%VfN1^32M z`=PxwLzLHf&)u6yeV(^Tyq(8eLuy!SyCg#b?f+nkO`}+=*QK*VU!eEixMWdhhyY$j zE+X6v#4V1uTDnqH>@6xAM`Z_l&vkR7NooY|qr2~E>goPbkJ~n{O08+?DPBcZ5?gWR zypb$pOvMk$+V)=?=yN0Z80|j})p}hOBvD#qn_lL@#0NVjZgw#$JQRaE3bF6Rxm|H) zJ-k!$_pV2xusH9qCAU^ARM2K;A&~;9PlwdYenEqFKfNBmMG!y>g<-V;0dL=%fWd*O z`P-|d=DUL9xS!KR8cL$21o~XiLOiPwfBx&7=2Yd&RcGPEpoKoFXIS}nsJu9wLVedi z?*919w&_Ij@GjYyKOo8aFh8q?m=c!_Y~b04wW~IazmXw}FS(B4?V4E2GuI>5i)msMympA`m)BaK-PHgI7lH-b^_S&It{gElg zGH=H66QW*q)%twZ*k`DSlM`glY#B_r&!Dt|<1yEOdl79xT<4=UH(_;vw(bH;d zksh^bKM)7oQ(8-oFyclKZR1zK2P(Vb+4I32(Kyt702c~AjODecG3bN+u8DOTii$zV zUA+emoBXVji)o%Smm~%^aRv4kdQ8C4ioWJ$Q@X}NZ8qd5KTAsld)mxTt&2lND9&xX z)#!e9^)y%nciRcqq}P?{?M)@}*KW&SveDZahEVZm@_GCi&HP9B)AalqJrD1Ank9K* zIt1$PIs^^iNlH;Bh#1HVA%s>)zd45h8Dp^LUjtDOrV|{i#AC>v?llmREBw}zI$h9( zIsos@V#ZM*Dzk3P1>q`+fb!=UEovfi$2uk@$K*M~L5aDrHezBvGPs$_Ci&N4EF%{E z{(+8zgi9j`URRXhaV0Teh?^9KTB4ei!;Rt$$!%EM1mpOXfo_aoEI@E#Qz!zF2#GJMGb1$JiNV-JNAu-E5qAGs0(^0bmP6=_reCrVcR%DIT zu8?}vo@#o+WS36nFJRmoOtguvonwlkJB$%!hX)mPtVMe&Cgc9eDO3z4j=snFU**-& zcVmy~fQj_6;3!rw0vFK;OtT1c-wcpCy1oFq7Rtjud={@EM@HAs_O5dO{R7m1$jEy$ zp4C|oe>aCRn>HCa5hIk8jzuD=nIftG!aKv;)xC=O_#87zG;KP2rIxvjc_TBQke;*; z$RM$H0|_H-eJ`kOvJR{r_N=WbnY{d!P*bk+y4Z2+tJdavuHVGHqMrz5{FmuQgSW(t zcT$p;*m_Hv(-N(k2>aE;hD~N&qb7n-%_s)qxUc}YJMMG>yR6Cx|93en)m z6)FgLF*E;|;XsV*v^1TxSJx7SPFHh{e)ruQE| z)8D<~xu~fiXi%*k&5+>Iwvd@~f52Xk;b(1CSMEjd^J4n=5I^&RK<0oH&&qEp{E!4E z7D+k8N<6oo&mio@GQvVUH4h7B&4ha>(9(cZOc9pwyQ%Ya-s2B13Fpn{c-6f5l*`sv&Kv{&m^3B)Ip538U79ox zl8hQmmBAv>ZAdg2yVU1Tuh9%Hv{&)Bmbu2sAm)(mB-G?j_ro~^i&P?ze*lS|P%+U> zbU=FRGkbbj%%`{Ox8B7F3+Ank3vt^nJj77@TC)0I`@@h(X3SU9FJxBz7<^TwpAKpM zc>gTEh1a+@fcCD4{`O2xG^7>vNp3R!+t)(T-w#QDK9zSUlTcdN=;)W*G~AxE+lJ>; zz!4}ahNqwHq>gWw>_h#}r{ole^qEO*C`)T%Yzg8ca0h&5jh!Fs8G?Hixv+_8p z<3+CTWKxa?yKCruS!qIj_QDMKkQ!a9)<*}X_V$-BAQD@_94t|J4fA$Lr*29rPt|^l z9gnpc50myVkw0OpGP`@d7vfn3%_lrYX}0DfXaPPtoUz;ICr2OJi58mablk*rY@_qm zcE?VS(}ChO>bKZMpt#NUXaG-1WdKCKU?*b(P;zI}w*MCAGL2>8xhd)x_qBynuNz0| zbS<9uH{+YN@!Sz)?6D0>H0J~_hQX#61CIVyvK4qj<%Yr1T9&Y3+F62JgtvH3_jM6; zZ3;h5fA1Iyl@|6p1Qs}wFhu_RO~wKsDfgn(&y~gqsd?TDWqfHE49frKAgr|Gr)*+@ z_tdSy0HhzN(0BaZPg{ej+q@UL?+n>(s{b0v{jeLDZiwf;2KXV*UH#305$}cK`ELA5 zXnPQ}b$bCTKGpy#R*j&i3{&08MtbXZpRY;Q+NQMgf5B*t&~m%ClAR6zM9?dO;Igv4 z=^UJV6s}gzt{}jOg_5r;or>1=kGfohuiIi zM}azB-*=V`@RceSw(ylkF|W9X@;n>hz(12?Lw!q|zJB&f=@9fryL651cWHB^Vtkx_ zh30@(!kD9Psuh#7Oi#bCB~Mwu3gH=>>nV)?5bzExOyWm{3um|ooFLu9z7XF3j|#;p zSbqbU^Cz@(l1zCD{fQ0=Ie&<1CGQU5H|n3b#dK5uMP?CB6qylz1Y@U#r{YHhpv807 z@lv5$yE8fwdS;4pisPKJ9mHs(WKU&Xa-W@Em1$=(TCM+KcNW)l(u}+l11uN5OXr-r zput!Wbk+2Rr~eK)RbCKq|NH0tiSnK;nyzR49L(WkgZD+qbj|6<@h-pH50Oc@(6d9v z>o02+MIcA{ZajDlJr36wXDRfcVKg+4I-ktYqWkxd1sC>*)!j>3UzPTYWtVTLGIzP7w)dTk!;rjM0Bbo?_P2xHO}3d$<2Yl9+U{}w z2s-K%zzf1@Eb6SPVBxS0+RS4YBA&eo5@F0lj{d8LoM@#MAb$tH#hqIPX=~Fz4T#RkJ!p$LT+=?w2OMw`^=D61z*}#<6S|d$Jm!J6 z{G4t1YyI}Dk{G2{a@81!nA{yh^M=&7%i+o2nn@+;;; zj;W;g_qK-^Tt->j&+0G;aAaW=mLKlGQXn%$=GEzZ(<%aa<#%mEXW8D}0sc|OE<(== zhBtL|{`A)>jzQ+H)!1Ic*kaLThAQI6*Q)_hE$V3SCqo^yi&&J71jyXZf*t(iiS`h1l08Rec_9`Yw163 zXC8^o-wPFFw>p9n?WW@NH$3a`ARVC(=Y^1bimnz;0&n>bv4t?OaI!;TVwFHDoDz() z**k;}DIg(S-{@wDXC(w#HREVxIJwA)N{|<4^YvQJ6 zpYRUyTQf_WbDpIk;qFfBRl?lOsaTsL)8LqQ1@=sVolaPMqIq3Y6Bn^%@sFRTjucQ6 zYZtFuy&UDT@w=*bLV;SA8sU@dg6~vNMts|=Hazf{Ie3Tea+Uut0V~m z6@-eUp|~r4f#&yijxfM+?p{iDaJnZ_hyjWJ`6~R!*)A_lkLLu~E9}E1{`fbU9xruy zg%_^&{K$zQ<#ZvX93H?N8=c+A?J)tvjdqGYQCy5J(DBhy>n{@XzPMkxM*oG6Q{T0! zufqHQ2`8u@mC-1` zsrM$<2b7D!qH6M%v2(V>muyG-wPR}+P?7)f$HNI^-)oZd7)p_o1OM||FJGV8IdI_v zy~*7D>IcnToA9Pub5pIksn*=odM@bYBa&%C0(XEAEZaOQeGrfntkeW6HKE>gMtZPZ zL%rfwp#@(ip%?N=xQ!*`NQjkB`2$NFc_A={vqVka6jEKJj<+v!Caf6H|%E=BhbOASB7$CZaLcq=xjQCwH)Ky7!fTp$jq znMN0M!X)qVd(>4p#A$w#x0;R42Z*5k?u^-s@t?@cR)9w$hW4FNYOhC`ld)nXmJm5r zG)QEpPRi^Y6wj^|8A%RO8~d&P<=w=pa!Y=>3hd+ENW4XDy5&EiZMe(2Z1Zh4-(;KSn%Mu;kA$*K31)&FZJ61=@#O(}YHpX-B@vX9&C9jas_R8*6 zD6pfFL!LJ;3ul(Be$2v&_6wH(ljtB2ahoWf$@JFF&MgC5x4s-(v(%DG*w+Oq0a`oX z9JsPqNR=sXC{oEk04I z-`0=QF=5Lmnpg@0b#T6_bL)WQ4j6yJz@Y2t!D#uq&pF?g1;e7b01q^iC`>yn&@&S5 zp{!K;yI(Um`S5%i^DDyAKuZnw4;+g#z8uIC-ZFWEWN;7cyB;f@H=fJ#`$9c@z7%yx;X}q%~lI-=1wkhND=mtS(XvblqBOJqgd^e1-VPt5g&26guv;k0VpzZmt5r8-ASZn%ZS+jAu_KzoSeS zzrbN&9vCPQ{gDEwC)|HSWm~bCQC_}4L%p{nXec-bzN%55VRq!TToMjq-gkJK{#7|V zkCK(sGq6Ih4G$Qyu__PG6PQ8XXL$ZRqC7l5q@sO?C*NknqrHmyWYrpti}nSDz}4sl z3{37zFb4+5l>)(kcBg<-WRr0b!=Iro_XqNX2+H}qlsen-1=OCxmq3oceP>mq`*~A; z>58^*MitLs62<$oxj0@ASA|$kpWq+7vOGU(+q)~GzivGKNSD`h&#FYTg#ifgTu_$f z3p79o0W+O<-0xU$Z~J-W!L={F!h-9j{1UMoXt3U2%-TON>&J7e0gkb?J;E2B;u*TV zqdS>!mDj%1h&0RV3 ziAps;IkVlaQl>r`tQ2vw86-8}fJqCaoC_NhGVz+^Bu4b`h~M*g$-JJrAT-p>uP~~p z4OGGuU65J`WXJC?DsyWud2lnmIhQ}ycHlu8>yJrx#(>VyEQF6Lpjv3=W+c!gfStxZ z?pnHEKh|Q(#BpaIUEHzN5s|r44J7~JCS1yb$TxrK( z4cf~h+p#@Wkq|XG?Lk$_2izS8!wiQES^m>>Ln3S_1%v~IL4FSrouJ)J&u6c{?ft_Eu>e>=0zr_&XKfb&yOwObFu895y4balR zX`*8@;1?PWhY~*a4rgpW2v`M*MB4APQ^xbWto?EyIZsEavg?_Xc$U{+B|hZ6IL^dO z;CnOmA0bY%AFjmijnGF&n$pF&3`>4c=)y4?F&*yLRvP6bm}&~FKBSB47>CJ6Gs@li zPc=~+VkFp>^ivF%QNmQ|QQ*7{8^p~;PMWGR2POlM@H}gPrkm0m0 zEyVWQwCAf`!E%InOSUuD%^DXvq>Vuj{#*Mi5rVesh!!PV}v#&saWc?34 z!N@;v>#clMW_7fES?``bdvNgXa)z#vW$fnHm1CDbG znne4ADsyLY4p=d|J&Jj*M*TYeAtP{U{*q7~KW0?j>E)-10c1JJ^@sbFs}dit{yI## z8w9APs<9l5a1@}|kAD-x#W^sQf9XR|V`P;m-!{k0;H0Tme6%p&qmXNMZyp%%?!A-^ zQsa+wb}VxlxxJ+i!>JqMptY1MUJii=MeJ1mN=Y$3$5to`*K#Y#61YQaZO4EtOc(~| z#G`7iQ8jNdJp~k>-ml|oiWU!7NA7x19kKIvD<2d%tmRf%rEW=UE4Z*DA6G}L?8_C^ zUEqH~l?+>O05nW+gyNG32w@q44$?0FrC}8e*}(7NHnZaQ$Pw~iu8j^6-z==6tGa@{ zua|6^jb4`nVi$2sv>o89A5RH26M~z0j*ed-5m=jK6g8+J+XVu`pMl}LxC*_m4~hkV zq4>rRh~h)l(imC_t5FR`9aK}d(#B>Jb@9dxoQ#xPAmafke2al>p}gsjRC92dMhedc zloWQjERp@6k~fUs^&F$&=YFw&WW2U9Q?(s;(3Ye4m$~`1_+dI24t~9V->>^cb)*6d z0^i^i_=WEY3(X`6{1B8f?n~eg1*Gn~mzDO9f+q7gRd637oVahelZ@RZRuwGv>?Wl6 z!?$lHZ)wTbnLL$cxGnj>E>J}LCyD1^@)rIbxRjK9tK4D5@T=5}J9{WujRM?~@V^PG z=Z6BlR-e6R);Wc}vS51PJ&RcPieCTnoYAX)IRPo8p2;d(qSe;E)!WXn1vjoUGmAVd z8zhGE!?LQ*tvGbIP_TI3@^e*QuX-<1RoXpkNt725z0Ei&vh&0~R!B+{>O*qTjGo|) zjyQVx;j=6QU0A1z5Hfvnn!67c3e?v}Q4wi$apj`tt8b&KIv0+3u2r1tyc6t%eBhs8 zhvNeeg-oa5Uc8RKo}I4FyF1V9c(uD1$jit(vUs8zP8}1uN2mb(Zk5%0W__?w(D-D= z^kTsxqlp9urvJc;3~x9bXaCWLqj+qo8zEw*IaHK!;>4dsp7#ulG*g|aB!!?L=t~r? z*{5)%)d-yXpDAq2)4|d$;(z~(LD;cwCJ z_!9NM`ZT0*J0n>_yWBy%Q&q0vH*$MmZx%KEIH)ru7~eF<%m}qbO@t9CYSS%;S}v`PKV&rtmTKL(K0OEGF^wlBslGCX9bzgCS7n^eqpW;kO%GqOjhb!@cyk4EI^l;-@I<@NcXK+l|A7 z*POXJF(7qySBnXX_UNkiRAxcvaR*} z)jLPijb_McI^j8wM_uZTEj-@YL;m&5)*WjuL_D~Vn>}j=bN>#nee|D9@1WEv0vnk( ziQ8XN2KRL93}TfpH4-Y1!<|%(hr*IiQblj_v1y7m3}1Xc1!oqfo!^{_H&|& z$tKzH0(nA$YE+W;Ct1D0K~q~gd{@LcSxz8OqBk?QfTkei_)UMHbbeN>J$g&~q}&1; zPUfdYb5AT%EK=E_lgDjtkLpkXnH1ghBjm)jdvVS}h_ljm!nkb#cp zhEh@S(?Ye*>a^_4o@Zrd~664$itxy&B06)&Bc9KoUmK->1rP-6B- zdp^US|0!uA>Jh7i!ywv$ZVrG!Dn>%ad+-i3Oxg(~Z-@P|u1E|`(t3evqW&{1h;4gL4?E|&ZntW1PMwbJ z-R-5%#Bd@fs!*xZKe1=)bZ#`Yc1=cAqwkX|#a?bfv0gF?(iBc~O=pcrh`|9T{<}nQ zra-QzOq}uD8xr!9W6LSm+o3-q+v&L!X^wywxu^A$*jp$r*ZB6N+Mv7_HBB2)%(f{z zT3jNOq8=4K1%IvzrozNZO@;gT9E9@m(k|rVWaf59gyMy&$()0f9yA>Qs>DH#Yo_xw z0pG+$HOQaoRXY_%sl-p~o6)zLO^g<6CBgczr(IZT?75Q>RPAN zs?CblG%E(rji`bb4LLBhv19Em?K5v%AXTn3 ze|YsYZ_;gx94pdO2)bbdU)8mx6KnWh)roseaUF~l2pYa37f8z4TbxbSHhV(+ibVWRaBty}d*A_98Uc&REbsZ2`CQNj$K6`V^kpe8Gb)8OVEd%t{sSq>Kxo z)KWvZgjYi?c8(f%v&r7gzQl-hcYuUiQ)~-223q02*KX&ng9D`9R@xeF4wZ}f?xCzl z`X`b9{b4v47>YVHhrWMK;T*#cGK`{5_>mRxF2Rzfb+|aDJt~`fVo){6_sXKkVDYPl^O0 zl8nHLhjd(i&~Ud}=#bDXSx;!)jK?8n#;pk`B{*;4;>$>%97FRBjBR6P_o)o5g2RkP zHynA@sIDo7FQbHzgqtX_k2e(kJ>~q7S6)bgIm}Z9{Rs#1DTDNI2jmA?Gv zVgUDBz*Q{Z2IGqgUF%xS^ohlDN%VRG`jacBQPE4(n4em?9A9EBrATLz*9vExsnH61 zHku+a0QS$m8`_&%T9bS0y~k5OL86^Yrg2nPbq;-Io?Wsae~xLV(|MYpsjw!`Dy7QT z%wb>T|K-hGvWP;~&m{|(anWB;3kFOYWK7wZze^8OAxs?aMg<*9c`H=TxtP9v4Q7=fK$csg3_l zqc_BJ8{k1bE=5H}cY86jc0f_S&VXpNBBfAhjQU>`1x$@HM(S>HI+^n4*x0)TBRz=U ztjbF?;6~;J{8Wmkl5YC9Ex*O4V;Fv&l^;!~;v6 zd#wOfUw zryuUuOcEmcd$^z4WM-xJn$KsQ)6}ck$X38wKaPXIf+;C6fHmadDECl)upH+2&B8J2 z6P<}aymMc3&TqFlY$$qFrFm*D=>X+IN3jq{eZLP9Fh@L;*)wqAh~DHwljvG*lNmD7 zHS#5KcP(}f@LFoo3`(}E=^}4kvN31v-eWRFP@EO*-pKT_NqBFm?OxX(nt#{rGX59f z))r3r;L>!`qagJxvwwLT&44zax!WcukNNs>hEEH2t&{u22b|UPR$%Ot{={iYkzLbU z5MHx~{JZ>4Gw6>$*H%(*X(4iT^c;K1XsX9F5zqby$-#KgC)j@dq|7xDMul^&3Xs&* zG8c}JMTe>RLOpsdm$tXaR;43JX3E0bZnPwr_(?7SQUBoYs%g1|X5XNarq1zy(cXDW zl)G1W5A`w1vzQ#5nvy?jnrt(9eVbI>tJr`$dh%z*s#PiLpxg3l6E}*44SU7^duo)IjemQSZ&RUABhHt_1eBUA7X-ev4=0v)m@S?0qZK zN zB0y;|$_LqVB+CLCGR5?zHyxqB#`>F&Nu5Gm$*NX|fb~E2y-My`2`#i;7jVx!u#~w@ z-1DfoXNpbiXd0R{XD)_36Y{Ccen;7K4I~~dJV5(z*uy|>zJZ#|r(G#pW%f)F!|4i6 z@2i)#PdOL+ZC%%txgw9QDHrMoxDpyf%%Y|)l$q@lU_D^AuTmXdoDy|Iko_U=Fr~O` zK?AcwiabfDAVB2nI-};FvLGE~MyWix|yLE9ZKadH33HrjgTX((9-FLYb z!8{t|vXIZ0pbOR(zWBlCm)9PG&(Du~n~SHRs?aykMed! z?M{gbGu_*G&`#P4{jsZYA?wm=VDsw^2IFA2nh)(~Fr-QBCnN zS}y}SNPzy-0aO+TzY@Iky&n+*9!6tcu={!T(r=u<1#_%)n=$BlqXS`%YIC$^+}*cU z$_$+s;dl`6T|a9Yhede}1Z!abKp#081G?xz6K-lhrW!DQI-9v@(*;0*B;EPgkvuu~I4!7^z`%~BuKJQ^Mf#!}b#NzpMi zXJ%$m@jI&Al?B(DRcgBL3AD;tW<>}#5m6#{Ol^!*M_S|A2i$nS1<7Mk#FJ)zGKuZx z;i+})U#pAXHYs@|9MBMdc(U$s?zc!sA84>i zilWYF&%)PZx&2G&7Fy=Il@39?*Qb7pRzY)We{z+#P;1DNMqlr34vo%CmD`xu!Psj( zb1UgU6xgeze5_g4XGN2GsM2oPXYIEBgLmRjzYNILt=;e!@ct64*v9F2ELQV5m`jO~ zWpseAJ`^H`P70dIui*n0tR+6lM5x2o(?l0N8Y$7ZjIN%XY9@1T)9;FizIIG(L_2C_ zgN-**DV14M=Mh42VpIp*A{hAtH|1fFzT}$@M|_tVDnBQY|9VZ^?+L{a@xIQMf#1_S zpFC&tt?k;^+To{oR`Fj5$k_VL0SM9tl{$S(E0=)Bvjk{R6)K+qB%dl;7uAvLj|K@v zbV=QEy_{~ja66vkdsko%{rQHFRkW6=@Bm z(bL~2D#|t!?2Oj#MZ(Mf$m)qwNwBM-u#%j_)x8moEO5LDqwPM4F`QcVCXCBZtn(%` z=O@;C6DASSF^CzEpE!*&As*YwGkHrHo7rDWbebjCowp(q=%ut=XyuQ8^K}fWPE~9} z0bm-X)>QIiJYlZOyuMw7+F`k)H6PXfW4%@v472mG`JAVjj!ph}_A^5C6x0a4oGS73 z_wIvjJuo4&reW+E(fH!yB;`;d=OnxV^f1@?jo0+bf!eCfH&NhnF*1P6LsxI98!{nQ z{1-w>`@fTeQ`kZ!r8PQC9@WJTb&T(`e2qZy486i{RH)(Ri1VB+WNp2g13`zX=~;g3 zH|rwBh@KruM5+}iR3w3;@l$G!@+w>v(w2@MUs)5+o};l6Q4NR`zeh$YvvG=f&&Y7b z3N+f9pLs*d`y7XV?PXGC5&HIox^xSxQ9Cu7zryI4O`0oex=%E=k^7{iZ@~0)RYLAF z_rX515?xw(M~c6-t>#32fry{L3Hce+e@o`kHc@5ub@8w-F|o(zz^7mS94&utaG&`m zL|k*jHIdXHbv0r~nz!3y6`>#iF4Hxp_4>L;1J1+w344dLFpXj+YGxMFzQ;7yN)1}o zwO?1qO`dh$3vF8|zP)Xix~PeXf5Vxqbg%o7{05WMR5wXYtq;`7cvdF}uD{aCZI5T) zhOQZ)qzn^s%r#qd>a4j zQ>FQdR;<-VT~20C&FQT!MLXytde&B@4xn%IlY7`qAF*`G{GPSdse^T|*$5>^HYMM~ zbyvxW6xV+S$-#B$mfp}O-JQ5q{^maE(d65%p02+23{1Wpr1!07P;!-}?^r9&iDzE` zgYs<{u@s+2C00jL77A&^(#h4FxJHzh-UobgdUAOB5mCx4ZK7nt*QNV zLi?a(mGHF{QPxVha@b;Z_rXgyC#%c`s2qupWt;z-8AQWApc! zQ!jq0^54a&w}GGc_m)MCExF2mvf8=IUOZ@-MP@NX!7fz7^&$EDqbdJKQcVN>Y4V5ySOv7D*oNo z^K=KiY?zpssFKPLAoP%XIwYRG*F7;iY2)+*dAb&4__ft`{3cn6+Rv#wWn#^hHK$CB z#TU;}0`XR-miH2iI(00i6h^Z>ou}A~x3%>LYwmRvvtofdGS|yO^C#6N&j~0e7TW8g zen(Df1PTFHG?SyWz%bdz1 zYcgVq{%LaBYq<8(9I{qoQmcD~=GYi9_u58{b{SCGTi;t5|12kg?0HKRmvBOYn%b(D} zLPNgLA;VB*`RRJ`Ny|%GnMeu)g~!R2AG+TNEfz_nhjXbCeQ$SbJUeOWf9Qu;EVh7y zVDMj5OXdOw(d>H0VSkw54T+zf%;Pq8=TY7iIkF}+L?ntEsHJj!p!n`*pVhW)9B^~a zuz}pM!ruV}!90UB-p#=C;}@dhTF644XCwkPE2E42Q(6OdR^a{TgsgGSV_lj2?|*~C zL6a$oSvftcYjR}!NACDgQ&0PxSl8sJs7i~-$Aq&fEKJ(gE&xMxGUl(_h#1*3_^OvB zK;O9DY;1bGW|2L%trNhucc;|#wH~7$BS1b+*@#y??#6Y+k*iLvv~M75(3eG{G0tX*M0Lcx~!2d3l8T) zJM3Dt)ZBxNYcTb_P21{C+v~kABY%e3pl-STvQBY8)yAIY6uU_`lSvF>!Z^lU>c7R1 zg1C_qrngxY7ew!|vaeo$*^5>-xSA%jHdczC8u*&GGC}NEuZb$2%ka1DbuFCZ*(Z2L zV;tGUwJ_de_lfu(x|hGg-rl&g37vIfgQHME=bu{!Drd(_tfQjO6Rt6CRps5k>gbfH zp9F^epK{Ga@dAh!PNhZ%X#A0Lq9$(hN2o`d#%=2}v-Nrj-^(^x_g*mVKeI-Xu_j+S z`#1V&M79jjLaM6(LJ82hIo~|e%jrazfV!-kAk?|Lc`FX0z~1~iEec+}Ehkzi3gJ#=smTt-lIO^fP|j7tSZx;NW?g>!Q~q0^_%@jXxZOqK-du zw&H5V@&^cy`3MMf$P>#|Jt^GPCjFz(g0NYvO&#Q|?)YnIXb%4fA#M<<7yk#p>+_|) zUHnbts`VS2Ag0NKg7rMz_OEoKT*~{LOAx5r8RP<3?%f+D0ou*HAlmB$xKXY-c*v#( zl3f&2zE~Y(2~@d2Zbtq44CUHLxOJ^!2T17*B93LYR%J29=-6fYNPp6O-@)qk@#+&oxQ(Uylh&So~WQP6>EoHXNhT1QMZf4+%HJ4$S z4k26!{mewJotu}mZ?w*i=I>04+B1^K?DsR`+}U&t&ex5}JxlGqi!|dxRWSovnu!EE zmpI_~tH7%=;We)iZmE5eyC_yn0oC%sVGh12V{;N%Yvx|RbnkYJU!ii zCEXv!itXeLktKSjLS_#4P%(2{{Jj!ArzVE^h1XRji7UJ=7lx^#)=r9r^(bm*>ByL0 zM^*k={X)au>2RT}OZz{fv3*e0K4rd>t~8R2KhmuEBb2iFX)}TozSAw7R`$Qac>Z=t z!2Ay+0mr@&Uve0s2-WHv;GY zo~!U}JMMA*GU;)KWK4wh=zCWf+(IxeVjYppV{-(Jtc%2QSghQiEG>63OdG*yu`q6sBq9B96tO zNZpopvZbGq&HuopF!+8Ie5)YwN2zWvWWQfmMyo48HdpfSeLAx8Pp%{I-bfP_Y*gev zFG{1G;tU?V=Z<@M?AupWdvBM}*$FhzuTDG6#gPJjJMKLXfm?OkkVuu(5ZZLtrBwZk zhDTNHJjL#Ej%S}#$;CGH1{lj|WudlSL$<(0if+=>X$mtH2f|RR0)N0)(J+iWIjO0s zshbiZOj!js4VZA%kfT^=Y!utUWM<9OWC0{m{};C*#Oj6(zgWQ^3#LlYmjMqKdQpG!<$a(}m$vkVh<1v%uxbgw zH-N1Vg1FQVb-{o8R=`mHFOpwqYkEtp@g8phxfTDWFVmAFJ0_uLIc4Oyqftf2_>j+SgKWp$lUs_RcjQCB-{08hg6JLanjRQlsY2V6q3x0nn%<$pr; z{gD-%XZLakQt2j1qAL6;DJ)OmQCb>#%(xHVf@l_5{Envj*yFe#K`skYU6?+h+vfl4 z%zEa0ab9_jXoWcY%n`>D%OCjso^Uhk;}i<|Sh%0gzmM{B(sxReMLc($DxKSJ zrMSfWSN^V$?Uzw`Mbtm^#|8b#tZ5L67=2R6=r^kZ5-TLuPt5W{$nz0QwbRO4&*fK` z`0=)9+&xsw(3LJJjrQ9_qszUx65{Sn|EBwKnfXI1*XbVS;tpD}rXYf-f5Dfb@<4|& z9{m(0OFSxg_!2&Hn*9TKQc3;+)tQG@! zAF}#rJogJxz!xunU$QbkiDC~WwcaxS5D}M?WngXPGIbKmj0v^pmsJqgS*m()zg0tA z_XLBHnw(#f)yU0fe;+X(v;q-bN~aTrjgGBrJBA!>;}i_fbhJX}?Gg1ard8G=3-(#s zi%P; ziWc!2Qa4i6@kF9T)Fu|S68-B1Hh$yYP1FiR5a+?su&Iq zywVO3q4GUuV}%6L)E$mjJXfO(RBp0kRQ#9g!SBdo4?2LM{V}*zD6gYbIQ6a+GFF&M z%|5+p(=O%$+$a%epg-3RTDY3gp(PqI8~W(tXW{g-yw%*#jb6OKd&XH-77q6|_z&HL zWa~^H*wr$F4&s_NQ$Lw?BhL#jonuMWd0Clwv|w{K7c!ZgDBsB<=vD+Px?o9#TZ&s! zHNrq{Nfku>0AS~Ca1=my-*Hah6%|fu;t2ME!4R4g(_6Uif$gBdppo*j(I!8|{M5QD z>R)$BU*Y2cbsyo=7|*Q{U;O3La@R!DZtV@fF%P)jaVcRS@5}PX#18VujX;R~&wr~z z{>)YFOZu%{^2aQGL3|?yI#iH?qwei)g-r`!DHbTnLGYtj=c;S&tI35-#R2vQ> z5L`)v{|J*FLaVq2`XinR9+)0(leLY!tu5z@x?FPLvI`&Gm;CLL!hvuBs@lSjoxsHp zu#e;oiRLY&Qt=Atx>6u5@3Z3U2&77dKx!6x%Jxa_7gaU0#Eqs=+d&xzi@`5IHuM3+ zwXe0dsKK8{c|%h1O)9Be-^g%_D=)IO0Z~&2EhoL;6zn}810_hY!nUC5_KdB9G#FTO zZ@?gvx4=;_W(^hS@|!wN3#_$5|0or*p)`|U%s*X)Dzf4aujsdIiL2o`^+UE7G1QAG2ZR@q&>r-uR z3z(+&qkWm?sd>g)IHe1rg0#ZQ?YdF17{)BPfZA%Djtsuhe@m--VXtHwJa&srgXv?- z?0Jc63B9i$e4rC^HA%qyFAl3@{*StHhS%c#@Ir_?302zsK&q;nA2hrNE`cw9MKvy1 z6Mu19CTumLjd?TX-5?updcU6LC>xA#(8T)Y6XIRX^>_*pNuXf}DP7IURrWJ-FnRM< zVtw<+N>7cYr>1E5_2aSd>BIry)97L0(omfP%!sWm>F*_f^*}H~8N>(t zBL(hJ9r^DFL;2Q`{5=I%5DOeQpo2p;cFfV!rE4Nr?a*e$C~TdjN4xER3ohngeS&EQ zPlkg3D1Z4y{ZY0Jd8W?+c#V0-jHGGIb;}p>;6|3Y%mQz&Na&m7Fk_93s6{d){KIls z|7P{uM)!X%%Ug`>ylAQ3_0aler6I52b8{k~JF+DTSqB2DhN93A1zsyFBJBN)8*l+h`E!dS`MS z5BY3TP`2Nf>=Yc|N^a24t;yf&2Mn6Jgj?uR7narGC7ayH=fZ`b8LTL}&+<$*7a-Rj zUUDfKGj^!X>*SU+^z zo~fDj^8e$FXgGPRvX1%%^L-Yv0Y^AQ;in>hgJw+1LrVG~_2F z#@?W=q-wn$&87IVzLTfOweNb{=B&-^IV5!!p7%><@~NbTsfm0QLb^F*M0N?g*N2q% zMo8lK??d8GwkdjW_Z>YGMz*Gwb^qMD$rbml0?mJP*uco>s`lEe;ty}WXC(VznQ_ai zQuFSau85m|b3Hn4wL$sJmfQ_5Q6@bNEBqmH;TCNHu6@M^3%r!zmD7@c^PDovAdz7i z{dJRr!s(fVZ1=A++nQJH1n%}pI4A3hS$QT${lBfoUE9g8&&2X)YL!rDz@ypLcNhz^ zCFAQvH&la{P7rj@avFzNR2g>?3LWoLt#HUg`e+?8`%yD&wZt7}*bI3+H?y_6cY5;N z^@RA+x*%EhA3)UHbTG>(_+n=K;i?J208)M?uC%AHM#YA|bZx7g)0%l~-MwEtyHIxh zbY#c+1`w6n53j}Rm#$TIE@RtayI84{;}4(yq4>&Y2tYG-O+2gfwxk?hPPv5Hfs_&D zl&9(JvK{Lqd`L~>)9~`ARW9=p<&<|xA#W>rWw99@Oq??~+z`*{P+p*h()*-r!Vd!J z4ink(sXhJRa!t>YIm~qvx%hfW`Ri}_O3G2?6eNRE>dGlcxs>{HiX4B)Gpw9)#vrB4 z8X8~uoA|?P#;%TMzwAP#uiA!~4d&c-+vxnKM{=>-P-or5!cvA0eeC#1YDl=yY^0(_d@h{1iup79 zL_9kZ76|BS<-uS${WWrpUImr++PkI?4=Qi|99z&Vh%}xn_7}XSt?AP+-00dasp$o- z|Btt~fsd-V{)aco0t*E1B0-}@i5fL1DzR7zFOnDXA}<=12#Wa9D!!EdMBN2c(2ctb zx!$ggB37-asBQhXwrZ=eNhAb<2~^aGRwG!YO6$E1YD60l&^+JonYp{00QUDhpXYh_ zeAwJOcjnBQGv}N+bLPxU!{}2Gt%PQho71cs>eV)!9EE>!!5_DnEfmW>0Aw1I)l;FERdc$EF}A4fZ#Pq z<0(AR7I^MKHW8Z;a5bW})J3h-V@Bj9d_{Z44?=yT{xWDV77eutfK>ozIm^C$sx*;e zSH$v>Xyc zbVQ>NXt2eqq1f{Q8H{qH3t9zYgMS-=Fm-=sLk1GoNvmKki-eG+i;(J&aR}}Jz)F7! zW%#72geF%x{{cCL|A1H2B85{mWb`9VfcJq8-(1hABj^&VIFFyvIwf*W2jl^f zDUss=Rdb;$PNR&-u}F1okrz-)lUO$B71jH6{w>B@X9j%YqD`PdoPR+b63^e`uZ9@B zTbhy-UAKzS&MaO3{mAXy1=2&R6%t-|EF%k7-$8Q22c)&7&s#)1^fj_Qmhe%+o7RUut5^o#ksx8dGFasR;mrgAHC5`#_Rr%YN@yJJr za_Aw#cHvhHYDFsN+lZgl{D5yf zyki0wP95Gs;{`!3aB1-nk1@e&oitrr-dNR5gcFpAuPhgExNkQP6 zxc^kmsUmO)fDqRkTH@LObpcGw9|O~?*zc_P*j^>(K^RhU{{*=YU0Z5@f!~E9Au;zlZHA4Oj%2G194~pw*n;W2P!h2yr2}CsscUSu8}_KA|j2mf0C3w)yk;n z;+O&qceGv(Q6q6!POwJ*Dj2#|tStV9OH{!KElGN33^eJ#gY6X$!T4)xjRe=A=gBcD zga#~tI>9s)O;Z2!DZ(_#@d!&5^*EP;fs(;XH76R;eWcq`TAGl=I(jK-z0dR|HrS$HBr4!GJ?KI*@}u9A1F@ zq_8;19;j5XV7l#i)eoinZns?u1X!nW8BjdHs7+k0Ul6GtP zqnhbt;ZgV2y4=$+26nN#Fv+eLsR3l5>9w!F6{>w3%mkqCkB>!0^_>HOlt8~SqbpkH zGC!knbwd1d6d}(gawna@1DSVDO5WR$cddr11DYs{#N+RX8Fn&}*InP`UWYvN8#X@Y zQojguVM#W}+>PpTR^?w0CuvAjT6WK+H(J9bLCrg88NnUV%p(pc4E*b}@9W|KnjU;5 z!89pA*h_bSz@5L+TnTxX`$=;xaoUCAkD!k|L7&-9S;hJo3fQ*~0AEF#ga3AWW3cL2 z$>UO}4y|r@Rgp={h#PzG*)3RpLL)t$Td=eFa!IC04tX$xCLBDnU13f~uVH1L$6?D$5 z1DQq<)RoB`UC6CB{O;4R%TEZ6iZ;6ml#wkLE@ zQZ%67ge}Ye2a2pW{I|bU=Vgm!DlrTixDn+BNBhz#Nh4)2DdOR;%X4`^U2Q9;wjMB}{LhENE@(qMC0r@$Au$1M}tvVWt?#~gV2Jh@H8Hojg3}k2Y>wX%(zsQ>h zRLn0h_a6*ec*<3o?vmWJ*ka!H`U}EC{gu4P6Mu2m98!$cM(A6(i9W(}=vz3B1_DYC z2a~Rm_ISmIM(iXc)*ew&-q~bA2J*_FMa9|2wd48dp(J@n)o&(wIr5Rb;9U;9{^U6E z**r*n9?C$!5glkx27z#V^x1bZ&+RDxWUbMym@$M2=J&L~M zjtrTZTKDoDz1VXxVy~${vC{u%j+UjtXYKncK!06b=dTtsYy(w!?A@hd$z=oRP~`h!Ym$PJ|Kc$I3;j}9I@-!Km|+Xzkd=JuX(v}HWE&7E(AWsbq| zFBN`!;9&Srt$k`xkY5HVs0zh!vN)sB@Rv8^ISF5!(Ydg-M<q*lu#8`yrS-H7kpi@bsa?CMZCdbcl?+ zc|d2Rxup!NqYjbrTtS;HB{JVk(#WLLS%n5%}n-5H$tf#jZ&;G>Q;C7xbCKAKx`DS2g%BNHvksny6XsRY!Vn_ zKNBd1@#3q%_D0d>QER7QocVIHJBK|aKF58O+zJ% zz+BSkk@kmZ>60wCnj>E-C#9B|*Q;t&>nci|FU-PnlQj!BvE7aA>z+EzXN;J^j8*Ec z({MCw`xF*N3?5j999RD;zBdTzxIEr>z;jD|c|E6mE(3Da%5!NwI0(Cv@{xz{n1hUN z$Ufu9Yh}l&J>-@B2r7Dna#s5|elIZPj}DpX-jEhNAFHFMKhA-eb~qCx9Zeb$QXH&z`B>V z8J-ZzQp+d3C-iY=0H5uLJ|EyI!WDC{eP9}#f~0k`c4D}IJz(F6Jgl%_vsh?O6gNfZ!RV4yUH?pJ3;G)OaOil+7tbn>8jOJ%}MtJN& zFqU*5h{psQpjqj#8^Cx%c50J<0#i+fU}eJ>Y$2y+_L8mxAeL&gG*`=Md@QP7+pdL6 z8HVnh-?;{Ib#00aUYVMA9lA)47@%=$uSMR@U+Q*UXFdFbN=m9@tic_s-C9YhsDFvw z(b(B@i2}#MI*P-LMF+4q8OogYozQ>;*nK?-K$5|2HrZ|bpoVXd;(VV(UmDjGVwIdw z3KAqSZQ$>(#zbEVaBh&&Jq?dDzdPmm?2*HF&(C1$C^na!>8Y6PCnkX;Ch-?kyRjWi z5k6(K3lI}2Q0ii`_H|?@Pik)YyDE+S;y-}ShpJCfpF#P!~OiZfwRLC^J=oLO%I%kdi69v8QZ=A3p5m^e*jU9&V$tS z2!N=)1~q~-ctZ_1JB^Nk3EG2FWZHHs4#u#s?8EY0M%LVz+_=kmu|z?mV0Jv8M3f~K z#RrF&9E)^aJqN2Rj};~xN-)ZC;nr}P7MZ4gXJWvXK0e5L%?22(AYeOdq>D?H0ba6z zvy<`6n5;Xn4hOou&)04ZZY_zqZYc4bhdZJPw^1hWi*bM(C-4nL$N+)zQ`1UUqD$>R zUD-!uru6ZGY*g1XS2nm+wFbhXtm({C9bdD23%#mU2%-` zF8W`3SJ*G%{7-BQ(3XU@ALflAG;BLCqN@N)V;Rh9IG>P3hu8lb>Tg1d8i^hr^D}{Y zXA70)@^i$vl77d@n!=m`IRnG2$624NwN&9A0k|%;0K;6gLbP)q(N-l6bwY&=oA4ti!`Q$6BTlDi>23O)_6U5F+2#`*oj9){eOjR54!)jR-Sw?@ z7po;nOZMQZNxUT{k6M`23uR*d==Beo%pdMnYNrx07@7!i%CS58X0M}Q#W|0rPH3WZ zsdJ3xLAtOq0F0I4U3EF6>yu{V@{Sj(xo>P2j`&H^zhr0CsV zD_xXYjgbAHSr~o z)ws+)sG*Y0I08u;AHh@5=Sa~w&TRrPwx)lpLbv3p zZI(EIMI2mBYuJC75jV~!vhLiJXR~mGOvKkP%ySwNYI-Or#?q~*4hng)SSdAMG7&iC z$Ck0FUsV|%elb=ON@p|`sVnBh$U+&JuXxu1z0Bc-E@9_{CPHtdR$tUn1*4Zgj83y?H4Ws zgC5H=@WX1vImHs>V-wCtGHzgGD_&)@%hcI5|C?6)M>t1X@jDiETM-?H+5o8O6OjL4 z(u-+jHvv+Vr^ z?m%T8Yi0{Cpmd&G6>HyrX2K_n_0ONz?6-lu5s9(iK4^FcI4c$ZuTKw<_0c~b`(~UJ z*0~1VksW^x8ALm<4@5Dz^!KZ6p{{m-E$d418ANd|sG<|%pC7vGILqppfxI^$ZzFFu zlT#I|&A&1F-E1vr=9(9o8frPQ$_n13fP?w>qXcgE`5bS#I3rT*x9*aBEO~s3LdNPl zf2>&i?tU_3FjikO(cHVIef{1M1)EQ7BZ&s`aE{!7EEKtP%Z2eL;SD%>H|7nk-;v(u zJ_%Om?qV9NbuDZ$4i#Yd-&q{x*qm^R*6)R>9FI6rX|dE7sd&QT+BB%(vH z*aD%%1BK)s{EdrDAainIJ4;I8`b1=1iY&VL3OvfRp+KJ zXstLXm0X@I1HUY<)dE|sT#RV3YJjl9)g4}!#$#}%DFhWKMgxH$^0@JfXtv62S;vqY2B)<+oSZL_Nn~xB&|OVi-6W7BPU6Z-b{` zQec1g6Rw#Ck0IGM6hey`D?z>BK)gq>6|ko+VK@aZ2Lk!vu~B9^mN@}m=GU^I=v;=Z z%4>teWF*tbbfQ6b4m!XWiztGQ$`h76tqM8>zQDA5cU6>q_QjCr>r-T(i$ix8k*L)gcoX6{Uk3t2Gn8t0$>IPoFEYBy3jv7DYSP&uzbP5h&bFyMvaN_D54_ z1S)l9wsaMzMGAtYA;hHubc5E*_PqqvuumhD4$Tq>lImuQb0*!vFRS=u=#uDGr#Pik zb$?>}Rj-bvZaa%G-$rR&N&M-)wI}`S>C8KoO+lp~!6?&bZbIdZI!`=~ZvMcU&m>s`sscwM)Pm0(cpd^Dx{DtxKW94+0O=`2QB{c+u7B*LK(ISV;h zOaju)mOb0G>Ioii=bWB8yu0B7`OY_-Epv=s1pOhbqI=^IbNNK*jc&WWY&vFX&&v9= z+HVM{fDt&xdPHU@ILe#G*ojbu$~B8U{1M`RKfRq|!K!JIiuzDaP*Z#`+Hw2;s>`<5 zq$}s~{Rz9>7v6|4lG#_aC}H4YL=RRfloPND2sb^BAH7@=kYyzffH@6Z#lSEOaXf8%$7q}J#9e?)&^!f@mqM}zSb^gDjizN{O=F*Mm6iY%+&83`&TH!7DHJ9>N zhxjdJpq~!tT>37ap$(TF5%ua72E=?s;RW(?aZn+u$%||SKD_Nr4l50wi9z6@_2Hg$Ec*D?2N&=x z!$;A;L&p)O*gp+RfEnx@5<-oZS@9}1DKUmZ)w+az^#UBCo?21h482^V_rISYIs^6; zh6cpRWt&|Li-YEfZeMhXYvM#`grmZ&_;OVdqGWp2NLN5gt>vio(Ct`D-PrlNC`?^N#4&;Pu!tkJw{l*>j*0LeuyhZpL$L*%L2Ikh`&z zce3?rpWA}yO&E~vFY;V%*_NI>4o4`ExPL|TRAH4bP^V~KpqO7&)^pa3y>HQdg!p4B4jdaLi`>%7Le&U z(E15=@v_Q9U5P3tli*56Kf;oj1=lV{TB4D=k!W_fWFq&)J6&cF%n!wW6Du%gj)7HE z)AN(5L}!PzfuTD_WH!;=Za&KDoS&l2piXh6b@4QnWIgdbGMmLS%!_AnPA=CC$#pZz z&4rsmVd`B+yo+Zv5(VqxSqM8vw_QA~fvw~)B|@HX*HyaC)Z<5AhG!|W!GPAw798BLKQL$S3;(OVxWD9gSt|3$8I_wC{7+^An4}cu( zKkG>j^vBpgI>}{S&f|qeoNGW>pp+fwQTqR@DpF+h=`sxR&q4Ruj~tJINw|v^46b%5 zo<9>*52J)E632S;kXfQ~AfVP-gSZ;OFtgS2;UrLztLi9NoEqc8m;K|UqyF%30A~v{}00 zRp-tZWnRkcy)8#=g~I?5Rt68}G(74OU7L|yfYb^;?j&L1)9cBSK!BcJ%?VcEtwcNdoh+dYlXMFJOKNz&Xmy79+c$8_~;)Je~CHs4F~5k%PuL zH{3|f$JOg(tHeD+%L@Z}i|%ZX932z~HMp#`?An|Ur6yZ1JK&*mdK)Ng#BXnzIaTdV%7`V+X~>W2*^+#$3h1av@q5DLM+1`Fn-%9o0DXYHmx^UlxOd}3*!`)M z1oDL5<^)WMrHtlMgazT%Yyag9kh(P?E?j*8U z$9xF=n-3P@p~!6d*oidT16M7mn5axvUPC%jOyo!x9$j5M%Pu`8sjHKwdN^_Tpw=h2 zaXa`|OwMY^Kn2Zp$S}J_@3*d+W))SMuq<#VSm(dgD5MdVX#YlSnW>QfdZV9+t*>D| zsHuD+u&vNiUfLnk8~cAIK$^JU%2<UfEje2~wN?Z(__$==_Aqs8l=XNN2As?UC|KlT7HIlM8m z?|x2R9Onb^y`fLijMc^caJgCD9^CI%+z&ay|I$Bj?Ye|l`!(ID$&{#0(KmfVJE^4y zj?qlmPMoNa^xU4>!R3#0$5VfyYuFx8v%939FMtVqW(!wAr6pO21j=XV1&m&&=HcC(Nx!ec@dC#7@RAvK?MjDP| z8DWfZyA;opjV}Pc4Zl$go2S<3&e?oGM~JCCT4T8;FcFzk;98i~>xq=O;Ao>Gv`<@m ze52WuFodH=$lI#`!f#xPP+f&A{|BwdmGj?HR(8o z6{-ov);`Z_uvyIB({?cFBClbPMEr0PzFJz^Zm2nkN@r(TXe17NN=+bt{#j>C5V}B! z@}efnFnN1kzx@VNVYOOFf-RFbn!$Xd=Rz$&@NKHRxr9Db-dsW(cuQ#Tt-#+|iJuhA z3bx9+AJ?@;QARl8s%Fi|X0!aLAu7xAaFD;Ou(z#nrjD$T=jTdk5wlOmFjObv`41af`-tGJH+051p6X~y?r!E^D(OhS*Wj*>}wal)|+d|ERpLl@pUTj zqsK>bV*U_eS?3=}=6kk&Z_)2Q{r(&MzBg0lU#8z}{eF{v@6hkOj55J)ybdje(=6&R zZn;DA{P6>daD644cE@q&Vn~glup0G<-y#j4@iTnCQNORlyM0{K0FSKDDT;oMi7RMo zap{Kyg@uIo%w&L%XahhI%03}2C1oQ|p+DxfRZOXZY?1hQt~>^(xBr4&F8*+H8DoRg z#0Vc~IlH6eAW_=Rt(*uaoJIX2=AH!6Y(0fQ-yhBM7&OidcQG|TZ_@YTE?#a6lP4hPe&Y-{ z*7>R!!(DvpYesR*t79FB#ix|PFB^TrnQvk`=@cNq47hqaAH@Dn;f5>ou5nrO8X#=9 z;`Ab_4+q)QOb8o4bHDyW-@`nlt5Z($c<@Dl1pt+98wd%EG^pV`AiV&`b8i5qaHz2ZSj(0N_V*+Yuu`?`1>9sU4Fe8U%QyE+ zTl{WY+>tnb&0Hac#Qv~?pBw)13Sl2$MAkWdZPk}2f|UnApaQXRi4;9*`7ZL?NmXkZG|FP>H=Hk z9@N2%?qn(7rBZfGtvB}4$|^~Rm-x^;HQq&rfMF8_Rjp;YRi@v4G|P{#!55ZcAjyms4ztp+)AF90H&1L_#Pxtb z)zBQ=j#T8$BKmPj=IUZ(6z5mcY_SMXFD|cV(Fpf{z%rudRQF17U12!OzQUWNc{cL2 zdHAb3>V$FqJgucT0H1RJ9?{|=$t?8=a?A&lG!!98$WeC?Ip74NqP1T*4NJcF_lmCp zN8tqW%txUYl>8wt(lWyr*_-2ZDJF4q@@@X(td&(CmaBZXAZhL*Xb zkQ>$InC<3YQ60~qNSybk4xF%l#i@K+$I#uT96({dZAyxi+Q2eWHl>`|o$(}H7sJ*( zk6*LH+}*hm2Lp9W(5kCX$ zr)qvo#J|8~!B;;}$_3pRrNpCtsP6IVwa*+WXOp!BjyCrqPp{<*WsfW;zA_iKi|&Ap zsrE-ps-;#)Wl_(3nE5POEj8udIm;q-%!lcPu_V8FKT|9jWWg`gbF`)Hd`8Wb=E6Eg zr{#9RF5vQIXhU;2fS9LWe6qtene@5ljvc!1(p+yEv4pZ)!Z19GxF3 ze&qPX5vhfvllcaS!p$v{t${!UA=QC`?xK_Yfk_Fr;iV7ufHaqF+R}%kAKE&ZpfXa3&gFB=yRRwm86l_gv9s0g0 ziKf(hD8%d9s8)d4AsXfC3buXS=&>?>W($|bsdcFTJPnQhEEmc7z^|cQp`{dg zJxc(|zT*ieV;ob+gdgE3Zu^-3QcExU2lgqBIlu}8NS_s&;x&42>}Tg-fX4aL2b5!; zCTr^azOVj^gDpHM_p?KuUDb~Ef1hkW^T~PSiK9(7c)=!a`}rA7%8qxb2Sf|09!rjD zea2O3|A}n>f2$=G|6cfg{N4X8{M;cXJH8i4y2B5S(CUS$nqf%DtbIQ5yW_vr(g#24 zKPYoq<2B!*Ry12Nir6n7`LkChOi-9|@`I!0~ag#JT}ie7(9%y&j7^Wzv0HDfVd zed*@Md>@NpT-1XO0e-oC7#Q`=>OR1@8lSPI6uVO4{@AGQ1H(D2h)-4Lk;0v9)p7w7 z!5>qt61pEUtrDtspHYkY%%7 zOUVy_dQ^cjH>k4^Rj*^b$TwdP7anIUdk~Oa*~zy{_a}LigRQ!`uq}fsJS?ZjioN2> z53`8;T&^B)`xkITia)+bJz$TwdPq6g?THh>pC9Zyd`+DXp(C(RBELR0Ot=R8P{ea1 zIANE+$cWyouxhv#wF`A-J5T=+1EkQKw4Me71*1cFU)qA4@V@lmiJV<5MQ$v=)Q~Z_ z+?dl+XFkAA!Fu&qE-7;Dv4=!3p+=KeHZE}6?jHvWL^szjVw<3XXgJ8ICY=52<6#p% zt}6>HPXe0{V4W|af3nGC#%iz|mNthe_n!(#@FObsLas0mGgg=O!wR#zx?I}N9rn=! zS;0ZzK+V6BTVRlfu?|Il5nKSHB#YV2dWJ!G$bt4Pqj0k3E4}PhWiR!*Uo90QjN!qY zl)C-Fvw(f_Cbe!_RRC}A1nAU!feyuw{EkpNfBgj@A@SfU8HB?A^mG(R0i`A0o$nLo z{L?7!p{-nqKa_k|9qRl4LY`}PQ=YvDn>?I6=bIbAUAZ-j<`3|sc>?{Fgt;7ag5A9* z$>NMN)Fw0^JKu3dh;Pblo-qA z5|n>>UfP5-oMhgPGt77F53e7H!&!~Uagdt3Cx`d?jL0o`)J=zX8L=ACHGpRC?oQGm zsZitu=gH_;`Xa;+Q5oDod!04r;Q61TgwJbJtk6%KPv%fucWd(g2kynczo2hBIuO(jTl zP7~qO3yj6sG*1|+JVJDYVO=A==@`J`cBDj$aCwt%(UES8j3^JhvbX+6wdx3alRV)L zi;t1+GSLG2B_zAn99yUk`fwVMDFHqs0sb$aX@X&6BEjFD0DqGUK9mF>Sk*v~ahW8m zIOr^=72oA3f^}!>hJ!bv z5i7~XbuQ6bK&t3`D!g~L5oyD7c<+@)qyp|Dz#CWH8Tga{1J@g?%Q`z>G*I z672u{50{lNU1>9-C!lx58VPUAm7oZ~jcg6<3hg`Fi14CiRua7gxd78^M0oko_$9jn zud6Bw@fy0P=j=dZh0_jttI~gx(p(S|6zQC*t^T+9HK-Z-_C#1-p>MCkwv~bH;T>sa z*-lXDsx)aY27@o-Ce=v#o~DmqEbL!$)J&}1J61k3eA=LzVhvD5K)L$p0G0BEC_pe-0iuL7ye zIbBxu&VuH`>K)j(OgolTI;kC7_^U4dIhgB97{V5P|_Tkm751srx zUeU=$GCucK$NH$dsgJT81_0GF^L?VC;!jk}5nEnW z|Lj2j3S;$%&UXLo(>VxyJe-az zE`_!rAT_czSX#4RoiRXfKxyC>3f)cQPH&#LxL!CcO7>jfB4^6Gc^eO(cO3GnngZ3O ziAxVUm)k>u6~i}A7Mv63d=YQpT*|Mze6X$m20oN5`~vd~b#Bx|vL|x!R;4*ev(LnP zFME;w!QQ|veY!hhx8oA%fzYh7>Ks3E0*Z0}wf>A#x*_(ezN%@Axj&!pyG9>%ZFiAB zSKSS;YRotAssqd8v9H74d!-k4rxE25Vxhad9>l+aqF5<}4cq&mpYLzNad%texvX<5 zxL0q}7=;>SUQ3XJo<5LlF5Yi;gfHz&UhnU*Cw_yUO+lD5?=0|mQt$1|sM*h+qsp=u zKI`?g_NxNZrGcZ#W(Cbx&Dr3CzX8TFr+EF5^*MYeiuSB>2_!lQ+bUqIh;%LxcBX(g z>Q*gcDfUkwLj_Rw<4A}j_3=x6_!a*0`}Scfh={9*3QxU2EUsv|YxJ2J8rFGtBk*!K z-{Sd*I3$Lv=ryX@z{!w1-&$o1L^KXE^<(NY%-~!H=$LzWQ3N|X@tb9pj@C?xH-CIG zFvmk?e7|OyxCgc+QoQymKbUwJ0Km1VE*i8D?tvLe@7SflK@f`AL_)Zl5ME(Fx>Wh+ zk*d|(kw_A=qaXbRc+y=ab?uc2+(5Is4Ash|>5q#=hm8_eihrYDD(IT%%N|se-i%R9zOp*=GLbswBs7M-$4=x>_5<0qiCwPf{ z%fAn0L4!2hrGE9C77Z-^)}h-*mfJPN4G{Z1IM*#e+j*TPM0V4=C?0m1AfrKoOX2(MSNW^5#f@F;6BK8swnQq_*f+cWH7E-+SoSg)i zqmH!!C~B6=B`rm>TC=jE+waZ@zv*4|GSq{$f{0l|_Fe|C={QqnGtSc;{te#9o%(?T3V~<3N27!Yay%I%r(CjAMJ#DR( zimNlN>6vClm4aseDxbvKF!HbFGU|DA=8S}N^an2S$!KgW#t5lKKBC!r;*9VJdq^fQ zSjms({<&>skL9O{0tmPG%sG#D7aip{q6kNGr@IIa@24mC@w}g5`T3(9IYb3ushd|s zX9JLZ`M3RnJCAx%gOlj*TG8K|1D7~60m3SKmF@rXlRS~I+ zG%4p_Y|^W262KjCs0JR>tAVlU(w;Ta!pI4|sisH0V86rwuoJPWs*A9dc6xJn(J-(1 z*FgH7ZI*~jEVxP8qe`5*z)$QP`;>Xu$vJ%s&j`vN03xoC?ve9>AE4k_b(`=@N*(BuJhdSkurGyaZZ0vXh}N`(-XD&2<0F!7>rI^`#uhD9Zn}@Lul1j;v1jR zyh!&xK!f{DOl%4>Pg6=Pbcr7H_;8#p|Ug%mTGU#zjO-z4Yj8k7e;aU?ck|MD{0CMZJVQdYuo6DUF*Y znFKJrXkHvoC7LG*Sk&dP(~w$9<@ z6a|jZOPGoewyHZY1V@^fB9ef_q3Vg6BJ^RZ^$HWZ;v% z=BMeN&d)TJ*X>7Z8l@kgk(9yXhFz@j!bkm*(mk&qh0d4<)a(aPT>}@H?epNfIG`H} zsX(wli4yls0)3XT&6W%~7@@xYgL8m024K5&yI?CPq7j>|KY?$x!?_%wm0ogg+Ml%0 zatVvtCBbAxtcW(wF~H8bBqeV#@~+dLlLgTEUi(`wt5{8q zbZI>ickTtY8l8QpqOWrM4ziX~p56f|?My^Dd)>#dS2YJHn#7{lp?yS~Lk*}fO^h*w z&;I3`62c7w21onZT}nl_31q3-Y$ z`z#$)C_;1W?t zt`e})3-6@^z=*Ws*NS%F3vHyIaI0CA-d(<(iMIyyk&Xpy#0itF;-bfB+0cP>d)Dui z@%9pQY%J+Zx^nCI!uQ{cnL@N)^GC zR#^wfgdKqCy1D4#GNP}L4s&*3eHIUP*N5)(i$|!qct!M>;IH?ieA74NjR4Ncb@-q) zh^xu}$I~y-1aa!tsW`m_Afj_7(5urqwPg5tCcFP6MAe5YL3Iyr+j@(vV& zLHQwQ;F{n#+90GF;Syv{518T`O-fQa@-UeK`=;aN9HBYS(-iQ>IWI*D4hD1wT9+m+ zxFZ10nE?o>zKP`;*(WX{0p+E@t3RHp>Fbt!_j{C-Lzaf*!ajl_9c@8Tjal$^`|E8! zx9bjG#0pd-dGY2t;YAs5ddwiTJwfN<=GuR-`XaEMkJ@(UoQ{&A@yrj(6#eeNKv;StNF=Zh688B8OA*p_~ zBAHsYeHPQk%?>uDq&mZuKb-S^%xbZlEd%58DZTwkl=sRZ13iUZ3)0QjaEq6jf=+m& zKUSVbZ+0L574#W^VGB>EU)iU#8CGb&0#hAly>XI4kx#Cy&cxZ!OZ zYjd$VwFBD&H`A`O@TEi+I!0EZX;7DYSmaWF%_knX2y6CvieO&ffWJ?{^kKwuU?^Tf zc)@@HjeQ>UP|ZfxBT}K;^R{hGkD#W3?bhX$!H0X-WZ(=}^x#j^7W>$_h=Z`iQjX{J%mN`8%*DRS}l}rnb#q#K{nR|M~y4)-My=Y8t zezYzf1COuycEPs=T?5w#L77lt=~yGeO$pX)RpyRu3U48}AaDQkJs`x0WlYi|RV0voO&gVwZ1ofSyb&1C;qgCEkZqAII0x91;+l&>rZ zYf*OEhS?-7kX$4UwznSl=C9WJSsua%3Sv=3G^qJGU%)Olh>&!H($cMY- zQSCP*Z#=gH``f5~yr>orKKflz<&PNDbfIsmRcP)D4(>c!x7QkK6?;*Bs#)R-?zVK**@UUh_m2c zoOMzT?Y-oHwFJJjZ_MhhSjFYR{;_5CC`$zY3>E^!mcU)i7@QkhPPb&Nbe4JPG_$ml zenB=x@8<9_!lraut9L9Ek$*NjTPK$EjeKBf(y8`lF6}4Sxx6-2n5@q-3#ixMkViz;+vBR%=fg=JTs!Vri+_( zK8o7k!qDRR=rl+#Cp(PEi}M4CFP==Vy&BlImF;9rSd;B;NjJ-Lji`8dui_^DZp;)X za>u=~jAGxwN3+Z3$}u&^n|Q^r#NrKg996pPXTh>&nT@ZJ-{9-qwxaVfijUCC4{c?; zm>CN7o<96b?Y+1EKq{ojg{%ek%{IWJ5kMe7u-b;%iDi(YY4}o_ZI$OS>Hzt=?C&xC znH%2Q&xkw=@Q8IRg68EE^A)_Zcjj~<{;{WQSGdh+g2unksVr9Zr6SDNu8 zmimpT|KRp;CSqa$G9qF|U;hAY4hX;Q#kmDn;XJmzF4>k+ z>_NysBE{U`G~-QmBY2<)CzJ@5awljXdbFwislc6eGYp7JA6VYG!sm=ZSA*;ifa21R zZf{m%SAkj1%Lh!J(;2=HQ>`xNDm>cXy-kS+bC4SLEx?B4%*wOJV2M(Xkt6ZQVeUly zl_*4MlvTD1G-ji_>;aguK)xJKC`i&dJ005o_LBnrC_o3Fw#xVp{;b(Wk1}QI9VkyF zV8OlJMS0#JJbH_M4j)gftd`m0PW~{L9mvZJNkP*PaSQ|9%Gf&S=A4j9~EpW zcyAzfZnffzeMX{1b}k;RZ2K7ekqHgB1w093dJZag7WQ#nwBEw6%(%Z_K zK@v~kNUI``cXt1hTA-|%c(j$#p^uRh%O7O-?Z}^DtVVAd548;Jz^c0BZI?{dJB>9Z z`PL;lp~dMvXSbD6(RmQ%gTSYe?cEh%r?M@9Olzh;t-aNAc9B^Y?~A zrtPx~*qE`}p6|c^eoy;}>udfI!oPsCXMHFH6r(>!E7m)H1p0V3hqq^pdChGEc2qG7RTR$IXe`}{kH9?bof=%!Ol6k`Q)jMuRlYTS(_FLi zeC&ZNhoj?NvM7diOeLFne$M&GMXEqP@nn_fnC01X+sccu@4H+^D{J~Ldh!>dNKcu~ zsZ?->IUmCX+aDc>?!giS45Q1ei~QD1Z)Y|vv+*UPZ}qh`y`t?-DcbNksLE~ zp=*^cwOw8MJAQz|-8fCu$a8)Kl|YvQoK-xwu;RwRS+R;y6n?8XhdqDXUHv>oMr08| zSMRh+#+ns3LJQqFHVu%?ig}u!t*hq&xyUI1#V!UoW6cE<%;})#P^5*ObUZu#S(DYQd#8O3r$%M%Q1&w1^h4(8*GBYsV2osPDRMy)O0c&bCTNMhZVO}? zmc_fy2hf0`-%{8tcrsZmczo#Y;T|J0f>oDior3Y$GtqMvxG9o}B*lA6;UibP$NjP3 zy#@2oJ!vg2-#w4Ih3^Jf)teO0%{4DOpVA`t9hEin@hFrfpJ8@B{ay3IT$kHGw&}aT z9MR2SL?ddVTCg2?F1X9#Augy3oR-#NPVb0ang&^D{SWamq8xE?F3I?^j=*qo4FsCh z!9AhVw}8RQ;t+BOhzPUBbt#Qp4i~#IIH9BMW9huF{*Z&pTaej#WMl2x~(E>sEX1v*7E&IU_|_&;n=Oj|h64Khhp6;UJ%8JiLBx zcwawq@+MdS!pY4&PAxJi>66PH0Mwa>Bqf$Oz2x*FjsUESOo!D;Ao|?p$BJ2xlWf-*PbV_U^M zGQaZxz>0mGjlmoCr5d|2O%LuBDOb0*(6$d6+hP>9H*aE-#H!iaXWUL$UpUwiejhTH{a389^T-{HEVWlqHnsuhb2ZLjfpNI1 zT#n?4PSBFGC=bh@GrbP^N9bLdoQA-1ft_kZz9D&qo<@`dsIlhK$>v9D27yf^>RLH$ zBrzf%;47xaMM(Rc4H%LV-B?$LLm3zNI1}LITI7uJn86D{jL095gua@LzVZg%!!Mv^ z%82HLx-iyM1UVpk|{m?sYYarc^)cDoy+i`S}qY=mwAPs zdo%M^rGp|o&rT~1xV3Pgekuq!1d8UubO_s-q5_suf6fgr*_7rC0rlWy2?V>>7X@zw zJ!$vL<(99ZULJpBm1djUwCt$5?KxWUt*45b>22e|*`UjNjt|gWO~ej-7CvpxCtyhD z<5O(L&>p8p{ zfDh~tq zq3*$xP^*JY)C!ju+$J@%3-vVpmTXS!q)88v9nb)2QhAA76Jw9qD7t*1*DTF7cdHh| zaw#q8%!D_T^M>+l5&vM9Lo10R(s)eH?0>bmTDy&W=5eCH!)`|^Ss1s0gOa%*+k7V1 zBN;OqMVMDdV8`6=kYZ*#2pjFOe=UW|RiW}+=TkH@MFS=L6$RV%%m7m(29eM%_E%1X z*$unv>EH(R6KaY$58;G#MU3y-1vdIo+DH^5Eu&FpYz@b%`?SEH_`6eX_oDPq4MaSB|AGaF~7xRqIw73c3^I> z+nsEEU~Xa(rib`mShj1)Pu+M^>_)KW?1Dv;_7Tj(uDd5$nQN>$A9fz=`rE4Qk?mI2 zGBb18RGg2HwI*=<__D4gHVlTeUg<$w+5=yTs$%hPT;lbb4_DVuBtg`soKe=qYZy9N z*0pK||H9JRR|F&xq4bO-Y{I0G#5ibgi*_aL6s=^B+)Kig?JVfVJhspi%y#~RN(3K# z2)FplE$?7-?QK+F)PU7K%R3AcYw9g~AU0{i0{NRx1ye2i#^({O_h(9c8C{%e7PB*r zlco0H{|PVI0k4`DoeMJ>9LqYw6EZx(m3_unW(?d6k^uVp9bRji-;3$dLmOc0F0nlT z8{J?;;GV=~CbK{SP9NnsfRqA06o?KdCX@Y{&r~57%=u8^I26VS&~&@TCWppxVHD$| zU>p4LDgnl0MP@3?q(Zkk*yLQo0~qbo`LI$5FVf_u#)`4CEp5Tv zL?gnB{a#oTSoOdRF%vUH%v^UcrZG+aN;_xxFgXp}WKH&EGRCs=&l=~*N$5`H8{G+f zLcm8lVGM9``r{jT8RU+9MBruiGhR>DwVhFP75moyVz&%TR1xSh3C@O%YD1;4^FSV_ zg5ZNYoCwp7XK9kOnt+E0O*RKkguxveJ1%exBPM`D5oz-B84_YHT-ed48Nnc%(KEdR zQvpSP&7YxhtUhk(r7jEdXF6kJ=i&gJ3BD=s6tLCx$c&X!i7(zMVpMg|ti3#mH z!-$-O=g_`0jmZ1>2+Qes3KhS=VUKzK$Gplkaw;+<*9%v9Kr(Da86u>^y&mEPYXUkw z=J4xCo^x-+FXY9rhERAzg&rfycmf=>c{~fNTE@@mGGaGCZGzZV<|F2trp^s)#v^xk zSyp=em4qkhh`@#{Au&x_XhaO;S;d;9aieH;O7+~2|6}kH=glN1gQKkB%(#l!smh@j zw~gFjO0vLvhTmePX~NvnL}wgYgl2r0_fmWWy6ll%Bwl@I*Eq91;PA zSvGK7vF?n!)6g5cLFr`wV_F9<{76L%^j%@*BLQs5OPhe4&8QJw1RHBLo|IZQnhIjY z*yCqQlfvJl?cd>J_wbMe{u=pO}nTi7o& z&SOLvF=Y)G9kex&%|0Kd`#hZr=trmRCqJrgC(4rmT2Ka8tY?n5C({QCN9?uFLMqMdZmM$%VSs|4h zF*?)Gk5=Zricewf?vr7AI=587;Yv3>JK_bn&CFKku0$)EM5CNb>7t^jNGb}^CH9|i z?y1rfq8moGkL*Vol{=pg&0Ed|0G?DtU*S!#bhssw`pSrAft;$Xv8id0b|c2gqLO(! zk6yRD_X#69T|^YR3u{wohn#v^4PDC}h8WV2#SaD8AXR>InR13QABUZMA~T%p%$asLDCTl6QL zs0>=*U*8<34Rc7nOV71`#}xh*?l){9GU3?`e~$)h|3Bsli@et8aI??ckK>Bb5GW%q z5!UPu;U(NPX<)ngm2zg(>}S%#OK$5I{(jQJsph6|*XaXcf6=M2%7-m`RGzfZ(Mi@& zy`vl3nUK=GRJM1UU9umz5YyA&BQ;!xyQDZlM}?c*3TF@85PV6mcA)>62g~!9c+IkQ zv-(}u#}f#^Zq}_{>lkx)%_o9&N4V=m1!7=3#vcedCKqKNVh1<$wqR#1X(xhF*5|H| zn87W^>gp}#oJ|(IAZ51Ce7oi=)$ln3*JGzI8jK}9>o%`-Y_clz?QqwbDjzaMw-BGQ zP43QV?szs<|B?;1s@p^VNW=c^nYo4S_nZ>}d$!9P(J%I;mMGkC&yi>~K&9@V0ZM+@ zal{M`4=cMDzP)jkEhm_X6i(mKc_e$_Vy~4JUXRd$UFO^1qY1Fy3$a{rua9B`{ZQf^ z%nMRLsqn@zqAH>P`;;r_D)<&8EIpZk5Q7ZV%?WaNh(sg7zEDInCSzb1>~kQ!)G(+DC4YOdG8w z?*a($DcD!A2@LeiVS#IG!d>X!;8PCW1|Sj`Nf^rEw$VO)38>vQ`gDTu`rN`zM)Wo0 z(twW6&FOZ}0*--PbP!sVn>-crSY-CHR5kqc?A= z{VU`Qw|Y@Ha6(`GgEjf!wyElC@GDeC&~uZZJO9{s|L>*7I$v8!ChIi^S(RRMijM&+ zQ{dsOM0nPeEc`vfoRW<{ek{8g>ne{lr{r3dS?25Jl>GJkM_85F<`tu?SvlsE(dHFn z5QbyT$}^{oHLsXpRpwi>MwwHJ%qu2am7~oml~&Q1+2;E7-;S7LmQqZq4*z=0DSq zBS^WJi44&VBpv3>PcGmbgmw{aK=}XA7bl>bVNe|%8?%&XhrjSvwqbeN;|YGlcXOd1 zbDxB$zca7}Q9TIEc-XBIivP@aaQf4$C zznx>uuJ!f+EP>$=&B4;&s${IfH$F;$#xh3Dg(bJo9AUyi*k-L@S?gGg6y^u!wt-*K zy|DZ2fxEGu6WI`a-jd2m>?=9`NPU(-z>p13S=ZSEy8=J%tVYb2+;$XhLD-bfS}AzN z7)QS%DsC4@pd1q`1-W6?RIf~p71(-D5md#B z+I4^+Bx=Jr4qBIrPuYG+R243;K^km~?xM^hBk~~z)0_I`;+`NInXMstcuLz8-g}|3 zl+h8G{=}+lV==;{*$?Zh=TZceng}2dUag?`0%u#QlS=lY5raz(1WvHZ9yx_!k`sv% zZY~AviJqtU*g>e%5yhCPaO^3@T*7ZZ1mwi*wD0^AnTbJn(4Vv%E$O4eC~3AJlgH=4 zVeWi^zpC0cKtwA`R4d0zai&-?vWbY22|2>$AjsH+m1a+DWhK7MHDBSM1SvY%k33L6 z*NkTK!%F_rB|!5EM{3t~d9F2Mx%`CL&x#y8bQfn91qND|=a?(`YDqybd5?S*zkTFH zlnyOoa0LT$;C6V0Es5QkWk$#1p`dyED~hWp;O+K#^uh>}##Zt(Raq=r&L;+zLw-iS z0jCcZ8*s&Z+QOgDHJXfqW;H$2@aCE^$sZ-ag004y_3%{oH!t&sTYVV&2c>zg$O%BnPAl#TLkQ*4xl+vQj!K7&n*H)NlR@D3gy`s7iU{5m<=8N9m;@fVo~y9 z?3GIVYNvP4C2;v;`W&5$ksIua2&{8qpF7-L5}RHdTPfU&83wiH9}vytOu`qwyy?LC zB$GZtQ1OL`k-5#T0SuzYvkAzt#f%tJdv=R6-E+0J?%5jt*07gl{NK(w25M;I@=T<>Gn2d2`(nI9Wh~9~E z_FKQ_dI|{1#cy$xOfbzgRm+kFc# zk#!jNb5Qp^juT8B&N}T&P`T0*&huz#ulZ3`e5?m+_b)tw(2qzSpUo9Jdf-HgeaPPp zW^^b1T9^&pJ-Eb+S!0Y}yNieTjOaTcm9>)Zv9&gCd$CmB;}E^y>N8h%upq7l3yf0s z@BT?f#6*YQb8~qA>97v*XpX>|$4oCKdDaOigY}aS)UuIY-LqEg61ap;OWue+jZ&&k zD`R|=RTzf1ihZU+8jlfuAN8edZ+!7x)XW1Uo+ch}-_cQ%|06e8?H5Rm#WV_q zZ{L2hvHAoac61loYBaT!gU{1oK*q3WbGaAeU*Y=O{@#Xf9M)J$v#=GF&U{aI&WVYc9xSqyk70LK;cI_zm5=Q9`VlDme=G;>?4Y2ds*{$vN2RoG*?O zh^M1;XT7z8+!I4N{DNc9dsx}h&;&nfIG%>*wZ}*VlM&@fIemIIdMeX|;0%JXpf0mN2biK>If6<`f=i+|lj5R;|NvT)=NC=*%63ZyVtUiPuc8H2{P%5li!q$>}C6(2t#k_ykr? zGMae$V&%SuIUtQ0eHT#eF2n#(VTO^E;K2}H08e=JGdx=-Sg$a*8&9HS#p=&IU1tt1 z|G#*98~CWI<9~QJ*@O+OZqP+zjS_8YiBctsKUo0{2@5EM;!6~jSZ&p6tF6keU?n7B zcOloy#b`mT#TJyd)Y^hC;3f#<1(SeQ16YknEh_3=m$t!|B)pV;zTY|bZZ?Sh`};qi z=i#H--Fwf=%$zxM=FFKh;|hI8zY)bNgQv9*qD>d)`)#@XBM9}Ze`=vvXk+^z!k}=i zyHohPXzZ9{(XF*j?{tLqiXaAvuQL9B{??EL}X z=*u`)yb(#tjWQR2a^|$%a9}{?H!Gcv#Je#(O2)55%k6{CK(GB^i<+kPf4F}_`IO-> zy-!&3DMREF_zA;~zipIE50DmKT+a!2R}GouQG1BS2hb|kw4Gl@)Zrn6pc_XzLmy~eEQz!M4r9K%Utny|r3)w) zUSTgKsn{Ud9B{}?b7b+Q8TTy zvWF4=2XZ<>$0r2_z#sn+#)yxr@VLMR4Z-g4IBAd;)&cEi07$-3h=49~by;60WLozc z3MNL?hYvXBJP`@$wbz6vy{PiF4E{YKGll18>i?*Q++PV&u z;QTsXzcEGINkZFfi?(`H%D}7_WpgBT@K1>q7Jk9+YMlnAO?Q>{BwquyB{pio(F(2j z-NaDHAo2O3UjLF*lqbe?w`Q;=b(|R}=NAlhVU*bgxp>FCi@l+9zUU2RSb{J0Bg4^B0d3 zM-n&<3>D&gh92;>bKD&5C1N@8M$X}ylZv^x7}5#QJvq;`D}2^Eq(wQ6yb;Q^;wH63aV27AS}iK99oSRU+1!^o zHjBG=?_%_U+4?a`*zynBz5${9AM2{Q6+V~B>4awJ`E5$i_b&V#s{)ReFZI3@Wp!t- zZm@IBiN(?a2P0F|p~>S^msP(RXwLwRYH+t1HElA9Qs|AG$W^DpXQ&wVIq+MaYo(K}Y0b;K2Y>cfbpzjNN>HJ2ie+=~3Nt|-+HRxm`h&=Fcj_JfRIi*RfZ z#QJaRIE15O7X$p}4_&f*7*}X+`STsz$6;}4gq!&l?2QF<|1`{CDv;S0~ z@Uh{wZ_BxKG+siwzi^A#-d+iAE$$f`EOb|$RlF7Bsm)sF&^jjJm^hP>FUutIB`(&o zh%wVS?;oUOTK9Kmc%<9JBDE^;riqKx@~)p%=tES>(KX{&Iej-ff;cc=jW1AF4msxM z>Br^b$WQA*1m-<1f6(m?7M1#UR(H#hPirGaHW?cURL!66a5<&~Pf$N@-04D6oa>z( zNP%d#I}8yk-(NX~tpTlZ2b~U(xl}q#NWVHa znRwr}uQA^k?t_D*kdu^+e>HzNMeR` zpO}ST9w`Jl>*X&Weu<#m_$#fyKOpYP|DXL` z^fmqce?`ysH&XbieA>%FNPT(XT71}Sax0b$24a`#n4OnNRd%BOJz>e7@P8chFVe@8 zC6AWJpHmu494q2N>VwIy#XSyGzhIL8%j)-Px3D+sq%w_hp9fG=f~Tnw{~ah2{{@&s zl}7kPkyaLPp8oZ zp3)cQ;;^rd7C-+Qxi9QIG%CYAxGty{3*$GBVc! z!2%gLHgxdOyh6|BC($e3`D{?JBVP*|ns51Y>`)KhDDy~wJPmxqb9i&+``Ky0M2=v+ z;`=F}t-K$D_h}?ywzf22Ns_EwKuNr+hS^b1?I&Zgu5yz&0?g7VDe)lPv4OXo4`1e< z)I%xbQc-mY)#hGEAK;O@p#-qTo>5qNY^=;dFN6F1s1&>Fr+0Gi5O#-q5Y zPK`*s9mu5X_nc2W+nH53im4PvBXIP@!c#*(wWrk&^WR8VGjB<+JNODUEQgU;G3zH;mj{&WkABn|FSat z?yFO6pnk~6G25XP=NHoTXsayVtvFOJ?s2z-PC=@I_q0st%~~1mqq*Ta?S=_MEA!wc zgL1A2Z*dRE|5MR$CdeX0=0Y$E3dRVfc>=LQ9G0P%f1-UiJP3XUrcuW;v|wO%kb`ts z9YJfidGB=@4m@-hZzcPbqAc}-;vSWEWiPMk;5RPzm%3PQCmtB{GP7AlpXmvYbtLjA zFI+E7;_DaX^_VRD#<;}CBKMy_>Rn_4UQ{YXYooLbwyBr8@lmLqt;rX7FR+Ds*}|+W zr&ZRi&2(8^&*YmsGgEJjS?gT50CT%X|Ai-fsUvX;l@Q(ak^pj!G?VAVZvgU9`$S&F z?#E3!COM?fOWGBd=qU92ycLV423-Se zWy@Qv*9{;oDIm^8#MBL27ME8!uiWSHzJzzUU6MqQ5WL-nd8f7DeXJ(KcXNCL<~Qap z9wyB-179&3`+wmF&>SQCf8vL!+$fSCet7MFbL$+{C zewe~H-;^Itm1e#nKb-r@*YSfd_2%pN;WJ)_5bh?6{1<*mpOSJ#hW825_(50&jIcd5 z+Vy0F=dpRzdaO{^JGA;KZzhwi$d~N7MTavjIINaWu-cwJHj5%wYpJ>n%Xn#KmI&B~ z`Ifz;sT`NKQ#=+a@pyiR%V9Sqg~y7du7X)5@e;32dTd!48kLfX!PAZwfa!Yk@72ph zA|+J+`Y#cxMq;C7g#i5Km=vNbi0D?3BNeauXne7_NWLmtY!CO#E@A#ywLu7P!CCPQ zK-<}&{Mpj5y`qiSo}#dw2-H>8>Q_(+OGgU3_fps$YcJ4rG{TAZ2dsZ$N~zt)tvY<= z+XK`oq5P?28Y;P}zJN#E;E=oY(-^oLhaY!ffuJb>Gttuk1B=6`dJ)Spy>?Z+q?gw- z`jQ+69goW9)r;}F?-%MeyB$g_Dz=#y&tjLU`|WE}p|4wUa`ISvU@2cKMePYHJ9>>M zI)T;VkAQ#&@KIm{7%lKDxM`EtjEE{@1FJ0$*~>hSYU9JaS3^$$5fMkOsaB=|Yj9}q8cnZRXKkgPfg0?Zzmcrcp={lRB za&6H-cwSsLmb(}c+~$Yjw-}QtR2Y8)HT z!xD%UD~I7p=u2JU!I;KSG%0Hh4v+oiYpZfdPNAjMdb!nlxoSQ1d(w+p*7aML$3Mj4 z0rG4ZGZ8VmI;jD|aM4(T9so9t5aO0>X^rNW&p{(x%PNvgINUe|u;FZ_7?0WmRMBzF zswlXM*j8{=A^&(Izd#XE+)x1<-}P`SWgTh+RzpmOT>4*C`d*^fu&DUdqK)<}$3xIi3uKMLun!Ah}hYFh$VR7sg z%*)ndthUI&AQBG-X1)AX@q2LE&GA_W8EcIXuMDP*&)6Zd)xFc=|Nlw+&}M#^Nxpq- z5>K{^KweypS#jUFEQc8}U_QK*M&no3*tEiIcsdz)T%98H6LVF1f#2cwjlY7lEPqz7 zSPM;=4kNCINy{o+4ss*-GG>uQ%ivn__j+)kvX{ut)Qwe@;dZG9%c6S~D8Mz%R@D0a z)3|{tphE`k9&MfXQ^x4&kwXJS>2n#UgP0UEPgg_CcnTT%P<0Ugu$x;o^B`OlwC3U+ z36IEA*Dr6=T-TKPx6S)P>##Gfcp&TnjD63tU8*GhVTaK>-F)T2W6gS*@`=WD_Skg0 z#U2~TCo#GbqhVhI`9#fTS~O{sw06nn*?++{=r=anwfkNJLb6rXmKVN^?-~pO{CK%= z3qPJMoO-dgIAL(@kZ)|`h5C3MG8Any7*n=PULgvULL%5KN6TgZHyH1 zEL-`V^Kr&L(1}Ibj7VXGT}29O@L?=f9}|(3Z6aF1YBVTEWJdHp^q-QBA3#W(Pin`a zQ`*j-GayxE1AZW9u)>pu5B$~@p1Q)bb_>bT3b;lKqQ>LgXJ?HgSpoB=lQOBvkJ8FU z;$yT{HVPkOw6f9o7}s9LVz{|FCOofj98REr3X0(CG<=u`Q@-%OoefAC?76C0WNd8Uup@G;#S5TRo<)2Pf2>|{MSm!1^MYsLwDC=FPsNA+ z)n7PAUGcd96~e`(jYPhgK}ve_RvNm-6=H`hsTl7PbUaPidZL|`yu_?Lco4_0T1x{n zM94B;>bgwJ2)B$3A4rBi({P(WjXEgqMh9raW%eONEW-ImCWD+H>){kva;>Ne78o9GdlFe=lCl;|r)+Jy?H(Kp^Cf(>ERVH*-7QqvOOU z>H51Dn{iqv5V;W>@*Gk--o?cdk3{^+lQuk2wGb!E5-*q{CFo)X_-LX&Pcll5!=cR- z1Y^W#MSJFXxRNBH8zOD+r74*NKL>~TR^(V>tdUX{%r{QXlSR|HBCO9G`_|NC9%!tstKU zTK)3NgYX57&%{q_EJM>s?O*3++6zwTr{;eaAU-&3VHsal;l0uPv}SYhoz0Fzv++#6 zaQ$}E2w=HEkV8P|1`9r=n?qBwF})5TCL*?=pi^$6g(gyCE6U`?EG<$YPMj6GcC_DN zL~}ZD5r1(B!0Vx>bro)FDz>FZO0d{)J!vaIPu+*W&(jJ|mRS*gzZ=HQ*Ms@cdvH_0 zbuF~BQvWXKJX|<%`2Hs5p}i4JpKs8$@@g@gV1!>fvG8QL;KK0~Qv}~bg;XEaSLTqu zf%ngWW(iJR%v&ZoaYTh@#2XJ{V&tIA`^jFos3RDH+6IH&EhA`RDc2wQjcW;u%7t-#&a@CJ;B=RWNn5Wmm7{Tiaaqxw{>2|XFlDqM@=xyU_KRjNFcl7QDuxs8) z3|+~xMXmlr_x?necECq2`wZ0+a}+2((-*Q~4s&Q81${22PFt|WwhHj2zuOyS92N+Q z=n8zMmg9pFnCXB);-UKaJ$!i%&noi*OJx6sonGSSXpi z)N!A>w~V&ZQI?WY27Q5)4ribAcJBiKS_q=r0Xg*F5F}VB@^tAL?rOP?@oZW_GUvC7 zf}DqPwRed${wM)JxG+WCg@WM1TllO~TX-ivZ6Zdvxf1E5*GnlTTdT3iz@YyCEH}1E z(Zds)p}wSrPXE_auA>G46n2T%U<{yg>r7f(v?a9`|H2w*?3K|uNYI5=&8*>Yn?*rR z4?OGUv;C*T6Lujnk|u-#csFX2H9Xt#Uge7%Bk{4^j3Qfg807kv!bt@#sv+ifoW~yh zIF6e>jEtk#@|E^h?_16;T)n}aj9OB``SuyT{yuLc7vC}C>i)n&hl*N_{1eak+}}U~ zdczVQ;yDu9|DJaN9q$RcZOTj=Z)uX4KXSi?dFXtZ4XEnCX-7J9D6nf}C{W`jyGC$S zYW_3`Sy2h3bstrJlwCelVvlh2Y4l<)s_I`(d8pp*;9mrG5?R$BofGmzdoO+g#GcF+ zMJvOXjYy9z&WDM()Dtj%}!C4WYFi@WC*JEqeT|M1)Q9C6ZMe)0(w~P@gja~I zK1ZXlx?ihYTvI`anSl>6LEmn4v0ErPjGJnan@ZB*8UddH#DXL60Oj@5S%4R$F2NVK zE#_Qirz)%M0;Qp{q=KNP%X_RZysuZ;haDkq>x2$#Z|OswEwC>i%+Q9;$wofHuFzn; zvQNh=#3R;S%kIVvYEap|;XTd-?iks9Hi>)gPmskUyT7y@k376@78*iIs#mp&j^H_# z;4$9-Z4efe9w!xBikoh$y}11P;J0jfD*opPRd`$NnDXmU3~uZdTlCAvIk(kbJR<-f zx4|fBoiXBuA>tjC&e9*O0o`uXG9}I1I$Vq-;YVT(ZVxo!4exgHgLf}0wiGoR`9o0# zAq^RY2Fg?wZr6mH&ZI%%%AaFB7?8 zRS^U4EYd4p)LqX*@KCQrQV5J*$)D&Jft1i_f0BPr-kf(47$yD_fT4#v=-D+5FAzwU zfZ6LgN)TlFuVGa2-q8;-&%-Q`pCHXM(eE1^!>PI2+s5cz=Nk#QMZ=pH-u-y>A|m8= zja#60gU)!AWt31x=l=sQZC9uOO+BClLkAjtu*L!5RR>k$MXw6>b_%HvQ9` zm_rc#Fnpc5*){oun`!rgg7^6!;g^TS5WE#-a2!MaQb6$Sh0l?wPMB@^;NJG_*%Un3(g!a@1Dn{B`EwXpr0-PQ_RRhpZcMWM&>DL- zH|{};F*mC{em0Wi&YpucL6B*{Pk~FVy;E2ubTaeyLO%pOppv?jx>MWAu}%!uaj7uV zY=)Yu-@xl9k~BgokSGt4C@Lg#Mj$o-a+IgCd%ILLNnETYYZNDI4vezGo+Gd-ou6f&-m(hvz?Z=}9@_l6M{fr@=>)rH@*42wE{VmPr z@MsHDzBhX})$l&{>WRT?wS(~bTb*G%@W)W5@xa!cw-X!cI!2Be=bZC<9_k?#1x~Bk zY|VkW(6(z1%tT8Pf)|HZ`?$s8%lMU?aELU3-|+|Vz2?BVp^?Bm+>|*MI6vA_OGVq^ zeXNOfL%6YOY6mCP<(7aV@i@jBNzsp=XQa?`2Wt^}MVL2oAKEi2x{G)N+$>?Xw(F`3 z5e+gJgx4?_;CP;D^ex=d+>yI*iJ^8#YMrgt_JaDF5$LkAnTGd`#HI?;9YT!^ z;axuj9N~@7E@`zdqk#1G7zLqZa0tqB6v|MTIpp7ESum<4&tjEo|X*oa&U0iyw=$!l0Ix+ zgl{*of*ezD-$UCd_Gz@wkJLJaK^4p17Y8~<@UzbNd3Xzs8VdBKqzV+_4*nHz$^)$# zur}k+sjCQ=;WNSqTyvg7h_4;~*AvIVF=<&>^T+PeoHqZqd-t=K&#Zowe(etL?Oxdd zjhV7gtOwJV#F8HF9@&(2~ZQTNkaiy7e! zuA-Q-<4u%vJUxrPdU=LqD;zKTu_5D8Dc8GjHo7uD7=bHA<#Pr*o+f7T*`OfigML~e zHhfU~BR|9g?ax=^?@9;S<0{LWC%5PqQZWY|xerFfC)sFO;*FKkA6EU(FuN>&0|m43@GY<7oY8&sy6u9){AGLcUYk>=|xV?Zf7NxLs*0L&>AC8#m!mUeQ#jp{H z&<>;<#7+0rt|atW;jgi(ODUX79LMK4x_EKG`MK08Yj@S=j?KDRS7@N}C**__k7UCZ zg2UbT>F9^CTTa4fV#OwoFbKD97CJW1{23NbSD{hS(U6DdRM>H?aTYe{+%%G}3Rbce zp7BR`RAQ$n^h!D|+=p1liGfKNrO}DX`I@_AjWpZwNyN_!$#1Q-_Epq(nV0f8jDto+ z4EVw2iZcLR`qW(k2^L@2+2qPi4OGuONq^f$jp?FCf;#}=;pRbJ*s zPx}XXEsOa$qq57^-El}!^j$lzZneB~qvi~K#>lscC!pb0DAo|^CIHfOVpf#SYsBubOIm_yj_q%Zo z4;fDPLdWh}(R|{~2nB=(j7mCAgf8c|{@~+yX1K(Qjv?6rAAuUoVG8Zmx}!~PfxRmE zoRlY^|E0@)KxROfyxo=R5c_dlnuyJrA|?+Qb}>d6F3SSLlT0;s+&h~$Ka5>4!_#0e zWiw6Esxwa>mp=%&8)m4Me6d{hB{vr37tA)aBsK-}TWH3txa;f2N|GkTr=uIu4^@J- z?5A;<))n80r{QFlH)1h5mSKFVn3!#`{xGR3wyXsYU^ZO{9(~JeOct_4IX)31! z*Vy3ZI8W=;wh6l__>@UWB^495e8lRF&I3r$3?e^;>}U_v03EEHHQXY)K@nsTb^t}~ z$+=`oBZ$A0Gk9d)H44w8yr@T}?Zm`5%3mM(y2xO9l(qC_Y{9X!W!KWh#az+C~!O%TUE@+!cr z*~rH^&*cP5yz32qr>1utr!mwerQ0A#R=BC4E|Yp-%>gt9n@P<9G=vDR!JL`{IYC!s zYp9ctmO_8bvGhmWdk3-FGHv}sRYw_AMj6rcL!W9--buLFY*XE*>-WrQMH`{%z8UKMV|MhvTOJU$TxDQ^_yU)y=`q5cjhe8C+9xQIjI2Z&MJe#4j( zbzE~qbirT-m{BGLC9t{T39(N^yQG*P29wP%V3j7COvH**R&g2bj4f+&M?Q}%y z20Gop<}N>nUoQlb+)sNW`D_bToY94(jOhVQD3-RMY`ZJ_ymRlpz2WDxgR`}1*{-&U z*=~oq?KimH)`}QNY^VI&SuEbT){?sBKESDgdLT?O-hq%nGKeBb6$shqGH-ZalE2nH zNw`v>Icl)dMIV$$LixYB(G1ja)`;&=H6rqQ1=`CRJJ}to?g>180yHVO&Bk6t_fPME z+G|lOdvK1Dk!tir{8+3D;yiv1Ho2=Xe2^l$D7ppuAi6qNK_9PXqY1o9{L%c@j~O>Z z>^~rGGVyH8bs1jN$4=pgc9gua^^1H?mMY1W@y908T4XOW@~D{*oMME!g}>3QZDB>= zBhvJgo5j)s3oMsIxIbBY(Qdwc`5;AIFwdSTo26Y`c(67&ye6^3-t0i)N_@zxpbTts z{EGc~*Sm&bzdRwQC43-r{{9=7(IS05Ry5oKEg4EuBR`9ia(@q;bzD7IO~25QDban0 zEyb_!5yFsL7%hQC=8Pv_1GOCHql9l=2;1Rirlw+4|y0lLTkto9c#k;Z@wKv=|B*Fj-` zGh0rbt&gfHRLgo`;KuXN=xy54EGdKnGnXM{0^=%u-aL*if zUNB@MxBD?0xgGeHh8+B-9SW})QQS-<*a0#81PJi+x2STP_Oe0@nDW^JOTP{|AOl06 zpvAfN*-I&;VpwqnsXh3zfk+vKAVkI1qG}k$wdh)+iC&g%7MT$JGoUh}ui>e&aWDRw zk`pPqiVvcle83C{T6Bdxc#{u4#RFZKLd!6sU3^4W8QmbCXcJsUbT^+#=%6R%SsCcN zhtJlqEnMDd!$jTqBA$f%&ex*L@nz0;^{H_EnO{(QfO<(a!Z5L_emz_y=MJeobT1yx zzX1H4+7NVkqh|tJbHfkqvn(c!jwSIA={yUpz-9H=kGvK>a(;FDSc6FEf*OE4a>_4Q*@9Iwda`-={>L)JJ*AXIJ zl@{`N*Jn@CYe?#qP<$wi+cggJ_nl9sFVfezdK_H{AA1W=( zC%VDj5P5onCg13J5T1b--bHiKJYVP=IY#O=E&6jjIGum!db~{v4IrQpzHh8S^r{~& zMqFmZt>cfxNPU^$@}yuc&3M;mlxp&{E;4r7sdSY=vU;hyLzm`Y@fWP?mgn+44e3%n zBib~7y0+6I?^FnQi@ZSOG$10hMm|#;EQ?daGx%~Hn+UhMtt$TF>X-D(NcVn<(K@7h zu5BS@65nZ8(JC!0TYP$ygh0?rg{ybT4_Rd+IU<@2ZnsFeDV>z1p8J~O=Rs+~oKB^G zF;9m;P-?{=Ffk8LiVcGV65l}Tci!j`OrY2!80gLXL&+73aJhk8u|ycxKls!rI>*o8 zgk!Sr0=8p`AWy6l0;%zF{E-$)&=sUa%BKgSP440T0EeAl_RsWC$o$)lcE_CM zh$NB+xZrb$QIZjykG+yLI%l+(!Wf1vnc_i=jz}h5c*%dAd;ahBCpmp_tK@I`lfvYi zGRrjiMkX)Ky>Cl=8K#2}jx^g$dI1Apj5OOMFw+r&L?vR_liQ98LO8P)gu4uMP!k06 zBAx`esq+(P6SP$aFTmy{Y{CSZ<9!TUl93{jf~VCS_#OmN&4F{&@8h_iz}97l)W_`| zUY<*xS5jZn-ViMVjDviXtvF=~9_QVZi|_-b2=bP5p9g2MDSHKdLZ_8>`uA7I%eI7*Ijmj}zol?QJ|pn3#akg=L`VLM&>9L6=Y zk}+);aWiK_?4dVU=xDJ)$~14J9$(rg1{(u03rAmDXNn(|H)GD}+y&8onr+?T?>ixCT$S!xbHciOwFJ2zmW#^{0CIp4gwBdFJeJ za}Ln%&~|P=^sAzsh6^|8GK!ifV7aK;lL7mFQ5$T2G18~^UkC!*H(cA5&$G6>f z8~lY_zgDyim{HW?{4Cmo46t=^fP_;4XAAV~E^pnZ z>Zjq!FkGjizt}GeFMEW5pdOOGNmau|#n%Dj%(kKyZ`~SvM`#hPwP>fejyLZ0Ic{MU z#BQHIq91=4P7T)r-4z`Pj44*G8su-O8Z<%MiM_>VceDzb)rjC&^{7EXdFWBm%fU>H z)e_o=ETwm}2;I7kx|+WnNg`T2&rU|5MEKxX?~>uSOVnir^dwvJDNO}vZz zm`&EbE4^a5EKuedpUVtwL;Tdh@^&`is2S_x)U6e|bifYkLyhDbeFq(+L_ zX)MGOuAWC2WUvfJ9jNf&zzVwnjm+SY$m5OgM#X9rx>X8UZN7xZh-~AH{smv!0}*1P z2Uh6i%i9BW&kw?nidDT`TCJ#YRrShZSWDdvvlh>9!nes#pTr!Zyng!kn zx94iLx8N({w@sj>+|fS4#j|*=_I5mt({n^a#6DMBwsVp;T)x;g$4Nbby3A089;g!; zp;y-R#wj9}iTOs%GRnqtl&lEU;i|t_7@PYB$P2u{_P2&JKN+ZlaRTm6^8A{{3X zybGB+Z>U)AT^|`rii@mVpx1L?=tmnsy$O&uyKzsR)fTWC8bW!$RbG!QlG06~ESCI0 zO3t5^wm${8t1783d<*mitW>93!R1=^*A&7mScPQ96CcWjFItQx^hd}sy}M{hegyPMSVU>-h%M~|^+?=Ee|IK5)AuB_PzYfi4ym$4>TTf4#&C#Sau7UM7Y zeK{_kR4j)F5xJwi1oMnfS80vx-3Aj}F36ip*-!a${o($uYxyW08YDQt<=Mq0aE%if z6eP+XO2EpO!xhSjxNPGc7%Ca{Ik?FOg2N5%@!D4IN}$d=4~arZYv8|d{Yq@Fi_1W9 zZ}ARgPqXYxD63a3)&omZB4Z^A7lhNG{q3ceusI>z z_pLdZbtjgEn=`yG4ZRI!u}`$FqCWZ+EO`u)pn<9*EgyPdvA&F5z||Se9{E0&i74fQ zE`POUquDWxQ`|~@PwDe6^AG<9Rpb@sWppqaye+(OK3ajytwqa-&D{qB8{FS24+u4; zo34G>>5vmQ^_BQ;ewvuXXvx6Py2P=BJwPMlTXS+0VDxVqMxkHxM|%;Y^wuv#^)7Cb z_RXK8Q7*7Su$%c*0)(;)z(n~K;}`CIYi$VBU0$C+%7m{cQ@4<5JK7X7Z4$JFR(sNE zwPX4*X$8|0Q31`&nt!E}X(AfLp*1qUeC5;!VRn!G*!xnTtKkAgcEB8X6HO!SL*OlZ zBJM|E2glGF9&;$V^S)HE3&ZV=eg;w_&n(V~qn~g@{`Vb6&76hQ{WNfzy65DMn)WcSgAFa7#6D*D*wXQ@HScM3E zgh5OG7gbM2RY?^7^>rGpt|ZbEyZaEnXh`OA8>11>QA>s;b3hEbO;QIkhCYMdmzoJO z4?k9;YWx}0iIL0A1DGOaA(C^(tGLVPL3#oX@zFSAE7vz1Jr}n?Ucq@Ig}gbF?KK_- z4C4wnhmfT67lpU@AX?EIj{%U`i(`Nf zG4D4$O$$DL@tiAdJ_eAaTD`nF7JxGmel;L^DI^IzC&cjKVIxh>j$Y-hOfaemf( zFqaFLwIL|N;r70wK4Pd#kyhMe1)4-P3p zmJzo$!+pmNYG6g%QADe&t4k}AWfegT7O^A1Wm0xzhHEG;s3RX{xhZ=kcwv3rcB!aY z>+se+1d!mwhAcCiM1ig}dDG)m2=Jr!tHsG)Ea>p-o}{+H-T$X;us2HA;bUxty%8}i zx;9dwrH|-Cb5St%+=0a}0PNnoOk9W0AKZM%&7J1B3t$)rPlex3YJJ*)qHe?2ge_zz zbV#_Ic>d>9%~`ZEo-$E?J|5P6~S5i2t2mwf-0oZzMyy@tN;|dNh3ca1?l+z z2B=2>6%ZA)pdUfC00oSAjO}*OF8bNuh;`f9flV-O1H9v{Yembd>VdBS+Dt%)iXU#W z+^lUTZ+W%fKq#bs&iz=t%Vjy%`{}-<4!D3_jD<`4AVMbifKU4bu_0;`@(tIe7!GG2 z_{*rLS-@Y%zlq^$S}+d6gj}S`D=Ifj$aDBnZu&h7<|D5fj12A)t<=+AS^&r~MOB(t zV|qp^zl||DgYJKU*Wv*{5gd-wIqmKEUmyq3Sh#7BHX%=C`5P7g6&_l)7?|CzLCLWX zPr)>t|GMSz9DR3wt6n=1k4pS9K|?Ph=#lzKV|VCx$RIuy^A!c37*H_yHahjAedJfh zA!GGl607>{K{PJ9c^rEjWe{`TaVH-5A{g>#xpAIZeOLH^Q-YSx_tyJe%j8*BsegO* zXWsRXyn)llwEYPrwBdTBfkF-Ek^Io>sjV81%iq8k=1-`dUFFiQDbUN*F{O1#8CHhD zl{_hx`!+A=$MHNh#s{V0CZB&>)$x)l;R*F?-eQQStYzr3QFTv7t*Qitn8 z3`VcEJFv(u^dR?;Sk-usY(-n+A48!@*;@@H&f7P|?i|H9A5olM?N?)Uy9|YyebKhh zUZv+5o)a|;oBy2~yvv)KKOJ72I)#`1kbLnAxMG3AZ!z=PV68p6b?$eVgZmH?+ppP) z%Y9f)TD0R4@FDH4TH-0h&)wDw-I@gh-MyVs`dCHdv}maDM))V+Ii)`BqtFGA1m~3I zhR#8Z!gESJp>HD)%Q>ZPBx{@CItOV#PDDKO!9^Vd)>CYvUQG9=1^i;~dJXcz+J%C4 z;&-LC!tInKNK8cl5Tp;+SrE)2@Uo8JIk@jq>cPb9z#YIr4_4~5qjCEY*L#g-YwY-!bh7L&@#NtpWz09p14L}3$oKZo&IhK-_c49 z6P6Kp&7}Wus^UF(*?1@CG~P^0e}f2m&`GyIdKe|_W67`hpz1YTXR6)ECtQoX4?Tsy zHe18u(9ZQ%dvX@uhb~jAZXZ^SPUMR?*nDs}ZAqQlvYB`-78S8Rw}&t#X-wh@iT@zI z{q3P4vQ^a#Hl@6W^=14nhG5r1Jzwm;{wE2_{A-Hj)0pH8_YKhnV6A)$&Nl%w$U6`) zx)$904O*>!rjd&bDRVxSrWDP_17$3DStQ%|=kUk7|Ika{&j6=g3JFu&@;9qOL(bT zgiqZ&JNFa?B8lHA`*~o?c#et|RU=kQKxM>`>ivk*``cFMq2i{V)=W+O>O&LM0Ci!2 z-a(Q*ZVIx%^41_^_**eBcs8j2nG4VCENM59gv;cwGW5x^QY3wYW~osyzr-Q|EFzVt zApEKV(^$bJ_2@)AKWg~pCnAHcXIBB|&Cx75+=&0n!v1qQAaCr-z$SvPOsg06{g zXK;utZknOoMCI>HH})0fY+9b;Km^*lCV5AV#crAqHDd;PO5}zA%uiof?pyd!>txod z=+afLh+L+1kS6bUe}C={!?oEMT`TcNl`XUiJ;in_RtJZ$m-{2}Nr0IibQKY4 zpF~48M6IF*cOI}##fNJKp9#ZWEHp*lb<kMCY+|c|=2wYXtR;uNcAAvn zQYov$z(A_@`fuGI{(={&umHY}!%5y>#&RaMl>OYcJ_b!jKM}rVL(`W((Rc7#SOkvE zlq3gnBy8T!;%V#TSI(a$8S%*Q+yWcQ3 zP4xhLQobARcwm)t)Hw?F0E6T@-qI#urA;mXVhSrwSQA)<&c_x>Rni}1)uN6f)CpG? z@EQ_&K&|QCx@n+-){=373)6_pD}vo&HskJxwVmW;hB78ydE9lJy-$c zW#!65r<~8@N#m&77!aF=3OCZ+m*4+cWpPt$rC!6$gyr=p`j*>V_b&<&xA|v41s8bectxGI{*2v& zxy*WR;5{})+LijZw`U5hb76Vw`034m`|9o~{J?$kh zQza{)Bq8H5K;7y8{NA_(z6_p;vNY&o6GP!(uAx^7d@j0^84Q`tb87mJHrd}WYJD09pK{wJSgm*gbWhb0Y5fdi)zASCALWB)BZ@8ORHOv=Z%EtaQPoCWnpL7py z?}@$*dgSU83-cRh(3FYIM5Dt2r%=koiExOySs6I(Fl**NZ*)2A9-lzng7jX=R=DCR zYnv2;-Eo8-EF6Usj9G<++OXVG-_4;jLEYrA7+|$<&{{)&tqbKw0I@<$7%N1tfWQ3b z03Z3OHqxnDVWa^gt7@YluG^?)-(WtfHYXhkwMuJL_*OwZ6vn;4E=rvF}eE9 zeq>$-el{{2(6}J8X(fS1>>8Xb4t8wbq)^BQ1bKMsK{0XrwD2`&R$2%hqyKM=&))wv zK295-DLeb|*@uVy_yAyQaF{ZH?%MgWUVCJA9X&EOK6SIc9v|@k2%7KG6Iv7)>gS8#YY=_Q^l<-FLp0}HOx`Je2p{kMfs~?N?;~% zbE-m$^xXh|wdG$KPv>0-zHxOSV;_z(NB^y#1}0uu9do`O3*L_|`bO{)xD5mvltVlo z{A!>(3x2s9BWdss^sk$8Y+VE(Q`dZEbju!4J{@ z`9|~=ekf5C&5O~o3&8ne+rJiWOhK1vUUy7>*w0`rq;D*Z7j^@QZvgM#F8t>3TExtY z!B-qN{1mLdMxqgmTaW|J{)nezjt%bw!fW&Imbd$9JR%Kd{|;O%90^_%v5kc@{swwXpNfqsRNf#eNedNW^mHyEDsuJFylW=fTs_(**3rFd zJ>cJ&0x(4JO;{FFGU6=rp0BAk6B2^A*=0RU2e0ApfC_Nr3I8^pI8C_uXeLhgY<>M& zaK@u)JpA|D(eOl-d15=nBvn8D%*0;=0pt$^0d(VIBpm1QfzYa4j}cmxD*-~QQh<)r z%JT71qLmfkW1?18s8+&iP&mA00Q?v)NZLFsLIvOf#!vTQxiW|0l8$k=6HBjoJ?s;7 zDF~|I>Qr}NliN~((_k*bJ`j$nyHwgP{=E^w6z}eqH3cS zbTpJ4MlA%v=&{t}M$2e>E!fdmO7itbY>jjoy^Sg!KsGlc)Y<4i*mCF zfgVEUoO2IDv-55`L95uC$SxaOY0k;_ZbB@Ny`j%o@;$w(+Yjf`&wtM}luWl0wqk{7 zh-l858HlB+Awjiz9RK_(w*xwwD4*i4iqqmDxKpR~g+@b5gtO^j@A~ex$<1PQ+k8jZ63E4W?yM7R=?u64Se$`)dm64wt-Z$FcHTzsdbmy448sKoM zqLgFc#(vMbJRUp=ypfLyor^mPUH85f-ZGk+YAZftC!qqqA|5nc&*19{joG%}UaP%* z4MGr?CgFs~UH|wb%yD(o3eWQ{x*b1n(TCCV27wMoZNwp+qxRF~#n^!@7zOJf0v2<> zsxKJL9}ilOxbxGVkw>0F^UF0Vbn$I?TKrE0t@kA+nscDh)|H990vQ{>A3Pg5Mx#6C zRyzMS_d5M_=g#O3qbwQRi;OhqIfC2GDJafzp)Rcl$zAH0qEzKY(3c7X-y=*~JpsTI z0id1$)NUb0nkibkExo3jw~y+VAEb4ZL3BD z1ML3&O3M}A=BJgTzd(=x_z%TT7!7^9Cw?kE2I|)Uw*c1rAOzrBAi@Z(-E0E|AUuk9 zz?yNjF!3me{5+9f5E;0!N9~d47TB1WkDp7HFTe)wcs~wG$INpXS6`BBL;4n~-)PrT z!6DRJ*vYr0lRQewP>wx1Cwx`Sx9GR|0gT9| z8Tf-P2HtTuV^@5=K1+GcwYnA6d|(UWoNH#E4cft^@`~xfH!K=qgiFL_)m98k+r+{l zuI2UyWRe@VF5x9Lm+;aQ`hBE8up%uj=A<##=`?z;QoA zl+%5P#nMwU%oXB&G<1Qr17A=MqCbNP1%JH~&4RzlwjA97a@1N$%% zQkhwX7c$T}^EY4-R7M7HFuseyj=}~%ZTp7hF}(xEN8W0~i3{zE>PE>07Q1?*3}tEF zf6lQ4%2B?Gn0N=Zj<0%l$z5%&Z8{PSFBpT?YA%@>x)DHMG#&ZpnmC;1Wz}Hs*3>0k zBM=b|f*tbT^YI3sgBC&4ERV#>+-F3zZQDQX{h;|%ap}OxjFkqnp`J z;!d=2qf-}zu$B`$;N@-!e%pWKzTrptYt&qVix~3(7^=?s4EN6~YG8AWh#SJV!dMO7 z02+jp7>wJZg!b2fiG`Z946jDtQuDgA;axLks5ioK6oi4!yX(=vV_CKLOCHvqe~hzYT3L)}*N7 zGJkUq-J!hEJ|cvNj`$}uSC1=H=5d$#*QewjY2+gmFh`+%%(pQaphtWY3S$1%WyfhB zZOg`KAT8=Nj+m2Ix`6h1JjC}#8Je&EB6|tuSmavNutjRV`Ob)buzi4`-NC={8&JEDF>pL9AUHm{3VzjMgN0%2 zPdG&ZGwce9NV#5aU&&6u@^6*$>Sl#qWo}xP>)`7vjScgdFU=T4Gem0g8!`6W=U&41qSp>u@~p*fun0l z4eO%5fbngs;?d{hD)@^!B%cPB)GG^+K^qK%7(~c3)YA&@A)g+~3;ra=bwR!Bn*HtC8}yVVXA_c(VBeZ9EJ`8L}2rKDp_ zdbCEvW>}0$q3TuSU3jB3q&15;haVXmgf6|OK$Zv*yULyhZdXa<1BEK0q%1pV?v*JJ zcLy*(btin|jQZq}BS#q3xAub?{0qi=TWV^s24y2w4ScK}JHqc|79G&GaeERO#?X}B z^)=j`)Tv*W-~Wj%z{K|v)D?_^7qvxMx=fuZL3dK@M2Z56ABge-OFK}JBS(Pei-%C5 z_G1i9N$?I;{aP9H#AeRm;-<|OiF|^nHBv+j(g2j;HGX%z0*%p4i<3WFu$E z_$km&r=ybU=t_xKuSPD-e|;0xCoJHz^zwrCz!v-f+j-#7)6<**R@N)>waO-MB!=gk z$aH_i{{`M?CqCK(9eMa@{`Ay3L^XU3Umb0b;`)URltXc8a^m7(WG{ z+-g_&oPj18_MsJ907LG7fyjcHQ2pWx=(5edorul};KD~-SkW0L?^|FR6IB(`zbLd1o|skLxR^*%1#h!&C{{8hKx8yU6Ou4to#rVImmTgL zV5d?(DB^D~g6=1x*vUpBcw2pH8gZbpn?R>Hc@+;aIZx{iaIGr|-GLJ%Dl+7#qx!+< zvmdx0k{t9&1oE!_UP8YHI=P``giFfpLphIL-i==n+iA7p^=KV8p_4Puaz(SIrP(}Dwms<>LO%;|5Mj63hvHb) zy73F=WF~&u3)E$2aqxV&zWRoY){9^DpF-9V+46AQ^ojz#ypZ|Du;}3yX!%|hres6f zOyz>!8{kC6q4{oa=2)-d>_(+9A|})^hP$~g*g}81MCWM`jSgKO9ADQQL#^r zER5FB38oe18|8bjba)K-&hn&ycEJAeI6R$P4`VvK0&pV+EWbTCnB(G&yn{X<=j)0& z=d*Y&;SBu%Vb<)as#oP|Rr}&}C((M+=HpmAKyqz~*KSSc)9`2m*)z`T)3X2DkgtG; z1p>imuP!WzU&4lF6^?*py_+KmTcaK*&?^e@tpFw9h{u7<+f;&v@H?M_OTLCvE_pgA z%VTcrMO8U<7WjTCH0ge@E&HjGXy#~w0dgQmHPB?U1)v~4zDhhE4U%|V4M9kYp*NJ1 z3z%|5W4H@@n`lW)PV!SASfIx7>szPD*Ero;j?(vpfQ?NsBx)ZaU5qo7)!2z2mD;cZ zm?&GJukfID2Bwpzvi1WnXz(5Wfk%g2G>4XSO#Y+UQNOXk9Emh5#;nYw`E7iGF7~$8 zg}fNOTC-SK{NN(mWi(0ETvL2wYO zyMn<6k|gn}ehocH^y!>s9^`U|-_$HjCTd2W!sHD23VWkHU{`%o!Da{AU`cHJ=x#uL zar6wCso3xF3nnF|2qmYO4Q&bggG-^^JcmYP_~KUsB-#gPAD>39u7roEnObpHVj`OJ zR*~p=hzE`@X+#g~fwLdvjqdWmOm@u zaegQn{4r#>e%T1Eyem=QeRf+G{EIr9KggOoV!N>V&JXnRt{h)2i;mOYD^6yHJSRfV zeHKk>2kw6z$KnUVEyKgx9aE)pr-qQ!SzoOi+G1{C=*ectNX)5#$Ghf0@B3IEy=z{D z8?5%0^9TYUJ73pAZ|W6qhPO-;en4W`9rkzqO2wVMEdUS@qG~k+cP-we@kQvr^F=H8 z!rp1I&CM?;0P|uY&|=fw>X(&}l^Bp`v6w426&_8*E(TXp`u4OqgTGSj^@z=02rqRk z{SGRM@K;r?J_R#!U(xGk^KS>RR2y09&v<6c8k00v*)OsD>XrL?_xF?yEz!Vs&<48z zwHZbM@0vdShC;1s&t^vn9^H*cm~T{abodsoX~A@IsaU6>6R1##BmEPoonr9gz)%DB zOM2Db?_(nuJPV!bSBzK!MYc|}Bf-lBqy!<0yQM0|$1VJAtwMf|jM77qx&=RCht(+B92e_Uzx!Fz{Adh@ z)Pb@aMqG&z$965T1E5*1acSp0${r+pD-hYkjTLrS*AybL#}FNfK02L!$m}tc3Q`}o zLwJW0$a|x`TC~%A<4K{8=u|@1-d=8%nqkzRGy>Ybz9c5UPPwV2}*Dg6|?~I4L{Nyb8-H;BREpeM6KGE67Zrq4qfxu zyQ&+C8e)-!ai@|aV=gjBvz`F+1T|=C{p$GjHyXQyHI_JO@F7#2oocb}vw9*RAT4`!j z(wv*t6qg?)0>gAGL9Uhgoe%~{j)e37=8v=W42%HOA@>)_WJ%~`v|Q%D&Q-lT@eG$7 zge4m6>`1Htf?BtJfwMcYOxZt$o=~31?=&6JDIvEMJ_-n01(}7>@y~GC+lu*@K;vWg zgE8XH4t+);RQvnW)Ik=u_4#u^)>+bCB9fr5ksWwW~a#Q`^g^12ZbTd}Q)(cuSDBb=+Mskb)b_ zn)&{Gcmt`DdSJzX!f=AI%JH%!>GpWZR~N{KK0X8_q@BqvcBWjMEVn|h-T?X( z@4#2wy@dEnOC46v#Yt2|kPIe3>L{?gDT@y7&%sd{qRLzdg`Fmar_hjplFOQ~-iMyX zZw%PjfM?EGI4FlQ3vt_W@3$bZZC(Em&RTg?#S=5~k7bZ}z%2C+)FtE)!}5_B2qYJK z%S@`GBvWfLpOTv`I8f%nz3kHKrK`}7fg=`akb!0|2H4e4BJ;y%+!R~w0BxfLC;;ia z*i^6)i4eP+D-QKyOA&$H*IJ)AdCkku$I^5Oxc1m!z55yWHgZByk$*;KiJ;|;M4;v9 z6?xc&Ik&~<;0Fm0t|ob{U6B(JTOuk>u{UzHl=sAW|IJbeZ2xa2yMZ&!Vxc`;gd$*9 zm>=Z=2*lAroLS5Tc!^s%f2>n8_Jqg`uRp-!w$ME|EX9f_HS~(5WNyTa)~DpcEh$i6 z{8n*CPFwJYCO3?oZTlvNrLxa|@V@Vbt2{|uZbE5!M_EfTA9@pUQ~{$*W!`6* z;Yu{ut7q0aj+5BLuCM54%KZw-QL##>we4&@)9^h)z1eWpQ(}IMvFAdTX?PwfHC%OA z$HMfJs%*vjb*_{)e9LY@@8$!GAT*jWlePwT%i@KVYlt-Ed&F=(oLJk)Vrm8Z2Lwz4 zaT3$d=Mc{i(+NKG9(}sY|IU4tdbZ*FweG419V?6pkOlWmVq`WI2Tsp+whYwYN_}O> zm5p1Jr7qs0EOql1WvNFmE!0YL(PX&AC#}r++hy8x7f~>8UkG_H-IZ9Wmhv@Yq{@0L8@+Gq-?9 zZikJt`mCNTF9_ofjufTN7CQsf1MC5#HTAJCk$*sLT7LnpbRU=+KF}~9>>0QSla$1$J(DHI_*6}d%rwa_Kw3@k?MHDgGXYGd4%&o3oOO#tXhf##6J9l5aI|b zd$r3f#6d11(m}{Z#z0bPp(edz1vltbxQ>fuewBt8WC$%6SSy`A%ZOIEy9;Y~<%?Q* z2adohUbBvYkZlC*JG^x~6w=2tKdA^ImA>Lnmq2+Bz`9|)^f)^5Ps*!)Ky+XAdhw-@ z5bt`UOHo&)1FcxC*RUj5-k5QxUUH}01jYi{rSs14Zh*(EC8gM?@6~#g4r*WkjnHbW zeie^X?o5JcgWp0m;%n7zAt_VqyS_-;uE>=c<&E3}$)zC4P>`tXWvTTwT(vqGdLowP zQ0^8+V0E}@Bt^oqiHDMjTAQkJG~qJ;0y&|m8f82hj1uC0=|eFtSWs4xo;)20tl-8B zjU*r8fd#g+JUdd;*dG6Vq(G(5TE6s9zFt*;d@k6b%H+bqZ}e{T06A>jj!)cp#9#Ag z$bF(kZ^73X8r~zr@HF=V#Z3*TUxj667`F$FRA8PS0~1~hy*Q9hFUz4zErN$NSRGV? zt6b(tC+yzabDBdry@A|5fEm2W-djZ<0W@Y}(7ui%{i8p!*FwmC~Pbe9<6$np&?X=7ArrsM+ z(t27!tcL+YxGE3)zX;!8Ho;%8B2KQnb>rEob?w}{g*Aly-pCyEotDfcI8?FLAI3pzRb~N!Yz1&ukUdK5 zmvQWBe{nbcK)unI_{iWR{R$qL)in|!Yd;(PHF`GZATNWRfc!XAYIpE&d=ctE928>U zMi5q5-7ug9JPyG*1$V1*3c|2n*1e+KSRuKBa&WEELflBaEqaN|++O5DR{W7fHoc@A8R&EGEuSCo5Oc=dd$c0Qw9YR#4pHrBNqb9BKZ!I%BP|#F4nV~w~Mv| z5LoXGYQl!=ByaQpz{X{3{N%y)m-xiUfvw!dNMi@+Jq<*?aa0Lt1g%Q#|Va8eD#j5m*Fpebqo$Y$b)ulqlIewdZX4>D{Zkw*lZv-XaZJiM5`#Mh+5COP*H5SN`9Zu zGjq;fxM=(K`^z8MbD1;q%yXM(o_XdO&Ft#%tQY`QGmh<dKZvo?TRx}RxGZvfTy#< zn@v84zxE7(srel1mq+56KVKC?=p)AlENlAj);h2(A8N226DEM;s%hbXi8}@rxM~{(b zSzOhs`xK8Oi~Q&YYgEV0zW;3xumztXEDr095gz*svv|=Y`OOOR_sB(jI&2mH&pCR2 z-mq8r^v)iL-tvSd0g_YXfncGJlPSL z1*hN+Vm}{Z-yfGLgPSLGEO=WDaBV*Z+vMRkMnp#YQ6*u>A#-Ye6c(?S87>4QM#fY& zc6)5uyvCENg&Z9k(a+Q#^4bXgAtwVq1+DvMm)(Q;>M94hwt~(Sxe( zPrO>G*ZlRwG7$Cv9Uea$@}(F+c&p4T%U3LCM6N;eHXGUucsSPEu{+6n+<210ddRdp zl6wFaJ&8Kmi8A55DAft((s;<}^|ShSC4QqOhv~=@xNHlr#ed2%R1ATN$QQQme5e(Y z;P#QZBa2uS8Q1zpCl==9SwxI{}fwcYWL48C_USyPVe)e*k8`(}#E12V$4iM+c#u_zdVtdt#aD&w{m7^b7Wo zqom?n444IY0<)cKmay4naz#TE=EfCppfbY~{2j_(4{jZ9w;LV+>B7tn=)k;YA%neD zkTuthF~pz>Yv-$KP+&N_GvIqd{L}^FDHLl#&)=yb zU`}wUaM#o?H)(1A3T-DBMIG`sA2LK2klONsj z9cW%L6@bc%K133tl(N1jKtukXPcZPZw3Zm_{Ql67&w`1qa1d92#}z+rQy=GN)PfID zfnzym<6}%UPXmBS(f(G8wr-(;aD11Ru7`S$?*{xfPC{F8(?mQp<}x$8t&M+|vVJfK zr-BhT_BWDHMX+A~FSMyzVs$$fnHhlC#jOoQf_0!&%qwJ{Uoq zG8+I}W@GD*!%PIHkJ(8M6}_yqqHzAU`}@(N1=rJ(Yx_hA{HLgI^w3%E`5Uk%5v;HZu=G;ljqOte zOqrsQ@|q@K0Bp2VB~oT*XBB}84dkNn+hwCr!|@ZqF;tZ_eqgE9%SW*6Z1!>ClT0kU z);A3cx~MRSJyj}O{Xf5^uOKYXjNX zYT80H_%F5E@H%Vtu&McXendrZGSEXCaeGyFd6RSbTma1v`ZU{K7Hec$ABA7x1XX>TAHoRk6&L5pD`Ir!KK&gdzwZSR<8y ze6&=?8_WcCBsiRz43NeE$qB3DkG)Ss2UFA9YSb`v6o!~d5H}z-%RE|^S;P~(qI&KN zE(v@??4u_%21O8@C-W&!h~sRA$5%8mk%ZL{iP`@1cG_#$)aF@K5d*3~E{1r-mVmq} zy6J=$U;tMv3sx+FonUu!K_3*VC#q7$k-Lx01-2Vd10@N@D<#Z2g@PYT&+!q-GCqNH&meZBPfj{_EF8;4X$EF12QijBp(^T z*4S87LvBiFgwwMX5Qo_7PS3{t76+_9hi677@yh+`;){G&Z2ZI87QI9BY!4pRpg1u{-ux`9B zzL)%3vSL5n?9HJRrl_ZJWN++Nz^Z77G1}T^quutMBfZ7?SWi!w+smy}uxMv5^uS>C z{E@+Kr>sU;LWi*@Qa+?>=ldsMZF4I^eC0fyS~`8Sty!~wvC9Q_2UmdA&L?16t?z=Y zVxBDy=}o#dvi-+(Ux zYx%hPZT!bzb}tqtU@>Dy7MY7gW;9MV?l6VeAOXhUMSE%_>&7z+2oU|yVMY_%0EO-c z{i1)??5SC>aUt#%n?ZL#I^5RK0z6vGW=?ixOlBxA9)g z1BbEFUw2>yTf~QIBK{sK7`kiLpolv=9>q0)<%j-baF7M8A{B>z9;yKX=vv*0G70uCWp;$wH!(KU6j2f$|U@*p$u4Y zkOr@%J@lS`G z|44`9p2u^CS|_7x^}=yb&bHFqu4s`G9oK#&@V*y#CyMV>yY>{H{U|PcCJY8GVVcN<=gGqr&V)w? zj3AbT@YE?V5KyASN0iCKIV3D<;>6nT0X#zw*F+{f`G+f<0#64Tk6i{Z(2klJ)DvaI z!~yU)Vcynlgy+S?zk#1Q2QLg&j-1;m@aV=1qmva(1yS$BR4N?^7xDAq4**Y}!!=>s z_k(EPR}^OZd#N36Zcm7(ESlXT&(LXsGc++eD+d{7D~Ns<#}c;s%F+kd;l>v;m`>a4 zoc%zzi-%d6IZlo_miD2E$dJnRWzWBmyK zQ>OVsgv#QyFPwzD))N{b9Vu*yyMrHRA*n$q2M@SZQvuL;A0#2r(Tibe!? zwZ!J)Gs}mn6-l|72#O}@KUVSB^b`m8X8HS*X{T>hV;tmT@5gd!PTg1944*OH){_x2 z>9-N`-WHZXys0XY5uXNb{S0xYj{TzdLrp<&2sRCw0iRkvYX=hDp3v{{1D6Xm##pM0 zBDL;oXRE{{sF?Hvi*S&Fu;l|FTT=|hX}tccF=9tKS8cN8MeWdbTZ_>X%;C^aV4J9rJE?pjr@cLdHO_TDN4t0fc&RQvXFioAizaIR6evV0%3-9 zkI0|^q*rPc;=3h8;``x2~HirQh;kng+%fT2>n9V8p zJ_@Fo?ud3CAH}YTp}%0wcl{BTNa@C`ua4Y1^sV{7n&TeYGV96cKETc_2)m|U0&Fu0cFfyE`;&Y=Ggl`h%Wl#wBfB0j*|o9UmX+4VW5m8XW*OX3xYkB@QWc&W&EHL?tb8{t+A)U%$^TGld{S)CmEbdIV!K&3gf>!U zgY`MKb;Aw196~Uxtc+V27b$I*2~u#9GjDpSE@Emp!V$UnqmEKSVk=Y;oy0aVQY0Qs zZ8b*KlWZC=;l^#9gXYD~vCE46puyBmx=S=-4&$WTk&S9Dp}}*J1KIhHLF-(NXKDIG z#&`I;9K@Yc^)!P%2Gx)ZOqK3eqQ_fwi$UI{u1&d8x2%`7X*1%J;@C-=VT$D;Cj4tB<)?!P=@=gb!)+; zR}^8d?3hCH5}$c>u{z+{yuypfk`b{mYPudH;9_SD_tmbp76OP6@~o6o{IB+zcNcS;*HCOK z(;HQ^JxRTSHC;O;s+}H(OWmbnCvt@%v=v=*JpapypfO(Vg#8$o+{zxVL;;*O3j4eU zR|hO9_y^Lfx7*EChTUbd%HZ!EarZ!YYsUTyz=Lt^ZHy|IWfC~_4-6>IwmR?)_97A> zQ(D=Cpj}VsadsS7z-N&FrCpaXS3qbjp&tJ>*Zr^XW&M>oUOfx;L-x8V zNNZ4>ADPx|CKzL9|Tw$GTvDj+#wsd#@F-j)<8U<2Ek=(=IfR zHLpfQd>y$PT!nL=!RzIW0Imbg24TOARQCd_gZ}^rL*qU_iKQ}<3z=|$n_@szB!ou) zG-TGR-{!dD%dnb(UZU&H>O&*MQ}Bc8+?N0EP9m>+hq!$$D7m#p;@-@D@g>O>i68NsH)sg8C*nhUKFR?a%+F zRYCxVo5WY(wXUI_H6$(J*I3@Rgx}tm!)OWS0%TAbUAkxYeO)yW8#dmmKI=e^>FV_;$ExiXwshNJ&ArVLxZr%O^BxxU&XDyK5{KbO;$SpPsGe0Q)Q4->5jDn!#w~Z>qcV)1) z+ef?0@YWbz&iJg+V}oiJR?2uSsY9@d3Zu4HEhNyd20%gCG(fFO4}k9s4d1(9X2SPI zF9qM{^84R`PdR0i_=7a0ftAGH%lD?>55tDbdZbX{?`#d<85+JZDexiMU!zdrP9xGm zVSzER+`-~O@b~@UJMsYdzC2dJ_xRfie~;uV{QXvb75@JJgYS-eQt(IRV_l-*+xeD) z@5>_;eBD#vJ3Rk6jK}%l=y8Y}bZ}W|^P&nQvi(EKWdCfUxH!m^N^zsjpJuBUp!)pF8eO!Kc7?iH2|Io0|STH2wdJ@QHt}X6p>vc}@rr zcXI~3o-o&pRX+1bBoEqD61|&}=-t3!agyZSsFlR?RhweWPj9Ga2-UssQk8lBAE>!z zFa2YlhkAmoYxd^w`r)JGc~&v5Whuh5yf>W*!7W)K?20-EB|YJ7D3d;ZS*NW}pRP_b zfh4YjaasjiBrS0~Y!*oxU$ch&lbMSIJ7O>|j6N|1K3^(t(j;1mJB|n7b(QgDPBIkn z?tkU{$7t|ZDl~kAhHNy@@vqVFNCMAO=Lax9Bd@%mhH?8aEbAS_m}AJY{x+{0vUXl% zKGlo@%;i)T<#=U;n@jPxdeT^fS3-(Aia=f zKD88ed&1n@Wi@u#$Ts>Kg~3&PHOUkD36YuJuSD~x|TU{Addb4*ub$BlZU zZz$>}$(#%|`z1bdAc+S67lz)#C|hZoPYA#i^@JcM5FpxHHO@6k7!zz*H)mbK_S?}7 zGfYhB$0%`F0Qw{Wh|f`6j z9H^!JiSEdv`kT8H6B%>JL`azPEIFuudqu5~65Mk&G^Cx$MUn$d#jzQwQaKMbn^WsN z;a3RYvwutDj=6PU4dxz6sj(Mogbk^@L^|UD(zt-A(S1N^{U@Xg$f#1sgStSL6FYCC zb=Oxw1ml2VHer^Kiq?KpMQZb-QW4ELEzoYO6<=wT5aiH!QnpiQE1C01V6;{spW2Qp zZ&Zj(AUN-VF0g@^MId^h4m=R@Tz3~9FcE6H{i*fo9Eb?kJ8S^3Cwgk3C(IC_|5Trz zHcly$*H8y1BaW8fVhLs_2raR2Mi;@Jo=4BBtcCfiF~L@ESDzmBlD8kk?eo--EAgI;xI_jwLhF zk0Co5qf2=~R?;mcxk%Iq38QpIimvz}VPS&R!>ViPzl5^bY?qjY@0dncwXfFq?eW`Q z9p)kOQw#oY{MK+m8own+C2qm9a7G?)K7>8%E8dw7EV zl+J9jGfXqv*JQSSuO5`y&IiBL3$sORW(&^x&c-#fae!1?BG5kgt;ps#`sWYEXhm0P zCA8gUw9(r@q#%e?r#X#UsYzZ_87r5HH#$*&XzLgcKFi>=z7D6UeA%MESW%3d35CyX zjg`S`aR1@8qrd*V6(GI#{rGJcirM^j-yQglqnSDY^Kzp#xOGVBx@h4_oHN5k;eio4 zV&EZ~{R6WXcc>42l-twi2ar(+z&k7QVQ$W~W~}Y*Y8#dB?1oC&Yg_K~!JSe&2p^mD z2f0kHhIKvGf$!8R2lWfiKpEtUKHCDT2W=V~JmGbC8eB7EvgB`$xT)M-IWr2!fR`k_{mR*kZc3jf*M2^c^+xVrp?ar-BXJkg{VIrldyVwlYa29NfmfDP_=_A@;voghFT}N!cv0=QqIvwP zv9@N53x1fE&4n#n@_KX_ui_pLTE4(dOT4hhT009|;&18pyJrPF&z|M2Et~VCFv=|( z0HEyn1gw>MRzP2Z@>U0k_7l$voR*dJm*73HDz6vgHG_p_A8}=iRjA{$PeN7A=i*c|i7nLodvWlP~nsK?c#l`iZ4Y;m=6jm3v_XdSG~)2 z-gUX=cbtS*c$cT%@!Y4MsPmm$7Z=~o17ZDrOPc}q(7Gbr`i~Aa=bN?iW?dj5zN^({ zwGXc{&R@XJJc#%p4DcmT6N8b1Y=&nQ-CSpw%GooV&^i_H`?&~0Y9 z*F+U2sxVQ7i3+gOOZOilQ5gLKu-ibTE|@>N%?-#SK_GQru+1G@?S`g81tq8;*zCqufQY|D z9=}-^-stbnvM49j;Y>WhS^_0SWZ`ml3t+*G^NmG5y)4FqO~N<9{oNreJMKE3IgR?Z<3p&Fd)<+%_ND8WeMku! z$7zCyLfY|?KW{pesw>!@-MKo;pVJ2B1|NjCvGb2vVS(Ju|&^r@V{P!%hX8guqSFCbAT*QwB*8!Pblu!K}cod8C40b35{6 zVJ#-SKKdTM@MnV#WJ2(!W;o4{cI`uEbE6f@YAk3bw;y z^UCeQID@m^P;`lJL>YGDr(fg61m8g8FOjmWAPgzMDQt(270(^{F%(w?#a%JlmBMJN zbv-$%9xTUn&8KFv&RoM4H>{-w&KGQ6Mr&gbIy{K_1YZp@;5FO|Bq$w%b_Qp)#lHmF zG**_99?gk=@N??%`Rs=|vM0fPd$nEr2dJvtyr3s^@1Vr9(Q;5db}_JSE#Ae?<6Q1b z>cg6?`@o!f`ioOGy%`5=ZpPb;12#X!qp0{g)xn#9`jO$BD+R95hgTAymv+Ht+o~pa zFgj$b-;WR{=&}qr^QM`-=(WUYnQWjYE(d5nst?d)1IDB308K)-T2B#G;Z(2QLZ6fs z&t7SB%^E44=8wSm3G7K&*@%Ncgke#Dihl#-a2V%#<=lpafuerP8}%D!OC5G^*cYI-5HTE-=uxRkD7wNHXS-jH6T$lIL+B?g z!P-8?Xvd+;*0b!@=(5(;GUq{ah0!a~AGRBvslN6`^+W-CAZ*L6j9q4@?qoIZqscV> zs#=ALyOa?H{pAR==fCGLqeBKs|H3X}+~CmC-9qrfI&^oh+7U08xV6c_^S5M?-~vGmvY zFNnpoWw78?);1h5WpN1x22J&tRCNb!o+IV4&uK{kbmvXyxG_sKBVbNI4 zkXo53(p72v3To>VMpIS_o_G&NQbC%% z+W>5K1s-z-UiLP9;ALmkk{Yl~WMkn(BUqsum?eU1){r2Mn?uvbA%)OKSKv@Y5TR510b`q@x9L2WxdFmQM-%jfvk#1%u z<-!}yovtMyy{}Y`AH5C5UyTp-=DTCE{0}3E-vVQL>eAHLuf88=exLCs zMFaE}4bY)9z=93n2Mq5%m|;d+{8il9a&d;)-8z>^(z?gDvrv&QGKP-D{0MR!ane5r zEH@lJ1e^?cA>_&Ip30`r9nkwSAQj)ats(2t)n93U*w!L^g*VtwfcOTw;~~)2^Pi!? zR`{1FsMwQ;e6JWK*f@S^$=kbNSML87_Fs`Rp4#i5RIs7{!|7|Rz>aNSCXu5bpbMc|QOoHu7 zu@0h|+p6d0*B^ZYu4Nfq9SEuxaIkwE-w^o}Z%rm^X@?!gWF9;?D7hyujV(>hmf!VJ z6j*SX#~5L*`$gnGdlZ#!5*F!}LSL4wMOssrz}++CZcmsg*+{eIVw~6%$q%C@SLDk6 zHJ@z9S==}#eA%--T#*UBGq6^+WxMqo+!+ymgT==)N}KluKiLkquJM#G?z=l)GUdvY zBF0B}g+~?0ahPYWViB}~vx|(d#a5rUz<(@E1@-{Y2up?684*tW{lB;6wy$;UOPH#x;#1|k zfJbpi{FfMJ%rGCu2GGNg!7(YXg;8N5x@!+J<)8mI2<~EhH5db$^{C375i3P)Q8)O` zx&+b{KNIaF^<&M}d~gBgAGD7#LeL_?#3PS)D}7$xJ?W!0Z42v0KbX>#7(NIr?AhWp z0S)=K17m4I8uEREM;U_J>l7uZ3`cU2u7lwCP7H>4NL_4@d1`8SNt7 zK1>xhrrI~|7jK+uOhpl*J7V?I(3cLWp46;imy_#j-sp`KN)RwwqAv7EV6T5c6l{^~ z_c}0K?Wlb=pFYiCSM@YQwN~1!!O%eH)@}XpZ{vS5;z|As_>Y{d@ZU^$HU5h~Jrw>Q z`1Jo7{()qL&cLMsHJ4PEhS}So)qcmS_g`Zp@MYs7pO=l=#VLB1#0FR`~aIXdAHIxjXz6#H{!?E zFZa#NK=I5B{ZhsnQjGvLTg}ifzxNTvQ262bY(u+x^%AL!6vKh0s{wr>ekb9#0KXIP z>&0&+e)I9mb>_V2WYuxx2f*oDcrqxs%Z(F|*m>9#JvWPY(P&p}h?6t+{3uGLbt#Z6 zAcW}6a|p}%SCX*oO$K4h39xh!h$6nkQ$bXLDTzjSDu^)^d$k&?E8`FW0cbo6W&rna z#8qNmC-+l$k8YjITR=Y8v)}?g8t0o-vs<3QQRG>`-1YlpMQ1|q2B8}3WPUi7A9g}La42b@ufS&6 zwYO%l?DrfJjbGY+fvyvjHf}_%X2@5F7JxjubYwh+h~ZKOW7slxe2}W9kvU(n+m;V) zcKa=Av3p&bWVOSNl{IVFEd=uE#jAQ^Ikpu4%<8dF!tgTai6;Ql0Z1v5pWB9UaUsOs zA@$*gM%5S&&01}}_5n~k3H+y5DeUKF*Ge=zkKeS<70~!-d=_G-qMV(r%^2IzCU?&p5^phnH?{ zN#w!|b!<@R54o1bGusNCzcd@u*HNC(UrA>@|3DzH4$O3IPVvYEuD2<7h&>WX<6qNS zEZ4y4-~E{=b+xae6Hqj52bCMW#Dwe;Wxxu;bk+PsNmfC$|4mByLpB@{^R9u2O$6;U z(GNb~NJO*)s|hW*YPJ@U&z1={L%$XC?n$2*p(};kA@>9MaEXWkbe#`(HY-fM+4gt; z@ZBUQ(BJ(%WiDfwc%Z+G#5W-nTevtIc$g%tit$?*&&it1~Cj94Wx0%w7m zy3wUgUujZE95lsSAsfBZ*DDmQ{`9@11y~Z%rx~kF6QT>4p`NH&Lxei>>;EHuzlDvU z))Q9${l9_V0sRh+->TSQ@EiR^Gh1}2x=8WN*mzFSJx0s_kNCxUJ4Ap>>?NRgvCt7b z!L|0mHj_qgu#q_LZR%wI4^ToJSr8YRb&f2>CX%K)Pi~{}J@KdWgW0iG9h>{t=Gg@|$#v zhMzbyKxtDqqkz#tALfrU&awOCjT~3x=_deO@V>%q&%--VjrjoY%`%wpSZ&7xwVD}) zUkE{03`1&!|I^iQ15j^WhuuA35pny0J@~?!_c_q*$1_B++s|&sv&9Utq+cWgqej`N zkD)v#49D5kqH$URy}+N z$cR4y*aXmq8E8{Hag#CFgqs^exX1cFZW{g7uhexQlD#mRbBh|Gqa8pA89@z9T*S**W0|xP*qw#?u>OqGi^NVT zP?ifO3tauD7nj~#Mg!2BD^6eX%Qj@#7k92bU;a10?}a&0+V`~gnrKXO;ypZtR=L}+8KH38*q~Giu_kxE!^Sd#$gM@w*a=Zcq?%ASm0Uf z8jM8OV4gbxPttfyGj{rmUt>^PydW=l2x{PCTw)zvOn zpj*oq-e60%Ykly&oKxN#_K>(AJi#Z3bPxtwZxTQt;(Z9lb_T@~JWL-H*%v)1s&8u6 z5G|8!^%l6z%3hd^-?di3GBpQv`%5@uzvPqS3rSY1O@uNdW;y>t5Mc&k^nR~8+_W)ZoR$1 zCsu}c4g|okv$fXx^>Q@%BkF8DklDf+=%Ts+tp!mLdMj6@EawqSIoP0VY(+LgwqLUq{z58^;7F^~z!7kTbBM@cMg5|@t2=AtS_A9>08j2`B3!EBk^#<>Cy8>Ufk96Y}Z*XdM z#cSq}E@U`uDI7NU?Yr05)m5!EcA;q;frwSgaX5?afg?a@b8bg;3i?KxVsI8kj`*r& zVCbs1&AG2d+?Pe%?I>kbtbvJWEa3V&)!54&>=n)DGtn43R`K@G?7ROMm-xAgwPu;y zsAx7TnhEt(wp7tvhU2{B*Gj8vaatA*7e_8KoYb5*w7b7&u-%KyW#RRKug$6s^M2;7 z3R>NQyNqG>ZPY z;!oq6PThPa0Vm!5r8`OOuzQZe%IM5O`%x(IUfOrv!3>GEv`1b(`m?RJ#J^WcH|msJ zAY{?od$8U~7>q?7xQs0N6#tFz2K*_(RlIeV!|EB&Sjx&D~vD8zPgks%K}pJfUfz z>b`pDdsu^9cE)!d_^xp&{smX(?RdWN`a5S$nQnAPRL^=ms~wXakri(awN2OFdcB_z z-LeY1IAqzH>&&;J31ek0SJq=wDzCk>e!@>@-efGyW&N?4XlgocXnN{TmgUNd`$M_3 zx+1E}^ykt>O`?_ZpwVs}w?ZS<6CQ{TM8ZT^Oy(yTE`G2S8;Xp5v;mh!yDFxbHGiT0pMMiZOG%O;=l1eMEO<|w;3U6^xI!EDP zo7dP0CvsST0myIn=8)_OO-5Zct0)ypL*53d^*qwcd8(A;HS&~65mi~GCwcC9SD4Ii zs!pQmag7)+zHA3L*n;I9vY%678X|}6VIz=&6?IpijX|S!t+QiAkvSO_kvT9IC&Rl>u zclJKv31xspCLYDbE#V9uq@q0SK{ghp<#_o@L+cK0H_F5%(u>Ol4;Yaw_*TTZN2OjF4~}{?<*1G1Zq{d1y0+3 z;@KS7^XA3j)2J~6(o1%Lr7p$uD5~dpH&Bn=({VkV|IX8$g6(139q@o*dNB?!Gl$9O zU;;+#qw|kc475H5Yes3$E=CjL=&*ZpM9*v4;TdW(6Xsc1 zjDvv!)`9En*<8pmI!uN;#W--A#8mGmf~}nv`n4L0SJGHC2EPF6>vUGpxLbR-TIzDf}Q(x95@j@jp$Sd@YZMz&=e=CmZpY?Kf5vBs9F;z@(PWRNxqef#W3# z$459g#$$zJ#UFy>-G5RzR*p;{8r`GGM|xwfVB`4fB{q&j@1s7ntmu6&T1BHlZ2Tz} zdjTJa?}Z9&)eoSTQA=S{FM!f0Zjl+jf(Cj-)IQNUXoUe_+G4Q&_jx!%KEVKh2F9^h zeO3K%^%I9J(|iMS@oFHVqHn;!=y+(Tm(qPwqA4ZxB>pDqb2RTpz-9SslA2dyJzV@B zXR47T_bl^O0>=QK!dM0-fZG>7;olRhei`WoU*$O#41bOS0q-{v*z; z9)64W+H=Nq1&%-*!ZuM*3FJMX4a;DK{ZLS7#MkbkC1hfM1w?Q-ns(E`ocJ=J1qdQw zJ!%EvxF5?__biaxF5o2oG%%vkFHZNyPf2GiIW`deD(wuH9EpAv62o=8lr?Ru=+{91 zhqPBx2a--e=y~W7{MV0_QlCewU>txRp)9c5aF33h2hh)x=UFtDr4#wS`2RpMxgLtQ zl?1${Cmh4DlVQ@JyJ-f^NvxPfwfw^C@v~%Uph;UP9sA5FSitCz5iYp;DB~mB>T$}% z--E45iJ%?;DlbAkaMM=8m4)@bb8*LpV7+Y6u*_lYV`weiPJjWLZ3I1nnwX!YX6raq z20!nO`0=b*CUHzaJJ7>b`x$(>QbORY$OUP33f#jPMoI|_tK~-(@*a}Cb{T%*rf(VE zjNB(soz=sj_BZ0f4Eg-{nzM>dvMD48s2v1!b9dM^cm>LP8AJtU6?J{Ln(gZCy(i$K z(&iXC*|kdV-<>4ObFk_w@mZyH#-9(l{j~g}J)BlgKHAKL3V}xbDj14=HF6emKpA_owgs#Ig@ce|* zZA}903=DLBC@Ur^0T6#fP1IcO{;Fx-i^cs9<}B+r00|50i+cI=;Woc#(=xg>o(3nyXV8G@*H7#-U^FCP)ugT?Olz)7VW)wB=$a&{wxSrs$Bl0tn{ zA^#_ltGjCU($PLYx1kG~+~_dALM3?bSt09Kr@su(2wJ`j!}f4n$#7JxB)}a0m%U7D z2}?poyMKT+5j{A!3=>W4ft6jNJQ}hi(5s^6TdGUX!%R{;Mjdpi$5hO9dcdBS;k6G^ zNDYUVk<;f4tuj`Pq*E|J&G403pS^TQt+MA`H9`TT7EkSHGz;+_m!(Fih&znBU1m&1 zsa@#B*zh_}EiFb!K7@UEqYMok;6WSfb?jndHisAZk(xLT7o}e>Djg}%{5_RAxO|C| z+tPmlMiF)h=IDB-cUaM)B{2nv9BJ$ClhuXR-?SZ5boj@=0MDuAb+tA4P;ySNQ$`7q zP*gNLei^XMm#gqAF0TPg#kK_shsQ6$v+q^C)R%bL9=T4pY6D6Ak4`u=<-0=iL^OjOU}j*U>++W%(jfsv z-WBPVIl;19m#vkTC87I^-Rk42w@$f;&hNlc=)`3Cew^)opfxdo8EfYyDpSIK^=}TT zh5hSOwQvpqKZq9orD$OuuQZly7#aq!fRzU3lkw*^FrQC&-RvSDR7GiMFWHb~YO>Qz z+zmn;(o1RrkDhZ#8li5}ZFA%)f*qv5egR;|&&RD6mMDd46@>(lXbT1lYg8x&jnrEz z`HpSD==e};#6nbaC5$n<8rD!xX~u`z^g#Mj-W|^L*z+?~^UI8CVlnlhs-|9t-DFmS z&@gDrLNwsE{)}p@f8L&y)1>^wFGua*638W4MJu($m+{TD9m<% zLD+w2JN`9>E4x2EV_%{_l9gY79uxAuPtYOwYPh1OhoJutK35;?K^=h0IriQP{*KI< z7e6+MEKj%y&|4#JOA;${7|n&-hyo)?FXJEKTd9%4O=U!@zqFZGXUdf(?!n}l65)A4 z8)=@}Bha!Gi#X{<932JyEF1d`%y-m2Na`x%L6FZz%Yaxn_yrZWl)j+I{N`^{#V?+l zI_Q(y-yD?MIgf(cFV~^Xu`vd6N?I22s_cI0TUss1=BcNt#-E-=FOAr*@jp2qmmwF4 zSUB*)pAqg4<$=%2k;YE^8RL-MY=W zjz1&ke(ETEI|Q1j82lp6HCVtUsDX@N{qB!S8;!)b&^g1MR5+- zFf5JJ>DY}AOx7Wy(Nw^SFk@@f5~BoV9P5w|b|w``U_k6lhb{X4MzKZgdBqlFDz`8G z&rBtt0nJbXTOTG{*a)Fmh;JJNP!mHXwouFmW)5?N`32Mwe~L15O%?Wh)IW>cyU;yQ znMsgA`EK`p+ZD%N4TrCL#=a#n&VhlU+g3;rO?3bg#-IW90T0Y@%#-HI4wgS;xC9i4EYXuxEQg@mxwF`rlS^mvgVL=vvD&R z;c7D592mb6jijR2M(FpNcZ;sPAOd_ApyPy9;dA*t-*zP)r2Xn_EYb0nnfH3XmD-C1 z=Pm~ry}J#&PYQ4c6JExcCuNfxKm}G^*21&YRs_rX$+M0TXfQumafU6==*SFP{u?~X z@BptuCLBn-M7?rjBTZ@Z3TzHV;F~q(Y_-c{-d*6ke3+U82_>vFxDfFq&uTN0`xI9D zuVlw{e^IK?{s0Rz;7QKuilP&3u`E#+2fFOOHo^Jn>AwEo?RQJZze2S*JPt|=n+TpW zZ6f^r>HmlbNq5M(|4{g!1H2=wb~bP?iw;EpTI{br1ma(RBo*-Txr*t%bJ%?A#Uje}Hf7C&K_xk{$RTj2Q#bD|!?M8_+=~e!0I( zjzITdR3AuLGQ29XPcp!!?|%%OXdN{@X)e&VlZ6Hq^qrnFRvU|j(LX^aqs4+~hvK=z z#%RwnfR10*A>MGJ(S{|NG7M)rq5+#bWJX)>h8RR7oeUKL&9BHbv2NH8Pv~1f#fN#n z=-mc&yKE}a=rhj#<(2BDCQt7d3jF$6iK8Jd4(1!KWkZpbyGTCaD9Dk za+(|7%z6j=8YavXvbwFukIu6v!OU3jFyFr)xqg??!Bf`{0_M-Jcfj=jMCyNnAmTg5 z`!V>B4JSeQpA=BuU*LcexDsGQ1q_bK-c&HKINiemfy@^x0l4*75avvK(PqJ}1=v*Z zetaZ&k6%P@M`1PB;FN*igM9X8H1X@djxQv8Rcd@F&T~eDD0UVZ72De@n99kOxK8tr zS+SL*;m`yz>t;Odf(HYe&tWC;$}ssKA>d;Gq}%uqxM7plXFc+u9{u-3d*Vam{n|AT zW)Ioy?>-W1t^Y!}KnK=jr=k})%-m(&gg8enMo3}#FuwOjUr?~;N5i@k(Q23Ef^b$S za?le6T==Kxzug~W>el$>xW_AO*7474`MhToT*p9dRP44MIwjdyd*IAA$V6akqDc5= z2MSsDaRlV;ij5QoLA+iPss z^+9Mq7$Eg+MSVId#|B*Mf5z+bd~NO{t=N7*P=CV5LjZUpvsq=qIoOQ>`jgx^N(PVc zY^!mWG1Vf&EH1hOet$LkNzX6)-|irZ(dPdtf~)ZY!tJuQ0iGo8pA+04dk6SVqZ{W6 zYXVSW?anO-BTx%A>1-f6!+&IaB;jPvsi%nLE~B<80FlkA?MAk4EilDc4b*g+^LY>g z#KLMl38?Av&ojFl`}xIstPL4Cy14&c0qss3pb%KfHJdX zX<7V9?U>)d=3X;M5xZ0CGoJG)mR}K|G)LzXz$1A%5pnv)TcATWSo#!Bmi8cqt{sjK zdf!I_$?aI)#9up)KWEKe>KK0iCJH7GAlQbg5>3>fpnbvO&Dbz%PDPkKc8zQd42^c+ z-r@py>3W-9y_@kYaB*-=!DLloM>d3RqyMec{Z`SLz=Aa$VHD4?N>vY-I

    sRDC6S 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 z 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

    )V9yIpKRo_&!JYUI}D8*Y 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 @BdJR@3#dBIGSGDT5@H<+FDvX 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 YqXGJVSJ-xuVQ2$~zGvj=cBF#;3yiNt00000 From 43129d17a5dbe3835fa304d0f9ffdd9bd3274773 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 22 Sep 2017 11:26:58 +0200 Subject: [PATCH 201/307] Update graphicstest.ino - use Adafruit_GFX_AS lib instead of Adafruit_GFX --- .../examples/graphicstest/graphicstest.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/graphicstest/graphicstest.ino b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/graphicstest/graphicstest.ino index c75c99573..872b3e535 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/graphicstest/graphicstest.ino +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/graphicstest/graphicstest.ino @@ -15,7 +15,7 @@ #include "SPI.h" -#include "Adafruit_GFX.h" +#include "Adafruit_GFX_AS.h" #include "Adafruit_ILI9341_STM.h" // For the Adafruit shield, these are the default. @@ -346,4 +346,4 @@ unsigned long testFilledRoundRects() { } return micros() - start; -} \ No newline at end of file +} From 6b2ca7dbe70d7354c26d775f7d83a98cf8d537d8 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 22 Sep 2017 11:28:08 +0200 Subject: [PATCH 202/307] Update onoffbutton.ino use Adafruit_GFX_AS lib instead of Adafruit_GFX --- .../Adafruit_ILI9341_STM/examples/onoffbutton/onoffbutton.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/onoffbutton/onoffbutton.ino b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/onoffbutton/onoffbutton.ino index b37383599..5f6049642 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/onoffbutton/onoffbutton.ino +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/onoffbutton/onoffbutton.ino @@ -3,7 +3,7 @@ // //Thanks to Adafruit forums member Asteroid for the original sketch! // -#include +#include #include #include #include From 5c1708e193962df2b1ad4f39a6a6cb035b41bea4 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 22 Sep 2017 11:29:41 +0200 Subject: [PATCH 203/307] Update onoffbutton_breakout.ino - use Adafruit_GFX_AS lib instead of Adafruit_GFX --- .../examples/onoffbutton_breakout/onoffbutton_breakout.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/onoffbutton_breakout/onoffbutton_breakout.ino b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/onoffbutton_breakout/onoffbutton_breakout.ino index 9e35441da..ad8fef205 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/onoffbutton_breakout/onoffbutton_breakout.ino +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/onoffbutton_breakout/onoffbutton_breakout.ino @@ -3,7 +3,7 @@ // //Thanks to Adafruit forums member Asteroid for the original sketch! // -#include +#include #include #include #include From db000d1411128e2611a849d394bddc760a731453 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 22 Sep 2017 11:30:29 +0200 Subject: [PATCH 204/307] Update spitftbitmap.ino - use Adafruit_GFX_AS lib instead of Adafruit_GFX --- .../Adafruit_ILI9341_STM/examples/spitftbitmap/spitftbitmap.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/spitftbitmap/spitftbitmap.ino b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/spitftbitmap/spitftbitmap.ino index 84ff46450..5e46d68da 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/spitftbitmap/spitftbitmap.ino +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/spitftbitmap/spitftbitmap.ino @@ -14,7 +14,7 @@ ****************************************************/ -#include // Core graphics library +#include // Core graphics library #include "Adafruit_ILI9341_STM.h" // Hardware-specific library #include #include From c6c53b79ad4a2f89f3fb5b0dd6ddb153d6da3a9d Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 22 Sep 2017 11:31:00 +0200 Subject: [PATCH 205/307] Update touchpaint.ino - use Adafruit_GFX_AS lib instead of Adafruit_GFX --- .../Adafruit_ILI9341_STM/examples/touchpaint/touchpaint.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/touchpaint/touchpaint.ino b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/touchpaint/touchpaint.ino index e10ecd9cf..5d09180dc 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/touchpaint/touchpaint.ino +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/touchpaint/touchpaint.ino @@ -14,7 +14,7 @@ ****************************************************/ -#include // Core graphics library +#include // Core graphics library #include #include // this is needed even tho we aren't using it #include From 7fda02a821dbb962a2ee33c814cd106dc85f1883 Mon Sep 17 00:00:00 2001 From: Bill Greiman Date: Fri, 22 Sep 2017 10:40:05 -0700 Subject: [PATCH 206/307] SPI add const qualifier Add const qualifier to SPI member function arguments for write and transmit buffers. --- STM32F1/libraries/SPI/src/SPI.cpp | 22 +++++++++++----------- STM32F1/libraries/SPI/src/SPI.h | 12 ++++++------ STM32F4/libraries/SPI/src/SPI.cpp | 10 +++++----- STM32F4/libraries/SPI/src/SPI.h | 6 +++--- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 34df62e33..c07e2ea4a 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -350,10 +350,10 @@ void SPIClass::write(uint16 data, uint32 n) while ( (regs->SR & SPI_SR_BSY) != 0); // wait until BSY=0 before returning } -void SPIClass::write(void *data, uint32 length) +void SPIClass::write(const void *data, uint32 length) { spi_dev * spi_d = _currentSetting->spi_d; - spi_tx(spi_d, (void*)data, length); // data can be array of bytes or words + spi_tx(spi_d, data, length); // data can be array of bytes or words while (spi_is_tx_empty(spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } @@ -391,7 +391,7 @@ uint16_t SPIClass::transfer16(uint16_t data) const * On exit TX buffer is not modified, and RX buffer cotains the received data. * Still in progress. */ -void SPIClass::dmaTransferSet(void *transmitBuf, void *receiveBuf) { +void SPIClass::dmaTransferSet(const void *transmitBuf, void *receiveBuf) { dma_init(_currentSetting->spiDmaDev); //spi_rx_dma_enable(_currentSetting->spi_d); //spi_tx_dma_enable(_currentSetting->spi_d); @@ -401,11 +401,11 @@ void SPIClass::dmaTransferSet(void *transmitBuf, void *receiveBuf) { if (!transmitBuf) { transmitBuf = &ff; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, (DMA_FROM_MEM));// Transmit FF repeatedly + (volatile void*)transmitBuf, dma_bit_size, (DMA_FROM_MEM));// Transmit FF repeatedly } else { dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, (DMA_MINC_MODE | DMA_FROM_MEM ));// Transmit buffer DMA + (volatile void*)transmitBuf, dma_bit_size, (DMA_MINC_MODE | DMA_FROM_MEM ));// Transmit buffer DMA } dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, DMA_PRIORITY_LOW); dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, DMA_PRIORITY_VERY_HIGH); @@ -451,7 +451,7 @@ uint8 SPIClass::dmaTransferRepeat(uint16 length) { * Still in progress. */ -uint8 SPIClass::dmaTransfer(void *transmitBuf, void *receiveBuf, uint16 length) { +uint8 SPIClass::dmaTransfer(const void *transmitBuf, void *receiveBuf, uint16 length) { dmaTransferSet(transmitBuf, receiveBuf); return dmaTransferRepeat(length); } @@ -463,12 +463,12 @@ uint8 SPIClass::dmaTransfer(void *transmitBuf, void *receiveBuf, uint16 length) * 2016 - stevstrong - reworked to automatically detect bit size from SPI setting */ -void SPIClass::dmaSendSet(void * transmitBuf, bool minc) { +void SPIClass::dmaSendSet(const void * transmitBuf, bool minc) { uint32 flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); dma_init(_currentSetting->spiDmaDev); dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + (volatile void*)transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, DMA_PRIORITY_LOW); } @@ -498,12 +498,12 @@ uint8 SPIClass::dmaSendRepeat(uint16 length) { return b; } -uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) { +uint8 SPIClass::dmaSend(const void * transmitBuf, uint16 length, bool minc) { dmaSendSet(transmitBuf, minc); return dmaSendRepeat(length); } -uint8 SPIClass::dmaSendAsync(void * transmitBuf, uint16 length, bool minc) { +uint8 SPIClass::dmaSendAsync(const void * transmitBuf, uint16 length, bool minc) { uint8 b = 0; if (_currentSetting->state != SPI_STATE_READY) @@ -529,7 +529,7 @@ uint8 SPIClass::dmaSendAsync(void * transmitBuf, uint16 length, bool minc) { // TX dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + (volatile void*)transmitBuf, dma_bit_size, flags);// Transmit buffer DMA dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 25eea861c..686d23d4f 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -278,7 +278,7 @@ class SPIClass { * @param buffer Bytes/words to transmit. * @param length Number of bytes/words in buffer to transmit. */ - void write(void * buffer, uint32 length); + void write(const void * buffer, uint32 length); /** * @brief Transmit a byte, then return the next unread byte. @@ -301,8 +301,8 @@ class SPIClass { * @param receiveBuf buffer Bytes to save received data. * @param length Number of bytes in buffer to transmit. */ - uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); - void dmaTransferSet(void *transmitBuf, void *receiveBuf); + uint8 dmaTransfer(const void * transmitBuf, void * receiveBuf, uint16 length); + void dmaTransferSet(const void *transmitBuf, void *receiveBuf); uint8 dmaTransferRepeat(uint16 length); /** @@ -315,11 +315,11 @@ class SPIClass { * @param length Number of bytes in buffer to transmit. * @param minc Set to use Memory Increment mode, clear to use Circular mode. */ - uint8 dmaSend(void * transmitBuf, uint16 length, bool minc = 1); - void dmaSendSet(void * transmitBuf, bool minc); + uint8 dmaSend(const void * transmitBuf, uint16 length, bool minc = 1); + void dmaSendSet(const void * transmitBuf, bool minc); uint8 dmaSendRepeat(uint16 length); - uint8 dmaSendAsync(void * transmitBuf, uint16 length, bool minc = 1); + uint8 dmaSendAsync(const void * transmitBuf, uint16 length, bool minc = 1); /* * Pin accessors */ diff --git a/STM32F4/libraries/SPI/src/SPI.cpp b/STM32F4/libraries/SPI/src/SPI.cpp index 45aa366b2..72a4c4835 100644 --- a/STM32F4/libraries/SPI/src/SPI.cpp +++ b/STM32F4/libraries/SPI/src/SPI.cpp @@ -372,7 +372,7 @@ void SPIClass::write(uint16 data, uint32 n) while ( (regs->SR & SPI_SR_BSY) != 0); // wait until BSY=0 before returning } -void SPIClass::write(void *data, uint32 length) +void SPIClass::write(const void *data, uint32 length) { spi_dev * spi_d = _currentSetting->spi_d; spi_tx(spi_d, (void*)data, length); // data can be array of bytes or words @@ -407,7 +407,7 @@ uint16_t SPIClass::transfer16(uint16_t wr_data) const * On exit TX buffer is not modified, and RX buffer contains the received data. * Still in progress. */ -uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length) +uint8 SPIClass::dmaTransfer(const void * transmitBuf, void * receiveBuf, uint16 length) { if (length == 0) return 0; @@ -442,7 +442,7 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length _currentSetting->spiDmaChannel, dma_bit_size, &_currentSetting->spi_d->regs->DR, // peripheral address - transmitBuf, // memory bank 0 address + (volatile void*)transmitBuf, // memory bank 0 address NULL, // memory bank 1 address flags ); @@ -477,7 +477,7 @@ uint8 SPIClass::dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length * Still in progress. * 2016 - stevstrong - reworked to automatically detect bit size from SPI setting */ -uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) +uint8 SPIClass::dmaSend(const void * transmitBuf, uint16 length, bool minc) { if (length == 0) return 0; uint8 b = 0; @@ -489,7 +489,7 @@ uint8 SPIClass::dmaSend(void * transmitBuf, uint16 length, bool minc) _currentSetting->spiDmaChannel, dma_bit_size, &_currentSetting->spi_d->regs->DR, // peripheral address - transmitBuf, // memory bank 0 address + (volatile void*)transmitBuf, // memory bank 0 address NULL, // memory bank 1 address ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM ) //| DMA_TRNS_CMPLT ) // flags );// Transmit buffer DMA diff --git a/STM32F4/libraries/SPI/src/SPI.h b/STM32F4/libraries/SPI/src/SPI.h index cabc0c260..f46795ce3 100644 --- a/STM32F4/libraries/SPI/src/SPI.h +++ b/STM32F4/libraries/SPI/src/SPI.h @@ -248,7 +248,7 @@ class SPIClass { * @param buffer Bytes/words to transmit. * @param length Number of bytes/words in buffer to transmit. */ - void write(void * buffer, uint32 length); + void write(const void * buffer, uint32 length); /** * @brief Transmit a byte, then return the next unread byte. @@ -272,7 +272,7 @@ class SPIClass { * @param receiveBuf buffer Bytes to save received data. * @param length Number of bytes in buffer to transmit. */ - uint8 dmaTransfer(void * transmitBuf, void * receiveBuf, uint16 length); + uint8 dmaTransfer(const void * transmitBuf, void * receiveBuf, uint16 length); /** * @brief Sets up a DMA Transmit for SPI 8 or 16 bit transfer mode. @@ -283,7 +283,7 @@ class SPIClass { * @param data buffer half words to transmit, * @param length Number of bytes in buffer to transmit. */ - uint8 dmaSend(void * transmitBuf, uint16 length, bool minc = 1); + uint8 dmaSend(const void * transmitBuf, uint16 length, bool minc = 1); #endif /* From f65e6905e93fb9c844c557aac62233872b34c4a5 Mon Sep 17 00:00:00 2001 From: Peter Edwards Date: Thu, 28 Sep 2017 12:08:59 +0200 Subject: [PATCH 207/307] Removed non standard functionality from Print class for BYTE "base" as this is available via e.g. Serial.write and conflicts with the FatFS library and potentially anything else defining BYTE Fixed sketches using this behaviour --- STM32F1/cores/maple/Print.cpp | 12 +----------- STM32F1/cores/maple/Print.h | 1 - .../examples/Communication/ASCIITable/ASCIITable.ino | 2 +- .../examples/Communication/MIDI/Midi.ino | 6 +++--- .../SerialCallResponse/SerialCallResponse.ino | 8 ++++---- .../SerialPassthrough/SerialPassthrough.ino | 2 +- .../examples/General/USB_ASCII/USB_ASCII.ino | 2 +- STM32F3/cores/maple/wirish/Print.cpp | 10 +--------- STM32F3/cores/maple/wirish/Print.h | 1 - STM32F4/cores/maple/Print.cpp | 12 +----------- STM32F4/cores/maple/Print.h | 1 - 11 files changed, 13 insertions(+), 44 deletions(-) diff --git a/STM32F1/cores/maple/Print.cpp b/STM32F1/cores/maple/Print.cpp index 76f386b78..0a71cf018 100644 --- a/STM32F1/cores/maple/Print.cpp +++ b/STM32F1/cores/maple/Print.cpp @@ -99,10 +99,6 @@ size_t Print::print(unsigned long n, int base) { } size_t Print::print(long long n, int base) { - if (base == BYTE) - { - return write((uint8)n); - } if (n < 0) { print('-'); n = -n; @@ -111,13 +107,7 @@ size_t Print::print(long long n, int base) { } size_t Print::print(unsigned long long n, int base) { -size_t c=0; - if (base == BYTE) { - c= write((uint8)n); - } else { - c= printNumber(n, base); - } - return c; + return printNumber(n, base); } size_t Print::print(double n, int digits) { diff --git a/STM32F1/cores/maple/Print.h b/STM32F1/cores/maple/Print.h index bd373853f..f265facc2 100644 --- a/STM32F1/cores/maple/Print.h +++ b/STM32F1/cores/maple/Print.h @@ -28,7 +28,6 @@ #include "Printable.h" enum { - BYTE = 0, BIN = 2, OCT = 8, DEC = 10, diff --git a/STM32F1/libraries/A_STM32_Examples/examples/Communication/ASCIITable/ASCIITable.ino b/STM32F1/libraries/A_STM32_Examples/examples/Communication/ASCIITable/ASCIITable.ino index fc5e5d73e..d64745729 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/Communication/ASCIITable/ASCIITable.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/Communication/ASCIITable/ASCIITable.ino @@ -47,7 +47,7 @@ void loop() { // Prints value unaltered, i.e. the raw binary version of the // byte. The serial monitor interprets all bytes as // ASCII, so 33, the first number, will show up as '!' - Serial.print(thisByte, BYTE); + Serial.write(thisByte); Serial.print(", dec: "); // Prints value as string as an ASCII-encoded decimal (base 10). diff --git a/STM32F1/libraries/A_STM32_Examples/examples/Communication/MIDI/Midi.ino b/STM32F1/libraries/A_STM32_Examples/examples/Communication/MIDI/Midi.ino index 820ffdc6f..4feaea799 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/Communication/MIDI/Midi.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/Communication/MIDI/Midi.ino @@ -44,8 +44,8 @@ void loop() { // Plays a MIDI note. Doesn't check to see that cmd is greater than // 127, or that data values are less than 127: void noteOn(int cmd, int pitch, int velocity) { - Serial1.print(cmd, BYTE); - Serial1.print(pitch, BYTE); - Serial1.print(velocity, BYTE); + Serial1.write(cmd); + Serial1.write(pitch); + Serial1.write(velocity); } diff --git a/STM32F1/libraries/A_STM32_Examples/examples/Communication/SerialCallResponse/SerialCallResponse.ino b/STM32F1/libraries/A_STM32_Examples/examples/Communication/SerialCallResponse/SerialCallResponse.ino index eee35e3cc..81270cf83 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/Communication/SerialCallResponse/SerialCallResponse.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/Communication/SerialCallResponse/SerialCallResponse.ino @@ -50,15 +50,15 @@ void loop() { // read switch, map it to 0 or 255 thirdSensor = map(digitalRead(2), 0, 1, 0, 255); // send sensor values: - Serial.print(firstSensor, BYTE); - Serial.print(secondSensor, BYTE); - Serial.print(thirdSensor, BYTE); + Serial.write(firstSensor); + Serial.write(secondSensor); + Serial.write(thirdSensor); } } void establishContact() { while (Serial.available() <= 0) { - Serial.print('A', BYTE); // send a capital A + Serial.write('A'); // send a capital A delay(300); } } diff --git a/STM32F1/libraries/A_STM32_Examples/examples/Communication/SerialPassthrough/SerialPassthrough.ino b/STM32F1/libraries/A_STM32_Examples/examples/Communication/SerialPassthrough/SerialPassthrough.ino index 71b9e34fd..0d348f898 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/Communication/SerialPassthrough/SerialPassthrough.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/Communication/SerialPassthrough/SerialPassthrough.ino @@ -26,6 +26,6 @@ void loop() { // Read from Serial1, send over USB on Maple (or uses hardware serial 1 and hardware serial 2 on non-maple boards: if (Serial1.available()) { inByte = Serial1.read(); - Serial.print(inByte, BYTE); + Serial.write(inByte); } } diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/USB_ASCII/USB_ASCII.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/USB_ASCII/USB_ASCII.ino index a884978dc..8a6fe5359 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/USB_ASCII/USB_ASCII.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/USB_ASCII/USB_ASCII.ino @@ -67,7 +67,7 @@ void loop() { // Prints value unaltered, i.e. the raw binary version of the // byte. The serial monitor interprets all bytes as // ASCII, so 33, the first number, will show up as '!' - Serial.print(thisByte, BYTE); + Serial.write(thisByte); Serial.print(", dec: "); // Prints value as string as an ASCII-encoded decimal (base 10). diff --git a/STM32F3/cores/maple/wirish/Print.cpp b/STM32F3/cores/maple/wirish/Print.cpp index f6bc0c6be..9a8808dd3 100644 --- a/STM32F3/cores/maple/wirish/Print.cpp +++ b/STM32F3/cores/maple/wirish/Print.cpp @@ -88,10 +88,6 @@ void Print::print(unsigned long n, int base) { } void Print::print(long long n, int base) { - if (base == BYTE) { - write((uint8)n); - return; - } if (n < 0) { print('-'); n = -n; @@ -100,11 +96,7 @@ void Print::print(long long n, int base) { } void Print::print(unsigned long long n, int base) { - if (base == BYTE) { - write((uint8)n); - } else { - printNumber(n, base); - } + printNumber(n, base); } void Print::print(double n, int digits) { diff --git a/STM32F3/cores/maple/wirish/Print.h b/STM32F3/cores/maple/wirish/Print.h index 5fd0b7a5c..52203eae0 100644 --- a/STM32F3/cores/maple/wirish/Print.h +++ b/STM32F3/cores/maple/wirish/Print.h @@ -26,7 +26,6 @@ #include enum { - BYTE = 0, BIN = 2, OCT = 8, DEC = 10, diff --git a/STM32F4/cores/maple/Print.cpp b/STM32F4/cores/maple/Print.cpp index 76f386b78..0a71cf018 100644 --- a/STM32F4/cores/maple/Print.cpp +++ b/STM32F4/cores/maple/Print.cpp @@ -99,10 +99,6 @@ size_t Print::print(unsigned long n, int base) { } size_t Print::print(long long n, int base) { - if (base == BYTE) - { - return write((uint8)n); - } if (n < 0) { print('-'); n = -n; @@ -111,13 +107,7 @@ size_t Print::print(long long n, int base) { } size_t Print::print(unsigned long long n, int base) { -size_t c=0; - if (base == BYTE) { - c= write((uint8)n); - } else { - c= printNumber(n, base); - } - return c; + return printNumber(n, base); } size_t Print::print(double n, int digits) { diff --git a/STM32F4/cores/maple/Print.h b/STM32F4/cores/maple/Print.h index bd373853f..f265facc2 100644 --- a/STM32F4/cores/maple/Print.h +++ b/STM32F4/cores/maple/Print.h @@ -28,7 +28,6 @@ #include "Printable.h" enum { - BYTE = 0, BIN = 2, OCT = 8, DEC = 10, From 31fa24bdd1cc9d86a96e23f8d21e5a80569273d0 Mon Sep 17 00:00:00 2001 From: victorpv Date: Wed, 4 Oct 2017 00:29:13 -0500 Subject: [PATCH 208/307] Update to util_adc.c file to pass pointer correctly. This was wrong and causing warnings during compilation. --- STM32F1/libraries/STM32ADC/src/utility/util_adc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/STM32ADC/src/utility/util_adc.c b/STM32F1/libraries/STM32ADC/src/utility/util_adc.c index e64b58e20..360b235cd 100644 --- a/STM32F1/libraries/STM32ADC/src/utility/util_adc.c +++ b/STM32F1/libraries/STM32ADC/src/utility/util_adc.c @@ -137,8 +137,8 @@ void adc_dma_enable(adc_dev * dev) { bb_peri_set_bit(&dev->regs->CR2, ADC_CR2_DMA_BIT, 1); } -uint8 poll_adc_convert(adc_dev *dev) { - return bb_peri_get_bit(dev->regs->SR, ADC_SR_EOC_BIT); +uint8 poll_adc_convert(adc_dev * dev) { + return bb_peri_get_bit(&dev->regs->SR, ADC_SR_EOC_BIT); } From ac7ccee71f90d0f2de28014022fac716956ce686 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Wed, 4 Oct 2017 11:11:05 +0200 Subject: [PATCH 209/307] Update touchpaint.ino changed to correct header file --- .../Adafruit_ILI9341_STM/examples/touchpaint/touchpaint.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/touchpaint/touchpaint.ino b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/touchpaint/touchpaint.ino index 5d09180dc..0b29cd49e 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/examples/touchpaint/touchpaint.ino +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/examples/touchpaint/touchpaint.ino @@ -17,7 +17,7 @@ #include // Core graphics library #include #include // this is needed even tho we aren't using it -#include +#include #include // This is calibration data for the raw touch data to the screen coordinates From 308b5c410f119a0d901f37fc3b7061d9883624b0 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 6 Oct 2017 18:04:56 +0200 Subject: [PATCH 210/307] Update boards.cpp - remove repeated call to setup serial USB --- STM32F4/cores/maple/boards.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/STM32F4/cores/maple/boards.cpp b/STM32F4/cores/maple/boards.cpp index 0d55e9414..4b0480f67 100644 --- a/STM32F4/cores/maple/boards.cpp +++ b/STM32F4/cores/maple/boards.cpp @@ -69,8 +69,7 @@ void init(void) { setupTimers(); #ifdef SERIAL_USB - setupUSB(); - SerialUSB.begin(); + SerialUSB.begin(); // includes { setupUSB(); } #endif } From 84d9c2bd204e34d83fcf848bf4824bbc6e010d04 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 8 Oct 2017 14:03:20 +1100 Subject: [PATCH 211/307] Fixed issue in OLED_I2C lib caused by change to HardWire as default I2C --- STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h b/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h index 7060b448d..25967c7ca 100644 --- a/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h +++ b/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h @@ -1,4 +1,4 @@ -#include "HardWire.h" +#include "Wire.h" #define WIRE_WRITE HWIRE.write HardWire HWIRE(2,I2C_FAST_MODE); // stupid compiler From 3c2fce63eed6beb4652ec08b68dd0b7e035949d1 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 8 Oct 2017 14:26:59 +1100 Subject: [PATCH 212/307] Update ILI9341 STM lib with version from SteveStrong, and also added ReadPixelsRGB24 to steve's version --- .../Adafruit_ILI9341_STM.cpp | 545 ++++++------------ .../Adafruit_ILI9341_STM.h | 82 +-- 2 files changed, 223 insertions(+), 404 deletions(-) diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp index 766b91034..914e4d153 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.cpp @@ -4,119 +4,26 @@ This library has been modified for the Maple Mini. Includes DMA transfers on DMA1 CH2 and CH3. */ #include -#include -#include -#include -#include "pins_arduino.h" -#include "wiring_private.h" -#include // Using library SPI in folder: D:\Documents\Arduino\hardware\STM32\STM32F1XX\libraries\SPI - - -// Constructor when using software SPI. All output pins are configurable. -Adafruit_ILI9341_STM::Adafruit_ILI9341_STM(int8_t cs, int8_t dc, int8_t mosi, - int8_t sclk, int8_t rst, int8_t miso) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) { - _cs = cs; - _dc = dc; - _mosi = mosi; - _miso = miso; - _sclk = sclk; - _rst = rst; - hwSPI = false; -} // Constructor when using hardware SPI. Faster, but must use SPI pins // specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.) -Adafruit_ILI9341_STM::Adafruit_ILI9341_STM(int8_t cs, int8_t dc, int8_t rst) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) { +Adafruit_ILI9341_STM::Adafruit_ILI9341_STM(int8_t cs, int8_t dc, int8_t rst) : Adafruit_GFX(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) +{ _cs = cs; _dc = dc; _rst = rst; - hwSPI = true; - _mosi = _sclk = 0; -} - - -void Adafruit_ILI9341_STM::spiwrite(uint16_t c) { - - //Serial.print("0x"); Serial.print(c, HEX); Serial.print(", "); - - if (hwSPI) - { -#if defined (__AVR__) - uint8_t backupSPCR = SPCR; - SPCR = mySPCR; - SPDR = c; - while (!(SPSR & _BV(SPIF))); - SPCR = backupSPCR; -#elif defined(TEENSYDUINO) - SPI.transfer(c); -#elif defined (__STM32F1__) - SPI.write(c); -#elif defined (__arm__) - SPI.setClockDivider(11); // 8-ish MHz (full! speed!) - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - SPI.transfer(c); - -#endif - } else { - // Fast SPI bitbang swiped from LPD8806 library - for (uint8_t bit = 0x80; bit; bit >>= 1) { - if (c & bit) { - //digitalWrite(_mosi, HIGH); - *mosiport |= mosipinmask; - } else { - //digitalWrite(_mosi, LOW); - *mosiport &= ~mosipinmask; - } - //digitalWrite(_sclk, HIGH); - *clkport |= clkpinmask; - //digitalWrite(_sclk, LOW); - *clkport &= ~clkpinmask; - } - } } -void Adafruit_ILI9341_STM::writecommand(uint8_t c) { - *dcport &= ~dcpinmask; - *csport &= ~cspinmask; - - spiwrite(c); - - *csport |= cspinmask; -} - - -void Adafruit_ILI9341_STM::writedata(uint8_t c) { - *dcport |= dcpinmask; - *csport &= ~cspinmask; - +void Adafruit_ILI9341_STM::writecommand(uint8_t c) +{ + dc_command(); + cs_clear(); spiwrite(c); - - *csport |= cspinmask; + dc_data(); } -// If the SPI library has transaction support, these functions -// establish settings and protect from interference from other -// libraries. Otherwise, they simply do nothing. -#ifdef SPI_HAS_TRANSACTION -static inline void spi_begin(void) __attribute__((always_inline)); -static inline void spi_begin(void) { -#ifdef __STM32F1__ - SPI.beginTransaction(SPISettings(36000000, MSBFIRST, SPI_MODE0)); -#else - SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); -#endif -} -static inline void spi_end(void) __attribute__((always_inline)); -static inline void spi_end(void) { - SPI.endTransaction(); -} -#else -#define spi_begin() -#define spi_end() -#endif // Rather than a bazillion writecommand() and writedata() calls, screen // initialization commands and arguments are organized in these tables @@ -128,8 +35,8 @@ static inline void spi_end(void) { // Companion code to the above tables. Reads and issues // a series of LCD commands stored in PROGMEM byte array. -void Adafruit_ILI9341_STM::commandList(uint8_t *addr) { - +void Adafruit_ILI9341_STM::commandList(uint8_t *addr) +{ uint8_t numCommands, numArgs; uint16_t ms; @@ -152,54 +59,24 @@ void Adafruit_ILI9341_STM::commandList(uint8_t *addr) { } -void Adafruit_ILI9341_STM::begin(void) { - if (_rst > 0) { - pinMode(_rst, OUTPUT); - digitalWrite(_rst, LOW); - } - +void Adafruit_ILI9341_STM::begin(SPIClass & spi, uint32_t freq) +{ + mSPI = spi; + _freq = freq; + _safe_freq = (freq>SAFE_FREQ) ? SAFE_FREQ : _freq; pinMode(_dc, OUTPUT); pinMode(_cs, OUTPUT); - csport = portOutputRegister(digitalPinToPort(_cs)); + csport = portSetRegister(_cs); cspinmask = digitalPinToBitMask(_cs); - dcport = portOutputRegister(digitalPinToPort(_dc)); + cs_set(); // deactivate chip + dcport = portSetRegister(_dc); dcpinmask = digitalPinToBitMask(_dc); - if (hwSPI) { // Using hardware SPI -#if defined (__AVR__) - SPI.begin(); - SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!) - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - mySPCR = SPCR; -#elif defined(TEENSYDUINO) - SPI.begin(); - SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!) - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); -#elif defined (__STM32F1__) - SPI.beginTransaction(SPISettings(36000000)); - -#elif defined (__arm__) - SPI.begin(); - SPI.setClockDivider(11); // 8-ish MHz (full! speed!) - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); -#endif - } else { - pinMode(_sclk, OUTPUT); - pinMode(_mosi, OUTPUT); - pinMode(_miso, INPUT); - clkport = portOutputRegister(digitalPinToPort(_sclk)); - clkpinmask = digitalPinToBitMask(_sclk); - mosiport = portOutputRegister(digitalPinToPort(_mosi)); - mosipinmask = digitalPinToBitMask(_mosi); - *clkport &= ~clkpinmask; - *mosiport &= ~mosipinmask; - } + mSPI.beginTransaction(SPISettings(_safe_freq, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT)); // toggle RST low to reset if (_rst > 0) { + pinMode(_rst, OUTPUT); digitalWrite(_rst, HIGH); delay(5); digitalWrite(_rst, LOW); @@ -222,7 +99,6 @@ void Adafruit_ILI9341_STM::begin(void) { */ //if(cmdList) commandList(cmdList); - if (hwSPI) spi_begin(); writecommand(0xEF); writedata(0x03); writedata(0x80); @@ -265,7 +141,7 @@ void Adafruit_ILI9341_STM::begin(void) { writedata(0x10); //SAP[2:0];BT[3:0] writecommand(ILI9341_VMCTR1); //VCM control - writedata(0x3e); //�Աȶȵ��� + writedata(0x3e); writedata(0x28); writecommand(ILI9341_VMCTR2); //VCM control2 @@ -327,182 +203,129 @@ void Adafruit_ILI9341_STM::begin(void) { writedata(0x0F); writecommand(ILI9341_SLPOUT); //Exit Sleep - if (hwSPI) spi_end(); delay(120); - if (hwSPI) spi_begin(); writecommand(ILI9341_DISPON); //Display on - if (hwSPI) spi_end(); - if (hwSPI) SPI.setDataSize(SPI_CR1_DFF); + delay(120); + cs_set(); -} + _width = ILI9341_TFTWIDTH; + _height = ILI9341_TFTHEIGHT; + mSPI.beginTransaction(SPISettings(_freq, MSBFIRST, SPI_MODE0, DATA_SIZE_16BIT)); -void Adafruit_ILI9341_STM::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, - uint16_t y1) { -#if defined (__STM32F1__) - writecommand(ILI9341_CASET); // Column addr set - *dcport |= dcpinmask; - *csport &= ~cspinmask; - SPI.write(x0); - SPI.write(x1); - - writecommand(ILI9341_PASET); // Row addr set - *dcport |= dcpinmask; - *csport &= ~cspinmask; - SPI.write(y0); - SPI.write(y1); +} - writecommand(ILI9341_RAMWR); // write to RAM -#else +void Adafruit_ILI9341_STM::setAddrWindow(uint16_t x0, uint16_t y0, + uint16_t x1, uint16_t y1) +{ writecommand(ILI9341_CASET); // Column addr set - writedata(x0 >> 8); - writedata(x0 & 0xFF); // XSTART - writedata(x1 >> 8); - writedata(x1 & 0xFF); // XEND - + spiwrite(x0); + spiwrite(x1); + writecommand(ILI9341_PASET); // Row addr set - writedata(y0 >> 8); - writedata(y0); // YSTART - writedata(y1 >> 8); - writedata(y1); // YEND + spiwrite(y0); + spiwrite(y1); writecommand(ILI9341_RAMWR); // write to RAM -#endif } -void Adafruit_ILI9341_STM::pushColor(uint16_t color) { - if (hwSPI) spi_begin(); - //digitalWrite(_dc, HIGH); - *dcport |= dcpinmask; - //digitalWrite(_cs, LOW); - *csport &= ~cspinmask; - - spiwrite(color); - - *csport |= cspinmask; - //digitalWrite(_cs, HIGH); - if (hwSPI) spi_end(); -} - void Adafruit_ILI9341_STM::pushColors(void * colorBuffer, uint16_t nr_pixels, uint8_t async) { - *dcport |= dcpinmask; - *csport &= ~cspinmask; + cs_clear(); - if (async==0) - { - SPI.dmaSend(colorBuffer, nr_pixels, 1); - *csport |= cspinmask; - } - else - { - SPI.dmaSendAsync(colorBuffer, nr_pixels, 1); + if (async==0) { + mSPI.dmaSend(colorBuffer, nr_pixels, 1); + cs_set(); + } else { + mSPI.dmaSendAsync(colorBuffer, nr_pixels, 1); } - } -void Adafruit_ILI9341_STM::drawPixel(int16_t x, int16_t y, uint16_t color) { +void Adafruit_ILI9341_STM::pushColor(uint16_t color) +{ + cs_clear(); + spiwrite(color); + cs_set(); +} +void Adafruit_ILI9341_STM::drawPixel(int16_t x, int16_t y, uint16_t color) +{ if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return; - if (hwSPI) spi_begin(); setAddrWindow(x, y, x + 1, y + 1); - *dcport |= dcpinmask; - *csport &= ~cspinmask; - spiwrite(color); - *csport |= cspinmask; - if (hwSPI) spi_end(); + cs_set(); } void Adafruit_ILI9341_STM::drawFastVLine(int16_t x, int16_t y, int16_t h, - uint16_t color) { - + uint16_t color) +{ // Rudimentary clipping if ((x >= _width) || (y >= _height || h < 1)) return; - if ((y + h - 1) >= _height) h = _height - y; if (h < 2 ) { - drawPixel(x, y, color); - return; + drawPixel(x, y, color); + return; } - // if (hwSPI) spi_begin(); setAddrWindow(x, y, x, y + h - 1); - *dcport |= dcpinmask; - *csport &= ~cspinmask; - -#if defined (__STM32F1__) - lineBuffer[0] = color; - SPI.dmaSend(lineBuffer, h, 0); - #else - uint8_t hi = color >> 8, lo = color; - while (h--) { - spiwrite(hi); - spiwrite(lo); + if (h>DMA_ON_LIMIT) { + lineBuffer[0] = color; + mSPI.dmaSend(lineBuffer, h, 0); + } else { + mSPI.write(color, h); } -#endif - *csport |= cspinmask; + cs_set(); } void Adafruit_ILI9341_STM::drawFastHLine(int16_t x, int16_t y, int16_t w, - uint16_t color) { - - + uint16_t color) +{ // Rudimentary clipping if ((x >= _width) || (y >= _height || w < 1)) return; if ((x + w - 1) >= _width) w = _width - x; if (w < 2 ) { - drawPixel(x, y, color); - return; + drawPixel(x, y, color); + return; } -// if (hwSPI) spi_begin(); setAddrWindow(x, y, x + w - 1, y); - *dcport |= dcpinmask; - *csport &= ~cspinmask; -#if defined (__STM32F1__) - lineBuffer[0] = color; - SPI.dmaSend(lineBuffer, w, 0); -#else - uint8_t hi = color >> 8, lo = color; - while (w--) { - spiwrite(hi); - spiwrite(lo); - } -#endif - *csport |= cspinmask; - //digitalWrite(_cs, HIGH); -// if (hwSPI) spi_end(); + if (w>DMA_ON_LIMIT) { + lineBuffer[0] = color; + mSPI.dmaSend(lineBuffer, w, 0); + } else { + mSPI.write(color, w); + } + cs_set(); } -void Adafruit_ILI9341_STM::fillScreen(uint16_t color) { -#if defined (__STM32F1__) - setAddrWindow(0, 0, _width - 1, _height - 1); - *dcport |= dcpinmask; - *csport &= ~cspinmask; +void Adafruit_ILI9341_STM::fillScreen(uint16_t color) +{ lineBuffer[0] = color; - SPI.dmaSend(lineBuffer, (65535), 0); - SPI.dmaSend(lineBuffer, ((_width * _height) - 65535), 0); - -#else - fillRect(0, 0, _width, _height, color); -#endif + setAddrWindow(0, 0, _width - 1, _height - 1); + uint32_t nr_bytes = _width * _height; + while ( nr_bytes>65535 ) { + nr_bytes -= 65535; + mSPI.dmaSend(lineBuffer, (65535), 0); + } + mSPI.dmaSend(lineBuffer, nr_bytes, 0); + cs_set(); } // fill a rectangle void Adafruit_ILI9341_STM::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, - uint16_t color) { - + uint16_t color) +{ + lineBuffer[0] = color; // rudimentary clipping (drawChar w/big text requires this) if ((x >= _width) || (y >= _height || h < 1 || w < 1)) return; if ((x + w - 1) >= _width) w = _width - x; @@ -511,41 +334,26 @@ void Adafruit_ILI9341_STM::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, drawPixel(x, y, color); return; } - - if (hwSPI) spi_begin(); - setAddrWindow(x, y, x + w - 1, y + h - 1); - *dcport |= dcpinmask; - *csport &= ~cspinmask; -#if defined (__STM32F1__) - lineBuffer[0] = color; - if (w*h <= 65535) { - SPI.dmaSend(lineBuffer, (w*h), 0); - } - else { - SPI.dmaSend(lineBuffer, (65535), 0); - SPI.dmaSend(lineBuffer, ((w*h) - 65535), 0); - } -#else - uint8_t hi = color >> 8, lo = color; - for(y=h; y>0; y--) - { - for(x=w; x>0; x--) - { - SPI.write(hi); - SPI.write(lo); + setAddrWindow(x, y, x + w - 1, y + h - 1); + uint32_t nr_bytes = w * h; + if ( nr_bytes>DMA_ON_LIMIT ) { + while ( nr_bytes>65535 ) { + nr_bytes -= 65535; + mSPI.dmaSend(lineBuffer, (65535), 0); } + mSPI.dmaSend(lineBuffer, nr_bytes, 0); + } else { + mSPI.write(color, nr_bytes); } -#endif - *csport |= cspinmask; - if (hwSPI) spi_end(); + cs_set(); } /* * Draw lines faster by calculating straight sections and drawing them with fastVline and fastHline. */ -#if defined (__STM32F1__) -void Adafruit_ILI9341_STM::drawLine(int16_t x0, int16_t y0,int16_t x1, int16_t y1, uint16_t color) +void Adafruit_ILI9341_STM::drawLine(int16_t x0, int16_t y0, + int16_t x1, int16_t y1, uint16_t color) { if ((y0 < 0 && y1 <0) || (y0 > _height && y1 > _height)) return; if ((x0 < 0 && x1 <0) || (x0 > _width && x1 > _width)) return; @@ -601,8 +409,6 @@ void Adafruit_ILI9341_STM::drawLine(int16_t x0, int16_t y0,int16_t x1, int16_t y } int16_t xbegin = x0; - lineBuffer[0] = color; - *csport &= ~cspinmask; if (steep) { for (; x0 <= x1; x0++) { err -= dy; @@ -650,11 +456,7 @@ void Adafruit_ILI9341_STM::drawLine(int16_t x0, int16_t y0,int16_t x1, int16_t y drawFastHLine(xbegin, y0, x0 - xbegin, color); } } - *csport |= cspinmask; } -#endif - - // Pass 8-bit (each) R,G,B, get back 16-bit packed color uint16_t Adafruit_ILI9341_STM::color565(uint8_t r, uint8_t g, uint8_t b) { @@ -670,118 +472,133 @@ uint16_t Adafruit_ILI9341_STM::color565(uint8_t r, uint8_t g, uint8_t b) { #define MADCTL_BGR 0x08 #define MADCTL_MH 0x04 -void Adafruit_ILI9341_STM::setRotation(uint8_t m) { - - if (hwSPI) spi_begin(); - if (hwSPI) SPI.setDataSize(0); - writecommand(ILI9341_MADCTL); +void Adafruit_ILI9341_STM::setRotation(uint8_t m) +{ rotation = m % 4; // can't be higher than 3 switch (rotation) { case 0: - writedata(MADCTL_MX | MADCTL_BGR); + m = (MADCTL_MX | MADCTL_BGR); _width = ILI9341_TFTWIDTH; _height = ILI9341_TFTHEIGHT; break; case 1: - writedata(MADCTL_MV | MADCTL_BGR); + m = (MADCTL_MV | MADCTL_BGR); _width = ILI9341_TFTHEIGHT; _height = ILI9341_TFTWIDTH; break; case 2: - writedata(MADCTL_MY | MADCTL_BGR); + m = (MADCTL_MY | MADCTL_BGR); _width = ILI9341_TFTWIDTH; _height = ILI9341_TFTHEIGHT; break; case 3: - writedata(MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); + m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); _width = ILI9341_TFTHEIGHT; _height = ILI9341_TFTWIDTH; break; } - if (hwSPI) SPI.setDataSize(SPI_CR1_DFF); - if (hwSPI) spi_end(); + mSPI.setDataSize(DATA_SIZE_8BIT); + writecommand(ILI9341_MADCTL); + writedata(m); + cs_set(); + mSPI.setDataSize(DATA_SIZE_16BIT); } -void Adafruit_ILI9341_STM::invertDisplay(boolean i) { - if (hwSPI) spi_begin(); +void Adafruit_ILI9341_STM::invertDisplay(boolean i) +{ writecommand(i ? ILI9341_INVON : ILI9341_INVOFF); - if (hwSPI) spi_end(); + cs_set(); } -////////// stuff not actively being used, but kept for posterity - - -uint8_t Adafruit_ILI9341_STM::spiread(void) { - uint8_t r = 0; - - if (hwSPI) { -#if defined (__AVR__) - uint8_t backupSPCR = SPCR; - SPCR = mySPCR; - SPDR = 0x00; - while (!(SPSR & _BV(SPIF))); - r = SPDR; - SPCR = backupSPCR; -#elif defined(TEENSYDUINO) - r = SPI.transfer(0x00); -#elif defined (__STM32F1__) - r = SPI.transfer(0x00); -#elif defined (__arm__) - SPI.setClockDivider(11); // 8-ish MHz (full! speed!) - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - r = SPI.transfer(0x00); -#endif - } else { +uint16_t Adafruit_ILI9341_STM::readPixel(int16_t x, int16_t y) +{ + mSPI.beginTransaction(SPISettings(_safe_freq, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT)); - for (uint8_t i = 0; i < 8; i++) { - digitalWrite(_sclk, LOW); - digitalWrite(_sclk, HIGH); - r <<= 1; - if (digitalRead(_miso)) - r |= 0x1; - } - } - //Serial.print("read: 0x"); Serial.print(r, HEX); + writecommand(ILI9341_CASET); // Column addr set + spiwrite16(x); + spiwrite16(x); + writecommand(ILI9341_PASET); // Row addr set + spiwrite16(y); + spiwrite16(y); + writecommand(ILI9341_RAMRD); // read GRAM + (void)spiread(); //dummy read + uint8_t r = spiread(); + uint8_t g = spiread(); + uint8_t b = spiread(); + cs_set(); - return r; + mSPI.beginTransaction(SPISettings(_freq, MSBFIRST, SPI_MODE0, DATA_SIZE_16BIT)); + + return color565(r, g, b); } -uint8_t Adafruit_ILI9341_STM::readdata(void) { - digitalWrite(_dc, HIGH); - digitalWrite(_cs, LOW); - uint8_t r = spiread(); - digitalWrite(_cs, HIGH); +uint16_t Adafruit_ILI9341_STM::readPixels(int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t *buf) +{ + mSPI.beginTransaction(SPISettings(_safe_freq, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT)); - return r; + writecommand(ILI9341_CASET); // Column addr set + spiwrite16(x1); + spiwrite16(x2); + writecommand(ILI9341_PASET); // Row addr set + spiwrite16(y1); + spiwrite16(y2); + writecommand(ILI9341_RAMRD); // read GRAM + (void)spiread(); //dummy read + uint8_t r, g, b; + uint16_t len = (x2-x1+1)*(y2-y1+1); + uint16_t ret = len; + while (len--) { + r = spiread(); + g = spiread(); + b = spiread(); + *buf++ = color565(r, g, b); + } + cs_set(); + + mSPI.beginTransaction(SPISettings(_freq, MSBFIRST, SPI_MODE0, DATA_SIZE_16BIT)); + return ret; } -uint8_t Adafruit_ILI9341_STM::readcommand8(uint8_t c, uint8_t index) { - if (hwSPI) spi_begin(); - digitalWrite(_dc, LOW); // command - digitalWrite(_cs, LOW); - spiwrite(0xD9); // woo sekret command? - digitalWrite(_dc, HIGH); // data - spiwrite(0x10 + index); - digitalWrite(_cs, HIGH); +uint16_t Adafruit_ILI9341_STM::readPixelsRGB24(int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t *buf) +{ + mSPI.beginTransaction(SPISettings(_safe_freq, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT)); - digitalWrite(_dc, LOW); - //if(hwSPI) digitalWrite(_sclk, LOW); - digitalWrite(_cs, LOW); - spiwrite(c); + writecommand(ILI9341_CASET); // Column addr set + spiwrite16(x1); + spiwrite16(x2); + writecommand(ILI9341_PASET); // Row addr set + spiwrite16(y1); + spiwrite16(y2); + writecommand(ILI9341_RAMRD); // read GRAM + (void)spiread(); //dummy read + uint8_t r, g, b; + uint16_t len = (x2-x1+1)*(y2-y1+1); + uint16_t ret = len; + + mSPI.dmaTransfer(buf, buf, len*3); + cs_set(); + + mSPI.beginTransaction(SPISettings(_freq, MSBFIRST, SPI_MODE0, DATA_SIZE_16BIT)); + return ret; +} - digitalWrite(_dc, HIGH); +uint8_t Adafruit_ILI9341_STM::readcommand8(uint8_t c, uint8_t index) +{ + // the SPI clock must be set lower + mSPI.beginTransaction(SPISettings(_safe_freq, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT)); + + writecommand(c); uint8_t r = spiread(); - digitalWrite(_cs, HIGH); - if (hwSPI) spi_end(); + cs_set(); + + mSPI.beginTransaction(SPISettings(_freq, MSBFIRST, SPI_MODE0, DATA_SIZE_16BIT)); return r; } - /* uint16_t Adafruit_ILI9341_STM::readcommand16(uint8_t c) { diff --git a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h index 7ee395c6c..b77b3562f 100644 --- a/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h +++ b/STM32F1/libraries/Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h @@ -7,9 +7,8 @@ This library has been modified for the Maple Mini #define _ADAFRUIT_ILI9341H_ #include "Arduino.h" -#include "Print.h" #include -#include +#include #ifndef swap #define swap(a, b) { int16_t t = a; a = b; b = t; } @@ -100,18 +99,15 @@ class Adafruit_ILI9341_STM : public Adafruit_GFX { public: - Adafruit_ILI9341_STM(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK, - int8_t _RST, int8_t _MISO); Adafruit_ILI9341_STM(int8_t _CS, int8_t _DC, int8_t _RST = -1); - - void begin(void), - setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1), + + void begin(SPIClass & spi, uint32_t freq=48000000); + void begin(void) { begin(SPI); } + void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1), pushColor(uint16_t color), - pushColors(void * colorBuffer, uint16_t nr_pixels, uint8_t async), + pushColors(void * colorBuffer, uint16_t nr_pixels, uint8_t async=0), fillScreen(uint16_t color), - #if defined (__STM32F1__) drawLine(int16_t x0, int16_t y0,int16_t x1, int16_t y1, uint16_t color), - #endif drawPixel(int16_t x, int16_t y, uint16_t color), drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color), drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color), @@ -122,43 +118,49 @@ class Adafruit_ILI9341_STM : public Adafruit_GFX { uint16_t color565(uint8_t r, uint8_t g, uint8_t b); /* These are not for current use, 8-bit protocol only! */ - uint8_t readdata(void), - readcommand8(uint8_t reg, uint8_t index = 0); + uint16_t readPixel(int16_t x, int16_t y); + uint16_t readPixels(int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t *buf); + uint16_t readPixelsRGB24(int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t *buf); + + uint8_t readcommand8(uint8_t reg, uint8_t index = 0); /* uint16_t readcommand16(uint8_t); uint32_t readcommand32(uint8_t); - void dummyclock(void); - */ + */ + +#define DMA_ON_LIMIT 250 // do DMA only for more data than this +#define SAFE_FREQ 24000000ul // 24MHz for reading + +#define writePixel drawPixel - void spiwrite(uint16_t), - writecommand(uint8_t c), - writedata(uint8_t d), - commandList(uint8_t *addr); - uint8_t spiread(void); +#define dc_command() ( *dcport =(uint32_t)dcpinmask<<16 ) // 0 +#define dc_data() ( *dcport =(uint32_t)dcpinmask ) // 1 +#define cs_clear() ( *csport =(uint32_t)cspinmask<<16 ) +#define cs_set() ( *csport =(uint32_t)cspinmask ) +#define clk_clear() ( *clkport =(uint32_t)clkpinmask<<16 ) +#define clk_set() ( *clkport =(uint32_t)clkpinmask ) +#define mosi_clear() ( *mosiport=(uint32_t)misopinmask<<16 ) +#define mosi_set() ( *mosiport=(uint32_t)misopinmask ) +#define miso_in() ( (*misoport)&misopinmask ) + inline uint8_t spiread(void) { return mSPI.transfer(0x00); } + inline uint8_t readdata(void) { return mSPI.transfer(0x00); } + inline void writedata(uint8_t c) { mSPI.write(c); } + inline void spiwrite(uint16_t c) { mSPI.write(c); } + inline void spiwrite16(uint16_t c) { mSPI.write16(c); } // 8 bit mode + + void writecommand(uint8_t c), + commandList(uint8_t *addr); private: - uint8_t tabcolor; - - - - - boolean hwSPI; -#if defined (__AVR__) || defined(TEENSYDUINO) - uint8_t mySPCR; - volatile uint8_t *mosiport, *clkport, *dcport, *rsport, *csport; - int8_t _cs, _dc, _rst, _mosi, _miso, _sclk; - uint8_t mosipinmask, clkpinmask, cspinmask, dcpinmask; -#elif defined (__STM32F1__) - volatile uint32 *mosiport, *clkport, *dcport, *rsport, *csport; - uint32_t _cs, _dc, _rst, _mosi, _miso, _sclk; - uint32_t mosipinmask, clkpinmask, cspinmask, dcpinmask; - uint16_t lineBuffer[ILI9341_TFTHEIGHT]; // DMA buffer. 16bit color data per pixel -#elif defined (__arm__) - volatile RwReg *mosiport, *clkport, *dcport, *rsport, *csport; - uint32_t _cs, _dc, _rst, _mosi, _miso, _sclk; - uint32_t mosipinmask, clkpinmask, cspinmask, dcpinmask; -#endif + uint32_t _freq, _safe_freq; + SPIClass & mSPI = SPI; + + volatile uint32_t *csport, *dcport; + int8_t _cs, _dc, _rst; + uint16_t cspinmask, dcpinmask; + uint16_t lineBuffer[ILI9341_TFTHEIGHT]; // DMA buffer. 16bit color data per pixel }; + #endif From a89d0b935b6f177ef1eb52e17b3e8c670c5168cc Mon Sep 17 00:00:00 2001 From: csnol Date: Wed, 18 Oct 2017 21:42:31 +0800 Subject: [PATCH 213/307] Half-hour TimeZone supported --- STM32F1/libraries/RTClock/src/RTClock.cpp | 16 ++++++++++++++++ STM32F1/libraries/RTClock/src/RTClock.h | 9 ++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) mode change 100644 => 100755 STM32F1/libraries/RTClock/src/RTClock.cpp mode change 100644 => 100755 STM32F1/libraries/RTClock/src/RTClock.h diff --git a/STM32F1/libraries/RTClock/src/RTClock.cpp b/STM32F1/libraries/RTClock/src/RTClock.cpp old mode 100644 new mode 100755 index e95bead86..0bfe7dfbd --- a/STM32F1/libraries/RTClock/src/RTClock.cpp +++ b/STM32F1/libraries/RTClock/src/RTClock.cpp @@ -79,6 +79,22 @@ //to implement } */ + + // Usage: 1. localtime = TimeZone(UnixTime, 9, 1) means SAT +09:30 TimeZone; + // 2. localtime = TimeZone(UnixTime, -3, 1) means NST,NFT -03:30 TimeZone; + // 3. TimeZone(UnixTime, 8, 0) same function as TimeZone(UnixTime, 8) -> CCT +08:00 + + time_t RTClock::TimeZone(time_t t, int TZ, bool HFZ) { // HFZ : Half-hour TimeZone flag + if(HFZ) { + if(TZ > 0 ) + return ( t + (TZ * SECS_PER_HOUR) + 1800); + else + return ( t + (TZ * SECS_PER_HOUR) - 1800); + } + else + return ( t + (TZ * SECS_PER_HOUR)); + } +// void RTClock::setTime (tm_t & tmm) { time_t mktm = makeTime(tmm); // time will be make to mktm diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h old mode 100644 new mode 100755 index 4d8399e80..d6b3090d2 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -15,6 +15,7 @@ #define SECS_PER_YEAR (SECS_PER_WEEK * 52UL) #define SECS_YR_2000 (946684800UL) // the time at the start of y2k #define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) ) +#define HALFTZ 0 #if !defined(__time_t_defined) // avoid conflict with newlib or other posix libc #warning "Using private time_t definintion" @@ -71,8 +72,14 @@ class RTClock { uint8_t minute(time_t t) { breakTime(t, tmm); return tmm.minute; } uint8_t second(time_t t) { breakTime(t, tmm); return tmm.second; } uint8_t isPM(time_t t) { return (hour(t)>=12); } + + // Usage: localtime = TimeZone(UnixTime, 8); + time_t TimeZone(time_t t, int TZ) { return ( t + (TZ * SECS_PER_HOUR)); } - time_t TimeZone(time_t t, int TZ) { return ( t + (TZ * SECS_PER_HOUR)); } // usage: localtime = TimeZone(UnixTime, 8); // Beijing timezone = 8 + // Usage: 1. localtime = TimeZone(UnixTime, 9, 1) means SAT +09:30 TimeZone; + // 2. localtime = TimeZone(UnixTime, -3, 1) means NST,NFT -03:30 TimeZone; + // 3. TimeZone(UnixTime, 8, 0) same function as TimeZone(UnixTime, 8) -> CCT +08:00 + time_t TimeZone(time_t t, int TZ, bool HFZ); // HFZ : Half-hour TimeZone flag void createAlarm(voidFuncPtr function, time_t alarm_time_t); void createAlarm(voidFuncPtr function, struct tm_t & alarm_tm); From 9f5cdd2d24bf4c0d24f99963221cee5a8fe38f42 Mon Sep 17 00:00:00 2001 From: csnol Date: Wed, 18 Oct 2017 21:45:19 +0800 Subject: [PATCH 214/307] updated --- STM32F1/libraries/RTClock/src/RTClock.h | 1 - 1 file changed, 1 deletion(-) diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h index d6b3090d2..c0954ea0f 100755 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -15,7 +15,6 @@ #define SECS_PER_YEAR (SECS_PER_WEEK * 52UL) #define SECS_YR_2000 (946684800UL) // the time at the start of y2k #define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) ) -#define HALFTZ 0 #if !defined(__time_t_defined) // avoid conflict with newlib or other posix libc #warning "Using private time_t definintion" From 80ae49dd5037315e652eec43d04c25dc57c91364 Mon Sep 17 00:00:00 2001 From: Michel Stempin Date: Wed, 18 Oct 2017 22:04:54 +0200 Subject: [PATCH 215/307] Added missing SDIO pins for F103V and F103Z --- STM32F1/variants/generic_stm32f103v/board/board.h | 10 ++++++++++ STM32F1/variants/generic_stm32f103z/board/board.h | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/STM32F1/variants/generic_stm32f103v/board/board.h b/STM32F1/variants/generic_stm32f103v/board/board.h index 92f2bf8a1..3bb680a78 100644 --- a/STM32F1/variants/generic_stm32f103v/board/board.h +++ b/STM32F1/variants/generic_stm32f103v/board/board.h @@ -109,6 +109,16 @@ #define BOARD_USB_DISC_DEV GPIOC #define BOARD_USB_DISC_BIT 12 +/* + * SDIO Pins + */ +#define BOARD_SDIO_D0 PC8 +#define BOARD_SDIO_D1 PC9 +#define BOARD_SDIO_D2 PC10 +#define BOARD_SDIO_D3 PC11 +#define BOARD_SDIO_CLK PC12 +#define BOARD_SDIO_CMD PD2 + /* Pin aliases: these give the GPIO port/bit for each pin as an * enum. These are optional, but recommended. They make it easier to * write code using low-level GPIO functionality. */ diff --git a/STM32F1/variants/generic_stm32f103z/board/board.h b/STM32F1/variants/generic_stm32f103z/board/board.h index c9bf4b5e8..fe4856796 100644 --- a/STM32F1/variants/generic_stm32f103z/board/board.h +++ b/STM32F1/variants/generic_stm32f103z/board/board.h @@ -102,6 +102,16 @@ #define BOARD_USB_DISC_DEV GPIOC #define BOARD_USB_DISC_BIT 12 +/* + * SDIO Pins + */ +#define BOARD_SDIO_D0 PC8 +#define BOARD_SDIO_D1 PC9 +#define BOARD_SDIO_D2 PC10 +#define BOARD_SDIO_D3 PC11 +#define BOARD_SDIO_CLK PC12 +#define BOARD_SDIO_CMD PD2 + /* Pin aliases: these give the GPIO port/bit for each pin as an * enum. These are optional, but recommended. They make it easier to * write code using low-level GPIO functionality. */ From c741afa74a87c17dafe49f1de3bb3d7f2f17b08d Mon Sep 17 00:00:00 2001 From: csnol Date: Thu, 19 Oct 2017 17:23:48 +0800 Subject: [PATCH 216/307] Update TimeZone function Add TimeZone(UnixTime, HourOffset, MinuteOffset) --- STM32F1/libraries/RTClock/src/RTClock.cpp | 15 --------------- STM32F1/libraries/RTClock/src/RTClock.h | 6 ++---- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/STM32F1/libraries/RTClock/src/RTClock.cpp b/STM32F1/libraries/RTClock/src/RTClock.cpp index 0bfe7dfbd..5f0467f62 100755 --- a/STM32F1/libraries/RTClock/src/RTClock.cpp +++ b/STM32F1/libraries/RTClock/src/RTClock.cpp @@ -80,21 +80,6 @@ } */ - // Usage: 1. localtime = TimeZone(UnixTime, 9, 1) means SAT +09:30 TimeZone; - // 2. localtime = TimeZone(UnixTime, -3, 1) means NST,NFT -03:30 TimeZone; - // 3. TimeZone(UnixTime, 8, 0) same function as TimeZone(UnixTime, 8) -> CCT +08:00 - - time_t RTClock::TimeZone(time_t t, int TZ, bool HFZ) { // HFZ : Half-hour TimeZone flag - if(HFZ) { - if(TZ > 0 ) - return ( t + (TZ * SECS_PER_HOUR) + 1800); - else - return ( t + (TZ * SECS_PER_HOUR) - 1800); - } - else - return ( t + (TZ * SECS_PER_HOUR)); - } -// void RTClock::setTime (tm_t & tmm) { time_t mktm = makeTime(tmm); // time will be make to mktm diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h index c0954ea0f..60b6fbcba 100755 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -75,10 +75,8 @@ class RTClock { // Usage: localtime = TimeZone(UnixTime, 8); time_t TimeZone(time_t t, int TZ) { return ( t + (TZ * SECS_PER_HOUR)); } - // Usage: 1. localtime = TimeZone(UnixTime, 9, 1) means SAT +09:30 TimeZone; - // 2. localtime = TimeZone(UnixTime, -3, 1) means NST,NFT -03:30 TimeZone; - // 3. TimeZone(UnixTime, 8, 0) same function as TimeZone(UnixTime, 8) -> CCT +08:00 - time_t TimeZone(time_t t, int TZ, bool HFZ); // HFZ : Half-hour TimeZone flag + // Usage: 1. localtime = TimeZone(UnixTime, 9, 45) -> UTC +09:45 TimeZone; + time_t TimeZone(time_t t, int HTZ, int MTZ) { return ( t + (HTZ * SECS_PER_HOUR) + (MTZ * 60); } // HTZ = Hour offset, MTZ = Minute offset void createAlarm(voidFuncPtr function, time_t alarm_time_t); void createAlarm(voidFuncPtr function, struct tm_t & alarm_tm); From 4870e27855ade718158ee61d572c9d35072ef4db Mon Sep 17 00:00:00 2001 From: csnol Date: Thu, 19 Oct 2017 17:26:42 +0800 Subject: [PATCH 217/307] Update --- STM32F1/libraries/RTClock/src/RTClock.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/STM32F1/libraries/RTClock/src/RTClock.cpp b/STM32F1/libraries/RTClock/src/RTClock.cpp index 5f0467f62..e95bead86 100755 --- a/STM32F1/libraries/RTClock/src/RTClock.cpp +++ b/STM32F1/libraries/RTClock/src/RTClock.cpp @@ -79,7 +79,6 @@ //to implement } */ - void RTClock::setTime (tm_t & tmm) { time_t mktm = makeTime(tmm); // time will be make to mktm From 588f9db6976f3f1f5b332955484e4fc22123b71d Mon Sep 17 00:00:00 2001 From: csnol Date: Thu, 19 Oct 2017 18:31:23 +0800 Subject: [PATCH 218/307] update --- STM32F1/libraries/RTClock/src/RTClock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h index 60b6fbcba..71015a586 100755 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -76,7 +76,7 @@ class RTClock { time_t TimeZone(time_t t, int TZ) { return ( t + (TZ * SECS_PER_HOUR)); } // Usage: 1. localtime = TimeZone(UnixTime, 9, 45) -> UTC +09:45 TimeZone; - time_t TimeZone(time_t t, int HTZ, int MTZ) { return ( t + (HTZ * SECS_PER_HOUR) + (MTZ * 60); } // HTZ = Hour offset, MTZ = Minute offset + time_t TimeZone(time_t t, int HTZ, int MTZ) { return ( t + (HTZ * SECS_PER_HOUR) + (MTZ * 60)); } // HTZ = Hour offset, MTZ = Minute offset void createAlarm(voidFuncPtr function, time_t alarm_time_t); void createAlarm(voidFuncPtr function, struct tm_t & alarm_tm); From 4a3e23949b3efde74bf786cf91f78cb6315fed04 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 31 Oct 2017 20:05:31 +1100 Subject: [PATCH 219/307] Added DMA enable and disable functions to hardware timers, thanks to @stevstrong --- STM32F1/cores/maple/HardwareTimer.cpp | 9 +++++++++ STM32F1/cores/maple/HardwareTimer.h | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/STM32F1/cores/maple/HardwareTimer.cpp b/STM32F1/cores/maple/HardwareTimer.cpp index ecd1b11cf..abf1e623f 100644 --- a/STM32F1/cores/maple/HardwareTimer.cpp +++ b/STM32F1/cores/maple/HardwareTimer.cpp @@ -138,6 +138,15 @@ void HardwareTimer::detachInterrupt(int channel) { timer_detach_interrupt(this->dev, (uint8)channel); } + +void HardwareTimer::enableDMA(int channel) { + timer_dma_enable_req(this->dev, (uint8)channel); +} + +void HardwareTimer::disableDMA(int channel) { + timer_dma_disable_req(this->dev, (uint8)channel); +} + void HardwareTimer::refresh(void) { timer_generate_update(this->dev); } diff --git a/STM32F1/cores/maple/HardwareTimer.h b/STM32F1/cores/maple/HardwareTimer.h index 75601d0cb..d5356ca21 100644 --- a/STM32F1/cores/maple/HardwareTimer.h +++ b/STM32F1/cores/maple/HardwareTimer.h @@ -245,6 +245,12 @@ class HardwareTimer { /* Escape hatch */ + /** + * @brief Enable/disable DMA request for the input channel. + */ + void enableDMA(int channel); + void disableDMA(int channel); + /** * @brief Get a pointer to the underlying libmaple timer_dev for * this HardwareTimer instance. From e14c83fe8d39d7012075f8a98c72a2b0a335c4e8 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Wed, 1 Nov 2017 15:24:04 +0100 Subject: [PATCH 220/307] Update tone.cpp - make tone() blocking for the input duration time --- STM32F1/cores/maple/tone.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/STM32F1/cores/maple/tone.cpp b/STM32F1/cores/maple/tone.cpp index 965bfddc9..45cfa0eec 100644 --- a/STM32F1/cores/maple/tone.cpp +++ b/STM32F1/cores/maple/tone.cpp @@ -60,7 +60,7 @@ uint8_t tone_ntimer = TONE_TIMER; // timer used to generate freque bool tone_state = true; // last pin state for toggling short tone_pin = -1; // pin for outputting sound short tone_freq = 444; // tone frequency (0=pause) -uint32_t tone_nhw = 0; // tone duration in number of half waves +volatile uint32_t tone_nhw = 0; // tone duration in number of half waves uint16_t tone_tcount = 0; // time between handler calls in 1/36 usec uint16_t tone_ncount = 0; // handler call between toggling uint16_t tone_n = 0; // remaining handler calls before toggling @@ -146,12 +146,12 @@ void tone(uint32_t pin, uint32_t freq, uint32_t duration) { tone_timer->pause(); - if(freq > 0 && duration >0 ){ + if(freq > 0){ uint32_t count = (F_CPU/4)/freq; // timer counts per half wave tone_ncount = tone_n = (count>>16)+1; // number of 16-bit count chunk tone_tcount = count/tone_ncount; // size of count chunk if(duration > 0) // number of half waves to be generated - tone_nhw = ((duration*(freq>0?freq:100))/1000)<<1; + tone_nhw = ((duration*freq)/1000)<<1; else // no duration specified, continuous sound until noTone() called tone_nhw = 0; @@ -186,6 +186,7 @@ void tone(uint32_t pin, uint32_t freq, uint32_t duration) { pinMode(tone_pin, INPUT); } + while(tone_nhw) ; // blocks till duration elapsed } //////////////////////////////////////////////////////////////////////////////// From 2c33a0237134df4d5337fca38c17b9d1d74a4b8a Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 2 Nov 2017 17:50:34 +1100 Subject: [PATCH 221/307] Correct argument type bug in utoa (itoa.c itoa.h) See PR #271 --- STM32F1/cores/maple/itoa.c | 2 +- STM32F1/cores/maple/itoa.h | 2 +- STM32F4/cores/maple/itoa.c | 2 +- STM32F4/cores/maple/itoa.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/STM32F1/cores/maple/itoa.c b/STM32F1/cores/maple/itoa.c index ee74f829f..33efd14c6 100644 --- a/STM32F1/cores/maple/itoa.c +++ b/STM32F1/cores/maple/itoa.c @@ -124,7 +124,7 @@ extern char* ltoa( long value, char *string, int radix ) (__GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ > 2))) extern char* utoa( unsigned value, char *string, int radix ) #else -extern char* utoa( unsigned long value, char *string, int radix ) +extern char* utoa( unsigned int value, char *string, int radix ) #endif { return ultoa( value, string, radix ) ; diff --git a/STM32F1/cores/maple/itoa.h b/STM32F1/cores/maple/itoa.h index b88204c0e..9997b65c6 100644 --- a/STM32F1/cores/maple/itoa.h +++ b/STM32F1/cores/maple/itoa.h @@ -35,7 +35,7 @@ extern char* ltoa( long value, char *string, int radix ) ; (__GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ > 2))) extern char* utoa( unsigned value, char *string, int radix ) ; #else -extern char* utoa( unsigned long value, char *string, int radix ) ; +extern char* utoa( unsigned int value, char *string, int radix ) ; #endif extern char* ultoa( unsigned long value, char *string, int radix ) ; #endif /* 0 */ diff --git a/STM32F4/cores/maple/itoa.c b/STM32F4/cores/maple/itoa.c index ee74f829f..33efd14c6 100644 --- a/STM32F4/cores/maple/itoa.c +++ b/STM32F4/cores/maple/itoa.c @@ -124,7 +124,7 @@ extern char* ltoa( long value, char *string, int radix ) (__GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ > 2))) extern char* utoa( unsigned value, char *string, int radix ) #else -extern char* utoa( unsigned long value, char *string, int radix ) +extern char* utoa( unsigned int value, char *string, int radix ) #endif { return ultoa( value, string, radix ) ; diff --git a/STM32F4/cores/maple/itoa.h b/STM32F4/cores/maple/itoa.h index a6e893de8..a317e82c1 100644 --- a/STM32F4/cores/maple/itoa.h +++ b/STM32F4/cores/maple/itoa.h @@ -35,7 +35,7 @@ extern char* ltoa( long value, char *string, int radix ) ; (__GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ > 2))) extern char* utoa( unsigned value, char *string, int radix ) ; #else -extern char* utoa( unsigned long value, char *string, int radix ) ; +extern char* utoa( unsigned int value, char *string, int radix ) ; #endif extern char* ultoa( unsigned long value, char *string, int radix ) ; #endif /* 0 */ From 15ce8137b92f5b0cdb3c6e5ac51f02e52eb2c7a4 Mon Sep 17 00:00:00 2001 From: "aka. N[]NE in gaming communities" Date: Mon, 6 Nov 2017 08:55:32 -0500 Subject: [PATCH 222/307] Update BlinkNcount.ino Uses `#define` for LED pin instead of 5 literals --- .../General/BlinkNcount/BlinkNcount.ino | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino index 1b1f58a9f..b05ece9c4 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino @@ -1,35 +1,38 @@ /* - BlinkNcount for Maple Mini by m. ray burnette + BlinkNcount for Maple Mini by m. ray burnette, update by The Lightning Stalker to use #define Sketch uses 13,808 bytes (12%) of program storage space. Maximum is 108,000 bytes. Global variables use 2,592 bytes of dynamic memory. Turns on an LED on for one second, then off for one second, repeatedly. Counts and displays the count on the attached serial monitor This example code is in the public domain. - */ +*/ + +#define LED_PIN PB1 // Maple Mini LED is on PB1, other boards may vary + int n = 0; -void setup() { +void setup() { // initialize the digital pin as an output. - pinMode(33, OUTPUT); + pinMode(LED_PIN, OUTPUT); // Initialize virtual COM over USB on Maple Mini Serial.begin(9600); // BAUD has no effect on USB serial: placeholder for physical UART // wait for serial monitor to be connected. while (!Serial) { - digitalWrite(33,!digitalRead(33));// Turn the LED from off to on, or on to off + digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // Turn the LED from off to on, or on to off delay(100); // fast blink } Serial.println("Blink LED & count Demo"); } void loop() { - digitalWrite(33, HIGH); // set the LED on + digitalWrite(LED_PIN, HIGH); // set the LED on delay(500); // wait for a second - digitalWrite(33, LOW); // set the LED off + digitalWrite(LED_PIN, LOW); // set the LED off Serial.print("Loop #: "); n++; Serial.println(n); - - delay(500); // wait + + delay(500); // wait } From 15d12bee18188a4276b83272bb6545713a3fc697 Mon Sep 17 00:00:00 2001 From: "aka. N[]NE in gaming communities" Date: Mon, 6 Nov 2017 19:00:41 -0500 Subject: [PATCH 223/307] Update BlinkNcount.c Changed pin to PC13 --- .../examples/General/BlinkNcount/BlinkNcount.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino index b05ece9c4..60a4c17f6 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino @@ -7,7 +7,7 @@ This example code is in the public domain. */ -#define LED_PIN PB1 // Maple Mini LED is on PB1, other boards may vary +#define LED_PIN PC13 // Maple Mini LED is on PB1, other boards may vary int n = 0; From c5ed88921ef7228bdd8decf9711e98536c3bd6a1 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Wed, 8 Nov 2017 15:29:25 +1100 Subject: [PATCH 224/307] Changed serial upload speed to 115200 as this speed is compatible with most USB to Serial adaptors --- tools/linux/serial_upload | 2 +- tools/linux64/serial_upload | 2 +- tools/macosx/serial_upload | 2 +- tools/win/serial_upload.bat | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/linux/serial_upload b/tools/linux/serial_upload index 05d17c6e5..755444aad 100755 --- a/tools/linux/serial_upload +++ b/tools/linux/serial_upload @@ -1,2 +1,2 @@ #!/bin/bash -$(dirname $0)/stm32flash/stm32flash -g 0x8000000 -b 230400 -w "$4" /dev/"$1" +$(dirname $0)/stm32flash/stm32flash -g 0x8000000 -b 115200 -w "$4" /dev/"$1" diff --git a/tools/linux64/serial_upload b/tools/linux64/serial_upload index 05d17c6e5..755444aad 100755 --- a/tools/linux64/serial_upload +++ b/tools/linux64/serial_upload @@ -1,2 +1,2 @@ #!/bin/bash -$(dirname $0)/stm32flash/stm32flash -g 0x8000000 -b 230400 -w "$4" /dev/"$1" +$(dirname $0)/stm32flash/stm32flash -g 0x8000000 -b 115200 -w "$4" /dev/"$1" diff --git a/tools/macosx/serial_upload b/tools/macosx/serial_upload index 05d17c6e5..755444aad 100755 --- a/tools/macosx/serial_upload +++ b/tools/macosx/serial_upload @@ -1,2 +1,2 @@ #!/bin/bash -$(dirname $0)/stm32flash/stm32flash -g 0x8000000 -b 230400 -w "$4" /dev/"$1" +$(dirname $0)/stm32flash/stm32flash -g 0x8000000 -b 115200 -w "$4" /dev/"$1" diff --git a/tools/win/serial_upload.bat b/tools/win/serial_upload.bat index d733be745..4c50fb707 100644 --- a/tools/win/serial_upload.bat +++ b/tools/win/serial_upload.bat @@ -8,7 +8,7 @@ cd %~dp0 rem: the two line below are needed to fix path issues with incorrect slashes before the bin file name set str=%4 set str=%str:/=\% -stm32flash -g 0x8000000 -b 230400 -w %str% %1 +stm32flash -g 0x8000000 -b 115200 -w %str% %1 rem: C:\Python27\python.exe stm32loader.py -e -w -p %1 -g -b 115200 %str% rem: ------------- use STM's own uploader From fd00f020722d7f8e69a974d28f4b9de4c5d62fe4 Mon Sep 17 00:00:00 2001 From: LightningStalker Date: Fri, 10 Nov 2017 04:10:31 -0500 Subject: [PATCH 225/307] Update BlinkNcount.ino to use LED_BUILTIN --- .../examples/General/BlinkNcount/BlinkNcount.ino | 15 ++++++--------- STM32F1/variants/generic_stm32f103c/variant.h | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino b/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino index 60a4c17f6..11f88f806 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/General/BlinkNcount/BlinkNcount.ino @@ -1,35 +1,32 @@ /* - BlinkNcount for Maple Mini by m. ray burnette, update by The Lightning Stalker to use #define + BlinkNcount for Maple Mini by m. ray burnette Sketch uses 13,808 bytes (12%) of program storage space. Maximum is 108,000 bytes. Global variables use 2,592 bytes of dynamic memory. Turns on an LED on for one second, then off for one second, repeatedly. Counts and displays the count on the attached serial monitor This example code is in the public domain. -*/ - -#define LED_PIN PC13 // Maple Mini LED is on PB1, other boards may vary - + */ int n = 0; void setup() { // initialize the digital pin as an output. - pinMode(LED_PIN, OUTPUT); + pinMode(LED_BUILTIN, OUTPUT); // Initialize virtual COM over USB on Maple Mini Serial.begin(9600); // BAUD has no effect on USB serial: placeholder for physical UART // wait for serial monitor to be connected. while (!Serial) { - digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // Turn the LED from off to on, or on to off + digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN)); // Turn the LED from off to on, or on to off delay(100); // fast blink } Serial.println("Blink LED & count Demo"); } void loop() { - digitalWrite(LED_PIN, HIGH); // set the LED on + digitalWrite(LED_BUILTIN, HIGH); // set the LED on delay(500); // wait for a second - digitalWrite(LED_PIN, LOW); // set the LED off + digitalWrite(LED_BUILTIN, LOW); // set the LED off Serial.print("Loop #: "); n++; Serial.println(n); diff --git a/STM32F1/variants/generic_stm32f103c/variant.h b/STM32F1/variants/generic_stm32f103c/variant.h index 4a9cfcd19..dc4b894f9 100644 --- a/STM32F1/variants/generic_stm32f103c/variant.h +++ b/STM32F1/variants/generic_stm32f103c/variant.h @@ -19,4 +19,4 @@ static const uint8_t SCK = BOARD_SPI1_SCK_PIN; #define LED_BUILTIN PC13 -#endif /* _VARIANT_ARDUINO_STM32_ */ \ No newline at end of file +#endif /* _VARIANT_ARDUINO_STM32_ */ From 9b4122ecaf999bd80c1ce6333d001883e44b4556 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 13 Nov 2017 11:56:13 +1100 Subject: [PATCH 226/307] Fixed exmple for HardTimerAsEncoder being in wrong location --- .../examples}/Sensors/HardTimerAsEncoder/HardTimerAsEncoder.ino | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {examples => STM32F1/libraries/A_STM32_Examples/examples}/Sensors/HardTimerAsEncoder/HardTimerAsEncoder.ino (100%) diff --git a/examples/Sensors/HardTimerAsEncoder/HardTimerAsEncoder.ino b/STM32F1/libraries/A_STM32_Examples/examples/Sensors/HardTimerAsEncoder/HardTimerAsEncoder.ino similarity index 100% rename from examples/Sensors/HardTimerAsEncoder/HardTimerAsEncoder.ino rename to STM32F1/libraries/A_STM32_Examples/examples/Sensors/HardTimerAsEncoder/HardTimerAsEncoder.ino From c5caa5d288ca6c4a08fb8fe7e2125e6988cd1065 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 13 Nov 2017 12:03:19 +1100 Subject: [PATCH 227/307] Fixed missing definition of digitalPinToInterrupt, by adding macro which simply uses the pin number - as it doesnt need to be mapped --- STM32F1/cores/maple/wirish.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/STM32F1/cores/maple/wirish.h b/STM32F1/cores/maple/wirish.h index 3ffee8331..eb07c771c 100644 --- a/STM32F1/cores/maple/wirish.h +++ b/STM32F1/cores/maple/wirish.h @@ -104,5 +104,7 @@ typedef unsigned int word; #define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (F_CPU / 1000L) ) #define microsecondsToClockCycles(a) ( (a) * (F_CPU / 1000000L) ) +#define digitalPinToInterrupt(pin) (pin) + #endif From c66ca2ae9c6429d50d2e73b5fbc9b7c41c1268e6 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 13 Nov 2017 12:55:05 +1100 Subject: [PATCH 228/307] Fixed #273 --- STM32F1/boards.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 10379ec55..96d94939d 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -299,7 +299,6 @@ nucleo_f103rb.build.core=maple nucleo_f103rb.build.ldscript=ld/jtag.ld nucleo_f103rb.build.variant=nucleo_f103rb nucleo_f103rb.build.variant_system_lib=libmaple.a -nucleo_f103rb.build.vect=VECT_TAB_FLASH nucleo_f103rb.build.density=STM32_MEDIUM_DENSITY nucleo_f103rb.build.error_led_port=GPIOB nucleo_f103rb.build.error_led_pin=1 From dfb5bd4c30f42fa9cf2a0aef6b7d2a50a594fa97 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 13 Nov 2017 13:02:27 +0100 Subject: [PATCH 229/307] Update timer.h - clear the IRQ flag before enabling the IRQ --- STM32F1/system/libmaple/include/libmaple/timer.h | 1 + 1 file changed, 1 insertion(+) diff --git a/STM32F1/system/libmaple/include/libmaple/timer.h b/STM32F1/system/libmaple/include/libmaple/timer.h index 28b6c95ce..2c83e5e81 100644 --- a/STM32F1/system/libmaple/include/libmaple/timer.h +++ b/STM32F1/system/libmaple/include/libmaple/timer.h @@ -828,6 +828,7 @@ static inline void timer_dma_disable_req(timer_dev *dev, uint8 channel) { * @see timer_channel */ static inline void timer_enable_irq(timer_dev *dev, uint8 interrupt) { + *bb_perip(&(dev->regs).adv->SR, interrupt) = 0; // clear interrupt flag *bb_perip(&(dev->regs).adv->DIER, interrupt) = 1; } From 85f159b3a50bfe867c64ad78b6494f7a57150f5d Mon Sep 17 00:00:00 2001 From: stevstrong Date: Mon, 13 Nov 2017 13:06:52 +0100 Subject: [PATCH 230/307] Update boards.txt remove duplicated lines --- STM32F1/boards.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 96d94939d..49c12932a 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -44,13 +44,6 @@ mapleMini.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L mapleMini.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) mapleMini.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L -#-- CPU Clock frequency -mapleMini.menu.cpu_speed.speed_72mhz=72Mhz (Normal) -mapleMini.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L - -mapleMini.menu.cpu_speed.speed_48mhz=48Mhz (Slow - with USB) -mapleMini.menu.cpu_speed.speed_48mhz.build.f_cpu=48000000L - mapleMini.menu.cpu_speed.speed_128mhz=Overclocked 128Mhz NO USB SERIAL. MANUAL RESET NEEDED TO UPLOAD mapleMini.menu.cpu_speed.speed_128mhz.build.f_cpu=128000000L From 9b03f0841d35bdb848701f684c8a85a92dec24e5 Mon Sep 17 00:00:00 2001 From: Alberto Alonso Date: Mon, 13 Nov 2017 12:15:07 -0600 Subject: [PATCH 231/307] Solve race condition with arduino IDE monitoring serial port I encountered a race condition upon which, even though the udev rules were working and uploads succeed, the serial monitor can not re-establish communications. If the serial monitor is left open when doing an upload the error shown is: [...] Copying data from PC to DFU device Starting download: [##################################################] finished! state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present Done! Resetting USB to switch back to runtime mode Waiting for /dev/ttyACM0 serial...Done processing.app.SerialException: Error opening serial port '/dev/ttyACM0'. Try consulting the documentation at http://playground.arduino.cc/Linux/All#Permission at processing.app.Serial.(Serial.java:145) at processing.app.Serial.(Serial.java:82) at processing.app.SerialMonitor$4.(SerialMonitor.java:101) at processing.app.SerialMonitor.open(SerialMonitor.java:101) at processing.app.AbstractMonitor.resume(AbstractMonitor.java:104) at processing.app.Editor.resumeOrCloseSerialMonitor(Editor.java:2218) at processing.app.Editor.access$2200(Editor.java:79) at processing.app.Editor$DefaultExportHandler.run(Editor.java:2196) at java.lang.Thread.run(Thread.java:748) Error opening serial port '/dev/ttyACM0'. Try consulting the documentation at http://playground.arduino.cc/Linux/All#Permission I traced it to the device being opened prior to the permissions/ownership changes. When testing via -c the upload script waits for the character device creation, but at that point the udev rules have not changed the permissions. By testing the readability of the device via the -r test, we wait until the new permissions have been applied. I imagine this is specific to the Linux kernel and the speed of the machine being used. In my case: arduino-1.8.5 Linux 4.4.0-98-generic #121-Ubuntu SMP but the change should work on any system with proper udev rules / permissions. --- tools/linux/maple_upload | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/linux/maple_upload b/tools/linux/maple_upload index 195317468..50d2ae557 100755 --- a/tools/linux/maple_upload +++ b/tools/linux/maple_upload @@ -42,7 +42,7 @@ fi echo -n Waiting for ${dummy_port_fullpath} serial... COUNTER=0 -while [ ! -c ${dummy_port_fullpath} ] && ((COUNTER++ < 40)); do +while [ ! -r ${dummy_port_fullpath} ] && ((COUNTER++ < 40)); do sleep 0.1 done From 908a57a28e3e193e9f6070911e6b69b533ce716f Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Wed, 15 Nov 2017 22:56:00 +0100 Subject: [PATCH 232/307] Suppressing 'warning: missing initializer for member ... [-Wmissing-field-initializers]' --- STM32F1/variants/STM32VLD/board.cpp | 4 +++- STM32F1/variants/generic_gd32f103c/board.cpp | 6 +++--- STM32F1/variants/generic_stm32f103c/board.cpp | 7 +++---- STM32F1/variants/generic_stm32f103r/board.cpp | 4 +++- STM32F1/variants/generic_stm32f103r8/board.cpp | 4 +++- STM32F1/variants/generic_stm32f103t/board.cpp | 4 +++- STM32F1/variants/generic_stm32f103v/board.cpp | 6 ++++-- STM32F1/variants/generic_stm32f103z/board.cpp | 5 ++++- STM32F1/variants/hytiny_stm32f103t/board.cpp | 4 +++- STM32F1/variants/maple/board.cpp | 3 +++ STM32F1/variants/maple_mini/board.cpp | 5 ++++- STM32F1/variants/maple_ret6/board.cpp | 5 ++++- STM32F1/variants/microduino/board.cpp | 3 +++ STM32F1/variants/nucleo_f103rb/board.cpp | 5 ++++- 14 files changed, 47 insertions(+), 18 deletions(-) diff --git a/STM32F1/variants/STM32VLD/board.cpp b/STM32F1/variants/STM32VLD/board.cpp index 1cecbd932..2561814a6 100644 --- a/STM32F1/variants/STM32VLD/board.cpp +++ b/STM32F1/variants/STM32VLD/board.cpp @@ -51,7 +51,8 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { @@ -113,6 +114,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpiod, NULL, NULL, 1, 0, ADCx}, /* PD2 */ {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 */ }; +#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PA0, PA1, PA2, PA3, PA6, PA7, PA8, PA9, PA10, PB0, PB1, PB6, PB7, PB8, PB9 diff --git a/STM32F1/variants/generic_gd32f103c/board.cpp b/STM32F1/variants/generic_gd32f103c/board.cpp index 8b136f2a1..54f60beba 100644 --- a/STM32F1/variants/generic_gd32f103c/board.cpp +++ b/STM32F1/variants/generic_gd32f103c/board.cpp @@ -51,7 +51,8 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { @@ -93,9 +94,8 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ - - }; +#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8 diff --git a/STM32F1/variants/generic_stm32f103c/board.cpp b/STM32F1/variants/generic_stm32f103c/board.cpp index 7102adb9c..ac786cf00 100644 --- a/STM32F1/variants/generic_stm32f103c/board.cpp +++ b/STM32F1/variants/generic_stm32f103c/board.cpp @@ -51,7 +51,8 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { @@ -92,10 +93,8 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */ {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ - - - }; +#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8 diff --git a/STM32F1/variants/generic_stm32f103r/board.cpp b/STM32F1/variants/generic_stm32f103r/board.cpp index 3e3589c23..e50314e2b 100644 --- a/STM32F1/variants/generic_stm32f103r/board.cpp +++ b/STM32F1/variants/generic_stm32f103r/board.cpp @@ -69,7 +69,8 @@ void boardInit(void) { // - Timer channel (1 to 4, for PWM), or 0 if none // - ADC device, or NULL if none // - ADC channel, or ADCx if none - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* gpio_dev *gpio_device; GPIO device @@ -137,6 +138,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ }; +#pragma GCC diagnostic pop /* Basically everything that is defined as having a timer us PWM */ extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F1/variants/generic_stm32f103r8/board.cpp b/STM32F1/variants/generic_stm32f103r8/board.cpp index 05f85a5cc..1987651b7 100644 --- a/STM32F1/variants/generic_stm32f103r8/board.cpp +++ b/STM32F1/variants/generic_stm32f103r8/board.cpp @@ -51,7 +51,8 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { @@ -111,6 +112,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 */ }; +#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8, PC6, PC7, PC8, PC9 diff --git a/STM32F1/variants/generic_stm32f103t/board.cpp b/STM32F1/variants/generic_stm32f103t/board.cpp index e7a1dc0e0..003d225b3 100644 --- a/STM32F1/variants/generic_stm32f103t/board.cpp +++ b/STM32F1/variants/generic_stm32f103t/board.cpp @@ -51,7 +51,8 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { @@ -81,6 +82,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ }; +#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8 diff --git a/STM32F1/variants/generic_stm32f103v/board.cpp b/STM32F1/variants/generic_stm32f103v/board.cpp index 9c137725a..8b241694c 100644 --- a/STM32F1/variants/generic_stm32f103v/board.cpp +++ b/STM32F1/variants/generic_stm32f103v/board.cpp @@ -68,7 +68,8 @@ void boardInit(void) { // - Timer channel (1 to 4, for PWM), or 0 if none // - ADC device, or NULL if none // - ADC channel, or ADCx if none - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* gpio_dev *gpio_device; GPIO device @@ -166,6 +167,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpioe, NULL, NULL, 15, 0, ADCx} , /* PE15 FSMC_D12 */ }; +#pragma GCC diagnostic pop /* Basically everything that is defined as having a timer us PWM */ extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { @@ -196,4 +198,4 @@ extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { DEFINE_HWSERIAL(Serial2, 3); DEFINE_HWSERIAL_UART(Serial3, 4); DEFINE_HWSERIAL_UART(Serial4, 5); -#endif \ No newline at end of file +#endif diff --git a/STM32F1/variants/generic_stm32f103z/board.cpp b/STM32F1/variants/generic_stm32f103z/board.cpp index 830479e96..4d2e4e989 100644 --- a/STM32F1/variants/generic_stm32f103z/board.cpp +++ b/STM32F1/variants/generic_stm32f103z/board.cpp @@ -69,6 +69,8 @@ void boardInit(void) { // - ADC device, or NULL if none // - ADC channel, or ADCx if none +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* gpio_dev *gpio_device; GPIO device @@ -201,6 +203,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpiog, NULL, NULL, 14, 0, ADCx} , /* PG14 */ {&gpiog, NULL, NULL, 15, 0, ADCx} /* PG15 */ }; +#pragma GCC diagnostic pop /* Basically everything that is defined as having a timer us PWM */ extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { @@ -231,4 +234,4 @@ extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { DEFINE_HWSERIAL(Serial2, 3); DEFINE_HWSERIAL_UART(Serial3, 4); DEFINE_HWSERIAL_UART(Serial4, 5); -#endif \ No newline at end of file +#endif diff --git a/STM32F1/variants/hytiny_stm32f103t/board.cpp b/STM32F1/variants/hytiny_stm32f103t/board.cpp index f1fb44f07..d1260a6d0 100644 --- a/STM32F1/variants/hytiny_stm32f103t/board.cpp +++ b/STM32F1/variants/hytiny_stm32f103t/board.cpp @@ -51,7 +51,8 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { @@ -82,6 +83,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ }; +#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8 diff --git a/STM32F1/variants/maple/board.cpp b/STM32F1/variants/maple/board.cpp index a4c033557..b1584e7ea 100644 --- a/STM32F1/variants/maple/board.cpp +++ b/STM32F1/variants/maple/board.cpp @@ -68,6 +68,8 @@ void boardInit(void) { // - Timer channel (1 to 4, for PWM), or 0 if none // - ADC device, or NULL if none // - ADC channel, or ADCx if none +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Top header */ @@ -126,6 +128,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { PMAP_ROW(&gpiob, 3, NULL, 0, NULL, ADCx), /* D42/PB3 */ PMAP_ROW(&gpiob, 4, NULL, 0, NULL, ADCx), /* D43/PB4 */ }; +#pragma GCC diagnostic pop // Array of pins you can use for pwmWrite(). Keep it in Flash because // it doesn't change, and so we don't waste RAM. diff --git a/STM32F1/variants/maple_mini/board.cpp b/STM32F1/variants/maple_mini/board.cpp index f49b33682..bf63364ae 100644 --- a/STM32F1/variants/maple_mini/board.cpp +++ b/STM32F1/variants/maple_mini/board.cpp @@ -50,6 +50,8 @@ void boardInit(void) { #endif } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Top header */ @@ -92,6 +94,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* D32/PB8 */ {&gpiob, &timer3, &adc1, 1, 4, 9}, /* D33/PB1 */ }; +#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { 3, 4, 5, 8, 9, 10, 11, 15, 16, 25, 26, 27 @@ -125,4 +128,4 @@ DEFINE_HWSERIAL(Serial1, 1); DEFINE_HWSERIAL(Serial2, 2); DEFINE_HWSERIAL(Serial3, 3); - \ No newline at end of file + diff --git a/STM32F1/variants/maple_ret6/board.cpp b/STM32F1/variants/maple_ret6/board.cpp index fb9277985..dfec977ba 100644 --- a/STM32F1/variants/maple_ret6/board.cpp +++ b/STM32F1/variants/maple_ret6/board.cpp @@ -69,6 +69,8 @@ void boardInit(void) { // - ADC device, or NULL if none // - ADC channel, or ADCx if none +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* gpio_dev *gpio_device; GPIO device @@ -143,6 +145,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { { &gpiod, NULL, NULL, 1, 0, ADCx }, /* PD1 OSC_OUT */ { &gpiob, NULL, NULL, 2, 0, ADCx }, /* PB2 */ }; +#pragma GCC diagnostic pop /* Basically everything that is defined as having a timer us PWM */ extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { @@ -175,4 +178,4 @@ DEFINE_HWSERIAL(Serial1, 1); DEFINE_HWSERIAL(Serial2, 2); DEFINE_HWSERIAL(Serial3, 3); DEFINE_HWSERIAL_UART(Serial4, 4); -DEFINE_HWSERIAL_UART(Serial5, 5); \ No newline at end of file +DEFINE_HWSERIAL_UART(Serial5, 5); diff --git a/STM32F1/variants/microduino/board.cpp b/STM32F1/variants/microduino/board.cpp index 2a002887b..d7b4a97d1 100644 --- a/STM32F1/variants/microduino/board.cpp +++ b/STM32F1/variants/microduino/board.cpp @@ -51,6 +51,8 @@ void boardInit(void) { #endif } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { @@ -84,6 +86,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { // FIXME: find out which pin is the button, if any {&gpiob, NULL, NULL, 8, 0, ADCx}, /* D24/PB8??/Button */ }; +#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { 0, 1, 4, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23 diff --git a/STM32F1/variants/nucleo_f103rb/board.cpp b/STM32F1/variants/nucleo_f103rb/board.cpp index 9f3e08ae7..9754a2d43 100644 --- a/STM32F1/variants/nucleo_f103rb/board.cpp +++ b/STM32F1/variants/nucleo_f103rb/board.cpp @@ -93,6 +93,8 @@ rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSI_DIV_2, &pll_data}; // 0 1 3 4 2 5 // 0 1 2 4 2 5 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Arduino-like header, right connectors */ @@ -149,6 +151,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { // PMAP_ROW(&gpioa, 14, NULL, 0, NULL, ADCx), /* D42/PA14 do not use*/ // PMAP_ROW(&gpioa, 15, &timer2, 1, NULL, ADCx), /* D43/PA15 do not use*/ }; +#pragma GCC diagnostic pop // Array of pins you can use for pwmWrite(). Keep it in Flash because // it doesn't change, and so we don't waste RAM. @@ -256,4 +259,4 @@ MOSI alternate functions on the GPIO ports. DEFINE_HWSERIAL(Serial, 3);// Use HW Serial 2 as "Serial" DEFINE_HWSERIAL(Serial1, 2); DEFINE_HWSERIAL(Serial2, 1); -#endif \ No newline at end of file +#endif From 8d9e2f24b6cde18363f113c70dc4fdae06941599 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Wed, 15 Nov 2017 23:19:31 +0100 Subject: [PATCH 233/307] Suppressing 'warning: unused parameter ... [-Wunused-parameter]' --- STM32F1/cores/maple/libmaple/adc_f1.c | 2 +- STM32F1/cores/maple/libmaple/spi_f1.c | 2 +- STM32F1/cores/maple/libmaple/timer.c | 2 +- STM32F1/cores/maple/libmaple/util.c | 2 +- .../cores/maple/stm32f1/wiring_pulse_f1.cpp | 2 +- STM32F1/cores/maple/usb_serial.cpp | 4 ++-- STM32F1/libraries/Wire/WireBase.cpp | 2 +- .../libmaple/stm32f1/include/series/i2c.h | 2 +- STM32F1/variants/STM32VLD/wirish/syscalls.c | 22 +++++++++---------- .../generic_gd32f103c/wirish/syscalls.c | 18 +++++++-------- .../generic_stm32f103c/wirish/syscalls.c | 22 +++++++++---------- .../generic_stm32f103r8/wirish/syscalls.c | 22 +++++++++---------- .../generic_stm32f103t/wirish/syscalls.c | 22 +++++++++---------- .../generic_stm32f103v/wirish/syscalls.c | 22 +++++++++---------- .../generic_stm32f103z/wirish/syscalls.c | 22 +++++++++---------- .../hytiny_stm32f103t/wirish/syscalls.c | 22 +++++++++---------- STM32F1/variants/maple/wirish/syscalls.c | 22 +++++++++---------- STM32F1/variants/maple_mini/wirish/syscalls.c | 22 +++++++++---------- STM32F1/variants/maple_ret6/wirish/syscalls.c | 22 +++++++++---------- STM32F1/variants/microduino/wirish/syscalls.c | 22 +++++++++---------- .../variants/nucleo_f103rb/wirish/syscalls.c | 22 +++++++++---------- 21 files changed, 150 insertions(+), 150 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/adc_f1.c b/STM32F1/cores/maple/libmaple/adc_f1.c index d099f6d50..5305b02af 100644 --- a/STM32F1/cores/maple/libmaple/adc_f1.c +++ b/STM32F1/cores/maple/libmaple/adc_f1.c @@ -203,7 +203,7 @@ void adc_foreach(void (*fn)(adc_dev*)) { #endif } -void adc_config_gpio(adc_dev *ignored, gpio_dev *gdev, uint8 bit) { +void adc_config_gpio(adc_dev *ignored __attribute__((unused)), gpio_dev *gdev, uint8 bit) { gpio_set_mode(gdev, bit, GPIO_INPUT_ANALOG); } diff --git a/STM32F1/cores/maple/libmaple/spi_f1.c b/STM32F1/cores/maple/libmaple/spi_f1.c index bbea5a440..d920761a0 100644 --- a/STM32F1/cores/maple/libmaple/spi_f1.c +++ b/STM32F1/cores/maple/libmaple/spi_f1.c @@ -54,7 +54,7 @@ spi_dev *SPI3 = &spi3; * Routines */ -void spi_config_gpios(spi_dev *ignored, +void spi_config_gpios(spi_dev *ignored __attribute__((unused)), uint8 as_master, gpio_dev *nss_dev, uint8 nss_bit, diff --git a/STM32F1/cores/maple/libmaple/timer.c b/STM32F1/cores/maple/libmaple/timer.c index daf8e439c..70e20654c 100644 --- a/STM32F1/cores/maple/libmaple/timer.c +++ b/STM32F1/cores/maple/libmaple/timer.c @@ -327,7 +327,7 @@ static void output_compare_mode(timer_dev *dev, uint8 channel) { } //added by CARLOS. -static void encoder_mode(timer_dev *dev, uint8 channel) { +static void encoder_mode(timer_dev *dev, uint8 channel __attribute__((unused))) { //prescaler. //(dev->regs).gen->PSC = 1; diff --git a/STM32F1/cores/maple/libmaple/util.c b/STM32F1/cores/maple/libmaple/util.c index 4c0b2c8ec..f488ea4d4 100644 --- a/STM32F1/cores/maple/libmaple/util.c +++ b/STM32F1/cores/maple/libmaple/util.c @@ -88,7 +88,7 @@ void _fail(const char* file, int line, const char* exp) { * Provide an __assert_func handler to libc so that calls to assert() * get redirected to _fail. */ -void __assert_func(const char* file, int line, const char* method, +void __assert_func(const char* file, int line, const char* method __attribute__((unused)), const char* expression) { _fail(file, line, expression); } diff --git a/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp b/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp index 9ca4d7fb8..d9287b07b 100644 --- a/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp +++ b/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp @@ -26,7 +26,7 @@ * to be slighly more accurate the maxLoops variable really needs to take into account the loop setup code, but its probably as good as necessary * */ -uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) +uint32_t pulseIn( uint32_t pin, uint32_t state __attribute__((unused)), uint32_t timeout ) { // cache the port and bit of the pin in order to speed up the // pulse width measuring loop and achieve finer resolution. calling diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index 0902c50e6..e6d5cb0e5 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -236,7 +236,7 @@ enum reset_state_t { static reset_state_t reset_state = DTR_UNSET; -static void ifaceSetupHook(unsigned hook, void *requestvp) { +static void ifaceSetupHook(unsigned hook __attribute__((unused)), void *requestvp) { uint8 request = *(uint8*)requestvp; // Ignore requests we're not interested in. @@ -290,7 +290,7 @@ static void wait_reset(void) { #define STACK_TOP 0x20000800 #define EXC_RETURN 0xFFFFFFF9 #define DEFAULT_CPSR 0x61000000 -static void rxHook(unsigned hook, void *ignored) { +static void rxHook(unsigned hook __attribute__((unused)), void *ignored __attribute__((unused))) { /* FIXME this is mad buggy; we need a new reset sequence. E.g. NAK * after each RX means you can't reset if any bytes are waiting. */ if (reset_state == DTR_NEGEDGE) { diff --git a/STM32F1/libraries/Wire/WireBase.cpp b/STM32F1/libraries/Wire/WireBase.cpp index 220d845d7..eaa7f91ad 100644 --- a/STM32F1/libraries/Wire/WireBase.cpp +++ b/STM32F1/libraries/Wire/WireBase.cpp @@ -41,7 +41,7 @@ #include "WireBase.h" #include "wirish.h" -void WireBase::begin(uint8 self_addr) { +void WireBase::begin(uint8 self_addr __attribute__((unused))) { tx_buf_idx = 0; tx_buf_overflow = false; rx_buf_idx = 0; diff --git a/STM32F1/system/libmaple/stm32f1/include/series/i2c.h b/STM32F1/system/libmaple/stm32f1/include/series/i2c.h index f4079559c..35655036a 100644 --- a/STM32F1/system/libmaple/stm32f1/include/series/i2c.h +++ b/STM32F1/system/libmaple/stm32f1/include/series/i2c.h @@ -59,7 +59,7 @@ extern i2c_dev* const I2C2; * For internal use */ -static inline uint32 _i2c_bus_clk(i2c_dev *dev) { +static inline uint32 _i2c_bus_clk(i2c_dev *dev __attribute__((unused))) { /* Both I2C peripherals are on APB1 */ return STM32_PCLK1 / (1000 * 1000); } diff --git a/STM32F1/variants/STM32VLD/wirish/syscalls.c b/STM32F1/variants/STM32VLD/wirish/syscalls.c index d42536c58..91ed5a104 100644 --- a/STM32F1/variants/STM32VLD/wirish/syscalls.c +++ b/STM32F1/variants/STM32VLD/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/generic_gd32f103c/wirish/syscalls.c b/STM32F1/variants/generic_gd32f103c/wirish/syscalls.c index d5f2d9fac..6558dbd3b 100644 --- a/STM32F1/variants/generic_gd32f103c/wirish/syscalls.c +++ b/STM32F1/variants/generic_gd32f103c/wirish/syscalls.c @@ -76,15 +76,15 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } @@ -97,7 +97,7 @@ __weak int isatty(int fd) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/generic_stm32f103c/wirish/syscalls.c b/STM32F1/variants/generic_stm32f103c/wirish/syscalls.c index d42536c58..91ed5a104 100644 --- a/STM32F1/variants/generic_stm32f103c/wirish/syscalls.c +++ b/STM32F1/variants/generic_stm32f103c/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/generic_stm32f103r8/wirish/syscalls.c b/STM32F1/variants/generic_stm32f103r8/wirish/syscalls.c index d42536c58..91ed5a104 100644 --- a/STM32F1/variants/generic_stm32f103r8/wirish/syscalls.c +++ b/STM32F1/variants/generic_stm32f103r8/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/generic_stm32f103t/wirish/syscalls.c b/STM32F1/variants/generic_stm32f103t/wirish/syscalls.c index d42536c58..91ed5a104 100644 --- a/STM32F1/variants/generic_stm32f103t/wirish/syscalls.c +++ b/STM32F1/variants/generic_stm32f103t/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/generic_stm32f103v/wirish/syscalls.c b/STM32F1/variants/generic_stm32f103v/wirish/syscalls.c index d5f2d9fac..ec1c34dba 100644 --- a/STM32F1/variants/generic_stm32f103v/wirish/syscalls.c +++ b/STM32F1/variants/generic_stm32f103v/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/generic_stm32f103z/wirish/syscalls.c b/STM32F1/variants/generic_stm32f103z/wirish/syscalls.c index d42536c58..91ed5a104 100644 --- a/STM32F1/variants/generic_stm32f103z/wirish/syscalls.c +++ b/STM32F1/variants/generic_stm32f103z/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/hytiny_stm32f103t/wirish/syscalls.c b/STM32F1/variants/hytiny_stm32f103t/wirish/syscalls.c index d5f2d9fac..ec1c34dba 100644 --- a/STM32F1/variants/hytiny_stm32f103t/wirish/syscalls.c +++ b/STM32F1/variants/hytiny_stm32f103t/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/maple/wirish/syscalls.c b/STM32F1/variants/maple/wirish/syscalls.c index d5f2d9fac..ec1c34dba 100644 --- a/STM32F1/variants/maple/wirish/syscalls.c +++ b/STM32F1/variants/maple/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/maple_mini/wirish/syscalls.c b/STM32F1/variants/maple_mini/wirish/syscalls.c index d5f2d9fac..ec1c34dba 100644 --- a/STM32F1/variants/maple_mini/wirish/syscalls.c +++ b/STM32F1/variants/maple_mini/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/maple_ret6/wirish/syscalls.c b/STM32F1/variants/maple_ret6/wirish/syscalls.c index d5f2d9fac..ec1c34dba 100644 --- a/STM32F1/variants/maple_ret6/wirish/syscalls.c +++ b/STM32F1/variants/maple_ret6/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/microduino/wirish/syscalls.c b/STM32F1/variants/microduino/wirish/syscalls.c index d5f2d9fac..ec1c34dba 100644 --- a/STM32F1/variants/microduino/wirish/syscalls.c +++ b/STM32F1/variants/microduino/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } diff --git a/STM32F1/variants/nucleo_f103rb/wirish/syscalls.c b/STM32F1/variants/nucleo_f103rb/wirish/syscalls.c index d5f2d9fac..ec1c34dba 100644 --- a/STM32F1/variants/nucleo_f103rb/wirish/syscalls.c +++ b/STM32F1/variants/nucleo_f103rb/wirish/syscalls.c @@ -76,28 +76,28 @@ void *_sbrk(int incr) { return ret; } -__weak int _open(const char *path, int flags, ...) { +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { return 1; } -__weak int _close(int fd) { +__weak int _close(int fd __attribute__((unused))) { return 0; } -__weak int _fstat(int fd, struct stat *st) { +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { st->st_mode = S_IFCHR; return 0; } -__weak int _isatty(int fd) { +__weak int _isatty(int fd __attribute__((unused))) { return 1; } -__weak int isatty(int fd) { +__weak int isatty(int fd __attribute__((unused))) { return 1; } -__weak int _lseek(int fd, off_t pos, int whence) { +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { return -1; } @@ -106,13 +106,13 @@ __weak unsigned char getch(void) { } -__weak int _read(int fd, char *buf, size_t cnt) { +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { *buf = getch(); return 1; } -__weak void putch(unsigned char c) { +__weak void putch(unsigned char c __attribute__((unused))) { } __weak void cgets(char *s, int bufsize) { @@ -155,7 +155,7 @@ __weak void cgets(char *s, int bufsize) { return; } -__weak int _write(int fd, const char *buf, size_t cnt) { +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { int i; for (i = 0; i < cnt; i++) @@ -165,12 +165,12 @@ __weak int _write(int fd, const char *buf, size_t cnt) { } /* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { cgets(s, bufsize); return s; } -__weak void _exit(int exitcode) { +__weak void _exit(int exitcode __attribute__((unused))) { while (1) ; } From 29ff4e739d35fda2760784a0c8945ee30ed3cb42 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Thu, 16 Nov 2017 19:20:25 +0100 Subject: [PATCH 234/307] Fixed 'warning: missing initializer for member ... [-Wmissing-field-initializers]' --- STM32F1/cores/maple/boards_private.h | 2 +- STM32F1/variants/STM32VLD/board.cpp | 111 ++++----- STM32F1/variants/generic_gd32f103c/board.cpp | 75 +++--- STM32F1/variants/generic_stm32f103c/board.cpp | 75 +++--- STM32F1/variants/generic_stm32f103r/board.cpp | 111 ++++----- .../variants/generic_stm32f103r8/board.cpp | 107 ++++---- STM32F1/variants/generic_stm32f103t/board.cpp | 51 ++-- STM32F1/variants/generic_stm32f103v/board.cpp | 167 ++++++------- STM32F1/variants/generic_stm32f103z/board.cpp | 235 +++++++++--------- STM32F1/variants/hytiny_stm32f103t/board.cpp | 51 ++-- STM32F1/variants/maple/board.cpp | 3 - STM32F1/variants/maple_mini/board.cpp | 71 +++--- STM32F1/variants/maple_ret6/board.cpp | 101 ++++---- STM32F1/variants/microduino/board.cpp | 57 ++--- STM32F1/variants/nucleo_f103rb/board.cpp | 101 ++++---- STM32F3/cores/maple/wirish/boards_private.h | 2 +- 16 files changed, 639 insertions(+), 681 deletions(-) diff --git a/STM32F1/cores/maple/boards_private.h b/STM32F1/cores/maple/boards_private.h index 49867ca77..332843ddf 100644 --- a/STM32F1/cores/maple/boards_private.h +++ b/STM32F1/cores/maple/boards_private.h @@ -42,7 +42,7 @@ /* Makes the PIN_MAP rows more human-readable. */ #define PMAP_ROW(gpio_dev, gpio_bit, timer_dev, timer_ch, adc_dev, adc_ch) \ - { gpio_dev, timer_dev, adc_dev, gpio_bit, timer_ch, adc_ch } + { gpio_dev, timer_dev, adc_dev, gpio_bit, timer_ch, adc_ch, 0} namespace wirish { namespace priv { diff --git a/STM32F1/variants/STM32VLD/board.cpp b/STM32F1/variants/STM32VLD/board.cpp index 2561814a6..182e8f721 100644 --- a/STM32F1/variants/STM32VLD/board.cpp +++ b/STM32F1/variants/STM32VLD/board.cpp @@ -51,70 +51,67 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx, 0}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ /* Andy Hull - the R8 is similar to the C8 but exposes more GPIO as follows */ - {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ - - {&gpioc, NULL, NULL, 6, 0, ADCx}, /* PC6 */ - {&gpioc, NULL, NULL, 7, 0, ADCx}, /* PC7 */ - {&gpioc, NULL, NULL, 8, 0, ADCx}, /* PC8 */ - {&gpioc, NULL, NULL, 9, 0, ADCx}, /* PC9 */ - - {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 */ - {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 */ - {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 */ - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ - - {&gpiod, NULL, NULL, 0, 0, ADCx}, /* PD2 */ - {&gpiod, NULL, NULL, 1, 0, ADCx}, /* PD2 */ - {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 */ + {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* PC5 */ + + {&gpioc, NULL, NULL, 6, 0, ADCx, 0}, /* PC6 */ + {&gpioc, NULL, NULL, 7, 0, ADCx, 0}, /* PC7 */ + {&gpioc, NULL, NULL, 8, 0, ADCx, 0}, /* PC8 */ + {&gpioc, NULL, NULL, 9, 0, ADCx, 0}, /* PC9 */ + + {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* PC10 */ + {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* PC11 */ + {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* PC12 */ + {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 */ + {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 */ + + {&gpiod, NULL, NULL, 0, 0, ADCx, 0}, /* PD2 */ + {&gpiod, NULL, NULL, 1, 0, ADCx, 0}, /* PD2 */ + {&gpiod, NULL, NULL, 2, 0, ADCx, 0}, /* PD2 */ }; -#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PA0, PA1, PA2, PA3, PA6, PA7, PA8, PA9, PA10, PB0, PB1, PB6, PB7, PB8, PB9 diff --git a/STM32F1/variants/generic_gd32f103c/board.cpp b/STM32F1/variants/generic_gd32f103c/board.cpp index 54f60beba..da22d526b 100644 --- a/STM32F1/variants/generic_gd32f103c/board.cpp +++ b/STM32F1/variants/generic_gd32f103c/board.cpp @@ -51,51 +51,48 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ - - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ + + {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 */ + {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 */ }; -#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8 diff --git a/STM32F1/variants/generic_stm32f103c/board.cpp b/STM32F1/variants/generic_stm32f103c/board.cpp index ac786cf00..7b33ba858 100644 --- a/STM32F1/variants/generic_stm32f103c/board.cpp +++ b/STM32F1/variants/generic_stm32f103c/board.cpp @@ -51,50 +51,47 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ - - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ + + {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 */ + {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 */ }; -#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8 diff --git a/STM32F1/variants/generic_stm32f103r/board.cpp b/STM32F1/variants/generic_stm32f103r/board.cpp index e50314e2b..e564425d0 100644 --- a/STM32F1/variants/generic_stm32f103r/board.cpp +++ b/STM32F1/variants/generic_stm32f103r/board.cpp @@ -69,8 +69,6 @@ void boardInit(void) { // - Timer channel (1 to 4, for PWM), or 0 if none // - ADC device, or NULL if none // - ADC channel, or ADCx if none -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* gpio_dev *gpio_device; GPIO device @@ -82,63 +80,62 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { uint8 pinMode; mode specific by pinMode call (Roger Clark added to optimize compatibility with Arduino API */ - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx, 0}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ - {&gpiob, NULL, NULL, 9, 0, ADCx}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ - - - {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ - {&gpioc, &timer8, NULL, 6, 1, ADCx}, /* PC6 */ - {&gpioc, &timer8, NULL, 7, 2, ADCx}, /* PC7 */ - {&gpioc, &timer8, NULL, 8, 3, ADCx}, /* PC8 */ - {&gpioc, &timer8, NULL, 9, 4, ADCx}, /* PC9 */ - {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */ - {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */ - {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */ - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC */ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ - - {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ + {&gpiob, NULL, NULL, 9, 0, ADCx, 0}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ + + + {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* PC5 */ + {&gpioc, &timer8, NULL, 6, 1, ADCx, 0}, /* PC6 */ + {&gpioc, &timer8, NULL, 7, 2, ADCx, 0}, /* PC7 */ + {&gpioc, &timer8, NULL, 8, 3, ADCx, 0}, /* PC8 */ + {&gpioc, &timer8, NULL, 9, 4, ADCx, 0}, /* PC9 */ + {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* PC10 UART4_TX/SDIO_D2 */ + {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* PC11 UART4_RX/SDIO_D3 */ + {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* PC12 UART5_TX/SDIO_CK */ + {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 TAMPER-RTC */ + {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 OSC32_IN */ + {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 OSC32_OUT */ + + {&gpiod, NULL, NULL, 0, 0, ADCx, 0} , /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx, 0} , /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx, 0} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ }; -#pragma GCC diagnostic pop /* Basically everything that is defined as having a timer us PWM */ extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F1/variants/generic_stm32f103r8/board.cpp b/STM32F1/variants/generic_stm32f103r8/board.cpp index 1987651b7..f667d2fe7 100644 --- a/STM32F1/variants/generic_stm32f103r8/board.cpp +++ b/STM32F1/variants/generic_stm32f103r8/board.cpp @@ -51,68 +51,65 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ /* Andy Hull - the R8 is similar to the C8 but exposes more GPIO as follows */ - {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ - - {&gpioc, NULL, NULL, 6, 0, ADCx}, /* PC6 */ - {&gpioc, NULL, NULL, 7, 0, ADCx}, /* PC7 */ - {&gpioc, NULL, NULL, 8, 0, ADCx}, /* PC8 */ - {&gpioc, NULL, NULL, 9, 0, ADCx}, /* PC9 */ - - {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 */ - {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 */ - {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 */ - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ - - {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 */ + {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* PC5 */ + + {&gpioc, NULL, NULL, 6, 0, ADCx, 0}, /* PC6 */ + {&gpioc, NULL, NULL, 7, 0, ADCx, 0}, /* PC7 */ + {&gpioc, NULL, NULL, 8, 0, ADCx, 0}, /* PC8 */ + {&gpioc, NULL, NULL, 9, 0, ADCx, 0}, /* PC9 */ + + {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* PC10 */ + {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* PC11 */ + {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* PC12 */ + {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 */ + {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 */ + + {&gpiod, NULL, NULL, 2, 0, ADCx, 0}, /* PD2 */ }; -#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8, PC6, PC7, PC8, PC9 diff --git a/STM32F1/variants/generic_stm32f103t/board.cpp b/STM32F1/variants/generic_stm32f103t/board.cpp index 003d225b3..85c252c4d 100644 --- a/STM32F1/variants/generic_stm32f103t/board.cpp +++ b/STM32F1/variants/generic_stm32f103t/board.cpp @@ -51,38 +51,35 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ }; -#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8 diff --git a/STM32F1/variants/generic_stm32f103v/board.cpp b/STM32F1/variants/generic_stm32f103v/board.cpp index 8b241694c..a6b31655e 100644 --- a/STM32F1/variants/generic_stm32f103v/board.cpp +++ b/STM32F1/variants/generic_stm32f103v/board.cpp @@ -68,8 +68,6 @@ void boardInit(void) { // - Timer channel (1 to 4, for PWM), or 0 if none // - ADC device, or NULL if none // - ADC channel, or ADCx if none -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* gpio_dev *gpio_device; GPIO device @@ -80,94 +78,93 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { uint8 adc_channel; Pin ADC channel, or ADCx if none. */ - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ //Could have &timer1_CH4, but is also CAN_RX and USBDM - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ //Could have &timer1_ETR, but is also CAN_TX and USBDP - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ //SPI3_NSS + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx, 0}, /* PA11 */ //Could have &timer1_CH4, but is also CAN_RX and USBDM + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ //Could have &timer1_ETR, but is also CAN_TX and USBDP + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ //SPI3_NSS - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ /* NOTE PB2 is not included as its Boot 1 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ //JTDO, SPI3_SCK / I2S3_CK/ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ //NJTRST, SPI3_MISO - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ //I2C1_SMBA/ SPI3_MOSI - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ //I2C1_SCL(9) - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ //I2C1_SDA(9) / FSMC_NADV - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ //SDIO_D4 - {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ //SDIO_D5 - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ //I2C2_SCL/USART3_TX - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ //I2C2_SDA/USART3_RX - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ //SPI2_NSS/I2S2_WS/I2C2_SMBA/USART3_CK - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ //SPI2_SCK/I2S2_CK/USART3_CTS - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ //SPI2_MISO/TIM1_CH2N/USART3_RTS - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ //SPI2_MOSI/I2S2_SD - - - {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ - {&gpioc, &timer8, NULL, 6, 1, ADCx}, /* PC6 I2S2_MCK/SDIO_D6*/ - {&gpioc, &timer8, NULL, 7, 2, ADCx}, /* PC7 I2S3_MCK/SDIO_D7*/ - {&gpioc, &timer8, NULL, 8, 3, ADCx}, /* PC8 SDIO_D0*/ - {&gpioc, &timer8, NULL, 9, 4, ADCx}, /* PC9 SDIO_D1*/ - {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */ - {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */ - {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */ - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC/ Limited output*/ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN/ Limited output*/ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT/ Limited output*/ - - {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ - {&gpiod, NULL, NULL, 3, 0, ADCx} , /* PD3 FSMC_CLK */ - {&gpiod, NULL, NULL, 4, 0, ADCx} , /* PD4 FSMC_NOE */ - {&gpiod, NULL, NULL, 5, 0, ADCx} , /* PD5 FSMC_NWE */ - {&gpiod, NULL, NULL, 6, 0, ADCx} , /* PD6 FSMC_NWAIT */ - {&gpiod, NULL, NULL, 7, 0, ADCx} , /* PD7 FSMC_NE1/FSMC_NCE2 */ - {&gpiod, NULL, NULL, 8, 0, ADCx} , /* PD8 FSMC_D13 */ - {&gpiod, NULL, NULL, 9, 0, ADCx} , /* PD9 FSMC_D14 */ - {&gpiod, NULL, NULL, 10, 0, ADCx} , /* PD10 FSMC_D15 */ - {&gpiod, NULL, NULL, 11, 0, ADCx} , /* PD11 FSMC_A16 */ - {&gpiod, NULL, NULL, 12, 0, ADCx} , /* PD12 FSMC_A17 */ - {&gpiod, NULL, NULL, 13, 0, ADCx} , /* PD13 FSMC_A18 */ - {&gpiod, NULL, NULL, 14, 0, ADCx} , /* PD14 FSMC_D0 */ - {&gpiod, NULL, NULL, 15, 0, ADCx} , /* PD15 FSMC_D1 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ //JTDO, SPI3_SCK / I2S3_CK/ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ //NJTRST, SPI3_MISO + {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ //I2C1_SMBA/ SPI3_MOSI + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ //I2C1_SCL(9) + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ //I2C1_SDA(9) / FSMC_NADV + {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ //SDIO_D4 + {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ //SDIO_D5 + {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ //I2C2_SCL/USART3_TX + {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ //I2C2_SDA/USART3_RX + {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ //SPI2_NSS/I2S2_WS/I2C2_SMBA/USART3_CK + {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ //SPI2_SCK/I2S2_CK/USART3_CTS + {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ //SPI2_MISO/TIM1_CH2N/USART3_RTS + {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ //SPI2_MOSI/I2S2_SD + + + {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* PC5 */ + {&gpioc, &timer8, NULL, 6, 1, ADCx, 0}, /* PC6 I2S2_MCK/SDIO_D6*/ + {&gpioc, &timer8, NULL, 7, 2, ADCx, 0}, /* PC7 I2S3_MCK/SDIO_D7*/ + {&gpioc, &timer8, NULL, 8, 3, ADCx, 0}, /* PC8 SDIO_D0*/ + {&gpioc, &timer8, NULL, 9, 4, ADCx, 0}, /* PC9 SDIO_D1*/ + {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* PC10 UART4_TX/SDIO_D2 */ + {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* PC11 UART4_RX/SDIO_D3 */ + {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* PC12 UART5_TX/SDIO_CK */ + {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 TAMPER-RTC/ Limited output*/ + {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 OSC32_IN/ Limited output*/ + {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 OSC32_OUT/ Limited output*/ + + {&gpiod, NULL, NULL, 0, 0, ADCx, 0} , /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx, 0} , /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx, 0} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + {&gpiod, NULL, NULL, 3, 0, ADCx, 0} , /* PD3 FSMC_CLK */ + {&gpiod, NULL, NULL, 4, 0, ADCx, 0} , /* PD4 FSMC_NOE */ + {&gpiod, NULL, NULL, 5, 0, ADCx, 0} , /* PD5 FSMC_NWE */ + {&gpiod, NULL, NULL, 6, 0, ADCx, 0} , /* PD6 FSMC_NWAIT */ + {&gpiod, NULL, NULL, 7, 0, ADCx, 0} , /* PD7 FSMC_NE1/FSMC_NCE2 */ + {&gpiod, NULL, NULL, 8, 0, ADCx, 0} , /* PD8 FSMC_D13 */ + {&gpiod, NULL, NULL, 9, 0, ADCx, 0} , /* PD9 FSMC_D14 */ + {&gpiod, NULL, NULL, 10, 0, ADCx, 0} , /* PD10 FSMC_D15 */ + {&gpiod, NULL, NULL, 11, 0, ADCx, 0} , /* PD11 FSMC_A16 */ + {&gpiod, NULL, NULL, 12, 0, ADCx, 0} , /* PD12 FSMC_A17 */ + {&gpiod, NULL, NULL, 13, 0, ADCx, 0} , /* PD13 FSMC_A18 */ + {&gpiod, NULL, NULL, 14, 0, ADCx, 0} , /* PD14 FSMC_D0 */ + {&gpiod, NULL, NULL, 15, 0, ADCx, 0} , /* PD15 FSMC_D1 */ - {&gpioe, NULL, NULL, 0, 0, ADCx} , /* PE0 TIM4_ETR / FSMC_NBL0 */ - {&gpioe, NULL, NULL, 1, 0, ADCx} , /* PE1 FSMC_NBL1 */ - {&gpioe, NULL, NULL, 2, 0, ADCx} , /* PE2 TRACECK/ FSMC_A23 */ - {&gpioe, NULL, NULL, 3, 0, ADCx} , /* PE3 TRACED0/FSMC_A19 */ - {&gpioe, NULL, NULL, 4, 0, ADCx} , /* PE4 TRACED1/FSMC_A20 */ - {&gpioe, NULL, NULL, 5, 0, ADCx} , /* PE5 TRACED2/FSMC_A21 */ - {&gpioe, NULL, NULL, 6, 0, ADCx} , /* PE6 TRACED3/FSMC_A22 */ - {&gpioe, NULL, NULL, 7, 0, ADCx} , /* PE7 FSMC_D4 */ - {&gpioe, NULL, NULL, 8, 0, ADCx} , /* PE8 FSMC_D5 */ - {&gpioe, NULL, NULL, 9, 0, ADCx} , /* PE9 FSMC_D6 */ - {&gpioe, NULL, NULL, 10, 0, ADCx} , /* PE10 FSMC_D7 */ - {&gpioe, NULL, NULL, 11, 0, ADCx} , /* PE11 FSMC_D8 */ - {&gpioe, NULL, NULL, 12, 0, ADCx} , /* PE12 FSMC_D9 */ - {&gpioe, NULL, NULL, 13, 0, ADCx} , /* PE13 FSMC_D10 */ - {&gpioe, NULL, NULL, 14, 0, ADCx} , /* PE14 FSMC_D11 */ - {&gpioe, NULL, NULL, 15, 0, ADCx} , /* PE15 FSMC_D12 */ + {&gpioe, NULL, NULL, 0, 0, ADCx, 0} , /* PE0 TIM4_ETR / FSMC_NBL0 */ + {&gpioe, NULL, NULL, 1, 0, ADCx, 0} , /* PE1 FSMC_NBL1 */ + {&gpioe, NULL, NULL, 2, 0, ADCx, 0} , /* PE2 TRACECK/ FSMC_A23 */ + {&gpioe, NULL, NULL, 3, 0, ADCx, 0} , /* PE3 TRACED0/FSMC_A19 */ + {&gpioe, NULL, NULL, 4, 0, ADCx, 0} , /* PE4 TRACED1/FSMC_A20 */ + {&gpioe, NULL, NULL, 5, 0, ADCx, 0} , /* PE5 TRACED2/FSMC_A21 */ + {&gpioe, NULL, NULL, 6, 0, ADCx, 0} , /* PE6 TRACED3/FSMC_A22 */ + {&gpioe, NULL, NULL, 7, 0, ADCx, 0} , /* PE7 FSMC_D4 */ + {&gpioe, NULL, NULL, 8, 0, ADCx, 0} , /* PE8 FSMC_D5 */ + {&gpioe, NULL, NULL, 9, 0, ADCx, 0} , /* PE9 FSMC_D6 */ + {&gpioe, NULL, NULL, 10, 0, ADCx, 0} , /* PE10 FSMC_D7 */ + {&gpioe, NULL, NULL, 11, 0, ADCx, 0} , /* PE11 FSMC_D8 */ + {&gpioe, NULL, NULL, 12, 0, ADCx, 0} , /* PE12 FSMC_D9 */ + {&gpioe, NULL, NULL, 13, 0, ADCx, 0} , /* PE13 FSMC_D10 */ + {&gpioe, NULL, NULL, 14, 0, ADCx, 0} , /* PE14 FSMC_D11 */ + {&gpioe, NULL, NULL, 15, 0, ADCx, 0} , /* PE15 FSMC_D12 */ }; -#pragma GCC diagnostic pop /* Basically everything that is defined as having a timer us PWM */ extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F1/variants/generic_stm32f103z/board.cpp b/STM32F1/variants/generic_stm32f103z/board.cpp index 4d2e4e989..0d112a32b 100644 --- a/STM32F1/variants/generic_stm32f103z/board.cpp +++ b/STM32F1/variants/generic_stm32f103z/board.cpp @@ -69,8 +69,6 @@ void boardInit(void) { // - ADC device, or NULL if none // - ADC channel, or ADCx if none -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* gpio_dev *gpio_device; GPIO device @@ -82,128 +80,127 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { uint8 pinMode; mode specific by pinMode call (Roger Clark added to optimize compatibility with Arduino API */ - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx, 0}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, &timer3, &adc1, 2, 4, 9}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ - - - {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ - {&gpioc, &timer8, NULL, 6, 1, ADCx}, /* PC6 */ - {&gpioc, &timer8, NULL, 7, 2, ADCx}, /* PC7 */ - {&gpioc, &timer8, NULL, 8, 3, ADCx}, /* PC8 */ - {&gpioc, &timer8, NULL, 9, 4, ADCx}, /* PC9 */ - {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */ - {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */ - {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */ - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC */ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ - - {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ + {&gpiob, &timer3, &adc1, 2, 4, 9, 0}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ + + + {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* PC5 */ + {&gpioc, &timer8, NULL, 6, 1, ADCx, 0}, /* PC6 */ + {&gpioc, &timer8, NULL, 7, 2, ADCx, 0}, /* PC7 */ + {&gpioc, &timer8, NULL, 8, 3, ADCx, 0}, /* PC8 */ + {&gpioc, &timer8, NULL, 9, 4, ADCx, 0}, /* PC9 */ + {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* PC10 UART4_TX/SDIO_D2 */ + {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* PC11 UART4_RX/SDIO_D3 */ + {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* PC12 UART5_TX/SDIO_CK */ + {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 TAMPER-RTC */ + {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 OSC32_IN */ + {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 OSC32_OUT */ + + {&gpiod, NULL, NULL, 0, 0, ADCx, 0} , /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx, 0} , /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx, 0} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ - {&gpiod, NULL, NULL, 3, 0, ADCx} , /* PD3 FSMC_CLK */ - {&gpiod, NULL, NULL, 4, 0, ADCx} , /* PD4 FSMC_NOE */ - {&gpiod, NULL, NULL, 5, 0, ADCx} , /* PD5 FSMC_NWE */ - {&gpiod, NULL, NULL, 6, 0, ADCx} , /* PD6 FSMC_NWAIT */ - {&gpiod, NULL, NULL, 7, 0, ADCx} , /* PD7 FSMC_NE1/FSMC_NCE2 */ - {&gpiod, NULL, NULL, 8, 0, ADCx} , /* PD8 FSMC_D13 */ - {&gpiod, NULL, NULL, 9, 0, ADCx} , /* PD9 FSMC_D14 */ - {&gpiod, NULL, NULL, 10, 0, ADCx} , /* PD10 FSMC_D15 */ - {&gpiod, NULL, NULL, 11, 0, ADCx} , /* PD11 FSMC_A16 */ - {&gpiod, NULL, NULL, 12, 0, ADCx} , /* PD12 FSMC_A17 */ - {&gpiod, NULL, NULL, 13, 0, ADCx} , /* PD13 FSMC_A18 */ - {&gpiod, NULL, NULL, 14, 0, ADCx} , /* PD14 FSMC_D0 */ - {&gpiod, NULL, NULL, 15, 0, ADCx} , /* PD15 FSMC_D1 */ + {&gpiod, NULL, NULL, 3, 0, ADCx, 0} , /* PD3 FSMC_CLK */ + {&gpiod, NULL, NULL, 4, 0, ADCx, 0} , /* PD4 FSMC_NOE */ + {&gpiod, NULL, NULL, 5, 0, ADCx, 0} , /* PD5 FSMC_NWE */ + {&gpiod, NULL, NULL, 6, 0, ADCx, 0} , /* PD6 FSMC_NWAIT */ + {&gpiod, NULL, NULL, 7, 0, ADCx, 0} , /* PD7 FSMC_NE1/FSMC_NCE2 */ + {&gpiod, NULL, NULL, 8, 0, ADCx, 0} , /* PD8 FSMC_D13 */ + {&gpiod, NULL, NULL, 9, 0, ADCx, 0} , /* PD9 FSMC_D14 */ + {&gpiod, NULL, NULL, 10, 0, ADCx, 0} , /* PD10 FSMC_D15 */ + {&gpiod, NULL, NULL, 11, 0, ADCx, 0} , /* PD11 FSMC_A16 */ + {&gpiod, NULL, NULL, 12, 0, ADCx, 0} , /* PD12 FSMC_A17 */ + {&gpiod, NULL, NULL, 13, 0, ADCx, 0} , /* PD13 FSMC_A18 */ + {&gpiod, NULL, NULL, 14, 0, ADCx, 0} , /* PD14 FSMC_D0 */ + {&gpiod, NULL, NULL, 15, 0, ADCx, 0} , /* PD15 FSMC_D1 */ - {&gpioe, NULL, NULL, 0, 0, ADCx} , /* PE0 */ - {&gpioe, NULL, NULL, 1, 0, ADCx} , /* PE1 */ - {&gpioe, NULL, NULL, 2, 0, ADCx} , /* PE2 */ - {&gpioe, NULL, NULL, 3, 0, ADCx} , /* PE3 */ - {&gpioe, NULL, NULL, 4, 0, ADCx} , /* PE4 */ - {&gpioe, NULL, NULL, 5, 0, ADCx} , /* PE5 */ - {&gpioe, NULL, NULL, 6, 0, ADCx} , /* PE6 */ - {&gpioe, NULL, NULL, 7, 0, ADCx} , /* PE7 */ - {&gpioe, NULL, NULL, 8, 0, ADCx} , /* PE8 */ - {&gpioe, NULL, NULL, 9, 0, ADCx} , /* PE9 */ - {&gpioe, NULL, NULL, 10, 0, ADCx} , /* PE10 */ - {&gpioe, NULL, NULL, 11, 0, ADCx} , /* PE11 */ - {&gpioe, NULL, NULL, 12, 0, ADCx} , /* PE12 */ - {&gpioe, NULL, NULL, 13, 0, ADCx} , /* PE13 */ - {&gpioe, NULL, NULL, 14, 0, ADCx} , /* PE14 */ - {&gpioe, NULL, NULL, 15, 0, ADCx} , /* PE15 */ - - {&gpiof, NULL, NULL, 0, 0, ADCx} , /* PF0 */ - {&gpiof, NULL, NULL, 1, 0, ADCx} , /* PF1 */ - {&gpiof, NULL, NULL, 2, 0, ADCx} , /* PF2 */ - {&gpiof, NULL, NULL, 3, 0, ADCx} , /* PF3 */ - {&gpiof, NULL, NULL, 4, 0, ADCx} , /* PF4 */ - {&gpiof, NULL, NULL, 5, 0, ADCx} , /* PF5 */ - {&gpiof, NULL, NULL, 6, 0, ADCx} , /* PF6 */ - {&gpiof, NULL, NULL, 7, 0, ADCx} , /* PF7 */ - {&gpiof, NULL, NULL, 8, 0, ADCx} , /* PF8 */ - {&gpiof, NULL, NULL, 9, 0, ADCx} , /* PF9 */ - {&gpiof, NULL, NULL, 10, 0, ADCx} , /* PF10 */ - {&gpiof, NULL, NULL, 11, 0, ADCx} , /* PF11 */ - {&gpiof, NULL, NULL, 12, 0, ADCx} , /* PF12 */ - {&gpiof, NULL, NULL, 13, 0, ADCx} , /* PF13 */ - {&gpiof, NULL, NULL, 14, 0, ADCx} , /* PF14 */ - {&gpiof, NULL, NULL, 15, 0, ADCx} , /* PF15 */ + {&gpioe, NULL, NULL, 0, 0, ADCx, 0} , /* PE0 */ + {&gpioe, NULL, NULL, 1, 0, ADCx, 0} , /* PE1 */ + {&gpioe, NULL, NULL, 2, 0, ADCx, 0} , /* PE2 */ + {&gpioe, NULL, NULL, 3, 0, ADCx, 0} , /* PE3 */ + {&gpioe, NULL, NULL, 4, 0, ADCx, 0} , /* PE4 */ + {&gpioe, NULL, NULL, 5, 0, ADCx, 0} , /* PE5 */ + {&gpioe, NULL, NULL, 6, 0, ADCx, 0} , /* PE6 */ + {&gpioe, NULL, NULL, 7, 0, ADCx, 0} , /* PE7 */ + {&gpioe, NULL, NULL, 8, 0, ADCx, 0} , /* PE8 */ + {&gpioe, NULL, NULL, 9, 0, ADCx, 0} , /* PE9 */ + {&gpioe, NULL, NULL, 10, 0, ADCx, 0} , /* PE10 */ + {&gpioe, NULL, NULL, 11, 0, ADCx, 0} , /* PE11 */ + {&gpioe, NULL, NULL, 12, 0, ADCx, 0} , /* PE12 */ + {&gpioe, NULL, NULL, 13, 0, ADCx, 0} , /* PE13 */ + {&gpioe, NULL, NULL, 14, 0, ADCx, 0} , /* PE14 */ + {&gpioe, NULL, NULL, 15, 0, ADCx, 0} , /* PE15 */ + + {&gpiof, NULL, NULL, 0, 0, ADCx, 0} , /* PF0 */ + {&gpiof, NULL, NULL, 1, 0, ADCx, 0} , /* PF1 */ + {&gpiof, NULL, NULL, 2, 0, ADCx, 0} , /* PF2 */ + {&gpiof, NULL, NULL, 3, 0, ADCx, 0} , /* PF3 */ + {&gpiof, NULL, NULL, 4, 0, ADCx, 0} , /* PF4 */ + {&gpiof, NULL, NULL, 5, 0, ADCx, 0} , /* PF5 */ + {&gpiof, NULL, NULL, 6, 0, ADCx, 0} , /* PF6 */ + {&gpiof, NULL, NULL, 7, 0, ADCx, 0} , /* PF7 */ + {&gpiof, NULL, NULL, 8, 0, ADCx, 0} , /* PF8 */ + {&gpiof, NULL, NULL, 9, 0, ADCx, 0} , /* PF9 */ + {&gpiof, NULL, NULL, 10, 0, ADCx, 0} , /* PF10 */ + {&gpiof, NULL, NULL, 11, 0, ADCx, 0} , /* PF11 */ + {&gpiof, NULL, NULL, 12, 0, ADCx, 0} , /* PF12 */ + {&gpiof, NULL, NULL, 13, 0, ADCx, 0} , /* PF13 */ + {&gpiof, NULL, NULL, 14, 0, ADCx, 0} , /* PF14 */ + {&gpiof, NULL, NULL, 15, 0, ADCx, 0} , /* PF15 */ - {&gpiog, NULL, NULL, 0, 0, ADCx} , /* PG0 */ - {&gpiog, NULL, NULL, 1, 0, ADCx} , /* PG1 */ - {&gpiog, NULL, NULL, 2, 0, ADCx} , /* PG2 */ - {&gpiog, NULL, NULL, 3, 0, ADCx} , /* PG3 */ - {&gpiog, NULL, NULL, 4, 0, ADCx} , /* PG4 */ - {&gpiog, NULL, NULL, 5, 0, ADCx} , /* PG5 */ - {&gpiog, NULL, NULL, 6, 0, ADCx} , /* PG6 */ - {&gpiog, NULL, NULL, 7, 0, ADCx} , /* PG7 */ - {&gpiog, NULL, NULL, 8, 0, ADCx} , /* PG8 */ - {&gpiog, NULL, NULL, 9, 0, ADCx} , /* PG9 */ - {&gpiog, NULL, NULL, 10, 0, ADCx} , /* PG10 */ - {&gpiog, NULL, NULL, 11, 0, ADCx} , /* PG11 */ - {&gpiog, NULL, NULL, 12, 0, ADCx} , /* PG12 */ - {&gpiog, NULL, NULL, 13, 0, ADCx} , /* PG13 */ - {&gpiog, NULL, NULL, 14, 0, ADCx} , /* PG14 */ - {&gpiog, NULL, NULL, 15, 0, ADCx} /* PG15 */ + {&gpiog, NULL, NULL, 0, 0, ADCx, 0} , /* PG0 */ + {&gpiog, NULL, NULL, 1, 0, ADCx, 0} , /* PG1 */ + {&gpiog, NULL, NULL, 2, 0, ADCx, 0} , /* PG2 */ + {&gpiog, NULL, NULL, 3, 0, ADCx, 0} , /* PG3 */ + {&gpiog, NULL, NULL, 4, 0, ADCx, 0} , /* PG4 */ + {&gpiog, NULL, NULL, 5, 0, ADCx, 0} , /* PG5 */ + {&gpiog, NULL, NULL, 6, 0, ADCx, 0} , /* PG6 */ + {&gpiog, NULL, NULL, 7, 0, ADCx, 0} , /* PG7 */ + {&gpiog, NULL, NULL, 8, 0, ADCx, 0} , /* PG8 */ + {&gpiog, NULL, NULL, 9, 0, ADCx, 0} , /* PG9 */ + {&gpiog, NULL, NULL, 10, 0, ADCx, 0} , /* PG10 */ + {&gpiog, NULL, NULL, 11, 0, ADCx, 0} , /* PG11 */ + {&gpiog, NULL, NULL, 12, 0, ADCx, 0} , /* PG12 */ + {&gpiog, NULL, NULL, 13, 0, ADCx, 0} , /* PG13 */ + {&gpiog, NULL, NULL, 14, 0, ADCx, 0} , /* PG14 */ + {&gpiog, NULL, NULL, 15, 0, ADCx, 0} /* PG15 */ }; -#pragma GCC diagnostic pop /* Basically everything that is defined as having a timer us PWM */ extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F1/variants/hytiny_stm32f103t/board.cpp b/STM32F1/variants/hytiny_stm32f103t/board.cpp index d1260a6d0..b3fdd9b88 100644 --- a/STM32F1/variants/hytiny_stm32f103t/board.cpp +++ b/STM32F1/variants/hytiny_stm32f103t/board.cpp @@ -51,39 +51,36 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ }; -#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8 diff --git a/STM32F1/variants/maple/board.cpp b/STM32F1/variants/maple/board.cpp index b1584e7ea..a4c033557 100644 --- a/STM32F1/variants/maple/board.cpp +++ b/STM32F1/variants/maple/board.cpp @@ -68,8 +68,6 @@ void boardInit(void) { // - Timer channel (1 to 4, for PWM), or 0 if none // - ADC device, or NULL if none // - ADC channel, or ADCx if none -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Top header */ @@ -128,7 +126,6 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { PMAP_ROW(&gpiob, 3, NULL, 0, NULL, ADCx), /* D42/PB3 */ PMAP_ROW(&gpiob, 4, NULL, 0, NULL, ADCx), /* D43/PB4 */ }; -#pragma GCC diagnostic pop // Array of pins you can use for pwmWrite(). Keep it in Flash because // it doesn't change, and so we don't waste RAM. diff --git a/STM32F1/variants/maple_mini/board.cpp b/STM32F1/variants/maple_mini/board.cpp index bf63364ae..72faa17fb 100644 --- a/STM32F1/variants/maple_mini/board.cpp +++ b/STM32F1/variants/maple_mini/board.cpp @@ -50,51 +50,48 @@ void boardInit(void) { #endif } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Top header */ - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* D0/PB11 */ - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* D1/PB10 */ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* D2/PB2 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* D3/PB0 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* D4/PA7 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* D5/PA6 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* D6/PA5 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* D7/PA4 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* D8/PA3 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* D9/PA2 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* D10/PA1 */ - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* D11/PA0 */ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* D12/PC15 */ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* D13/PC14 */ - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* D14/PC13 */ + {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* D0/PB11 */ + {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* D1/PB10 */ + {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* D2/PB2 */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* D3/PB0 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* D4/PA7 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* D5/PA6 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* D6/PA5 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* D7/PA4 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* D8/PA3 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* D9/PA2 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* D10/PA1 */ + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* D11/PA0 */ + {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* D12/PC15 */ + {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* D13/PC14 */ + {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* D14/PC13 */ /* Bottom header */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* D15/PB7 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* D16/PB6 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* D17/PB5 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* D18/PB4 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* D19/PB3 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* D20/PA15 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* D21/PA14 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* D22/PA13 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* D23/PA12 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* D24/PA11 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* D25/PA10 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* D26/PA9 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* D27/PA8 */ - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* D28/PB15 */ - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* D29/PB14 */ - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* D30/PB13 */ - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* D31/PB12 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* D32/PB8 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* D33/PB1 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* D15/PB7 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* D16/PB6 */ + {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* D17/PB5 */ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* D18/PB4 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* D19/PB3 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* D20/PA15 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* D21/PA14 */ + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* D22/PA13 */ + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* D23/PA12 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* D24/PA11 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* D25/PA10 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* D26/PA9 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* D27/PA8 */ + {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* D28/PB15 */ + {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* D29/PB14 */ + {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* D30/PB13 */ + {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* D31/PB12 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* D32/PB8 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* D33/PB1 */ }; -#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { 3, 4, 5, 8, 9, 10, 11, 15, 16, 25, 26, 27 diff --git a/STM32F1/variants/maple_ret6/board.cpp b/STM32F1/variants/maple_ret6/board.cpp index dfec977ba..82127ff88 100644 --- a/STM32F1/variants/maple_ret6/board.cpp +++ b/STM32F1/variants/maple_ret6/board.cpp @@ -69,8 +69,6 @@ void boardInit(void) { // - ADC device, or NULL if none // - ADC channel, or ADCx if none -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* gpio_dev *gpio_device; GPIO device @@ -84,68 +82,67 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Top header */ - { &gpioa, &timer2, &adc1, 3, 4, 3 }, /* D0/PA3 */ - { &gpioa, &timer2, &adc1, 2, 3, 2 }, /* D1/PA2 */ - { &gpioa, &timer2, &adc1, 0, 1, 0 }, /* D2/PA0 */ - { &gpioa, &timer2, &adc1, 1, 2, 1 }, /* D3/PA1 */ - { &gpiob, NULL, NULL, 5, 0, ADCx }, /* D4/PB5 */ - { &gpiob, &timer4, NULL, 6, 1, ADCx }, /* D5/PB6 */ - { &gpioa, &timer1, NULL, 8, 1, ADCx }, /* D6/PA8 */ - { &gpioa, &timer1, NULL, 9, 2, ADCx }, /* D7/PA9 */ - { &gpioa, &timer1, NULL, 10, 3, ADCx }, /* D8/PA10 */ - { &gpiob, &timer4, NULL, 7, 2, ADCx }, /* D9/PB7 */ - { &gpioa, NULL, &adc1, 4, 0, 4 }, /* D10/PA4 */ - { &gpioa, &timer3, &adc1, 7, 2, 7 }, /* D11/PA7 */ - { &gpioa, &timer3, &adc1, 6, 1, 6 }, /* D12/PA6 */ - { &gpioa, NULL, &adc1, 5, 0, 5 }, /* D13/PA5 (LED) */ - { &gpiob, &timer4, NULL, 8, 3, ADCx }, /* D14/PB8 */ + { &gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* D0/PA3 */ + { &gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* D1/PA2 */ + { &gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* D2/PA0 */ + { &gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* D3/PA1 */ + { &gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* D4/PB5 */ + { &gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* D5/PB6 */ + { &gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* D6/PA8 */ + { &gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* D7/PA9 */ + { &gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* D8/PA10 */ + { &gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* D9/PB7 */ + { &gpioa, NULL, &adc1, 4, 0, 4, 0}, /* D10/PA4 */ + { &gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* D11/PA7 */ + { &gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* D12/PA6 */ + { &gpioa, NULL, &adc1, 5, 0, 5, 0}, /* D13/PA5 (LED) */ + { &gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* D14/PB8 */ /* Little header */ - { &gpioc, NULL, &adc1, 0, 0, 10 }, /* D15/PC0 */ - { &gpioc, NULL, &adc1, 1, 0, 11 }, /* D16/PC1 */ - { &gpioc, NULL, &adc1, 2, 0, 12 }, /* D17/PC2 */ - { &gpioc, NULL, &adc1, 3, 0, 13 }, /* D18/PC3 */ - { &gpioc, NULL, &adc1, 4, 0, 14 }, /* D19/PC4 */ - { &gpioc, NULL, &adc1, 5, 0, 15 }, /* D20/PC5 */ + { &gpioc, NULL, &adc1, 0, 0, 10, 0}, /* D15/PC0 */ + { &gpioc, NULL, &adc1, 1, 0, 11, 0}, /* D16/PC1 */ + { &gpioc, NULL, &adc1, 2, 0, 12, 0}, /* D17/PC2 */ + { &gpioc, NULL, &adc1, 3, 0, 13, 0}, /* D18/PC3 */ + { &gpioc, NULL, &adc1, 4, 0, 14, 0}, /* D19/PC4 */ + { &gpioc, NULL, &adc1, 5, 0, 15, 0}, /* D20/PC5 */ /* External header */ - { &gpioc, NULL, NULL, 13, 0, ADCx }, /* D21/PC13 */ - { &gpioc, NULL, NULL, 14, 0, ADCx }, /* D22/PC14 */ - { &gpioc, NULL, NULL, 15, 0, ADCx }, /* D23/PC15 */ - { &gpiob, &timer4, NULL, 9, 4, ADCx }, /* D24/PB9 */ - { &gpiod, NULL, NULL, 2, 0, ADCx }, /* D25/PD2 */ - { &gpioc, NULL, NULL, 10, 0, ADCx }, /* D26/PC10 */ - { &gpiob, &timer3, &adc1, 0, 3, 8 }, /* D27/PB0 */ - { &gpiob, &timer3, &adc1, 1, 4, 9 }, /* D28/PB1 */ - { &gpiob, NULL, NULL, 10, 0, ADCx }, /* D29/PB10 */ - { &gpiob, NULL, NULL, 11, 0, ADCx }, /* D30/PB11 */ - { &gpiob, NULL, NULL, 12, 0, ADCx }, /* D31/PB12 */ - { &gpiob, NULL, NULL, 13, 0, ADCx }, /* D32/PB13 */ - { &gpiob, NULL, NULL, 14, 0, ADCx }, /* D33/PB14 */ - { &gpiob, NULL, NULL, 15, 0, ADCx }, /* D34/PB15 */ - { &gpioc, &timer8, NULL, 6, 1, ADCx }, /* D35/PC6 */ - { &gpioc, &timer8, NULL, 7, 2, ADCx }, /* D36/PC7 */ - { &gpioc, &timer8, NULL, 8, 3, ADCx }, /* D37/PC8 */ - { &gpioc, &timer8, NULL, 9, 4, ADCx }, /* D38/PC9 (BUT) */ + { &gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* D21/PC13 */ + { &gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* D22/PC14 */ + { &gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* D23/PC15 */ + { &gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* D24/PB9 */ + { &gpiod, NULL, NULL, 2, 0, ADCx, 0}, /* D25/PD2 */ + { &gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* D26/PC10 */ + { &gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* D27/PB0 */ + { &gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* D28/PB1 */ + { &gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* D29/PB10 */ + { &gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* D30/PB11 */ + { &gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* D31/PB12 */ + { &gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* D32/PB13 */ + { &gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* D33/PB14 */ + { &gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* D34/PB15 */ + { &gpioc, &timer8, NULL, 6, 1, ADCx, 0}, /* D35/PC6 */ + { &gpioc, &timer8, NULL, 7, 2, ADCx, 0}, /* D36/PC7 */ + { &gpioc, &timer8, NULL, 8, 3, ADCx, 0}, /* D37/PC8 */ + { &gpioc, &timer8, NULL, 9, 4, ADCx, 0}, /* D38/PC9 (BUT) */ /* JTAG header */ - { &gpioa, NULL, NULL, 13, 0, ADCx }, /* D39/PA13 */ - { &gpioa, NULL, NULL, 14, 0, ADCx }, /* D40/PA14 */ - { &gpioa, NULL, NULL, 15, 0, ADCx }, /* D41/PA15 */ - { &gpiob, NULL, NULL, 3, 0, ADCx }, /* D42/PB3 */ - { &gpiob, NULL, NULL, 4, 0, ADCx }, /* D43/PB4 */ + { &gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* D39/PA13 */ + { &gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* D40/PA14 */ + { &gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* D41/PA15 */ + { &gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* D42/PB3 */ + { &gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* D43/PB4 */ - { &gpioc, NULL, NULL, 11, 0, ADCx }, /* D44/PC11 UART4_RX/SDIO_D3 */ - { &gpioc, NULL, NULL, 12, 0, ADCx }, /* D45/PC12 UART5_TX/SDIO_CK */ + { &gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* D44/PC11 UART4_RX/SDIO_D3 */ + { &gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* D45/PC12 UART5_TX/SDIO_CK */ - { &gpiod, NULL, NULL, 0, 0, ADCx }, /* PD0 OSC_IN */ - { &gpiod, NULL, NULL, 1, 0, ADCx }, /* PD1 OSC_OUT */ - { &gpiob, NULL, NULL, 2, 0, ADCx }, /* PB2 */ + { &gpiod, NULL, NULL, 0, 0, ADCx, 0}, /* PD0 OSC_IN */ + { &gpiod, NULL, NULL, 1, 0, ADCx, 0}, /* PD1 OSC_OUT */ + { &gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ }; -#pragma GCC diagnostic pop /* Basically everything that is defined as having a timer us PWM */ extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F1/variants/microduino/board.cpp b/STM32F1/variants/microduino/board.cpp index d7b4a97d1..51c80248d 100644 --- a/STM32F1/variants/microduino/board.cpp +++ b/STM32F1/variants/microduino/board.cpp @@ -51,42 +51,39 @@ void boardInit(void) { #endif } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* D0(RxD0)/PA10 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* D1(TxD1)/PA9 */ - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* D2/PB11 */ - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* D3/PB10 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* D4/PA8 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* D5/PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* D6/PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* D7/PA15 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* D8/PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* D9/PB4 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* D10/PA4 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* D11/PA7 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* D12/PA6 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* D13/PA5 */ - - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* D14(A0)/PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* D15(A1)/PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* D16(A2)/PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* D17(A3)/PA3 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* D18(A4)/PB7 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* D19(A5)/PB6 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* D20(A6)/PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* D21(A7)/PB1 */ - - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* D22/PA12/USB D+ */ - {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* D23/PA11/USB D- */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* D0(RxD0)/PA10 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* D1(TxD1)/PA9 */ + {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* D2/PB11 */ + {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* D3/PB10 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* D4/PA8 */ + {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* D5/PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* D6/PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* D7/PA15 */ + {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* D8/PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* D9/PB4 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* D10/PA4 */ + {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* D11/PA7 */ + {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* D12/PA6 */ + {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* D13/PA5 */ + + {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* D14(A0)/PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* D15(A1)/PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* D16(A2)/PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* D17(A3)/PA3 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* D18(A4)/PB7 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* D19(A5)/PB6 */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* D20(A6)/PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* D21(A7)/PB1 */ + + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* D22/PA12/USB D+ */ + {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* D23/PA11/USB D- */ // FIXME: find out which pin is the button, if any - {&gpiob, NULL, NULL, 8, 0, ADCx}, /* D24/PB8??/Button */ + {&gpiob, NULL, NULL, 8, 0, ADCx, 0}, /* D24/PB8??/Button */ }; -#pragma GCC diagnostic pop extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { 0, 1, 4, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23 diff --git a/STM32F1/variants/nucleo_f103rb/board.cpp b/STM32F1/variants/nucleo_f103rb/board.cpp index 9754a2d43..5e2672cfc 100644 --- a/STM32F1/variants/nucleo_f103rb/board.cpp +++ b/STM32F1/variants/nucleo_f103rb/board.cpp @@ -93,65 +93,62 @@ rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSI_DIV_2, &pll_data}; // 0 1 3 4 2 5 // 0 1 2 4 2 5 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Arduino-like header, right connectors */ - {&gpioa, NULL, &adc1, 3, 0, 3}, /* D0/PA3 */ - {&gpioa, NULL, &adc1, 2, 0, 2}, /* D1/PA2 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* D2/PA10 */ - {&gpiob, &timer2, NULL, 3, 2, ADCx}, /* D3/PB3 */ - {&gpiob, &timer3, NULL, 5, 2, ADCx}, /* D4/PB5 */ - {&gpiob, &timer3, NULL, 4, 1, ADCx}, /* D5/PB4 */ - {&gpiob, &timer2, NULL, 10, 3, ADCx}, /* D6/PB10 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* D7/PA8 */ + {&gpioa, NULL, &adc1, 3, 0, 3, 0}, /* D0/PA3 */ + {&gpioa, NULL, &adc1, 2, 0, 2, 0}, /* D1/PA2 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* D2/PA10 */ + {&gpiob, &timer2, NULL, 3, 2, ADCx, 0}, /* D3/PB3 */ + {&gpiob, &timer3, NULL, 5, 2, ADCx, 0}, /* D4/PB5 */ + {&gpiob, &timer3, NULL, 4, 1, ADCx, 0}, /* D5/PB4 */ + {&gpiob, &timer2, NULL, 10, 3, ADCx, 0}, /* D6/PB10 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* D7/PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* D8/PA9 */ - {&gpioc, NULL, NULL, 7, 0, ADCx}, /* D9/PC7 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* D10/PB6 */ - {&gpioa, NULL, &adc1, 7, 0, 7}, /* D11/PA7 */ - {&gpioa, NULL, &adc1, 6, 0, 6}, /* D12/PA6 */ - {&gpioa, NULL, NULL, 5, 0, ADCx}, /* D13/PA5 LED - no &adc12_IN5 !*/ - {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* D14/PB9 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* D15/PB8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* D8/PA9 */ + {&gpioc, NULL, NULL, 7, 0, ADCx, 0}, /* D9/PC7 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* D10/PB6 */ + {&gpioa, NULL, &adc1, 7, 0, 7, 0}, /* D11/PA7 */ + {&gpioa, NULL, &adc1, 6, 0, 6, 0}, /* D12/PA6 */ + {&gpioa, NULL, NULL, 5, 0, ADCx, 0}, /* D13/PA5 LED - no &adc12_IN5 !*/ + {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* D14/PB9 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* D15/PB8 */ - {&gpioa, NULL, &adc1, 0, 0, 0}, /* D16/A0/PA0 */ - {&gpioa, NULL, &adc1, 1, 0, 1}, /* D17/A1/PA1 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* D18/A2/PA4 */ - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* D19/A3/PB0 */ - {&gpioc, NULL, &adc1, 1, 0, 11}, /* D20/A4/PC1 */ - {&gpioc, NULL, &adc1, 0, 0, 10}, /* D21/A5/PC0 */ + {&gpioa, NULL, &adc1, 0, 0, 0, 0}, /* D16/A0/PA0 */ + {&gpioa, NULL, &adc1, 1, 0, 1, 0}, /* D17/A1/PA1 */ + {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* D18/A2/PA4 */ + {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* D19/A3/PB0 */ + {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* D20/A4/PC1 */ + {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* D21/A5/PC0 */ - {&gpioc, NULL, NULL, 10, 0, ADCx}, /* D22/PC10 */ - {&gpioc, NULL, NULL, 12, 0, ADCx}, /* D23/PC12 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* D24/PB7 */ - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* D25/PC13 USER BLUE BUTTON */ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* D26/PC14 */ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* D27/PC15 */ - {&gpioc, NULL, &adc1, 2, 0, 12}, /* D28/PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13}, /* D29/PC3 */ - {&gpioc, NULL, NULL, 11, 0, ADCx}, /* D30/PC11 */ - {&gpiod, NULL, NULL, 2, 0, ADCx}, /* D31/PD2 */ - {&gpioc, NULL, NULL, 9, 0, ADCx}, /* D32/PC9 */ - {&gpioc, NULL, NULL, 8, 0, ADCx}, /* D33/PC8 */ - {&gpioc, NULL, NULL, 6, 0, ADCx}, /* D34/PC6 */ - {&gpioc, NULL, &adc1, 5, 0, 15}, /* D35/PC5 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* D36/PA12 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* D37/PA11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* D38/PB12 */ - {&gpiob, &timer2, NULL, 11, 4, ADCx}, /* D39/PB11 PWM-not working?*/ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* D40/PB2 BOOT1 !!*/ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* D41/PB1 */ - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* D42/PB15 */ - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* D43/PB14 */ - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* D44/PB13 */ - {&gpioc, NULL, &adc1, 4, 0, 14}, /* D45/PC4 */ - // PMAP_ROW(&gpioa, 13, NULL, 0, NULL, ADCx), /* D41/PA13 do not use*/ - // PMAP_ROW(&gpioa, 14, NULL, 0, NULL, ADCx), /* D42/PA14 do not use*/ - // PMAP_ROW(&gpioa, 15, &timer2, 1, NULL, ADCx), /* D43/PA15 do not use*/ + {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* D22/PC10 */ + {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* D23/PC12 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* D24/PB7 */ + {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* D25/PC13 USER BLUE BUTTON */ + {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* D26/PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* D27/PC15 */ + {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* D28/PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* D29/PC3 */ + {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* D30/PC11 */ + {&gpiod, NULL, NULL, 2, 0, ADCx, 0}, /* D31/PD2 */ + {&gpioc, NULL, NULL, 9, 0, ADCx, 0}, /* D32/PC9 */ + {&gpioc, NULL, NULL, 8, 0, ADCx, 0}, /* D33/PC8 */ + {&gpioc, NULL, NULL, 6, 0, ADCx, 0}, /* D34/PC6 */ + {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* D35/PC5 */ + {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* D36/PA12 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* D37/PA11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* D38/PB12 */ + {&gpiob, &timer2, NULL, 11, 4, ADCx, 0}, /* D39/PB11 PWM-not working?*/ + {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* D40/PB2 BOOT1 !!*/ + {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* D41/PB1 */ + {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* D42/PB15 */ + {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* D43/PB14 */ + {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* D44/PB13 */ + {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* D45/PC4 */ + // PMAP_ROW(&gpioa, 13, NULL, 0, NULL, ADCx, 0), /* D41/PA13 do not use*/ + // PMAP_ROW(&gpioa, 14, NULL, 0, NULL, ADCx, 0), /* D42/PA14 do not use*/ + // PMAP_ROW(&gpioa, 15, &timer2, 1, NULL, ADCx, 0), /* D43/PA15 do not use*/ }; -#pragma GCC diagnostic pop // Array of pins you can use for pwmWrite(). Keep it in Flash because // it doesn't change, and so we don't waste RAM. diff --git a/STM32F3/cores/maple/wirish/boards_private.h b/STM32F3/cores/maple/wirish/boards_private.h index 49867ca77..332843ddf 100644 --- a/STM32F3/cores/maple/wirish/boards_private.h +++ b/STM32F3/cores/maple/wirish/boards_private.h @@ -42,7 +42,7 @@ /* Makes the PIN_MAP rows more human-readable. */ #define PMAP_ROW(gpio_dev, gpio_bit, timer_dev, timer_ch, adc_dev, adc_ch) \ - { gpio_dev, timer_dev, adc_dev, gpio_bit, timer_ch, adc_ch } + { gpio_dev, timer_dev, adc_dev, gpio_bit, timer_ch, adc_ch, 0} namespace wirish { namespace priv { From 048f15a2db84c44a55ec53d61121b348ce116619 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 17 Nov 2017 11:16:48 +0100 Subject: [PATCH 235/307] Fixed a comment --- STM32F1/variants/nucleo_f103rb/board.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STM32F1/variants/nucleo_f103rb/board.cpp b/STM32F1/variants/nucleo_f103rb/board.cpp index 5e2672cfc..a70a188ca 100644 --- a/STM32F1/variants/nucleo_f103rb/board.cpp +++ b/STM32F1/variants/nucleo_f103rb/board.cpp @@ -145,9 +145,9 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* D43/PB14 */ {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* D44/PB13 */ {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* D45/PC4 */ - // PMAP_ROW(&gpioa, 13, NULL, 0, NULL, ADCx, 0), /* D41/PA13 do not use*/ - // PMAP_ROW(&gpioa, 14, NULL, 0, NULL, ADCx, 0), /* D42/PA14 do not use*/ - // PMAP_ROW(&gpioa, 15, &timer2, 1, NULL, ADCx, 0), /* D43/PA15 do not use*/ + // PMAP_ROW(&gpioa, 13, NULL, 0, NULL, ADCx), /* D41/PA13 do not use*/ + // PMAP_ROW(&gpioa, 14, NULL, 0, NULL, ADCx), /* D42/PA14 do not use*/ + // PMAP_ROW(&gpioa, 15, &timer2, 1, NULL, ADCx), /* D43/PA15 do not use*/ }; // Array of pins you can use for pwmWrite(). Keep it in Flash because From 719ab20a5fb1bd6cc77e300fe32278a48c7ee83f Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 17 Nov 2017 14:44:01 +0100 Subject: [PATCH 236/307] Rollback on __attribute__((unused)) for pulseIn() --- STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp b/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp index d9287b07b..9ca4d7fb8 100644 --- a/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp +++ b/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp @@ -26,7 +26,7 @@ * to be slighly more accurate the maxLoops variable really needs to take into account the loop setup code, but its probably as good as necessary * */ -uint32_t pulseIn( uint32_t pin, uint32_t state __attribute__((unused)), uint32_t timeout ) +uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) { // cache the port and bit of the pin in order to speed up the // pulse width measuring loop and achieve finer resolution. calling From b64029f1db45e22f639bd3b882285dc06a0ed01c Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Sat, 18 Nov 2017 12:37:11 +0100 Subject: [PATCH 237/307] Rollback WireBase.begin() --- STM32F1/libraries/Wire/WireBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Wire/WireBase.cpp b/STM32F1/libraries/Wire/WireBase.cpp index eaa7f91ad..220d845d7 100644 --- a/STM32F1/libraries/Wire/WireBase.cpp +++ b/STM32F1/libraries/Wire/WireBase.cpp @@ -41,7 +41,7 @@ #include "WireBase.h" #include "wirish.h" -void WireBase::begin(uint8 self_addr __attribute__((unused))) { +void WireBase::begin(uint8 self_addr) { tx_buf_idx = 0; tx_buf_overflow = false; rx_buf_idx = 0; From 4a84203917deb692d65175c7c07c83893732861b Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Sat, 18 Nov 2017 21:08:20 +0100 Subject: [PATCH 238/307] Modified pulseIn() to use the state parameter --- .../cores/maple/stm32f1/wiring_pulse_f1.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp b/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp index 9ca4d7fb8..32ecc07d0 100644 --- a/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp +++ b/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp @@ -1,5 +1,6 @@ #include #include "boards.h" +#include "variant.h" /* Measures the length (in microseconds) of a pulse on the pin; state is HIGH * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds * to 3 minutes in length, but must be called at least a few dozen microseconds @@ -28,13 +29,13 @@ */ uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) { - // cache the port and bit of the pin in order to speed up the + // cache the reg map and bit of the pin in order to speed up the // pulse width measuring loop and achieve finer resolution. calling // digitalRead() instead yields much coarser resolution. - gpio_dev *dev=PIN_MAP[pin].gpio_device; - uint32_t bit = (1U << PIN_MAP[pin].gpio_bit); - + const gpio_reg_map * const regs = digitalPinToPort(pin)->regs; + const uint32_t bit = digitalPinToBitMask(pin); + const uint32_t stateMask = (state ? bit:0); uint32_t width = 0; // keep initialization out of time critical area @@ -45,23 +46,23 @@ uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) volatile uint32_t dummyWidth=0; // wait for any previous pulse to end - while ( (dev->regs->IDR & bit) == bit) { + while ((regs->IDR & bit) == stateMask) { if (numloops++ == maxloops) { return 0; } - dummyWidth++; + dummyWidth++; } // wait for the pulse to start - while ((dev->regs->IDR & bit) != bit) { + while ((regs->IDR & bit) != stateMask) { if (numloops++ == maxloops) { return 0; } - dummyWidth++; + dummyWidth++; } // wait for the pulse to stop - while ((dev->regs->IDR & bit) == bit) { + while ((regs->IDR & bit) == stateMask) { if (numloops++ == maxloops) { return 0; } From 0f6d90943adcfe12ddd69a998d47e5dc2dabb566 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Sun, 19 Nov 2017 09:39:29 +0100 Subject: [PATCH 239/307] Caching IDR pointer --- STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp b/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp index 32ecc07d0..5a5d8358e 100644 --- a/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp +++ b/STM32F1/cores/maple/stm32f1/wiring_pulse_f1.cpp @@ -29,11 +29,11 @@ */ uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) { - // cache the reg map and bit of the pin in order to speed up the + // cache the IDR address and bit of the pin in order to speed up the // pulse width measuring loop and achieve finer resolution. calling // digitalRead() instead yields much coarser resolution. - const gpio_reg_map * const regs = digitalPinToPort(pin)->regs; + __io uint32_t * const idr = portInputRegister(digitalPinToPort(pin)); const uint32_t bit = digitalPinToBitMask(pin); const uint32_t stateMask = (state ? bit:0); @@ -46,7 +46,7 @@ uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) volatile uint32_t dummyWidth=0; // wait for any previous pulse to end - while ((regs->IDR & bit) == stateMask) { + while ((*idr & bit) == stateMask) { if (numloops++ == maxloops) { return 0; } @@ -54,7 +54,7 @@ uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) } // wait for the pulse to start - while ((regs->IDR & bit) != stateMask) { + while ((*idr & bit) != stateMask) { if (numloops++ == maxloops) { return 0; } @@ -62,7 +62,7 @@ uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) } // wait for the pulse to stop - while ((regs->IDR & bit) == stateMask) { + while ((*idr & bit) == stateMask) { if (numloops++ == maxloops) { return 0; } From e961f5bb18971c6b84f2b25986e5b3030ce7d3cd Mon Sep 17 00:00:00 2001 From: topin89 Date: Tue, 21 Nov 2017 16:48:45 +0300 Subject: [PATCH 240/307] Update HardwareTimer.h documentation. "attachInterrupt" and "attachInterrupt" functions can attach ISRs to channel 0, which is overflow interrupt (update interrupt in RMs). --- STM32F1/cores/maple/HardwareTimer.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/STM32F1/cores/maple/HardwareTimer.h b/STM32F1/cores/maple/HardwareTimer.h index d5356ca21..bb40dba0f 100644 --- a/STM32F1/cores/maple/HardwareTimer.h +++ b/STM32F1/cores/maple/HardwareTimer.h @@ -177,7 +177,8 @@ class HardwareTimer { * This interrupt handler will be called when the timer's counter * reaches the given channel compare value. * - * @param channel the channel to attach the ISR to, from 1 to 4. + * @param channel the channel to attach the ISR to, from 0 to 4. + * Channel 0 is for overflow interrupt (update interrupt). * @param handler The ISR to attach to the given channel. * @see voidFuncPtr */ @@ -189,7 +190,8 @@ class HardwareTimer { * * The handler will no longer be called by this timer. * - * @param channel the channel whose interrupt to detach, from 1 to 4. + * @param channel the channel whose interrupt to detach, from 0 to 4. + * Channel 0 is for overflow interrupt (update interrupt). * @see HardwareTimer::attachInterrupt() */ void detachInterrupt(int channel); From 023fdfb0e9cb6acf367a1fe6b8bccafd815efc8b Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sun, 26 Nov 2017 10:37:22 +0100 Subject: [PATCH 241/307] Update TimerInterrupts.ino - replace deprecated function --- .../Maple/TimerInterrupts/TimerInterrupts.ino | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/STM32F1/libraries/A_STM32_Examples/examples/Maple/TimerInterrupts/TimerInterrupts.ino b/STM32F1/libraries/A_STM32_Examples/examples/Maple/TimerInterrupts/TimerInterrupts.ino index e973358bc..38eb7d0ee 100644 --- a/STM32F1/libraries/A_STM32_Examples/examples/Maple/TimerInterrupts/TimerInterrupts.ino +++ b/STM32F1/libraries/A_STM32_Examples/examples/Maple/TimerInterrupts/TimerInterrupts.ino @@ -32,24 +32,24 @@ void setup() pinMode(BUTTON_PIN, INPUT_PULLUP); // Setup LED Timer - Timer2.setChannel1Mode(TIMER_OUTPUTCOMPARE); + Timer2.setMode(TIMER_CH1, TIMER_OUTPUTCOMPARE); Timer2.setPeriod(LED_RATE); // in microseconds - Timer2.setCompare1(1); // overflow might be small - Timer2.attachCompare1Interrupt(handler_led); + Timer2.setCompare(TIMER_CH1, 1); // overflow might be small + Timer2.attachInterrupt(TIMER_CH1, handler_led); // Setup Counting Timers - Timer3.setChannel1Mode(TIMER_OUTPUTCOMPARE); - Timer4.setChannel1Mode(TIMER_OUTPUTCOMPARE); + Timer3.setMode(TIMER_CH1, TIMER_OUTPUTCOMPARE); + Timer4.setMode(TIMER_CH1, TIMER_OUTPUTCOMPARE); Timer3.pause(); Timer4.pause(); Timer3.setCount(0); Timer4.setCount(0); Timer3.setOverflow(30000); Timer4.setOverflow(30000); - Timer3.setCompare1(1000); // somewhere in the middle - Timer4.setCompare1(1000); - Timer3.attachCompare1Interrupt(handler1); - Timer4.attachCompare1Interrupt(handler2); + Timer3.setCompare(TIMER_CH1, 1000); // somewhere in the middle + Timer4.setCompare(TIMER_CH1, 1000); + Timer3.attachInterrupt(TIMER_CH1, handler1); + Timer4.attachInterrupt(TIMER_CH1, handler2); Timer3.resume(); Timer4.resume(); From bee82cb7c62be8b109a88c097d79fb9dc98ee206 Mon Sep 17 00:00:00 2001 From: victorpv Date: Sun, 26 Nov 2017 09:29:15 -0600 Subject: [PATCH 242/307] Correct a bug in FreeRTOS As listed in https://www.freertos.org/a00104.html#mailing_list: "The definition of the StaticTask_t structure is incorrect if INCLUDE_xTaskAbortDelay is set to 1, or the MPU is used. The corrected structure definition can be obtained from here." https://sourceforge.net/p/freertos/code/HEAD/tree/trunk/FreeRTOS/Source/include/FreeRTOS.h#l978 --- STM32F1/libraries/FreeRTOS900/utility/FreeRTOS.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/STM32F1/libraries/FreeRTOS900/utility/FreeRTOS.h b/STM32F1/libraries/FreeRTOS900/utility/FreeRTOS.h index f81172dbe..6838f4746 100644 --- a/STM32F1/libraries/FreeRTOS900/utility/FreeRTOS.h +++ b/STM32F1/libraries/FreeRTOS900/utility/FreeRTOS.h @@ -948,6 +948,9 @@ typedef struct xSTATIC_TCB #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) uint8_t uxDummy20; #endif + #if( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDummy21; + #endif } StaticTask_t; From aebb14f26cd8fa90ad3a187085f165f46b7867de Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 1 Dec 2017 16:54:16 +0100 Subject: [PATCH 243/307] Rollback to master --- STM32F1/cores/maple/boards_private.h | 2 +- STM32F1/variants/STM32VLD/board.cpp | 109 ++++---- STM32F1/variants/generic_gd32f103c/board.cpp | 75 +++--- STM32F1/variants/generic_stm32f103c/board.cpp | 76 +++--- STM32F1/variants/generic_stm32f103r/board.cpp | 109 ++++---- .../variants/generic_stm32f103r8/board.cpp | 105 ++++---- STM32F1/variants/generic_stm32f103t/board.cpp | 49 ++-- STM32F1/variants/generic_stm32f103v/board.cpp | 167 ++++++------- STM32F1/variants/generic_stm32f103z/board.cpp | 234 +++++++++--------- STM32F1/variants/hytiny_stm32f103t/board.cpp | 49 ++-- STM32F1/variants/maple_mini/board.cpp | 70 +++--- STM32F1/variants/maple_ret6/board.cpp | 100 ++++---- STM32F1/variants/microduino/board.cpp | 54 ++-- STM32F1/variants/nucleo_f103rb/board.cpp | 94 +++---- STM32F3/cores/maple/wirish/boards_private.h | 2 +- 15 files changed, 654 insertions(+), 641 deletions(-) diff --git a/STM32F1/cores/maple/boards_private.h b/STM32F1/cores/maple/boards_private.h index 332843ddf..49867ca77 100644 --- a/STM32F1/cores/maple/boards_private.h +++ b/STM32F1/cores/maple/boards_private.h @@ -42,7 +42,7 @@ /* Makes the PIN_MAP rows more human-readable. */ #define PMAP_ROW(gpio_dev, gpio_bit, timer_dev, timer_ch, adc_dev, adc_ch) \ - { gpio_dev, timer_dev, adc_dev, gpio_bit, timer_ch, adc_ch, 0} + { gpio_dev, timer_dev, adc_dev, gpio_bit, timer_ch, adc_ch } namespace wirish { namespace priv { diff --git a/STM32F1/variants/STM32VLD/board.cpp b/STM32F1/variants/STM32VLD/board.cpp index 182e8f721..1cecbd932 100644 --- a/STM32F1/variants/STM32VLD/board.cpp +++ b/STM32F1/variants/STM32VLD/board.cpp @@ -51,66 +51,67 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h + extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ - {&gpioa, NULL, NULL, 11, 0, ADCx, 0}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ /* Andy Hull - the R8 is similar to the C8 but exposes more GPIO as follows */ - {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* PC5 */ - - {&gpioc, NULL, NULL, 6, 0, ADCx, 0}, /* PC6 */ - {&gpioc, NULL, NULL, 7, 0, ADCx, 0}, /* PC7 */ - {&gpioc, NULL, NULL, 8, 0, ADCx, 0}, /* PC8 */ - {&gpioc, NULL, NULL, 9, 0, ADCx, 0}, /* PC9 */ - - {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* PC10 */ - {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* PC11 */ - {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* PC12 */ - {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 */ - {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 */ - {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 */ - - {&gpiod, NULL, NULL, 0, 0, ADCx, 0}, /* PD2 */ - {&gpiod, NULL, NULL, 1, 0, ADCx, 0}, /* PD2 */ - {&gpiod, NULL, NULL, 2, 0, ADCx, 0}, /* PD2 */ + {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ + + {&gpioc, NULL, NULL, 6, 0, ADCx}, /* PC6 */ + {&gpioc, NULL, NULL, 7, 0, ADCx}, /* PC7 */ + {&gpioc, NULL, NULL, 8, 0, ADCx}, /* PC8 */ + {&gpioc, NULL, NULL, 9, 0, ADCx}, /* PC9 */ + + {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 */ + {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 */ + {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 */ + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ + + {&gpiod, NULL, NULL, 0, 0, ADCx}, /* PD2 */ + {&gpiod, NULL, NULL, 1, 0, ADCx}, /* PD2 */ + {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 */ }; extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F1/variants/generic_gd32f103c/board.cpp b/STM32F1/variants/generic_gd32f103c/board.cpp index da22d526b..8b136f2a1 100644 --- a/STM32F1/variants/generic_gd32f103c/board.cpp +++ b/STM32F1/variants/generic_gd32f103c/board.cpp @@ -51,46 +51,49 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h + extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ - - {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 */ - {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 */ - {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ + + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ + + }; diff --git a/STM32F1/variants/generic_stm32f103c/board.cpp b/STM32F1/variants/generic_stm32f103c/board.cpp index 7b33ba858..7102adb9c 100644 --- a/STM32F1/variants/generic_stm32f103c/board.cpp +++ b/STM32F1/variants/generic_stm32f103c/board.cpp @@ -51,46 +51,50 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h + extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ - - {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 */ - {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 */ - {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ + + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ + + + }; extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F1/variants/generic_stm32f103r/board.cpp b/STM32F1/variants/generic_stm32f103r/board.cpp index e564425d0..3e3589c23 100644 --- a/STM32F1/variants/generic_stm32f103r/board.cpp +++ b/STM32F1/variants/generic_stm32f103r/board.cpp @@ -69,6 +69,7 @@ void boardInit(void) { // - Timer channel (1 to 4, for PWM), or 0 if none // - ADC device, or NULL if none // - ADC channel, or ADCx if none + extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* gpio_dev *gpio_device; GPIO device @@ -80,61 +81,61 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { uint8 pinMode; mode specific by pinMode call (Roger Clark added to optimize compatibility with Arduino API */ - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ - {&gpioa, NULL, NULL, 11, 0, ADCx, 0}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ - {&gpiob, NULL, NULL, 9, 0, ADCx, 0}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ - - - {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* PC5 */ - {&gpioc, &timer8, NULL, 6, 1, ADCx, 0}, /* PC6 */ - {&gpioc, &timer8, NULL, 7, 2, ADCx, 0}, /* PC7 */ - {&gpioc, &timer8, NULL, 8, 3, ADCx, 0}, /* PC8 */ - {&gpioc, &timer8, NULL, 9, 4, ADCx, 0}, /* PC9 */ - {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* PC10 UART4_TX/SDIO_D2 */ - {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* PC11 UART4_RX/SDIO_D3 */ - {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* PC12 UART5_TX/SDIO_CK */ - {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 TAMPER-RTC */ - {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 OSC32_IN */ - {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 OSC32_OUT */ - - {&gpiod, NULL, NULL, 0, 0, ADCx, 0} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx, 0} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx, 0} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ + {&gpiob, NULL, NULL, 9, 0, ADCx}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ + + + {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ + {&gpioc, &timer8, NULL, 6, 1, ADCx}, /* PC6 */ + {&gpioc, &timer8, NULL, 7, 2, ADCx}, /* PC7 */ + {&gpioc, &timer8, NULL, 8, 3, ADCx}, /* PC8 */ + {&gpioc, &timer8, NULL, 9, 4, ADCx}, /* PC9 */ + {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */ + {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */ + {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */ + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ + + {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ }; /* Basically everything that is defined as having a timer us PWM */ diff --git a/STM32F1/variants/generic_stm32f103r8/board.cpp b/STM32F1/variants/generic_stm32f103r8/board.cpp index f667d2fe7..05f85a5cc 100644 --- a/STM32F1/variants/generic_stm32f103r8/board.cpp +++ b/STM32F1/variants/generic_stm32f103r8/board.cpp @@ -51,64 +51,65 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h + extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ /* Andy Hull - the R8 is similar to the C8 but exposes more GPIO as follows */ - {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* PC5 */ - - {&gpioc, NULL, NULL, 6, 0, ADCx, 0}, /* PC6 */ - {&gpioc, NULL, NULL, 7, 0, ADCx, 0}, /* PC7 */ - {&gpioc, NULL, NULL, 8, 0, ADCx, 0}, /* PC8 */ - {&gpioc, NULL, NULL, 9, 0, ADCx, 0}, /* PC9 */ - - {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* PC10 */ - {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* PC11 */ - {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* PC12 */ - {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 */ - {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 */ - {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 */ - - {&gpiod, NULL, NULL, 2, 0, ADCx, 0}, /* PD2 */ + {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ + + {&gpioc, NULL, NULL, 6, 0, ADCx}, /* PC6 */ + {&gpioc, NULL, NULL, 7, 0, ADCx}, /* PC7 */ + {&gpioc, NULL, NULL, 8, 0, ADCx}, /* PC8 */ + {&gpioc, NULL, NULL, 9, 0, ADCx}, /* PC9 */ + + {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 */ + {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 */ + {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 */ + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */ + + {&gpiod, NULL, NULL, 2, 0, ADCx}, /* PD2 */ }; extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F1/variants/generic_stm32f103t/board.cpp b/STM32F1/variants/generic_stm32f103t/board.cpp index 85c252c4d..e7a1dc0e0 100644 --- a/STM32F1/variants/generic_stm32f103t/board.cpp +++ b/STM32F1/variants/generic_stm32f103t/board.cpp @@ -51,34 +51,35 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h + extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ }; extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F1/variants/generic_stm32f103v/board.cpp b/STM32F1/variants/generic_stm32f103v/board.cpp index a6b31655e..9c137725a 100644 --- a/STM32F1/variants/generic_stm32f103v/board.cpp +++ b/STM32F1/variants/generic_stm32f103v/board.cpp @@ -68,6 +68,7 @@ void boardInit(void) { // - Timer channel (1 to 4, for PWM), or 0 if none // - ADC device, or NULL if none // - ADC channel, or ADCx if none + extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* gpio_dev *gpio_device; GPIO device @@ -78,91 +79,91 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { uint8 adc_channel; Pin ADC channel, or ADCx if none. */ - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ - {&gpioa, NULL, NULL, 11, 0, ADCx, 0}, /* PA11 */ //Could have &timer1_CH4, but is also CAN_RX and USBDM - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ //Could have &timer1_ETR, but is also CAN_TX and USBDP - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ //SPI3_NSS + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ //Could have &timer1_CH4, but is also CAN_RX and USBDM + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ //Could have &timer1_ETR, but is also CAN_TX and USBDP + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ //SPI3_NSS - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ /* NOTE PB2 is not included as its Boot 1 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ //JTDO, SPI3_SCK / I2S3_CK/ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ //NJTRST, SPI3_MISO - {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ //I2C1_SMBA/ SPI3_MOSI - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ //I2C1_SCL(9) - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ //I2C1_SDA(9) / FSMC_NADV - {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ //SDIO_D4 - {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ //SDIO_D5 - {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ //I2C2_SCL/USART3_TX - {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ //I2C2_SDA/USART3_RX - {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ //SPI2_NSS/I2S2_WS/I2C2_SMBA/USART3_CK - {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ //SPI2_SCK/I2S2_CK/USART3_CTS - {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ //SPI2_MISO/TIM1_CH2N/USART3_RTS - {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ //SPI2_MOSI/I2S2_SD - - - {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* PC5 */ - {&gpioc, &timer8, NULL, 6, 1, ADCx, 0}, /* PC6 I2S2_MCK/SDIO_D6*/ - {&gpioc, &timer8, NULL, 7, 2, ADCx, 0}, /* PC7 I2S3_MCK/SDIO_D7*/ - {&gpioc, &timer8, NULL, 8, 3, ADCx, 0}, /* PC8 SDIO_D0*/ - {&gpioc, &timer8, NULL, 9, 4, ADCx, 0}, /* PC9 SDIO_D1*/ - {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* PC10 UART4_TX/SDIO_D2 */ - {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* PC11 UART4_RX/SDIO_D3 */ - {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* PC12 UART5_TX/SDIO_CK */ - {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 TAMPER-RTC/ Limited output*/ - {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 OSC32_IN/ Limited output*/ - {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 OSC32_OUT/ Limited output*/ - - {&gpiod, NULL, NULL, 0, 0, ADCx, 0} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx, 0} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx, 0} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ - {&gpiod, NULL, NULL, 3, 0, ADCx, 0} , /* PD3 FSMC_CLK */ - {&gpiod, NULL, NULL, 4, 0, ADCx, 0} , /* PD4 FSMC_NOE */ - {&gpiod, NULL, NULL, 5, 0, ADCx, 0} , /* PD5 FSMC_NWE */ - {&gpiod, NULL, NULL, 6, 0, ADCx, 0} , /* PD6 FSMC_NWAIT */ - {&gpiod, NULL, NULL, 7, 0, ADCx, 0} , /* PD7 FSMC_NE1/FSMC_NCE2 */ - {&gpiod, NULL, NULL, 8, 0, ADCx, 0} , /* PD8 FSMC_D13 */ - {&gpiod, NULL, NULL, 9, 0, ADCx, 0} , /* PD9 FSMC_D14 */ - {&gpiod, NULL, NULL, 10, 0, ADCx, 0} , /* PD10 FSMC_D15 */ - {&gpiod, NULL, NULL, 11, 0, ADCx, 0} , /* PD11 FSMC_A16 */ - {&gpiod, NULL, NULL, 12, 0, ADCx, 0} , /* PD12 FSMC_A17 */ - {&gpiod, NULL, NULL, 13, 0, ADCx, 0} , /* PD13 FSMC_A18 */ - {&gpiod, NULL, NULL, 14, 0, ADCx, 0} , /* PD14 FSMC_D0 */ - {&gpiod, NULL, NULL, 15, 0, ADCx, 0} , /* PD15 FSMC_D1 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ //JTDO, SPI3_SCK / I2S3_CK/ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ //NJTRST, SPI3_MISO + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ //I2C1_SMBA/ SPI3_MOSI + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ //I2C1_SCL(9) + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ //I2C1_SDA(9) / FSMC_NADV + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ //SDIO_D4 + {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ //SDIO_D5 + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ //I2C2_SCL/USART3_TX + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ //I2C2_SDA/USART3_RX + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ //SPI2_NSS/I2S2_WS/I2C2_SMBA/USART3_CK + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ //SPI2_SCK/I2S2_CK/USART3_CTS + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ //SPI2_MISO/TIM1_CH2N/USART3_RTS + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ //SPI2_MOSI/I2S2_SD + + + {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ + {&gpioc, &timer8, NULL, 6, 1, ADCx}, /* PC6 I2S2_MCK/SDIO_D6*/ + {&gpioc, &timer8, NULL, 7, 2, ADCx}, /* PC7 I2S3_MCK/SDIO_D7*/ + {&gpioc, &timer8, NULL, 8, 3, ADCx}, /* PC8 SDIO_D0*/ + {&gpioc, &timer8, NULL, 9, 4, ADCx}, /* PC9 SDIO_D1*/ + {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */ + {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */ + {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */ + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC/ Limited output*/ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN/ Limited output*/ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT/ Limited output*/ + + {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + {&gpiod, NULL, NULL, 3, 0, ADCx} , /* PD3 FSMC_CLK */ + {&gpiod, NULL, NULL, 4, 0, ADCx} , /* PD4 FSMC_NOE */ + {&gpiod, NULL, NULL, 5, 0, ADCx} , /* PD5 FSMC_NWE */ + {&gpiod, NULL, NULL, 6, 0, ADCx} , /* PD6 FSMC_NWAIT */ + {&gpiod, NULL, NULL, 7, 0, ADCx} , /* PD7 FSMC_NE1/FSMC_NCE2 */ + {&gpiod, NULL, NULL, 8, 0, ADCx} , /* PD8 FSMC_D13 */ + {&gpiod, NULL, NULL, 9, 0, ADCx} , /* PD9 FSMC_D14 */ + {&gpiod, NULL, NULL, 10, 0, ADCx} , /* PD10 FSMC_D15 */ + {&gpiod, NULL, NULL, 11, 0, ADCx} , /* PD11 FSMC_A16 */ + {&gpiod, NULL, NULL, 12, 0, ADCx} , /* PD12 FSMC_A17 */ + {&gpiod, NULL, NULL, 13, 0, ADCx} , /* PD13 FSMC_A18 */ + {&gpiod, NULL, NULL, 14, 0, ADCx} , /* PD14 FSMC_D0 */ + {&gpiod, NULL, NULL, 15, 0, ADCx} , /* PD15 FSMC_D1 */ - {&gpioe, NULL, NULL, 0, 0, ADCx, 0} , /* PE0 TIM4_ETR / FSMC_NBL0 */ - {&gpioe, NULL, NULL, 1, 0, ADCx, 0} , /* PE1 FSMC_NBL1 */ - {&gpioe, NULL, NULL, 2, 0, ADCx, 0} , /* PE2 TRACECK/ FSMC_A23 */ - {&gpioe, NULL, NULL, 3, 0, ADCx, 0} , /* PE3 TRACED0/FSMC_A19 */ - {&gpioe, NULL, NULL, 4, 0, ADCx, 0} , /* PE4 TRACED1/FSMC_A20 */ - {&gpioe, NULL, NULL, 5, 0, ADCx, 0} , /* PE5 TRACED2/FSMC_A21 */ - {&gpioe, NULL, NULL, 6, 0, ADCx, 0} , /* PE6 TRACED3/FSMC_A22 */ - {&gpioe, NULL, NULL, 7, 0, ADCx, 0} , /* PE7 FSMC_D4 */ - {&gpioe, NULL, NULL, 8, 0, ADCx, 0} , /* PE8 FSMC_D5 */ - {&gpioe, NULL, NULL, 9, 0, ADCx, 0} , /* PE9 FSMC_D6 */ - {&gpioe, NULL, NULL, 10, 0, ADCx, 0} , /* PE10 FSMC_D7 */ - {&gpioe, NULL, NULL, 11, 0, ADCx, 0} , /* PE11 FSMC_D8 */ - {&gpioe, NULL, NULL, 12, 0, ADCx, 0} , /* PE12 FSMC_D9 */ - {&gpioe, NULL, NULL, 13, 0, ADCx, 0} , /* PE13 FSMC_D10 */ - {&gpioe, NULL, NULL, 14, 0, ADCx, 0} , /* PE14 FSMC_D11 */ - {&gpioe, NULL, NULL, 15, 0, ADCx, 0} , /* PE15 FSMC_D12 */ + {&gpioe, NULL, NULL, 0, 0, ADCx} , /* PE0 TIM4_ETR / FSMC_NBL0 */ + {&gpioe, NULL, NULL, 1, 0, ADCx} , /* PE1 FSMC_NBL1 */ + {&gpioe, NULL, NULL, 2, 0, ADCx} , /* PE2 TRACECK/ FSMC_A23 */ + {&gpioe, NULL, NULL, 3, 0, ADCx} , /* PE3 TRACED0/FSMC_A19 */ + {&gpioe, NULL, NULL, 4, 0, ADCx} , /* PE4 TRACED1/FSMC_A20 */ + {&gpioe, NULL, NULL, 5, 0, ADCx} , /* PE5 TRACED2/FSMC_A21 */ + {&gpioe, NULL, NULL, 6, 0, ADCx} , /* PE6 TRACED3/FSMC_A22 */ + {&gpioe, NULL, NULL, 7, 0, ADCx} , /* PE7 FSMC_D4 */ + {&gpioe, NULL, NULL, 8, 0, ADCx} , /* PE8 FSMC_D5 */ + {&gpioe, NULL, NULL, 9, 0, ADCx} , /* PE9 FSMC_D6 */ + {&gpioe, NULL, NULL, 10, 0, ADCx} , /* PE10 FSMC_D7 */ + {&gpioe, NULL, NULL, 11, 0, ADCx} , /* PE11 FSMC_D8 */ + {&gpioe, NULL, NULL, 12, 0, ADCx} , /* PE12 FSMC_D9 */ + {&gpioe, NULL, NULL, 13, 0, ADCx} , /* PE13 FSMC_D10 */ + {&gpioe, NULL, NULL, 14, 0, ADCx} , /* PE14 FSMC_D11 */ + {&gpioe, NULL, NULL, 15, 0, ADCx} , /* PE15 FSMC_D12 */ }; @@ -195,4 +196,4 @@ extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { DEFINE_HWSERIAL(Serial2, 3); DEFINE_HWSERIAL_UART(Serial3, 4); DEFINE_HWSERIAL_UART(Serial4, 5); -#endif +#endif \ No newline at end of file diff --git a/STM32F1/variants/generic_stm32f103z/board.cpp b/STM32F1/variants/generic_stm32f103z/board.cpp index 0d112a32b..830479e96 100644 --- a/STM32F1/variants/generic_stm32f103z/board.cpp +++ b/STM32F1/variants/generic_stm32f103z/board.cpp @@ -80,126 +80,126 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { uint8 pinMode; mode specific by pinMode call (Roger Clark added to optimize compatibility with Arduino API */ - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ - {&gpioa, NULL, NULL, 11, 0, ADCx, 0}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ - {&gpiob, &timer3, &adc1, 2, 4, 9, 0}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* PB15 */ - - - {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* PC5 */ - {&gpioc, &timer8, NULL, 6, 1, ADCx, 0}, /* PC6 */ - {&gpioc, &timer8, NULL, 7, 2, ADCx, 0}, /* PC7 */ - {&gpioc, &timer8, NULL, 8, 3, ADCx, 0}, /* PC8 */ - {&gpioc, &timer8, NULL, 9, 4, ADCx, 0}, /* PC9 */ - {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* PC10 UART4_TX/SDIO_D2 */ - {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* PC11 UART4_RX/SDIO_D3 */ - {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* PC12 UART5_TX/SDIO_CK */ - {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* PC13 TAMPER-RTC */ - {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* PC14 OSC32_IN */ - {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* PC15 OSC32_OUT */ - - {&gpiod, NULL, NULL, 0, 0, ADCx, 0} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx, 0} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx, 0} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, &timer3, &adc1, 2, 4, 9}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ + + + {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ + {&gpioc, &timer8, NULL, 6, 1, ADCx}, /* PC6 */ + {&gpioc, &timer8, NULL, 7, 2, ADCx}, /* PC7 */ + {&gpioc, &timer8, NULL, 8, 3, ADCx}, /* PC8 */ + {&gpioc, &timer8, NULL, 9, 4, ADCx}, /* PC9 */ + {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */ + {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */ + {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */ + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ + + {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ - {&gpiod, NULL, NULL, 3, 0, ADCx, 0} , /* PD3 FSMC_CLK */ - {&gpiod, NULL, NULL, 4, 0, ADCx, 0} , /* PD4 FSMC_NOE */ - {&gpiod, NULL, NULL, 5, 0, ADCx, 0} , /* PD5 FSMC_NWE */ - {&gpiod, NULL, NULL, 6, 0, ADCx, 0} , /* PD6 FSMC_NWAIT */ - {&gpiod, NULL, NULL, 7, 0, ADCx, 0} , /* PD7 FSMC_NE1/FSMC_NCE2 */ - {&gpiod, NULL, NULL, 8, 0, ADCx, 0} , /* PD8 FSMC_D13 */ - {&gpiod, NULL, NULL, 9, 0, ADCx, 0} , /* PD9 FSMC_D14 */ - {&gpiod, NULL, NULL, 10, 0, ADCx, 0} , /* PD10 FSMC_D15 */ - {&gpiod, NULL, NULL, 11, 0, ADCx, 0} , /* PD11 FSMC_A16 */ - {&gpiod, NULL, NULL, 12, 0, ADCx, 0} , /* PD12 FSMC_A17 */ - {&gpiod, NULL, NULL, 13, 0, ADCx, 0} , /* PD13 FSMC_A18 */ - {&gpiod, NULL, NULL, 14, 0, ADCx, 0} , /* PD14 FSMC_D0 */ - {&gpiod, NULL, NULL, 15, 0, ADCx, 0} , /* PD15 FSMC_D1 */ + {&gpiod, NULL, NULL, 3, 0, ADCx} , /* PD3 FSMC_CLK */ + {&gpiod, NULL, NULL, 4, 0, ADCx} , /* PD4 FSMC_NOE */ + {&gpiod, NULL, NULL, 5, 0, ADCx} , /* PD5 FSMC_NWE */ + {&gpiod, NULL, NULL, 6, 0, ADCx} , /* PD6 FSMC_NWAIT */ + {&gpiod, NULL, NULL, 7, 0, ADCx} , /* PD7 FSMC_NE1/FSMC_NCE2 */ + {&gpiod, NULL, NULL, 8, 0, ADCx} , /* PD8 FSMC_D13 */ + {&gpiod, NULL, NULL, 9, 0, ADCx} , /* PD9 FSMC_D14 */ + {&gpiod, NULL, NULL, 10, 0, ADCx} , /* PD10 FSMC_D15 */ + {&gpiod, NULL, NULL, 11, 0, ADCx} , /* PD11 FSMC_A16 */ + {&gpiod, NULL, NULL, 12, 0, ADCx} , /* PD12 FSMC_A17 */ + {&gpiod, NULL, NULL, 13, 0, ADCx} , /* PD13 FSMC_A18 */ + {&gpiod, NULL, NULL, 14, 0, ADCx} , /* PD14 FSMC_D0 */ + {&gpiod, NULL, NULL, 15, 0, ADCx} , /* PD15 FSMC_D1 */ - {&gpioe, NULL, NULL, 0, 0, ADCx, 0} , /* PE0 */ - {&gpioe, NULL, NULL, 1, 0, ADCx, 0} , /* PE1 */ - {&gpioe, NULL, NULL, 2, 0, ADCx, 0} , /* PE2 */ - {&gpioe, NULL, NULL, 3, 0, ADCx, 0} , /* PE3 */ - {&gpioe, NULL, NULL, 4, 0, ADCx, 0} , /* PE4 */ - {&gpioe, NULL, NULL, 5, 0, ADCx, 0} , /* PE5 */ - {&gpioe, NULL, NULL, 6, 0, ADCx, 0} , /* PE6 */ - {&gpioe, NULL, NULL, 7, 0, ADCx, 0} , /* PE7 */ - {&gpioe, NULL, NULL, 8, 0, ADCx, 0} , /* PE8 */ - {&gpioe, NULL, NULL, 9, 0, ADCx, 0} , /* PE9 */ - {&gpioe, NULL, NULL, 10, 0, ADCx, 0} , /* PE10 */ - {&gpioe, NULL, NULL, 11, 0, ADCx, 0} , /* PE11 */ - {&gpioe, NULL, NULL, 12, 0, ADCx, 0} , /* PE12 */ - {&gpioe, NULL, NULL, 13, 0, ADCx, 0} , /* PE13 */ - {&gpioe, NULL, NULL, 14, 0, ADCx, 0} , /* PE14 */ - {&gpioe, NULL, NULL, 15, 0, ADCx, 0} , /* PE15 */ - - {&gpiof, NULL, NULL, 0, 0, ADCx, 0} , /* PF0 */ - {&gpiof, NULL, NULL, 1, 0, ADCx, 0} , /* PF1 */ - {&gpiof, NULL, NULL, 2, 0, ADCx, 0} , /* PF2 */ - {&gpiof, NULL, NULL, 3, 0, ADCx, 0} , /* PF3 */ - {&gpiof, NULL, NULL, 4, 0, ADCx, 0} , /* PF4 */ - {&gpiof, NULL, NULL, 5, 0, ADCx, 0} , /* PF5 */ - {&gpiof, NULL, NULL, 6, 0, ADCx, 0} , /* PF6 */ - {&gpiof, NULL, NULL, 7, 0, ADCx, 0} , /* PF7 */ - {&gpiof, NULL, NULL, 8, 0, ADCx, 0} , /* PF8 */ - {&gpiof, NULL, NULL, 9, 0, ADCx, 0} , /* PF9 */ - {&gpiof, NULL, NULL, 10, 0, ADCx, 0} , /* PF10 */ - {&gpiof, NULL, NULL, 11, 0, ADCx, 0} , /* PF11 */ - {&gpiof, NULL, NULL, 12, 0, ADCx, 0} , /* PF12 */ - {&gpiof, NULL, NULL, 13, 0, ADCx, 0} , /* PF13 */ - {&gpiof, NULL, NULL, 14, 0, ADCx, 0} , /* PF14 */ - {&gpiof, NULL, NULL, 15, 0, ADCx, 0} , /* PF15 */ + {&gpioe, NULL, NULL, 0, 0, ADCx} , /* PE0 */ + {&gpioe, NULL, NULL, 1, 0, ADCx} , /* PE1 */ + {&gpioe, NULL, NULL, 2, 0, ADCx} , /* PE2 */ + {&gpioe, NULL, NULL, 3, 0, ADCx} , /* PE3 */ + {&gpioe, NULL, NULL, 4, 0, ADCx} , /* PE4 */ + {&gpioe, NULL, NULL, 5, 0, ADCx} , /* PE5 */ + {&gpioe, NULL, NULL, 6, 0, ADCx} , /* PE6 */ + {&gpioe, NULL, NULL, 7, 0, ADCx} , /* PE7 */ + {&gpioe, NULL, NULL, 8, 0, ADCx} , /* PE8 */ + {&gpioe, NULL, NULL, 9, 0, ADCx} , /* PE9 */ + {&gpioe, NULL, NULL, 10, 0, ADCx} , /* PE10 */ + {&gpioe, NULL, NULL, 11, 0, ADCx} , /* PE11 */ + {&gpioe, NULL, NULL, 12, 0, ADCx} , /* PE12 */ + {&gpioe, NULL, NULL, 13, 0, ADCx} , /* PE13 */ + {&gpioe, NULL, NULL, 14, 0, ADCx} , /* PE14 */ + {&gpioe, NULL, NULL, 15, 0, ADCx} , /* PE15 */ + + {&gpiof, NULL, NULL, 0, 0, ADCx} , /* PF0 */ + {&gpiof, NULL, NULL, 1, 0, ADCx} , /* PF1 */ + {&gpiof, NULL, NULL, 2, 0, ADCx} , /* PF2 */ + {&gpiof, NULL, NULL, 3, 0, ADCx} , /* PF3 */ + {&gpiof, NULL, NULL, 4, 0, ADCx} , /* PF4 */ + {&gpiof, NULL, NULL, 5, 0, ADCx} , /* PF5 */ + {&gpiof, NULL, NULL, 6, 0, ADCx} , /* PF6 */ + {&gpiof, NULL, NULL, 7, 0, ADCx} , /* PF7 */ + {&gpiof, NULL, NULL, 8, 0, ADCx} , /* PF8 */ + {&gpiof, NULL, NULL, 9, 0, ADCx} , /* PF9 */ + {&gpiof, NULL, NULL, 10, 0, ADCx} , /* PF10 */ + {&gpiof, NULL, NULL, 11, 0, ADCx} , /* PF11 */ + {&gpiof, NULL, NULL, 12, 0, ADCx} , /* PF12 */ + {&gpiof, NULL, NULL, 13, 0, ADCx} , /* PF13 */ + {&gpiof, NULL, NULL, 14, 0, ADCx} , /* PF14 */ + {&gpiof, NULL, NULL, 15, 0, ADCx} , /* PF15 */ - {&gpiog, NULL, NULL, 0, 0, ADCx, 0} , /* PG0 */ - {&gpiog, NULL, NULL, 1, 0, ADCx, 0} , /* PG1 */ - {&gpiog, NULL, NULL, 2, 0, ADCx, 0} , /* PG2 */ - {&gpiog, NULL, NULL, 3, 0, ADCx, 0} , /* PG3 */ - {&gpiog, NULL, NULL, 4, 0, ADCx, 0} , /* PG4 */ - {&gpiog, NULL, NULL, 5, 0, ADCx, 0} , /* PG5 */ - {&gpiog, NULL, NULL, 6, 0, ADCx, 0} , /* PG6 */ - {&gpiog, NULL, NULL, 7, 0, ADCx, 0} , /* PG7 */ - {&gpiog, NULL, NULL, 8, 0, ADCx, 0} , /* PG8 */ - {&gpiog, NULL, NULL, 9, 0, ADCx, 0} , /* PG9 */ - {&gpiog, NULL, NULL, 10, 0, ADCx, 0} , /* PG10 */ - {&gpiog, NULL, NULL, 11, 0, ADCx, 0} , /* PG11 */ - {&gpiog, NULL, NULL, 12, 0, ADCx, 0} , /* PG12 */ - {&gpiog, NULL, NULL, 13, 0, ADCx, 0} , /* PG13 */ - {&gpiog, NULL, NULL, 14, 0, ADCx, 0} , /* PG14 */ - {&gpiog, NULL, NULL, 15, 0, ADCx, 0} /* PG15 */ + {&gpiog, NULL, NULL, 0, 0, ADCx} , /* PG0 */ + {&gpiog, NULL, NULL, 1, 0, ADCx} , /* PG1 */ + {&gpiog, NULL, NULL, 2, 0, ADCx} , /* PG2 */ + {&gpiog, NULL, NULL, 3, 0, ADCx} , /* PG3 */ + {&gpiog, NULL, NULL, 4, 0, ADCx} , /* PG4 */ + {&gpiog, NULL, NULL, 5, 0, ADCx} , /* PG5 */ + {&gpiog, NULL, NULL, 6, 0, ADCx} , /* PG6 */ + {&gpiog, NULL, NULL, 7, 0, ADCx} , /* PG7 */ + {&gpiog, NULL, NULL, 8, 0, ADCx} , /* PG8 */ + {&gpiog, NULL, NULL, 9, 0, ADCx} , /* PG9 */ + {&gpiog, NULL, NULL, 10, 0, ADCx} , /* PG10 */ + {&gpiog, NULL, NULL, 11, 0, ADCx} , /* PG11 */ + {&gpiog, NULL, NULL, 12, 0, ADCx} , /* PG12 */ + {&gpiog, NULL, NULL, 13, 0, ADCx} , /* PG13 */ + {&gpiog, NULL, NULL, 14, 0, ADCx} , /* PG14 */ + {&gpiog, NULL, NULL, 15, 0, ADCx} /* PG15 */ }; /* Basically everything that is defined as having a timer us PWM */ @@ -231,4 +231,4 @@ extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { DEFINE_HWSERIAL(Serial2, 3); DEFINE_HWSERIAL_UART(Serial3, 4); DEFINE_HWSERIAL_UART(Serial4, 5); -#endif +#endif \ No newline at end of file diff --git a/STM32F1/variants/hytiny_stm32f103t/board.cpp b/STM32F1/variants/hytiny_stm32f103t/board.cpp index b3fdd9b88..f1fb44f07 100644 --- a/STM32F1/variants/hytiny_stm32f103t/board.cpp +++ b/STM32F1/variants/hytiny_stm32f103t/board.cpp @@ -51,34 +51,35 @@ void boardInit(void) { } // Note. See the enum of pin names in board.h + extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* PA10 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* PA15 */ + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* PB7 */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ }; diff --git a/STM32F1/variants/maple_mini/board.cpp b/STM32F1/variants/maple_mini/board.cpp index 72faa17fb..f49b33682 100644 --- a/STM32F1/variants/maple_mini/board.cpp +++ b/STM32F1/variants/maple_mini/board.cpp @@ -54,43 +54,43 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Top header */ - {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* D0/PB11 */ - {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* D1/PB10 */ - {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* D2/PB2 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* D3/PB0 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* D4/PA7 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* D5/PA6 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* D6/PA5 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* D7/PA4 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* D8/PA3 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* D9/PA2 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* D10/PA1 */ - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* D11/PA0 */ - {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* D12/PC15 */ - {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* D13/PC14 */ - {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* D14/PC13 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* D0/PB11 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* D1/PB10 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* D2/PB2 */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* D3/PB0 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* D4/PA7 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* D5/PA6 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* D6/PA5 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* D7/PA4 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* D8/PA3 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* D9/PA2 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* D10/PA1 */ + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* D11/PA0 */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* D12/PC15 */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* D13/PC14 */ + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* D14/PC13 */ /* Bottom header */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* D15/PB7 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* D16/PB6 */ - {&gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* D17/PB5 */ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* D18/PB4 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* D19/PB3 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* D20/PA15 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* D21/PA14 */ - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* D22/PA13 */ - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* D23/PA12 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* D24/PA11 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* D25/PA10 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* D26/PA9 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* D27/PA8 */ - {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* D28/PB15 */ - {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* D29/PB14 */ - {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* D30/PB13 */ - {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* D31/PB12 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* D32/PB8 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* D33/PB1 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* D15/PB7 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* D16/PB6 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* D17/PB5 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* D18/PB4 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* D19/PB3 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* D20/PA15 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* D21/PA14 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* D22/PA13 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* D23/PA12 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* D24/PA11 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* D25/PA10 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* D26/PA9 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* D27/PA8 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* D28/PB15 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* D29/PB14 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* D30/PB13 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* D31/PB12 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* D32/PB8 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* D33/PB1 */ }; extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { @@ -125,4 +125,4 @@ DEFINE_HWSERIAL(Serial1, 1); DEFINE_HWSERIAL(Serial2, 2); DEFINE_HWSERIAL(Serial3, 3); - + \ No newline at end of file diff --git a/STM32F1/variants/maple_ret6/board.cpp b/STM32F1/variants/maple_ret6/board.cpp index 82127ff88..fb9277985 100644 --- a/STM32F1/variants/maple_ret6/board.cpp +++ b/STM32F1/variants/maple_ret6/board.cpp @@ -82,66 +82,66 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Top header */ - { &gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* D0/PA3 */ - { &gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* D1/PA2 */ - { &gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* D2/PA0 */ - { &gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* D3/PA1 */ - { &gpiob, NULL, NULL, 5, 0, ADCx, 0}, /* D4/PB5 */ - { &gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* D5/PB6 */ - { &gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* D6/PA8 */ - { &gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* D7/PA9 */ - { &gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* D8/PA10 */ - { &gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* D9/PB7 */ - { &gpioa, NULL, &adc1, 4, 0, 4, 0}, /* D10/PA4 */ - { &gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* D11/PA7 */ - { &gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* D12/PA6 */ - { &gpioa, NULL, &adc1, 5, 0, 5, 0}, /* D13/PA5 (LED) */ - { &gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* D14/PB8 */ + { &gpioa, &timer2, &adc1, 3, 4, 3 }, /* D0/PA3 */ + { &gpioa, &timer2, &adc1, 2, 3, 2 }, /* D1/PA2 */ + { &gpioa, &timer2, &adc1, 0, 1, 0 }, /* D2/PA0 */ + { &gpioa, &timer2, &adc1, 1, 2, 1 }, /* D3/PA1 */ + { &gpiob, NULL, NULL, 5, 0, ADCx }, /* D4/PB5 */ + { &gpiob, &timer4, NULL, 6, 1, ADCx }, /* D5/PB6 */ + { &gpioa, &timer1, NULL, 8, 1, ADCx }, /* D6/PA8 */ + { &gpioa, &timer1, NULL, 9, 2, ADCx }, /* D7/PA9 */ + { &gpioa, &timer1, NULL, 10, 3, ADCx }, /* D8/PA10 */ + { &gpiob, &timer4, NULL, 7, 2, ADCx }, /* D9/PB7 */ + { &gpioa, NULL, &adc1, 4, 0, 4 }, /* D10/PA4 */ + { &gpioa, &timer3, &adc1, 7, 2, 7 }, /* D11/PA7 */ + { &gpioa, &timer3, &adc1, 6, 1, 6 }, /* D12/PA6 */ + { &gpioa, NULL, &adc1, 5, 0, 5 }, /* D13/PA5 (LED) */ + { &gpiob, &timer4, NULL, 8, 3, ADCx }, /* D14/PB8 */ /* Little header */ - { &gpioc, NULL, &adc1, 0, 0, 10, 0}, /* D15/PC0 */ - { &gpioc, NULL, &adc1, 1, 0, 11, 0}, /* D16/PC1 */ - { &gpioc, NULL, &adc1, 2, 0, 12, 0}, /* D17/PC2 */ - { &gpioc, NULL, &adc1, 3, 0, 13, 0}, /* D18/PC3 */ - { &gpioc, NULL, &adc1, 4, 0, 14, 0}, /* D19/PC4 */ - { &gpioc, NULL, &adc1, 5, 0, 15, 0}, /* D20/PC5 */ + { &gpioc, NULL, &adc1, 0, 0, 10 }, /* D15/PC0 */ + { &gpioc, NULL, &adc1, 1, 0, 11 }, /* D16/PC1 */ + { &gpioc, NULL, &adc1, 2, 0, 12 }, /* D17/PC2 */ + { &gpioc, NULL, &adc1, 3, 0, 13 }, /* D18/PC3 */ + { &gpioc, NULL, &adc1, 4, 0, 14 }, /* D19/PC4 */ + { &gpioc, NULL, &adc1, 5, 0, 15 }, /* D20/PC5 */ /* External header */ - { &gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* D21/PC13 */ - { &gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* D22/PC14 */ - { &gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* D23/PC15 */ - { &gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* D24/PB9 */ - { &gpiod, NULL, NULL, 2, 0, ADCx, 0}, /* D25/PD2 */ - { &gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* D26/PC10 */ - { &gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* D27/PB0 */ - { &gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* D28/PB1 */ - { &gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* D29/PB10 */ - { &gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* D30/PB11 */ - { &gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* D31/PB12 */ - { &gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* D32/PB13 */ - { &gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* D33/PB14 */ - { &gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* D34/PB15 */ - { &gpioc, &timer8, NULL, 6, 1, ADCx, 0}, /* D35/PC6 */ - { &gpioc, &timer8, NULL, 7, 2, ADCx, 0}, /* D36/PC7 */ - { &gpioc, &timer8, NULL, 8, 3, ADCx, 0}, /* D37/PC8 */ - { &gpioc, &timer8, NULL, 9, 4, ADCx, 0}, /* D38/PC9 (BUT) */ + { &gpioc, NULL, NULL, 13, 0, ADCx }, /* D21/PC13 */ + { &gpioc, NULL, NULL, 14, 0, ADCx }, /* D22/PC14 */ + { &gpioc, NULL, NULL, 15, 0, ADCx }, /* D23/PC15 */ + { &gpiob, &timer4, NULL, 9, 4, ADCx }, /* D24/PB9 */ + { &gpiod, NULL, NULL, 2, 0, ADCx }, /* D25/PD2 */ + { &gpioc, NULL, NULL, 10, 0, ADCx }, /* D26/PC10 */ + { &gpiob, &timer3, &adc1, 0, 3, 8 }, /* D27/PB0 */ + { &gpiob, &timer3, &adc1, 1, 4, 9 }, /* D28/PB1 */ + { &gpiob, NULL, NULL, 10, 0, ADCx }, /* D29/PB10 */ + { &gpiob, NULL, NULL, 11, 0, ADCx }, /* D30/PB11 */ + { &gpiob, NULL, NULL, 12, 0, ADCx }, /* D31/PB12 */ + { &gpiob, NULL, NULL, 13, 0, ADCx }, /* D32/PB13 */ + { &gpiob, NULL, NULL, 14, 0, ADCx }, /* D33/PB14 */ + { &gpiob, NULL, NULL, 15, 0, ADCx }, /* D34/PB15 */ + { &gpioc, &timer8, NULL, 6, 1, ADCx }, /* D35/PC6 */ + { &gpioc, &timer8, NULL, 7, 2, ADCx }, /* D36/PC7 */ + { &gpioc, &timer8, NULL, 8, 3, ADCx }, /* D37/PC8 */ + { &gpioc, &timer8, NULL, 9, 4, ADCx }, /* D38/PC9 (BUT) */ /* JTAG header */ - { &gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* D39/PA13 */ - { &gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* D40/PA14 */ - { &gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* D41/PA15 */ - { &gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* D42/PB3 */ - { &gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* D43/PB4 */ + { &gpioa, NULL, NULL, 13, 0, ADCx }, /* D39/PA13 */ + { &gpioa, NULL, NULL, 14, 0, ADCx }, /* D40/PA14 */ + { &gpioa, NULL, NULL, 15, 0, ADCx }, /* D41/PA15 */ + { &gpiob, NULL, NULL, 3, 0, ADCx }, /* D42/PB3 */ + { &gpiob, NULL, NULL, 4, 0, ADCx }, /* D43/PB4 */ - { &gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* D44/PC11 UART4_RX/SDIO_D3 */ - { &gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* D45/PC12 UART5_TX/SDIO_CK */ + { &gpioc, NULL, NULL, 11, 0, ADCx }, /* D44/PC11 UART4_RX/SDIO_D3 */ + { &gpioc, NULL, NULL, 12, 0, ADCx }, /* D45/PC12 UART5_TX/SDIO_CK */ - { &gpiod, NULL, NULL, 0, 0, ADCx, 0}, /* PD0 OSC_IN */ - { &gpiod, NULL, NULL, 1, 0, ADCx, 0}, /* PD1 OSC_OUT */ - { &gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* PB2 */ + { &gpiod, NULL, NULL, 0, 0, ADCx }, /* PD0 OSC_IN */ + { &gpiod, NULL, NULL, 1, 0, ADCx }, /* PD1 OSC_OUT */ + { &gpiob, NULL, NULL, 2, 0, ADCx }, /* PB2 */ }; /* Basically everything that is defined as having a timer us PWM */ @@ -175,4 +175,4 @@ DEFINE_HWSERIAL(Serial1, 1); DEFINE_HWSERIAL(Serial2, 2); DEFINE_HWSERIAL(Serial3, 3); DEFINE_HWSERIAL_UART(Serial4, 4); -DEFINE_HWSERIAL_UART(Serial5, 5); +DEFINE_HWSERIAL_UART(Serial5, 5); \ No newline at end of file diff --git a/STM32F1/variants/microduino/board.cpp b/STM32F1/variants/microduino/board.cpp index 51c80248d..2a002887b 100644 --- a/STM32F1/variants/microduino/board.cpp +++ b/STM32F1/variants/microduino/board.cpp @@ -54,35 +54,35 @@ void boardInit(void) { extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* D0(RxD0)/PA10 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* D1(TxD1)/PA9 */ - {&gpiob, NULL, NULL, 11, 0, ADCx, 0}, /* D2/PB11 */ - {&gpiob, NULL, NULL, 10, 0, ADCx, 0}, /* D3/PB10 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* D4/PA8 */ - {&gpioa, NULL, NULL, 13, 0, ADCx, 0}, /* D5/PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx, 0}, /* D6/PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx, 0}, /* D7/PA15 */ - {&gpiob, NULL, NULL, 3, 0, ADCx, 0}, /* D8/PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx, 0}, /* D9/PB4 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* D10/PA4 */ - {&gpioa, &timer3, &adc1, 7, 2, 7, 0}, /* D11/PA7 */ - {&gpioa, &timer3, &adc1, 6, 1, 6, 0}, /* D12/PA6 */ - {&gpioa, NULL, &adc1, 5, 0, 5, 0}, /* D13/PA5 */ - - {&gpioa, &timer2, &adc1, 0, 1, 0, 0}, /* D14(A0)/PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1, 0}, /* D15(A1)/PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2, 0}, /* D16(A2)/PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3, 0}, /* D17(A3)/PA3 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* D18(A4)/PB7 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* D19(A5)/PB6 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* D20(A6)/PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* D21(A7)/PB1 */ - - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* D22/PA12/USB D+ */ - {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* D23/PA11/USB D- */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* D0(RxD0)/PA10 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* D1(TxD1)/PA9 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* D2/PB11 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* D3/PB10 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* D4/PA8 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* D5/PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* D6/PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* D7/PA15 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* D8/PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* D9/PB4 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* D10/PA4 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* D11/PA7 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* D12/PA6 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* D13/PA5 */ + + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* D14(A0)/PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* D15(A1)/PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* D16(A2)/PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* D17(A3)/PA3 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* D18(A4)/PB7 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* D19(A5)/PB6 */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* D20(A6)/PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* D21(A7)/PB1 */ + + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* D22/PA12/USB D+ */ + {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* D23/PA11/USB D- */ // FIXME: find out which pin is the button, if any - {&gpiob, NULL, NULL, 8, 0, ADCx, 0}, /* D24/PB8??/Button */ + {&gpiob, NULL, NULL, 8, 0, ADCx}, /* D24/PB8??/Button */ }; extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { diff --git a/STM32F1/variants/nucleo_f103rb/board.cpp b/STM32F1/variants/nucleo_f103rb/board.cpp index a70a188ca..9f3e08ae7 100644 --- a/STM32F1/variants/nucleo_f103rb/board.cpp +++ b/STM32F1/variants/nucleo_f103rb/board.cpp @@ -96,55 +96,55 @@ rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSI_DIV_2, &pll_data}; extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Arduino-like header, right connectors */ - {&gpioa, NULL, &adc1, 3, 0, 3, 0}, /* D0/PA3 */ - {&gpioa, NULL, &adc1, 2, 0, 2, 0}, /* D1/PA2 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx, 0}, /* D2/PA10 */ - {&gpiob, &timer2, NULL, 3, 2, ADCx, 0}, /* D3/PB3 */ - {&gpiob, &timer3, NULL, 5, 2, ADCx, 0}, /* D4/PB5 */ - {&gpiob, &timer3, NULL, 4, 1, ADCx, 0}, /* D5/PB4 */ - {&gpiob, &timer2, NULL, 10, 3, ADCx, 0}, /* D6/PB10 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx, 0}, /* D7/PA8 */ + {&gpioa, NULL, &adc1, 3, 0, 3}, /* D0/PA3 */ + {&gpioa, NULL, &adc1, 2, 0, 2}, /* D1/PA2 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* D2/PA10 */ + {&gpiob, &timer2, NULL, 3, 2, ADCx}, /* D3/PB3 */ + {&gpiob, &timer3, NULL, 5, 2, ADCx}, /* D4/PB5 */ + {&gpiob, &timer3, NULL, 4, 1, ADCx}, /* D5/PB4 */ + {&gpiob, &timer2, NULL, 10, 3, ADCx}, /* D6/PB10 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* D7/PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx, 0}, /* D8/PA9 */ - {&gpioc, NULL, NULL, 7, 0, ADCx, 0}, /* D9/PC7 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx, 0}, /* D10/PB6 */ - {&gpioa, NULL, &adc1, 7, 0, 7, 0}, /* D11/PA7 */ - {&gpioa, NULL, &adc1, 6, 0, 6, 0}, /* D12/PA6 */ - {&gpioa, NULL, NULL, 5, 0, ADCx, 0}, /* D13/PA5 LED - no &adc12_IN5 !*/ - {&gpiob, &timer4, NULL, 9, 4, ADCx, 0}, /* D14/PB9 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx, 0}, /* D15/PB8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* D8/PA9 */ + {&gpioc, NULL, NULL, 7, 0, ADCx}, /* D9/PC7 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* D10/PB6 */ + {&gpioa, NULL, &adc1, 7, 0, 7}, /* D11/PA7 */ + {&gpioa, NULL, &adc1, 6, 0, 6}, /* D12/PA6 */ + {&gpioa, NULL, NULL, 5, 0, ADCx}, /* D13/PA5 LED - no &adc12_IN5 !*/ + {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* D14/PB9 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* D15/PB8 */ - {&gpioa, NULL, &adc1, 0, 0, 0, 0}, /* D16/A0/PA0 */ - {&gpioa, NULL, &adc1, 1, 0, 1, 0}, /* D17/A1/PA1 */ - {&gpioa, NULL, &adc1, 4, 0, 4, 0}, /* D18/A2/PA4 */ - {&gpiob, &timer3, &adc1, 0, 3, 8, 0}, /* D19/A3/PB0 */ - {&gpioc, NULL, &adc1, 1, 0, 11, 0}, /* D20/A4/PC1 */ - {&gpioc, NULL, &adc1, 0, 0, 10, 0}, /* D21/A5/PC0 */ + {&gpioa, NULL, &adc1, 0, 0, 0}, /* D16/A0/PA0 */ + {&gpioa, NULL, &adc1, 1, 0, 1}, /* D17/A1/PA1 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* D18/A2/PA4 */ + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* D19/A3/PB0 */ + {&gpioc, NULL, &adc1, 1, 0, 11}, /* D20/A4/PC1 */ + {&gpioc, NULL, &adc1, 0, 0, 10}, /* D21/A5/PC0 */ - {&gpioc, NULL, NULL, 10, 0, ADCx, 0}, /* D22/PC10 */ - {&gpioc, NULL, NULL, 12, 0, ADCx, 0}, /* D23/PC12 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx, 0}, /* D24/PB7 */ - {&gpioc, NULL, NULL, 13, 0, ADCx, 0}, /* D25/PC13 USER BLUE BUTTON */ - {&gpioc, NULL, NULL, 14, 0, ADCx, 0}, /* D26/PC14 */ - {&gpioc, NULL, NULL, 15, 0, ADCx, 0}, /* D27/PC15 */ - {&gpioc, NULL, &adc1, 2, 0, 12, 0}, /* D28/PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13, 0}, /* D29/PC3 */ - {&gpioc, NULL, NULL, 11, 0, ADCx, 0}, /* D30/PC11 */ - {&gpiod, NULL, NULL, 2, 0, ADCx, 0}, /* D31/PD2 */ - {&gpioc, NULL, NULL, 9, 0, ADCx, 0}, /* D32/PC9 */ - {&gpioc, NULL, NULL, 8, 0, ADCx, 0}, /* D33/PC8 */ - {&gpioc, NULL, NULL, 6, 0, ADCx, 0}, /* D34/PC6 */ - {&gpioc, NULL, &adc1, 5, 0, 15, 0}, /* D35/PC5 */ - {&gpioa, NULL, NULL, 12, 0, ADCx, 0}, /* D36/PA12 */ - {&gpioa, &timer1, NULL, 11, 4, ADCx, 0}, /* D37/PA11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx, 0}, /* D38/PB12 */ - {&gpiob, &timer2, NULL, 11, 4, ADCx, 0}, /* D39/PB11 PWM-not working?*/ - {&gpiob, NULL, NULL, 2, 0, ADCx, 0}, /* D40/PB2 BOOT1 !!*/ - {&gpiob, &timer3, &adc1, 1, 4, 9, 0}, /* D41/PB1 */ - {&gpiob, NULL, NULL, 15, 0, ADCx, 0}, /* D42/PB15 */ - {&gpiob, NULL, NULL, 14, 0, ADCx, 0}, /* D43/PB14 */ - {&gpiob, NULL, NULL, 13, 0, ADCx, 0}, /* D44/PB13 */ - {&gpioc, NULL, &adc1, 4, 0, 14, 0}, /* D45/PC4 */ + {&gpioc, NULL, NULL, 10, 0, ADCx}, /* D22/PC10 */ + {&gpioc, NULL, NULL, 12, 0, ADCx}, /* D23/PC12 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* D24/PB7 */ + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* D25/PC13 USER BLUE BUTTON */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* D26/PC14 */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* D27/PC15 */ + {&gpioc, NULL, &adc1, 2, 0, 12}, /* D28/PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13}, /* D29/PC3 */ + {&gpioc, NULL, NULL, 11, 0, ADCx}, /* D30/PC11 */ + {&gpiod, NULL, NULL, 2, 0, ADCx}, /* D31/PD2 */ + {&gpioc, NULL, NULL, 9, 0, ADCx}, /* D32/PC9 */ + {&gpioc, NULL, NULL, 8, 0, ADCx}, /* D33/PC8 */ + {&gpioc, NULL, NULL, 6, 0, ADCx}, /* D34/PC6 */ + {&gpioc, NULL, &adc1, 5, 0, 15}, /* D35/PC5 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* D36/PA12 */ + {&gpioa, &timer1, NULL, 11, 4, ADCx}, /* D37/PA11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* D38/PB12 */ + {&gpiob, &timer2, NULL, 11, 4, ADCx}, /* D39/PB11 PWM-not working?*/ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* D40/PB2 BOOT1 !!*/ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* D41/PB1 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* D42/PB15 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* D43/PB14 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* D44/PB13 */ + {&gpioc, NULL, &adc1, 4, 0, 14}, /* D45/PC4 */ // PMAP_ROW(&gpioa, 13, NULL, 0, NULL, ADCx), /* D41/PA13 do not use*/ // PMAP_ROW(&gpioa, 14, NULL, 0, NULL, ADCx), /* D42/PA14 do not use*/ // PMAP_ROW(&gpioa, 15, &timer2, 1, NULL, ADCx), /* D43/PA15 do not use*/ @@ -256,4 +256,4 @@ MOSI alternate functions on the GPIO ports. DEFINE_HWSERIAL(Serial, 3);// Use HW Serial 2 as "Serial" DEFINE_HWSERIAL(Serial1, 2); DEFINE_HWSERIAL(Serial2, 1); -#endif +#endif \ No newline at end of file diff --git a/STM32F3/cores/maple/wirish/boards_private.h b/STM32F3/cores/maple/wirish/boards_private.h index 332843ddf..49867ca77 100644 --- a/STM32F3/cores/maple/wirish/boards_private.h +++ b/STM32F3/cores/maple/wirish/boards_private.h @@ -42,7 +42,7 @@ /* Makes the PIN_MAP rows more human-readable. */ #define PMAP_ROW(gpio_dev, gpio_bit, timer_dev, timer_ch, adc_dev, adc_ch) \ - { gpio_dev, timer_dev, adc_dev, gpio_bit, timer_ch, adc_ch, 0} + { gpio_dev, timer_dev, adc_dev, gpio_bit, timer_ch, adc_ch } namespace wirish { namespace priv { From 95dde2ec1017a2ee42561194d8d01a9d69b66957 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 1 Dec 2017 17:17:28 +0100 Subject: [PATCH 244/307] Removed pinMode from PIN_MAP --- STM32F1/cores/maple/wirish_types.h | 1 - STM32F1/variants/generic_stm32f103r/board.cpp | 1 - STM32F1/variants/generic_stm32f103z/board.cpp | 3 +-- STM32F1/variants/maple_ret6/board.cpp | 3 +-- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/STM32F1/cores/maple/wirish_types.h b/STM32F1/cores/maple/wirish_types.h index 195cda83a..14fb692fd 100644 --- a/STM32F1/cores/maple/wirish_types.h +++ b/STM32F1/cores/maple/wirish_types.h @@ -55,7 +55,6 @@ typedef struct stm32_pin_info { uint8 gpio_bit; /**< Pin's GPIO port bit. */ uint8 timer_channel; /**< Timer channel, or 0 if none. */ uint8 adc_channel; /**< Pin ADC channel, or ADCx if none. */ - uint8 pinMode; /**< mode specific by pinMode call (Roger Clark added to optimize compatibility with Arduino API*/ } stm32_pin_info; /** diff --git a/STM32F1/variants/generic_stm32f103r/board.cpp b/STM32F1/variants/generic_stm32f103r/board.cpp index 3e3589c23..891e4e944 100644 --- a/STM32F1/variants/generic_stm32f103r/board.cpp +++ b/STM32F1/variants/generic_stm32f103r/board.cpp @@ -78,7 +78,6 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { uint8 gpio_bit; Pin's GPIO port bit. uint8 timer_channel; Timer channel, or 0 if none. uint8 adc_channel; Pin ADC channel, or ADCx if none. - uint8 pinMode; mode specific by pinMode call (Roger Clark added to optimize compatibility with Arduino API */ {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ diff --git a/STM32F1/variants/generic_stm32f103z/board.cpp b/STM32F1/variants/generic_stm32f103z/board.cpp index 830479e96..500f9b86d 100644 --- a/STM32F1/variants/generic_stm32f103z/board.cpp +++ b/STM32F1/variants/generic_stm32f103z/board.cpp @@ -77,7 +77,6 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { uint8 gpio_bit; Pin's GPIO port bit. uint8 timer_channel; Timer channel, or 0 if none. uint8 adc_channel; Pin ADC channel, or ADCx if none. - uint8 pinMode; mode specific by pinMode call (Roger Clark added to optimize compatibility with Arduino API */ {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ @@ -231,4 +230,4 @@ extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { DEFINE_HWSERIAL(Serial2, 3); DEFINE_HWSERIAL_UART(Serial3, 4); DEFINE_HWSERIAL_UART(Serial4, 5); -#endif \ No newline at end of file +#endif diff --git a/STM32F1/variants/maple_ret6/board.cpp b/STM32F1/variants/maple_ret6/board.cpp index fb9277985..2b4e2e49d 100644 --- a/STM32F1/variants/maple_ret6/board.cpp +++ b/STM32F1/variants/maple_ret6/board.cpp @@ -77,7 +77,6 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { uint8 gpio_bit; Pin's GPIO port bit. uint8 timer_channel; Timer channel, or 0 if none. uint8 adc_channel; Pin ADC channel, or ADCx if none. - uint8 pinMode; mode specific by pinMode call (Roger Clark added to optimize compatibility with Arduino API */ /* Top header */ @@ -175,4 +174,4 @@ DEFINE_HWSERIAL(Serial1, 1); DEFINE_HWSERIAL(Serial2, 2); DEFINE_HWSERIAL(Serial3, 3); DEFINE_HWSERIAL_UART(Serial4, 4); -DEFINE_HWSERIAL_UART(Serial5, 5); \ No newline at end of file +DEFINE_HWSERIAL_UART(Serial5, 5); From 595b128cac7b087c3ee96ea662e690f9f38a1520 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 3 Dec 2017 14:39:35 +1100 Subject: [PATCH 245/307] Modification to allow SSD1306 example to compile, following changes to Wire to use HWire by default. Note this code is only known to compile , it may not work with the SSD1306 display --- .../Adafruit_SSD1306_STM32.cpp | 20 +++++++++---------- .../Adafruit_SSD1306/Adafruit_SSD1306_STM32.h | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp b/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp index 349203915..d70aa13f4 100644 --- a/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp +++ b/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp @@ -22,10 +22,10 @@ All text above, and the splash screen below must be included in any redistributi //#endif #include -//#include -#include +//#include +#include //HardWire HWIRE(1,I2C_FAST_MODE); // I2c1 -HardWire HWIRE(2,I2C_FAST_MODE); // I2c2 +//HardWire HWIRE(2,I2C_FAST_MODE); // I2c2 #include "Adafruit_GFX.h" #include "Adafruit_SSD1306_STM32.h" @@ -197,7 +197,7 @@ void Adafruit_SSD1306::begin(uint8_t vccstate, uint8_t i2caddr, bool reset) { else { // I2C Init - HWIRE.begin(); + Wire.begin(); #ifdef __SAM3X8E__ // Force 400 KHz I2C, rawr! (Uses pins 20, 21 for SDA, SCL) @@ -359,10 +359,10 @@ void Adafruit_SSD1306::ssd1306_command(uint8_t c) { { // I2C uint8_t control = 0x00; // Co = 0, D/C = 0 - HWIRE.beginTransmission(_i2caddr); + Wire.beginTransmission(_i2caddr); WIRE_WRITE(control); WIRE_WRITE(c); - HWIRE.endTransmission(); + Wire.endTransmission(); } } @@ -473,10 +473,10 @@ void Adafruit_SSD1306::ssd1306_data(uint8_t c) { { // I2C uint8_t control = 0x40; // Co = 0, D/C = 1 - HWIRE.beginTransmission(_i2caddr); + Wire.beginTransmission(_i2caddr); WIRE_WRITE(control); WIRE_WRITE(c); - HWIRE.endTransmission(); + Wire.endTransmission(); } } @@ -525,14 +525,14 @@ void Adafruit_SSD1306::display(void) { // I2C for (uint16_t i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i++) { // send a bunch of data in one xmission - HWIRE.beginTransmission(_i2caddr); + Wire.beginTransmission(_i2caddr); WIRE_WRITE(0x40); for (uint8_t x=0; x<16; x++) { WIRE_WRITE(buffer[i]); i++; } i--; - HWIRE.endTransmission(); + Wire.endTransmission(); } /* #ifndef __SAM3X8E__ diff --git a/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.h b/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.h index 0686d763f..f91ff1b0e 100644 --- a/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.h +++ b/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.h @@ -18,10 +18,10 @@ All text above, and the splash screen must be included in any redistribution #if ARDUINO >= 100 #include "Arduino.h" - #define WIRE_WRITE HWIRE.write + #define WIRE_WRITE Wire.write #else #include "WProgram.h" - #define WIRE_WRITE HWIRE.send + #define WIRE_WRITE Wire.send #endif /* #ifdef __SAM3X8E__ From dbfb68cf916f044c83b2bd42aa9aaaf78641a705 Mon Sep 17 00:00:00 2001 From: aster94 Date: Wed, 6 Dec 2017 21:52:00 +0100 Subject: [PATCH 246/307] Add files via upload --- STM32F1/libraries/Wire/SoftWire.cpp | 40 ++++++++++++++--------------- STM32F1/libraries/Wire/SoftWire.h | 12 ++++----- STM32F1/libraries/Wire/Wire.cpp | 18 ++++++------- STM32F1/libraries/Wire/Wire.h | 16 ++++++------ 4 files changed, 43 insertions(+), 43 deletions(-) diff --git a/STM32F1/libraries/Wire/SoftWire.cpp b/STM32F1/libraries/Wire/SoftWire.cpp index 781bb976f..4e3cdd587 100644 --- a/STM32F1/libraries/Wire/SoftWire.cpp +++ b/STM32F1/libraries/Wire/SoftWire.cpp @@ -25,7 +25,7 @@ *****************************************************************************/ /** - * @file Wire.cpp + * @file SoftWire.cpp * @author Trystan Jones * @brief Wire library, uses the WireBase to create the primary interface * while keeping low level interactions invisible to the user. @@ -54,7 +54,7 @@ * - always start with i2c_delay rather than end */ -void TwoWire::set_scl(bool state) { +void SoftWire::set_scl(bool state) { I2C_DELAY(this->i2c_delay); gpio_write_bit(sclDevice,sclBit, state); @@ -65,30 +65,30 @@ void TwoWire::set_scl(bool state) { } } -void TwoWire::set_sda(bool state) { +void SoftWire::set_sda(bool state) { I2C_DELAY(this->i2c_delay); gpio_write_bit(sdaDevice,sdaBit, state); //digitalWrite(this->sda_pin, state); } -void TwoWire::i2c_start() { +void SoftWire::i2c_start() { set_sda(LOW); set_scl(LOW); } -void TwoWire::i2c_stop() { +void SoftWire::i2c_stop() { set_sda(LOW); set_scl(HIGH); set_sda(HIGH); } -void TwoWire::i2c_repeated_start() { +void SoftWire::i2c_repeated_start() { set_sda(HIGH); set_scl(HIGH); set_sda(LOW); } -bool TwoWire::i2c_get_ack() { +bool SoftWire::i2c_get_ack() { set_scl(LOW); set_sda(HIGH); set_scl(HIGH); @@ -98,19 +98,19 @@ bool TwoWire::i2c_get_ack() { return ret; } -void TwoWire::i2c_send_ack() { +void SoftWire::i2c_send_ack() { set_sda(LOW); set_scl(HIGH); set_scl(LOW); } -void TwoWire::i2c_send_nack() { +void SoftWire::i2c_send_nack() { set_sda(HIGH); set_scl(HIGH); set_scl(LOW); } -uint8 TwoWire::i2c_shift_in() { +uint8 SoftWire::i2c_shift_in() { uint8 data = 0; set_sda(HIGH); @@ -124,7 +124,7 @@ uint8 TwoWire::i2c_shift_in() { return data; } -void TwoWire::i2c_shift_out(uint8 val) { +void SoftWire::i2c_shift_out(uint8 val) { int i; for (i = 0; i < 8; i++) { set_sda(!!(val & (1 << (7 - i)) ) ); @@ -134,7 +134,7 @@ void TwoWire::i2c_shift_out(uint8 val) { } //process needs to be updated for repeated start. -uint8 TwoWire::process(uint8 stop) { +uint8 SoftWire::process(uint8 stop) { itc_msg.xferred = 0; uint8 sla_addr = (itc_msg.addr << 1); @@ -183,18 +183,18 @@ uint8 TwoWire::process(uint8 stop) { } // For compatibility with legacy code -uint8 TwoWire::process(){ +uint8 SoftWire::process(){ return process(true); } // TODO: Add in Error Handling if pins is out of range for other Maples // TODO: Make delays more capable -TwoWire::TwoWire(uint8 scl, uint8 sda, uint8 delay) : i2c_delay(delay) { +SoftWire::SoftWire(uint8 scl, uint8 sda, uint8 delay) : i2c_delay(delay) { this->scl_pin=scl; this->sda_pin=sda; } -void TwoWire::begin(uint8 self_addr) { +void SoftWire::begin(uint8 self_addr) { tx_buf_idx = 0; tx_buf_overflow = false; rx_buf_idx = 0; @@ -210,7 +210,7 @@ void TwoWire::begin(uint8 self_addr) { set_sda(HIGH); } -void TwoWire::end() +void SoftWire::end() { if (this->scl_pin) { @@ -222,7 +222,7 @@ void TwoWire::end() } } -void TwoWire::setClock(uint32_t frequencyHz) +void SoftWire::setClock(uint32_t frequencyHz) { switch(frequencyHz) { @@ -236,11 +236,11 @@ void TwoWire::setClock(uint32_t frequencyHz) } } -TwoWire::~TwoWire() { +SoftWire::~SoftWire() { this->scl_pin=0; this->sda_pin=0; } // Declare the instance that the users of the library can use -//TwoWire Wire(SCL, SDA, SOFT_STANDARD); -//TwoWire Wire(PB6, PB7, SOFT_FAST); +//SoftWire Wire(SCL, SDA, SOFT_STANDARD); +//SoftWire Wire(PB6, PB7, SOFT_FAST); diff --git a/STM32F1/libraries/Wire/SoftWire.h b/STM32F1/libraries/Wire/SoftWire.h index 136dc3d8c..b5c43dba3 100644 --- a/STM32F1/libraries/Wire/SoftWire.h +++ b/STM32F1/libraries/Wire/SoftWire.h @@ -25,7 +25,7 @@ *****************************************************************************/ /** - * @file Wire.h + * @file SoftWire.h * @author Trystan Jones * @brief Wire library, uses the WireBase to create the primary interface * while keeping low level interactions invisible to the user. @@ -60,7 +60,7 @@ -class TwoWire : public WireBase { +class SoftWire : public WireBase { public: uint8 i2c_delay; uint8 scl_pin; @@ -136,7 +136,7 @@ class TwoWire : public WireBase { * Accept pin numbers for SCL and SDA lines. Set the delay needed * to create the timing for I2C's Standard Mode and Fast Mode. */ - TwoWire(uint8 scl=SCL, uint8 sda=SDA, uint8 delay=SOFT_STANDARD); + SoftWire(uint8 scl=SCL, uint8 sda=SDA, uint8 delay=SOFT_STANDARD); /* * Sets pins SDA and SCL to OUPTUT_OPEN_DRAIN, joining I2C bus as @@ -155,9 +155,9 @@ class TwoWire : public WireBase { /* * If object is destroyed, set pin numbers to 0. */ - ~TwoWire(); + ~SoftWire(); }; -//extern TwoWire Wire; +//extern SoftWire Wire; -#endif // _WIRE_H_ +#endif // _SOFTWIRE_H_ diff --git a/STM32F1/libraries/Wire/Wire.cpp b/STM32F1/libraries/Wire/Wire.cpp index a026e2ef7..dbf4c663b 100644 --- a/STM32F1/libraries/Wire/Wire.cpp +++ b/STM32F1/libraries/Wire/Wire.cpp @@ -25,7 +25,7 @@ *****************************************************************************/ /** - * @file HardWire.cpp + * @file TwoWire.cpp * @author Trystan Jones * @brief Wire library, uses the hardware I2C available in the Maple to * interact with I2C slave devices. @@ -38,7 +38,7 @@ #include "Wire.h" -uint8 HardWire::process(uint8 stop) { +uint8 TwoWire::process(uint8 stop) { int8 res = i2c_master_xfer(sel_hard, &itc_msg, 1, 0); if (res == I2C_ERROR_PROTOCOL) { if (sel_hard->error_flags & I2C_SR1_AF) { /* NACK */ @@ -55,12 +55,12 @@ uint8 HardWire::process(uint8 stop) { return res; } -uint8 HardWire::process(){ +uint8 TwoWire::process(){ return process(true); } // TODO: Add in Error Handling if devsel is out of range for other Maples -HardWire::HardWire(uint8 dev_sel, uint8 flags) { +TwoWire::TwoWire(uint8 dev_sel, uint8 flags) { if (dev_sel == 1) { sel_hard = I2C1; } else if (dev_sel == 2) { @@ -71,21 +71,21 @@ HardWire::HardWire(uint8 dev_sel, uint8 flags) { dev_flags = flags; } -HardWire::~HardWire() { +TwoWire::~TwoWire() { i2c_disable(sel_hard); sel_hard = 0; } -void HardWire::begin(uint8 self_addr) { +void TwoWire::begin(uint8 self_addr) { i2c_master_enable(sel_hard, dev_flags); } -void HardWire::end() { +void TwoWire::end() { i2c_disable(sel_hard); sel_hard = 0; } -void HardWire::setClock(uint32_t frequencyHz) +void TwoWire::setClock(uint32_t frequencyHz) { switch(frequencyHz) { @@ -103,4 +103,4 @@ void HardWire::setClock(uint32_t frequencyHz) } } -HardWire Wire(1); +TwoWire Wire(1); diff --git a/STM32F1/libraries/Wire/Wire.h b/STM32F1/libraries/Wire/Wire.h index 88d4a1bd4..f235aec57 100644 --- a/STM32F1/libraries/Wire/Wire.h +++ b/STM32F1/libraries/Wire/Wire.h @@ -25,7 +25,7 @@ *****************************************************************************/ /** - * @file HardWire.h + * @file TwoWire.h * @author Trystan Jones * @brief Wire library, uses the hardware I2C available in the Maple to * interact with I2C slave devices. @@ -36,14 +36,14 @@ * users easy interaction with the I2C Hardware in a familiar method. */ -#ifndef _HARDWIRE_H_ -#define _HARDWIRE_H_ +#ifndef _TWOWIRE_H_ +#define _TWOWIRE_H_ #include "WireBase.h" #include "wirish.h" #include -class HardWire : public WireBase { +class TwoWire : public WireBase { private: i2c_dev* sel_hard; uint8 dev_flags; @@ -59,7 +59,7 @@ class HardWire : public WireBase { * Check if devsel is within range and enable selected I2C interface with * passed flags */ - HardWire(uint8, uint8 = 0); + TwoWire(uint8, uint8 = 0); /* * Shuts down (disables) the hardware I2C @@ -70,9 +70,9 @@ class HardWire : public WireBase { /* * Disables the I2C device and remove the device address. */ - ~HardWire(); + ~TwoWire(); void begin(uint8 = 0x00); }; -extern HardWire Wire; -#endif // _HARDWIRE_H_ +extern TwoWire Wire; +#endif // _TWOWIRE_H_ From 98ed731df9fdf2516a1cb11c428807379d4763a7 Mon Sep 17 00:00:00 2001 From: aster94 Date: Thu, 7 Dec 2017 20:09:30 +0100 Subject: [PATCH 247/307] Add files via upload --- .../examples/i2c_scanner_softwire/i2c_scanner_softwire.ino | 2 +- STM32F1/libraries/Wire/rules.mk | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/STM32F1/libraries/Wire/examples/i2c_scanner_softwire/i2c_scanner_softwire.ino b/STM32F1/libraries/Wire/examples/i2c_scanner_softwire/i2c_scanner_softwire.ino index 0b4580a1e..f6bf6854e 100644 --- a/STM32F1/libraries/Wire/examples/i2c_scanner_softwire/i2c_scanner_softwire.ino +++ b/STM32F1/libraries/Wire/examples/i2c_scanner_softwire/i2c_scanner_softwire.ino @@ -5,7 +5,7 @@ #include -TwoWire SWire(PB6, PB7, SOFT_FAST); +SoftWire SWire(PB6, PB7, SOFT_FAST); void setup() { diff --git a/STM32F1/libraries/Wire/rules.mk b/STM32F1/libraries/Wire/rules.mk index e16f4db93..2b333327a 100644 --- a/STM32F1/libraries/Wire/rules.mk +++ b/STM32F1/libraries/Wire/rules.mk @@ -1,3 +1,7 @@ +#this makefile may not work since HardWire has been changed to the default Wire (TwoWire) +#anyway this file should be useless + + # Standard things sp := $(sp).x dirstack_$(sp) := $(d) From 2604eb6be242f76416bc89b7129f95f4b4a8598e Mon Sep 17 00:00:00 2001 From: aster94 Date: Thu, 7 Dec 2017 20:10:35 +0100 Subject: [PATCH 248/307] Add files via upload --- STM32F1/libraries/OLED_I2C/OLED_I2C.h | 2 +- STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/OLED_I2C/OLED_I2C.h b/STM32F1/libraries/OLED_I2C/OLED_I2C.h index 4bde83f28..abad639c3 100644 --- a/STM32F1/libraries/OLED_I2C/OLED_I2C.h +++ b/STM32F1/libraries/OLED_I2C/OLED_I2C.h @@ -87,7 +87,7 @@ */ #elif defined (__STM32F1__) #include "Arduino.h" -//#include +//#include #include "hardware/arm/HW_STM32_defines.h" #endif diff --git a/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h b/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h index 25967c7ca..a892c43c7 100644 --- a/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h +++ b/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h @@ -1,7 +1,7 @@ #include "Wire.h" #define WIRE_WRITE HWIRE.write - HardWire HWIRE(2,I2C_FAST_MODE); // stupid compiler + TwoWire WIRE(2,I2C_FAST_MODE); // stupid compiler void OLED::_convert_float(char *buf, double num, int width, byte prec) { From acc6cbc371963e9a500b5069223093ac07b5c187 Mon Sep 17 00:00:00 2001 From: aster94 Date: Thu, 7 Dec 2017 20:11:17 +0100 Subject: [PATCH 249/307] Add files via upload --- .../libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp | 6 +++--- STM32F1/libraries/Adafruit_SSD1306/STM32 README.txt | 6 +++--- .../ssd1306_128x64_i2c_STM32/ssd1306_128x64_i2c_STM32.ino | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp b/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp index d70aa13f4..34215da02 100644 --- a/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp +++ b/STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp @@ -22,10 +22,10 @@ All text above, and the splash screen below must be included in any redistributi //#endif #include -//#include + #include -//HardWire HWIRE(1,I2C_FAST_MODE); // I2c1 -//HardWire HWIRE(2,I2C_FAST_MODE); // I2c2 +//TwoWire WIRE(1,I2C_FAST_MODE); // I2c1 +//TwoWire WIRE(2,I2C_FAST_MODE); // I2c2 #include "Adafruit_GFX.h" #include "Adafruit_SSD1306_STM32.h" diff --git a/STM32F1/libraries/Adafruit_SSD1306/STM32 README.txt b/STM32F1/libraries/Adafruit_SSD1306/STM32 README.txt index 54705cf10..518aabe39 100644 --- a/STM32F1/libraries/Adafruit_SSD1306/STM32 README.txt +++ b/STM32F1/libraries/Adafruit_SSD1306/STM32 README.txt @@ -1,6 +1,6 @@ STM32 adaption by Matthias Diro, 25.03.2015 Things to know: -This adaption uses hardware I2C (hardwire.h), Port: I2c2. SDA=0, SCL=1 on maple mini +This adaption uses hardware I2C (now Wire.h), Port: I2c2. SDA=0, SCL=1 on maple mini To change it to Port I2C1: -//HardWire HWIRE(1,I2C_FAST_MODE); // I2c1 -HardWire HWIRE(2,I2C_FAST_MODE); // I2c2 \ No newline at end of file +//TwoWire WIRE(1,I2C_FAST_MODE); // I2c1 +TwoWire WIRE(2,I2C_FAST_MODE); // I2c2 \ No newline at end of file diff --git a/STM32F1/libraries/Adafruit_SSD1306/examples/ssd1306_128x64_i2c_STM32/ssd1306_128x64_i2c_STM32.ino b/STM32F1/libraries/Adafruit_SSD1306/examples/ssd1306_128x64_i2c_STM32/ssd1306_128x64_i2c_STM32.ino index b11bdc0ce..5b68b3fa0 100644 --- a/STM32F1/libraries/Adafruit_SSD1306/examples/ssd1306_128x64_i2c_STM32/ssd1306_128x64_i2c_STM32.ino +++ b/STM32F1/libraries/Adafruit_SSD1306/examples/ssd1306_128x64_i2c_STM32/ssd1306_128x64_i2c_STM32.ino @@ -1,7 +1,7 @@ /* STM32 adaption by Matthias Diro, tested with maple mini and heltec OLED 12864 I2c; adress: 0x3C (SPI should work, but I didn't own one) Things to know: - This adaption uses hardware I2C (hardwire.h), Port: I2c2. SDA=0, SCL=1 on maple mini + This adaption uses hardware I2C (now Wire.h), Port: I2c2. SDA=0, SCL=1 on maple mini further details: STM32_README.txt */ /********************************************************************* From 4ffdce29fe7bfc24b67acf1e4dbacbcd89b203a8 Mon Sep 17 00:00:00 2001 From: aster94 Date: Fri, 8 Dec 2017 10:32:59 +0100 Subject: [PATCH 250/307] Add files via upload --- STM32F1/libraries/Wire/SoftWire.h | 2 +- STM32F1/libraries/Wire/Wire.h | 4 +- STM32F1/libraries/Wire/keywords.txt | 17 +++ STM32F1/libraries/Wire/utility/WireBase.cpp | 145 ++++++++++++++++++++ STM32F1/libraries/Wire/utility/WireBase.h | 145 ++++++++++++++++++++ 5 files changed, 310 insertions(+), 3 deletions(-) create mode 100644 STM32F1/libraries/Wire/keywords.txt create mode 100644 STM32F1/libraries/Wire/utility/WireBase.cpp create mode 100644 STM32F1/libraries/Wire/utility/WireBase.h diff --git a/STM32F1/libraries/Wire/SoftWire.h b/STM32F1/libraries/Wire/SoftWire.h index b5c43dba3..c42bca44a 100644 --- a/STM32F1/libraries/Wire/SoftWire.h +++ b/STM32F1/libraries/Wire/SoftWire.h @@ -40,7 +40,7 @@ #ifndef _SOFTWIRE_H_ #define _SOFTWIRE_H_ -#include "WireBase.h" +#include "utility/WireBase.h" #include "wirish.h" /* diff --git a/STM32F1/libraries/Wire/Wire.h b/STM32F1/libraries/Wire/Wire.h index f235aec57..ab05d4216 100644 --- a/STM32F1/libraries/Wire/Wire.h +++ b/STM32F1/libraries/Wire/Wire.h @@ -25,7 +25,7 @@ *****************************************************************************/ /** - * @file TwoWire.h + * @file Wire.h * @author Trystan Jones * @brief Wire library, uses the hardware I2C available in the Maple to * interact with I2C slave devices. @@ -39,7 +39,7 @@ #ifndef _TWOWIRE_H_ #define _TWOWIRE_H_ -#include "WireBase.h" +#include "utility/WireBase.h" #include "wirish.h" #include diff --git a/STM32F1/libraries/Wire/keywords.txt b/STM32F1/libraries/Wire/keywords.txt new file mode 100644 index 000000000..3fddb6fe5 --- /dev/null +++ b/STM32F1/libraries/Wire/keywords.txt @@ -0,0 +1,17 @@ +####################################### +# Datatypes (KEYWORD1) +####################################### +TwoWire KEYWORD1 +SoftWire KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + + + +####################################### +# Constants (LITERAL1) +####################################### +SOFT_STANDARD LITERAL1 +SOFT_FAST LITERAL1 \ No newline at end of file diff --git a/STM32F1/libraries/Wire/utility/WireBase.cpp b/STM32F1/libraries/Wire/utility/WireBase.cpp new file mode 100644 index 000000000..220d845d7 --- /dev/null +++ b/STM32F1/libraries/Wire/utility/WireBase.cpp @@ -0,0 +1,145 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 LeafLabs LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file WireBase.cpp + * @author Trystan Jones + * @brief Wire library, following the majority of the interface from Arduino. + * Provides a 'standard' interface to I2C (two-wire) communication for + * derived classes. + */ + +/* + * Library created by crenn to allow a system which would provide users the + * 'standardised' Arduino method for interfacing with I2C devices regardless of + * whether it is I2C hardware or emulating software. + */ + +#include "WireBase.h" +#include "wirish.h" + +void WireBase::begin(uint8 self_addr) { + tx_buf_idx = 0; + tx_buf_overflow = false; + rx_buf_idx = 0; + rx_buf_len = 0; +} + +void WireBase::beginTransmission(uint8 slave_address) { + itc_msg.addr = slave_address; + itc_msg.data = &tx_buf[tx_buf_idx]; + itc_msg.length = 0; + itc_msg.flags = 0; +} + +void WireBase::beginTransmission(int slave_address) { + beginTransmission((uint8)slave_address); +} + +uint8 WireBase::endTransmission(bool stop) { + uint8 retVal; + if (tx_buf_overflow) { + return EDATA; + } + retVal = process(stop);// Changed so that the return value from process is returned by this function see also the return line below + tx_buf_idx = 0; + tx_buf_overflow = false; + return retVal;//SUCCESS; +} + +uint8 WireBase::endTransmission(){ + endTransmission(true); +} + +//TODO: Add the ability to queue messages (adding a boolean to end of function +// call, allows for the Arduino style to stay while also giving the flexibility +// to bulk send +uint8 WireBase::requestFrom(uint8 address, int num_bytes) { + if (num_bytes > BUFFER_LENGTH) { + num_bytes = BUFFER_LENGTH; + } + itc_msg.addr = address; + itc_msg.flags = I2C_MSG_READ; + itc_msg.length = num_bytes; + itc_msg.data = &rx_buf[rx_buf_idx]; + process(); + rx_buf_len += itc_msg.xferred; + itc_msg.flags = 0; + return rx_buf_len; +} + +uint8 WireBase::requestFrom(int address, int numBytes) { + return WireBase::requestFrom((uint8)address, numBytes); +} + +void WireBase::write(uint8 value) { + if (tx_buf_idx == BUFFER_LENGTH) { + tx_buf_overflow = true; + return; + } + tx_buf[tx_buf_idx++] = value; + itc_msg.length++; +} + +void WireBase::write(uint8* buf, int len) { + for (uint8 i = 0; i < len; i++) { + write(buf[i]); + } +} + +void WireBase::write(int value) { + write((uint8)value); +} + +void WireBase::write(int* buf, int len) { + write((uint8*)buf, (uint8)len); +} + +void WireBase::write(char* buf) { + uint8 *ptr = (uint8*)buf; + while (*ptr) { + write(*ptr); + ptr++; + } +} + +uint8 WireBase::available() { + return rx_buf_len - rx_buf_idx; +} + +uint8 WireBase::read() { + if (rx_buf_idx == rx_buf_len) { + rx_buf_idx = 0; + rx_buf_len = 0; + return 0; + } else if (rx_buf_idx == (rx_buf_len-1)) { + uint8 temp = rx_buf[rx_buf_idx]; + rx_buf_idx = 0; + rx_buf_len = 0; + return temp; + } + return rx_buf[rx_buf_idx++]; +} diff --git a/STM32F1/libraries/Wire/utility/WireBase.h b/STM32F1/libraries/Wire/utility/WireBase.h new file mode 100644 index 000000000..72facded6 --- /dev/null +++ b/STM32F1/libraries/Wire/utility/WireBase.h @@ -0,0 +1,145 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 LeafLabs LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file WireBase.h + * @author Trystan Jones + * @brief Wire library, following the majority of the interface from Arduino. + * Provides a 'standard' interface to I2C (two-wire) communication for + * derived classes. + */ + +/* + * Library created by crenn to allow a system which would provide users the + * 'standardised' Arduino method for interfacing with I2C devices regardless of + * whether it is I2C hardware or emulating software. + */ + +#ifndef _WIREBASE_H_ +#define _WIREBASE_H_ + +#include "wirish.h" +#include + +#define BUFFER_LENGTH 32 + +/* return codes from endTransmission() */ +#define SUCCESS 0 /* transmission was successful */ +#define EDATA 1 /* too much data */ +#define ENACKADDR 2 /* received nack on transmit of address */ +#define ENACKTRNS 3 /* received nack on transmit of data */ +#define EOTHER 4 /* other error */ + +class WireBase { // Abstraction is awesome! +protected: + i2c_msg itc_msg; + uint8 rx_buf[BUFFER_LENGTH]; /* receive buffer */ + uint8 rx_buf_idx; /* first unread idx in rx_buf */ + uint8 rx_buf_len; /* number of bytes read */ + + uint8 tx_buf[BUFFER_LENGTH]; /* transmit buffer */ + uint8 tx_buf_idx; // next idx available in tx_buf, -1 overflow + boolean tx_buf_overflow; + + // Force derived classes to define process function + virtual uint8 process(uint8) = 0; + virtual uint8 process() = 0; +public: + WireBase() {} + ~WireBase() {} + + /* + * Initialises the class interface + */ + // Allow derived classes to overwrite begin function + virtual void begin(uint8 = 0x00); + + /* + * Sets up the transmission message to be processed + */ + void beginTransmission(uint8); + + /* + * Allow only 8 bit addresses to be used + */ + void beginTransmission(int); + + /* + * Call the process function to process the message if the TX + * buffer has not overflowed. + */ + uint8 endTransmission(bool); + uint8 endTransmission(void); + + /* + * Request bytes from a slave device and process the request, + * storing into the receiving buffer. + */ + uint8 requestFrom(uint8, int); + + /* + * Allow only 8 bit addresses to be used when requesting bytes + */ + uint8 requestFrom(int, int); + + /* + * Stack up bytes to be sent when transmitting + */ + void write(uint8); + + /* + * Stack up bytes from the array to be sent when transmitting + */ + void write(uint8*, int); + + /* + * Ensure that a sending data will only be 8-bit bytes + */ + void write(int); + + /* + * Ensure that an array sending data will only be 8-bit bytes + */ + void write(int*, int); + + /* + * Stack up bytes from a string to be sent when transmitting + */ + void write(char*); + + /* + * Return the amount of bytes that is currently in the receiving buffer + */ + uint8 available(); + + /* + * Return the value of byte in the receiving buffer that is currently being + * pointed to + */ + uint8 read(); +}; + +#endif // _WIREBASE_H_ From 848602e0d6aa45cee6581848878579db34f69a0f Mon Sep 17 00:00:00 2001 From: aster94 Date: Fri, 8 Dec 2017 10:36:00 +0100 Subject: [PATCH 251/307] Delete WireBase.h --- STM32F1/libraries/Wire/WireBase.h | 145 ------------------------------ 1 file changed, 145 deletions(-) delete mode 100644 STM32F1/libraries/Wire/WireBase.h diff --git a/STM32F1/libraries/Wire/WireBase.h b/STM32F1/libraries/Wire/WireBase.h deleted file mode 100644 index 72facded6..000000000 --- a/STM32F1/libraries/Wire/WireBase.h +++ /dev/null @@ -1,145 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file WireBase.h - * @author Trystan Jones - * @brief Wire library, following the majority of the interface from Arduino. - * Provides a 'standard' interface to I2C (two-wire) communication for - * derived classes. - */ - -/* - * Library created by crenn to allow a system which would provide users the - * 'standardised' Arduino method for interfacing with I2C devices regardless of - * whether it is I2C hardware or emulating software. - */ - -#ifndef _WIREBASE_H_ -#define _WIREBASE_H_ - -#include "wirish.h" -#include - -#define BUFFER_LENGTH 32 - -/* return codes from endTransmission() */ -#define SUCCESS 0 /* transmission was successful */ -#define EDATA 1 /* too much data */ -#define ENACKADDR 2 /* received nack on transmit of address */ -#define ENACKTRNS 3 /* received nack on transmit of data */ -#define EOTHER 4 /* other error */ - -class WireBase { // Abstraction is awesome! -protected: - i2c_msg itc_msg; - uint8 rx_buf[BUFFER_LENGTH]; /* receive buffer */ - uint8 rx_buf_idx; /* first unread idx in rx_buf */ - uint8 rx_buf_len; /* number of bytes read */ - - uint8 tx_buf[BUFFER_LENGTH]; /* transmit buffer */ - uint8 tx_buf_idx; // next idx available in tx_buf, -1 overflow - boolean tx_buf_overflow; - - // Force derived classes to define process function - virtual uint8 process(uint8) = 0; - virtual uint8 process() = 0; -public: - WireBase() {} - ~WireBase() {} - - /* - * Initialises the class interface - */ - // Allow derived classes to overwrite begin function - virtual void begin(uint8 = 0x00); - - /* - * Sets up the transmission message to be processed - */ - void beginTransmission(uint8); - - /* - * Allow only 8 bit addresses to be used - */ - void beginTransmission(int); - - /* - * Call the process function to process the message if the TX - * buffer has not overflowed. - */ - uint8 endTransmission(bool); - uint8 endTransmission(void); - - /* - * Request bytes from a slave device and process the request, - * storing into the receiving buffer. - */ - uint8 requestFrom(uint8, int); - - /* - * Allow only 8 bit addresses to be used when requesting bytes - */ - uint8 requestFrom(int, int); - - /* - * Stack up bytes to be sent when transmitting - */ - void write(uint8); - - /* - * Stack up bytes from the array to be sent when transmitting - */ - void write(uint8*, int); - - /* - * Ensure that a sending data will only be 8-bit bytes - */ - void write(int); - - /* - * Ensure that an array sending data will only be 8-bit bytes - */ - void write(int*, int); - - /* - * Stack up bytes from a string to be sent when transmitting - */ - void write(char*); - - /* - * Return the amount of bytes that is currently in the receiving buffer - */ - uint8 available(); - - /* - * Return the value of byte in the receiving buffer that is currently being - * pointed to - */ - uint8 read(); -}; - -#endif // _WIREBASE_H_ From 558108d63e1490bc9977643b3a6e037a6ed07124 Mon Sep 17 00:00:00 2001 From: aster94 Date: Fri, 8 Dec 2017 10:36:15 +0100 Subject: [PATCH 252/307] Delete WireBase.cpp --- STM32F1/libraries/Wire/WireBase.cpp | 145 ---------------------------- 1 file changed, 145 deletions(-) delete mode 100644 STM32F1/libraries/Wire/WireBase.cpp diff --git a/STM32F1/libraries/Wire/WireBase.cpp b/STM32F1/libraries/Wire/WireBase.cpp deleted file mode 100644 index 220d845d7..000000000 --- a/STM32F1/libraries/Wire/WireBase.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file WireBase.cpp - * @author Trystan Jones - * @brief Wire library, following the majority of the interface from Arduino. - * Provides a 'standard' interface to I2C (two-wire) communication for - * derived classes. - */ - -/* - * Library created by crenn to allow a system which would provide users the - * 'standardised' Arduino method for interfacing with I2C devices regardless of - * whether it is I2C hardware or emulating software. - */ - -#include "WireBase.h" -#include "wirish.h" - -void WireBase::begin(uint8 self_addr) { - tx_buf_idx = 0; - tx_buf_overflow = false; - rx_buf_idx = 0; - rx_buf_len = 0; -} - -void WireBase::beginTransmission(uint8 slave_address) { - itc_msg.addr = slave_address; - itc_msg.data = &tx_buf[tx_buf_idx]; - itc_msg.length = 0; - itc_msg.flags = 0; -} - -void WireBase::beginTransmission(int slave_address) { - beginTransmission((uint8)slave_address); -} - -uint8 WireBase::endTransmission(bool stop) { - uint8 retVal; - if (tx_buf_overflow) { - return EDATA; - } - retVal = process(stop);// Changed so that the return value from process is returned by this function see also the return line below - tx_buf_idx = 0; - tx_buf_overflow = false; - return retVal;//SUCCESS; -} - -uint8 WireBase::endTransmission(){ - endTransmission(true); -} - -//TODO: Add the ability to queue messages (adding a boolean to end of function -// call, allows for the Arduino style to stay while also giving the flexibility -// to bulk send -uint8 WireBase::requestFrom(uint8 address, int num_bytes) { - if (num_bytes > BUFFER_LENGTH) { - num_bytes = BUFFER_LENGTH; - } - itc_msg.addr = address; - itc_msg.flags = I2C_MSG_READ; - itc_msg.length = num_bytes; - itc_msg.data = &rx_buf[rx_buf_idx]; - process(); - rx_buf_len += itc_msg.xferred; - itc_msg.flags = 0; - return rx_buf_len; -} - -uint8 WireBase::requestFrom(int address, int numBytes) { - return WireBase::requestFrom((uint8)address, numBytes); -} - -void WireBase::write(uint8 value) { - if (tx_buf_idx == BUFFER_LENGTH) { - tx_buf_overflow = true; - return; - } - tx_buf[tx_buf_idx++] = value; - itc_msg.length++; -} - -void WireBase::write(uint8* buf, int len) { - for (uint8 i = 0; i < len; i++) { - write(buf[i]); - } -} - -void WireBase::write(int value) { - write((uint8)value); -} - -void WireBase::write(int* buf, int len) { - write((uint8*)buf, (uint8)len); -} - -void WireBase::write(char* buf) { - uint8 *ptr = (uint8*)buf; - while (*ptr) { - write(*ptr); - ptr++; - } -} - -uint8 WireBase::available() { - return rx_buf_len - rx_buf_idx; -} - -uint8 WireBase::read() { - if (rx_buf_idx == rx_buf_len) { - rx_buf_idx = 0; - rx_buf_len = 0; - return 0; - } else if (rx_buf_idx == (rx_buf_len-1)) { - uint8 temp = rx_buf[rx_buf_idx]; - rx_buf_idx = 0; - rx_buf_len = 0; - return temp; - } - return rx_buf[rx_buf_idx++]; -} From 2d8af307dcf110d9bfeb82756f7fbe49ef3ef96f Mon Sep 17 00:00:00 2001 From: aster94 Date: Fri, 8 Dec 2017 10:36:53 +0100 Subject: [PATCH 253/307] Add files via upload --- STM32F1/libraries/Wire/keywords.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/STM32F1/libraries/Wire/keywords.txt b/STM32F1/libraries/Wire/keywords.txt index 3fddb6fe5..4234cc5e6 100644 --- a/STM32F1/libraries/Wire/keywords.txt +++ b/STM32F1/libraries/Wire/keywords.txt @@ -14,4 +14,5 @@ SoftWire KEYWORD1 # Constants (LITERAL1) ####################################### SOFT_STANDARD LITERAL1 -SOFT_FAST LITERAL1 \ No newline at end of file +SOFT_FAST LITERAL1 +I2C_FAST_MODE LITERAL1 \ No newline at end of file From b82911742f648970b277a5672f5b003029cbfd81 Mon Sep 17 00:00:00 2001 From: aster94 Date: Fri, 8 Dec 2017 10:37:26 +0100 Subject: [PATCH 254/307] Delete i2c_scanner_hardwire.ino --- .../i2c_scanner_hardwire.ino | 76 ------------------- 1 file changed, 76 deletions(-) delete mode 100644 STM32F1/libraries/Wire/examples/i2c_scanner_hardwire/i2c_scanner_hardwire.ino diff --git a/STM32F1/libraries/Wire/examples/i2c_scanner_hardwire/i2c_scanner_hardwire.ino b/STM32F1/libraries/Wire/examples/i2c_scanner_hardwire/i2c_scanner_hardwire.ino deleted file mode 100644 index d2b3bd430..000000000 --- a/STM32F1/libraries/Wire/examples/i2c_scanner_hardwire/i2c_scanner_hardwire.ino +++ /dev/null @@ -1,76 +0,0 @@ -// -------------------------------------- -// i2c_scanner -// -// Version 1 -// This program (or code that looks like it) -// can be found in many places. -// For example on the Arduino.cc forum. -// The original author is not know. -// Version 2, Juni 2012, Using Arduino 1.0.1 -// Adapted to be as simple as possible by Arduino.cc user Krodal -// Version 3, Feb 26 2013 -// V3 by louarnold -// Version 4, March 3, 2013, Using Arduino 1.0.3 -// by Arduino.cc user Krodal. -// Changes by louarnold removed. -// Scanning addresses changed from 0...127 to 1...119, -// according to the i2c scanner by Nick Gammon -// http://www.gammon.com.au/forum/?id=10896 -// Version 5, March 28, 2013 -// As version 4, but address scans now to 127. -// A sensor seems to use address 120. -// Version 6, August 1, 2015 -// Modified to support HardWire for STM32duino -// -// This sketch tests the standard 7-bit addresses -// Devices with higher bit address might not be seen properly. -// - -#include - -HardWire HWire(1, I2C_FAST_MODE); // I2c1 - -void setup() { - Serial.begin(115200); - HWire.begin(); - Serial.println("\nI2C Scanner"); -} - - -void loop() { - byte error, address; - int nDevices; - - Serial.println("Scanning..."); - - nDevices = 0; - for(address = 1; address < 127; address++) { - // The i2c_scanner uses the return value of - // the Write.endTransmisstion to see if - // a device did acknowledge to the address. - - HWire.beginTransmission(address); - error = HWire.endTransmission(); - - if (error == 0) { - Serial.print("I2C device found at address 0x"); - if (address < 16) - Serial.print("0"); - Serial.println(address, HEX); - - nDevices++; - } - else if (error == 4) { - Serial.print("Unknown error at address 0x"); - if (address < 16) - Serial.print("0"); - Serial.println(address, HEX); - } - } - if (nDevices == 0) - Serial.println("No I2C devices found"); - else - Serial.println("done"); - - delay(5000); // wait 5 seconds for next scan -} \ No newline at end of file From e2a62de0346d469a324603155256f9ac3ee93695 Mon Sep 17 00:00:00 2001 From: aster94 Date: Fri, 8 Dec 2017 10:39:53 +0100 Subject: [PATCH 255/307] Update i2c_scanner_wire.ino --- .../Wire/examples/i2c_scanner_wire/i2c_scanner_wire.ino | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/STM32F1/libraries/Wire/examples/i2c_scanner_wire/i2c_scanner_wire.ino b/STM32F1/libraries/Wire/examples/i2c_scanner_wire/i2c_scanner_wire.ino index 30224d2ca..0367b4eaa 100644 --- a/STM32F1/libraries/Wire/examples/i2c_scanner_wire/i2c_scanner_wire.ino +++ b/STM32F1/libraries/Wire/examples/i2c_scanner_wire/i2c_scanner_wire.ino @@ -26,6 +26,10 @@ #include +//use IIC2 +//TwoWire WIRE2 (2,I2C_FAST_MODE); +//#define Wire WIRE2 + void setup() { @@ -71,4 +75,4 @@ void loop() { Serial.println("done"); delay(5000); // wait 5 seconds for next scan -} \ No newline at end of file +} From f66b9f10f387e468e3cfb96517beb17911941b3d Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 10 Dec 2017 17:07:57 +1100 Subject: [PATCH 256/307] Hopefully fixed problem with tone() blocking when it should be non-blocking --- STM32F1/cores/maple/tone.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/STM32F1/cores/maple/tone.cpp b/STM32F1/cores/maple/tone.cpp index 45cfa0eec..b249a784a 100644 --- a/STM32F1/cores/maple/tone.cpp +++ b/STM32F1/cores/maple/tone.cpp @@ -186,7 +186,8 @@ void tone(uint32_t pin, uint32_t freq, uint32_t duration) { pinMode(tone_pin, INPUT); } - while(tone_nhw) ; // blocks till duration elapsed + + //while(tone_nhw) ; // blocks till duration elapsed } //////////////////////////////////////////////////////////////////////////////// From 87d1b1fdb7505d9605ccb58dee80a3311a300248 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sun, 10 Dec 2017 09:35:48 +0100 Subject: [PATCH 257/307] Create new file "atomic.h" as discussed here: https://github.com/rogerclarkmelbourne/Arduino_STM32/issues/403, taken from http://www.stm32duino.com/viewtopic.php?f=3&t=258&start=10 --- .../system/libmaple/include/libmaple/atomic.h | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 STM32F1/system/libmaple/include/libmaple/atomic.h diff --git a/STM32F1/system/libmaple/include/libmaple/atomic.h b/STM32F1/system/libmaple/include/libmaple/atomic.h new file mode 100644 index 000000000..db5e48975 --- /dev/null +++ b/STM32F1/system/libmaple/include/libmaple/atomic.h @@ -0,0 +1,69 @@ +/* +* This is port of Dean Camera's ATOMIC_BLOCK macros for AVR to ARM Cortex M3 +* v1.0 +* Mark Pendrith, Nov 27, 2012. +* +* From Mark: +* >When I ported the macros I emailed Dean to ask what attribution would be +* >appropriate, and here is his response: +* > +* >>Mark, +* >>I think it's great that you've ported the macros; consider them +* >>public domain, to do with whatever you wish. I hope you find them useful. +* >> +* >>Cheers! +* >>- Dean +*/ + +#ifndef _CORTEX_M3_ATOMIC_H_ +#define _CORTEX_M3_ATOMIC_H_ + +static __inline__ uint32_t __get_primask(void) \ +{ uint32_t primask = 0; \ + __asm__ volatile ("MRS %[result], PRIMASK\n\t":[result]"=r"(primask)::); \ + return primask; } // returns 0 if interrupts enabled, 1 if disabled + +static __inline__ void __set_primask(uint32_t setval) \ +{ __asm__ volatile ("MSR PRIMASK, %[value]\n\t""dmb\n\t""dsb\n\t""isb\n\t"::[value]"r"(setval):); \ + __asm__ volatile ("" ::: "memory");} + +static __inline__ uint32_t __iSeiRetVal(void) \ +{ __asm__ volatile ("CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ + __asm__ volatile ("" ::: "memory"); return 1; } + +static __inline__ uint32_t __iCliRetVal(void) \ +{ __asm__ volatile ("CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ + __asm__ volatile ("" ::: "memory"); return 1; } + +static __inline__ void __iSeiParam(const uint32_t *__s) \ +{ __asm__ volatile ("CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ + __asm__ volatile ("" ::: "memory"); (void)__s; } + +static __inline__ void __iCliParam(const uint32_t *__s) \ +{ __asm__ volatile ("CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ + __asm__ volatile ("" ::: "memory"); (void)__s; } + +static __inline__ void __iRestore(const uint32_t *__s) \ +{ __set_primask(*__s); __asm__ volatile ("dmb\n\t""dsb\n\t""isb\n\t"); \ + __asm__ volatile ("" ::: "memory"); } + + +#define ATOMIC_BLOCK(type) \ +for ( type, __ToDo = __iCliRetVal(); __ToDo ; __ToDo = 0 ) + +#define ATOMIC_RESTORESTATE \ +uint32_t primask_save __attribute__((__cleanup__(__iRestore))) = __get_primask() + +#define ATOMIC_FORCEON \ +uint32_t primask_save __attribute__((__cleanup__(__iSeiParam))) = 0 + +#define NONATOMIC_BLOCK(type) \ +for ( type, __ToDo = __iSeiRetVal(); __ToDo ; __ToDo = 0 ) + +#define NONATOMIC_RESTORESTATE \ +uint32_t primask_save __attribute__((__cleanup__(__iRestore))) = __get_primask() + +#define NONATOMIC_FORCEOFF \ +uint32_t primask_save __attribute__((__cleanup__(__iCliParam))) = 0 + +#endif From 1cc4f791914c20e4c562c8778ba3b41e3a0063d7 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 11 Dec 2017 09:05:38 +1100 Subject: [PATCH 258/307] Moved atomic.h for better AVR compatibility --- STM32F1/system/libmaple/include/util/atomic.h | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 STM32F1/system/libmaple/include/util/atomic.h diff --git a/STM32F1/system/libmaple/include/util/atomic.h b/STM32F1/system/libmaple/include/util/atomic.h new file mode 100644 index 000000000..db5e48975 --- /dev/null +++ b/STM32F1/system/libmaple/include/util/atomic.h @@ -0,0 +1,69 @@ +/* +* This is port of Dean Camera's ATOMIC_BLOCK macros for AVR to ARM Cortex M3 +* v1.0 +* Mark Pendrith, Nov 27, 2012. +* +* From Mark: +* >When I ported the macros I emailed Dean to ask what attribution would be +* >appropriate, and here is his response: +* > +* >>Mark, +* >>I think it's great that you've ported the macros; consider them +* >>public domain, to do with whatever you wish. I hope you find them useful. +* >> +* >>Cheers! +* >>- Dean +*/ + +#ifndef _CORTEX_M3_ATOMIC_H_ +#define _CORTEX_M3_ATOMIC_H_ + +static __inline__ uint32_t __get_primask(void) \ +{ uint32_t primask = 0; \ + __asm__ volatile ("MRS %[result], PRIMASK\n\t":[result]"=r"(primask)::); \ + return primask; } // returns 0 if interrupts enabled, 1 if disabled + +static __inline__ void __set_primask(uint32_t setval) \ +{ __asm__ volatile ("MSR PRIMASK, %[value]\n\t""dmb\n\t""dsb\n\t""isb\n\t"::[value]"r"(setval):); \ + __asm__ volatile ("" ::: "memory");} + +static __inline__ uint32_t __iSeiRetVal(void) \ +{ __asm__ volatile ("CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ + __asm__ volatile ("" ::: "memory"); return 1; } + +static __inline__ uint32_t __iCliRetVal(void) \ +{ __asm__ volatile ("CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ + __asm__ volatile ("" ::: "memory"); return 1; } + +static __inline__ void __iSeiParam(const uint32_t *__s) \ +{ __asm__ volatile ("CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ + __asm__ volatile ("" ::: "memory"); (void)__s; } + +static __inline__ void __iCliParam(const uint32_t *__s) \ +{ __asm__ volatile ("CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ + __asm__ volatile ("" ::: "memory"); (void)__s; } + +static __inline__ void __iRestore(const uint32_t *__s) \ +{ __set_primask(*__s); __asm__ volatile ("dmb\n\t""dsb\n\t""isb\n\t"); \ + __asm__ volatile ("" ::: "memory"); } + + +#define ATOMIC_BLOCK(type) \ +for ( type, __ToDo = __iCliRetVal(); __ToDo ; __ToDo = 0 ) + +#define ATOMIC_RESTORESTATE \ +uint32_t primask_save __attribute__((__cleanup__(__iRestore))) = __get_primask() + +#define ATOMIC_FORCEON \ +uint32_t primask_save __attribute__((__cleanup__(__iSeiParam))) = 0 + +#define NONATOMIC_BLOCK(type) \ +for ( type, __ToDo = __iSeiRetVal(); __ToDo ; __ToDo = 0 ) + +#define NONATOMIC_RESTORESTATE \ +uint32_t primask_save __attribute__((__cleanup__(__iRestore))) = __get_primask() + +#define NONATOMIC_FORCEOFF \ +uint32_t primask_save __attribute__((__cleanup__(__iCliParam))) = 0 + +#endif From 63f4162c6cbc23b5467ce7ced2bcf5d2bf0bf385 Mon Sep 17 00:00:00 2001 From: Thomas Friedrichsmeier Date: Tue, 12 Dec 2017 10:58:22 +0100 Subject: [PATCH 259/307] Fix compilation with -std=gnu++11 See https://github.com/rogerclarkmelbourne/Arduino_STM32/issues/402 --- STM32F1/libraries/STM32ADC/src/STM32ADC.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/STM32ADC/src/STM32ADC.h b/STM32F1/libraries/STM32ADC/src/STM32ADC.h index fd0588f5e..685eeb1d7 100644 --- a/STM32F1/libraries/STM32ADC/src/STM32ADC.h +++ b/STM32F1/libraries/STM32ADC/src/STM32ADC.h @@ -152,7 +152,7 @@ class STM32ADC{ voidFuncPtr _DMA_int; voidFuncPtr _ADC_int; voidFuncPtr _AWD_int; - static const float _AverageSlope = 4.3; // mV/oC //4.0 to 4.6 - static const float _V25 = 1.43; //Volts //1.34 - 1.52 + static constexpr float _AverageSlope = 4.3; // mV/oC //4.0 to 4.6 + static constexpr float _V25 = 1.43; //Volts //1.34 - 1.52 }; From 951d0acf178b28d52919fb777874d90603c88883 Mon Sep 17 00:00:00 2001 From: victorpv Date: Sat, 16 Dec 2017 17:25:57 -0600 Subject: [PATCH 260/307] Adding PB2 as in the Generic R and Z versions. --- STM32F1/variants/generic_stm32f103v/board.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/variants/generic_stm32f103v/board.cpp b/STM32F1/variants/generic_stm32f103v/board.cpp index 9c137725a..c24140e1e 100644 --- a/STM32F1/variants/generic_stm32f103v/board.cpp +++ b/STM32F1/variants/generic_stm32f103v/board.cpp @@ -98,7 +98,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - /* NOTE PB2 is not included as its Boot 1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ //JTDO, SPI3_SCK / I2S3_CK/ {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ //NJTRST, SPI3_MISO {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ //I2C1_SMBA/ SPI3_MOSI @@ -196,4 +196,4 @@ extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { DEFINE_HWSERIAL(Serial2, 3); DEFINE_HWSERIAL_UART(Serial3, 4); DEFINE_HWSERIAL_UART(Serial4, 5); -#endif \ No newline at end of file +#endif From e64dbc2d473a671f59f87655249247e34d026ef8 Mon Sep 17 00:00:00 2001 From: victorpv Date: Sat, 16 Dec 2017 17:28:00 -0600 Subject: [PATCH 261/307] Add PB2 to enums as in the R and Z Generic boards Can be used for output --- STM32F1/variants/generic_stm32f103v/board/board.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/variants/generic_stm32f103v/board/board.h b/STM32F1/variants/generic_stm32f103v/board/board.h index 3bb680a78..ccd5ecf84 100644 --- a/STM32F1/variants/generic_stm32f103v/board/board.h +++ b/STM32F1/variants/generic_stm32f103v/board/board.h @@ -124,10 +124,10 @@ * write code using low-level GPIO functionality. */ enum { PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, -PB0,PB1,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, +PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7,PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15, PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15, -};/* Note PB2 is skipped as this is Boot1 and is not going to be much use as its likely to be pulled permanently low */ +}; #endif From 09812b48630ff59613cbe1e813b0766f08394296 Mon Sep 17 00:00:00 2001 From: victorpv Date: Sun, 17 Dec 2017 15:20:07 -0600 Subject: [PATCH 262/307] Add comment to PB2 pin about boot1 function. --- STM32F1/variants/generic_stm32f103v/board.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/variants/generic_stm32f103v/board.cpp b/STM32F1/variants/generic_stm32f103v/board.cpp index c24140e1e..d5596a2b5 100644 --- a/STM32F1/variants/generic_stm32f103v/board.cpp +++ b/STM32F1/variants/generic_stm32f103v/board.cpp @@ -98,7 +98,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ // Boot1 pin. It affects boot mode (flash, RAM, ROM) {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ //JTDO, SPI3_SCK / I2S3_CK/ {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ //NJTRST, SPI3_MISO {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ //I2C1_SMBA/ SPI3_MOSI From 066dacf797c4ab42d99b9cb9ea1468ed6e6118f4 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Fri, 29 Dec 2017 08:58:57 +0100 Subject: [PATCH 263/307] Update wirish_debug.cpp reserve SWD lines only for debug --- STM32F1/cores/maple/stm32f1/wirish_debug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/cores/maple/stm32f1/wirish_debug.cpp b/STM32F1/cores/maple/stm32f1/wirish_debug.cpp index f0576165e..8f6cc98ee 100644 --- a/STM32F1/cores/maple/stm32f1/wirish_debug.cpp +++ b/STM32F1/cores/maple/stm32f1/wirish_debug.cpp @@ -37,5 +37,5 @@ void disableDebugPorts(void) { } void enableDebugPorts(void) { - afio_cfg_debug_ports(AFIO_DEBUG_FULL_SWJ); + afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY); } From 63f784ff6f4823d754c0f270ce55a17931456079 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Tue, 2 Jan 2018 16:19:31 +0100 Subject: [PATCH 264/307] Update HW_STM32.h remove static directive --- STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h b/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h index a892c43c7..20c1a16e5 100644 --- a/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h +++ b/STM32F1/libraries/OLED_I2C/hardware/arm/HW_STM32.h @@ -109,7 +109,7 @@ void OLED::update() twi->TWI_THR = scrbuf[b]; while ((twi->TWI_SR & TWI_SR_TXRDY) != TWI_SR_TXRDY) {}; */ - static byte aa=scrbuf[b]; + byte aa=scrbuf[b]; WIRE_WRITE(aa); } From 8540c6b08b20a5cd36964c6d1668269edbd2b5c5 Mon Sep 17 00:00:00 2001 From: BlackBrix-Editor <35255671+BlackBrix-Editor@users.noreply.github.com> Date: Tue, 9 Jan 2018 11:23:16 +0100 Subject: [PATCH 265/307] option XTAL16M for boards with 16MHz-crystal tested on STM32F103VE only but surely can be used on other STM32F103xC, STM32F103xD, STM32F103xE with the same clock PLL structure --- STM32F1/variants/generic_stm32f103v/wirish/boards.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/STM32F1/variants/generic_stm32f103v/wirish/boards.cpp b/STM32F1/variants/generic_stm32f103v/wirish/boards.cpp index 254666f68..ddeaa57e8 100644 --- a/STM32F1/variants/generic_stm32f103v/wirish/boards.cpp +++ b/STM32F1/variants/generic_stm32f103v/wirish/boards.cpp @@ -130,6 +130,12 @@ static void setup_clocks(void) { wirish::priv::board_setup_clock_prescalers(); rcc_configure_pll(&wirish::priv::w_board_pll_cfg); +#ifdef XTAL16M + // 16MHz crystal (HSE) + // in this case we additionally set the Bit 17 (PLLXTPRE=1) => then HSE clock is divided by 2 before PLL entry + RCC_BASE->CFGR |= RCC_CFGR_PLLXTPRE; +#endif + // Enable the PLL, and wait until it's ready. rcc_turn_on_clk(RCC_CLK_PLL); while(!rcc_is_clk_ready(RCC_CLK_PLL)) From d54de1cbb011fb2f4273a365340b2b3a29f23b6e Mon Sep 17 00:00:00 2001 From: BlackBrix-Editor <35255671+BlackBrix-Editor@users.noreply.github.com> Date: Tue, 9 Jan 2018 12:21:48 +0100 Subject: [PATCH 266/307] corrected RAM-length = 48kByte for STM32F103VC --- STM32F1/variants/generic_stm32f103v/ld/stm32f103vc.ld | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/variants/generic_stm32f103v/ld/stm32f103vc.ld b/STM32F1/variants/generic_stm32f103v/ld/stm32f103vc.ld index 7efca5d77..6079807f5 100644 --- a/STM32F1/variants/generic_stm32f103v/ld/stm32f103vc.ld +++ b/STM32F1/variants/generic_stm32f103v/ld/stm32f103vc.ld @@ -16,7 +16,7 @@ */ MEMORY { - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K rom (rx) : ORIGIN = 0x08000000, LENGTH = 256K } From 514cf856aae4e0f391c318d7677b53b4b04270a2 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Thu, 18 Jan 2018 11:39:03 +0100 Subject: [PATCH 267/307] Update boards.txt added error LED pin for generic F103C --- STM32F1/boards.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 49c12932a..cb9416a9c 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -346,6 +346,8 @@ genericSTM32F103C.build.variant=generic_stm32f103c genericSTM32F103C.build.vect=VECT_TAB_ADDR=0x8000000 genericSTM32F103C.build.core=maple genericSTM32F103C.build.board=GENERIC_STM32F103C +genericSTM32F103C.build.error_led_port=GPIOC +genericSTM32F103C.build.error_led_pin=13 genericSTM32F103C.upload.use_1200bps_touch=false genericSTM32F103C.upload.file_type=bin genericSTM32F103C.upload.auto_reset=true From 9cd2f3a74366835930c4f3ba94193fc9db42ad10 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 21 Jan 2018 15:34:24 +1100 Subject: [PATCH 268/307] Manually committed changes from https://github.com/rogerclarkmelbourne/Arduino_STM32/pull/401, as that PR included changes to permissions on unrelated files in the tools --- STM32F1/cores/maple/libmaple/usb/stm32f1/usb.c | 8 ++++++++ STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c | 9 +++++++-- STM32F1/system/libmaple/include/libmaple/usb.h | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb.c index f837eb64b..0feb745eb 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb.c @@ -120,6 +120,12 @@ static void usb_suspend(void) { USBLIB->state = USB_SUSPENDED; } +void usb_power_off(void) { + USB_BASE->CNTR = USB_CNTR_FRES; + USB_BASE->ISTR = 0; + USB_BASE->CNTR = USB_CNTR_FRES + USB_CNTR_PDWN; +} + static void usb_resume_init(void) { uint16 cntr; @@ -268,6 +274,7 @@ static void handle_out0(void); static void dispatch_ctr_lp() { uint16 istr; + while (((istr = USB_BASE->ISTR) & USB_ISTR_CTR) != 0) { /* TODO WTF, figure this out: RM0008 says CTR is read-only, * but ST's firmware claims it's clear-only, and emphasizes @@ -288,6 +295,7 @@ static void dispatch_ctr_lp() { } } + /* FIXME Dataflow on endpoint 0 RX/TX status is based off of ST's * code, and is ugly/confusing in its use of SaveRState/SaveTState. * Fixing this requires filling in handle_in0(), handle_setup0(), diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c index cba050f54..1f0b626a8 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c @@ -80,7 +80,6 @@ static uint8* usbGetConfigDescriptor(uint16 length); static uint8* usbGetStringDescriptor(uint16 length); static void usbSetConfiguration(void); static void usbSetDeviceAddress(void); - /* * Descriptors */ @@ -392,6 +391,8 @@ void usb_cdcacm_enable(gpio_dev *disc_dev, uint8 disc_bit) { } /* Initialize the USB peripheral. */ + /* One of the callbacks that will automatically happen from this will be to usbInit(), + which will power up the USB peripheral. */ usb_init_usblib(USBLIB, ep_int_in, ep_int_out); } @@ -403,6 +404,9 @@ void usb_cdcacm_disable(gpio_dev *disc_dev, uint8 disc_bit) { { gpio_write_bit(disc_dev, disc_bit, 1); } + /* Powerdown the USB peripheral. It gets powered up again with usbInit(), which + gets called when usb_cdcacm_enable() is called. */ + usb_power_off(); } void usb_cdcacm_putc(char ch) { @@ -644,7 +648,8 @@ static uint8* vcomGetSetLineCoding(uint16 length) { static void usbInit(void) { pInformation->Current_Configuration = 0; - USB_BASE->CNTR = USB_CNTR_FRES; + // Reset and power up the peripheral. + USB_BASE->CNTR = USB_CNTR_FRES; USBLIB->irq_mask = 0; USB_BASE->CNTR = USBLIB->irq_mask; diff --git a/STM32F1/system/libmaple/include/libmaple/usb.h b/STM32F1/system/libmaple/include/libmaple/usb.h index ea24030d4..1ea06e9de 100644 --- a/STM32F1/system/libmaple/include/libmaple/usb.h +++ b/STM32F1/system/libmaple/include/libmaple/usb.h @@ -157,6 +157,8 @@ typedef struct usblib_dev { extern usblib_dev *USBLIB; +void usb_power_off(void); + void usb_init_usblib(usblib_dev *dev, void (**ep_int_in)(void), void (**ep_int_out)(void)); From 0f78c266ed2c571e9e48e4236b3721c88752f4db Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Thu, 14 Dec 2017 16:32:59 +0100 Subject: [PATCH 269/307] Added Wire_slave.h (no actual i2c slave implementation yet) --- STM32F1/libraries/Wire/Wire_slave.h | 1 + STM32F1/libraries/Wire/library.properties | 10 + .../SFRRanger_reader/SFRRanger_reader.ino | 87 ++ .../digital_potentiometer.ino | 38 + .../i2c_libmaple_slave/i2c_libmaple_slave.ino | 122 +++ .../examples/master_reader/master_reader.ino | 32 + .../examples/master_writer/master_writer.ino | 31 + .../slave_receiver/slave_receiver.ino | 38 + .../examples/slave_sender/slave_sender.ino | 32 + .../libraries/WireSlave/library.properties | 11 + STM32F1/libraries/WireSlave/src/Wire.h | 1 + STM32F1/libraries/WireSlave/src/Wire.h.gch | Bin 0 -> 1819056 bytes .../libraries/WireSlave/src/Wire_slave.cpp | 106 +++ STM32F1/libraries/WireSlave/src/Wire_slave.h | 78 ++ .../libraries/WireSlave/src/Wire_slave.h.gch | Bin 0 -> 9475 bytes STM32F1/libraries/WireSlave/src/i2c_slave.c | 789 ++++++++++++++++++ .../libraries/WireSlave/src/i2c_slave.h.gch | Bin 0 -> 9475 bytes .../WireSlave/src/libmaple/i2c_common_slave.h | 110 +++ .../WireSlave/src/libmaple/i2c_slave.h | 475 +++++++++++ .../WireSlave/src/libmaple/i2c_slave.h.gch | Bin 0 -> 9475 bytes .../WireSlave/src/utility/WireBase_slave.cpp | 145 ++++ .../WireSlave/src/utility/WireBase_slave.h | 145 ++++ .../src/utility/WireBase_slave.h.gch | Bin 0 -> 9475 bytes 23 files changed, 2251 insertions(+) create mode 100644 STM32F1/libraries/Wire/Wire_slave.h create mode 100644 STM32F1/libraries/Wire/library.properties create mode 100644 STM32F1/libraries/WireSlave/examples/SFRRanger_reader/SFRRanger_reader.ino create mode 100644 STM32F1/libraries/WireSlave/examples/digital_potentiometer/digital_potentiometer.ino create mode 100644 STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino create mode 100644 STM32F1/libraries/WireSlave/examples/master_reader/master_reader.ino create mode 100644 STM32F1/libraries/WireSlave/examples/master_writer/master_writer.ino create mode 100644 STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino create mode 100644 STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino create mode 100644 STM32F1/libraries/WireSlave/library.properties create mode 100644 STM32F1/libraries/WireSlave/src/Wire.h create mode 100644 STM32F1/libraries/WireSlave/src/Wire.h.gch create mode 100644 STM32F1/libraries/WireSlave/src/Wire_slave.cpp create mode 100644 STM32F1/libraries/WireSlave/src/Wire_slave.h create mode 100644 STM32F1/libraries/WireSlave/src/Wire_slave.h.gch create mode 100644 STM32F1/libraries/WireSlave/src/i2c_slave.c create mode 100644 STM32F1/libraries/WireSlave/src/i2c_slave.h.gch create mode 100644 STM32F1/libraries/WireSlave/src/libmaple/i2c_common_slave.h create mode 100644 STM32F1/libraries/WireSlave/src/libmaple/i2c_slave.h create mode 100644 STM32F1/libraries/WireSlave/src/libmaple/i2c_slave.h.gch create mode 100644 STM32F1/libraries/WireSlave/src/utility/WireBase_slave.cpp create mode 100644 STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h create mode 100644 STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h.gch diff --git a/STM32F1/libraries/Wire/Wire_slave.h b/STM32F1/libraries/Wire/Wire_slave.h new file mode 100644 index 000000000..21b4102bd --- /dev/null +++ b/STM32F1/libraries/Wire/Wire_slave.h @@ -0,0 +1 @@ +#error "Something is trying to include Wire.h when Wire_Slave.h is already included, they are mutually exclusive" diff --git a/STM32F1/libraries/Wire/library.properties b/STM32F1/libraries/Wire/library.properties new file mode 100644 index 000000000..1129fa3fb --- /dev/null +++ b/STM32F1/libraries/Wire/library.properties @@ -0,0 +1,10 @@ +name=Wire +version=1.0 +author=Arduino +maintainer=Arduino +sentence=Allows the communication between devices or sensors connected via Two Wire Interface Bus. +paragraph= +category=Communication +url=http://www.arduino.cc/en/Reference/Wire +architectures=STM32F1 +include=Wire.h diff --git a/STM32F1/libraries/WireSlave/examples/SFRRanger_reader/SFRRanger_reader.ino b/STM32F1/libraries/WireSlave/examples/SFRRanger_reader/SFRRanger_reader.ino new file mode 100644 index 000000000..5537eca56 --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/SFRRanger_reader/SFRRanger_reader.ino @@ -0,0 +1,87 @@ +// I2C SRF10 or SRF08 Devantech Ultrasonic Ranger Finder +// by Nicholas Zambetti +// and James Tichenor + +// Demonstrates use of the Wire library reading data from the +// Devantech Utrasonic Rangers SFR08 and SFR10 + +// Created 29 April 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(); // join i2c bus (address optional for master) + Serial.begin(9600); // start serial communication at 9600bps +} + +int reading = 0; + +void loop() +{ + // step 1: instruct sensor to read echoes + Wire.beginTransmission(112); // transmit to device #112 (0x70) + // the address specified in the datasheet is 224 (0xE0) + // but i2c adressing uses the high 7 bits so it's 112 + Wire.write(byte(0x00)); // sets register pointer to the command register (0x00) + Wire.write(byte(0x50)); // command sensor to measure in "inches" (0x50) + // use 0x51 for centimeters + // use 0x52 for ping microseconds + Wire.endTransmission(); // stop transmitting + + // step 2: wait for readings to happen + delay(70); // datasheet suggests at least 65 milliseconds + + // step 3: instruct sensor to return a particular echo reading + Wire.beginTransmission(112); // transmit to device #112 + Wire.write(byte(0x02)); // sets register pointer to echo #1 register (0x02) + Wire.endTransmission(); // stop transmitting + + // step 4: request reading from sensor + Wire.requestFrom(112, 2); // request 2 bytes from slave device #112 + + // step 5: receive reading from sensor + if(2 <= Wire.available()) // if two bytes were received + { + reading = Wire.read(); // receive high byte (overwrites previous reading) + reading = reading << 8; // shift high byte to be high 8 bits + reading |= Wire.read(); // receive low byte as lower 8 bits + Serial.println(reading); // print the reading + } + + delay(250); // wait a bit since people have to read the output :) +} + + +/* + +// The following code changes the address of a Devantech Ultrasonic Range Finder (SRF10 or SRF08) +// usage: changeAddress(0x70, 0xE6); + +void changeAddress(byte oldAddress, byte newAddress) +{ + Wire.beginTransmission(oldAddress); + Wire.write(byte(0x00)); + Wire.write(byte(0xA0)); + Wire.endTransmission(); + + Wire.beginTransmission(oldAddress); + Wire.write(byte(0x00)); + Wire.write(byte(0xAA)); + Wire.endTransmission(); + + Wire.beginTransmission(oldAddress); + Wire.write(byte(0x00)); + Wire.write(byte(0xA5)); + Wire.endTransmission(); + + Wire.beginTransmission(oldAddress); + Wire.write(byte(0x00)); + Wire.write(newAddress); + Wire.endTransmission(); +} + +*/ diff --git a/STM32F1/libraries/WireSlave/examples/digital_potentiometer/digital_potentiometer.ino b/STM32F1/libraries/WireSlave/examples/digital_potentiometer/digital_potentiometer.ino new file mode 100644 index 000000000..8830ada12 --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/digital_potentiometer/digital_potentiometer.ino @@ -0,0 +1,38 @@ +// I2C Digital Potentiometer +// by Nicholas Zambetti +// and Shawn Bonkowski + +// Demonstrates use of the Wire library +// Controls AD5171 digital potentiometer via I2C/TWI + +// Created 31 March 2006 + +// This example code is in the public domain. + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(); // join i2c bus (address optional for master) +} + +byte val = 0; + +void loop() +{ + Wire.beginTransmission(44); // transmit to device #44 (0x2c) + // device address is specified in datasheet + Wire.write(byte(0x00)); // sends instruction byte + Wire.write(val); // sends potentiometer value byte + Wire.endTransmission(); // stop transmitting + + val++; // increment value + if(val == 64) // if reached 64th position (max) + { + val = 0; // start over from lowest value + } + delay(500); +} diff --git a/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino b/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino new file mode 100644 index 000000000..23456e40a --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino @@ -0,0 +1,122 @@ +/* +* i2c_slave example.cpp +* +* You can use this sketch in combination with master_writer.pde +* +* Created on: 4 Sep 2012 +* Author: Barry Carter +*/ +#include +#include + +#define USE_BUFFERED_EXAMPLE 1 + +i2c_msg msg; +uint8 buffer[255]; +char* const bufferAsChar = (char*)buffer; // ready type casted alias + +volatile bool newMessage = false; + +void funcrx(i2c_msg *msg __attribute__((unused))){ + // Received length will be in msg->length + newMessage = true; +} + +#if USE_BUFFERED_EXAMPLE == 1 +/* We ARE using a buffer to transmit the data out. +* Make sure you fill the buffer with the data AND you set the length correctly +*/ +void functx(i2c_msg *msg){ + // Cheeky. We are using the received byte of the data which is currently in + // byte 0 to echo it back to the master device + //msg->data[0] = 0x01; // We are re-using the rx buffer here to echo the request back + msg->data[1] = 0x02; + msg->data[2] = 0x03; + msg->data[3] = 0x04; + msg->data[4] = 0x05; + msg->length = 5; +} + +#else + +/* We are NOT using the buffered data transmission +* We will get this callback for each outgoing packet. Make sure to call i2c_write +* Strickly speaking, we should be sending a NACk on the last byte we want to send +* but for this test example I am going to assume the master will NACK it when it +* wants to stop. +*/ +void functx(i2c_msg *msg){ + i2c_write(I2C1, msg->data[0]); +} + +#endif + +// #define Serial Serial1 + +void setup() { + Serial.begin(115200); + while(!Serial) + ; + Serial.println("I2C Slave example"); + + // attach the buffer + msg.data = buffer; + + /* Init slave mode. Enables master too + * We are going to configure the slave device to + * - enable fast I2C (400khz) + * - dual addresses (can have 2 addresses per module) + * general call (accepts data writes to 0x00 on a broadcast basis) + * + * If the buffered example is enabled, then we also enable the + * buffer for rx and tx. + * Note you can independently enable/disable RX and TX buffers to + * allow a buffered read and direct writes. Useful if you don't know how + * much the master will read. + */ + #if USE_BUFFERED_EXAMPLE == 1 + i2c_slave_enable(I2C1, I2C_FAST_MODE | I2C_SLAVE_DUAL_ADDRESS | I2C_SLAVE_GENERAL_CALL | I2C_SLAVE_USE_RX_BUFFER | I2C_SLAVE_USE_TX_BUFFER); + #else + i2c_slave_enable(I2C1, I2C_FAST_MODE | I2C_SLAVE_DUAL_ADDRESS | I2C_SLAVE_GENERAL_CALL); + #endif + + // attach receive handler + i2c_slave_attach_recv_handler(I2C1, &msg, funcrx); + // attach transmit handler + i2c_slave_attach_transmit_handler(I2C1, &msg, functx); + + // set addresss to 4 + i2c_slave_set_own_address(I2C1, 4); +} + +void loop() { + static uint32_t lastMessage = millis(); + + // This is potentially dangerous. + // We're reading from the live buffer, the content can change + // in the middle of Serial.println + + if (newMessage && strlen(bufferAsChar)==6) { + for (int i=0; i<5; i++) { + // Print as char + Serial.print(bufferAsChar[i]); + } + // Print as byte + Serial.println(buffer[5]); + lastMessage = millis(); + newMessage = false; + } else { + if(newMessage && strlen(bufferAsChar)!=6) { + // this also happends on the line "x is 0" + Serial.print("Bad data received:"); + Serial.println(bufferAsChar); + Serial.print("strlen:"); + Serial.println(strlen(bufferAsChar)); + newMessage = false; + } else + if(millis() - lastMessage > 3000){ + Serial.println("Nothing received in 3 seconds."); + lastMessage = millis(); + } + } +} diff --git a/STM32F1/libraries/WireSlave/examples/master_reader/master_reader.ino b/STM32F1/libraries/WireSlave/examples/master_reader/master_reader.ino new file mode 100644 index 000000000..4b45d1289 --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/master_reader/master_reader.ino @@ -0,0 +1,32 @@ +// Wire Master Reader +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Reads data from an I2C/TWI slave device +// Refer to the "Wire Slave Sender" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(); // join i2c bus (address optional for master) + Serial.begin(9600); // start serial for output +} + +void loop() +{ + Wire.requestFrom(2, 6); // request 6 bytes from slave device #2 + + while(Wire.available()) // slave may send less than requested + { + char c = Wire.read(); // receive a byte as character + Serial.print(c); // print the character + } + + delay(500); +} diff --git a/STM32F1/libraries/WireSlave/examples/master_writer/master_writer.ino b/STM32F1/libraries/WireSlave/examples/master_writer/master_writer.ino new file mode 100644 index 000000000..f997473a7 --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/master_writer/master_writer.ino @@ -0,0 +1,31 @@ +// Wire Master Writer +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Writes data to an I2C/TWI slave device +// Refer to the "Wire Slave Receiver" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(); // join i2c bus (address optional for master) +} + +byte x = 0; + +void loop() +{ + Wire.beginTransmission(4); // transmit to device #4 + Wire.write("x is "); // sends five bytes + Wire.write(x); // sends one byte + Wire.endTransmission(); // stop transmitting + + x++; + delay(500); +} diff --git a/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino b/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino new file mode 100644 index 000000000..b430c2539 --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino @@ -0,0 +1,38 @@ +// Wire Slave Receiver +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Receives data as an I2C/TWI slave device +// Refer to the "Wire Master Writer" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(4); // join i2c bus with address #4 + Wire.onReceive(receiveEvent); // register event + Serial.begin(9600); // start serial for output +} + +void loop() +{ + delay(100); +} + +// function that executes whenever data is received from master +// this function is registered as an event, see setup() +void receiveEvent(int howMany) +{ + while(1 < Wire.available()) // loop through all but the last + { + char c = Wire.read(); // receive byte as a character + Serial.print(c); // print the character + } + int x = Wire.read(); // receive byte as an integer + Serial.println(x); // print the integer +} diff --git a/STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino b/STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino new file mode 100644 index 000000000..fcdac14b3 --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino @@ -0,0 +1,32 @@ +// Wire Slave Sender +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Sends data as an I2C/TWI slave device +// Refer to the "Wire Master Reader" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(2); // join i2c bus with address #2 + Wire.onRequest(requestEvent); // register event +} + +void loop() +{ + delay(100); +} + +// function that executes whenever data is requested by master +// this function is registered as an event, see setup() +void requestEvent() +{ + Wire.write("hello "); // respond with message of 6 bytes + // as expected by master +} diff --git a/STM32F1/libraries/WireSlave/library.properties b/STM32F1/libraries/WireSlave/library.properties new file mode 100644 index 000000000..2a1c387b2 --- /dev/null +++ b/STM32F1/libraries/WireSlave/library.properties @@ -0,0 +1,11 @@ +name=Wire_Slave +version=1.0 +author= +email= +sentence=Wire with slave support +paragraph=Experimental Wire with slave support +url= +architectures=STM32F1 +maintainer= +category=Communication +include=src/Wire_Slave.h diff --git a/STM32F1/libraries/WireSlave/src/Wire.h b/STM32F1/libraries/WireSlave/src/Wire.h new file mode 100644 index 000000000..ede963b37 --- /dev/null +++ b/STM32F1/libraries/WireSlave/src/Wire.h @@ -0,0 +1 @@ +#error "Something is trying to include Wire_slave.h when Wire.h is already included, they are mutually exclusive" diff --git a/STM32F1/libraries/WireSlave/src/Wire.h.gch b/STM32F1/libraries/WireSlave/src/Wire.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..b29a5ea9fd8851ea75533c42ff77077972caf5ce GIT binary patch literal 1819056 zcmeEv37jKUwSEB67DWSYEiNxEXphL4UMGWqJKZ(&?hpJ(EV% zxS$cYX48n`Yh^JgXk5@1QRDV(*B2Kw;?~My0O9p}Jblsk)c-m6yOpX_Rhhx%sefPf z@7MY2JLfLvp1Swey|->vO&Q~<6T;nnuY3B1$A)kD^&9Sb&nIp@=ih#}FK}2u{Vjgx z+3M&p%>z(4D8kx*4-4cY11ApjX_*yXCwv4HtyEp~u)|rT;vHrhgUn$MBDkX2#p<|~ z!(k7#>ud(u#pdy0fvIFRIh!7rS(7?Q|Bs^oczoBck@&9NJ9lh9JsuDBK7nM9R`M;U z4ad*iwmm)+8zDv4iQVCz?scr@sPXu?VZ=x0=4R7l^K;2us3#nbgf~8kRF75aJ=?bL zjt>uQ+O@lTAb#ei7$p(TPtxD9trRxx-f`x(&GAi}U$kf2&Y@7xvq|#^6?yCMZk2UB z)V;oYLx11KzTW<9PjVn7~j0(%#q=t zSg7aeq;i@PiSIsVWQa_e&*suo+2llMJT*GYiLh1Vif!i(?bsUMI=o}k?ns!zbq{b7 zM=2#0h|96LYkXa3JoJobgoZiN(Mrdqjo6CWNzz9u&Drb+d->T1dyXUBW0aoVn424& zOOMA#bGhW~9DA~_JN#tQatY({9Xq!S?Tim^+r4{uC_c1(%eGD1*|MJAzNe8Mxv=4` zTsSBG+cV7Oz|gZdM>p+kh1`GulTRf5F)FhyLz@Ts;zJ|5whix4*$kc7-M?kaGfBw~ zjmO#7(M@L!#dn>veY5iRrkz9aP20D`cb&ayB;FnBe$Zii{)n)Bq3#WoKTZ?Z%q>IP zckDb<*OG~u`LRs0t8e|rzVJZ*Kwp2Pue+yjpuexLdjnUNp1$FA58A9qsQW3D6<1{x zSJzYJx#1m~Ul`xIbBL-dw-PwjR{ughT$^xexfTzdwTW8M(C+AtE!+b5tfJ2Hc^^w> zM`st}ne<$8b~M9nsJl0;&gwsTW!~EprzT|?z=8P8qAl(polTEUP&JxMP8*p~-6l7L z`?@Fy3{q`!D>X?v#m*|JYXVgkt_+r+xd-SDw>p8|@CMZfAV4cYd)?<|48NpCbMbU` zJTpI$?4llKT__&6iQ;i3WOvx>9vg-(r#I5i>2%P4JgyoT+TJ=6I9v8XOT?wu?IgO> zYK>g`pVLwetNu=PRMhE2Hg4$c?%UYk+rOcww|m1tf4C=kLf^*T9@Um??o?fzz4)GW z=d>L=hV7@0+Y-7_b|Dv8cTAa??3C3zrL%Jnr;rb$|2S2X?0i1d&1byjFRBuvtqyG2 z%I@MzL_9v9O;dR8YS7VhRusW`=J#-= zjcNr|=RKS-#Hw|iwrw|wBUZn-%hBC%xkX2$(&;)e9=CT)Cx*J$v5UFv>de#GwRO88 z5yeb`No5mS=)1pzUJW8|hic&cXFeby(Z@`r6&kH4e$C{=w>L*LQF132*F) zZ0x6NT%^0FKTLng6E|$NoXqFv?4eCBL{3*KbsRLmR2`SQiReSIi3qUkTA3xpJ`?Ht*o#N!JZ7sHz00;>vC2 z^_ik@T|@r?&8{8P!wmEdP%P>J`@{Xi>>ti59_KnsrweDFBf)i4fNf_|{oJCQ+M}u` ziZ+#fes>_IO+7+h(%+T)m zc3hY(ADzB^&t@{CpIZou!zXa(?%mr$-B!Ck^Gwyk*jCuX^@3B?mpCd1cge_7k5H78 zx9r$+8Vw0ZKfpGj2A{U=^wWoS?T&96-gf$SZpBJ(bqf0;EZ~bFcT~7^Oe8bODH?)g zr{d!?+1%Xh{P^6=tQyk|g!{r2&Z@?6p}ydDucyJ-z{cM0-oD5H^^^S@!jbO&zbse%DM0IbOcQ`U ztL;(~?Cy!k%TI6b7S(o<;jUdne6`sf<+54@(j9h`s_xDqHhU=4-P;}B(DMv375R?r z-nnJl)~&5em06h9Nw-?h==8(@4Gyi7srr=dJL0>eJBK!H*~NLY(Kwm5yv=FHK!1Pl zfM~Paef2+!;-K=Vwx)jU-G^xk0s&8cP< z2@i1IFpWE(O{Z;(pEa~|*R~zoL*3!Z9^0^g%h{WDZtaP0 z-nuQmY1f&dZp(8tQI7MeU{9k0uvwYW>9L7XWz5F#1|Diybyg2W9nHnj->CYk`~VCpX167Jf9vXCUZYOiwk5um<|><1S8Qdd8xZ$Oln|4{f8N1zz=sgSOT7c6=jc42T z;ceU1rNwGkWUpg7)3dRau2~p0el~{`7+84z4pC|Qwy1W4&RbQ#P1J|#OL`yMj3%M$ zD|zYZ{p=cUUyp~{%-p$SK^(SOT{6gU zdmCsiPEh^hu8XS-txfRY(;P+VRSvE=YX($2Awe#&AP-44R2*fvp>*P za#<~3*zL0#5!dIPo3^MKL=X4WI2)=0=~Xe|CCZU&6B>gWkk}@6>%)=09$J3e(9;*8 z*+E}lZ(q1Od1Cj*VeY@tO4umw53GsOo?)H`K7{_`@qKz#!|Whi1va}7^Aa1P;I7FP zCTF7RbH*r=+1u)Cwz}xCA22UeMM0bHj#vX>TrAkF+#YZhqdtVZx@*sAyt2c~CaPx) zujhGCSdUn^!r`Q~S`WoB3t_JTe7t9v7bBb%^dQa6>fFsixaizDC2Ne%xwe)@dLtoH z>N4{b$h66HtZAD%W$>ID?ee-E4Uu+iALemycnhV12Cuu+HvUjf@&0LDORRHbmc~B9 zmID*Bf3z(|g=vuK(OWqNxc2IQJQdMB_&4r1=6h6x+Rh)0s4YxK34U_CC^m?SFv2pvl z#eEd2yXs#@vs20V*k~>}5ucoycRCSS_rYm(Oo|_)cWVnmqv%_^j zEXV3$d22bA-HT$G?rojl4cwqm)wBcc*B3goR#oI)TtUX!O~iQPN* z@G5kun_DKX72F-5Pgc_d2)Q;ms{v~;xKOK)d@{I;Y*j{gBjE-DH*h9a9jCdXb4)@@ z71o%fueV3dhj9VqA*`)Z_4mpJi*zqSA=s0)k%E2b);-W0>0W1@H#I*t&zsfkl^ymzhRbPBveh|pg0{X(+s4gAJCqw2 z9IE>Q+f|X*9j$WdF&54GH^pe7A>2zbQCIkUTjL$uY>&n|v;?)0W_`5CMDyWDKMi{Z zhS%|u_>uG<=V_UJ5X@eV=s^%$=IGU}VH=$rtIN=(GRHa8TXUPTnzN&x+fN&xTohj| z_l<1Yy_uFa&Y~4$x|+NDTH9#F)s{s+&rQeK9L=6&m`7;V$;9=-98Ov{Hm%W&Iy25C zHmlQBmScj^n)q3*h))jnskQ~z?hV}e!#ye*PpGM6R5h&$^VZm|oh)G=pu;%roZUl* znjTr}MCuAQpPfrjC*z~Dv!e?+nkz&$bocOSvu1sit!>CFFMzZhLbsrtH^kProTvIh z`;Elz^)#^V*%;{?p#G>Y(oNklEy>gRdH+@}F)oCvhFPb^V~AwcGS~eaYZk$y9xI@| zN^uuub=1hImn`dv&`sX~YLERrkx2hWx<^1ut&y#Krf@FUWoiXCnK#tso^JnHCq%8s z(Fx&-)9S%33#dVGJ;r5SH;C2}bA;;>`UlP=nIBIYb7@*E*7G-Ug=LE!S6GgY3QIMK zdkzkR(GN{F`(1s+W*TPf;ej3J31d|yrLJxV*Q!2wx#iU0Cu?oiY%F`!h+Ai_7c{M5 zJ1tmK4z~VF+*s~iPdAfkhT7lT9f|bxZJ^Gmr@xo)r}THLp;2q*O@jthLz};O#x8nm zb6wNn99QXg4ZSG7dDrexKlcdmx;dz@N43|PFok3%$GNFecXg;~15Fat70lMm%@fla zH}&>$Yqa@>FElOJb@5%LZgrOn?Sd~(=5nvqx9FN=t)kL$92W}%I<8FfwC#ZgL6d3P zkYT?W&dZ%8$|RBKd5^*g?6$DW;=sn)w{1g%!{YI&&7r7_pgd#}EnvZTM~ z%uR=8lT*g%>~!FylL9BFv$W=%o(Rntw9A0*>zo?c9N2uq2>~@Kq8%LD>28tk-f5o` z-BJylPJ3u*Z_ms$?IuWOCj_UxDzkHtj8U&l_ag*}kB`!-b_O!{G3`sBP9tv2P-mmV z@HlRKG-G8nZc4JF)bqFUmtvb4Erm^%nVF$+^#Y|pMc{jP$V`Zx!CN`0P{c%8TEgti zfzh-*y{Y;11XWx|E?Vl$WM+1P7XByN+2&NYi|(DL8T$}<&+3b+!(ubGscx4y$$7U@ zo7h_GjBFyULjd>%9GF(|AQP9d(dAok0$kOnV#5RN9)Y0)}D$E;g!fiY%o<`(c0(f&dV%rtF4*>Tf)@w(Yk@z2bnBx zZ~N#CqzX><(rDwoRIt#Y$tB0t&`ycB3sFGbay>Nw>V~u z1zT=5p*yTiLLK{5Qg>`Pj!%rvjiMA#k)O)176Y|FJYgTFk%yC4$usYTG2Q; zeKtuBY}r6gb(&?0gjtr*ZdOZbH>)MIo7EE9%o@)mN9nYgwv5v$ADyL9L!O3KwD{Rx zW4Fv1i|!2{B%;kuS45k+E}h+KhnaDzxMmUDrkfJG$(GD!YD;J{u_d#a){@ywYRPP- z&>n@+bS_CMn(SE?s*@e3+UOy&+t>;x{Ao#TR$4-vnU>IIrxsF|((+hKdu{I?(8A8ogw6}#4ZDr)MbH^x=i3+&#W*=b7t0^J zonB^U)K&wT*$n}=*`Nfr>=n1=thg;x#ceH7)dF>*E&p3Gd)9WT%>bL&W`<2_GsY&h znM7W37+^~5*;_JO<}INu>z2%xaZ6^)mT%b8>~NAdOIc;l(LB~k?Pe&wsQi%F41mCv zI|TNuITL%=%+=E2gO*6-ZibTP_>Di z>p50ny9Q%&ht6E%@fMr27l&4_`*=#l3Xn5|x$?s^hIYEvs?b3LcoxR7QshX$K0(Cl z#=!!3W?(K7IgK~vZT!_z>p7oSzV=mugXr6vWzLkvs)bid&VYwb@=&&!DT;NBgJo?l z7pUp(g9&(O8!1FTvB7Jfv-Afc8lo%9cagzPt2E_uz0T2MWgwj9gD0e&aqvJWXWKC5lAAMtDOU?!4omI2 zHodgN81}V8Z&hm*(Oa$86J1JLS@e)u zYm9A`ZH(9Jjvmpl0_jw!wMa|IJLGK!=~c$oIE(^%j#~9FO{#6 z16gZy>#4TJxkBwR;uU(&v9AolU7H-)3cY(gEY%((<5mEg5YQvk*@^Lt{Vec20pfX2 zab_a#DWA4iE_y6Zr!uQ1Tjto>lIP|;lA-&I{A>YrT?cqA*;W-)a;AFTpgXZr&8wKy zJ&dP#QfuWlY0v|6bCYb1kWVM4$7wR-A)cPu&(Aoxf*WnZ^9gVUZ*+fLC=KIfTh zZqCShSwl|;j*q&nVX;S9Nt|sH+%xt4?R>evjrIH6mUn;7J4#aBW@w$h(J^|4$adOB z$JDG<*Wc0c@i^THpGfXctA!2oq>qlz$Y3)$zK>v6^ZLKwt^oEH!3hdZcM+(P%uZ4* zwI?*Ocb*m)r~*$LGql;$UJ*y9rsz%x-Q(e>`Ds@GJts=5zq84lu$1q4(4B3%_clW} zUn~omkGcf$1L?UGZj{({hLKrta=J}2C32!`nmr6r;Q`{pMa*3Rgi9!donME^=alNSOrA0K!(%OIumsOu^2_#-|ONGsgJlpPlp4fm#GMYm8b! z=(U@zB((LzI%i|_5Fy`&GUJTPy35pF3g&j3s3Q}VSaBJF0@%x~LWqJx;!0Ht993~OWPvk5$bJ|`E<|5Stqq8(&nzWBNCzLG5d*d_n({`sMQ`jw~-pXLF0i>9u+bd$8 zMl!W=)hVPo;{2>5Rmjv{DSFuhZ3eOxfyUmF*@w%d9CxbiM@49QqSS7_yuwr9yd!j81{c$XNty`D;Bpo@ zNl&qg%w{HJ@Ry3BjiOK4uF+XSTSrl&G znDY!sivu(*c1`{Den7L05fy!c;-csrK$LxUW{kQ??nYJe_5$YUZnB7cfbJ5DN~i>0 z_D+pXi`t-g++LrQ#GX0??l5+1RhWznwSFvMP=r;?s& zlh`x#oOkFs&(Im~v`Orhb|&d*H;Fw%ds~ueW67L%+H;<1XWKZOnN?iGGM+b#!a+Q#wBMaA*RhnAv~_D&M5nWSptw|P0Tr1lQ9B^ASCOX?Yxs++Ap zZw1axw3B-qlADn7-{TPja`)NVPt~($ z!tD$t7YlW866Bugq`mVsNbVUv*CyXwn{-I-z7XuE=F;PFfzWdI9wdO~QS`$kxrKgCz0@Ldl z?Kj&HI6uo~_**J~t|6<~kLYxCK+b5>s@KoM!f?Je)=@$fP{do!LK~+vi~f zS8qajlGI(nl-x7Vtj8Edh4#wve7Q)X>Kz64@DmB$C7JiAanmI93h9yNe8!#T%&faq zBy*)`jE?WiZC#4fn!xi z+ezJov)XWAud~QPA~~QQ`kS{Q4A7#1y<8ociIrQjo_|8DuQR}mBwul z#BFkzn)5V?#BC#Znlv@n&ZMb1Pm@UOmBTbu?E~%{Aoh-s_o&-^k!h2DUOj0iF46`C zpZ6>DkSzOC5QG1oS{eN9iver zM?z0CNbb7MtI+9o!Ow4}abFH7S5K$1+%wm|yadAH--tmj!~si!IPWA0vy9@zBkLrLz@fJoRTWe<Liu?QQ&{2Q z5|*|x#cLQusk9jeDUD|aZH7S3r`F91%S( z(WatpikWt{lcIg3cD7TKY9HxfwrASeP71FS=}BBy_fIm9ptPIXJ(nS&dm=<@!PE8| zh-y$fJ298@7TUJ~ASgYVoSe*zPSMRo_uVIcZrRkjXP2`xnUt&ZBB8r)nVp&S3OVZ$ z(z#^@R*H6Hgh@}&oa%6se z2T3#HohEN{iSPGVx#tX_Y-0_S5pUP0y|(*lDQ*VqXJ2xFRohN?_j$kya8Bi8lO-u^@91g#{u8 z&9-T?mHnccoscX3Vp|IB1#(`PNg|y_0_mo#*vm&r2n({4Vvxy|20IyPLt#8eA9{+< zjnZdNg^3g(z%KBl-QS;rk3E?u9nVC&5jyk{|8Bu z^k9>?$eXexe{#+41IMP`G;=x;Vz;#tI%@(4bkqeUlC^%f9;6cn81q@Ny)&Jo7yF4P z3w;I3T<+|}!VyM7&T*QNt*4g zF69A_0_ELSxI}xyw#@d5CnNTT?Pp|fw>_ZP6}wk#iQQ|jBYVYZ-Yd>=M)sH)N9V4% zy^<(_-6Xo#Dz*+PE@E&15yN>opgmrWJ))3^NNNk8t@Ifs5L@~n5_x-U4n!z-+H!kf z#_1TBXWXuF`v&E(TkTO+kHTggoqI+JM9Gvylp^Eo-zgUN_>O2S67j^tI&@JLyTKI~ zDR2Ns{BHY1l4FPm!IZ!eqsQ)(nJKYR^Y)jd%Vk{7r;n6pnr$|6ITJ6IJlJH|znX$d}Jcb&M+T1@wPZA{O)EjWk zMRt1SX`Ek2LE}IAA_u?L*ScLHbn1a|aw<@6;4yAL2~6WCrk+C8hF z9?%nABt0lLN-uyGWBr!Q?vj?!?g$c|KX0%25IEvd5E;qwWSH$42f68*E)#Ng>9}S) zFC)xFPLA1_>l)&^gwRb&&lf?k+_QsKiZ&X0pF~o;qk*2<$k?y5irbx~1ojd@VDH1V z#2riY%PN#Bn&`<9#F3c{K^>FsL);I3QBNi>@(|DiD>S~PlH2O7))36wM=`vDJ1J)B zJZl^i^HnWzT(wN8xN@07arM$d;Von$3Qi*Wia0$}W4{n^TrG9R*J7E5a5ujb#NHxl z*6Mgr7!pSkG9&RQDuowMqB3{H7PQTXAV+fV`pOD#jef_C{gk@;J6<%m2Oug6LtL0g z)lXJ7T6^{y!Q@EpZ51oLHFLb?M{i=`7bV$kQgX+BQF`%?9Np4yiRbdDAhU9$O%hkhNM=vB&G}x)?e`cS=d@T3kWHy$h-`|TgJk*ax8u=o z$CKYo?G>20y#f;#)H!*c!@Ss5U`RwHyr!g&zJ1P1u1-&ZFvGzNU z&s*@Cr|nE=DfJNQqZh61>UhT<-xZ)s8%gbMm~YcRvE19Bw*3=L{^TqMf;iu*uvux7 z#%1$%&mKu4TLuXnje;c3_F%sL%bw|^vt!n;0<(v41u@?WCIY!G5wum=(djRQZ7~+a zs@#HD0a>uG$}NahxdpK*w_xuE7sM52K{Z%?Sn40o(@mfB zem(``3sZ4=#|XUzA{n2get~KoCf{xa-uq^L#+TyK*Nc$IlvB%m+pkRnZk#yRzp za~?9$LnssDY$iXAVjj$y2YDQ*5+v2M+4kueDX?CqPNyfC&GARp_(L@OzJR&O9zLQc zE9S5wq7EZmALTpoR4G*~UW4Z(?BA+ktrS|Bl5TL9Z)O*d>)X})ZdfZsPXL2F3y%;>_*yv|s=2O%`cENJKIixkDR zG%XLOare@pG#0E#^i_H_BHT+~fTB15&(M1^xz__-P_F?{$9nld9pmf4W++wJO@ie( z6^cL1YKqkt=ZVlNJ$-hZTL2bI^_wyELaD{nyR@j^LqNKQnyUE>nloL~(VXc3&6y6+ zoU=6bpm@e4mqQPS;&U^c;~0Gg)82XxqP5ykE0C>kaLH`J)k1={m)A(h3IGDHNo3=!g%A>5eM1(rXT#TN04B26njm6l;`)GbeW>sy9;t6K(pt6PSv zQ>ZMalWH0)gqEQWamzp{Zy6@VErX=k%Mi7gqRx#iEcukj5nf_1LnyeHAtd%Pgv1_( z&`k*sm$1~!6v#bnQ3?-Zl-$D_CHF8#U4tFvr!UiZc!i}NhLG6943c^nK~fJBXlCL* z2Ry&=FhYqvtYEo^87%g&gT)?(V1us186@;FM2S5NVY!DPEcP&j#Vtel?LgGg)Adt5 zPNwXz%Pcdbv}J`5w~P?dmJLEGO>lh0$g;z(a2O+1(juXgW(k$FO{iK1s%q@&oTbz< z%_(o$!d2Ipi&K==8aavCAw|q_ky-5Vy<_(v}fI+A@Lbvdab`w2W|wTUJPU z%M2-Q*&)T2A#}Z_L4TGuy_wCK-mTR3`sJmwEcMp54E9vF?Do{Q%=gr`O2IAC@HJ6~kQOlbOWrahbs?j9HK1#aRIR}t zi_{DR2Wqf4Z=18wEHOEop_}4U=4?Z+-Oxrx9*modG z+8u9a-#n zGX9T9l=?SP`ip+$f5r9y#bWDrA3ZS9idAg%d(?|NKcY1~f z&vcvJq=HEuspv!o)ceQr)^VC6aES=0Y&>D0)~dYDBf7vCrMoXMwxC{6KDI#jl>>Oq z_;^6QUK}qK$E(Eg0&)G?aJ&he0`VD`)R+M>sGTtC)!+QX0r)lFd{2OX$gS#^<;t-D zld6F1TlGF|{IZVSq`{;*i~{-wFTY@0{g7V0TYH@B3-AvKRAo`Wnoul~(Jyaz#vW(> zJ;svrD31)-2^bWi=(d^+&(+ z*)4L!)?w|@_3NbhHQHu$OXP^I753;nXO@sSM;SUR9)D+I7Z1 zv{M2=0TksByn~B>>3D`7pXAj;>Q=_mwD3Wz6qz(NUA3Z!-()_d7ZCI^V+bnxcM|h2XGSZM_@%W+^N>z4o!uFFqega~>LV6b`AAIQnhnqT)ie){jx~C5_#O14~(n1zWOCO6N;=F2mO!)O@n_m zftr8$Zm0TXjk>ovPOT%rKO{jz;a^QC3b9PUdcALJVbnb6;zbbZch?2z39wOGB4OlD zP5>qtbM!-ts4O#Ry`Mh+xe#c*9e5%=O0U$-(MPoc^to((zW7bR0lXd$!3h!v8*Q*B9`&j9R!l_*8hxGKz z0_v*qPF4P80j)#w4~O7)rA}r;Ia<6A@HgM-e;@x$b7l(EjiyN>j;&__y|itjwUY?1 zMRmLkl_@zxZYEN%HO0$J^(#yjkRh{at~L7p(Ij3-3b69QT~hT+`-=4~Qh>=b5c6K) zDf%4DI9F>NAO`o^nvXIv!8CR6IUV@#ui#5pXo zEKmphH~}5tAp$zUqXTq+t@?C;#{}rWG)F%YKoT?bFJO=>`jp|_B0q|6{74PCD3pL#^~OB!qgXD}3@ zj!+R5wug^tQ#b!A!5AOXwr&1Z0(HnoG$6HKl+`g;K6T*1TK8700H!F^iYFyp$beZ? zCX}z*T&IC-(R=Nt=_Wm2)p*+>{ity&kJ@PK3H_&^QXOUjv{{<&QU<2y@%&eIlwbVJ-^E2erAkbU&cCY7txd;)))8r}O~+ZfHJKy9 z0s1$07`Ki%WNSAuAL>2C)*(We`-QVJq5U)TfM0e7wUG|8dU8oe>fQ%E1%&tI(=9tv z&++U>-@OayaX~=r2UdH9g+%WVHf61S!7Twcn{Xd9!=DYGq0)^m1ZHRtiJEtr2O)Ek z))J^e8-{BwnI4BYc<9CFwGs@85k@N@`_xWEl-VRzo#d=R&T!<%(_4}T6wLv9j;&B3i3Sb$V%d*lUmY~tt0!P74~H7&~{`UTGpIu6WXLU@e8bcZKwUE zEfZd9rO>*~Yo4ms{WVi?VJq5&R1JS#F5k3WJx(1Geb$SQkT5H06FPpat>`?b zpnvL~)$b%A!=R4oXm)gpMss@G3&0xr5Z_PFRFayDOgEqDU=Euu_-KZvVF81-64B_L zw_ngtE@j%rhb`my{q?*z+?KT7Db7-w84CrKM!dJ495X==Ei4510An;Y@1afM^yr|P zaPXt%+;5VAo~WhwXu_Su=s^@3Z@C(2Yil^E^ltJ=>oCKIyh|LQG-^lqEIp!0J3l5! z!Sh+OfYkQ+(xCf80Np4*z+VKUD+_N3S63VUp~Td+2A3N3OCmgeMc*p27F%fJ5$(KI zzmtHBhOCLEoQ4M~oL0~k15}9>8_xxDG!0YRDRMM`q{|s8F&M>NbM>pPl{gX?OP?P}78344;+3nVXJD0yHpqw+D+D_$yj;xfq_S4eJ@ByV0RdEqL_>s84UUy!`< zCCQBy$(vu5yzmXl>ov&}-;um=tK>#q^5$)l7k(^xJuof&l{iB3#*va69g;VXlDu%V z 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≠!FX+RNj++pOJ3nHmv#KU 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

    h#jNeg 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 literal 0 HcmV?d00001 diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.cpp b/STM32F1/libraries/WireSlave/src/Wire_slave.cpp new file mode 100644 index 000000000..93cc55f09 --- /dev/null +++ b/STM32F1/libraries/WireSlave/src/Wire_slave.cpp @@ -0,0 +1,106 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 LeafLabs LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file TwoWire.cpp + * @author Trystan Jones + * @brief Wire library, uses the hardware I2C available in the Maple to + * interact with I2C slave devices. + */ + +/* + * Library created by crenn to use the new WireBase system and allow Arduino + * users easy interaction with the I2C Hardware in a familiar method. + */ + +#include "Wire_slave.h" + +uint8 TwoWire::process(uint8 stop) { + int8 res = i2c_master_xfer(sel_hard, &itc_msg, 1, 0); + if (res == I2C_ERROR_PROTOCOL) { + if (sel_hard->error_flags & I2C_SR1_AF) { /* NACK */ + res = (sel_hard->error_flags & I2C_SR1_ADDR ? ENACKADDR : + ENACKTRNS); + } else if (sel_hard->error_flags & I2C_SR1_OVR) { /* Over/Underrun */ + res = EDATA; + } else { /* Bus or Arbitration error */ + res = EOTHER; + } + i2c_disable(sel_hard); + i2c_master_enable(sel_hard, (I2C_BUS_RESET | dev_flags)); + } + return res; +} + +uint8 TwoWire::process(){ + return process(true); +} + +// TODO: Add in Error Handling if devsel is out of range for other Maples +TwoWire::TwoWire(uint8 dev_sel, uint8 flags) { + if (dev_sel == 1) { + sel_hard = I2C1; + } else if (dev_sel == 2) { + sel_hard = I2C2; + } else { + ASSERT(1); + } + dev_flags = flags; +} + +TwoWire::~TwoWire() { + i2c_disable(sel_hard); + sel_hard = 0; +} + +void TwoWire::begin(uint8 self_addr) { + i2c_master_enable(sel_hard, dev_flags); +} + +void TwoWire::end() { + i2c_disable(sel_hard); + sel_hard = 0; +} + +void TwoWire::setClock(uint32_t frequencyHz) +{ + switch(frequencyHz) + { + case 400000: + dev_flags |= I2C_FAST_MODE;// set FAST_MODE bit + break; + case 100000: + default: + dev_flags &= ~I2C_FAST_MODE;// clear FAST_MODE bit + break; + } + if (sel_hard->regs->CR1 & I2C_CR1_PE){ + i2c_disable(sel_hard); + i2c_master_enable(sel_hard, dev_flags); + } +} + +TwoWire Wire(1); diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.h b/STM32F1/libraries/WireSlave/src/Wire_slave.h new file mode 100644 index 000000000..dbe2a4ea5 --- /dev/null +++ b/STM32F1/libraries/WireSlave/src/Wire_slave.h @@ -0,0 +1,78 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 LeafLabs LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file Wire.h + * @author Trystan Jones + * @brief Wire library, uses the hardware I2C available in the Maple to + * interact with I2C slave devices. + */ + +/* + * Library created by crenn to use the new WireBase system and allow Arduino + * users easy interaction with the I2C Hardware in a familiar method. + */ + +#ifndef _TWOWIRE_H_ +#define _TWOWIRE_H_ + +#include "utility/WireBase_slave.h" +#include "wirish.h" +#include + +class TwoWire : public WireBase { +private: + i2c_dev* sel_hard; + uint8 dev_flags; +protected: + /* + * Processes the incoming I2C message defined by WireBase to the + * hardware. If an error occured, restart the I2C device. + */ + uint8 process(uint8); + uint8 process(); +public: + /* + * Check if devsel is within range and enable selected I2C interface with + * passed flags + */ + TwoWire(uint8, uint8 = 0); + + /* + * Shuts down (disables) the hardware I2C + */ + void end(); + + void setClock(uint32_t frequencyHz); + /* + * Disables the I2C device and remove the device address. + */ + ~TwoWire(); + + void begin(uint8 = 0x00); +}; +extern TwoWire Wire; +#endif // _TWOWIRE_H_ diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.h.gch b/STM32F1/libraries/WireSlave/src/Wire_slave.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..5a6345078e7abad4b9211a296cfa52568e2ed238 GIT binary patch literal 9475 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 Y;dI<1)bAmJrq!61Ti)JEJwtc@2OMIdI{*Lx literal 0 HcmV?d00001 diff --git a/STM32F1/libraries/WireSlave/src/i2c_slave.c b/STM32F1/libraries/WireSlave/src/i2c_slave.c new file mode 100644 index 000000000..770cd3a63 --- /dev/null +++ b/STM32F1/libraries/WireSlave/src/i2c_slave.c @@ -0,0 +1,789 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file libmaple/i2c.c + * @author Perry Hung + * @author Barry Carter + * @brief Inter-Integrated Circuit (I2C) support. + * + * Master and Slave supported + * I2C slave support added 2012 by Barry Carter. barry.carter@gmail.com, headfuzz.co.uk + */ + +#include "libmaple/i2c_common_slave.h" + +#include "i2c_private.h" + + +#include "libmaple/i2c_slave.h" +#include +#include +#include +#include +#include + +#include + +static inline int32 wait_for_state_change(i2c_dev *dev, + i2c_state state, + uint32 timeout); +static void set_ccr_trise(i2c_dev *dev, uint32 flags); + +/** + * @brief Fill data register with slave address + * @param dev I2C device + * @param addr Slave address + * @param rw Read/write bit + */ +static inline void i2c_send_slave_addr(i2c_dev *dev, uint32 addr, uint32 rw) { + dev->regs->DR = (addr << 1) | rw; +} + +/* + * Simple debugging trail. Define I2C_DEBUG to turn on. + */ +#ifdef I2C_DEBUG + +#define NR_CRUMBS 128 +static struct crumb crumbs[NR_CRUMBS]; +static uint32 cur_crumb = 0; + +static inline void i2c_drop_crumb(uint32 event, uint32 arg0, uint32 arg1) { + if (cur_crumb < NR_CRUMBS) { + struct crumb *crumb = &crumbs[cur_crumb++]; + crumb->event = event; + crumb->arg0 = arg0; + crumb->arg1 = arg1; + } +} +#define I2C_CRUMB(event, arg0, arg1) i2c_drop_crumb(event, arg0, arg1) + +#else +#define I2C_CRUMB(event, arg0, arg1) +#endif + +struct crumb { + uint32 event; + uint32 arg0; + uint32 arg1; +}; + +enum { + IRQ_ENTRY = 1, + TXE_ONLY = 2, + TXE_BTF = 3, + STOP_SENT = 4, + TEST = 5, + RX_ADDR_START = 6, + RX_ADDR_STOP = 7, + RXNE_ONLY = 8, + RXNE_SENDING = 9, + RXNE_START_SENT = 10, + RXNE_STOP_SENT = 11, + RXNE_DONE = 12, + ERROR_ENTRY = 13, +}; + +/** + * @brief Reset an I2C bus. + * + * Reset is accomplished by clocking out pulses until any hung slaves + * release SDA and SCL, then generating a START condition, then a STOP + * condition. + * + * @param dev I2C device + */ +void i2c_bus_reset(const i2c_dev *dev) { + /* Release both lines */ + i2c_master_release_bus(dev); + + /* + * Make sure the bus is free by clocking it until any slaves release the + * bus. + */ + while (!gpio_read_bit(sda_port(dev), dev->sda_pin)) { + /* Wait for any clock stretching to finish */ + while (!gpio_read_bit(scl_port(dev), dev->scl_pin)) + ; + delay_us(10); + + /* Pull low */ + gpio_write_bit(scl_port(dev), dev->scl_pin, 0); + delay_us(10); + + /* Release high again */ + gpio_write_bit(scl_port(dev), dev->scl_pin, 1); + delay_us(10); + } + + /* Generate start then stop condition */ + gpio_write_bit(sda_port(dev), dev->sda_pin, 0); + delay_us(10); + gpio_write_bit(scl_port(dev), dev->scl_pin, 0); + delay_us(10); + gpio_write_bit(scl_port(dev), dev->scl_pin, 1); + delay_us(10); + gpio_write_bit(sda_port(dev), dev->sda_pin, 1); +} + +/** + * @brief Initialize an I2C device and reset its registers to their + * default values. + * @param dev Device to initialize. + */ +void i2c_init(i2c_dev *dev) { + rcc_reset_dev(dev->clk_id); + rcc_clk_enable(dev->clk_id); + _i2c_irq_priority_fixup(dev); +} + +/* Hack for deprecated bit of STM32F1 functionality */ +#ifndef _I2C_HAVE_DEPRECATED_I2C_REMAP +#define _i2c_handle_remap(dev, flags) ((void)0) +#endif + +/** + * @brief Initialize an I2C device as bus master + * @param dev Device to enable + * @param flags Bitwise or of the following I2C options: + * I2C_FAST_MODE: 400 khz operation, + * I2C_DUTY_16_9: 16/9 Tlow/Thigh duty cycle (only applicable for + * fast mode), + * I2C_BUS_RESET: Reset the bus and clock out any hung slaves on + * initialization, + * I2C_10BIT_ADDRESSING: Enable 10-bit addressing, + * I2C_REMAP: (deprecated, STM32F1 only) Remap I2C1 to SCL/PB8 + * SDA/PB9. + */ +void i2c_master_enable(i2c_dev *dev, uint32 flags) { + /* PE must be disabled to configure the device */ + ASSERT(!(dev->regs->CR1 & I2C_CR1_PE)); + + /* Ugh */ + _i2c_handle_remap(dev, flags); + + /* Reset the bus. Clock out any hung slaves. */ + if (flags & I2C_BUS_RESET) { + i2c_bus_reset(dev); + } + + /* Turn on clock and set GPIO modes */ + i2c_init(dev); + i2c_config_gpios(dev); + + /* Configure clock and rise time */ + set_ccr_trise(dev, flags); + + /* Enable event and buffer interrupts */ + nvic_irq_enable(dev->ev_nvic_line); + nvic_irq_enable(dev->er_nvic_line); + i2c_enable_irq(dev, I2C_IRQ_EVENT | I2C_IRQ_BUFFER | I2C_IRQ_ERROR); + + /* Configure the slave unit */ + if (flags & I2C_SLAVE_DUAL_ADDRESS) { + i2c_slave_dual_address_enable(dev); + } + + if (flags & I2C_SLAVE_GENERAL_CALL) { + i2c_slave_general_call_enable(dev); + } + + /* store all of the flags */ + dev->config_flags = flags; + + /* Make it go! */ + i2c_peripheral_enable(dev); + i2c_enable_ack(dev); + + dev->state = I2C_STATE_IDLE; +} + +/** + * @brief Initialize an I2C device as slave (and master) + * @param dev Device to enable + * @param flags Bitwise or of the following I2C options: + * I2C_FAST_MODE: 400 khz operation, + * I2C_DUTY_16_9: 16/9 Tlow/Thigh duty cycle (only applicable for + * fast mode), + * I2C_BUS_RESET: Reset the bus and clock out any hung slaves on + * initialization, + * I2C_10BIT_ADDRESSING: Enable 10-bit addressing, + * I2C_REMAP: (deprecated, STM32F1 only) Remap I2C1 to SCL/PB8 + * SDA/PB9. + * I2C_SLAVE_DUAL_ADDRESS: Slave can respond on 2 i2C addresses + * I2C_SLAVE_GENERAL_CALL: SLA+W broadcast to all general call + * listeners on bus. Addr 0x00 + * I2C_SLAVE_USE_RX_BUFFER: Use a buffer to receive the incoming + * data. Callback at end of recv + * I2C_SLAVE_USE_TX_BUFFER: Use a buffer to transmit data. + * Callback will be called before tx + */ +void i2c_slave_enable(i2c_dev *dev, uint32 flags) { + i2c_disable(dev); + i2c_master_enable(dev, dev->config_flags | flags); +} + +/** + * @brief Process an i2c transaction. + * + * Transactions are composed of one or more i2c_msg's, and may be read + * or write tranfers. Multiple i2c_msg's will generate a repeated + * start in between messages. + * + * @param dev I2C device + * @param msgs Messages to send/receive + * @param num Number of messages to send/receive + * @param timeout Bus idle timeout in milliseconds before aborting the + * transfer. 0 denotes no timeout. + * @return 0 on success, + * I2C_ERROR_PROTOCOL if there was a protocol error, + * I2C_ERROR_TIMEOUT if the transfer timed out. + */ +int32 i2c_master_xfer(i2c_dev *dev, + i2c_msg *msgs, + uint16 num, + uint32 timeout) { + int32 rc; + + ASSERT(dev->state == I2C_STATE_IDLE); + + dev->msg = msgs; + dev->msgs_left = num; + dev->timestamp = systick_uptime(); + dev->state = I2C_STATE_BUSY; + + i2c_enable_irq(dev, I2C_IRQ_EVENT); + i2c_start_condition(dev); + + rc = wait_for_state_change(dev, I2C_STATE_XFER_DONE, timeout); + if (rc < 0) { + goto out; + } + + dev->state = I2C_STATE_IDLE; +out: + return rc; +} + +/** + * @brief Wait for an I2C event, or time out in case of error. + * @param dev I2C device + * @param state I2C_state state to wait for + * @param timeout Timeout, in milliseconds + * @return 0 if target state is reached, a negative value on error. + */ +static inline int32 wait_for_state_change(i2c_dev *dev, + i2c_state state, + uint32 timeout) { + i2c_state tmp; + + while (1) { + tmp = dev->state; + + if (tmp == I2C_STATE_ERROR) { + return I2C_STATE_ERROR; + } + + if (tmp == state) { + return 0; + } + + if (timeout) { + if (systick_uptime() > (dev->timestamp + timeout)) { + /* TODO: overflow? */ + /* TODO: racy? */ + return I2C_ERROR_TIMEOUT; + } + } + } +} + +/* + * Private API + */ + +/* + * IRQ handler for I2C master. Handles transmission/reception. + */ +void _i2c_irq_handler(i2c_dev *dev) { + /* WTFs: + * - Where is I2C_MSG_10BIT_ADDR handled? + */ + i2c_msg *msg = dev->msg; + + uint8 read = msg->flags & I2C_MSG_READ; + + uint32 sr1 = dev->regs->SR1; + uint32 sr2 = dev->regs->SR2; + I2C_CRUMB(IRQ_ENTRY, sr1, sr2); + + /* + * Reset timeout counter + */ + dev->timestamp = systick_uptime(); + + /* + * Add Slave support + */ + + /* Check to see if MSL master slave bit is set */ + if ((sr2 & I2C_SR2_MSL) != I2C_SR2_MSL) { /* 0 = slave mode 1 = master */ + + /* Check for address match */ + if (sr1 & I2C_SR1_ADDR) { + /* Find out which address was matched */ + /* Check the general call address first */ + if (sr2 & I2C_SR2_GENCALL) { + dev->i2c_slave_msg->addr = 0; + } + /* We matched the secondary address */ + else if (sr2 & I2C_SR2_DUALF) { + dev->i2c_slave_msg->addr = dev->regs->OAR2 & 0xFE; + } + /* We matched the primary address */ + else if ((sr2 & I2C_SR2_DUALF) != I2C_SR2_DUALF) { + dev->i2c_slave_msg->addr = dev->regs->OAR1 & 0xFE; + } + /* Shouldn't get here */ + else { + dev->i2c_slave_msg->addr = -1; /* uh oh */ + } + + /* if we have buffered io */ + if ((dev->config_flags & I2C_SLAVE_USE_RX_BUFFER) || + (dev->config_flags & I2C_SLAVE_USE_TX_BUFFER)) { + + /* if receiving then this would be a repeated start + * + *if we have some bytes already + */ + if ((dev->state == I2C_STATE_SL_RX) && + (dev->i2c_slave_msg->xferred > 0) && + (dev->config_flags & I2C_SLAVE_USE_RX_BUFFER)) { + /* Call the callback with the contents of the data */ + if (dev->i2c_slave_recv_callback != NULL) { + (*(dev->i2c_slave_recv_callback))(dev->i2c_slave_msg); + } + } + + /* Reset the message back to defaults. + * We are starting a new message + */ + dev->i2c_slave_msg->flags = 0; + dev->i2c_slave_msg->length = 0; + dev->i2c_slave_msg->xferred = 0; + dev->msgs_left = 0; + dev->timestamp = systick_uptime(); + + /* We have been addressed with SLA+R so + * the master wants us to transmit + */ + if ((sr1 & I2C_SR1_TXE) && + (dev->config_flags & I2C_SLAVE_USE_TX_BUFFER)) { + /* Call the transmit callback so it can populate the msg + * data with the bytes to go + */ + if (dev->i2c_slave_transmit_callback != NULL) { + (*(dev->i2c_slave_transmit_callback))(dev->i2c_slave_msg); + } + } + dev->state = I2C_STATE_BUSY; + } + + sr1 = sr2 = 0; + } + + /* EV3: Master requesting data from slave. Transmit a byte*/ + if (sr1 & I2C_SR1_TXE) { + if (dev->config_flags & I2C_SLAVE_USE_TX_BUFFER) { + if (dev->i2c_slave_msg->xferred >= dev->i2c_slave_msg->length) { + /* End of the transmit buffer? If so we NACK */ + i2c_disable_ack(dev); + /* We have to either issue a STOP or write something here. + * STOP here seems to screw up some masters, + * For now padding with 0 + */ + i2c_write(dev, 0); + /*i2c_stop_condition(dev); // This is causing bus lockups way more than it should !? Seems some I2C master devices freak out here*/ + } + else + { + /* NACk the last byte */ + if (dev->i2c_slave_msg->xferred == dev->i2c_slave_msg->length-1) { + i2c_disable_ack(dev); + } + else { + i2c_enable_ack(dev); + } + i2c_write(dev, dev->i2c_slave_msg->data[dev->i2c_slave_msg->xferred++]); + } + } + else + { + /* Call the callback to get the data we need. + * The callback is expected to write using i2c_write(...) + * If the slave is going to terminate the transfer, this function should + * also do a NACK on the last byte! + */ + if (dev->i2c_slave_transmit_callback != NULL) (*(dev->i2c_slave_transmit_callback))(dev->i2c_slave_msg); + } + + dev->state = I2C_STATE_BUSY; + sr1 = sr2 = 0; + } + + /* EV2: Slave received data from a master. Get from DR */ + if (sr1 & I2C_SR1_RXNE) { + if (dev->config_flags & I2C_SLAVE_USE_RX_BUFFER) { + /* Fill the buffer with the contents of the data register */ + /* These is potential for buffer overflow here, so we should + * really store the size of the array. This is expensive in + * the ISR so left out for now. We must trust the implementor! + */ + dev->i2c_slave_msg->data[dev->i2c_slave_msg->xferred++] = dev->regs->DR; + dev->i2c_slave_msg->length++; + } + else { + /* Call the callback with the contents of the data */ + dev->i2c_slave_msg->data[0] = dev->regs->DR; + if (dev->i2c_slave_recv_callback != NULL) (*(dev->i2c_slave_recv_callback))(dev->i2c_slave_msg); + } + dev->state = I2C_STATE_SL_RX; + sr1 = sr2 = 0; + } + + /* EV4: Slave has detected a STOP condition on the bus */ + if (sr1 & I2C_SR1_STOPF) { + dev->regs->CR1 |= I2C_CR1_PE; + + if ((dev->config_flags & I2C_SLAVE_USE_RX_BUFFER) || + (dev->config_flags & I2C_SLAVE_USE_TX_BUFFER)) { + + /* The callback with the data will happen on a NACK of the last data byte. + * This is handled in the error IRQ (AF bit) + */ + /* Handle the case where the master misbehaves by sending no NACK */ + if (dev->state != I2C_STATE_IDLE) { + if (dev->state == I2C_STATE_SL_RX) { + if (dev->i2c_slave_recv_callback != NULL) (*(dev->i2c_slave_recv_callback))(dev->i2c_slave_msg); + } + else { + if (dev->i2c_slave_transmit_callback != NULL) (*(dev->i2c_slave_transmit_callback))(dev->i2c_slave_msg); + } + } + } + + sr1 = sr2 = 0; + dev->state = I2C_STATE_IDLE; + } + + return; + } + + /* + * EV5: Start condition sent + */ + if (sr1 & I2C_SR1_SB) { + msg->xferred = 0; + i2c_enable_irq(dev, I2C_IRQ_BUFFER); + + /* + * Master receiver + */ + if (read) { + i2c_enable_ack(dev); + } + + i2c_send_slave_addr(dev, msg->addr, read); + sr1 = sr2 = 0; + } + + /* + * EV6: Slave address sent + */ + if (sr1 & I2C_SR1_ADDR) { + /* + * Special case event EV6_1 for master receiver. + * Generate NACK and restart/stop condition after ADDR + * is cleared. + */ + if (read) { + if (msg->length == 1) { + i2c_disable_ack(dev); + if (dev->msgs_left > 1) { + i2c_start_condition(dev); + I2C_CRUMB(RX_ADDR_START, 0, 0); + } else { + i2c_stop_condition(dev); + I2C_CRUMB(RX_ADDR_STOP, 0, 0); + } + } + } else { + /* + * Master transmitter: write first byte to fill shift + * register. We should get another TXE interrupt + * immediately to fill DR again. + */ + if (msg->length > 1) { + i2c_write(dev, msg->data[msg->xferred++]); + } else if (msg->length == 0) { /* We're just sending an address */ + i2c_stop_condition(dev); + /* + * Turn off event interrupts to keep BTF from firing until + * the end of the stop condition. Why on earth they didn't + * have a start/stop condition request clear BTF is beyond + * me. + */ + i2c_disable_irq(dev, I2C_IRQ_EVENT); + I2C_CRUMB(STOP_SENT, 0, 0); + dev->state = I2C_STATE_XFER_DONE; + } /* else we're just sending one byte */ + } + sr1 = sr2 = 0; + } + + /* + * EV8: Master transmitter + * Transmit buffer empty, but we haven't finished transmitting the last + * byte written. + */ + if ((sr1 & I2C_SR1_TXE) && !(sr1 & I2C_SR1_BTF)) { + I2C_CRUMB(TXE_ONLY, 0, 0); + if (dev->msgs_left) { + i2c_write(dev, msg->data[msg->xferred++]); + if (msg->xferred == msg->length) { + /* + * End of this message. Turn off TXE/RXNE and wait for + * BTF to send repeated start or stop condition. + */ + i2c_disable_irq(dev, I2C_IRQ_BUFFER); + dev->msgs_left--; + } + } else { + /* + * This should be impossible... + */ + ASSERT(0); + } + sr1 = sr2 = 0; + } + + /* + * EV8_2: Master transmitter + * Last byte sent, program repeated start/stop + */ + if ((sr1 & I2C_SR1_TXE) && (sr1 & I2C_SR1_BTF)) { + I2C_CRUMB(TXE_BTF, 0, 0); + if (dev->msgs_left) { + I2C_CRUMB(TEST, 0, 0); + /* + * Repeated start insanity: We can't disable ITEVTEN or else SB + * won't interrupt, but if we don't disable ITEVTEN, BTF will + * continually interrupt us. What the fuck ST? + */ + i2c_start_condition(dev); + while (!(dev->regs->SR1 & I2C_SR1_SB)) + ; + dev->msg++; + } else { + i2c_stop_condition(dev); + + /* + * Turn off event interrupts to keep BTF from firing until + * the end of the stop condition. Why on earth they didn't + * have a start/stop condition request clear BTF is beyond + * me. + */ + i2c_disable_irq(dev, I2C_IRQ_EVENT); + I2C_CRUMB(STOP_SENT, 0, 0); + dev->state = I2C_STATE_XFER_DONE; + } + sr1 = sr2 = 0; + } + + /* + * EV7: Master Receiver + */ + if (sr1 & I2C_SR1_RXNE) { + I2C_CRUMB(RXNE_ONLY, 0, 0); + msg->data[msg->xferred++] = dev->regs->DR; + + /* + * EV7_1: Second to last byte in the reception? Set NACK and generate + * stop/restart condition in time for the last byte. We'll get one more + * RXNE interrupt before shutting things down. + */ + if (msg->xferred == (msg->length - 1)) { + i2c_disable_ack(dev); + if (dev->msgs_left > 2) { + i2c_start_condition(dev); + I2C_CRUMB(RXNE_START_SENT, 0, 0); + } else { + i2c_stop_condition(dev); + I2C_CRUMB(RXNE_STOP_SENT, 0, 0); + } + } else if (msg->xferred == msg->length) { + dev->msgs_left--; + if (dev->msgs_left == 0) { + /* + * We're done. + */ + I2C_CRUMB(RXNE_DONE, 0, 0); + dev->state = I2C_STATE_XFER_DONE; + } else { + dev->msg++; + } + } + } +} + +/* + * Interrupt handler for I2C error conditions. Aborts any pending I2C + * transactions. + */ +void _i2c_irq_error_handler(i2c_dev *dev) { + I2C_CRUMB(ERROR_ENTRY, dev->regs->SR1, dev->regs->SR2); + + dev->error_flags = dev->regs->SR1 & (I2C_SR1_BERR | + I2C_SR1_ARLO | + I2C_SR1_AF | + I2C_SR1_OVR); + + /* Are we in slave mode? */ + if ((dev->regs->SR2 & I2C_SR2_MSL) != I2C_SR2_MSL) { + /* Check to see if the master device did a NAK on the last bit + * This is perfectly valid for a master to do this on the bus. + * We ignore this. Any further error processing takes us into dead + * loop waiting for the stop condition that will never arrive + */ + if (dev->regs->SR1 & I2C_SR1_AF) { + /* Clear flags */ + dev->regs->SR1 = 0; + dev->regs->SR2 = 0; + /* We need to write something to CR1 to clear the flag. + * This isn't really mentioned but seems important */ + i2c_enable_ack(dev); + + if (dev->state == I2C_STATE_SL_RX && + dev->config_flags & I2C_SLAVE_USE_RX_BUFFER && + dev->i2c_slave_msg->xferred > 0) { + /* Call the callback with the contents of the data */ + if (dev->i2c_slave_recv_callback != NULL) (*(dev->i2c_slave_recv_callback))(dev->i2c_slave_msg); + } + + dev->state = I2C_STATE_IDLE; + return; + } + /* Catch any other strange errors while in slave mode. + * I have seen BERR caused by an over fast master device + * as well as several overflows and arbitration failures. + * We are going to reset SR flags and carry on at this point which + * is not the best thing to do, but stops the bus locking up completely + * If we carry on below and send the stop bit, the code spins forever */ + /* Clear flags */ + dev->regs->SR1 = 0; + dev->regs->SR2 = 0; + dev->state = I2C_STATE_IDLE; + return; + } + + /* Clear flags */ + dev->regs->SR1 = 0; + dev->regs->SR2 = 0; + + i2c_stop_condition(dev); + i2c_disable_irq(dev, I2C_IRQ_BUFFER | I2C_IRQ_EVENT | I2C_IRQ_ERROR); + dev->state = I2C_STATE_ERROR; +} + +/* + * CCR/TRISE configuration helper + */ +static void set_ccr_trise(i2c_dev *dev, uint32 flags) { + uint32 ccr = 0; + uint32 trise = 0; + uint32 clk_mhz = _i2c_bus_clk(dev); + uint32 clk_hz = clk_mhz * (1000 * 1000); + + i2c_set_input_clk(dev, clk_mhz); + + if (flags & I2C_FAST_MODE) { + ccr |= I2C_CCR_FS; + + if (flags & I2C_DUTY_16_9) { + /* Tlow/Thigh = 16/9 */ + ccr |= I2C_CCR_DUTY_16_9; + ccr |= clk_hz / (400000 * 25); + } else { + /* Tlow/Thigh = 2 */ + ccr |= clk_hz / (400000 * 3); + } + + trise = (300 * clk_mhz / 1000) + 1; + } else { + /* Tlow/Thigh = 1 */ + ccr = clk_hz / (100000 * 2); + trise = clk_mhz + 1; + } + + /* Set minimum required value if CCR < 1*/ + if ((ccr & I2C_CCR_CCR) == 0) { + ccr |= 0x1; + } + + i2c_set_clk_control(dev, ccr); + i2c_set_trise(dev, trise); +} + + +/** + * @brief callback for when the device acts as a slave. If using an rx buffer, this is triggered + * after the last byte, otherwise it is called for every incoming packet. + * @param dev I2C device + * @param msg The dev_msg to pass to the slave init code + * @param func The function pointer to call + */ +void i2c_slave_attach_recv_handler(i2c_dev *dev, i2c_msg *msg, i2c_slave_recv_callback_func func) { + dev->i2c_slave_recv_callback = func; + dev->i2c_slave_msg = msg; + msg->xferred = 0; +} + + +/** + * @brief callback for when the device acts as a slave. If using a tx buffer, this is triggered + * after the device is successsfully addressed with SLA+R. + * @param dev I2C device + * @param msg The dev_msg to pass to the slave init code + * @param func The function pointer to call + */ +void i2c_slave_attach_transmit_handler(i2c_dev *dev, i2c_msg *msg, i2c_slave_transmit_callback_func func) { + dev->i2c_slave_transmit_callback = func; + dev->i2c_slave_msg = msg; + msg->xferred = 0; +} diff --git a/STM32F1/libraries/WireSlave/src/i2c_slave.h.gch b/STM32F1/libraries/WireSlave/src/i2c_slave.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..5a6345078e7abad4b9211a296cfa52568e2ed238 GIT binary patch literal 9475 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 Y;dI<1)bAmJrq!61Ti)JEJwtc@2OMIdI{*Lx literal 0 HcmV?d00001 diff --git a/STM32F1/libraries/WireSlave/src/libmaple/i2c_common_slave.h b/STM32F1/libraries/WireSlave/src/libmaple/i2c_common_slave.h new file mode 100644 index 000000000..605c66375 --- /dev/null +++ b/STM32F1/libraries/WireSlave/src/libmaple/i2c_common_slave.h @@ -0,0 +1,110 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung (from ). + * Copyright (c) 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file libmaple/include/libmaple/i2c_common.h + * @author Marti Bolivar + * @brief This file is an implementation detail + * + * CONTENTS UNSTABLE. The existence of this file is an implementation + * detail. Never include it directly. If you need something from + * here, include instead. + * + * I2C slave support added 2012 by Barry Carter. barry.carter@gmail.com, headfuzz.co.uk + * + */ + +#ifndef _LIBMAPLE_I2C_COMMON_H_ +#define _LIBMAPLE_I2C_COMMON_H_ + +#include +#include +#include + +struct gpio_dev; +struct i2c_reg_map; +struct i2c_msg; + +/** I2C device states */ +typedef enum i2c_state { + I2C_STATE_DISABLED = 0, /**< Disabled */ + I2C_STATE_IDLE = 1, /**< Idle */ + I2C_STATE_XFER_DONE = 2, /**< Done with transfer */ + I2C_STATE_BUSY = 3, /**< Busy */ + I2C_STATE_SL_RX = 4, /**< Slave receiving */ + I2C_STATE_ERROR = -1 /**< Error occurred */ +} i2c_state; + +typedef void (*i2c_slave_recv_callback_func)(struct i2c_msg *); +typedef void (*i2c_slave_transmit_callback_func)(struct i2c_msg *); +/** + * @brief I2C device type. + */ +typedef struct i2c_dev { + struct i2c_reg_map *regs; /**< Register map */ + struct i2c_msg *msg; /**< Messages */ + uint32 error_flags; /**< Error flags, set on I2C error condition */ + volatile uint32 timestamp; /**< For internal use */ + + /** + * @brief Deprecated. Use .scl_port or .sda_port instead. + * If non-null, this will be used as SDA, SCL pins' GPIO port. If + * null, then .sda_port will be used for SDA, and .sda_port for + * SDA. */ + struct gpio_dev *gpio_port; + + /** + * @brief SDA GPIO device (but see .gpio_port). + */ + struct gpio_dev *sda_port; + + /** + * @brief SCL GPIO device (but see .gpio_port). + */ + struct gpio_dev *scl_port; + + uint16 msgs_left; /**< Messages left */ + uint8 sda_pin; /**< SDA bit on gpio_port */ + uint8 scl_pin; /**< SCL bit on gpio_port */ + rcc_clk_id clk_id; /**< RCC clock information */ + nvic_irq_num ev_nvic_line; /**< Event IRQ number */ + nvic_irq_num er_nvic_line; /**< Error IRQ number */ + volatile i2c_state state; /**< Device state */ + uint32 config_flags; /**< Configuration flags */ + + /* + * Slave implementation. Callback functions in this struct allow + * for a separate callback function for each I2C unit available onboard + */ + i2c_slave_transmit_callback_func i2c_slave_transmit_callback; + i2c_slave_recv_callback_func i2c_slave_recv_callback; + + struct i2c_msg *i2c_slave_msg; /* the message that the i2c slave will use */ + +} i2c_dev; + +#endif diff --git a/STM32F1/libraries/WireSlave/src/libmaple/i2c_slave.h b/STM32F1/libraries/WireSlave/src/libmaple/i2c_slave.h new file mode 100644 index 000000000..1f290c2a6 --- /dev/null +++ b/STM32F1/libraries/WireSlave/src/libmaple/i2c_slave.h @@ -0,0 +1,475 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file libmaple/include/libmaple/i2c.h + * @brief Inter-Integrated Circuit (I2C) peripheral support + * + * Supports Master and Slave. + * Master Usage notes: + * + * - Enable an I2C device with i2c_master_enable(). + * - Initialize an array of struct i2c_msg to suit the bus + * transactions (reads/writes) you wish to perform. + * - Call i2c_master_xfer() to do the work. + * + * Slave Usage notes: + * - Enable I2C slave by calling i2c_slave_enable(). + * Check flags for usage. Enabling master also enabled slave. + * - initialise the i2c_msg struct and the data buffer + * - initialise the callback functions + * + * I2C slave support added 2012 by Barry Carter. barry.carter@gmail.com, headfuzz.co.uk + */ + +#ifndef _LIBMAPLE_I2C_H_ +#define _LIBMAPLE_I2C_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Series header must provide: + * + * - uint32 _i2c_bus_clk(i2c_dev*): Clock frequency of dev's bus, in + * MHz. (This is for internal use only). + * + * - (optional) _I2C_HAVE_IRQ_FIXUP: Leave undefined, or define to 1. + * This is for internal use only. It's a hack to work around a + * silicon bug related to I2C IRQ pre-emption on some targets. If 1, + * the series header must also declare and implement a routine with + * this signature (it may also be provided as a macro): + * + * void _i2c_irq_priority_fixup(i2c_dev*) + * + * This will be called by i2c_enable_irq() before actually enabling + * I2C interrupts. + * + * - Reg. map base pointers, device pointer declarations. + */ + + /* Roger clark. Replaced with line below #include */ +#include "libmaple/i2c_common_slave.h" +#include "stm32f1/include/series/i2c.h" + +#include +#include +#include +#include + +/** I2C register map type */ +typedef struct i2c_reg_map { + __io uint32 CR1; /**< Control register 1 */ + __io uint32 CR2; /**< Control register 2 */ + __io uint32 OAR1; /**< Own address register 1 */ + __io uint32 OAR2; /**< Own address register 2 */ + __io uint32 DR; /**< Data register */ + __io uint32 SR1; /**< Status register 1 */ + __io uint32 SR2; /**< Status register 2 */ + __io uint32 CCR; /**< Clock control register */ + __io uint32 TRISE; /**< TRISE (rise time) register */ +} i2c_reg_map; + +/** + * @brief I2C message type + */ +typedef struct i2c_msg { + uint16 addr; /**< Address */ + +#define I2C_MSG_READ 0x1 +#define I2C_MSG_10BIT_ADDR 0x2 + /** + * Bitwise OR of: + * - I2C_MSG_READ (write is default) + * - I2C_MSG_10BIT_ADDR (7-bit is default) */ + uint16 flags; + + uint16 length; /**< Message length */ + uint16 xferred; /**< Messages transferred */ + uint8 *data; /**< Data */ +} i2c_msg; + +/* + * Register bit definitions + */ + +/* Control register 1 */ + +#define I2C_CR1_SWRST (1U << 15) // Software reset +#define I2C_CR1_ALERT (1U << 13) // SMBus alert +#define I2C_CR1_PEC (1U << 12) // Packet error checking +#define I2C_CR1_POS (1U << 11) // Acknowledge/PEC position +#define I2C_CR1_ACK (1U << 10) // Acknowledge enable +#define I2C_CR1_STOP (1U << 9) // Stop generation +#define I2C_CR1_START (1U << 8) // Start generation +#define I2C_CR1_NOSTRETCH (1U << 7) // Clock stretching disable +#define I2C_CR1_ENGC (1U << 6) // General call enable +#define I2C_CR1_ENPEC (1U << 5) // PEC enable +#define I2C_CR1_ENARP (1U << 4) // ARP enable +#define I2C_CR1_SMBTYPE (1U << 3) // SMBus type +#define I2C_CR1_SMBTYPE_DEVICE (0U << 3) // SMBus type: device +#define I2C_CR1_SMBTYPE_HOST (1U << 3) // SMBus type: host +#define I2C_CR1_SMBUS (1U << 1) // SMBus mode +#define I2C_CR1_SMBUS_I2C (0U << 1) // SMBus mode: I2C +#define I2C_CR1_SMBUS_SMBUS (1U << 1) // SMBus mode: SMBus +#define I2C_CR1_PE (1U << 0) // Peripheral Enable + +/* Control register 2 */ + +#define I2C_CR2_LAST (1U << 12) // DMA last transfer +#define I2C_CR2_DMAEN (1U << 11) // DMA requests enable +#define I2C_CR2_ITBUFEN (1U << 10) // Buffer interrupt enable +#define I2C_CR2_ITEVTEN (1U << 9) // Event interupt enable +#define I2C_CR2_ITERREN (1U << 8) // Error interupt enable +#define I2C_CR2_FREQ 0x3F // Peripheral input frequency + +/* Own address register 1 */ + +#define I2C_OAR1_ADDMODE (1U << 15) // Addressing mode +#define I2C_OAR1_ADDMODE_7_BIT (0U << 15) // Addressing mode: 7-bit +#define I2C_OAR1_ADDMODE_10_BIT (1U << 15) // Addressing mode: 10-bit +#define I2C_OAR1_ADD 0x3FF // Interface address + +/* Own address register 2 */ + +#define I2C_OAR2_ADD2 0xFE // Interface address +#define I2C_OAR2_ENDUAL 1U // Dual addressing mode enable + +/* Status register 1 */ + +#define I2C_SR1_SMBALERT (1U << 15) // SMBus alert +#define I2C_SR1_TIMEOUT (1U << 14) // Timeout or Tlow error +#define I2C_SR1_PECERR (1U << 12) // PEC Error in reception +#define I2C_SR1_OVR (1U << 11) // Overrun/underrun +#define I2C_SR1_AF (1U << 10) // Acknowledge failure +#define I2C_SR1_ARLO (1U << 9) // Arbitration lost +#define I2C_SR1_BERR (1U << 8) // Bus error +#define I2C_SR1_TXE (1U << 7) // Data register empty +#define I2C_SR1_RXNE (1U << 6) // Data register not empty +#define I2C_SR1_STOPF (1U << 4) // Stop detection +#define I2C_SR1_ADD10 (1U << 3) // 10-bit header sent +#define I2C_SR1_BTF (1U << 2) // Byte transfer finished +#define I2C_SR1_ADDR (1U << 1) // Address sent/matched +#define I2C_SR1_SB (1U << 0) // Start bit + +/* Status register 2 */ + +#define I2C_SR2_PEC 0xFF00 // Packet error checking register +#define I2C_SR2_DUALF (1U << 7) // Dual flag +#define I2C_SR2_SMBHOST (1U << 6) // SMBus host header +#define I2C_SR2_SMBDEFAULT (1U << 5) // SMBus device default address +#define I2C_SR2_GENCALL (1U << 4) // General call address +#define I2C_SR2_TRA (1U << 2) // Transmitter/receiver +#define I2C_SR2_BUSY (1U << 1) // Bus busy +#define I2C_SR2_MSL (1U << 0) // Master/slave + +/* Clock control register */ + +#define I2C_CCR_FS (1U << 15) // Fast mode selection +#define I2C_CCR_DUTY (1U << 14) // Fast mode duty cycle +#define I2C_CCR_DUTY_2_1 (0U << 14) // Fast mode duty: 2/1 +#define I2C_CCR_DUTY_16_9 (1U << 14) // Fast mode duty: 16/9 +#define I2C_CCR_CCR 0xFFF // Clock control bits + +/* + * Convenience routines + */ + +/* Main I2C API */ + +/* I2C enable options */ +#define I2C_FAST_MODE 0x1 // 400 khz +#define I2C_DUTY_16_9 0x2 // 16/9 duty ratio +/* Flag 0x4 is reserved; DO NOT USE. */ +#define I2C_BUS_RESET 0x8 // Perform a bus reset +#define I2C_SLAVE_USE_RX_BUFFER 0x10 // Use a buffered message when doing a slave recv +#define I2C_SLAVE_USE_TX_BUFFER 0x20 // Use a buffered message when doing a slave transmit +#define I2C_SLAVE_DUAL_ADDRESS 0x40 // Enable the dual slave address scheme +#define I2C_SLAVE_GENERAL_CALL 0x80 // Enable the general call on address 0x00 +void i2c_master_enable(i2c_dev *dev, uint32 flags); +void i2c_slave_enable(i2c_dev *dev, uint32 flags); + +#define I2C_ERROR_PROTOCOL (-1) +#define I2C_ERROR_TIMEOUT (-2) +int32 i2c_master_xfer(i2c_dev *dev, i2c_msg *msgs, uint16 num, uint32 timeout); + +void i2c_bus_reset(const i2c_dev *dev); + +/** + * @brief Disable an I2C device + * + * This function disables the corresponding peripheral and marks dev's + * state as I2C_STATE_DISABLED. + * + * @param dev Device to disable. + */ +static inline void i2c_disable(i2c_dev *dev) { + dev->regs->CR1 &= ~I2C_CR1_PE; + dev->state = I2C_STATE_DISABLED; +} + +/* Start/stop conditions */ + +/** + * @brief Generate a start condition on the bus. + * @param dev I2C device + */ +static inline void i2c_start_condition(i2c_dev *dev) { + uint32 cr1; + while ((cr1 = dev->regs->CR1) & (I2C_CR1_START | + I2C_CR1_STOP | + I2C_CR1_PEC)) { + ; + } + dev->regs->CR1 |= I2C_CR1_START; +} + +/** + * @brief Generate a stop condition on the bus + * @param dev I2C device + */ +static inline void i2c_stop_condition(i2c_dev *dev) { + uint32 cr1; + while ((cr1 = dev->regs->CR1) & (I2C_CR1_START | + I2C_CR1_STOP | + I2C_CR1_PEC)) { + ; + } + dev->regs->CR1 |= I2C_CR1_STOP; + while ((cr1 = dev->regs->CR1) & (I2C_CR1_START | + I2C_CR1_STOP | + I2C_CR1_PEC)) { + ; + } + +} + +/* IRQ enable/disable */ + +#ifndef _I2C_HAVE_IRQ_FIXUP +/* The series header provides this if _I2C_HAVE_IRQ_FIXUP is defined, + * but we need it either way. */ +#define _i2c_irq_priority_fixup(dev) ((void)0) +#endif + +#define I2C_IRQ_ERROR I2C_CR2_ITERREN +#define I2C_IRQ_EVENT I2C_CR2_ITEVTEN +#define I2C_IRQ_BUFFER I2C_CR2_ITBUFEN +/** + * @brief Enable one or more I2C interrupts + * @param dev I2C device + * @param irqs Bitwise or of: + * I2C_IRQ_ERROR (error interrupt), + * I2C_IRQ_EVENT (event interrupt), and + * I2C_IRQ_BUFFER (buffer interrupt). + */ +static inline void i2c_enable_irq(i2c_dev *dev, uint32 irqs) { + _i2c_irq_priority_fixup(dev); + dev->regs->CR2 |= irqs; +} + +/** + * @brief Disable one or more I2C interrupts + * @param dev I2C device + * @param irqs Bitwise or of: + * I2C_IRQ_ERROR (error interrupt), + * I2C_IRQ_EVENT (event interrupt), and + * I2C_IRQ_BUFFER (buffer interrupt). + */ +static inline void i2c_disable_irq(i2c_dev *dev, uint32 irqs) { + dev->regs->CR2 &= ~irqs; +} + +/* ACK/NACK */ + +/** + * @brief Enable I2C acknowledgment + * @param dev I2C device + */ +static inline void i2c_enable_ack(i2c_dev *dev) { + dev->regs->CR1 |= I2C_CR1_ACK; +} + +/** + * @brief Disable I2C acknowledgment + * @param dev I2C device + */ +static inline void i2c_disable_ack(i2c_dev *dev) { + dev->regs->CR1 &= ~I2C_CR1_ACK; +} + +/* GPIO control */ + +/** + * @brief Configure device GPIOs. + * + * Configure GPIO bits dev->sda_pin and dev->scl_pin on GPIO device + * dev->gpio_port for use with I2C device dev. + * + * @param dev I2C Device + * @see i2c_release_gpios() + */ +extern void i2c_config_gpios(const i2c_dev *dev); + +/** + * @brief Release GPIOs controlling an I2C bus + * + * Releases the I2C bus controlled by dev as master, and disconnects + * GPIO bits dev->sda_pin and dev->scl_pin on GPIO device + * dev->gpio_port from I2C device dev. + * + * @param dev I2C device + * @see i2c_config_gpios() + */ +extern void i2c_master_release_bus(const i2c_dev *dev); + +/* Miscellaneous low-level routines */ + +void i2c_init(i2c_dev *dev); + +/** + * @brief Turn on an I2C peripheral + * @param dev Device to enable + */ +static inline void i2c_peripheral_enable(i2c_dev *dev) { + dev->regs->CR1 |= I2C_CR1_PE; +} + +/** + * @brief Turn off an I2C peripheral + * @param dev Device to turn off + */ +static inline void i2c_peripheral_disable(i2c_dev *dev) { + dev->regs->CR1 &= ~I2C_CR1_PE; +} + +/** + * @brief Fill transmit register + * @param dev I2C device + * @param byte Byte to write + */ +static inline void i2c_write(i2c_dev *dev, uint8 byte) { + dev->regs->DR = byte; +} + +/** + * @brief Set input clock frequency, in MHz + * @param dev I2C device + * @param freq Frequency, in MHz. This must be at least 2, and at most + * the APB frequency of dev's bus. (For example, if + * rcc_dev_clk(dev) == RCC_APB1, freq must be at most + * PCLK1, in MHz). There is an additional limit of 46 MHz. + */ +static inline void i2c_set_input_clk(i2c_dev *dev, uint32 freq) { +#define I2C_MAX_FREQ_MHZ 46 + ASSERT(2 <= freq && freq <= _i2c_bus_clk(dev) && freq <= I2C_MAX_FREQ_MHZ); + uint32 cr2 = dev->regs->CR2; + cr2 &= ~I2C_CR2_FREQ; + cr2 |= freq; + dev->regs->CR2 = freq; +#undef I2C_MAX_FREQ_MHZ +} + +/** + * @brief Set I2C clock control register. + * + * See the chip reference manual for the details. + * + * @param dev I2C device + * @param val Value to use for clock control register (in + * Fast/Standard mode) + */ +static inline void i2c_set_clk_control(i2c_dev *dev, uint32 val) { + uint32 ccr = dev->regs->CCR; + ccr &= ~I2C_CCR_CCR; + ccr |= val; + dev->regs->CCR = ccr; +} + +/** + * @brief Set SCL rise time + * @param dev I2C device + * @param trise Maximum rise time in fast/standard mode (see chip + * reference manual for the relevant formulas). + */ +static inline void i2c_set_trise(i2c_dev *dev, uint32 trise) { + dev->regs->TRISE = trise; +} + +/* + * Slave support + */ + +/** + * @brief Enable Dual addressing mode to allow peripheral to have 2 addresses + * @param dev I2C device + */ +static inline void i2c_slave_dual_address_enable(i2c_dev *dev) { + dev->regs->OAR2 |= I2C_OAR2_ENDUAL; +} + +/** + * @brief Enable General Call to allow the unit to respond on addr 0x00 + * @param dev I2C device + */ +static inline void i2c_slave_general_call_enable(i2c_dev *dev) { + dev->regs->CR1 |= I2C_CR1_ENGC; +} + +/* callback functions */ +/* Callback handler for data received over the bus */ +void i2c_slave_attach_recv_handler(i2c_dev *dev, i2c_msg *msg, i2c_slave_recv_callback_func func); + +/* Callback handler for data being requested over the bus + * The callback function must call i2c_write to get the data over the bus + */ +void i2c_slave_attach_transmit_handler(i2c_dev *dev, i2c_msg *msg, i2c_slave_transmit_callback_func func); + +/** + * @brief Set the primary I2c slave address + * @param dev I2C device + * @param address the 8 or 10 bit i2c address + */ +static inline void i2c_slave_set_own_address(i2c_dev *dev, uint16 address) { + dev->regs->OAR1 = address <<1; +} + +/** + * @brief Set the secondary I2c slave address + * @param dev I2C device + * @param address the 8 or 10 bit i2c address + */ +static inline void i2c_slave_set_own_address2(i2c_dev *dev, uint16 address) { +dev->regs->OAR2 = (address <<1 ) | I2C_OAR2_ENDUAL; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/STM32F1/libraries/WireSlave/src/libmaple/i2c_slave.h.gch b/STM32F1/libraries/WireSlave/src/libmaple/i2c_slave.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..5a6345078e7abad4b9211a296cfa52568e2ed238 GIT binary patch literal 9475 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 Y;dI<1)bAmJrq!61Ti)JEJwtc@2OMIdI{*Lx literal 0 HcmV?d00001 diff --git a/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.cpp b/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.cpp new file mode 100644 index 000000000..a30921179 --- /dev/null +++ b/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.cpp @@ -0,0 +1,145 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 LeafLabs LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file WireBase.cpp + * @author Trystan Jones + * @brief Wire library, following the majority of the interface from Arduino. + * Provides a 'standard' interface to I2C (two-wire) communication for + * derived classes. + */ + +/* + * Library created by crenn to allow a system which would provide users the + * 'standardised' Arduino method for interfacing with I2C devices regardless of + * whether it is I2C hardware or emulating software. + */ + +#include "WireBase_slave.h" +#include "wirish.h" + +void WireBase::begin(uint8 self_addr) { + tx_buf_idx = 0; + tx_buf_overflow = false; + rx_buf_idx = 0; + rx_buf_len = 0; +} + +void WireBase::beginTransmission(uint8 slave_address) { + itc_msg.addr = slave_address; + itc_msg.data = &tx_buf[tx_buf_idx]; + itc_msg.length = 0; + itc_msg.flags = 0; +} + +void WireBase::beginTransmission(int slave_address) { + beginTransmission((uint8)slave_address); +} + +uint8 WireBase::endTransmission(bool stop) { + uint8 retVal; + if (tx_buf_overflow) { + return EDATA; + } + retVal = process(stop);// Changed so that the return value from process is returned by this function see also the return line below + tx_buf_idx = 0; + tx_buf_overflow = false; + return retVal;//SUCCESS; +} + +uint8 WireBase::endTransmission(){ + endTransmission(true); +} + +//TODO: Add the ability to queue messages (adding a boolean to end of function +// call, allows for the Arduino style to stay while also giving the flexibility +// to bulk send +uint8 WireBase::requestFrom(uint8 address, int num_bytes) { + if (num_bytes > BUFFER_LENGTH) { + num_bytes = BUFFER_LENGTH; + } + itc_msg.addr = address; + itc_msg.flags = I2C_MSG_READ; + itc_msg.length = num_bytes; + itc_msg.data = &rx_buf[rx_buf_idx]; + process(); + rx_buf_len += itc_msg.xferred; + itc_msg.flags = 0; + return rx_buf_len; +} + +uint8 WireBase::requestFrom(int address, int numBytes) { + return WireBase::requestFrom((uint8)address, numBytes); +} + +void WireBase::write(uint8 value) { + if (tx_buf_idx == BUFFER_LENGTH) { + tx_buf_overflow = true; + return; + } + tx_buf[tx_buf_idx++] = value; + itc_msg.length++; +} + +void WireBase::write(uint8* buf, int len) { + for (uint8 i = 0; i < len; i++) { + write(buf[i]); + } +} + +void WireBase::write(int value) { + write((uint8)value); +} + +void WireBase::write(int* buf, int len) { + write((uint8*)buf, (uint8)len); +} + +void WireBase::write(char* buf) { + uint8 *ptr = (uint8*)buf; + while (*ptr) { + write(*ptr); + ptr++; + } +} + +uint8 WireBase::available() { + return rx_buf_len - rx_buf_idx; +} + +uint8 WireBase::read() { + if (rx_buf_idx == rx_buf_len) { + rx_buf_idx = 0; + rx_buf_len = 0; + return 0; + } else if (rx_buf_idx == (rx_buf_len-1)) { + uint8 temp = rx_buf[rx_buf_idx]; + rx_buf_idx = 0; + rx_buf_len = 0; + return temp; + } + return rx_buf[rx_buf_idx++]; +} diff --git a/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h b/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h new file mode 100644 index 000000000..31f3f8cee --- /dev/null +++ b/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h @@ -0,0 +1,145 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 LeafLabs LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file WireBase.h + * @author Trystan Jones + * @brief Wire library, following the majority of the interface from Arduino. + * Provides a 'standard' interface to I2C (two-wire) communication for + * derived classes. + */ + +/* + * Library created by crenn to allow a system which would provide users the + * 'standardised' Arduino method for interfacing with I2C devices regardless of + * whether it is I2C hardware or emulating software. + */ + +#ifndef _WIREBASE_H_ +#define _WIREBASE_H_ + +#include "wirish.h" +#include + +#define BUFFER_LENGTH 32 + +/* return codes from endTransmission() */ +#define SUCCESS 0 /* transmission was successful */ +#define EDATA 1 /* too much data */ +#define ENACKADDR 2 /* received nack on transmit of address */ +#define ENACKTRNS 3 /* received nack on transmit of data */ +#define EOTHER 4 /* other error */ + +class WireBase { // Abstraction is awesome! +protected: + i2c_msg itc_msg; + uint8 rx_buf[BUFFER_LENGTH]; /* receive buffer */ + uint8 rx_buf_idx; /* first unread idx in rx_buf */ + uint8 rx_buf_len; /* number of bytes read */ + + uint8 tx_buf[BUFFER_LENGTH]; /* transmit buffer */ + uint8 tx_buf_idx; // next idx available in tx_buf, -1 overflow + boolean tx_buf_overflow; + + // Force derived classes to define process function + virtual uint8 process(uint8) = 0; + virtual uint8 process() = 0; +public: + WireBase() {} + ~WireBase() {} + + /* + * Initialises the class interface + */ + // Allow derived classes to overwrite begin function + virtual void begin(uint8 = 0x00); + + /* + * Sets up the transmission message to be processed + */ + void beginTransmission(uint8); + + /* + * Allow only 8 bit addresses to be used + */ + void beginTransmission(int); + + /* + * Call the process function to process the message if the TX + * buffer has not overflowed. + */ + uint8 endTransmission(bool); + uint8 endTransmission(void); + + /* + * Request bytes from a slave device and process the request, + * storing into the receiving buffer. + */ + uint8 requestFrom(uint8, int); + + /* + * Allow only 8 bit addresses to be used when requesting bytes + */ + uint8 requestFrom(int, int); + + /* + * Stack up bytes to be sent when transmitting + */ + void write(uint8); + + /* + * Stack up bytes from the array to be sent when transmitting + */ + void write(uint8*, int); + + /* + * Ensure that a sending data will only be 8-bit bytes + */ + void write(int); + + /* + * Ensure that an array sending data will only be 8-bit bytes + */ + void write(int*, int); + + /* + * Stack up bytes from a string to be sent when transmitting + */ + void write(char*); + + /* + * Return the amount of bytes that is currently in the receiving buffer + */ + uint8 available(); + + /* + * Return the value of byte in the receiving buffer that is currently being + * pointed to + */ + uint8 read(); +}; + +#endif // _WIREBASE_H_ diff --git a/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h.gch b/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..5a6345078e7abad4b9211a296cfa52568e2ed238 GIT binary patch literal 9475 zcmb7KNps`I6&_{Z7iV9MjFVW3EfyLZfg?nK63P%sli)~`OBaWNG%Qn;LQ>8+m2;|c z%U{T^$R(A3k-v~@Zn>o@@9PJk8>BpTR7EXlp!+S~``!ZG+|Mu8i*5O*r+<9I{`-Ia z{I9?M?Vr#8{ofCs96V89fBDDT>bHaH?iTvE>+)WY!LEDt}h_n3KE{ob5#@C9?t5Xih-|9&1(QZMm@= z+YasMC$#ikwLHxRh0N1_e3AsoPI`J(;CF>HCrF4bMk;dTBXNX=zuK zP!`WeDT(s1+AMBX<&`ymIa^~BNJXZ|ewz;avY!v*BDCo~5nzk2s6|o;dh`zGN7meW z>n$tCLtj^G&^9#G{2^Wanp(Ml9ZdaUgXxcH?K^56X54IN+r?bYHk)$2g(W><|CCmt zp_IdMl8$Ab6-A!PbdY560FpVb_X}F*Qy}=>DL4sV(;VWkpclQfc--9C z-0NAQOXstjfXpNv49DjcO0Mo6UM$N)uM>H8;0K-`dcyGn-}6KlU~#b&en_B6~Sm*-rg@~RZMnm?~ra`fmBTP zDJ03oyO6AqKwtqFw4K2K!fr^wwY!P~_=aXf6Z;5bw#&=eMlM$K<-=8ZNDOmiNoib? zQeA{OOzc50rW`l)vCo(2Bc%#3j=dwgup8O0)d<>GadI}+(FpYardi4r-zlOZ(g~xk zE4;{e{jTGRZs6Na`HmO4j*2D2oQmR1^&iE~$#9sPu0t#_jlzUbxgw_J-RefO(_*## zGTr$_`bdJw>fx0o;PJ*@1c_Fx21y_0LW+>`VYQ(9K{ZVDIEo(F_52i|#9f5;OJ)0X zoSmnGf{@$0ytF~x0$?`@jZi^wo?>IZtfJ#2E9i2ld2zBsH_*F9L~5VIV<}ByI<~|S zObp$X=gGSU?OJsC=V}RoS4HP&NZNrXb$oyx9}OhRNUcEnKHbPsIh|mO_$1BcXq@&l z=ni9ZMw}E0k>7AqqzLA=CjdYrS-PQf1mkc%Q-qZvzX~6STYgzRKfnUmF?zxk%&pu+c7Zl_lMd8#uxy=(79V*6x$Q7;^2E>zo*A9hW zzT?_qex!*Cxo$oCJ=HmDIz#Q-6*d%N8b^3Q;cU>)23heO5+ZmT*BR_yBeBj`stBua zW>jyqg@^LVWJ)tWBku_IVj^$+s4Z^M;%<&@UX<(?vL7f=AFc9`Az^JN zXxR#S#S&3)u95q##p#^C2F*N|5j$H~t;e_q<c4`S%*j?u>5|zH_o9_nTBzE7Le#N6+l`Dxl&}J5zDWU?_{T zaT+HRoDHGbna0_5+Y$J_8?<5;^yUAWo?-B)SX19j`lv<0&pd}8`0gq|RY9(jA;OGf zS9$Wo+47;3>+-r>m#cY+YCjM*0>4JWy@3Z=8-pX|YR% zVMsqvE{CoiQGpM>!MRMJl@IEYfRd3Jf|SFjMPE{!5;QiO0;cy98l6ua%jO88mFfjl^SDR ziQrfkwn~dNAOS+Hel3?~GnidJ_;?o#6tLSUc(OsB4OD8;fkpD}v@=fB>{~0N>gT$o z;KJh3?8aoGIyN{mumd}K3gI}h!XT|GahkW= zBdS;CcUPrE!#|r-!^LUH_HewijUo3+mOY zeqCB0)479K_!-EoQU(cb#y~TiApC*402!K1p!lq-sA|dq;6V1KP^JXHr4pi+PvP;w zC>iP5flJ--9+8{bk(}ck?Z+zZZpumG9nvuz3`&`L-qVUAQys)1J4}(`cDt}d6m^Aw zv#P9tQHFVp`8-mD2C`8WAOg%UZew{zGIIlYW9)-K=17}R6R?h$rK?FRH<3x234w#y~p#W4(#adRP6M-fU233$4ja|nMJ%`3`UB?TlJMcW$ zvqgCfrYD%}U~Hn8(e9uRva5;(fMcgM(L>MF zN|*@1@6#N^h+TlbCfqc+*F|`X+_96c(Q#@s8gWC57Au|60@X6rhOK2&E@R87Y8P`m zDv^eR9Cfdq&@LSC6{UWRJ(N)%|JLLZ?W0;7v%+o{CN)1A!zi1I%tzR2r@%Gg|0@!n zV~&JxqH`}Dq;BXX31$HtPZ$#DT{-uf+v+l8G>%WtW2zg8q>-S~%VH3pQvnG&(}hLN zL#7Y3?`qkaWFrFDVkba%P(twuj@minF z&%hq0mrQ%&_h}9n@h))FRXJa7Ke|`FK=(2KG?8S#+G7)BMD)rn+Z1X7fSEjvC5rJB zQ)o*dGC5a(4w#cwd%zcghFut7g^LR{eS|YWkqsF4g9HJ>X22mDiXkL z8Z_80J;_*szjeK1bbD0m&$i zUAB>LG-Xs;)pZWBHDXGK^A65Ux52rrz8d$9;-W{Rjb}7Lrfj~?wMMnF7t1Z4N9gQ^ zW6dNvDm3j(&KGq#sb6gBYDRfxcf_ViS4qwdM$`D|D1vi{Q;mVE=z{#&JnAtt)T9|f zQ#Z{0%gGp5U;`$MljlYHN$ruI6R8aLu-YzeOF3JwXCG~-R|vbpf!lP~N5>i^Z#x0f zID}q7?Y~`p7GIglFE5gw6xcHl2bkI)!b4cNl#H}90#?ypaYm5=-(cw2)bU-KV+CM!!iB@(II47we^-un12}X;mVA?9X-J?fE;#_TvhLAtlaw_k)D7x_*hEYvbM);PK Y;dI<1)bAmJrq!61Ti)JEJwtc@2OMIdI{*Lx literal 0 HcmV?d00001 From 4157ef37a1ebbb8dd24560158074974663d3b189 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Thu, 14 Dec 2017 16:41:43 +0100 Subject: [PATCH 270/307] Removed some accidental adds --- STM32F1/libraries/Wire/Wire_slave.h | 2 +- STM32F1/libraries/WireSlave/src/Wire.h | 2 +- STM32F1/libraries/WireSlave/src/Wire.h.gch | Bin 1819056 -> 0 bytes .../libraries/WireSlave/src/Wire_slave.h.gch | Bin 9475 -> 0 bytes .../libraries/WireSlave/src/i2c_slave.h.gch | Bin 9475 -> 0 bytes .../WireSlave/src/libmaple/i2c_slave.h.gch | Bin 9475 -> 0 bytes .../src/utility/WireBase_slave.h.gch | Bin 9475 -> 0 bytes 7 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 STM32F1/libraries/WireSlave/src/Wire.h.gch delete mode 100644 STM32F1/libraries/WireSlave/src/Wire_slave.h.gch delete mode 100644 STM32F1/libraries/WireSlave/src/i2c_slave.h.gch delete mode 100644 STM32F1/libraries/WireSlave/src/libmaple/i2c_slave.h.gch delete mode 100644 STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h.gch diff --git a/STM32F1/libraries/Wire/Wire_slave.h b/STM32F1/libraries/Wire/Wire_slave.h index 21b4102bd..ede963b37 100644 --- a/STM32F1/libraries/Wire/Wire_slave.h +++ b/STM32F1/libraries/Wire/Wire_slave.h @@ -1 +1 @@ -#error "Something is trying to include Wire.h when Wire_Slave.h is already included, they are mutually exclusive" +#error "Something is trying to include Wire_slave.h when Wire.h is already included, they are mutually exclusive" diff --git a/STM32F1/libraries/WireSlave/src/Wire.h b/STM32F1/libraries/WireSlave/src/Wire.h index ede963b37..2d3ce7049 100644 --- a/STM32F1/libraries/WireSlave/src/Wire.h +++ b/STM32F1/libraries/WireSlave/src/Wire.h @@ -1 +1 @@ -#error "Something is trying to include Wire_slave.h when Wire.h is already included, they are mutually exclusive" +#error "Something is trying to include Wire.h when Wire_slave.h is already included, they are mutually exclusive" diff --git a/STM32F1/libraries/WireSlave/src/Wire.h.gch b/STM32F1/libraries/WireSlave/src/Wire.h.gch deleted file mode 100644 index b29a5ea9fd8851ea75533c42ff77077972caf5ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1819056 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 z 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≠!FX+RNj++pOJ3nHmv#KU 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

    h#jNeg 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 diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.h.gch b/STM32F1/libraries/WireSlave/src/Wire_slave.h.gch deleted file mode 100644 index 5a6345078e7abad4b9211a296cfa52568e2ed238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9475 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 Y;dI<1)bAmJrq!61Ti)JEJwtc@2OMIdI{*Lx diff --git a/STM32F1/libraries/WireSlave/src/i2c_slave.h.gch b/STM32F1/libraries/WireSlave/src/i2c_slave.h.gch deleted file mode 100644 index 5a6345078e7abad4b9211a296cfa52568e2ed238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9475 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 Y;dI<1)bAmJrq!61Ti)JEJwtc@2OMIdI{*Lx diff --git a/STM32F1/libraries/WireSlave/src/libmaple/i2c_slave.h.gch b/STM32F1/libraries/WireSlave/src/libmaple/i2c_slave.h.gch deleted file mode 100644 index 5a6345078e7abad4b9211a296cfa52568e2ed238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9475 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 Y;dI<1)bAmJrq!61Ti)JEJwtc@2OMIdI{*Lx diff --git a/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h.gch b/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h.gch deleted file mode 100644 index 5a6345078e7abad4b9211a296cfa52568e2ed238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9475 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 Y;dI<1)bAmJrq!61Ti)JEJwtc@2OMIdI{*Lx From 730711b80aced608f59020803335e6b2dc482053 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Thu, 14 Dec 2017 16:45:55 +0100 Subject: [PATCH 271/307] Made sure Wire_slave.h is included first --- .../WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino b/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino index 23456e40a..51e2dcc5a 100644 --- a/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino +++ b/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino @@ -6,6 +6,7 @@ * Created on: 4 Sep 2012 * Author: Barry Carter */ +#include #include #include From 3425506d1983c7ae41153f80a8ba7651b25492fc Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Thu, 14 Dec 2017 17:30:35 +0100 Subject: [PATCH 272/307] spellcheccck --- STM32F1/libraries/WireSlave/library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/WireSlave/library.properties b/STM32F1/libraries/WireSlave/library.properties index 2a1c387b2..fd24ab1df 100644 --- a/STM32F1/libraries/WireSlave/library.properties +++ b/STM32F1/libraries/WireSlave/library.properties @@ -8,4 +8,4 @@ url= architectures=STM32F1 maintainer= category=Communication -include=src/Wire_Slave.h +include=src/Wire_slave.h From c4fdf5aa63a787ce9a28ddebfab9428e7681a65b Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Thu, 14 Dec 2017 21:04:54 +0100 Subject: [PATCH 273/307] keywords.txt Copied from ArduinoCore-sam (Due) --- STM32F1/libraries/WireSlave/keywords.txt | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 STM32F1/libraries/WireSlave/keywords.txt diff --git a/STM32F1/libraries/WireSlave/keywords.txt b/STM32F1/libraries/WireSlave/keywords.txt new file mode 100644 index 000000000..47ffd52d0 --- /dev/null +++ b/STM32F1/libraries/WireSlave/keywords.txt @@ -0,0 +1,31 @@ +####################################### +# Syntax Coloring Map For Wire +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +begin KEYWORD2 +setClock KEYWORD2 +beginTransmission KEYWORD2 +endTransmission KEYWORD2 +requestFrom KEYWORD2 +onReceive KEYWORD2 +onRequest KEYWORD2 + +####################################### +# Instances (KEYWORD2) +####################################### + +Wire KEYWORD2 +Wire1 KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + From 56e95f2773f10b1dad148d1c5e3f93b45c5b9cd2 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Thu, 14 Dec 2017 22:03:09 +0100 Subject: [PATCH 274/307] Steals any reference to Wire.h and redirects it to Wire_slave.h. This way we don't need to alter third party libraries. Note that Wire_slave.h must be included **before** the real Wire.h for this to work. --- STM32F1/libraries/WireSlave/src/Wire.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/STM32F1/libraries/WireSlave/src/Wire.h b/STM32F1/libraries/WireSlave/src/Wire.h index 2d3ce7049..0a47d0322 100644 --- a/STM32F1/libraries/WireSlave/src/Wire.h +++ b/STM32F1/libraries/WireSlave/src/Wire.h @@ -1 +1,4 @@ -#error "Something is trying to include Wire.h when Wire_slave.h is already included, they are mutually exclusive" +#pragma once +#include "Wire_slave.h" + +//#error "Something is trying to include Wire.h when Wire_slave.h is already included, they are mutually exclusive" From 6fe4a55922a30cef5f03c6a12897a682d12cf44d Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 15 Dec 2017 11:56:01 +0100 Subject: [PATCH 275/307] Added SoftWire.h --- STM32F1/libraries/Wire/library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/libraries/Wire/library.properties b/STM32F1/libraries/Wire/library.properties index 1129fa3fb..2d822fedb 100644 --- a/STM32F1/libraries/Wire/library.properties +++ b/STM32F1/libraries/Wire/library.properties @@ -7,4 +7,4 @@ paragraph= category=Communication url=http://www.arduino.cc/en/Reference/Wire architectures=STM32F1 -include=Wire.h +include=Wire.h,SoftWire.h From c65ec99a8d206aada5fbdc4be83e6f099c9c2a5e Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 15 Dec 2017 13:19:37 +0100 Subject: [PATCH 276/307] Updated library.properties --- STM32F1/libraries/Wire/library.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/Wire/library.properties b/STM32F1/libraries/Wire/library.properties index 2d822fedb..06b7aee78 100644 --- a/STM32F1/libraries/Wire/library.properties +++ b/STM32F1/libraries/Wire/library.properties @@ -1,7 +1,7 @@ name=Wire version=1.0 -author=Arduino -maintainer=Arduino +author=Roger Clark +maintainer= sentence=Allows the communication between devices or sensors connected via Two Wire Interface Bus. paragraph= category=Communication From 987102c8d2d23ee09498c2b9ba36cba1057409a3 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 15 Dec 2017 16:00:54 +0100 Subject: [PATCH 277/307] Temporarily removed not yet functioning examples --- .../slave_receiver/slave_receiver.ino | 38 ------------------- .../examples/slave_sender/slave_sender.ino | 32 ---------------- 2 files changed, 70 deletions(-) delete mode 100644 STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino delete mode 100644 STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino diff --git a/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino b/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino deleted file mode 100644 index b430c2539..000000000 --- a/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino +++ /dev/null @@ -1,38 +0,0 @@ -// Wire Slave Receiver -// by Nicholas Zambetti - -// Demonstrates use of the Wire library -// Receives data as an I2C/TWI slave device -// Refer to the "Wire Master Writer" example for use with this - -// Created 29 March 2006 - -// This example code is in the public domain. - - -#include - -void setup() -{ - Wire.begin(4); // join i2c bus with address #4 - Wire.onReceive(receiveEvent); // register event - Serial.begin(9600); // start serial for output -} - -void loop() -{ - delay(100); -} - -// function that executes whenever data is received from master -// this function is registered as an event, see setup() -void receiveEvent(int howMany) -{ - while(1 < Wire.available()) // loop through all but the last - { - char c = Wire.read(); // receive byte as a character - Serial.print(c); // print the character - } - int x = Wire.read(); // receive byte as an integer - Serial.println(x); // print the integer -} diff --git a/STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino b/STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino deleted file mode 100644 index fcdac14b3..000000000 --- a/STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino +++ /dev/null @@ -1,32 +0,0 @@ -// Wire Slave Sender -// by Nicholas Zambetti - -// Demonstrates use of the Wire library -// Sends data as an I2C/TWI slave device -// Refer to the "Wire Master Reader" example for use with this - -// Created 29 March 2006 - -// This example code is in the public domain. - - -#include - -void setup() -{ - Wire.begin(2); // join i2c bus with address #2 - Wire.onRequest(requestEvent); // register event -} - -void loop() -{ - delay(100); -} - -// function that executes whenever data is requested by master -// this function is registered as an event, see setup() -void requestEvent() -{ - Wire.write("hello "); // respond with message of 6 bytes - // as expected by master -} From 78f8a90a2df3f408cab28764d35113a06263295e Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Tue, 19 Dec 2017 23:46:32 +0100 Subject: [PATCH 278/307] Fixed a master/slave mode mixup. Turns out that (sr2&I2C_SR2_MSL)!=I2C_SR2_MSL indicates slave mode after master has requested, and received, data. "MSL - Cleared by hardware after detecting a Stop condition on the bus or a loss of arbitration (ARLO=1), or by hardware when PE=0." -RM0008 --- STM32F1/libraries/WireSlave/src/i2c_slave.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/STM32F1/libraries/WireSlave/src/i2c_slave.c b/STM32F1/libraries/WireSlave/src/i2c_slave.c index 770cd3a63..865949b36 100644 --- a/STM32F1/libraries/WireSlave/src/i2c_slave.c +++ b/STM32F1/libraries/WireSlave/src/i2c_slave.c @@ -70,6 +70,12 @@ static inline void i2c_send_slave_addr(i2c_dev *dev, uint32 addr, uint32 rw) { #ifdef I2C_DEBUG #define NR_CRUMBS 128 +struct crumb { + uint32 event; + uint32 arg0; + uint32 arg1; + uint32 arg2; // filler to make the data fit GDB memory dump screen +}; static struct crumb crumbs[NR_CRUMBS]; static uint32 cur_crumb = 0; @@ -79,6 +85,7 @@ static inline void i2c_drop_crumb(uint32 event, uint32 arg0, uint32 arg1) { crumb->event = event; crumb->arg0 = arg0; crumb->arg1 = arg1; + crumb->arg2 = cur_crumb-1; } } #define I2C_CRUMB(event, arg0, arg1) i2c_drop_crumb(event, arg0, arg1) @@ -87,12 +94,6 @@ static inline void i2c_drop_crumb(uint32 event, uint32 arg0, uint32 arg1) { #define I2C_CRUMB(event, arg0, arg1) #endif -struct crumb { - uint32 event; - uint32 arg0; - uint32 arg1; -}; - enum { IRQ_ENTRY = 1, TXE_ONLY = 2, @@ -351,8 +352,8 @@ void _i2c_irq_handler(i2c_dev *dev) { * Add Slave support */ - /* Check to see if MSL master slave bit is set */ - if ((sr2 & I2C_SR2_MSL) != I2C_SR2_MSL) { /* 0 = slave mode 1 = master */ + /* Check to see if in slave mode */ + if (dev->config_flags&(I2C_SLAVE_DUAL_ADDRESS|I2C_SLAVE_GENERAL_CALL)) { /* Check for address match */ if (sr1 & I2C_SR1_ADDR) { From b46b7461f401a2b51259fb76b350b5748b2f564a Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 22 Dec 2017 18:52:12 +0100 Subject: [PATCH 279/307] Merged with Wire implementation from stm32duino/Arduino_Core_STM32 --- .../SFRRanger_reader/SFRRanger_reader.ino | 2 +- .../i2c_libmaple_slave_reader.ino} | 5 - .../i2c_scanner_wire/i2c_scanner_wire.ino | 78 +++ .../examples/master_reader/master_reader.ino | 4 +- .../WireSlave/examples/selftest1/code.cpp | 68 ++ .../examples/selftest1/selftest1.ino | 16 + .../slave_receiver/slave_receiver.ino | 37 ++ .../examples/slave_sender/slave_sender.ino | 32 + .../libraries/WireSlave/src/Wire_slave.cpp | 591 +++++++++++++++--- STM32F1/libraries/WireSlave/src/Wire_slave.h | 209 +++++-- .../libraries/WireSlave/src/Wire_slave.h.gch | Bin 0 -> 9475 bytes STM32F1/libraries/WireSlave/src/i2c_slave.c | 15 +- .../WireSlave/src/utility/WireBase_slave.cpp | 145 ----- .../WireSlave/src/utility/WireBase_slave.h | 145 ----- 14 files changed, 888 insertions(+), 459 deletions(-) rename STM32F1/libraries/WireSlave/examples/{i2c_libmaple_slave/i2c_libmaple_slave.ino => i2c_libmaple_slave_reader/i2c_libmaple_slave_reader.ino} (97%) create mode 100644 STM32F1/libraries/WireSlave/examples/i2c_scanner_wire/i2c_scanner_wire.ino create mode 100644 STM32F1/libraries/WireSlave/examples/selftest1/code.cpp create mode 100644 STM32F1/libraries/WireSlave/examples/selftest1/selftest1.ino create mode 100644 STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino create mode 100644 STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino create mode 100644 STM32F1/libraries/WireSlave/src/Wire_slave.h.gch delete mode 100644 STM32F1/libraries/WireSlave/src/utility/WireBase_slave.cpp delete mode 100644 STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h diff --git a/STM32F1/libraries/WireSlave/examples/SFRRanger_reader/SFRRanger_reader.ino b/STM32F1/libraries/WireSlave/examples/SFRRanger_reader/SFRRanger_reader.ino index 5537eca56..9409bb10e 100644 --- a/STM32F1/libraries/WireSlave/examples/SFRRanger_reader/SFRRanger_reader.ino +++ b/STM32F1/libraries/WireSlave/examples/SFRRanger_reader/SFRRanger_reader.ino @@ -15,7 +15,7 @@ void setup() { Wire.begin(); // join i2c bus (address optional for master) - Serial.begin(9600); // start serial communication at 9600bps + Serial.begin(115200); // start serial communication at 9600bps } int reading = 0; diff --git a/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino b/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave_reader/i2c_libmaple_slave_reader.ino similarity index 97% rename from STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino rename to STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave_reader/i2c_libmaple_slave_reader.ino index 51e2dcc5a..a63ff3c98 100644 --- a/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave/i2c_libmaple_slave.ino +++ b/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave_reader/i2c_libmaple_slave_reader.ino @@ -8,7 +8,6 @@ */ #include #include -#include #define USE_BUFFERED_EXAMPLE 1 @@ -52,12 +51,8 @@ void functx(i2c_msg *msg){ #endif -// #define Serial Serial1 - void setup() { Serial.begin(115200); - while(!Serial) - ; Serial.println("I2C Slave example"); // attach the buffer diff --git a/STM32F1/libraries/WireSlave/examples/i2c_scanner_wire/i2c_scanner_wire.ino b/STM32F1/libraries/WireSlave/examples/i2c_scanner_wire/i2c_scanner_wire.ino new file mode 100644 index 000000000..44af4dc1d --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/i2c_scanner_wire/i2c_scanner_wire.ino @@ -0,0 +1,78 @@ +// -------------------------------------- +// i2c_scanner +// +// Version 1 +// This program (or code that looks like it) +// can be found in many places. +// For example on the Arduino.cc forum. +// The original author is not know. +// Version 2, Juni 2012, Using Arduino 1.0.1 +// Adapted to be as simple as possible by Arduino.cc user Krodal +// Version 3, Feb 26 2013 +// V3 by louarnold +// Version 4, March 3, 2013, Using Arduino 1.0.3 +// by Arduino.cc user Krodal. +// Changes by louarnold removed. +// Scanning addresses changed from 0...127 to 1...119, +// according to the i2c scanner by Nick Gammon +// http://www.gammon.com.au/forum/?id=10896 +// Version 5, March 28, 2013 +// As version 4, but address scans now to 127. +// A sensor seems to use address 120. +// +// This sketch tests the standard 7-bit addresses +// Devices with higher bit address might not be seen properly. +// + +#include + +//use IIC2 +//TwoWire WIRE2 (2,I2C_FAST_MODE); +//#define Wire WIRE2 + + +void setup() { + + Serial.begin(115200); + Wire.begin(); + Serial.println("\nI2C Scanner"); +} + + +void loop() { + byte error, address; + int nDevices; + + Serial.println("Scanning..."); + + nDevices = 0; + for(address = 1; address < 127; address++) { + // The i2c_scanner uses the return value of + // the Write.endTransmisstion to see if + // a device did acknowledge to the address. + + Wire.beginTransmission(address); + error = Wire.endTransmission(); + + if (error == 0) { + Serial.print("I2C device found at address 0x"); + if (address < 16) + Serial.print("0"); + Serial.println(address, HEX); + + nDevices++; + } + else if (error == 4) { + Serial.print("Unknown error at address 0x"); + if (address < 16) + Serial.print("0"); + Serial.println(address, HEX); + } + } + if (nDevices == 0) + Serial.println("No I2C devices found"); + else + Serial.println("done"); + + delay(5000); // wait 5 seconds for next scan +} diff --git a/STM32F1/libraries/WireSlave/examples/master_reader/master_reader.ino b/STM32F1/libraries/WireSlave/examples/master_reader/master_reader.ino index 4b45d1289..bd914e368 100644 --- a/STM32F1/libraries/WireSlave/examples/master_reader/master_reader.ino +++ b/STM32F1/libraries/WireSlave/examples/master_reader/master_reader.ino @@ -15,12 +15,12 @@ void setup() { Wire.begin(); // join i2c bus (address optional for master) - Serial.begin(9600); // start serial for output + Serial.begin(115200); // start serial for output } void loop() { - Wire.requestFrom(2, 6); // request 6 bytes from slave device #2 + Wire.requestFrom(8, 6); // request 6 bytes from slave device #8 while(Wire.available()) // slave may send less than requested { diff --git a/STM32F1/libraries/WireSlave/examples/selftest1/code.cpp b/STM32F1/libraries/WireSlave/examples/selftest1/code.cpp new file mode 100644 index 000000000..d2bce8c61 --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/selftest1/code.cpp @@ -0,0 +1,68 @@ +// Wire Slave Receiver +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Receives data as an I2C/TWI slave device +// Refer to the "Wire Master Writer" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + +#include +//#define Serial Serial1 + +#define MasterWire Wire +#define SlaveWire Wire1 +#define ENABLE_SLAVE +#define ENABLE_MASTER + +void receiveEvent(int howMany); + +void setup(){ + Serial.begin(115200); // start serial for output + + #ifdef ENABLE_MASTER + MasterWire.begin(); // join i2c bus #1 as master + Serial.println("Done with MasterWire.begin "); + #endif + + #ifdef ENABLE_SLAVE + SlaveWire.begin(4); // join i2c bus #2 as slave with address #4 + Serial.println("Done with SlaveWire.begin "); + #endif + + #ifdef ENABLE_SLAVE + SlaveWire.onReceive(receiveEvent); // register event + #endif +} + +void loop(){ + #ifdef ENABLE_MASTER + static byte x = 0; + Serial.print("Master writing "); + Serial.println(x); + + MasterWire.beginTransmission(4); // transmit to device #4 + MasterWire.write("x is "); // sends five bytes + MasterWire.write(x); // sends one byte + MasterWire.endTransmission(); // stop transmitting + + x++; + #endif + delay(500); +} + +// function that executes whenever data is received from master +// this function is registered as an event, see setup() +// Note that it is not advicable to call Serial.print() from within an ISR +void receiveEvent(int howMany){ + //Serial.print("Slave receving "); + while(1 < SlaveWire.available()){ // loop through all but the last + char c = SlaveWire.read(); // receive byte as a character + Serial.print(c); // print the character + } + int x = SlaveWire.read(); // receive byte as an integer + Serial.println(x); // print the integer +} + diff --git a/STM32F1/libraries/WireSlave/examples/selftest1/selftest1.ino b/STM32F1/libraries/WireSlave/examples/selftest1/selftest1.ino new file mode 100644 index 000000000..58f1e5c2c --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/selftest1/selftest1.ino @@ -0,0 +1,16 @@ +// Wire Slave Receiver +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Receives data as an I2C/TWI slave device +// Refer to the "Wire Master Writer" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + +// The code is temporarily moved to the code.cpp. +// This makes it possible to set breakpoints in eclipse IDE. +// I'm sure that there is an Eclipse configuration that makes it +// possible for it to detect .ino files as .cpp, but I'm lazy + diff --git a/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino b/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino new file mode 100644 index 000000000..5d71b9a20 --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino @@ -0,0 +1,37 @@ +// Wire Slave Receiver +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Receives data as an I2C/TWI slave device +// Refer to the "Wire Master Writer" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + + +#include +#define Serial Serial1 + +void setup(){ + Serial.begin(115200); // start serial for output + + Wire.begin(4); // join i2c bus with address #4 + Wire.onReceive(receiveEvent); // register event +} + +void loop(){ + delay(100); +} + +// function that executes whenever data is received from master +// this function is registered as an event, see setup() +// Note that it is not advicable to call Serial.print() from within an ISR +void receiveEvent(int howMany){ + while(1 < Wire.available()){ // loop through all but the last + char c = Wire.read(); // receive byte as a character + Serial.print(c); // print the character + } + int x = Wire.read(); // receive byte as an integer + Serial.println(x); // print the integer +} diff --git a/STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino b/STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino new file mode 100644 index 000000000..75add4a00 --- /dev/null +++ b/STM32F1/libraries/WireSlave/examples/slave_sender/slave_sender.ino @@ -0,0 +1,32 @@ +// Wire Slave Sender +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Sends data as an I2C/TWI slave device +// Refer to the "Wire Master Reader" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(8); // join i2c bus with address #8 + Wire.onRequest(requestEvent); // register event +} + +void loop() +{ + delay(100); +} + +// function that executes whenever data is requested by master +// this function is registered as an event, see setup() +void requestEvent() +{ + Wire.write("hello "); // respond with message of 6 bytes + // as expected by master +} diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.cpp b/STM32F1/libraries/WireSlave/src/Wire_slave.cpp index 93cc55f09..75e753f5c 100644 --- a/STM32F1/libraries/WireSlave/src/Wire_slave.cpp +++ b/STM32F1/libraries/WireSlave/src/Wire_slave.cpp @@ -1,106 +1,523 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ +/* + TwoWire.cpp - TWI/I2C library for Wiring & Arduino + Copyright (c) 2006 Nicholas Zambetti. All right reserved. -/** - * @file TwoWire.cpp - * @author Trystan Jones - * @brief Wire library, uses the hardware I2C available in the Maple to - * interact with I2C slave devices. - */ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. -/* - * Library created by crenn to use the new WireBase system and allow Arduino - * users easy interaction with the I2C Hardware in a familiar method. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts */ +extern "C" { + #include + #include + #include +} + #include "Wire_slave.h" +#include "wirish.h" +#include -uint8 TwoWire::process(uint8 stop) { - int8 res = i2c_master_xfer(sel_hard, &itc_msg, 1, 0); - if (res == I2C_ERROR_PROTOCOL) { - if (sel_hard->error_flags & I2C_SR1_AF) { /* NACK */ - res = (sel_hard->error_flags & I2C_SR1_ADDR ? ENACKADDR : - ENACKTRNS); - } else if (sel_hard->error_flags & I2C_SR1_OVR) { /* Over/Underrun */ - res = EDATA; - } else { /* Bus or Arbitration error */ - res = EOTHER; - } - i2c_disable(sel_hard); - i2c_master_enable(sel_hard, (I2C_BUS_RESET | dev_flags)); - } - return res; +#define BUFFER_LENGTH 32 + +#define MASTER_ADDRESS 0x33 +// Constructors //////////////////////////////////////////////////////////////// + +TwoWire::TwoWire(i2c_dev* i2cDevice) : + sel_hard(i2cDevice), + rxBuffer(nullptr), + rxBufferAllocated(0), + rxBufferIndex(0), + rxBufferLength(0), + txBuffer(nullptr), + txBufferAllocated(0), + txBufferIndex(0), + txBufferLength(0), + transmitting(false), + master(true), + dev_flags(0), + itc_msg(), + itc_slave_msg(), + user_onRequest(nullptr), + user_onReceive(nullptr) { } -uint8 TwoWire::process(){ - return process(true); +// Public Methods ////////////////////////////////////////////////////////////// + +void TwoWire::begin(void) { + begin(MASTER_ADDRESS); } -// TODO: Add in Error Handling if devsel is out of range for other Maples -TwoWire::TwoWire(uint8 dev_sel, uint8 flags) { - if (dev_sel == 1) { - sel_hard = I2C1; - } else if (dev_sel == 2) { - sel_hard = I2C2; - } else { - ASSERT(1); +void TwoWire::begin(uint8_t address){ + + rxBufferIndex = 0; + rxBufferLength = 0; + allocateRxBuffer(BUFFER_LENGTH); + + txBufferIndex = 0; + txBufferLength = 0; + allocateTxBuffer(BUFFER_LENGTH); + + transmitting = 0; + + master = (address == MASTER_ADDRESS); + + // Set default speed to 100KHz + if (master) { + dev_flags = 0; + i2c_master_enable(sel_hard, dev_flags); + } else { + // TODO: I2C_SLAVE_DUAL_ADDRESS ? + dev_flags = I2C_SLAVE_GENERAL_CALL | I2C_SLAVE_USE_RX_BUFFER | + I2C_SLAVE_USE_TX_BUFFER; + + itc_slave_msg.addr = address; + itc_slave_msg.flags = 0; + itc_slave_msg.data = rxBuffer; + itc_slave_msg.length = 0; + itc_slave_msg.flags = 0; + + // TODO why does enable only work before setting IRS and address? + i2c_slave_enable(sel_hard, dev_flags); + + if (sel_hard==I2C1){ + // attach receive handler + i2c_slave_attach_recv_handler(sel_hard, &itc_slave_msg, onReceiveService1); + // attach transmit handler + i2c_slave_attach_transmit_handler(sel_hard, &itc_slave_msg, onRequestService1); + } + #if WIRE_INTERFACES_COUNT > 1 + else if (sel_hard==I2C2){ + // attach receive handler + i2c_slave_attach_recv_handler(sel_hard, &itc_slave_msg, onReceiveService2); + // attach transmit handler + i2c_slave_attach_transmit_handler(sel_hard, &itc_slave_msg, onRequestService2); } - dev_flags = flags; + #endif + + i2c_slave_set_own_address(sel_hard, address); + } } -TwoWire::~TwoWire() { - i2c_disable(sel_hard); - sel_hard = 0; +void TwoWire::begin(int address) { + begin((uint8_t) address); } -void TwoWire::begin(uint8 self_addr) { +void TwoWire::end(void) { + free(txBuffer); + txBuffer = nullptr; + txBufferAllocated = 0; + free(rxBuffer); + rxBuffer = nullptr; + rxBufferAllocated = 0; + i2c_peripheral_disable(sel_hard); + i2c_master_release_bus(sel_hard); // TODO is this required? +} + +void TwoWire::setClock(uint32_t frequencyHz) { + switch (frequencyHz) { + case 400000: + dev_flags |= I2C_FAST_MODE; // set FAST_MODE bit + break; + case 100000: + default: + dev_flags &= ~I2C_FAST_MODE; // clear FAST_MODE bit + break; + } + if (sel_hard->regs->CR1 & I2C_CR1_PE){ + i2c_disable(sel_hard); i2c_master_enable(sel_hard, dev_flags); + } } -void TwoWire::end() { +uint8 TwoWire::process(bool stop) { + int8 res = i2c_master_xfer(sel_hard, &itc_msg, 1, 0); + + if (res == I2C_ERROR_PROTOCOL) { + if (sel_hard->error_flags & I2C_SR1_AF) { /* NACK */ + res = (sel_hard->error_flags & I2C_SR1_ADDR ? ENACKADDR : ENACKTRNS); + } else if (sel_hard->error_flags & I2C_SR1_OVR) { /* Over/Underrun */ + res = EDATA; + } else { /* Bus or Arbitration error */ + res = EOTHER; + } i2c_disable(sel_hard); - sel_hard = 0; -} - -void TwoWire::setClock(uint32_t frequencyHz) -{ - switch(frequencyHz) - { - case 400000: - dev_flags |= I2C_FAST_MODE;// set FAST_MODE bit - break; - case 100000: - default: - dev_flags &= ~I2C_FAST_MODE;// clear FAST_MODE bit - break; - } - if (sel_hard->regs->CR1 & I2C_CR1_PE){ - i2c_disable(sel_hard); - i2c_master_enable(sel_hard, dev_flags); - } -} - -TwoWire Wire(1); + i2c_master_enable(sel_hard, (I2C_BUS_RESET | dev_flags)); + } + + return res; +} + +//TODO: Add the ability to queue messages (adding a boolean to end of function +// call, allows for the Arduino style to stay while also giving the flexibility +// to bulk send +uint8 TwoWire::requestFrom(uint8_t address, uint8_t num_bytes, + uint32_t iaddress, uint8_t isize, uint8_t sendStop) { + + ASSERT(master); + + allocateRxBuffer(num_bytes); + // error if no memory block available to allocate the buffer + if (rxBuffer == nullptr) { + return EDATA; + } + + // reset tx buffer iterator vars + rxBufferIndex = 0; + rxBufferLength = 0; + + if (num_bytes > BUFFER_LENGTH) { + num_bytes = BUFFER_LENGTH; + } + + itc_msg.addr = address; + itc_msg.flags = I2C_MSG_READ; + itc_msg.length = num_bytes; + itc_msg.data = &rxBuffer[rxBufferIndex]; + process(sendStop); // TODO deal with to the return value + + // TODO handle iaddress & isize + rxBufferLength += itc_msg.xferred; + itc_msg.flags = 0; + + return rxBufferLength; +} + +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, + uint8_t sendStop) { + // TODO shouldn't this set flag |= I2C_MSG_10BIT_ADDR ??? + return requestFrom((uint8_t) address, (uint8_t) quantity, (uint32_t) 0, + (uint8_t) 0, sendStop); +} + +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) { + return requestFrom((uint8_t) address, (uint8_t) quantity, (uint32_t) 0, + (uint8_t) 0, (uint8_t) true); +} + +uint8_t TwoWire::requestFrom(int address, int quantity) { + return requestFrom((uint8_t) address, (uint8_t) quantity, (uint32_t) 0, + (uint8_t) 0, (uint8_t) true); +} + +uint8_t TwoWire::requestFrom(int address, int quantity, + int sendStop) { + return requestFrom((uint8_t) address, (uint8_t) quantity, (uint32_t) 0, + (uint8_t) 0, (bool) sendStop); +} + +void TwoWire::beginTransmission(uint8_t address) { + + // indicate that we are transmitting + transmitting = 1; + + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; + + itc_msg.addr = address; + itc_msg.data = &txBuffer[txBufferIndex]; + itc_msg.length = 0; + itc_msg.flags = 0; + +} + +void TwoWire::beginTransmission(int address) { + beginTransmission((uint8_t) address); +} + +// +// Originally, 'endTransmission' was an f(void) function. +// It has been modified to take one parameter indicating +// whether or not a STOP should be performed on the bus. +// Calling endTransmission(false) allows a sketch to +// perform a repeated start. +// +// WARNING: Nothing in the library keeps track of whether +// the bus tenure has been properly ended with a STOP. It +// is very possible to leave the bus in a hung state if +// no call to endTransmission(true) is made. Some I2C +// devices will behave oddly if they do not see a STOP. +// +uint8_t TwoWire::endTransmission(uint8_t sendStop) { + //UNUSED(sendStop); + int8_t ret = 4; + + if (master == true) { + + itc_msg.data = txBuffer; + itc_msg.length = txBufferLength; + itc_msg.flags = 0; + ret = process(sendStop); // Changed so that the return value from process is returned by this function see also the return line below + txBufferIndex = 0; + + // reset Tx buffer + resetTxBuffer(); // TODO why? isn't this just unesssesary? + + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; + + // indicate that we are done transmitting + transmitting = 0; + } + + return ret; +} + +// This provides backwards compatibility with the original +// definition, and expected behaviour, of endTransmission +// + +uint8_t TwoWire::endTransmission(void) { + return endTransmission(true); +} + +// must be called in: +// slave tx event callback +// or after beginTransmission(address) +size_t TwoWire::write(uint8_t data) { + if (!transmitting && master) { + return 0; + } else { + // in master transmitter mode or slave tx event callback + allocateTxBuffer(txBufferLength + 1); + // error if no memory block available to allocate the buffer + if (txBuffer == nullptr) { + setWriteError(); + return 0; + } + // put byte in tx buffer + txBuffer[txBufferIndex] = data; + ++txBufferIndex; + // update amount in buffer + txBufferLength = txBufferIndex; + } + return 1; +} + +/** + * @brief This function must be called in slave Tx event callback or after + * beginTransmission() and before endTransmission(). + * @param pdata: pointer to the buffer data + * @param quantity: number of bytes to write + * @retval number of bytes ready to write. + */ +size_t TwoWire::write(const uint8_t *data, size_t quantity) { + if (!transmitting && master) { + return 0; + } else { + // in master transmitter mode or slave Tx event callback + allocateTxBuffer(txBufferLength + quantity); + // error if no memory block available to allocate the buffer + if (txBuffer == nullptr) { + setWriteError(); + return 0; + } + // put bytes in tx buffer + memcpy(&(txBuffer[txBufferIndex]), data, quantity); + txBufferIndex = txBufferIndex + quantity; + // update amount in buffer + txBufferLength = txBufferIndex; + return quantity; + } + return 0; +} + +// must be called in: +// slave rx event callback +// or after requestFrom(address, numBytes) +int TwoWire::available(void) { + return rxBufferLength - rxBufferIndex; +} + +// must be called in: +// slave rx event callback +// or after requestFrom(address, numBytes) +int TwoWire::read(void) { + int value = -1; + + // get each successive byte on each call + if (rxBufferIndex < rxBufferLength) { + value = rxBuffer[rxBufferIndex]; + ++rxBufferIndex; + + /* Commented as not I think it is not useful + * but kept to show that it is possible to + * reset rx buffer when no more data available */ + /*if(rxBufferIndex == rxBufferLength) { + resetRxBuffer(); + }*/ + } + + return value; +} + +// must be called in: +// slave rx event callback +// or after requestFrom(address, numBytes) +int TwoWire::peek(void) { + int value = -1; + + if (rxBufferIndex < rxBufferLength) { + value = rxBuffer[rxBufferIndex]; + } + + return value; +} + +void TwoWire::flush(void) { + rxBufferIndex = 0; + rxBufferLength = 0; + resetRxBuffer(); + txBufferIndex = 0; + txBufferLength = 0; + resetTxBuffer(); +} + +// behind the scenes function that is called when data is received +void __attribute__((always_inline)) TwoWire::onReceiveService(i2c_msg* msg) { + // don't bother if user hasn't registered a callback + if (!user_onReceive) { + return; + } + + // don't bother if rx buffer is in use by a master requestFrom() op + // i know this drops data, but it allows for slight stupidity + // meaning, they may not have read all the master requestFrom() data yet + if (rxBufferIndex < rxBufferLength) { + return; + } + // copy twi rx buffer into local read buffer + // this enables new reads to happen in parallel + // + // TODO: Something is strange here, isn't msg->data==rxBuffer? nope, itsnot + // + memcpy(rxBuffer, msg->data, msg->length); + // set rx iterator vars + rxBufferIndex = 0; + rxBufferLength = msg->length; + // alert user program + user_onReceive(msg->length); +} + +// behind the scenes function that is called when data is requested +void __attribute__((always_inline)) TwoWire::onRequestService(i2c_msg* msg) { + // don't bother if user hasn't registered a callback + if (!user_onRequest) { + return; + } + + // reset tx buffer iterator vars + // !!! this will kill any pending pre-master sendTo() activity + txBufferIndex = 0; + txBufferLength = 0; + // alert user program + user_onRequest(); + + // update i2c_msg + msg->data = txBuffer; + msg->length = txBufferLength; + msg->xferred = 0; +} + +// sets function called on slave write +void TwoWire::onReceive(void (*function)(int)) { + user_onReceive = function; +} + +// sets function called on slave read +void TwoWire::onRequest(void (*function)(void)) { + user_onRequest = function; +} + +/** + * @brief Allocate the Rx/Tx buffer to the requested length if needed + * @note Minimum allocated size is BUFFER_LENGTH) + * @param length: number of bytes to allocate + */ +inline void TwoWire::allocateRxBuffer(size_t length) { + // By default we allocate BUFFER_LENGTH bytes. It is the min size of the buffer. + if (length < BUFFER_LENGTH) { + length = BUFFER_LENGTH; + } + if (rxBufferAllocated < length) { + rxBuffer = (uint8_t *) realloc(rxBuffer, length * sizeof(uint8_t)); + rxBufferAllocated = (rxBuffer != nullptr) ? length : 0; + } +} + +inline void TwoWire::allocateTxBuffer(size_t length) { + // By default we allocate BUFFER_LENGTH bytes. It is the min size of the buffer. + if (length < BUFFER_LENGTH) { + length = BUFFER_LENGTH; + } + if (txBufferAllocated < length) { + txBuffer = (uint8_t *) realloc(txBuffer, length * sizeof(uint8_t)); + txBufferAllocated = (txBuffer != nullptr) ? length : 0; + } +} + +/** + * @brief Reset Rx/Tx buffer content to 0 + */ +inline void TwoWire::resetRxBuffer(void) { + if (rxBuffer != nullptr) + memset(rxBuffer, 0, rxBufferAllocated); +} + +inline void TwoWire::resetTxBuffer(void) { + if (txBuffer != nullptr) + memset(txBuffer, 0, txBufferAllocated); +} + + +// Preinstantiate Objects ////////////////////////////////////////////////////// +TwoWire& Wire = TwoWire::getInstance(); //SCL:D14 SDA:D15 +#if WIRE_INTERFACES_COUNT > 1 +TwoWire& Wire1 = TwoWire::getInstance1(); //SCL: D1 SDA: D0 +#endif + +// Static methods ////////////////////////////////////////////////////////////// + +TwoWire& TwoWire::getInstance(){ + static TwoWire instance(I2C1); + return instance; +} + +#if WIRE_INTERFACES_COUNT > 1 +TwoWire& TwoWire::getInstance1(){ + static TwoWire instance(I2C2); + return instance; +} +#endif + +// onRequestServiceX and onReceiveServiceX can't be inline since they +// are exclusively called via a function pointer +void TwoWire::onRequestService1(i2c_msg* msg) { + Wire.onRequestService(msg); +} + +void TwoWire::onReceiveService1(i2c_msg* msg) { + Wire.onReceiveService(msg); +} + +#if WIRE_INTERFACES_COUNT > 1 +void TwoWire::onRequestService2(i2c_msg* msg) { + Wire1.onRequestService(msg); +} +void TwoWire::onReceiveService2(i2c_msg* msg) { + Wire1.onReceiveService(msg); +} +#endif diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.h b/STM32F1/libraries/WireSlave/src/Wire_slave.h index dbe2a4ea5..ff71228c6 100644 --- a/STM32F1/libraries/WireSlave/src/Wire_slave.h +++ b/STM32F1/libraries/WireSlave/src/Wire_slave.h @@ -1,78 +1,149 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file Wire.h - * @author Trystan Jones - * @brief Wire library, uses the hardware I2C available in the Maple to - * interact with I2C slave devices. - */ - /* - * Library created by crenn to use the new WireBase system and allow Arduino - * users easy interaction with the I2C Hardware in a familiar method. + TwoWire.h - TWI/I2C library for Arduino & Wiring + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts */ -#ifndef _TWOWIRE_H_ -#define _TWOWIRE_H_ +#ifndef TwoWire_h +#define TwoWire_h -#include "utility/WireBase_slave.h" -#include "wirish.h" +#include +#include "Stream.h" +#include "Arduino.h" #include -class TwoWire : public WireBase { + +// WIRE_HAS_END means Wire has end() +#ifndef WIRE_HAS_END +#define WIRE_HAS_END 1 +#endif + +#ifndef WIRE_INTERFACES_COUNT +#define WIRE_INTERFACES_COUNT 2 +#endif + +/* return codes from endTransmission() */ +typedef enum EndTranmissionCodes { + SUCCESS = 0, /* transmission was successful */ + EDATA = 1, /* too much data */ + ENACKADDR = 2, /* received nack on transmit of address */ + ENACKTRNS = 3, /* received nack on transmit of data */ + EOTHER = 4, /* other error */ +} EndTranmissionCodes; + +class TwoWire: public Stream { private: - i2c_dev* sel_hard; - uint8 dev_flags; -protected: - /* - * Processes the incoming I2C message defined by WireBase to the - * hardware. If an error occured, restart the I2C device. - */ - uint8 process(uint8); - uint8 process(); + i2c_dev* sel_hard; + + uint8_t *rxBuffer; // lazy allocation + uint8_t rxBufferAllocated; + uint8_t rxBufferIndex; + uint8_t rxBufferLength; + + uint8_t *txBuffer; // lazy allocation + uint8_t txBufferAllocated; + uint8_t txBufferIndex; + uint8_t txBufferLength; + + uint8_t transmitting; + + bool master; + + uint8 dev_flags; + i2c_msg itc_msg; + i2c_msg itc_slave_msg; + + void (*user_onRequest)(void); + void (*user_onReceive)(int); + + void allocateRxBuffer(size_t length); + void allocateTxBuffer(size_t length); + + void resetRxBuffer(void); + void resetTxBuffer(void); + uint8 process(bool stop = true); // wrapper for i2c_master_xfer + + inline void __attribute__((always_inline)) onReceiveService(i2c_msg* msg); + inline void __attribute__((always_inline)) onRequestService(i2c_msg* msg); + + static void onRequestService1(i2c_msg*); + static void onReceiveService1(i2c_msg*); + #if WIRE_INTERFACES_COUNT > 1 + static void onRequestService2(i2c_msg*); + static void onReceiveService2(i2c_msg*); + #endif + + TwoWire(i2c_dev* i2cDevice); + TwoWire() = delete; + TwoWire(const TwoWire&) = delete; + TwoWire& operator=(const TwoWire&) = delete; + TwoWire(TwoWire&&) = delete; + TwoWire& operator=(TwoWire&&) = delete; + public: - /* - * Check if devsel is within range and enable selected I2C interface with - * passed flags - */ - TwoWire(uint8, uint8 = 0); - - /* - * Shuts down (disables) the hardware I2C - */ - void end(); - - void setClock(uint32_t frequencyHz); - /* - * Disables the I2C device and remove the device address. - */ - ~TwoWire(); - - void begin(uint8 = 0x00); + static TwoWire& getInstance(); + #if WIRE_INTERFACES_COUNT > 1 + static TwoWire& getInstance1(); + #endif + + void begin(); + void begin(uint8_t); + void begin(int); + void end(); + void setClock(uint32_t); + void beginTransmission(uint8_t); + void beginTransmission(int); + uint8_t endTransmission(void); + uint8_t endTransmission(uint8_t); + + uint8_t requestFrom(uint8_t, uint8_t); + uint8_t requestFrom(uint8_t, uint8_t, uint8_t); + uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t); + uint8_t requestFrom(int, int); + uint8_t requestFrom(int, int, int); + + virtual size_t write(uint8_t); + virtual size_t write(const uint8_t *, size_t); + virtual int available(void); + virtual int read(void); + virtual int peek(void); + virtual void flush(void); + void onReceive(void (*)(int)); + void onRequest(void (*)(void)); + + inline size_t write(unsigned long n) { + return write((uint8_t) n); + } + inline size_t write(long n) { + return write((uint8_t) n); + } + inline size_t write(unsigned int n) { + return write((uint8_t) n); + } + inline size_t write(int n) { + return write((uint8_t) n); + } + using Print::write; }; -extern TwoWire Wire; -#endif // _TWOWIRE_H_ + +extern TwoWire& Wire; +#if WIRE_INTERFACES_COUNT > 1 +extern TwoWire& Wire1; +#endif + +#endif // TwoWire_h diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.h.gch b/STM32F1/libraries/WireSlave/src/Wire_slave.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..5a6345078e7abad4b9211a296cfa52568e2ed238 GIT binary patch literal 9475 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 Y;dI<1)bAmJrq!61Ti)JEJwtc@2OMIdI{*Lx literal 0 HcmV?d00001 diff --git a/STM32F1/libraries/WireSlave/src/i2c_slave.c b/STM32F1/libraries/WireSlave/src/i2c_slave.c index 865949b36..82ade9a4b 100644 --- a/STM32F1/libraries/WireSlave/src/i2c_slave.c +++ b/STM32F1/libraries/WireSlave/src/i2c_slave.c @@ -158,6 +158,7 @@ void i2c_bus_reset(const i2c_dev *dev) { * @param dev Device to initialize. */ void i2c_init(i2c_dev *dev) { + rcc_reset_dev(dev->clk_id); rcc_clk_enable(dev->clk_id); _i2c_irq_priority_fixup(dev); @@ -197,8 +198,10 @@ void i2c_master_enable(i2c_dev *dev, uint32 flags) { i2c_init(dev); i2c_config_gpios(dev); - /* Configure clock and rise time */ - set_ccr_trise(dev, flags); + /* Configure clock and rise time, but only if in master mode */ + if (!(flags & (I2C_SLAVE_DUAL_ADDRESS|I2C_SLAVE_GENERAL_CALL))) { + set_ccr_trise(dev, flags); + } /* Enable event and buffer interrupts */ nvic_irq_enable(dev->ev_nvic_line); @@ -245,8 +248,9 @@ void i2c_master_enable(i2c_dev *dev, uint32 flags) { * Callback will be called before tx */ void i2c_slave_enable(i2c_dev *dev, uint32 flags) { + // TODO: Figure out why i2c_disable(I2C2) causes a crash when I2C1 is enabled i2c_disable(dev); - i2c_master_enable(dev, dev->config_flags | flags); + i2c_master_enable(dev, flags); } /** @@ -329,7 +333,8 @@ static inline int32 wait_for_state_change(i2c_dev *dev, */ /* - * IRQ handler for I2C master. Handles transmission/reception. + * IRQ handler for I2C master and slave. + * Handles transmission/reception. */ void _i2c_irq_handler(i2c_dev *dev) { /* WTFs: @@ -676,7 +681,7 @@ void _i2c_irq_error_handler(i2c_dev *dev) { I2C_SR1_OVR); /* Are we in slave mode? */ - if ((dev->regs->SR2 & I2C_SR2_MSL) != I2C_SR2_MSL) { + if (dev->config_flags & (I2C_SLAVE_DUAL_ADDRESS|I2C_SLAVE_GENERAL_CALL)) { /* Check to see if the master device did a NAK on the last bit * This is perfectly valid for a master to do this on the bus. * We ignore this. Any further error processing takes us into dead diff --git a/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.cpp b/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.cpp deleted file mode 100644 index a30921179..000000000 --- a/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file WireBase.cpp - * @author Trystan Jones - * @brief Wire library, following the majority of the interface from Arduino. - * Provides a 'standard' interface to I2C (two-wire) communication for - * derived classes. - */ - -/* - * Library created by crenn to allow a system which would provide users the - * 'standardised' Arduino method for interfacing with I2C devices regardless of - * whether it is I2C hardware or emulating software. - */ - -#include "WireBase_slave.h" -#include "wirish.h" - -void WireBase::begin(uint8 self_addr) { - tx_buf_idx = 0; - tx_buf_overflow = false; - rx_buf_idx = 0; - rx_buf_len = 0; -} - -void WireBase::beginTransmission(uint8 slave_address) { - itc_msg.addr = slave_address; - itc_msg.data = &tx_buf[tx_buf_idx]; - itc_msg.length = 0; - itc_msg.flags = 0; -} - -void WireBase::beginTransmission(int slave_address) { - beginTransmission((uint8)slave_address); -} - -uint8 WireBase::endTransmission(bool stop) { - uint8 retVal; - if (tx_buf_overflow) { - return EDATA; - } - retVal = process(stop);// Changed so that the return value from process is returned by this function see also the return line below - tx_buf_idx = 0; - tx_buf_overflow = false; - return retVal;//SUCCESS; -} - -uint8 WireBase::endTransmission(){ - endTransmission(true); -} - -//TODO: Add the ability to queue messages (adding a boolean to end of function -// call, allows for the Arduino style to stay while also giving the flexibility -// to bulk send -uint8 WireBase::requestFrom(uint8 address, int num_bytes) { - if (num_bytes > BUFFER_LENGTH) { - num_bytes = BUFFER_LENGTH; - } - itc_msg.addr = address; - itc_msg.flags = I2C_MSG_READ; - itc_msg.length = num_bytes; - itc_msg.data = &rx_buf[rx_buf_idx]; - process(); - rx_buf_len += itc_msg.xferred; - itc_msg.flags = 0; - return rx_buf_len; -} - -uint8 WireBase::requestFrom(int address, int numBytes) { - return WireBase::requestFrom((uint8)address, numBytes); -} - -void WireBase::write(uint8 value) { - if (tx_buf_idx == BUFFER_LENGTH) { - tx_buf_overflow = true; - return; - } - tx_buf[tx_buf_idx++] = value; - itc_msg.length++; -} - -void WireBase::write(uint8* buf, int len) { - for (uint8 i = 0; i < len; i++) { - write(buf[i]); - } -} - -void WireBase::write(int value) { - write((uint8)value); -} - -void WireBase::write(int* buf, int len) { - write((uint8*)buf, (uint8)len); -} - -void WireBase::write(char* buf) { - uint8 *ptr = (uint8*)buf; - while (*ptr) { - write(*ptr); - ptr++; - } -} - -uint8 WireBase::available() { - return rx_buf_len - rx_buf_idx; -} - -uint8 WireBase::read() { - if (rx_buf_idx == rx_buf_len) { - rx_buf_idx = 0; - rx_buf_len = 0; - return 0; - } else if (rx_buf_idx == (rx_buf_len-1)) { - uint8 temp = rx_buf[rx_buf_idx]; - rx_buf_idx = 0; - rx_buf_len = 0; - return temp; - } - return rx_buf[rx_buf_idx++]; -} diff --git a/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h b/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h deleted file mode 100644 index 31f3f8cee..000000000 --- a/STM32F1/libraries/WireSlave/src/utility/WireBase_slave.h +++ /dev/null @@ -1,145 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file WireBase.h - * @author Trystan Jones - * @brief Wire library, following the majority of the interface from Arduino. - * Provides a 'standard' interface to I2C (two-wire) communication for - * derived classes. - */ - -/* - * Library created by crenn to allow a system which would provide users the - * 'standardised' Arduino method for interfacing with I2C devices regardless of - * whether it is I2C hardware or emulating software. - */ - -#ifndef _WIREBASE_H_ -#define _WIREBASE_H_ - -#include "wirish.h" -#include - -#define BUFFER_LENGTH 32 - -/* return codes from endTransmission() */ -#define SUCCESS 0 /* transmission was successful */ -#define EDATA 1 /* too much data */ -#define ENACKADDR 2 /* received nack on transmit of address */ -#define ENACKTRNS 3 /* received nack on transmit of data */ -#define EOTHER 4 /* other error */ - -class WireBase { // Abstraction is awesome! -protected: - i2c_msg itc_msg; - uint8 rx_buf[BUFFER_LENGTH]; /* receive buffer */ - uint8 rx_buf_idx; /* first unread idx in rx_buf */ - uint8 rx_buf_len; /* number of bytes read */ - - uint8 tx_buf[BUFFER_LENGTH]; /* transmit buffer */ - uint8 tx_buf_idx; // next idx available in tx_buf, -1 overflow - boolean tx_buf_overflow; - - // Force derived classes to define process function - virtual uint8 process(uint8) = 0; - virtual uint8 process() = 0; -public: - WireBase() {} - ~WireBase() {} - - /* - * Initialises the class interface - */ - // Allow derived classes to overwrite begin function - virtual void begin(uint8 = 0x00); - - /* - * Sets up the transmission message to be processed - */ - void beginTransmission(uint8); - - /* - * Allow only 8 bit addresses to be used - */ - void beginTransmission(int); - - /* - * Call the process function to process the message if the TX - * buffer has not overflowed. - */ - uint8 endTransmission(bool); - uint8 endTransmission(void); - - /* - * Request bytes from a slave device and process the request, - * storing into the receiving buffer. - */ - uint8 requestFrom(uint8, int); - - /* - * Allow only 8 bit addresses to be used when requesting bytes - */ - uint8 requestFrom(int, int); - - /* - * Stack up bytes to be sent when transmitting - */ - void write(uint8); - - /* - * Stack up bytes from the array to be sent when transmitting - */ - void write(uint8*, int); - - /* - * Ensure that a sending data will only be 8-bit bytes - */ - void write(int); - - /* - * Ensure that an array sending data will only be 8-bit bytes - */ - void write(int*, int); - - /* - * Stack up bytes from a string to be sent when transmitting - */ - void write(char*); - - /* - * Return the amount of bytes that is currently in the receiving buffer - */ - uint8 available(); - - /* - * Return the value of byte in the receiving buffer that is currently being - * pointed to - */ - uint8 read(); -}; - -#endif // _WIREBASE_H_ From 4ad4de080fd87bcdb0f176959bd74c8293ecc3e3 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 22 Dec 2017 20:04:24 +0100 Subject: [PATCH 280/307] Saved some 50K flash memory by modifying the singleton implementation --- STM32F1/libraries/WireSlave/src/Wire_slave.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.cpp b/STM32F1/libraries/WireSlave/src/Wire_slave.cpp index 75e753f5c..2cdb1570c 100644 --- a/STM32F1/libraries/WireSlave/src/Wire_slave.cpp +++ b/STM32F1/libraries/WireSlave/src/Wire_slave.cpp @@ -492,14 +492,20 @@ TwoWire& Wire1 = TwoWire::getInstance1(); //SCL: D1 SDA: D0 // Static methods ////////////////////////////////////////////////////////////// TwoWire& TwoWire::getInstance(){ - static TwoWire instance(I2C1); - return instance; + static TwoWire* instance = nullptr; + if (!instance) { + instance = new TwoWire(I2C1); + } + return *instance; } #if WIRE_INTERFACES_COUNT > 1 TwoWire& TwoWire::getInstance1(){ - static TwoWire instance(I2C2); - return instance; + static TwoWire* instance = nullptr; + if (!instance) { + instance = new TwoWire(I2C2); + } + return *instance; } #endif From 01c23b6a5828607734f872ddf5861f5df2797175 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 22 Dec 2017 20:33:00 +0100 Subject: [PATCH 281/307] Changed type of transmitting to bool (from uint8_t) --- STM32F1/libraries/WireSlave/src/Wire_slave.cpp | 6 +++--- STM32F1/libraries/WireSlave/src/Wire_slave.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.cpp b/STM32F1/libraries/WireSlave/src/Wire_slave.cpp index 2cdb1570c..9bb989718 100644 --- a/STM32F1/libraries/WireSlave/src/Wire_slave.cpp +++ b/STM32F1/libraries/WireSlave/src/Wire_slave.cpp @@ -69,7 +69,7 @@ void TwoWire::begin(uint8_t address){ txBufferLength = 0; allocateTxBuffer(BUFFER_LENGTH); - transmitting = 0; + transmitting = false; master = (address == MASTER_ADDRESS); @@ -220,7 +220,7 @@ uint8_t TwoWire::requestFrom(int address, int quantity, void TwoWire::beginTransmission(uint8_t address) { // indicate that we are transmitting - transmitting = 1; + transmitting = true; // reset tx buffer iterator vars txBufferIndex = 0; @@ -270,7 +270,7 @@ uint8_t TwoWire::endTransmission(uint8_t sendStop) { txBufferLength = 0; // indicate that we are done transmitting - transmitting = 0; + transmitting = false; } return ret; diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.h b/STM32F1/libraries/WireSlave/src/Wire_slave.h index ff71228c6..131acebb8 100644 --- a/STM32F1/libraries/WireSlave/src/Wire_slave.h +++ b/STM32F1/libraries/WireSlave/src/Wire_slave.h @@ -60,7 +60,7 @@ class TwoWire: public Stream { uint8_t txBufferIndex; uint8_t txBufferLength; - uint8_t transmitting; + bool transmitting; bool master; From b9dbeb69d9dee7330435af9b5e30e99be6423265 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 29 Dec 2017 12:04:29 +0100 Subject: [PATCH 282/307] Fixed minor example issues --- .../i2c_libmaple_slave_reader/i2c_libmaple_slave_reader.ino | 2 +- .../WireSlave/examples/slave_receiver/slave_receiver.ino | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave_reader/i2c_libmaple_slave_reader.ino b/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave_reader/i2c_libmaple_slave_reader.ino index a63ff3c98..fd059c121 100644 --- a/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave_reader/i2c_libmaple_slave_reader.ino +++ b/STM32F1/libraries/WireSlave/examples/i2c_libmaple_slave_reader/i2c_libmaple_slave_reader.ino @@ -53,7 +53,7 @@ void functx(i2c_msg *msg){ void setup() { Serial.begin(115200); - Serial.println("I2C Slave example"); + Serial.println("libmaple I2C slave reader example"); // attach the buffer msg.data = buffer; diff --git a/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino b/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino index 5d71b9a20..bf9f255f8 100644 --- a/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino +++ b/STM32F1/libraries/WireSlave/examples/slave_receiver/slave_receiver.ino @@ -11,7 +11,6 @@ #include -#define Serial Serial1 void setup(){ Serial.begin(115200); // start serial for output From 4e820c3649fbe4238bdef67dad393967a76b6873 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 29 Dec 2017 12:13:17 +0100 Subject: [PATCH 283/307] Full method signatures in header file. I don't understand why anyone wants to remove useful API information from the header file. CPP files describes implementation details, header files describes the API. --- STM32F1/libraries/WireSlave/src/Wire_slave.h | 50 ++++++++++---------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.h b/STM32F1/libraries/WireSlave/src/Wire_slave.h index 131acebb8..a99ab412e 100644 --- a/STM32F1/libraries/WireSlave/src/Wire_slave.h +++ b/STM32F1/libraries/WireSlave/src/Wire_slave.h @@ -69,7 +69,7 @@ class TwoWire: public Stream { i2c_msg itc_slave_msg; void (*user_onRequest)(void); - void (*user_onReceive)(int); + void (*user_onReceive)(int quantity); void allocateRxBuffer(size_t length); void allocateTxBuffer(size_t length); @@ -96,47 +96,49 @@ class TwoWire: public Stream { TwoWire& operator=(TwoWire&&) = delete; public: + // return the 'Wire' instance (using I2C1) static TwoWire& getInstance(); #if WIRE_INTERFACES_COUNT > 1 + // return the 'Wire1' instance (using I2C2) static TwoWire& getInstance1(); #endif - void begin(); - void begin(uint8_t); - void begin(int); + void begin(); // master mode + void begin(uint8_t myAddress); //slave mode + void begin(int myAddress); //slave mode void end(); - void setClock(uint32_t); - void beginTransmission(uint8_t); - void beginTransmission(int); + void setClock(uint32_t frequencyHz); + void beginTransmission(uint8_t slaveAddress); + void beginTransmission(int slaveAddress); uint8_t endTransmission(void); - uint8_t endTransmission(uint8_t); + uint8_t endTransmission(uint8_t sendStop); - uint8_t requestFrom(uint8_t, uint8_t); - uint8_t requestFrom(uint8_t, uint8_t, uint8_t); - uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t); - uint8_t requestFrom(int, int); - uint8_t requestFrom(int, int, int); + uint8_t requestFrom(uint8_t slaveAddress, uint8_t quantity); + uint8_t requestFrom(uint8_t slaveAddress, uint8_t quantity, uint8_t sendStop); + uint8_t requestFrom(uint8_t slaveAddress, uint8_t num_bytes, uint32_t iaddress, uint8_t isize, uint8_t sendStop); + uint8_t requestFrom(int slaveAddress, int quantity); + uint8_t requestFrom(int slaveAddress, int quantity, int sendStop); - virtual size_t write(uint8_t); - virtual size_t write(const uint8_t *, size_t); + virtual size_t write(uint8_t data); + virtual size_t write(const uint8_t *data, size_t quantity); virtual int available(void); virtual int read(void); virtual int peek(void); virtual void flush(void); - void onReceive(void (*)(int)); + void onReceive(void (*)(int quantity)); void onRequest(void (*)(void)); - inline size_t write(unsigned long n) { - return write((uint8_t) n); + inline size_t write(unsigned long data) { + return write((uint8_t) data); } - inline size_t write(long n) { - return write((uint8_t) n); + inline size_t write(long data) { + return write((uint8_t) data); } - inline size_t write(unsigned int n) { - return write((uint8_t) n); + inline size_t write(unsigned int data) { + return write((uint8_t) data); } - inline size_t write(int n) { - return write((uint8_t) n); + inline size_t write(int data) { + return write((uint8_t) data); } using Print::write; }; From daf62cafcaf044836945a6d6553180b8da00e927 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 29 Dec 2017 12:15:26 +0100 Subject: [PATCH 284/307] Removed a redundant buffer constraint --- STM32F1/libraries/WireSlave/src/Wire_slave.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/STM32F1/libraries/WireSlave/src/Wire_slave.cpp b/STM32F1/libraries/WireSlave/src/Wire_slave.cpp index 9bb989718..5fb84f5ba 100644 --- a/STM32F1/libraries/WireSlave/src/Wire_slave.cpp +++ b/STM32F1/libraries/WireSlave/src/Wire_slave.cpp @@ -177,10 +177,6 @@ uint8 TwoWire::requestFrom(uint8_t address, uint8_t num_bytes, rxBufferIndex = 0; rxBufferLength = 0; - if (num_bytes > BUFFER_LENGTH) { - num_bytes = BUFFER_LENGTH; - } - itc_msg.addr = address; itc_msg.flags = I2C_MSG_READ; itc_msg.length = num_bytes; @@ -211,8 +207,7 @@ uint8_t TwoWire::requestFrom(int address, int quantity) { (uint8_t) 0, (uint8_t) true); } -uint8_t TwoWire::requestFrom(int address, int quantity, - int sendStop) { +uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop) { return requestFrom((uint8_t) address, (uint8_t) quantity, (uint32_t) 0, (uint8_t) 0, (bool) sendStop); } From 2b6e1398847561b5604b397c245b01535e1168a3 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 1 Dec 2017 11:43:42 +0100 Subject: [PATCH 285/307] According to STM32F103 RM0008: TIMx_CCMR1::CC2S=01 -> channel is configured as input, IC2 is mapped on TI2. --- STM32F1/system/libmaple/include/libmaple/timer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/system/libmaple/include/libmaple/timer.h b/STM32F1/system/libmaple/include/libmaple/timer.h index 2c83e5e81..ea7484e71 100644 --- a/STM32F1/system/libmaple/include/libmaple/timer.h +++ b/STM32F1/system/libmaple/include/libmaple/timer.h @@ -394,8 +394,8 @@ extern timer_dev timer14; #define TIMER_CCMR1_IC2PSC (0x3 << 10) #define TIMER_CCMR1_CC2S (0x3 << 8) #define TIMER_CCMR1_CC2S_OUTPUT (TIMER_CCMR_CCS_OUTPUT << 8) -#define TIMER_CCMR1_CC2S_INPUT_TI1 (TIMER_CCMR_CCS_INPUT_TI1 << 8) -#define TIMER_CCMR1_CC2S_INPUT_TI2 (TIMER_CCMR_CCS_INPUT_TI2 << 8) +#define TIMER_CCMR1_CC2S_INPUT_TI1 (TIMER_CCMR_CCS_INPUT_TI2 << 8) +#define TIMER_CCMR1_CC2S_INPUT_TI2 (TIMER_CCMR_CCS_INPUT_TI1 << 8) #define TIMER_CCMR1_CC2S_INPUT_TRC (TIMER_CCMR_CCS_INPUT_TRC << 8) #define TIMER_CCMR1_OC1CE (1U << TIMER_CCMR1_OC1CE_BIT) #define TIMER_CCMR1_OC1M (0x3 << 4) From 388995efbba555b742ba7652399c05c1ce1678d3 Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Fri, 1 Dec 2017 15:55:27 +0100 Subject: [PATCH 286/307] Adhere to the format of #323 --- STM32F1/system/libmaple/include/libmaple/timer.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/STM32F1/system/libmaple/include/libmaple/timer.h b/STM32F1/system/libmaple/include/libmaple/timer.h index ea7484e71..64f458f1d 100644 --- a/STM32F1/system/libmaple/include/libmaple/timer.h +++ b/STM32F1/system/libmaple/include/libmaple/timer.h @@ -393,10 +393,10 @@ extern timer_dev timer14; #define TIMER_CCMR1_OC2FE (1U << TIMER_CCMR1_OC2FE_BIT) #define TIMER_CCMR1_IC2PSC (0x3 << 10) #define TIMER_CCMR1_CC2S (0x3 << 8) -#define TIMER_CCMR1_CC2S_OUTPUT (TIMER_CCMR_CCS_OUTPUT << 8) -#define TIMER_CCMR1_CC2S_INPUT_TI1 (TIMER_CCMR_CCS_INPUT_TI2 << 8) -#define TIMER_CCMR1_CC2S_INPUT_TI2 (TIMER_CCMR_CCS_INPUT_TI1 << 8) -#define TIMER_CCMR1_CC2S_INPUT_TRC (TIMER_CCMR_CCS_INPUT_TRC << 8) +#define TIMER_CCMR1_CC2S_OUTPUT (0x0 << 8) +#define TIMER_CCMR1_CC2S_INPUT_TI2 (0x1 << 8) +#define TIMER_CCMR1_CC2S_INPUT_TI1 (0x2 << 8) +#define TIMER_CCMR1_CC2S_INPUT_TRC (0x3 << 8) #define TIMER_CCMR1_OC1CE (1U << TIMER_CCMR1_OC1CE_BIT) #define TIMER_CCMR1_OC1M (0x3 << 4) #define TIMER_CCMR1_IC1F (0xF << 4) From 1b8b05c883b9c3713be7ec8210af903220a58667 Mon Sep 17 00:00:00 2001 From: Lacklustrlabs Date: Tue, 23 Jan 2018 13:19:39 +0100 Subject: [PATCH 287/307] Added platform.local.txt and boards.local.txt to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 078faf600..ef5aee566 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ other/maple-bootloader/*~ *.o *.bak *.1 +platform.local.txt +boards.local.txt From 495f3b9cb5787038eb4a1ad066576fd75fa0a0dc Mon Sep 17 00:00:00 2001 From: lacklustrlabs Date: Wed, 15 Nov 2017 23:23:37 +0100 Subject: [PATCH 288/307] Fixed 'warning: multi-line comment [-Wcomment]' --- STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c index 1f0b626a8..7ebd03b76 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c @@ -62,7 +62,7 @@ #if !(defined(BOARD_maple) || defined(BOARD_maple_RET6) || \ defined(BOARD_maple_mini) || defined(BOARD_maple_native)) -//#warning USB CDC ACM relies on LeafLabs board-specific configuration.\ +//#warning USB CDC ACM relies on LeafLabs board-specific configuration. // You may have problems on non-LeafLabs boards. #endif From 6f1429175cb5723e0bf3ec09c89950ae1f5b9cff Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Wed, 24 Jan 2018 07:39:35 +1100 Subject: [PATCH 289/307] Manually committed RTClock files, due to problems with PR https://github.com/rogerclarkmelbourne/Arduino_STM32/pull/428 --- STM32F1/libraries/RTClock/src/RTClock.cpp | 2 +- STM32F1/libraries/RTClock/src/RTClock.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/RTClock/src/RTClock.cpp b/STM32F1/libraries/RTClock/src/RTClock.cpp index e95bead86..f6907edd1 100755 --- a/STM32F1/libraries/RTClock/src/RTClock.cpp +++ b/STM32F1/libraries/RTClock/src/RTClock.cpp @@ -111,7 +111,7 @@ void RTClock::breakTime(time_t timeInput, tm_t & tmm) time /= 60; // now it is hours tmm.hour = time % 24; time /= 24; // now it is days - tmm.weekday = ((time + 4) % 7); // Monday is day 1 // + 1; // Sunday is day 1 + tmm.weekday = ((time + 3) % 7); // Monday is day 1 year = 0; days = 0; diff --git a/STM32F1/libraries/RTClock/src/RTClock.h b/STM32F1/libraries/RTClock/src/RTClock.h index 71015a586..1988c9eef 100755 --- a/STM32F1/libraries/RTClock/src/RTClock.h +++ b/STM32F1/libraries/RTClock/src/RTClock.h @@ -27,7 +27,7 @@ typedef struct tm_t { uint8_t year; // years since 1970 uint8_t month; // month of a year - [ 1 to 12 ] uint8_t day; // day of a month - [ 1 to 31 ] - uint8_t weekday; // day of a week (first day is Sunday) - [ 0 to 6 ] + uint8_t weekday; // day of a week (first day is Monday) - [ 0 to 6 ] uint8_t pm; // AM: 0, PM: 1 uint8_t hour; // hour of a day - [ 0 to 23 ] uint8_t minute; // minute of an hour - [ 0 to 59 ] From 42a5e9f9073e1f3b2a479abc4145a32b8e8c9339 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 2 Feb 2018 09:16:51 +1100 Subject: [PATCH 290/307] Update BOARD_NR_GPIO_PINS for STM32F103V This fixes problem caused by https://github.com/rogerclarkmelbourne/Arduino_STM32/commit/951d0acf178b28d52919fb777874d90603c88883#diff-3df511e94e3cba57d187bb1322b9f6c6 --- STM32F1/variants/generic_stm32f103v/board/board.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/STM32F1/variants/generic_stm32f103v/board/board.h b/STM32F1/variants/generic_stm32f103v/board/board.h index ccd5ecf84..e4bd0896c 100644 --- a/STM32F1/variants/generic_stm32f103v/board/board.h +++ b/STM32F1/variants/generic_stm32f103v/board/board.h @@ -90,8 +90,9 @@ #define BOARD_SPI3_MOSI_PIN PB5 -/* GPIO A to E = 5 * 16 - BOOT1 not used = 79*/ -#define BOARD_NR_GPIO_PINS 79 +/* GPIO A to E = 5 * 16 = 80*/ +/* value is now 80 as boo1 was added via PR to the pinmap but this value was not increased*/ +#define BOARD_NR_GPIO_PINS 80 /* Note: NOT 19. The missing one is D38 a.k.a. BOARD_BUTTON_PIN, which * isn't broken out to a header and is thus unusable for PWM. */ #define BOARD_NR_PWM_PINS 19 From bd19064660cd8ce88f36f0468243fcef5e64edaa Mon Sep 17 00:00:00 2001 From: Phonog Date: Mon, 31 Oct 2016 22:21:27 +0100 Subject: [PATCH 291/307] Add files via upload --- .../examples/HardwareCANexample/Changes.h | 53 ++ .../HardwareCANexample/HardwareCANexample.ino | 181 +++++ STM32F1/libraries/HardwareCAN/keywords.txt | 40 ++ .../libraries/HardwareCAN/library.properties | 9 + .../libraries/HardwareCAN/src/HardwareCAN.cpp | 120 ++++ .../libraries/HardwareCAN/src/HardwareCAN.h | 68 ++ .../libraries/HardwareCAN/src/utility/can.c | 543 +++++++++++++++ .../libraries/HardwareCAN/src/utility/can.h | 322 +++++++++ STM32F1/libraries/rcc.h | 641 ++++++++++++++++++ STM32F1/libraries/rcc_f1.c | 174 +++++ STM32F1/libraries/usb.c | 402 +++++++++++ 11 files changed, 2553 insertions(+) create mode 100644 STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/Changes.h create mode 100644 STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/HardwareCANexample.ino create mode 100644 STM32F1/libraries/HardwareCAN/keywords.txt create mode 100644 STM32F1/libraries/HardwareCAN/library.properties create mode 100644 STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp create mode 100644 STM32F1/libraries/HardwareCAN/src/HardwareCAN.h create mode 100644 STM32F1/libraries/HardwareCAN/src/utility/can.c create mode 100644 STM32F1/libraries/HardwareCAN/src/utility/can.h create mode 100644 STM32F1/libraries/rcc.h create mode 100644 STM32F1/libraries/rcc_f1.c create mode 100644 STM32F1/libraries/usb.c diff --git a/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/Changes.h b/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/Changes.h new file mode 100644 index 000000000..1ccd2fe88 --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/Changes.h @@ -0,0 +1,53 @@ +#ifdef CHANGES_INCLUDE + +****** DETAILS OF THE CHANGES TO BE DONE TO THE CORE TO BE ABLE TO USE THE LIBRARY HardwareCAN ****** + +1) History +The Hardware CAN library was originally published in the Maple Leaflabs forum by X893. +I tested it, and found bugs, which I fixed in the code. My fixes are commented with the initials JMD. +The most important things that missed was to connect the interrupt service routine to the CAN interrupt vector. +The problem is that in the F1 family, this vector is shared with the USB vector, as is some of the memory. Thus, +when one wants to use the CAN, the USB becomes unavailable. This is a severe drawback of this chip, but one has to cope with this. + +2) Changes performed + +2.1) In file C:\ArduinoForSTM32\arduino-1.6.9\hardware\Arduino_STM32-master\STM32F1\cores\maple\libmaple\rcc_f1.c +inserted 1 line, position 96: + [RCC_CAN] = { .clk_domain = APB1, .line_num = 25 }, //! JMD after X893 + +2.2) In file C:\ArduinoForSTM32\arduino-1.6.9\hardware\Arduino_STM32-master\STM32F1\system\libmaple\stm32f1\include\series\rcc.h +inserted 1 line, position 442: + RCC_CAN, //! JMD after X893 + +2.3) In file C:\ArduinoForSTM32\arduino-1.6.9\hardware\Arduino_STM32-master\STM32F1\cores\maple\libmaple\usb\stm32f1\usb.c +2.3.1) inserted 12 lines, position 186 +// JMD : default ISRs of CAN, to be overridden if HardwareCAN library is used in sketch +void __attribute__((weak)) USB_HP_CAN_TX_IRQHandler(void) +{ ; } // Dummy ISR + +void __irq_usb_hp_can_tx(void) +{ + USB_HP_CAN_TX_IRQHandler () ; +} + +uint8 __attribute__((weak)) CAN_RX0_IRQ_Handler(void) +{ return 1 ; } // Dummy ISR + +2.3.2) and altered function void __irq_usb_lp_can_rx0(void) + Was + +void __irq_usb_lp_can_rx0(void) { + uint16 istr = USB_BASE->ISTR; + + /* Use USB_ISR_MSK to only include code for bits we care about. */ + +Becomes + +void __irq_usb_lp_can_rx0(void) { + uint16 istr = USB_BASE->ISTR; + + if (CAN_RX0_IRQ_Handler()) //! JMD : Call to CAN ISR, returns 1 CAN is active + return; //! JMD + + /* Use USB_ISR_MSK to only include code for bits we care about. */ + #endif diff --git a/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/HardwareCANexample.ino b/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/HardwareCANexample.ino new file mode 100644 index 000000000..4e3a9e574 --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/HardwareCANexample.ino @@ -0,0 +1,181 @@ +#include +#include "changes.h" +/* + * Example of use of the HardwareCAN library + * This application receives two frames containing various data. It also produces data that are sent periodically using another two frames. + * Please read the file changes.h to see the changes to be performed to the core in order to use this + */ +// Define the values of the identifiers +#define GYRO_ID 0x27 +#define JOYSTICK_VALUES_ID 0x5A +#define TANK_LEVEL_ID 0x78 +#define MOTOR_CONTROL_ID 0x92 + +// Limit time to flag a CAN error +#define CAN_TIMEOUT 100 +#define CAN_DELAY 10 // ms between two processings of incoming messages +#define CAN_SEND_RATE 200 // ms between two successive sendings + +// Message structures. Each message has its own identifier. As many such variables should be defined +// as the number of different CAN frames the application has to send. Here, they are two. +CanMsg msgGyroscope ; +CanMsg msgMotorControl ; + +// Traffic handling data +int CANquietTime ; // Quiet time counter to detect no activity on CAN bus +bool CANError ; // Indicates that incoming CAN traffic is missing +int CANsendDivider ; // Used to send frames once every so many times loop() is called + +// Applicaton variables +int Contents[4] ; // Contents of the four tanks +int JoystickX ; // Setting of the joystick, X axis +int JoystickY ; // ... Y axis +int AngularRate ; // Output of local gyroscope +int Throttle ; // Motor control value, produced by some local processing +bool ErreurGyroscope = false ; + +// Instanciation of CAN interface +HardwareCAN canBus(CAN1_BASE); + + +// Note : for the predefined identifiers, please have a look in file can.h + +void CANSetup(void) +{ + CAN_STATUS Stat ; + + // Initialize the message structures + // A CAN structure includes the following fields: + msgGyroscope.IDE = CAN_ID_STD; // Indicates a standard identifier ; CAN_ID_EXT would mean this frame uses an extended identifier + msgGyroscope.RTR = CAN_RTR_DATA; // Indicated this is a data frame, as opposed to a remote frame (would then be CAN_RTR_REMOTE) + msgGyroscope.ID = GYRO_ID ; // Identifier of the frame : 0-2047 (0-0x3ff) for standard idenfiers; 0-0x1fffffff for extended identifiers + msgGyroscope.DLC = 3; // Number of data bytes to follow + msgGyroscope.Data[0] = 0x0; // Data bytes, there can be 0 to 8 bytes. + msgGyroscope.Data[1] = 0x0; + msgGyroscope.Data[2] = 0x0; + + msgMotorControl.IDE = CAN_ID_STD; + msgMotorControl.RTR = CAN_RTR_DATA; + msgMotorControl.ID = MOTOR_CONTROL_ID ; + msgMotorControl.DLC = 2; + msgMotorControl.Data[0] = 0x0; + msgMotorControl.Data[1] = 0x0; + + // Initialize CAN module + canBus.map(CAN_GPIO_PB8_PB9); // This setting is already wired in the Olimexino-STM32 board + Stat = canBus.begin(CAN_SPEED_125, CAN_MODE_NORMAL); // Other speeds go from 125 kbps to 1000 kbps. CAN allows even more choices. + + canBus.filter(0, 0, 0); + canBus.set_irq_mode(); // Use irq mode (recommended), so the handling of incoming messages + // will be performed at ease in a task or in the loop. The software fifo is 16 cells long, + // allowing at least 15 ms before processing the fifo is needed at 125 kbps + Stat = canBus.status(); + if (Stat != CAN_OK) + /* Your own error processing here */ ; // Initialization failed +} + +// Send one frame. Parameter is a pointer to a frame structure (above), that has previously been updated with data. +// If no mailbox is available, wait until one becomes empty. There are 3 mailboxes. +CAN_TX_MBX CANsend(CanMsg *pmsg) +{ + CAN_TX_MBX mbx; + + do + { + mbx = canBus.send(pmsg) ; +#ifdef USE_MULTITASK + vTaskDelay( 1 ) ; // Infinite loops are not multitasking-friendly +#endif + } + while(mbx == CAN_TX_NO_MBX) ; // Waiting outbound frames will eventually be sent, unless there is a CAN bus failure. + return mbx ; +} + +// Process incoming messages +// Note : frames are not fully checked for correctness: DLC value is not checked, neither are the IDE and RTR fields. However, the data is guaranteed to be corrrect. +void ProcessMessages(void) +{ + int Pr = 0 ; + int i ; + + CanMsg *r_msg; + + // Loop for every message in the fifo + while ((r_msg = canBus.recv()) != NULL) + { + CANquietTime = 0 ; // Reset at each received frame + CANError = false ; // Clear CAN silence error + switch ( r_msg->ID ) + { + case TANK_LEVEL_ID : // This frame contains four 16-bit words, little endian coded + for ( i = 0 ; i < 4 ; i++ ) + Contents[i] = (int)r_msg->Data[2*i] | ((int)r_msg->Data[(2*i)+1]) << 8 ; + break ; + + case JOYSTICK_VALUES_ID : // This frame contains two 16-bit words, little endian coded + Pr = (int)r_msg->Data[0] ; + Pr |= (int)r_msg->Data[1] << 8 ; + JoystickX = Pr ; + + Pr = (int)r_msg->Data[2] ; + Pr |= (int)r_msg->Data[3] << 8 ; + JoystickY = Pr ; + break ; + + default : // Any frame with a different identifier is ignored + break ; + } + + canBus.free(); // Remove processed message from buffer, whatever the identifier +#ifdef USE_MULTITASK + vTaskDelay( 1 ) ; // Infinite loops are not multitasking-friendly +#endif + } +} + +// Send messages +// Prepare and send 2 frames containing the value of process variables +// Sending all frames at once is a choice; they could be sent separately, at different times and rates. +void SendCANmessages(void) +{ + // Prepare Gyroscope frame : send angular rate + msgGyroscope.Data[0] = AngularRate & 0xff ; + msgGyroscope.Data[1] = ( AngularRate >> 8 ) & 0xff ; + msgGyroscope.Data[2] = ErreurGyroscope ? 1 : 0 ; + CANsend(&msgGyroscope) ; // Send this frame + + msgMotorControl.Data[0] = Throttle & 0xff ; + msgMotorControl.Data[1] = ( Throttle >> 8 ) & 0xff ; + CANsend(&msgMotorControl) ; +} + +// The application program starts here +void setup() { + // put your setup code here, to run once: + CANSetup() ; // Initialize the CAN module and prepare the message structures. +} + +void loop() { + // Process incoming messages periodically (should be often enough to avoid overflowing the fifo) + ProcessMessages() ; // Process all incoming messages, update local variables accordingly + + // This is an example of timeout management. Here it is global to all received frames; + // it could be on a frame by frame basis, with as many control variables as the number of frames. + CANquietTime++ ; + if ( CANquietTime > CAN_TIMEOUT ) + { + CANquietTime = CAN_TIMEOUT + 1 ; // To prevent overflowing this variable if silence prolongs... + CANError = true ; // Flag CAN silence error. Will be cleared at first frame received + } + + // Send messages containing variables to publish. Sent less frequently than the processing of incoming frames (here, every 200 ms) + CANsendDivider-- ; + if ( CANsendDivider < 0 ) + { + CANsendDivider = CAN_SEND_RATE / CAN_DELAY ; + SendCANmessages() ; + } + delay(CAN_DELAY) ; // The delay must not be greater than the time to overflow the incoming fifo (here about 15 ms) +} + + diff --git a/STM32F1/libraries/HardwareCAN/keywords.txt b/STM32F1/libraries/HardwareCAN/keywords.txt new file mode 100644 index 000000000..6d901e314 --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/keywords.txt @@ -0,0 +1,40 @@ +####################################### +# Syntax Coloring Map For HardwareCAN +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### +HardwareCAN KEYWORD1 +CanMsg KEYWORD1 +CAN_TX_MBX KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +release KEYWORD2 CAN_Release +send KEYWORD2 CAN_Send +read KEYWORD2 CAN_Read +recv KEYWORD2 CAN_Recieve +set_pool_mode KEYWORD2 CAN_Set_Pool_Mode +set_irq_mode KEYWORD2 CAN_Set_IRQ_Mode +fifo_ready KEYWORD2 CAN_Fifo_Ready +filter KEYWORD2 CAN_Filter +free KEYWORD2 CAN_Free +available KEYWORD2 CAN_Available + +####################################### +# Constants (LITERAL1) +####################################### +CAN_GPIO_PD0_PD1 LITERAL1 +CAN_GPIO_PB8_PB9 LITERAL1 +CAN_FIFO0 LITERAL1 +CAN_FIFO1 LITERAL1 +CAN_SPEED_125 LITERAL1 +CAN_SPEED_250 LITERAL1 +CAN_SPEED_500 LITERAL1 +CAN_SPEED_1000 LITERAL1 +CAN1_BASE LITERAL1 +CAN2_BASE LITERAL1 +CAN_ID_STD LITERAL1 +CAN_RTR_DATA LITERAL1 diff --git a/STM32F1/libraries/HardwareCAN/library.properties b/STM32F1/libraries/HardwareCAN/library.properties new file mode 100644 index 000000000..9186eb6cc --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/library.properties @@ -0,0 +1,9 @@ +name=HardwareCAN +version=1.0.0 +author=Maple Leaflabs fixed by JMD +maintainer=JMD +sentence=Enables managing CAN communication using the built-in CAN port of the OLIMEX STM32 board. +paragraph=With this library you can use the built-in CAN port of the OLIMEX STM32. The library handles both standard and extended frames. +category=Communication +url= +architectures=* \ No newline at end of file diff --git a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp new file mode 100644 index 000000000..f113c4d85 --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp @@ -0,0 +1,120 @@ +/** + * @brief HardwareCAN "wiring-like" api for CAN + */ + +#include "wirish.h" +#include "utility/can.h" +#include "HardwareCAN.h" + +/** + * @brief Initialize a CAN peripheral + * @param freq frequency to run at, must one of the following values: + * - CAN_SPEED_1000 + * - CAN_SPEED_500 + * - CAN_SPEED_250 + * - CAN_SPEED_125 + */ +CAN_STATUS HardwareCAN::begin(CAN_SPEED speed, uint32 mode) +{ +/* Begin Fix JMD + if (can_init(Port, CAN_MCR_NART, CAN_SPEED_250) == CAN_OK) + // NART empêche la réémission en cas de perte d'arbitrage d'où trames perdues + */ + Serial.end(); // disable USB interface -- JMD + if (can_init(Port, 0, speed) == CAN_OK) + // End Fix JMD + return can_set_mode(Port, mode); + return can_status(); +} + +void HardwareCAN::set_pool_mode(void) +{ + return can_set_pool_mode(Port); +} + +void HardwareCAN::set_irq_mode(void) +{ + return can_set_irq_mode(Port); +} + +CAN_STATUS HardwareCAN::filter(uint8 idx, uint32 id, uint32 mask) +{ + return can_filter(Port, idx, CAN_FIFO0, CAN_FILTER_32BIT, CAN_FILTER_MASK, id, mask); +} + +CAN_STATUS HardwareCAN::status(void) +{ + return can_status(); +} + +CAN_TX_MBX HardwareCAN::send(CanMsg* message) +{ + return can_transmit(Port, message); +} + +uint8 HardwareCAN::available(void) +{ + return can_rx_available(); +} + +CanMsg* HardwareCAN::recv(void) +{ + return can_rx_queue_get(); +} + +void HardwareCAN::clear(void) +{ + can_rx_queue_clear(); +} + +void HardwareCAN::free(void) +{ + can_rx_queue_free(); +} + +void HardwareCAN::cancel(CAN_TX_MBX mbx) +{ + can_cancel(Port, mbx); +} + +/** + * @brief Initialize a CAN peripheral + */ +CAN_STATUS HardwareCAN::begin(void) +{ + return begin(CAN_SPEED_250, CAN_MODE_NORMAL); +} + +void HardwareCAN::end(void) +{ + can_deinit(Port); +} + +CanMsg* HardwareCAN::read(CAN_FIFO fifo, CanMsg* msg) +{ + return can_read(Port, fifo, msg); +} + +void HardwareCAN::release(CAN_FIFO fifo) +{ + can_rx_release(Port, fifo); +} + +/** + * @brief Initialize a CAN peripheral + */ +CAN_STATUS HardwareCAN::map(CAN_GPIO_MAP remap) +{ + return can_gpio_map(Port, remap); +} + +uint8 HardwareCAN::fifo_ready(CAN_FIFO fifo) +{ + return can_fifo_ready(Port, fifo); +} + +HardwareCAN::HardwareCAN(CAN_Port* CANx) +{ + Port = CANx; +} + diff --git a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h new file mode 100644 index 000000000..ccc318f5b --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h @@ -0,0 +1,68 @@ +/** + * @brief HardwareCAN definitions + */ + +#ifndef _HARDWARECAN_H_ +#define _HARDWARECAN_H_ + +#include "utility/can.h" +#include "usb_serial.h" + +#define PID_REQUEST 0x7DF +#define PID_REPLY 0x7E8 + +#define ENGINE_COOLANT_TEMP 0x05 +#define ENGINE_RPM 0x0C +#define VEHICLE_SPEED 0x0D +#define MAF_SENSOR 0x10 +#define O2_VOLTAGE 0x14 +#define THROTTLE 0x11 + +/** + * Defines the possible SPI communication speeds. + */ + +class HardwareCAN +{ +private: +public: + CAN_Port* Port; + HardwareCAN(CAN_Port *CANx_BASE); + CAN_STATUS begin(void); + + uint32 MSR(void) + { + return Port->MSR; + } + + uint32 RF0R(void) + { + return Port->RF0R; + } + + void set_pool_mode(void); + void set_irq_mode(void); + + CAN_STATUS begin(CAN_SPEED speed, uint32 mode); + void end(void); + + CAN_STATUS filter(uint8 idx, uint32 id, uint32 mask); + CAN_STATUS map(CAN_GPIO_MAP remap); + CAN_STATUS status(void); + + CAN_TX_MBX send(CanMsg* message); + void cancel(CAN_TX_MBX mbx); + + uint8 available(void); + + CanMsg* recv(void); + + void free(void); + void clear(void); + + uint8 fifo_ready(CAN_FIFO fifo); + CanMsg* read(CAN_FIFO fifo, CanMsg* msg); + void release(CAN_FIFO fifo); +}; + +#endif diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.c b/STM32F1/libraries/HardwareCAN/src/utility/can.c new file mode 100644 index 000000000..0120e0eed --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.c @@ -0,0 +1,543 @@ +//#include "libmaple.h" +#include "can.h" +//#include "rcc.h" +//#include "gpio.h" +//#include "nvic.h" +//#include "usb.h" + +/** + * CAN_interrupts + */ + +#define CAN_IT_RQCP0 ((uint32)0x00000005) /* Request completed mailbox 0 */ +#define CAN_IT_RQCP1 ((uint32)0x00000006) /* Request completed mailbox 1 */ +#define CAN_IT_RQCP2 ((uint32)0x00000007) /* Request completed mailbox 2 */ +#define CAN_IT_TME ((uint32)0x00000001) /* Transmit mailbox empty */ +#define CAN_IT_FMP0 ((uint32)0x00000002) /* FIFO 0 message pending */ +#define CAN_IT_FF0 ((uint32)0x00000004) /* FIFO 0 full */ +#define CAN_IT_FOV0 ((uint32)0x00000008) /* FIFO 0 overrun */ +#define CAN_IT_FMP1 ((uint32)0x00000010) /* FIFO 1 message pending */ +#define CAN_IT_FF1 ((uint32)0x00000020) /* FIFO 1 full */ +#define CAN_IT_FOV1 ((uint32)0x00000040) /* FIFO 1 overrun */ +#define CAN_IT_EWG ((uint32)0x00000100) /* Error warning */ +#define CAN_IT_EPV ((uint32)0x00000200) /* Error passive */ +#define CAN_IT_BOF ((uint32)0x00000400) /* Bus-off */ +#define CAN_IT_LEC ((uint32)0x00000800) /* Last error code */ +#define CAN_IT_ERR ((uint32)0x00008000) /* Error */ +#define CAN_IT_WKU ((uint32)0x00010000) /* Wake-up */ +#define CAN_IT_SLK ((uint32)0x00020000) /* Sleep */ + +/* Time out for INAK bit */ +#define CAN_INAK_TimeOut ((uint32)0x0000FFFF) + +/* Time out for SLAK bit */ +#define CAN_SLAK_TimeOut ((uint32)0x0000FFFF) + +#define CAN_CONTROL_MASK (CAN_MCR_TTCM | CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_NART | CAN_MCR_RFLM | CAN_MCR_TXFP) +#define CAN_TIMING_MASK (CAN_BTR_SJW | CAN_BTR_TS2 | CAN_BTR_TS1 | CAN_BTR_BRP) +#define CAN_MODE_MASK (CAN_BTR_LBKM | CAN_BTR_SILM) + +struct can_speed_info { + const uint32 btr; +}; + +#define CAN_CLOCK (36000000UL / 18UL) + +static const struct can_speed_info can_speed_table[] = { + [CAN_SPEED_125] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 125000UL - 1) + )}, + [CAN_SPEED_250] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 250000UL - 1) + )}, + [CAN_SPEED_500] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 500000UL - 1) + )}, + [CAN_SPEED_1000] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 1000000UL - 1) + )} +}; + +CAN_STATUS status; +CanMsg can_rx_queue[CAN_RX_QUEUE_SIZE]; + +uint8 can_rx_head; +uint8 can_rx_tail; +uint8 can_rx_count; +uint8 can_rx_lost; +uint8 can_active = 0; + +/** + * @brief Return last operation status + */ +CAN_STATUS can_status(void) +{ + return status; +} + +/** + * @brief Enter initialization mode + */ +CAN_STATUS can_init_enter(CAN_Port* CANx) +{ + volatile uint32 wait_ack = 0 ; + + status = CAN_OK; + if ((CANx->MSR & CAN_MSR_INAK) == 0) // Check for initialization mode already set + { + CANx->MCR |= CAN_MCR_INRQ; // Request initialisation + + wait_ack = 0; // Wait the acknowledge + while ((wait_ack != CAN_INAK_TimeOut) && ((CANx->MSR & CAN_MSR_INAK) == 0)) + wait_ack++; + if ((CANx->MSR & CAN_MSR_INAK) == 0) + status = CAN_INIT_E_FAILED; // Timeout + } + return status; +} + +/** + * @brief Leave initialization mode + */ +CAN_STATUS can_init_leave(CAN_Port* CANx) +{ + volatile uint32 wait_ack = 0 ; + + status = CAN_OK; + if ((CANx->MSR & CAN_MSR_INAK) != 0) // Check for initialization mode already reset + { + CANx->MCR &= ~CAN_MCR_INRQ; // Clear Request initialization + + wait_ack = 0; // Wait the acknowledge + while ((wait_ack != CAN_INAK_TimeOut) && ((CANx->MSR & CAN_MSR_INAK) != 0)) + wait_ack++; + if ((CANx->MSR & CAN_MSR_INAK) != 0) + status = CAN_INIT_L_FAILED; + } + return status; +} + +/** + * @brief Deinitializes the CAN peripheral registers to their default reset values. + */ +CAN_STATUS can_deinit(CAN_Port* CANx) +{ + if (CANx == CAN1_BASE) + { + nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // Disable interrupts + nvic_irq_disable(NVIC_USB_HP_CAN_TX); + rcc_reset_dev(RCC_CAN); + rcc_clk_disable(RCC_CAN); + can_active = 0; + } + return (status = CAN_OK); +} + +/** + * @brief Initialize CAN registers + */ +/* + * Bits in control parameter: + * CAN_MCR_TTCM time triggered communication mode + * CAN_MCR_ABOM automatic bus-off management + * CAN_MCR_AWUM automatic wake-up mode + * CAN_MCR_NART no automatic retransmission + * CAN_MCR_RFLM receive FIFO locked mode + * CAN_MCR_TXFP transmit FIFO priority + */ +CAN_STATUS can_init(CAN_Port* CANx, uint32 control, uint8 speed) +{ + status = CAN_INIT_FAILED; // default result status + // initialize receive message queue + can_rx_head = can_rx_tail = can_rx_count = can_rx_lost = 0; + + rcc_reset_dev(RCC_USB); //! X893 + rcc_clk_disable(RCC_USB); //! X893 +// line_dtr_rts = 0; //! X893 + rcc_clk_enable(RCC_AFIO); // enable clocks for AFIO + rcc_clk_enable(RCC_CAN); // and CAN + rcc_reset_dev(RCC_CAN); // reset CAN interface + + can_active = 1; // set CAN active flag (for interrupt handler + + CANx->MCR &= ~CAN_MCR_SLEEP; // reset CAN sleep mode (default after reset) + + if (can_init_enter(CANx) != CAN_OK) // enter CAN initialization mode + return status; // error, so return + + CANx->MCR &= ~CAN_CONTROL_MASK; // set mode bits + CANx->MCR |= (control & CAN_CONTROL_MASK); + + CANx->BTR &= ~CAN_TIMING_MASK; // Set the bit timing register + CANx->BTR |= (can_speed_table[speed].btr & CAN_TIMING_MASK); + + nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // Enable interrupts + + nvic_irq_enable(NVIC_USB_HP_CAN_TX); + + CANx->IER = (CAN_IER_FMPIE0 | CAN_IER_FMPIE1 | CAN_IER_TMEIE); + + if (can_init_leave(CANx) == CAN_OK) + { + while (!(CANx->TSR & CAN_TSR_TME0)); // Transmit mailbox 0 is empty + while (!(CANx->TSR & CAN_TSR_TME1)); // Transmit mailbox 0 is empty + while (!(CANx->TSR & CAN_TSR_TME2)); // Transmit mailbox 0 is empty + } + return status; +} + +/** + * @brief Set timing calues (CAN_BTR) + */ +CAN_STATUS can_set_timing(CAN_Port* CANx, uint32 timing) +{ + if (can_init_enter(CANx) == CAN_OK) + { + CANx->BTR = ((CANx->BTR & ~CAN_TIMING_MASK) | (timing & CAN_TIMING_MASK)); + can_init_leave(CANx); + } + return status; +} + +/** + * @brief Set CAN mode + * @param CANx pointer to CAN port + * @param mode CAN mode + */ +CAN_STATUS can_set_mode(CAN_Port* CANx, uint32 mode) +{ + if (can_init_enter(CANx) == CAN_OK) + { + CANx->BTR &= ~CAN_MODE_MASK; + CANx->BTR |= (mode & CAN_MODE_MASK); + can_init_leave(CANx); + } + return status; +} + +/** + * @brief Set CAN to GPIO mapping + */ +CAN_STATUS can_gpio_map(CAN_Port* CANx, CAN_GPIO_MAP map_mode) +{ + rcc_clk_enable(RCC_AFIO); + + status = CAN_INIT_FAILED; + if( CANx == CAN1_BASE) + { + switch(map_mode) + { + case CAN_GPIO_PB8_PB9: + rcc_clk_enable(RCC_GPIOB); + afio_remap(AFIO_MAPR_CAN_REMAP_PB8_PB9); + gpio_set_mode(GPIOB, 8, GPIO_INPUT_FLOATING); + gpio_set_mode(GPIOB, 9, GPIO_AF_OUTPUT_PP); + break; +#if NR_GPIO_PORTS >= 4 + case CAN_GPIO_PD0_PD1: + rcc_clk_enable(RCC_GPIOD); + afio_remap(AFIO_MAPR_CAN_REMAP_PD0_PD1); + gpio_set_mode(GPIOD, 0, GPIO_INPUT_FLOATING); + gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); + break; +#endif + default: + return status; + } + status = CAN_OK; + } + return status; +} + +CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2) +{ + uint32 mask = ((uint32)0x00000001) << filter_idx; + + CANx->FMR |= CAN_FMR_FINIT; // Initialization mode for the filter + CANx->FA1R &= ~mask; // Deactivation filter + + + if (scale == CAN_FILTER_32BIT) + CANx->FS1R |= mask; + else + CANx->FS1R &= ~mask; + + CANx->sFilterRegister[filter_idx].FR1 = fr1; + CANx->sFilterRegister[filter_idx].FR2 = fr2; + + if (mode == CAN_FILTER_MASK) + CANx->FM1R &= ~mask; + else + CANx->FM1R |= mask; + + if (fifo == CAN_FIFO0) + CANx->FFA1R &= ~mask; + else + CANx->FFA1R |= mask; + + CANx->FA1R |= mask; + CANx->FMR &= ~CAN_FMR_FINIT; + return CAN_OK; +} + +/** + * @brief Initiates the transmission of a message. + * @param CANx: where x can be 1 to select the CAN peripheral. + * @param msg: pointer to a structure which contains CAN Id, CAN DLC and CAN datas. + * @retval : The number of the mailbox that is used for transmission or CAN_NO_MB if there is no empty mailbox. + */ +CAN_TX_MBX can_transmit(CAN_Port* CANx, CanMsg* msg) +{ + CAN_TX_MBX mbx; + uint32 data; + + /* Select one empty transmit mailbox */ + if (CANx->TSR & CAN_TSR_TME0) + mbx = CAN_TX_MBX0; + else if (CANx->TSR & CAN_TSR_TME1) + mbx = CAN_TX_MBX1; + else if (CANx->TSR & CAN_TSR_TME2) + mbx = CAN_TX_MBX2; + else + { + status = CAN_NO_MB; + return CAN_TX_NO_MBX; + } + + /* Set up the Id */ + if (msg->IDE == CAN_ID_STD) + data = (msg->ID << 21); + else + data = (msg->ID << 3) | CAN_ID_EXT; + + data |= ((uint32)msg->RTR); + + /* Set up the DLC */ + CANx->sTxMailBox[mbx].TDTR = (uint32)(msg->DLC & 0x0F); + + /* Set up the data field */ + CANx->sTxMailBox[mbx].TDLR = ( + ((uint32)msg->Data[3] << 24) | + ((uint32)msg->Data[2] << 16) | + ((uint32)msg->Data[1] << 8) | + ((uint32)msg->Data[0]) + ); + CANx->sTxMailBox[mbx].TDHR = ( + ((uint32)msg->Data[7] << 24) | + ((uint32)msg->Data[6] << 16) | + ((uint32)msg->Data[5] << 8) | + ((uint32)msg->Data[4]) + ); + /* Request transmission */ + CANx->sTxMailBox[mbx].TIR = (data | CAN_TMIDxR_TXRQ); + status = CAN_OK; + + return mbx; +} + +/** + * Checks the transmission of a message. + * @param CANx: where x can be 1 to select the CAN peripheral. + * @param mbx: the number of the mailbox that is used for transmission. + * @retval : CAN_TX_OK if the CAN driver transmits the message, CAN_TX_FAILED in an other case. + */ +CAN_STATUS can_tx_status(CAN_Port* CANx, CAN_TX_MBX mbx) +{ + /* RQCP, TXOK and TME bits */ + uint8 state = 0; + + switch (mbx) + { + case CAN_TX_MBX0: + state |= (uint8)((CANx->TSR & CAN_TSR_RQCP0) << 2); + state |= (uint8)((CANx->TSR & CAN_TSR_TXOK0) >> 0); + state |= (uint8)((CANx->TSR & CAN_TSR_TME0) >> 26); + break; + case CAN_TX_MBX1: + state |= (uint8)((CANx->TSR & CAN_TSR_RQCP1) >> 6); + state |= (uint8)((CANx->TSR & CAN_TSR_TXOK1) >> 8); + state |= (uint8)((CANx->TSR & CAN_TSR_TME1) >> 27); + break; + case CAN_TX_MBX2: + state |= (uint8)((CANx->TSR & CAN_TSR_RQCP2) >> 14); + state |= (uint8)((CANx->TSR & CAN_TSR_TXOK2) >> 16); + state |= (uint8)((CANx->TSR & CAN_TSR_TME2) >> 28); + break; + default: + status = CAN_TX_FAILED; + return status; + } + + // state = RQCP TXOK TME + switch (state) + { + /* transmit pending */ + case 0x0: + status = CAN_TX_PENDING; + break; + /* transmit failed */ + case 0x5: + status = CAN_TX_FAILED; + break; + /* transmit succedeed */ + case 0x7: + status = CAN_OK; + break; + default: + status = CAN_TX_FAILED; + break; + } + return status; +} + +/** + * @brief Cancels a transmit request. + * @param CANx: where x can be 1 to select the CAN peripheral. + * @param mbx: Mailbox number. + * @retval : None. + */ +void can_cancel(CAN_Port* CANx, uint8 mbx) +{ + /* abort transmission */ + switch (mbx) + { + case 0: + CANx->TSR |= CAN_TSR_ABRQ0; + break; + case 1: + CANx->TSR |= CAN_TSR_ABRQ1; + break; + case 2: + CANx->TSR |= CAN_TSR_ABRQ2; + break; + default: + break; + } +} + +void can_rx_queue_clear(void) +{ + nvic_irq_disable(NVIC_USB_LP_CAN_RX0); + can_rx_head = can_rx_tail = can_rx_count = can_rx_lost = 0; + nvic_irq_enable(NVIC_USB_LP_CAN_RX0); +} + +uint8 can_rx_available(void) +{ + return can_rx_count; +} + +CanMsg* can_rx_queue_get(void) +{ + if (can_rx_count == 0) + return NULL; + return &(can_rx_queue[can_rx_tail]); +} + +void can_rx_queue_free(void) +{ + if (can_rx_count > 0) + { + nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // JMD problème d'atomicité + can_rx_tail = (can_rx_tail == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_tail + 1); + --can_rx_count; + nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // fin JMD problème d'atomicité + } +} + +CanMsg* can_read(CAN_Port* CANx, CAN_FIFO fifo, CanMsg* msg) +{ + uint32 data = CANx->sFIFOMailBox[fifo].RIR; + + /* Get the Id */ + if (data & CAN_ID_EXT) + { + msg->ID = 0x1FFFFFFF & (data >> 3); + msg->IDE = (uint8)CAN_ID_EXT; + } + else + { + msg->ID = 0x000007FF & (data >> 21); + msg->IDE = (uint8)CAN_ID_STD; + } + + msg->RTR = (uint8)(CAN_RTR_REMOTE & data); + msg->DLC = (uint8)(0x0F & CANx->sFIFOMailBox[fifo].RDTR); + msg->FMI = (uint8)(0xFF & (CANx->sFIFOMailBox[fifo].RDTR >> 8)); + + /* Get the data field */ + data = CANx->sFIFOMailBox[fifo].RDLR; + uint8* p = msg->Data; + *p++ = (uint8)0xFF & data; + *p++ = (uint8)0xFF & (data >> 8); + *p++ = (uint8)0xFF & (data >> 16); + *p++ = (uint8)0xFF & (data >> 24); + + data = CANx->sFIFOMailBox[fifo].RDHR; + *p++ = (uint8)0xFF & data; + *p++ = (uint8)0xFF & (data >> 8); + *p++ = (uint8)0xFF & (data >> 16); + *p++ = (uint8)0xFF & (data >> 24); + + return msg; +} + +void can_rx_release(CAN_Port* CANx, CAN_FIFO fifo) +{ + if (fifo == CAN_FIFO0) + CANx->RF0R |= (CAN_RF0R_RFOM0); // Release FIFO0 + else + CANx->RF1R |= (CAN_RF1R_RFOM1); // Release FIFO1 +} + +void can_rx_read(CAN_Port* CANx, CAN_FIFO fifo) +{ + if (can_rx_count < CAN_RX_QUEUE_SIZE) // read the message + { + CanMsg* msg = &can_rx_queue[can_rx_head]; + can_read(CANx, fifo, msg); + can_rx_head = (can_rx_head == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_head + 1); + can_rx_count++; + } + else + can_rx_lost = 1; // no place in queue, ignore package + + can_rx_release(CANx, fifo); +} + +uint8 CAN_RX0_IRQ_Handler(void) +{ + if (can_active) + { + while ((CAN1_BASE->RF0R & CAN_RF0R_FMP0) != 0) + can_rx_read(CAN1_BASE, CAN_FIFO0); // message pending FIFO0 + while ((CAN1_BASE->RF1R & CAN_RF1R_FMP1) != 0) + can_rx_read(CAN1_BASE, CAN_FIFO1); // message pending FIFO1 + } + return can_active; // return CAN active flag to USB handler +} + +void USB_HP_CAN_TX_IRQHandler (void) +{ + if (can_active) + { + if (CAN1_BASE->TSR & CAN_TSR_RQCP0) + CAN1_BASE->TSR |= CAN_TSR_RQCP0; // reset request complete mbx 0 + if (CAN1_BASE->TSR & CAN_TSR_RQCP1) + CAN1_BASE->TSR |= CAN_TSR_RQCP1; // reset request complete mbx 1 + if (CAN1_BASE->TSR & CAN_TSR_RQCP2) + CAN1_BASE->TSR |= CAN_TSR_RQCP2; // reset request complete mbx 2 + } +} diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.h b/STM32F1/libraries/HardwareCAN/src/utility/can.h new file mode 100644 index 000000000..576ac36fe --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.h @@ -0,0 +1,322 @@ +#ifndef _CAN_H_ +#define _CAN_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +//#include "libmaple_types.h" +#include +#include +#include "libmaple/nvic.h" +#include +//#include "types.h" +#include "libmaple/usb.h" + +#ifndef CAN_RX_QUEUE_SIZE + #define CAN_RX_QUEUE_SIZE 16 +#endif + +/* peripheral addresses */ +#define CAN1_BASE ((CAN_Port*)0x40006400) +#define CAN2_BASE ((CAN_Port*)0x40006800) + + +/* CAN Master Control Register bits */ +#define CAN_MCR_INRQ ((uint32)0x00000001) /* Initialization request */ +#define CAN_MCR_SLEEP ((uint32)0x00000002) /* Sleep mode request */ +#define CAN_MCR_TXFP ((uint32)0x00000004) /* Transmit FIFO priority */ +#define CAN_MCR_RFLM ((uint32)0x00000008) /* Receive FIFO locked mode */ +#define CAN_MCR_NART ((uint32)0x00000010) /* No automatic retransmission */ +#define CAN_MCR_AWUM ((uint32)0x00000020) /* Automatic wake up mode */ +#define CAN_MCR_ABOM ((uint32)0x00000040) /* Automatic bus-off management */ +#define CAN_MCR_TTCM ((uint32)0x00000080) /* Time triggered communication mode */ +#define CAN_MCR_RESET ((uint32)0x00008000) /* bxCAN software master reset */ +#define CAN_MCR_DBF ((uint32)0x00010000) /* Debug freeze */ + +/* CAN Master Status Register bits */ +#define CAN_MSR_INAK ((uint32)0x00000001) /* Initialization acknowledge */ +#define CAN_MSR_SLAK ((uint32)0x00000002) /* Sleep acknowledge */ +#define CAN_MSR_ERRI ((uint32)0x00000004) /* Error interrupt */ +#define CAN_MSR_WKUI ((uint32)0x00000008) /* Wake-up interrupt */ +#define CAN_MSR_SLAKI ((uint32)0x00000010) /* Sleep acknowledge interrupt */ +#define CAN_MSR_TXM ((uint32)0x00000100) /* Transmit mode */ +#define CAN_MSR_RXM ((uint32)0x00000200) /* Receive mode */ +#define CAN_MSR_SAMP ((uint32)0x00000400) /* Last sample point */ +#define CAN_MSR_RX ((uint32)0x00000800) /* CAN Rx signal */ + +/* CAN Transmit Status Register bits */ +#define CAN_TSR_RQCP0 ((uint32)0x00000001) /* Request completed mailbox0 */ +#define CAN_TSR_TXOK0 ((uint32)0x00000002) /* Transmission OK of mailbox0 */ +#define CAN_TSR_ALST0 ((uint32)0x00000004) /* Arbitration Lost for Mailbox0 */ +#define CAN_TSR_TERR0 ((uint32)0x00000008) /* Transmission Error of Mailbox0 */ +#define CAN_TSR_ABRQ0 ((uint32)0x00000080) /* Abort request for mailbox0 */ +#define CAN_TSR_RQCP1 ((uint32)0x00000100) /* Request completed mailbox1 */ +#define CAN_TSR_TXOK1 ((uint32)0x00000200) /* Transmission OK of mailbox1 */ +#define CAN_TSR_ALST1 ((uint32)0x00000400) /* Arbitration Lost for Mailbox1 */ +#define CAN_TSR_TERR1 ((uint32)0x00000800) /* Transmission Error of Mailbox1 */ +#define CAN_TSR_ABRQ1 ((uint32)0x00008000) /* Abort request for mailbox1 */ +#define CAN_TSR_RQCP2 ((uint32)0x00010000) /* Request completed mailbox2 */ +#define CAN_TSR_TXOK2 ((uint32)0x00020000) /* Transmission OK of mailbox2 */ +#define CAN_TSR_ALST2 ((uint32)0x00040000) /* Arbitration Lost for mailbox 2 */ +#define CAN_TSR_TERR2 ((uint32)0x00080000) /* Transmission Error of Mailbox 2 */ +#define CAN_TSR_ABRQ2 ((uint32)0x00800000) /* Abort request for mailbox2 */ +#define CAN_TSR_CODE ((uint32)0x03000000) /* Mailbox Code */ +#define CAN_TSR_TME ((uint32)0x1C000000) /* TME[2:0] bits */ +#define CAN_TSR_TME0 ((uint32)0x04000000) /* Transmit mailbox 0 empty */ +#define CAN_TSR_TME1 ((uint32)0x08000000) /* Transmit mailbox 1 empty */ +#define CAN_TSR_TME2 ((uint32)0x10000000) /* Transmit mailbox 2 empty */ +#define CAN_TSR_LOW ((uint32)0xE0000000) /* LOW[2:0] bits */ +#define CAN_TSR_LOW0 ((uint32)0x20000000) /* Lowest Priority Flag for Mailbox 0 */ +#define CAN_TSR_LOW1 ((uint32)0x40000000) /* Lowest Priority Flag for Mailbox 1 */ +#define CAN_TSR_LOW2 ((uint32)0x80000000) /* Lowest Priority Flag for Mailbox 2 */ + +/* CAN Receive FIFO 0 Register bits */ +#define CAN_RF0R_FMP0 ((uint32)0x00000003) /* FIFO 0 message pending */ +#define CAN_RF0R_FULL0 ((uint32)0x00000008) /* FIFO 0 full */ +#define CAN_RF0R_FOVR0 ((uint32)0x00000010) /* FIFO 0 overrun */ +#define CAN_RF0R_RFOM0 ((uint32)0x00000020) /* Release FIFO 0 output mailbox */ + +/* CAN Receive FIFO 1 Register bits */ +#define CAN_RF1R_FMP1 ((uint32)0x00000003) /* FIFO 1 message pending */ +#define CAN_RF1R_FULL1 ((uint32)0x00000008) /* FIFO 1 full */ +#define CAN_RF1R_FOVR1 ((uint32)0x00000010) /* FIFO 1 overrun */ +#define CAN_RF1R_RFOM1 ((uint32)0x00000020) /* Release FIFO 1 output mailbox */ + +/* CAN Error Status Register bits */ +#define CAN_ESR_EWGF ((uint32)0x00000001) /* Error warning flag */ +#define CAN_ESR_EPVF ((uint32)0x00000002) /* Error passive flag */ +#define CAN_ESR_BOFF ((uint32)0x00000004) /* Bus-off flag */ + +/* CAN interrupt enable register (CAN_IER) */ +#define CAN_IER_TMEIE ((uint32)0x00000001) /* Transmit Mailbox Empty Interrupt Enable */ +#define CAN_IER_FMPIE0 ((uint32)0x00000002) /* FIFO Message Pending Interrupt Enable */ +#define CAN_IER_FFIE0 ((uint32)0x00000004) /* FIFO Full Interrupt Enable */ +#define CAN_IER_FOVIE0 ((uint32)0x00000008) /* FIFO Overrun Interrupt Enable */ +#define CAN_IER_FMPIE1 ((uint32)0x00000010) /* FIFO Message Pending Interrupt Enable */ +#define CAN_IER_FFIE1 ((uint32)0x00000020) /* FIFO Full Interrupt Enable */ +#define CAN_IER_FOVIE1 ((uint32)0x00000040) /* FIFO Overrun Interrupt Enable */ +#define CAN_IER_EWGIE ((uint32)0x00000100) /* Error Warning Interrupt Enable */ +#define CAN_IER_EPVIE ((uint32)0x00000200) /* Error Passive Interrupt Enable */ +#define CAN_IER_BOFIE ((uint32)0x00000400) /* Bus-Off Interrupt Enable */ +#define CAN_IER_LECIE ((uint32)0x00000800) /* Last Error Code Interrupt Enable */ +#define CAN_IER_ERRIE ((uint32)0x00008000) /* Error Interrupt Enable */ +#define CAN_IER_WKUIE ((uint32)0x00010000) /* Wakeup Interrupt Enable */ +#define CAN_IER_SLKIE ((uint32)0x00020000) /* Sleep Interrupt Enable */ + +/* CAN error status register (CAN_ESR) */ +#define CAN_ESR_EWGF ((uint32)0x00000001) /* Error Warning Flag */ +#define CAN_ESR_EPVF ((uint32)0x00000002) /* Error Passive Flag */ +#define CAN_ESR_BOFF ((uint32)0x00000004) /* Bus-Off Flag */ + +#define CAN_ESR_LEC ((uint32)0x00000070) /* LEC[2:0] bits (Last Error Code) */ +#define CAN_ESR_LEC_0 ((uint32)0x00000010) /* Bit 0 */ +#define CAN_ESR_LEC_1 ((uint32)0x00000020) /* Bit 1 */ +#define CAN_ESR_LEC_2 ((uint32)0x00000040) /* Bit 2 */ + +#define CAN_ESR_TEC ((uint32)0x00FF0000) /* Least significant byte of the 9-bit Transmit Error Counter */ +#define CAN_ESR_REC ((uint32)0xFF000000) /* Receive Error Counter */ + +/* CAN bit timing register (CAN_BTR) */ +#define CAN_BTR_SJW_POS 24 +#define CAN_BTR_TS2_POS 20 +#define CAN_BTR_TS1_POS 16 + +#define CAN_BTR_BRP ((uint32)0x000003FF) /* Baud Rate Prescaler */ +#define CAN_BTR_TS1 ((uint32)0x000F0000) /* Time Segment 1 */ +#define CAN_BTR_TS2 ((uint32)0x00700000) /* Time Segment 2 */ +#define CAN_BTR_SJW ((uint32)0x03000000) /* Resynchronization Jump Width */ +#define CAN_BTR_LBKM ((uint32)0x40000000) /* Loop Back Mode (Debug) */ +#define CAN_BTR_SILM ((uint32)0x80000000) /* Silent Mode */ + + +/* CAN Mailbox Transmit Request */ +#define CAN_TMIDxR_TXRQ ((uint32)0x00000001) /* Transmit mailbox request */ + +/* CAN Filter Master Register bits */ +#define CAN_FMR_FINIT ((uint32)0x00000001) /* Filter init mode */ + + +typedef enum CAN_GPIO_MAP { + CAN_GPIO_PB8_PB9, /* RX to PB8, TX to PB9 */ + CAN_GPIO_PD0_PD1 /* RX to PD0, TX to PD1 */ +} CAN_GPIO_MAP; + +typedef enum CAN_STATUS +{ + CAN_OK = 0, + CAN_INIT_FAILED, + CAN_INIT_E_FAILED, + CAN_INIT_L_FAILED, + CAN_TX_FAILED, + CAN_TX_PENDING, + CAN_NO_MB, + CAN_FILTER_FULL +} CAN_STATUS; + +typedef enum CAN_TX_MBX +{ + CAN_TX_MBX0 = 0, + CAN_TX_MBX1 = 1, + CAN_TX_MBX2 = 2, + CAN_TX_NO_MBX = CAN_NO_MB +} CAN_TX_MBX; + +#define CAN_MODE_NORMAL ((uint32)0x0) /* normal mode */ +#define CAN_MODE_LOOPBACK (CAN_BTR_LBKM) /* loopback mode */ +#define CAN_MODE_SILENT (CAN_BTR_SILM) /* silent mode */ +#define CAN_MODE_SILENT_LOOPBACK (CAN_BTR_LBKM | CAN_BTR_SILM) /* loopback combined with silent mode */ + +enum CAN_SPEED { + CAN_SPEED_125, + CAN_SPEED_250, + CAN_SPEED_500, + CAN_SPEED_1000, +}; + +/** + * CAN_identifier_type + */ +#define CAN_ID_STD ((uint32)0x00) /* Standard Id */ +#define CAN_ID_EXT ((uint32)0x04) /* Extended Id */ + +/** + * CAN_remote_transmission_request + */ +#define CAN_RTR_DATA ((uint32)0x00) /* Data frame */ +#define CAN_RTR_REMOTE ((uint32)0x02) /* Remote frame */ + +/** + * CAN_receive_FIFO_number_constants + */ +typedef enum { + CAN_FIFO0 = 0, + CAN_FIFO1 = 1 +} CAN_FIFO; + +typedef enum { + CAN_FILTER_32BIT = 0, + CAN_FILTER_16BIT = 1 +} CAN_FILTER_SCALE; + +typedef enum { + CAN_FILTER_MASK = 0, + CAN_FILTER_LIST = 1 +} CAN_FILTER_MODE; +/** + * @brief Controller Area Network TxMailBox + */ +typedef struct +{ + volatile uint32 TIR; + volatile uint32 TDTR; + volatile uint32 TDLR; + volatile uint32 TDHR; +} CAN_TxMailBox_Port; + +/** + * @brief Controller Area Network FIFOMailBox + */ +typedef struct +{ + volatile uint32 RIR; + volatile uint32 RDTR; + volatile uint32 RDLR; + volatile uint32 RDHR; +} CAN_FIFOMailBox_Port; + +/** + * @brief Controller Area Network FilterRegister + */ +typedef struct +{ + volatile uint32 FR1; + volatile uint32 FR2; +} CAN_FilterRegister_Port; + +typedef struct { + volatile uint32 MCR; // CAN master control register (CAN_MCR) + volatile uint32 MSR; // CAN master status register (CAN_MSR) + volatile uint32 TSR; // CAN transmit status register (CAN_TSR) + volatile uint32 RF0R; // CAN receive FIFO 0 register (CAN_RF0R) + volatile uint32 RF1R; // CAN receive FIFO 1 register (CAN_RF1R) + volatile uint32 IER; + volatile uint32 ESR; + volatile uint32 BTR; + uint32 RESERVED0[88]; + CAN_TxMailBox_Port sTxMailBox[3]; + CAN_FIFOMailBox_Port sFIFOMailBox[2]; + uint32 RESERVED1[12]; + volatile uint32 FMR; + volatile uint32 FM1R; + uint32 RESERVED2; + volatile uint32 FS1R; + uint32 RESERVED3; + volatile uint32 FFA1R; + uint32 RESERVED4; + volatile uint32 FA1R; + uint32 RESERVED5[8]; + CAN_FilterRegister_Port sFilterRegister[14]; +} CAN_Port; + +/** + * @brief CAN Tx message structure definition + */ +typedef struct +{ + uint32 ID; // CAN ID + uint8 IDE; // CAN_ID_STD for standard and CAN_ID_EXT for extended + uint8 RTR; + uint8 DLC; + uint8 Data[8]; + uint8 FMI; +} CanMsg; + +/* Functions */ +CAN_STATUS can_init_enter(CAN_Port* CANx); +CAN_STATUS can_init_leave(CAN_Port* CANx); +CAN_STATUS can_init(CAN_Port *CANx, uint32 mode, uint8 speed); +CAN_STATUS can_deinit(CAN_Port* CANx); +CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo_number, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2); +CAN_STATUS can_set_timing(CAN_Port* CANx, uint32 timing); +CAN_STATUS can_set_mode(CAN_Port* CANx, uint32 mode); +CAN_STATUS can_gpio_map(CAN_Port* CANx, CAN_GPIO_MAP map_mode); +CAN_STATUS can_status(void); +void can_cancel(CAN_Port* CANx, uint8 mbx); +void can_rx_queue_clear(void); +uint8 can_rx_available(void); +CanMsg* can_rx_queue_get(void); +CanMsg* can_read(CAN_Port* CANx, CAN_FIFO fifo, CanMsg* msg); +void can_rx_release(CAN_Port* CANx, CAN_FIFO fifo); +void can_rx_queue_free(void); +CAN_TX_MBX can_transmit(CAN_Port* CANx, CanMsg* msg); +CAN_STATUS can_tx_status(CAN_Port* CANx, CAN_TX_MBX mbx); + +/** + * @brief Set pooling mode + */ +static inline void can_set_pool_mode(CAN_Port* CANx) +{ + CANx->IER &= ~(CAN_IER_FMPIE0 | CAN_IER_FMPIE1); +} + +/** + * @brief Set interrupt mode + */ +static inline void can_set_irq_mode(CAN_Port* CANx) +{ + CANx->IER |= (CAN_IER_FMPIE0 | CAN_IER_FMPIE1); +} + +static inline uint8 can_fifo_ready(CAN_Port* CANx, CAN_FIFO fifo) +{ + if (fifo == CAN_FIFO0) + return (uint8)(CANx->RF0R & CAN_RF0R_FMP0); + return (uint8)(CANx->RF1R & CAN_RF1R_FMP1); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/STM32F1/libraries/rcc.h b/STM32F1/libraries/rcc.h new file mode 100644 index 000000000..aa9f8d3c9 --- /dev/null +++ b/STM32F1/libraries/rcc.h @@ -0,0 +1,641 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file libmaple/stm32f1/include/series/rcc.h + * @brief STM32F1 reset and clock control (RCC) support. + */ + +#ifndef _LIBMAPLE_STM32F1_RCC_H_ +#define _LIBMAPLE_STM32F1_RCC_H_ + +#ifdef __cplusplus +extern "C"{ +#endif + +#include +#include + +/* + * Register map + */ + +/** STM32F1 RCC register map type */ +typedef struct rcc_reg_map { + __io uint32 CR; /**< Clock control register */ + __io uint32 CFGR; /**< Clock configuration register */ + __io uint32 CIR; /**< Clock interrupt register */ + __io uint32 APB2RSTR; /**< APB2 peripheral reset register */ + __io uint32 APB1RSTR; /**< APB1 peripheral reset register */ + __io uint32 AHBENR; /**< AHB peripheral clock enable register */ + __io uint32 APB2ENR; /**< APB2 peripheral clock enable register */ + __io uint32 APB1ENR; /**< APB1 peripheral clock enable register */ + __io uint32 BDCR; /**< Backup domain control register */ + __io uint32 CSR; /**< Control/status register */ +} rcc_reg_map; + +#define RCC_BASE ((struct rcc_reg_map*)0x40021000) + +/* + * Register bit definitions + */ + +/* Clock control register */ + +#define RCC_CR_PLLRDY_BIT 25 +#define RCC_CR_PLLON_BIT 24 +#define RCC_CR_CSSON_BIT 19 +#define RCC_CR_HSEBYP_BIT 18 +#define RCC_CR_HSERDY_BIT 17 +#define RCC_CR_HSEON_BIT 16 +#define RCC_CR_HSIRDY_BIT 1 +#define RCC_CR_HSION_BIT 0 + +#define RCC_CR_PLLRDY (1U << RCC_CR_PLLRDY_BIT) +#define RCC_CR_PLLON (1U << RCC_CR_PLLON_BIT) +#define RCC_CR_CSSON (1U << RCC_CR_CSSON_BIT) +#define RCC_CR_HSEBYP (1U << RCC_CR_HSEBYP_BIT) +#define RCC_CR_HSERDY (1U << RCC_CR_HSERDY_BIT) +#define RCC_CR_HSEON (1U << RCC_CR_HSEON_BIT) +#define RCC_CR_HSICAL (0xFF << 8) +#define RCC_CR_HSITRIM (0x1F << 3) +#define RCC_CR_HSIRDY (1U << RCC_CR_HSIRDY_BIT) +#define RCC_CR_HSION (1U << RCC_CR_HSION_BIT) + +/* Clock configuration register */ + +#define RCC_CFGR_USBPRE_BIT 22 +#define RCC_CFGR_PLLXTPRE_BIT 17 +#define RCC_CFGR_PLLSRC_BIT 16 + +#define RCC_CFGR_MCO (0x3 << 24) +#define RCC_CFGR_USBPRE (0x3 << RCC_CFGR_USBPRE_BIT) +#define RCC_CFGR_PLLMUL (0xF << 18) +#define RCC_CFGR_PLLXTPRE (1U << RCC_CFGR_PLLXTPRE_BIT) +#define RCC_CFGR_PLLSRC (1U << RCC_CFGR_PLLSRC_BIT) +#define RCC_CFGR_ADCPRE (0x3 << 14) +#define RCC_CFGR_PPRE2 (0x7 << 11) +#define RCC_CFGR_PPRE1 (0x7 << 8) +#define RCC_CFGR_HPRE (0xF << 4) +#define RCC_CFGR_SWS (0x3 << 2) +#define RCC_CFGR_SWS_PLL (0x2 << 2) +#define RCC_CFGR_SWS_HSE (0x1 << 2) +#define RCC_CFGR_SW 0x3 +#define RCC_CFGR_SW_PLL 0x2 +#define RCC_CFGR_SW_HSE 0x1 + +/* Clock interrupt register */ + +#define RCC_CIR_CSSC_BIT 23 +#define RCC_CIR_PLLRDYC_BIT 20 +#define RCC_CIR_HSERDYC_BIT 19 +#define RCC_CIR_HSIRDYC_BIT 18 +#define RCC_CIR_LSERDYC_BIT 17 +#define RCC_CIR_LSIRDYC_BIT 16 +#define RCC_CIR_PLLRDYIE_BIT 12 +#define RCC_CIR_HSERDYIE_BIT 11 +#define RCC_CIR_HSIRDYIE_BIT 10 +#define RCC_CIR_LSERDYIE_BIT 9 +#define RCC_CIR_LSIRDYIE_BIT 8 +#define RCC_CIR_CSSF_BIT 7 +#define RCC_CIR_PLLRDYF_BIT 4 +#define RCC_CIR_HSERDYF_BIT 3 +#define RCC_CIR_HSIRDYF_BIT 2 +#define RCC_CIR_LSERDYF_BIT 1 +#define RCC_CIR_LSIRDYF_BIT 0 + +#define RCC_CIR_CSSC (1U << RCC_CIR_CSSC_BIT) +#define RCC_CIR_PLLRDYC (1U << RCC_CIR_PLLRDYC_BIT) +#define RCC_CIR_HSERDYC (1U << RCC_CIR_HSERDYC_BIT) +#define RCC_CIR_HSIRDYC (1U << RCC_CIR_HSIRDYC_BIT) +#define RCC_CIR_LSERDYC (1U << RCC_CIR_LSERDYC_BIT) +#define RCC_CIR_LSIRDYC (1U << RCC_CIR_LSIRDYC_BIT) +#define RCC_CIR_PLLRDYIE (1U << RCC_CIR_PLLRDYIE_BIT) +#define RCC_CIR_HSERDYIE (1U << RCC_CIR_HSERDYIE_BIT) +#define RCC_CIR_HSIRDYIE (1U << RCC_CIR_HSIRDYIE_BIT) +#define RCC_CIR_LSERDYIE (1U << RCC_CIR_LSERDYIE_BIT) +#define RCC_CIR_LSIRDYIE (1U << RCC_CIR_LSIRDYIE_BIT) +#define RCC_CIR_CSSF (1U << RCC_CIR_CSSF_BIT) +#define RCC_CIR_PLLRDYF (1U << RCC_CIR_PLLRDYF_BIT) +#define RCC_CIR_HSERDYF (1U << RCC_CIR_HSERDYF_BIT) +#define RCC_CIR_HSIRDYF (1U << RCC_CIR_HSIRDYF_BIT) +#define RCC_CIR_LSERDYF (1U << RCC_CIR_LSERDYF_BIT) +#define RCC_CIR_LSIRDYF (1U << RCC_CIR_LSIRDYF_BIT) + +/* APB2 peripheral reset register */ + +#define RCC_APB2RSTR_TIM11RST_BIT 21 +#define RCC_APB2RSTR_TIM10RST_BIT 20 +#define RCC_APB2RSTR_TIM9RST_BIT 19 +#define RCC_APB2RSTR_ADC3RST_BIT 15 +#define RCC_APB2RSTR_USART1RST_BIT 14 +#define RCC_APB2RSTR_TIM8RST_BIT 13 +#define RCC_APB2RSTR_SPI1RST_BIT 12 +#define RCC_APB2RSTR_TIM1RST_BIT 11 +#define RCC_APB2RSTR_ADC2RST_BIT 10 +#define RCC_APB2RSTR_ADC1RST_BIT 9 +#define RCC_APB2RSTR_IOPGRST_BIT 8 +#define RCC_APB2RSTR_IOPFRST_BIT 7 +#define RCC_APB2RSTR_IOPERST_BIT 6 +#define RCC_APB2RSTR_IOPDRST_BIT 5 +#define RCC_APB2RSTR_IOPCRST_BIT 4 +#define RCC_APB2RSTR_IOPBRST_BIT 3 +#define RCC_APB2RSTR_IOPARST_BIT 2 +#define RCC_APB2RSTR_AFIORST_BIT 0 + +#define RCC_APB2RSTR_TIM11RST (1U << RCC_APB2RSTR_TIM11RST_BIT) +#define RCC_APB2RSTR_TIM10RST (1U << RCC_APB2RSTR_TIM10RST_BIT) +#define RCC_APB2RSTR_TIM9RST (1U << RCC_APB2RSTR_TIM9RST_BIT) +#define RCC_APB2RSTR_ADC3RST (1U << RCC_APB2RSTR_ADC3RST_BIT) +#define RCC_APB2RSTR_USART1RST (1U << RCC_APB2RSTR_USART1RST_BIT) +#define RCC_APB2RSTR_TIM8RST (1U << RCC_APB2RSTR_TIM8RST_BIT) +#define RCC_APB2RSTR_SPI1RST (1U << RCC_APB2RSTR_SPI1RST_BIT) +#define RCC_APB2RSTR_TIM1RST (1U << RCC_APB2RSTR_TIM1RST_BIT) +#define RCC_APB2RSTR_ADC2RST (1U << RCC_APB2RSTR_ADC2RST_BIT) +#define RCC_APB2RSTR_ADC1RST (1U << RCC_APB2RSTR_ADC1RST_BIT) +#define RCC_APB2RSTR_IOPGRST (1U << RCC_APB2RSTR_IOPGRST_BIT) +#define RCC_APB2RSTR_IOPFRST (1U << RCC_APB2RSTR_IOPFRST_BIT) +#define RCC_APB2RSTR_IOPERST (1U << RCC_APB2RSTR_IOPERST_BIT) +#define RCC_APB2RSTR_IOPDRST (1U << RCC_APB2RSTR_IOPDRST_BIT) +#define RCC_APB2RSTR_IOPCRST (1U << RCC_APB2RSTR_IOPCRST_BIT) +#define RCC_APB2RSTR_IOPBRST (1U << RCC_APB2RSTR_IOPBRST_BIT) +#define RCC_APB2RSTR_IOPARST (1U << RCC_APB2RSTR_IOPARST_BIT) +#define RCC_APB2RSTR_AFIORST (1U << RCC_APB2RSTR_AFIORST_BIT) + +/* APB1 peripheral reset register */ + +#define RCC_APB1RSTR_DACRST_BIT 29 +#define RCC_APB1RSTR_PWRRST_BIT 28 +#define RCC_APB1RSTR_BKPRST_BIT 27 +#define RCC_APB1RSTR_CANRST_BIT 25 +#define RCC_APB1RSTR_USBRST_BIT 23 +#define RCC_APB1RSTR_I2C2RST_BIT 22 +#define RCC_APB1RSTR_I2C1RST_BIT 21 +#define RCC_APB1RSTR_UART5RST_BIT 20 +#define RCC_APB1RSTR_UART4RST_BIT 19 +#define RCC_APB1RSTR_USART3RST_BIT 18 +#define RCC_APB1RSTR_USART2RST_BIT 17 +#define RCC_APB1RSTR_SPI3RST_BIT 15 +#define RCC_APB1RSTR_SPI2RST_BIT 14 +#define RCC_APB1RSTR_WWDRST_BIT 11 +#define RCC_APB1RSTR_TIM14RST_BIT 8 +#define RCC_APB1RSTR_TIM13RST_BIT 7 +#define RCC_APB1RSTR_TIM12RST_BIT 6 +#define RCC_APB1RSTR_TIM7RST_BIT 5 +#define RCC_APB1RSTR_TIM6RST_BIT 4 +#define RCC_APB1RSTR_TIM5RST_BIT 3 +#define RCC_APB1RSTR_TIM4RST_BIT 2 +#define RCC_APB1RSTR_TIM3RST_BIT 1 +#define RCC_APB1RSTR_TIM2RST_BIT 0 + +#define RCC_APB1RSTR_DACRST (1U << RCC_APB1RSTR_DACRST_BIT) +#define RCC_APB1RSTR_PWRRST (1U << RCC_APB1RSTR_PWRRST_BIT) +#define RCC_APB1RSTR_BKPRST (1U << RCC_APB1RSTR_BKPRST_BIT) +#define RCC_APB1RSTR_CANRST (1U << RCC_APB1RSTR_CANRST_BIT) +#define RCC_APB1RSTR_USBRST (1U << RCC_APB1RSTR_USBRST_BIT) +#define RCC_APB1RSTR_I2C2RST (1U << RCC_APB1RSTR_I2C2RST_BIT) +#define RCC_APB1RSTR_I2C1RST (1U << RCC_APB1RSTR_I2C1RST_BIT) +#define RCC_APB1RSTR_UART5RST (1U << RCC_APB1RSTR_UART5RST_BIT) +#define RCC_APB1RSTR_UART4RST (1U << RCC_APB1RSTR_UART4RST_BIT) +#define RCC_APB1RSTR_USART3RST (1U << RCC_APB1RSTR_USART3RST_BIT) +#define RCC_APB1RSTR_USART2RST (1U << RCC_APB1RSTR_USART2RST_BIT) +#define RCC_APB1RSTR_SPI3RST (1U << RCC_APB1RSTR_SPI3RST_BIT) +#define RCC_APB1RSTR_SPI2RST (1U << RCC_APB1RSTR_SPI2RST_BIT) +#define RCC_APB1RSTR_WWDRST (1U << RCC_APB1RSTR_WWDRST_BIT) +#define RCC_APB1RSTR_TIM14RST (1U << RCC_APB1RSTR_TIM14RST_BIT) +#define RCC_APB1RSTR_TIM13RST (1U << RCC_APB1RSTR_TIM13RST_BIT) +#define RCC_APB1RSTR_TIM12RST (1U << RCC_APB1RSTR_TIM12RST_BIT) +#define RCC_APB1RSTR_TIM7RST (1U << RCC_APB1RSTR_TIM7RST_BIT) +#define RCC_APB1RSTR_TIM6RST (1U << RCC_APB1RSTR_TIM6RST_BIT) +#define RCC_APB1RSTR_TIM5RST (1U << RCC_APB1RSTR_TIM5RST_BIT) +#define RCC_APB1RSTR_TIM4RST (1U << RCC_APB1RSTR_TIM4RST_BIT) +#define RCC_APB1RSTR_TIM3RST (1U << RCC_APB1RSTR_TIM3RST_BIT) +#define RCC_APB1RSTR_TIM2RST (1U << RCC_APB1RSTR_TIM2RST_BIT) + +/* AHB peripheral clock enable register */ + +#define RCC_AHBENR_SDIOEN_BIT 10 +#define RCC_AHBENR_FSMCEN_BIT 8 +#define RCC_AHBENR_CRCEN_BIT 7 +#define RCC_AHBENR_FLITFEN_BIT 4 +#define RCC_AHBENR_SRAMEN_BIT 2 +#define RCC_AHBENR_DMA2EN_BIT 1 +#define RCC_AHBENR_DMA1EN_BIT 0 + +#define RCC_AHBENR_SDIOEN (1U << RCC_AHBENR_SDIOEN_BIT) +#define RCC_AHBENR_FSMCEN (1U << RCC_AHBENR_FSMCEN_BIT) +#define RCC_AHBENR_CRCEN (1U << RCC_AHBENR_CRCEN_BIT) +#define RCC_AHBENR_FLITFEN (1U << RCC_AHBENR_FLITFEN_BIT) +#define RCC_AHBENR_SRAMEN (1U << RCC_AHBENR_SRAMEN_BIT) +#define RCC_AHBENR_DMA2EN (1U << RCC_AHBENR_DMA2EN_BIT) +#define RCC_AHBENR_DMA1EN (1U << RCC_AHBENR_DMA1EN_BIT) + +/* APB2 peripheral clock enable register */ + +#define RCC_APB2ENR_TIM11EN_BIT 21 +#define RCC_APB2ENR_TIM10EN_BIT 20 +#define RCC_APB2ENR_TIM9EN_BIT 19 +#define RCC_APB2ENR_ADC3EN_BIT 15 +#define RCC_APB2ENR_USART1EN_BIT 14 +#define RCC_APB2ENR_TIM8EN_BIT 13 +#define RCC_APB2ENR_SPI1EN_BIT 12 +#define RCC_APB2ENR_TIM1EN_BIT 11 +#define RCC_APB2ENR_ADC2EN_BIT 10 +#define RCC_APB2ENR_ADC1EN_BIT 9 +#define RCC_APB2ENR_IOPGEN_BIT 8 +#define RCC_APB2ENR_IOPFEN_BIT 7 +#define RCC_APB2ENR_IOPEEN_BIT 6 +#define RCC_APB2ENR_IOPDEN_BIT 5 +#define RCC_APB2ENR_IOPCEN_BIT 4 +#define RCC_APB2ENR_IOPBEN_BIT 3 +#define RCC_APB2ENR_IOPAEN_BIT 2 +#define RCC_APB2ENR_AFIOEN_BIT 0 + +#define RCC_APB2ENR_TIM11EN (1U << RCC_APB2ENR_TIM11EN_BIT) +#define RCC_APB2ENR_TIM10EN (1U << RCC_APB2ENR_TIM10EN_BIT) +#define RCC_APB2ENR_TIM9EN (1U << RCC_APB2ENR_TIM9EN_BIT) +#define RCC_APB2ENR_ADC3EN (1U << RCC_APB2ENR_ADC3EN_BIT) +#define RCC_APB2ENR_USART1EN (1U << RCC_APB2ENR_USART1EN_BIT) +#define RCC_APB2ENR_TIM8EN (1U << RCC_APB2ENR_TIM8EN_BIT) +#define RCC_APB2ENR_SPI1EN (1U << RCC_APB2ENR_SPI1EN_BIT) +#define RCC_APB2ENR_TIM1EN (1U << RCC_APB2ENR_TIM1EN_BIT) +#define RCC_APB2ENR_ADC2EN (1U << RCC_APB2ENR_ADC2EN_BIT) +#define RCC_APB2ENR_ADC1EN (1U << RCC_APB2ENR_ADC1EN_BIT) +#define RCC_APB2ENR_IOPGEN (1U << RCC_APB2ENR_IOPGEN_BIT) +#define RCC_APB2ENR_IOPFEN (1U << RCC_APB2ENR_IOPFEN_BIT) +#define RCC_APB2ENR_IOPEEN (1U << RCC_APB2ENR_IOPEEN_BIT) +#define RCC_APB2ENR_IOPDEN (1U << RCC_APB2ENR_IOPDEN_BIT) +#define RCC_APB2ENR_IOPCEN (1U << RCC_APB2ENR_IOPCEN_BIT) +#define RCC_APB2ENR_IOPBEN (1U << RCC_APB2ENR_IOPBEN_BIT) +#define RCC_APB2ENR_IOPAEN (1U << RCC_APB2ENR_IOPAEN_BIT) +#define RCC_APB2ENR_AFIOEN (1U << RCC_APB2ENR_AFIOEN_BIT) + +/* APB1 peripheral clock enable register */ + +#define RCC_APB1ENR_DACEN_BIT 29 +#define RCC_APB1ENR_PWREN_BIT 28 +#define RCC_APB1ENR_BKPEN_BIT 27 +#define RCC_APB1ENR_CANEN_BIT 25 +#define RCC_APB1ENR_USBEN_BIT 23 +#define RCC_APB1ENR_I2C2EN_BIT 22 +#define RCC_APB1ENR_I2C1EN_BIT 21 +#define RCC_APB1ENR_UART5EN_BIT 20 +#define RCC_APB1ENR_UART4EN_BIT 19 +#define RCC_APB1ENR_USART3EN_BIT 18 +#define RCC_APB1ENR_USART2EN_BIT 17 +#define RCC_APB1ENR_SPI3EN_BIT 15 +#define RCC_APB1ENR_SPI2EN_BIT 14 +#define RCC_APB1ENR_WWDEN_BIT 11 +#define RCC_APB1ENR_TIM14EN_BIT 8 +#define RCC_APB1ENR_TIM13EN_BIT 7 +#define RCC_APB1ENR_TIM12EN_BIT 6 +#define RCC_APB1ENR_TIM7EN_BIT 5 +#define RCC_APB1ENR_TIM6EN_BIT 4 +#define RCC_APB1ENR_TIM5EN_BIT 3 +#define RCC_APB1ENR_TIM4EN_BIT 2 +#define RCC_APB1ENR_TIM3EN_BIT 1 +#define RCC_APB1ENR_TIM2EN_BIT 0 + +#define RCC_APB1ENR_DACEN (1U << RCC_APB1ENR_DACEN_BIT) +#define RCC_APB1ENR_PWREN (1U << RCC_APB1ENR_PWREN_BIT) +#define RCC_APB1ENR_BKPEN (1U << RCC_APB1ENR_BKPEN_BIT) +#define RCC_APB1ENR_CANEN (1U << RCC_APB1ENR_CANEN_BIT) +#define RCC_APB1ENR_USBEN (1U << RCC_APB1ENR_USBEN_BIT) +#define RCC_APB1ENR_I2C2EN (1U << RCC_APB1ENR_I2C2EN_BIT) +#define RCC_APB1ENR_I2C1EN (1U << RCC_APB1ENR_I2C1EN_BIT) +#define RCC_APB1ENR_UART5EN (1U << RCC_APB1ENR_UART5EN_BIT) +#define RCC_APB1ENR_UART4EN (1U << RCC_APB1ENR_UART4EN_BIT) +#define RCC_APB1ENR_USART3EN (1U << RCC_APB1ENR_USART3EN_BIT) +#define RCC_APB1ENR_USART2EN (1U << RCC_APB1ENR_USART2EN_BIT) +#define RCC_APB1ENR_SPI3EN (1U << RCC_APB1ENR_SPI3EN_BIT) +#define RCC_APB1ENR_SPI2EN (1U << RCC_APB1ENR_SPI2EN_BIT) +#define RCC_APB1ENR_WWDEN (1U << RCC_APB1ENR_WWDEN_BIT) +#define RCC_APB1ENR_TIM14EN (1U << RCC_APB1ENR_TIM14EN_BIT) +#define RCC_APB1ENR_TIM13EN (1U << RCC_APB1ENR_TIM13EN_BIT) +#define RCC_APB1ENR_TIM12EN (1U << RCC_APB1ENR_TIM12EN_BIT) +#define RCC_APB1ENR_TIM7EN (1U << RCC_APB1ENR_TIM7EN_BIT) +#define RCC_APB1ENR_TIM6EN (1U << RCC_APB1ENR_TIM6EN_BIT) +#define RCC_APB1ENR_TIM5EN (1U << RCC_APB1ENR_TIM5EN_BIT) +#define RCC_APB1ENR_TIM4EN (1U << RCC_APB1ENR_TIM4EN_BIT) +#define RCC_APB1ENR_TIM3EN (1U << RCC_APB1ENR_TIM3EN_BIT) +#define RCC_APB1ENR_TIM2EN (1U << RCC_APB1ENR_TIM2EN_BIT) + +/* Backup domain control register */ + +#define RCC_BDCR_BDRST_BIT 16 +#define RCC_BDCR_RTCEN_BIT 15 +#define RCC_BDCR_LSEBYP_BIT 2 +#define RCC_BDCR_LSERDY_BIT 1 +#define RCC_BDCR_LSEON_BIT 0 + +#define RCC_BDCR_BDRST (1U << RCC_BDCR_BDRST_BIT) +#define RCC_BDCR_RTCEN (1U << RCC_BDCR_RTC_BIT) +#define RCC_BDCR_RTCSEL (0x3 << 8) +#define RCC_BDCR_RTCSEL_NONE (0x0 << 8) +#define RCC_BDCR_RTCSEL_LSE (0x1 << 8) +#define RCC_BDCR_RTCSEL_LSI (0x2 << 8) // added to support RTClock +#define RCC_BDCR_RTCSEL_HSE (0x3 << 8) +#define RCC_BDCR_LSEBYP (1U << RCC_BDCR_LSEBYP_BIT) +#define RCC_BDCR_LSERDY (1U << RCC_BDCR_LSERDY_BIT) +#define RCC_BDCR_LSEON (1U << RCC_BDCR_LSEON_BIT) + +/* Control/status register */ + +#define RCC_CSR_LPWRRSTF_BIT 31 +#define RCC_CSR_WWDGRSTF_BIT 30 +#define RCC_CSR_IWDGRSTF_BIT 29 +#define RCC_CSR_SFTRSTF_BIT 28 +#define RCC_CSR_PORRSTF_BIT 27 +#define RCC_CSR_PINRSTF_BIT 26 +#define RCC_CSR_RMVF_BIT 24 +#define RCC_CSR_LSIRDY_BIT 1 +#define RCC_CSR_LSION_BIT 0 + +#define RCC_CSR_LPWRRSTF (1U << RCC_CSR_LPWRRSTF_BIT) +#define RCC_CSR_WWDGRSTF (1U << RCC_CSR_WWDGRSTF_BIT) +#define RCC_CSR_IWDGRSTF (1U << RCC_CSR_IWDGRSTF_BIT) +#define RCC_CSR_SFTRSTF (1U << RCC_CSR_SFTRSTF_BIT) +#define RCC_CSR_PORRSTF (1U << RCC_CSR_PORRSTF_BIT) +#define RCC_CSR_PINRSTF (1U << RCC_CSR_PINRSTF_BIT) +#define RCC_CSR_RMVF (1U << RCC_CSR_RMVF_BIT) +#define RCC_CSR_LSIRDY (1U << RCC_CSR_LSIRDY_BIT) +#define RCC_CSR_LSION (1U << RCC_CSR_LSION_BIT) + +/* + * libmaple-mandated enumeration types. + */ + +/** + * @brief STM32F1 rcc_clk_id. + */ +typedef enum rcc_clk_id { + RCC_ADC1, + RCC_ADC2, + RCC_ADC3, + RCC_AFIO, + RCC_BKP, + RCC_CRC, + RCC_DAC, + RCC_DMA1, + RCC_DMA2, + RCC_FLITF, + RCC_FSMC, + RCC_GPIOA, + RCC_GPIOB, + RCC_GPIOC, + RCC_GPIOD, + RCC_GPIOE, + RCC_GPIOF, + RCC_GPIOG, + RCC_I2C1, + RCC_I2C2, + RCC_PWR, + RCC_SDIO, + RCC_SPI1, + RCC_SPI2, + RCC_SPI3, + RCC_SRAM, + RCC_TIMER1, + RCC_TIMER2, + RCC_TIMER3, + RCC_TIMER4, + RCC_TIMER5, + RCC_TIMER6, + RCC_TIMER7, + RCC_TIMER8, + RCC_TIMER9, + RCC_TIMER10, + RCC_TIMER11, + RCC_TIMER12, + RCC_TIMER13, + RCC_TIMER14, + RCC_USART1, + RCC_USART2, + RCC_USART3, + RCC_UART4, + RCC_UART5, + RCC_USB, + RCC_CAN, //! JMD after X893 +} rcc_clk_id; + +/** + * @brief STM32F1 PLL clock sources. + * @see rcc_configure_pll() + */ +typedef enum rcc_pllsrc { + RCC_PLLSRC_HSE = (0x1 << 16), + RCC_PLLSRC_HSI_DIV_2 = (0x0 << 16) +} rcc_pllsrc; + +/** + * @brief STM32F1 clock domains. + * @see rcc_dev_clk() + */ +typedef enum rcc_clk_domain { + RCC_APB1, + RCC_APB2, + RCC_AHB +} rcc_clk_domain; + +/** + * @brief STM32F1 Prescaler identifiers + * @see rcc_set_prescaler() + */ +typedef enum rcc_prescaler { + RCC_PRESCALER_AHB, + RCC_PRESCALER_APB1, + RCC_PRESCALER_APB2, + RCC_PRESCALER_USB, + RCC_PRESCALER_ADC +} rcc_prescaler; + +/** + * @brief STM32F1 ADC prescaler dividers + * @see rcc_set_prescaler() + */ +typedef enum rcc_adc_divider { + RCC_ADCPRE_PCLK_DIV_2 = 0x0 << 14, + RCC_ADCPRE_PCLK_DIV_4 = 0x1 << 14, + RCC_ADCPRE_PCLK_DIV_6 = 0x2 << 14, + RCC_ADCPRE_PCLK_DIV_8 = 0x3 << 14, +} rcc_adc_divider; + +/** + * @brief STM32F1 APB1 prescaler dividers + * @see rcc_set_prescaler() + */ +typedef enum rcc_apb1_divider { + RCC_APB1_HCLK_DIV_1 = 0x0 << 8, + RCC_APB1_HCLK_DIV_2 = 0x4 << 8, + RCC_APB1_HCLK_DIV_4 = 0x5 << 8, + RCC_APB1_HCLK_DIV_8 = 0x6 << 8, + RCC_APB1_HCLK_DIV_16 = 0x7 << 8, +} rcc_apb1_divider; + +/** + * @brief STM32F1 APB2 prescaler dividers + * @see rcc_set_prescaler() + */ +typedef enum rcc_apb2_divider { + RCC_APB2_HCLK_DIV_1 = 0x0 << 11, + RCC_APB2_HCLK_DIV_2 = 0x4 << 11, + RCC_APB2_HCLK_DIV_4 = 0x5 << 11, + RCC_APB2_HCLK_DIV_8 = 0x6 << 11, + RCC_APB2_HCLK_DIV_16 = 0x7 << 11, +} rcc_apb2_divider; + +/** + * @brief STM32F1 AHB prescaler dividers + * @see rcc_set_prescaler() + */ +typedef enum rcc_ahb_divider { + RCC_AHB_SYSCLK_DIV_1 = 0x0 << 4, + RCC_AHB_SYSCLK_DIV_2 = 0x8 << 4, + RCC_AHB_SYSCLK_DIV_4 = 0x9 << 4, + RCC_AHB_SYSCLK_DIV_8 = 0xA << 4, + RCC_AHB_SYSCLK_DIV_16 = 0xB << 4, + RCC_AHB_SYSCLK_DIV_32 = 0xC << 4, + RCC_AHB_SYSCLK_DIV_64 = 0xD << 4, + RCC_AHB_SYSCLK_DIV_128 = 0xD << 4, + RCC_AHB_SYSCLK_DIV_256 = 0xE << 4, + RCC_AHB_SYSCLK_DIV_512 = 0xF << 4, +} rcc_ahb_divider; + +/** + * @brief STM32F1 USB prescaler dividers + * @see rcc_set_prescaler() + */ + /* + Set and reset by software to control the USB clock prescaler value. The USB clock +must be 48MHz. These bits can’t be reset if the USB clock is enabled. +00: (CK_PLL / 1.5) selected +01: CK_PLL selected + */ + +typedef enum rcc_usb_divider { + RCC_USB_SYSCLK_DIV_1 = 0x1 << 22, + RCC_USB_SYSCLK_DIV_1_5 = 0x0 << 22, + RCC_USB_SYSCLK_DIV_2 = 0x3 << 22, + RCC_USB_SYSCLK_DIV_2_5 = 0x2 << 22, +} rcc_usb_divider; + + +/** + * @brief Start the low speed internal oscillator + */ +static inline void rcc_start_lsi(void) { + *bb_perip(&RCC_BASE->CSR, RCC_CSR_LSION_BIT) = 1; + while (*bb_perip(&RCC_BASE->CSR, RCC_CSR_LSIRDY_BIT) == 0); +} + +/** + * @brief STM32F1 clock sources. + */ +typedef enum rcc_clk { + RCC_CLK_PLL = (uint16)((offsetof(struct rcc_reg_map, CR) << 8) | + RCC_CR_PLLON_BIT), /**< Main PLL, clocked by + HSI or HSE. */ + RCC_CLK_HSE = (uint16)((offsetof(struct rcc_reg_map, CR) << 8) | + RCC_CR_HSEON_BIT), /**< High speed external. */ + RCC_CLK_HSI = (uint16)((offsetof(struct rcc_reg_map, CR) << 8) | + RCC_CR_HSION_BIT), /**< High speed internal. */ + RCC_CLK_LSE = (uint16)((offsetof(struct rcc_reg_map, BDCR) << 8) | + RCC_BDCR_LSEON_BIT), /**< Low-speed external + * (32.768 KHz). */ + RCC_CLK_LSI = (uint16)((offsetof(struct rcc_reg_map, CSR) << 8) | + RCC_CSR_LSION_BIT), /**< Low-speed internal + * (approximately 32 KHz). */ +} rcc_clk; + +/** + * @brief STM32F1 PLL multipliers. + */ +typedef enum rcc_pll_multiplier { + RCC_PLLMUL_2 = (0x0 << 18), + RCC_PLLMUL_3 = (0x1 << 18), + RCC_PLLMUL_4 = (0x2 << 18), + RCC_PLLMUL_5 = (0x3 << 18), + RCC_PLLMUL_6 = (0x4 << 18), + RCC_PLLMUL_7 = (0x5 << 18), + RCC_PLLMUL_8 = (0x6 << 18), + RCC_PLLMUL_9 = (0x7 << 18), + RCC_PLLMUL_10 = (0x8 << 18), + RCC_PLLMUL_11 = (0x9 << 18), + RCC_PLLMUL_12 = (0xA << 18), + RCC_PLLMUL_13 = (0xB << 18), + RCC_PLLMUL_14 = (0xC << 18), + RCC_PLLMUL_15 = (0xD << 18), + RCC_PLLMUL_16 = (0xE << 18), +} rcc_pll_multiplier; + +/* FIXME [0.0.13] Just have data point to an rcc_pll_multiplier! */ +/** + * @brief Start the low speed external oscillatior + */ +static inline void rcc_start_lse(void) { + bb_peri_set_bit(&RCC_BASE->BDCR, RCC_BDCR_LSEBYP_BIT, 0); + bb_peri_set_bit(&RCC_BASE->BDCR, RCC_BDCR_LSEON_BIT, 1); + while (bb_peri_get_bit(&RCC_BASE->BDCR, RCC_BDCR_LSERDY_BIT ) == 0); +} + +/** + * @brief STM32F1 PLL configuration values. + * Point to one of these with the "data" field in a struct rcc_pll_cfg. + * @see struct rcc_pll_cfg. + */ +typedef struct stm32f1_rcc_pll_data { + rcc_pll_multiplier pll_mul; /**< PLL multiplication factor. */ +} stm32f1_rcc_pll_data; + +/* + * Deprecated bits. + */ +static inline void rcc_start_hse(void) { // Added to support RTClock +// *bb_perip(&RCC_BASE->CR, RCC_CR_HSEON_BIT) = 1; + while (bb_peri_get_bit(&RCC_BASE->CR, RCC_CR_HSERDY_BIT) == 0); +} + +/** + * @brief Deprecated; STM32F1 only. + * + * Initialize the clock control system. Initializes the system + * clock source to use the PLL driven by an external oscillator. + * + * @param sysclk_src system clock source, must be PLL + * @param pll_src pll clock source, must be HSE + * @param pll_mul pll multiplier + */ +__deprecated +void rcc_clk_init(rcc_sysclk_src sysclk_src, + rcc_pllsrc pll_src, + rcc_pll_multiplier pll_mul); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/STM32F1/libraries/rcc_f1.c b/STM32F1/libraries/rcc_f1.c new file mode 100644 index 000000000..9040a4dc2 --- /dev/null +++ b/STM32F1/libraries/rcc_f1.c @@ -0,0 +1,174 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file libmaple/stm32f1/rcc.c + * @brief STM32F1 RCC. + */ + +#include +#include +#include + +#include "rcc_private.h" + +#define APB1 RCC_APB1 +#define APB2 RCC_APB2 +#define AHB RCC_AHB + +/* Device descriptor table, maps rcc_clk_id onto bus and enable/reset + * register bit numbers. */ +const struct rcc_dev_info rcc_dev_table[] = { + [RCC_GPIOA] = { .clk_domain = APB2, .line_num = 2 }, + [RCC_GPIOB] = { .clk_domain = APB2, .line_num = 3 }, + [RCC_GPIOC] = { .clk_domain = APB2, .line_num = 4 }, + [RCC_GPIOD] = { .clk_domain = APB2, .line_num = 5 }, + [RCC_AFIO] = { .clk_domain = APB2, .line_num = 0 }, + [RCC_ADC1] = { .clk_domain = APB2, .line_num = 9 }, + [RCC_ADC2] = { .clk_domain = APB2, .line_num = 10 }, + [RCC_ADC3] = { .clk_domain = APB2, .line_num = 15 }, + [RCC_USART1] = { .clk_domain = APB2, .line_num = 14 }, + [RCC_USART2] = { .clk_domain = APB1, .line_num = 17 }, + [RCC_USART3] = { .clk_domain = APB1, .line_num = 18 }, + [RCC_TIMER1] = { .clk_domain = APB2, .line_num = 11 }, + [RCC_TIMER2] = { .clk_domain = APB1, .line_num = 0 }, + [RCC_TIMER3] = { .clk_domain = APB1, .line_num = 1 }, + [RCC_TIMER4] = { .clk_domain = APB1, .line_num = 2 }, + [RCC_SPI1] = { .clk_domain = APB2, .line_num = 12 }, + [RCC_SPI2] = { .clk_domain = APB1, .line_num = 14 }, + [RCC_DMA1] = { .clk_domain = AHB, .line_num = 0 }, + [RCC_PWR] = { .clk_domain = APB1, .line_num = 28}, + [RCC_BKP] = { .clk_domain = APB1, .line_num = 27}, + [RCC_I2C1] = { .clk_domain = APB1, .line_num = 21 }, + [RCC_I2C2] = { .clk_domain = APB1, .line_num = 22 }, + [RCC_CRC] = { .clk_domain = AHB, .line_num = 6}, + [RCC_FLITF] = { .clk_domain = AHB, .line_num = 4}, + [RCC_SRAM] = { .clk_domain = AHB, .line_num = 2}, + [RCC_USB] = { .clk_domain = APB1, .line_num = 23}, +#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) + [RCC_GPIOE] = { .clk_domain = APB2, .line_num = 6 }, + [RCC_GPIOF] = { .clk_domain = APB2, .line_num = 7 }, + [RCC_GPIOG] = { .clk_domain = APB2, .line_num = 8 }, + [RCC_UART4] = { .clk_domain = APB1, .line_num = 19 }, + [RCC_UART5] = { .clk_domain = APB1, .line_num = 20 }, + [RCC_TIMER5] = { .clk_domain = APB1, .line_num = 3 }, + [RCC_TIMER6] = { .clk_domain = APB1, .line_num = 4 }, + [RCC_TIMER7] = { .clk_domain = APB1, .line_num = 5 }, + [RCC_TIMER8] = { .clk_domain = APB2, .line_num = 13 }, + [RCC_FSMC] = { .clk_domain = AHB, .line_num = 8 }, + [RCC_DAC] = { .clk_domain = APB1, .line_num = 29 }, + [RCC_DMA2] = { .clk_domain = AHB, .line_num = 1 }, + [RCC_SDIO] = { .clk_domain = AHB, .line_num = 10 }, + [RCC_SPI3] = { .clk_domain = APB1, .line_num = 15 }, +#endif +#ifdef STM32_XL_DENSITY + [RCC_TIMER9] = { .clk_domain = APB2, .line_num = 19 }, + [RCC_TIMER10] = { .clk_domain = APB2, .line_num = 20 }, + [RCC_TIMER11] = { .clk_domain = APB2, .line_num = 21 }, + [RCC_TIMER12] = { .clk_domain = APB1, .line_num = 6 }, + [RCC_TIMER13] = { .clk_domain = APB1, .line_num = 7 }, + [RCC_TIMER14] = { .clk_domain = APB1, .line_num = 8 }, +#endif + [RCC_CAN] = { .clk_domain = APB1, .line_num = 25 }, //! JMD after X893 +}; + +__deprecated +void rcc_clk_init(rcc_sysclk_src sysclk_src, + rcc_pllsrc pll_src, + rcc_pll_multiplier pll_mul) { + /* Assume that we're going to clock the chip off the PLL, fed by + * the HSE */ + ASSERT(sysclk_src == RCC_CLKSRC_PLL && + pll_src == RCC_PLLSRC_HSE); + + RCC_BASE->CFGR = pll_src | pll_mul | (0x3<<22); + + /* Turn on, and wait for, HSE. */ + rcc_turn_on_clk(RCC_CLK_HSE); + while (!rcc_is_clk_ready(RCC_CLK_HSE)) + ; + + /* Do the same for the main PLL. */ + rcc_turn_on_clk(RCC_CLK_PLL); + while(!rcc_is_clk_ready(RCC_CLK_PLL)) + ; + + /* Finally, switch over to the PLL. */ + rcc_switch_sysclk(RCC_CLKSRC_PLL); +} + +/* pll_cfg->data must point to a valid struct stm32f1_rcc_pll_data. */ +void rcc_configure_pll(rcc_pll_cfg *pll_cfg) { + stm32f1_rcc_pll_data *data = pll_cfg->data; + rcc_pll_multiplier pll_mul = data->pll_mul; + uint32 cfgr; + /* Check that the PLL is disabled. */ + ASSERT_FAULT(!rcc_is_clk_on(RCC_CLK_PLL)); + + cfgr = RCC_BASE->CFGR; + cfgr &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL); + cfgr |= pll_cfg->pllsrc | pll_mul; + + RCC_BASE->CFGR = cfgr; +} + +void rcc_clk_enable(rcc_clk_id id) { + static __io uint32* enable_regs[] = { + [APB1] = &RCC_BASE->APB1ENR, + [APB2] = &RCC_BASE->APB2ENR, + [AHB] = &RCC_BASE->AHBENR, + }; + rcc_do_clk_enable(enable_regs, id); +} + +void rcc_reset_dev(rcc_clk_id id) { + static __io uint32* reset_regs[] = { + [APB1] = &RCC_BASE->APB1RSTR, + [APB2] = &RCC_BASE->APB2RSTR, + }; + rcc_do_reset_dev(reset_regs, id); +} + +void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) { + static const uint32 masks[] = { + [RCC_PRESCALER_AHB] = RCC_CFGR_HPRE, + [RCC_PRESCALER_APB1] = RCC_CFGR_PPRE1, + [RCC_PRESCALER_APB2] = RCC_CFGR_PPRE2, + [RCC_PRESCALER_USB] = RCC_CFGR_USBPRE, + [RCC_PRESCALER_ADC] = RCC_CFGR_ADCPRE, + }; + rcc_do_set_prescaler(masks, prescaler, divider); +} + +void rcc_clk_disable(rcc_clk_id id) { + static __io uint32* enable_regs[] = { + [APB1] = &RCC_BASE->APB1ENR, + [APB2] = &RCC_BASE->APB2ENR, + [AHB] = &RCC_BASE->AHBENR, + }; + rcc_do_clk_disable(enable_regs, id); +} \ No newline at end of file diff --git a/STM32F1/libraries/usb.c b/STM32F1/libraries/usb.c new file mode 100644 index 000000000..f7965351a --- /dev/null +++ b/STM32F1/libraries/usb.c @@ -0,0 +1,402 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 LeafLabs LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file libmaple/usb/stm32f1/usb.c + * @brief USB support. + * + * This is a mess. + */ + +#include + +#include +#include + +/* Private headers */ +#include "usb_reg_map.h" +#include "usb_lib_globals.h" + +/* usb_lib headers */ +#include "usb_type.h" +#include "usb_core.h" + +static void dispatch_ctr_lp(void); + +/* + * usb_lib/ globals + */ + +uint16 SaveTState; /* caches TX status for later use */ +uint16 SaveRState; /* caches RX status for later use */ + +/* + * Other state + */ + +typedef enum { + RESUME_EXTERNAL, + RESUME_INTERNAL, + RESUME_LATER, + RESUME_WAIT, + RESUME_START, + RESUME_ON, + RESUME_OFF, + RESUME_ESOF +} RESUME_STATE; + +struct { + volatile RESUME_STATE eState; + volatile uint8 bESOFcnt; +} ResumeS; + +static usblib_dev usblib = { + .irq_mask = USB_ISR_MSK, + .state = USB_UNCONNECTED, + .prevState = USB_UNCONNECTED, + .clk_id = RCC_USB, +}; +usblib_dev *USBLIB = &usblib; + +/* + * Routines + */ + +void usb_init_usblib(usblib_dev *dev, + void (**ep_int_in)(void), + void (**ep_int_out)(void)) { + rcc_clk_enable(dev->clk_id); + + dev->ep_int_in = ep_int_in; + dev->ep_int_out = ep_int_out; + + /* usb_lib/ declares both and then assumes that pFoo points to Foo + * (even though the names don't always match), which is stupid for + * all of the obvious reasons, but whatever. Here we are. */ + pInformation = &Device_Info; + pProperty = &Device_Property; + pUser_Standard_Requests = &User_Standard_Requests; + + pInformation->ControlState = 2; /* FIXME [0.0.12] use + CONTROL_STATE enumerator */ + pProperty->Init(); +} + +static void usb_suspend(void) { + uint16 cntr; + + /* TODO decide if read/modify/write is really what we want + * (e.g. usb_resume_init() reconfigures CNTR). */ + cntr = USB_BASE->CNTR; + cntr |= USB_CNTR_FSUSP; + USB_BASE->CNTR = cntr; + cntr |= USB_CNTR_LP_MODE; + USB_BASE->CNTR = cntr; + + USBLIB->prevState = USBLIB->state; + USBLIB->state = USB_SUSPENDED; +} + +static void usb_resume_init(void) { + uint16 cntr; + + cntr = USB_BASE->CNTR; + cntr &= ~USB_CNTR_LP_MODE; + USB_BASE->CNTR = cntr; + + /* Enable interrupt lines */ + USB_BASE->CNTR = USB_ISR_MSK; +} + +static void usb_resume(RESUME_STATE eResumeSetVal) { + uint16 cntr; + + if (eResumeSetVal != RESUME_ESOF) { + ResumeS.eState = eResumeSetVal; + } + + switch (ResumeS.eState) { + case RESUME_EXTERNAL: + usb_resume_init(); + ResumeS.eState = RESUME_OFF; + USBLIB->state = USBLIB->prevState; + break; + case RESUME_INTERNAL: + usb_resume_init(); + ResumeS.eState = RESUME_START; + break; + case RESUME_LATER: + ResumeS.bESOFcnt = 2; + ResumeS.eState = RESUME_WAIT; + break; + case RESUME_WAIT: + ResumeS.bESOFcnt--; + if (ResumeS.bESOFcnt == 0) { + ResumeS.eState = RESUME_START; + } + break; + case RESUME_START: + cntr = USB_BASE->CNTR; + cntr |= USB_CNTR_RESUME; + USB_BASE->CNTR = cntr; + ResumeS.eState = RESUME_ON; + ResumeS.bESOFcnt = 10; + break; + case RESUME_ON: + ResumeS.bESOFcnt--; + if (ResumeS.bESOFcnt == 0) { + cntr = USB_BASE->CNTR; + cntr &= ~USB_CNTR_RESUME; + USB_BASE->CNTR = cntr; + USBLIB->state = USBLIB->prevState; + ResumeS.eState = RESUME_OFF; + } + break; + case RESUME_OFF: + case RESUME_ESOF: + default: + ResumeS.eState = RESUME_OFF; + break; + } +} + +// JMD : default ISRs of CAN, to be overridden if HardwareCAN library is used in sketch +void __attribute__((weak)) USB_HP_CAN_TX_IRQHandler(void) +{ ; } // Dummy ISR + +void __irq_usb_hp_can_tx(void) +{ + USB_HP_CAN_TX_IRQHandler () ; +} + +uint8 __attribute__((weak)) CAN_RX0_IRQ_Handler(void) +{ return 0 ; } // Dummy ISR + +#define SUSPEND_ENABLED 1 +void __irq_usb_lp_can_rx0(void) { + uint16 istr = USB_BASE->ISTR; + + if (CAN_RX0_IRQ_Handler()) //! JMD : Call to CAN ISR, returns 1 CAN is active + return; //! JMD + + /* Use USB_ISR_MSK to only include code for bits we care about. */ + +#if (USB_ISR_MSK & USB_ISTR_RESET) + if (istr & USB_ISTR_RESET & USBLIB->irq_mask) { + USB_BASE->ISTR = ~USB_ISTR_RESET; + pProperty->Reset(); + } +#endif + +#if (USB_ISR_MSK & USB_ISTR_PMAOVR) + if (istr & ISTR_PMAOVR & USBLIB->irq_mask) { + USB_BASE->ISTR = ~USB_ISTR_PMAOVR; + } +#endif + +#if (USB_ISR_MSK & USB_ISTR_ERR) + if (istr & USB_ISTR_ERR & USBLIB->irq_mask) { + USB_BASE->ISTR = ~USB_ISTR_ERR; + } +#endif + +#if (USB_ISR_MSK & USB_ISTR_WKUP) + if (istr & USB_ISTR_WKUP & USBLIB->irq_mask) { + USB_BASE->ISTR = ~(USB_ISTR_WKUP | USB_ISTR_SUSP); + usb_resume(RESUME_EXTERNAL); + } +#endif + +#if (USB_ISR_MSK & USB_ISTR_SUSP) + if (istr & USB_ISTR_SUSP & USBLIB->irq_mask) { + /* check if SUSPEND is possible */ + if (SUSPEND_ENABLED) { + usb_suspend(); + } else { + /* if not possible then resume after xx ms */ + usb_resume(RESUME_LATER); + } + /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ + USB_BASE->ISTR = ~(USB_ISTR_WKUP | USB_ISTR_SUSP); + } +#endif + +#if (USB_ISR_MSK & USB_ISTR_SOF) + if (istr & USB_ISTR_SOF & USBLIB->irq_mask) { + USB_BASE->ISTR = ~USB_ISTR_SOF; + } +#endif + +#if (USB_ISR_MSK & USB_ISTR_ESOF) + if (istr & USB_ISTR_ESOF & USBLIB->irq_mask) { + USB_BASE->ISTR = ~USB_ISTR_ESOF; + /* resume handling timing is made with ESOFs */ + usb_resume(RESUME_ESOF); /* request without change of the machine state */ + } +#endif + + /* + * Service the correct transfer interrupt. + */ + +#if (USB_ISR_MSK & USB_ISTR_CTR) + if (istr & USB_ISTR_CTR & USBLIB->irq_mask) { + dispatch_ctr_lp(); + } +#endif +} + +/* + * Auxiliary routines + */ + +static inline uint8 dispatch_endpt_zero(uint16 istr_dir); +static inline void dispatch_endpt(uint8 ep); +static inline void set_rx_tx_status0(uint16 rx, uint16 tx); + +static void handle_setup0(void); +static void handle_in0(void); +static void handle_out0(void); + +static void dispatch_ctr_lp() { + uint16 istr; + while (((istr = USB_BASE->ISTR) & USB_ISTR_CTR) != 0) { + /* TODO WTF, figure this out: RM0008 says CTR is read-only, + * but ST's firmware claims it's clear-only, and emphasizes + * the importance of clearing it in more than one place. */ + USB_BASE->ISTR = ~USB_ISTR_CTR; + uint8 ep_id = istr & USB_ISTR_EP_ID; + if (ep_id == 0) { + /* TODO figure out why it's OK to break out of the loop + * once we're done serving endpoint zero, but not okay if + * there are multiple nonzero endpoint transfers to + * handle. */ + if (dispatch_endpt_zero(istr & USB_ISTR_DIR)) { + return; + } + } else { + dispatch_endpt(ep_id); + } + } +} + +/* FIXME Dataflow on endpoint 0 RX/TX status is based off of ST's + * code, and is ugly/confusing in its use of SaveRState/SaveTState. + * Fixing this requires filling in handle_in0(), handle_setup0(), + * handle_out0(). */ +static inline uint8 dispatch_endpt_zero(uint16 istr_dir) { + uint32 epr = (uint16)USB_BASE->EP[0]; + + if (!(epr & (USB_EP_CTR_TX | USB_EP_SETUP | USB_EP_CTR_RX))) { + return 0; + } + + /* Cache RX/TX statuses in SaveRState/SaveTState, respectively. + * The various handle_foo0() may clobber these values + * before we reset them at the end of this routine. */ + SaveRState = epr & USB_EP_STAT_RX; + SaveTState = epr & USB_EP_STAT_TX; + + /* Set actual RX/TX statuses to NAK while we're thinking */ + set_rx_tx_status0(USB_EP_STAT_RX_NAK, USB_EP_STAT_TX_NAK); + + if (istr_dir == 0) { + /* ST RM0008: "If DIR bit=0, CTR_TX bit is set in the USB_EPnR + * register related to the interrupting endpoint. The + * interrupting transaction is of IN type (data transmitted by + * the USB peripheral to the host PC)." */ + ASSERT_FAULT(epr & USB_EP_CTR_TX); + usb_clear_ctr_tx(USB_EP0); + handle_in0(); + } else { + /* RM0008: "If DIR bit=1, CTR_RX bit or both CTR_TX/CTR_RX + * are set in the USB_EPnR register related to the + * interrupting endpoint. The interrupting transaction is of + * OUT type (data received by the USB peripheral from the host + * PC) or two pending transactions are waiting to be + * processed." + * + * [mbolivar] Note how the following control flow (which + * replicates ST's) doesn't seem to actually handle both + * interrupts that are ostensibly pending when both CTR_RX and + * CTR_TX are set. + * + * TODO sort this mess out. + */ + if (epr & USB_EP_CTR_TX) { + usb_clear_ctr_tx(USB_EP0); + handle_in0(); + } else { /* SETUP or CTR_RX */ + /* SETUP is held constant while CTR_RX is set, so clear it + * either way */ + usb_clear_ctr_rx(USB_EP0); + if (epr & USB_EP_SETUP) { + handle_setup0(); + } else { /* CTR_RX */ + handle_out0(); + } + } + } + + set_rx_tx_status0(SaveRState, SaveTState); + return 1; +} + +static inline void dispatch_endpt(uint8 ep) { + uint32 epr = USB_BASE->EP[ep]; + /* If ISTR_CTR is set and the ISTR gave us this EP_ID to handle, + * then presumably at least one of CTR_RX and CTR_TX is set, but + * again, ST's control flow allows for the possibility of neither. + * + * TODO try to find out if neither being set is possible. */ + if (epr & USB_EP_CTR_RX) { + usb_clear_ctr_rx(ep); + (USBLIB->ep_int_out[ep - 1])(); + } + if (epr & USB_EP_CTR_TX) { + usb_clear_ctr_tx(ep); + (USBLIB->ep_int_in[ep - 1])(); + } +} + +static inline void set_rx_tx_status0(uint16 rx, uint16 tx) { + usb_set_ep_rx_stat(USB_EP0, rx); + usb_set_ep_tx_stat(USB_EP0, tx); +} + +/* TODO Rip out usb_lib/ dependency from the following functions: */ + +static void handle_setup0(void) { + Setup0_Process(); +} + +static void handle_in0(void) { + In0_Process(); +} + +static void handle_out0(void) { + Out0_Process(); +} From 45c64ed5395270acb4f4ee4104efe4197d13e345 Mon Sep 17 00:00:00 2001 From: Phonog Date: Mon, 31 Oct 2016 22:33:52 +0100 Subject: [PATCH 292/307] Add files via upload --- STM32F1/cores/maple/libmaple/rcc_f1.c | 1 + 1 file changed, 1 insertion(+) diff --git a/STM32F1/cores/maple/libmaple/rcc_f1.c b/STM32F1/cores/maple/libmaple/rcc_f1.c index f45f670e1..9040a4dc2 100644 --- a/STM32F1/cores/maple/libmaple/rcc_f1.c +++ b/STM32F1/cores/maple/libmaple/rcc_f1.c @@ -93,6 +93,7 @@ const struct rcc_dev_info rcc_dev_table[] = { [RCC_TIMER13] = { .clk_domain = APB1, .line_num = 7 }, [RCC_TIMER14] = { .clk_domain = APB1, .line_num = 8 }, #endif + [RCC_CAN] = { .clk_domain = APB1, .line_num = 25 }, //! JMD after X893 }; __deprecated From 1de91caa6004659221ea24c1e3f5c0d7701f3768 Mon Sep 17 00:00:00 2001 From: Phonog Date: Mon, 31 Oct 2016 22:35:35 +0100 Subject: [PATCH 293/307] Add files via upload --- STM32F1/system/libmaple/stm32f1/include/series/rcc.h | 1 + 1 file changed, 1 insertion(+) diff --git a/STM32F1/system/libmaple/stm32f1/include/series/rcc.h b/STM32F1/system/libmaple/stm32f1/include/series/rcc.h index f40dcbaba..aa9f8d3c9 100644 --- a/STM32F1/system/libmaple/stm32f1/include/series/rcc.h +++ b/STM32F1/system/libmaple/stm32f1/include/series/rcc.h @@ -439,6 +439,7 @@ typedef enum rcc_clk_id { RCC_UART4, RCC_UART5, RCC_USB, + RCC_CAN, //! JMD after X893 } rcc_clk_id; /** From fda4706df68656147b6899243696c753c3eb188a Mon Sep 17 00:00:00 2001 From: Phonog Date: Mon, 31 Oct 2016 22:37:16 +0100 Subject: [PATCH 294/307] Add files via upload --- STM32F1/cores/maple/libmaple/usb/stm32f1/usb.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb.c b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb.c index 0feb745eb..c4f974914 100644 --- a/STM32F1/cores/maple/libmaple/usb/stm32f1/usb.c +++ b/STM32F1/cores/maple/libmaple/usb/stm32f1/usb.c @@ -189,10 +189,25 @@ static void usb_resume(RESUME_STATE eResumeSetVal) { } } +// JMD : default ISRs of CAN, to be overridden if HardwareCAN library is used in sketch +void __attribute__((weak)) USB_HP_CAN_TX_IRQHandler(void) +{ ; } // Dummy ISR + +void __irq_usb_hp_can_tx(void) +{ + USB_HP_CAN_TX_IRQHandler () ; +} + +uint8 __attribute__((weak)) CAN_RX0_IRQ_Handler(void) +{ return 0 ; } // Dummy ISR + #define SUSPEND_ENABLED 1 void __irq_usb_lp_can_rx0(void) { uint16 istr = USB_BASE->ISTR; + if (CAN_RX0_IRQ_Handler()) //! JMD : Call to CAN ISR, returns 1 CAN is active + return; //! JMD + /* Use USB_ISR_MSK to only include code for bits we care about. */ #if (USB_ISR_MSK & USB_ISTR_RESET) From dad2e73ed524fe637378b508d33d6bfb10885165 Mon Sep 17 00:00:00 2001 From: megadrifter Date: Fri, 16 Dec 2016 09:05:23 +0300 Subject: [PATCH 295/307] added the simplified send example also added testing sketch for GM LAN. --- .../AstraH_CAN_test/AstraH_CAN_test.ino | 145 ++++++++++++++++++ .../HardwareCAN_simplified_send1.ino | 93 +++++++++++ 2 files changed, 238 insertions(+) create mode 100644 STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test.ino create mode 100644 STM32F1/libraries/HardwareCAN/examples/HardwareCAN_simplified_send1/HardwareCAN_simplified_send1.ino diff --git a/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test.ino b/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test.ino new file mode 100644 index 000000000..a05576bb9 --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test.ino @@ -0,0 +1,145 @@ +#include +/* + * Uses STM32duino with Phono patch. Must add 33 and 95 CAN speeds + */ +#define BPIN 0 +#define SPIN 1 +byte msgD0 ; // variable to be used in the example. + +// Instanciation of CAN interface +HardwareCAN canBus(CAN1_BASE); +CanMsg msg ; + +void CANSetup(void) +{ + CAN_STATUS Stat ; + + // Initialize CAN module + canBus.map(CAN_GPIO_PB8_PB9); // This setting is already wired in the Olimexino-STM32 board + Stat = canBus.begin(CAN_SPEED_95, CAN_MODE_NORMAL); // Other speeds go from 125 kbps to 1000 kbps. CAN allows even more choices. + + canBus.filter(0, 0, 0); + canBus.set_irq_mode(); // Use irq mode (recommended), so the handling of incoming messages + // will be performed at ease in a task or in the loop. The software fifo is 16 cells long, + // allowing at least 15 ms before processing the fifo is needed at 125 kbps + Stat = canBus.status(); + if (Stat != CAN_OK) + /* Your own error processing here */ ; // Initialization failed +} + + +// Send one frame. Parameter is a pointer to a frame structure (above), that has previously been updated with data. +// If no mailbox is available, wait until one becomes empty. There are 3 mailboxes. +CAN_TX_MBX CANsend(CanMsg *pmsg) // Should be moved to the library?! +{ + CAN_TX_MBX mbx; + + do + { + mbx = canBus.send(pmsg) ; +#ifdef USE_MULTITASK + vTaskDelay( 1 ) ; // Infinite loops are not multitasking-friendly +#endif + } + while(mbx == CAN_TX_NO_MBX) ; // Waiting outbound frames will eventually be sent, unless there is a CAN bus failure. + return mbx ; +} + +// Send message +// Prepare and send a frame containing some value +void SendCANmessage(long id=0x001, byte dlength=8, byte d0=0x00, byte d1=0x00, byte d2=0x00, byte d3=0x00, byte d4=0x00, byte d5=0x00, byte d6=0x00, byte d7=0x00) +{ + // Initialize the message structure + // A CAN structure includes the following fields: + msg.IDE = CAN_ID_STD; // Indicates a standard identifier ; CAN_ID_EXT would mean this frame uses an extended identifier + msg.RTR = CAN_RTR_DATA; // Indicated this is a data frame, as opposed to a remote frame (would then be CAN_RTR_REMOTE) + msg.ID = id ; // Identifier of the frame : 0-2047 (0-0x3ff) for standard idenfiers; 0-0x1fffffff for extended identifiers + msg.DLC = dlength; // Number of data bytes to follow + + // Prepare frame : send something + msg.Data[0] = d0 ; + msg.Data[1] = d1 ; + msg.Data[2] = d2 ; + msg.Data[3] = d3 ; + msg.Data[4] = d4 ; + msg.Data[5] = d5 ; + msg.Data[6] = d6 ; + msg.Data[7] = d7 ; + + digitalWrite(PC13, LOW); // turn the onboard LED on + CANsend(&msg) ; // Send this frame + delay(180); + digitalWrite(PC13, HIGH); // turn the LED off + delay(100); +} + +// The application program starts here +int bState = 0; // variable for reading the pushbutton status +int sState = 0; // variable for reading the switch status +byte st = 0x31; // buttot 1 on the CD30MP3 + +void setup() { + // put your setup code here, to run once: + CANSetup() ; // Initialize the CAN module and prepare the message structures. + pinMode(PC13, OUTPUT); + pinMode(BPIN, INPUT); // input for hardware button + pinMode(SPIN, INPUT); // input for hardware switch + Serial1.begin(115200); + Serial1.println("Hello World!"); + msgD0 = 0x01; + delay(500); +} + +void loop() { + bState = digitalRead(BPIN); + sState = digitalRead(SPIN); + // check if the pushbutton is pressed. + // if it is, the buttonState is HIGH: + if (bState == HIGH) { + long msgID = 0x201 ; + SendCANmessage(msgID, 3, 0x01, 0x6f, 0x00) ; + Serial1.println("OK pressed"); + } + + // check if the switch is high. + // if it is: + if (sState == HIGH) { + long msgID = 0x201 ; + SendCANmessage(msgID, 3, 0x01, st, 0x00) ; + Serial1.print("Station changed to "); + Serial1.println(st); + delay(500); + if (st == 0x39){st=0x31;} else {st++;}; + } +// try to read message and output to serial +CanMsg *r_msg; +if ((r_msg = canBus.recv()) != NULL){ + Serial1.print(r_msg->ID); + Serial1.print("#"); + Serial1.print(r_msg->Data[0]); + Serial1.print("."); + Serial1.print(r_msg->Data[1]); + Serial1.print("."); + Serial1.print(r_msg->Data[2]); + Serial1.print("."); + Serial1.print(r_msg->Data[3]); + Serial1.print("."); + Serial1.print(r_msg->Data[4]); + Serial1.print("."); + Serial1.print(r_msg->Data[5]); + Serial1.print("."); + Serial1.print(r_msg->Data[6]); + Serial1.print("."); + Serial1.println(r_msg->Data[7]); +if (r_msg->ID == 0x201 and r_msg->Data[0] == 0x01 and r_msg->Data[1] == 0xFF){ +// SETTINGS is pressed! + Serial1.println("SETTINGS. Pause for 2 seconds."); + digitalWrite(PC13, LOW); // turn the onboard LED on + delay(2000); + digitalWrite(PC13, HIGH); // turn the LED off + } + canBus.free(); + } + + +} diff --git a/STM32F1/libraries/HardwareCAN/examples/HardwareCAN_simplified_send1/HardwareCAN_simplified_send1.ino b/STM32F1/libraries/HardwareCAN/examples/HardwareCAN_simplified_send1/HardwareCAN_simplified_send1.ino new file mode 100644 index 000000000..17fb07f9b --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/examples/HardwareCAN_simplified_send1/HardwareCAN_simplified_send1.ino @@ -0,0 +1,93 @@ +#include +//#include "changes.h" +/* + * Example of use of the HardwareCAN library + * This application sends two times one frame of data and then blinkes 3 times. Then repeats after 2 seconds. + * It also produces data that are sent periodically using another two frames. + * + * Please read the file changes.h to see the changes to be performed to the core in order to use this + */ + +byte msgD0 ; // variable to be used in the example. + +// Instanciation of CAN interface +HardwareCAN canBus(CAN1_BASE); +CanMsg msg ; + +void CANSetup(void) +{ + CAN_STATUS Stat ; + + // Initialize CAN module + canBus.map(CAN_GPIO_PB8_PB9); // This setting is already wired in the Olimexino-STM32 board + Stat = canBus.begin(CAN_SPEED_125, CAN_MODE_NORMAL); // Other speeds go from 125 kbps to 1000 kbps. CAN allows even more choices. + + canBus.filter(0, 0, 0); + canBus.set_irq_mode(); // Use irq mode (recommended), so the handling of incoming messages + // will be performed at ease in a task or in the loop. The software fifo is 16 cells long, + // allowing at least 15 ms before processing the fifo is needed at 125 kbps + Stat = canBus.status(); + if (Stat != CAN_OK) + /* Your own error processing here */ ; // Initialization failed +} + + +// Send one frame. Parameter is a pointer to a frame structure (above), that has previously been updated with data. +// If no mailbox is available, wait until one becomes empty. There are 3 mailboxes. +CAN_TX_MBX CANsend(CanMsg *pmsg) // Should be moved to the library?! +{ + CAN_TX_MBX mbx; + + do + { + mbx = canBus.send(pmsg) ; +#ifdef USE_MULTITASK + vTaskDelay( 1 ) ; // Infinite loops are not multitasking-friendly +#endif + } + while(mbx == CAN_TX_NO_MBX) ; // Waiting outbound frames will eventually be sent, unless there is a CAN bus failure. + return mbx ; +} + +// Send message +// Prepare and send a frame containing some value +void SendCANmessage(long id=0x001, byte d0=0x00, byte d1=0x00, byte d2=0x00, byte d3=0x00, byte d4=0x00, byte d5=0x00, byte d6=0x00, byte d7=0x00) +{ + // Initialize the message structure + // A CAN structure includes the following fields: + msg.IDE = CAN_ID_STD; // Indicates a standard identifier ; CAN_ID_EXT would mean this frame uses an extended identifier + msg.RTR = CAN_RTR_DATA; // Indicated this is a data frame, as opposed to a remote frame (would then be CAN_RTR_REMOTE) + msg.ID = id ; // Identifier of the frame : 0-2047 (0-0x3ff) for standard idenfiers; 0-0x1fffffff for extended identifiers + msg.DLC = 8; // Number of data bytes to follow + + // Prepare frame : send something + msg.Data[0] = d0 ; + msg.Data[1] = d1 ; + msg.Data[2] = d2 ; + msg.Data[3] = d3 ; + msg.Data[4] = d4 ; + msg.Data[5] = d5 ; + msg.Data[6] = d6 ; + msg.Data[7] = d7 ; + + digitalWrite(PC13, LOW); // turn the onboard LED on + CANsend(&msg) ; // Send this frame + delay(180); + digitalWrite(PC13, HIGH); // turn the LED off + delay(100); +} + +// The application program starts here +void setup() { + // put your setup code here, to run once: + CANSetup() ; // Initialize the CAN module and prepare the message structures. + pinMode(PC13, OUTPUT); + msgD0 = 0x01; +} + +void loop() { + delay(1000); + long msgID = 0x101 ; + SendCANmessage(msgID, msgD0) ; + msgD0++; +} From cdf8fa653f62388242d9d0d6b2b56258feb119c8 Mon Sep 17 00:00:00 2001 From: megadrifter Date: Fri, 16 Dec 2016 09:08:21 +0300 Subject: [PATCH 296/307] Add 33 and 95 kbps speeds --- STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp | 2 ++ STM32F1/libraries/HardwareCAN/src/utility/can.c | 12 ++++++++++++ STM32F1/libraries/HardwareCAN/src/utility/can.h | 2 ++ 3 files changed, 16 insertions(+) diff --git a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp index f113c4d85..f324e865f 100644 --- a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp +++ b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp @@ -13,6 +13,8 @@ * - CAN_SPEED_500 * - CAN_SPEED_250 * - CAN_SPEED_125 + * - CAN_SPEED_95 + * - CAN_SPEED_33 */ CAN_STATUS HardwareCAN::begin(CAN_SPEED speed, uint32 mode) { diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.c b/STM32F1/libraries/HardwareCAN/src/utility/can.c index 0120e0eed..2f924184a 100644 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.c +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.c @@ -44,6 +44,18 @@ struct can_speed_info { #define CAN_CLOCK (36000000UL / 18UL) static const struct can_speed_info can_speed_table[] = { + [CAN_SPEED_33] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 33000UL - 1) + )}, + [CAN_SPEED_95] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 95000UL - 1) + )}, [CAN_SPEED_125] = { .btr = ( (( 4-1) << CAN_BTR_SJW_POS) | ((12-1) << CAN_BTR_TS1_POS) | diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.h b/STM32F1/libraries/HardwareCAN/src/utility/can.h index 576ac36fe..972259d3d 100644 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.h +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.h @@ -168,6 +168,8 @@ typedef enum CAN_TX_MBX #define CAN_MODE_SILENT_LOOPBACK (CAN_BTR_LBKM | CAN_BTR_SILM) /* loopback combined with silent mode */ enum CAN_SPEED { + CAN_SPEED_33, + CAN_SPEED_95, CAN_SPEED_125, CAN_SPEED_250, CAN_SPEED_500, From 7b21efa2dab378450e109ace3cf44449695c92f0 Mon Sep 17 00:00:00 2001 From: megadrifter Date: Fri, 24 Mar 2017 22:36:44 +0300 Subject: [PATCH 297/307] RPM reading example Example says when you need to shift up or shift down --- .../AstraH_CAN_test/AstraH_CAN_test_rpm.ino | 180 ++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test_rpm.ino diff --git a/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test_rpm.ino b/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test_rpm.ino new file mode 100644 index 000000000..0ea0b3a29 --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test_rpm.ino @@ -0,0 +1,180 @@ +#include +/* + * Uses STM32duino with Phono patch. Must add 33 and 95 CAN speeds + */ +#define BPIN 0 // there is a buttton +#define SPIN 1 // there is a switch +#define BUZZERPIN 17 // B1 for buzzer + +// Instanciation of CAN interface +HardwareCAN canBus(CAN1_BASE); +CanMsg msg ; +CanMsg *r_msg; + +void CANSetup(void) +{ + CAN_STATUS Stat ; + + // Initialize CAN module + canBus.map(CAN_GPIO_PB8_PB9); // This setting is already wired in the Olimexino-STM32 board + Stat = canBus.begin(CAN_SPEED_33, CAN_MODE_NORMAL); + + canBus.filter(0, 0, 0); + canBus.set_irq_mode(); // Use irq mode (recommended), so the handling of incoming messages + // will be performed at ease in a task or in the loop. The software fifo is 16 cells long, + // allowing at least 15 ms before processing the fifo is needed at 125 kbps + Stat = canBus.status(); + if (Stat != CAN_OK) + /* Your own error processing here */ ; // Initialization failed +} + + +// Send one frame. Parameter is a pointer to a frame structure (above), that has previously been updated with data. +// If no mailbox is available, wait until one becomes empty. There are 3 mailboxes. +CAN_TX_MBX CANsend(CanMsg *pmsg) // Should be moved to the library?! +{ + CAN_TX_MBX mbx; + do + { + mbx = canBus.send(pmsg) ; +#ifdef USE_MULTITASK + vTaskDelay( 1 ) ; // Infinite loops are not multitasking-friendly +#endif + } + while(mbx == CAN_TX_NO_MBX) ; // Waiting outbound frames will eventually be sent, unless there is a CAN bus failure. + return mbx ; +} + +// Send message +// Prepare and send a frame containing some value +void SendCANmessage(long id=0x001, byte dlength=8, byte d0=0x00, byte d1=0x00, byte d2=0x00, byte d3=0x00, byte d4=0x00, byte d5=0x00, byte d6=0x00, byte d7=0x00) +{ + // Initialize the message structure + // A CAN structure includes the following fields: + msg.IDE = CAN_ID_STD; // Indicates a standard identifier ; CAN_ID_EXT would mean this frame uses an extended identifier + msg.RTR = CAN_RTR_DATA; // Indicated this is a data frame, as opposed to a remote frame (would then be CAN_RTR_REMOTE) + msg.ID = id ; // Identifier of the frame : 0-2047 (0-0x3ff) for standard idenfiers; 0-0x1fffffff for extended identifiers + msg.DLC = dlength; // Number of data bytes to follow + + // Prepare frame : send something + msg.Data[0] = d0 ; + msg.Data[1] = d1 ; + msg.Data[2] = d2 ; + msg.Data[3] = d3 ; + msg.Data[4] = d4 ; + msg.Data[5] = d5 ; + msg.Data[6] = d6 ; + msg.Data[7] = d7 ; + + digitalWrite(PC13, LOW); // turn the onboard LED on + CANsend(&msg) ; // Send this frame + delay(180); + digitalWrite(PC13, HIGH); // turn the LED off + delay(100); +} + +// The application program starts here +bool bState = 0; // variable for reading the pushbutton status +bool sState = 0; // variable for reading the switch status +// byte st = 0x31; // buttot 1 on the CD30MP3 + +void setup() { + // put your setup code here, to run once: + CANSetup() ; // Initialize the CAN module and prepare the message structures. + pinMode(PC13, OUTPUT); // LED + pinMode(BPIN, INPUT); // input for hardware button + pinMode(SPIN, INPUT); // input for hardware switch + + Serial.begin(115200); + pinMode(BUZZERPIN, OUTPUT); + digitalWrite(BUZZERPIN, LOW); + + Serial1.begin(115200); + Serial1.println("Hello World!"); +} + +void beep(int times) +{ + for (int i=0;iID) == 0x108 ) { + Serial1.println("Data read at 0x108"); + byte tt = r_msg->Data[0]; + byte xx = r_msg->Data[1]; + byte yy = r_msg->Data[2]; + int rpm = (xx<<6) + (yy>>2); + Serial1.print("rpm = "); + Serial1.println(rpm); + if (tt&0x20){ /* Throttle on? */ + Serial1.println("Throttle ON"); + if (xx > 0x2e) {beep(2); Serial1.println("Shift up!");} + if (xx < 0x1c) {beep(1); Serial1.println("Shift down!");} + } + gotit = 1; + } + canBus.free(); + } + /* --- End check RPMs --- */ + } + else + { + // try to read message and output to serial + CanMsg *r_msg; + if ((r_msg = canBus.recv()) != NULL) + { + Serial1.print(r_msg->ID); + Serial1.print("#"); + Serial1.print(r_msg->Data[0]); + Serial1.print("."); + Serial1.print(r_msg->Data[1]); + Serial1.print("."); + Serial1.print(r_msg->Data[2]); + Serial1.print("."); + Serial1.print(r_msg->Data[3]); + Serial1.print("."); + Serial1.print(r_msg->Data[4]); + Serial1.print("."); + Serial1.print(r_msg->Data[5]); + Serial1.print("."); + Serial1.print(r_msg->Data[6]); + Serial1.print("."); + Serial1.println(r_msg->Data[7]); + } + + canBus.free(); + } + + + +} From 0fb002de9b35d163e50af813fd2b7ecdaf189455 Mon Sep 17 00:00:00 2001 From: megadrifter Date: Thu, 1 Jun 2017 18:49:26 +0300 Subject: [PATCH 298/307] add CAN_GPIO_PA11_PA12 --- STM32F1/libraries/HardwareCAN/src/utility/can.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.h b/STM32F1/libraries/HardwareCAN/src/utility/can.h index 972259d3d..19506ea85 100644 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.h +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.h @@ -139,7 +139,8 @@ extern "C" { typedef enum CAN_GPIO_MAP { CAN_GPIO_PB8_PB9, /* RX to PB8, TX to PB9 */ - CAN_GPIO_PD0_PD1 /* RX to PD0, TX to PD1 */ + CAN_GPIO_PD0_PD1, /* RX to PD0, TX to PD1 */ + CAN_GPIO_PA11_PA12 /* RX to PA11, TX to PA12 */ } CAN_GPIO_MAP; typedef enum CAN_STATUS From 333560d051a49bd501764a014119260620c79cfc Mon Sep 17 00:00:00 2001 From: megadrifter Date: Thu, 1 Jun 2017 18:53:00 +0300 Subject: [PATCH 299/307] add A11-A12 REMAP --- STM32F1/libraries/HardwareCAN/src/utility/can.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.c b/STM32F1/libraries/HardwareCAN/src/utility/can.c index 2f924184a..ad7a7da59 100644 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.c +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.c @@ -257,6 +257,12 @@ CAN_STATUS can_gpio_map(CAN_Port* CANx, CAN_GPIO_MAP map_mode) gpio_set_mode(GPIOB, 8, GPIO_INPUT_FLOATING); gpio_set_mode(GPIOB, 9, GPIO_AF_OUTPUT_PP); break; + case CAN_GPIO_PA11_PA12: + rcc_clk_enable(RCC_GPIOA); + afio_remap(AFIO_MAPR_CAN_REMAP_NONE); + gpio_set_mode(GPIOA, 11, GPIO_INPUT_FLOATING); + gpio_set_mode(GPIOA, 12, GPIO_AF_OUTPUT_PP); + break; #if NR_GPIO_PORTS >= 4 case CAN_GPIO_PD0_PD1: rcc_clk_enable(RCC_GPIOD); From 4e2af4f12ed23ee81b3792a5ccac4ea575fcab98 Mon Sep 17 00:00:00 2001 From: megadrifter Date: Wed, 7 Jun 2017 19:52:52 +0300 Subject: [PATCH 300/307] add real timer setting as mcs/72 --- STM32F1/cores/maple/HardwareTimer.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/STM32F1/cores/maple/HardwareTimer.h b/STM32F1/cores/maple/HardwareTimer.h index bb40dba0f..d10a8c1f9 100644 --- a/STM32F1/cores/maple/HardwareTimer.h +++ b/STM32F1/cores/maple/HardwareTimer.h @@ -142,6 +142,18 @@ class HardwareTimer { * greater than zero. * @return The new overflow value. */ + uint16 setPeriod72(uint32 microseconds); + /** + * @brief Set the timer's period in microseconds/72. + * + * Configures the prescaler and overflow values to generate a timer + * reload with a period as close to the given number of + * microseconds as possible. + * + * @param microseconds The desired period of the timer. This must be + * greater than zero. + * @return The new overflow value. + */ uint16 setPeriod(uint32 microseconds); /** From ac866ec629ffb3581eff691b8925a725be6e0791 Mon Sep 17 00:00:00 2001 From: megadrifter Date: Wed, 7 Jun 2017 19:58:00 +0300 Subject: [PATCH 301/307] add setCycles to use instead of setPeriod because I neet faster interrupt than 1 microsecond. --- STM32F1/cores/maple/HardwareTimer.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/STM32F1/cores/maple/HardwareTimer.cpp b/STM32F1/cores/maple/HardwareTimer.cpp index abf1e623f..321598ff0 100644 --- a/STM32F1/cores/maple/HardwareTimer.cpp +++ b/STM32F1/cores/maple/HardwareTimer.cpp @@ -117,6 +117,22 @@ uint16 HardwareTimer::setPeriod(uint32 microseconds) { return overflow; } +uint16 HardwareTimer::setCycles(uint32 Cycles) { + // Not the best way to handle this edge case? + if (!Cycles) { + this->setPrescaleFactor(1); + this->setOverflow(1); + return this->getOverflow(); + } + + uint32 period_cyc = Cycles; + uint16 prescaler = (uint16)(period_cyc / MAX_RELOAD + 1); + uint16 overflow = (uint16)((period_cyc + (prescaler / 2)) / prescaler); + this->setPrescaleFactor(prescaler); + this->setOverflow(overflow); + return overflow; +} + void HardwareTimer::setMode(int channel, timer_mode mode) { timer_set_mode(this->dev, (uint8)channel, (timer_mode)mode); } From 62911a8d70017b46916ed621da52883ce7d17e20 Mon Sep 17 00:00:00 2001 From: megadrifter Date: Wed, 7 Jun 2017 20:01:55 +0300 Subject: [PATCH 302/307] rename to setCycles function --- STM32F1/cores/maple/HardwareTimer.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/STM32F1/cores/maple/HardwareTimer.h b/STM32F1/cores/maple/HardwareTimer.h index d10a8c1f9..4de2ebc07 100644 --- a/STM32F1/cores/maple/HardwareTimer.h +++ b/STM32F1/cores/maple/HardwareTimer.h @@ -132,19 +132,19 @@ class HardwareTimer { void setCount(uint16 val); /** - * @brief Set the timer's period in microseconds. + * @brief Set the timer's period in Cycles. * * Configures the prescaler and overflow values to generate a timer - * reload with a period as close to the given number of - * microseconds as possible. + * reload with a period of given number of + * Cycles. * - * @param microseconds The desired period of the timer. This must be + * @param Cycles The desired period of the timer. This must be * greater than zero. * @return The new overflow value. */ - uint16 setPeriod72(uint32 microseconds); + uint16 setCycles(uint32 Cycles); /** - * @brief Set the timer's period in microseconds/72. + * @brief Set the timer's period in microseconds. * * Configures the prescaler and overflow values to generate a timer * reload with a period as close to the given number of From 406eea0384fa6dd782ebda7b81bf0f4a4151d9fa Mon Sep 17 00:00:00 2001 From: Drifter Date: Thu, 8 Jun 2017 08:53:03 +0300 Subject: [PATCH 303/307] =Add dual CAN example --- .../AstraH_CAN_test/AstraH_CAN_test_rpm.ino | 180 ------------------ .../examples/STMdualCAN/STMdualCAN.ino | 123 ++++++++++++ 2 files changed, 123 insertions(+), 180 deletions(-) delete mode 100644 STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test_rpm.ino create mode 100644 STM32F1/libraries/HardwareCAN/examples/STMdualCAN/STMdualCAN.ino diff --git a/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test_rpm.ino b/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test_rpm.ino deleted file mode 100644 index 0ea0b3a29..000000000 --- a/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test_rpm.ino +++ /dev/null @@ -1,180 +0,0 @@ -#include -/* - * Uses STM32duino with Phono patch. Must add 33 and 95 CAN speeds - */ -#define BPIN 0 // there is a buttton -#define SPIN 1 // there is a switch -#define BUZZERPIN 17 // B1 for buzzer - -// Instanciation of CAN interface -HardwareCAN canBus(CAN1_BASE); -CanMsg msg ; -CanMsg *r_msg; - -void CANSetup(void) -{ - CAN_STATUS Stat ; - - // Initialize CAN module - canBus.map(CAN_GPIO_PB8_PB9); // This setting is already wired in the Olimexino-STM32 board - Stat = canBus.begin(CAN_SPEED_33, CAN_MODE_NORMAL); - - canBus.filter(0, 0, 0); - canBus.set_irq_mode(); // Use irq mode (recommended), so the handling of incoming messages - // will be performed at ease in a task or in the loop. The software fifo is 16 cells long, - // allowing at least 15 ms before processing the fifo is needed at 125 kbps - Stat = canBus.status(); - if (Stat != CAN_OK) - /* Your own error processing here */ ; // Initialization failed -} - - -// Send one frame. Parameter is a pointer to a frame structure (above), that has previously been updated with data. -// If no mailbox is available, wait until one becomes empty. There are 3 mailboxes. -CAN_TX_MBX CANsend(CanMsg *pmsg) // Should be moved to the library?! -{ - CAN_TX_MBX mbx; - do - { - mbx = canBus.send(pmsg) ; -#ifdef USE_MULTITASK - vTaskDelay( 1 ) ; // Infinite loops are not multitasking-friendly -#endif - } - while(mbx == CAN_TX_NO_MBX) ; // Waiting outbound frames will eventually be sent, unless there is a CAN bus failure. - return mbx ; -} - -// Send message -// Prepare and send a frame containing some value -void SendCANmessage(long id=0x001, byte dlength=8, byte d0=0x00, byte d1=0x00, byte d2=0x00, byte d3=0x00, byte d4=0x00, byte d5=0x00, byte d6=0x00, byte d7=0x00) -{ - // Initialize the message structure - // A CAN structure includes the following fields: - msg.IDE = CAN_ID_STD; // Indicates a standard identifier ; CAN_ID_EXT would mean this frame uses an extended identifier - msg.RTR = CAN_RTR_DATA; // Indicated this is a data frame, as opposed to a remote frame (would then be CAN_RTR_REMOTE) - msg.ID = id ; // Identifier of the frame : 0-2047 (0-0x3ff) for standard idenfiers; 0-0x1fffffff for extended identifiers - msg.DLC = dlength; // Number of data bytes to follow - - // Prepare frame : send something - msg.Data[0] = d0 ; - msg.Data[1] = d1 ; - msg.Data[2] = d2 ; - msg.Data[3] = d3 ; - msg.Data[4] = d4 ; - msg.Data[5] = d5 ; - msg.Data[6] = d6 ; - msg.Data[7] = d7 ; - - digitalWrite(PC13, LOW); // turn the onboard LED on - CANsend(&msg) ; // Send this frame - delay(180); - digitalWrite(PC13, HIGH); // turn the LED off - delay(100); -} - -// The application program starts here -bool bState = 0; // variable for reading the pushbutton status -bool sState = 0; // variable for reading the switch status -// byte st = 0x31; // buttot 1 on the CD30MP3 - -void setup() { - // put your setup code here, to run once: - CANSetup() ; // Initialize the CAN module and prepare the message structures. - pinMode(PC13, OUTPUT); // LED - pinMode(BPIN, INPUT); // input for hardware button - pinMode(SPIN, INPUT); // input for hardware switch - - Serial.begin(115200); - pinMode(BUZZERPIN, OUTPUT); - digitalWrite(BUZZERPIN, LOW); - - Serial1.begin(115200); - Serial1.println("Hello World!"); -} - -void beep(int times) -{ - for (int i=0;iID) == 0x108 ) { - Serial1.println("Data read at 0x108"); - byte tt = r_msg->Data[0]; - byte xx = r_msg->Data[1]; - byte yy = r_msg->Data[2]; - int rpm = (xx<<6) + (yy>>2); - Serial1.print("rpm = "); - Serial1.println(rpm); - if (tt&0x20){ /* Throttle on? */ - Serial1.println("Throttle ON"); - if (xx > 0x2e) {beep(2); Serial1.println("Shift up!");} - if (xx < 0x1c) {beep(1); Serial1.println("Shift down!");} - } - gotit = 1; - } - canBus.free(); - } - /* --- End check RPMs --- */ - } - else - { - // try to read message and output to serial - CanMsg *r_msg; - if ((r_msg = canBus.recv()) != NULL) - { - Serial1.print(r_msg->ID); - Serial1.print("#"); - Serial1.print(r_msg->Data[0]); - Serial1.print("."); - Serial1.print(r_msg->Data[1]); - Serial1.print("."); - Serial1.print(r_msg->Data[2]); - Serial1.print("."); - Serial1.print(r_msg->Data[3]); - Serial1.print("."); - Serial1.print(r_msg->Data[4]); - Serial1.print("."); - Serial1.print(r_msg->Data[5]); - Serial1.print("."); - Serial1.print(r_msg->Data[6]); - Serial1.print("."); - Serial1.println(r_msg->Data[7]); - } - - canBus.free(); - } - - - -} diff --git a/STM32F1/libraries/HardwareCAN/examples/STMdualCAN/STMdualCAN.ino b/STM32F1/libraries/HardwareCAN/examples/STMdualCAN/STMdualCAN.ino new file mode 100644 index 000000000..cbeaf8962 --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/examples/STMdualCAN/STMdualCAN.ino @@ -0,0 +1,123 @@ +#include +/* + * + */ + +#define T_DELAY 10 +// Instanciation of CAN interface +HardwareCAN canBus(CAN1_BASE); +CanMsg msg ; + + +void CAN_a_33_Setup(void) +{ + + CAN_STATUS Stat ; + afio_init(); // this will restart subsystem and make it work! + canBus.map(CAN_GPIO_PA11_PA12); + Stat = canBus.begin(CAN_SPEED_33, CAN_MODE_NORMAL); + canBus.filter(0, 0, 0); + canBus.set_irq_mode(); + Stat = canBus.status(); + if (Stat != CAN_OK) + {digitalWrite(PC13, LOW); + } +// /* Your own error processing here */ ; // Initialization failed + } + +void CAN_b_95_Setup(void) +{ + CAN_STATUS Stat ; + canBus.map(CAN_GPIO_PB8_PB9); + Stat = canBus.begin(CAN_SPEED_95, CAN_MODE_NORMAL); + canBus.filter(0, 0, 0); + canBus.set_irq_mode(); + Stat = canBus.status(); + if (Stat != CAN_OK) + {digitalWrite(PC13, LOW); + } +// /* Your own error processing here */ ; // Initialization failed +// delay(T_DELAY); +} + + +CAN_TX_MBX CANsend(CanMsg *pmsg) // Should be moved to the library?! +{ + CAN_TX_MBX mbx; + +// do +// { + mbx = canBus.send(pmsg) ; +#ifdef USE_MULTITASK + vTaskDelay( 1 ) ; // Infinite loops are not multitasking-friendly +#endif +// } +// while(mbx == CAN_TX_NO_MBX) ; // Waiting outbound frames will eventually be sent, unless there is a CAN bus failure. + return mbx ; +} + +// Send message +// Prepare and send a frame containing some value +void SendCANmessage(long id=0x001, byte dlength=8, byte d0=0x00, byte d1=0x00, byte d2=0x00, byte d3=0x00, byte d4=0x00, byte d5=0x00, byte d6=0x00, byte d7=0x00) +{ + // Initialize the message structure + // A CAN structure includes the following fields: + msg.IDE = CAN_ID_STD; // Indicates a standard identifier ; CAN_ID_EXT would mean this frame uses an extended identifier + msg.RTR = CAN_RTR_DATA; // Indicated this is a data frame, as opposed to a remote frame (would then be CAN_RTR_REMOTE) + msg.ID = id ; // Identifier of the frame : 0-2047 (0-0x3ff) for standard idenfiers; 0-0x1fffffff for extended identifiers + msg.DLC = dlength; // Number of data bytes to follow + + // Prepare frame : send something + msg.Data[0] = d0 ; + msg.Data[1] = d1 ; + msg.Data[2] = d2 ; + msg.Data[3] = d3 ; + msg.Data[4] = d4 ; + msg.Data[5] = d5 ; + msg.Data[6] = d6 ; + msg.Data[7] = d7 ; + + digitalWrite(PC13, LOW); // turn the onboard LED on + CANsend(&msg) ; // Send this frame + digitalWrite(PC13, HIGH); // turn the LED off + delay(T_DELAY); +} + + +// The application program starts here +byte msgD0 = 0x00; +void setup() { // Initialize the CAN module and prepare the message structures. + pinMode(PC13, OUTPUT); + digitalWrite(PC13, HIGH); + delay(10); + digitalWrite(PC13, LOW); + delay(200); + digitalWrite(PC13, HIGH); + delay(200); + +} + + +void loop() { +/**/ + CAN_a_33_Setup(); + SendCANmessage(0x108,8,0x03,msgD0,msgD0,0x00,msgD0,msgD0,0x00,0x00); + SendCANmessage(0x5e8,8,0x81,msgD0,msgD0,msgD0); + delay(30); +/**/ + CAN_b_95_Setup(); + for (byte msgD1=1;msgD1<3;msgD1++) + { + delay(T_DELAY); + SendCANmessage(0x201,3,0x01,0xff,msgD0); + delay(T_DELAY); + SendCANmessage(0x201,3,0x00,0xff,msgD0); + delay(T_DELAY); + SendCANmessage(0x201,3,0x01,0xff,msgD1); + delay(T_DELAY); + SendCANmessage(0x201,3,0x00,0xff,msgD1); + delay(T_DELAY); + } +/**/ +msgD0++; +} From a54f4cd738bd5057fa00d362a38ed3306f142631 Mon Sep 17 00:00:00 2001 From: megadrifter Date: Wed, 13 Sep 2017 22:59:56 +0300 Subject: [PATCH 304/307] CAN filter corrected by tjb12345 http://www.stm32duino.com/viewtopic.php?p=34279#p34295 --- STM32F1/libraries/HardwareCAN/src/utility/can.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.c b/STM32F1/libraries/HardwareCAN/src/utility/can.c index ad7a7da59..954e6e349 100644 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.c +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.c @@ -279,7 +279,7 @@ CAN_STATUS can_gpio_map(CAN_Port* CANx, CAN_GPIO_MAP map_mode) return status; } -CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2) +CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2, int extID = 0) { uint32 mask = ((uint32)0x00000001) << filter_idx; @@ -291,9 +291,15 @@ CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTE CANx->FS1R |= mask; else CANx->FS1R &= ~mask; - - CANx->sFilterRegister[filter_idx].FR1 = fr1; - CANx->sFilterRegister[filter_idx].FR2 = fr2; + if (extID) { + CANx->sFilterRegister[filter_idx].FR1 = (fr1 << 3) | CAN_ID_EXT; + CANx->sFilterRegister[filter_idx].FR2 = (fr2 << 3) | CAN_ID_EXT; + } + else { + CANx->sFilterRegister[filter_idx].FR1 = (fr1 << 21); + CANx->sFilterRegister[filter_idx].FR2 = (fr2 << 21); + } + if (mode == CAN_FILTER_MASK) CANx->FM1R &= ~mask; @@ -309,7 +315,6 @@ CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTE CANx->FMR &= ~CAN_FMR_FINIT; return CAN_OK; } - /** * @brief Initiates the transmission of a message. * @param CANx: where x can be 1 to select the CAN peripheral. From 5f1da87809159ad2ca18e644f75d1f9e1b8edb02 Mon Sep 17 00:00:00 2001 From: megadrifter Date: Fri, 13 Oct 2017 14:09:31 +0300 Subject: [PATCH 305/307] latest files from Phonog --- .../libraries/HardwareCAN/src/utility/can.c | 65 +- .../HardwareCAN/src/utility/can.c.txt | 591 +++++++++++++++++ .../libraries/HardwareCAN/src/utility/can.h | 1 + .../HardwareCAN/src/utility/can.temp.c | 599 ++++++++++++++++++ 4 files changed, 1237 insertions(+), 19 deletions(-) create mode 100644 STM32F1/libraries/HardwareCAN/src/utility/can.c.txt create mode 100644 STM32F1/libraries/HardwareCAN/src/utility/can.temp.c diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.c b/STM32F1/libraries/HardwareCAN/src/utility/can.c index 954e6e349..324800804 100644 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.c +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.c @@ -1,9 +1,4 @@ -//#include "libmaple.h" #include "can.h" -//#include "rcc.h" -//#include "gpio.h" -//#include "nvic.h" -//#include "usb.h" /** * CAN_interrupts @@ -85,10 +80,10 @@ static const struct can_speed_info can_speed_table[] = { CAN_STATUS status; CanMsg can_rx_queue[CAN_RX_QUEUE_SIZE]; -uint8 can_rx_head; -uint8 can_rx_tail; -uint8 can_rx_count; -uint8 can_rx_lost; +// JMD 2017/07/18 -- added volatile to fix queue problems, removed can_rx_count +volatile uint8 can_rx_head; +volatile uint8 can_rx_tail; +volatile uint8 can_rx_lost; uint8 can_active = 0; /** @@ -149,7 +144,10 @@ CAN_STATUS can_deinit(CAN_Port* CANx) if (CANx == CAN1_BASE) { nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // Disable interrupts + nvic_irq_disable(NVIC_CAN_RX1); nvic_irq_disable(NVIC_USB_HP_CAN_TX); + __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee + __asm volatile( "isb" ); // that the protection against interrupts is effective rcc_reset_dev(RCC_CAN); rcc_clk_disable(RCC_CAN); can_active = 0; @@ -173,11 +171,10 @@ CAN_STATUS can_init(CAN_Port* CANx, uint32 control, uint8 speed) { status = CAN_INIT_FAILED; // default result status // initialize receive message queue - can_rx_head = can_rx_tail = can_rx_count = can_rx_lost = 0; + can_rx_head = can_rx_tail = can_rx_lost = 0; rcc_reset_dev(RCC_USB); //! X893 rcc_clk_disable(RCC_USB); //! X893 -// line_dtr_rts = 0; //! X893 rcc_clk_enable(RCC_AFIO); // enable clocks for AFIO rcc_clk_enable(RCC_CAN); // and CAN rcc_reset_dev(RCC_CAN); // reset CAN interface @@ -196,6 +193,7 @@ CAN_STATUS can_init(CAN_Port* CANx, uint32 control, uint8 speed) CANx->BTR |= (can_speed_table[speed].btr & CAN_TIMING_MASK); nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // Enable interrupts + nvic_irq_enable(NVIC_CAN_RX1); nvic_irq_enable(NVIC_USB_HP_CAN_TX); @@ -453,30 +451,54 @@ void can_cancel(CAN_Port* CANx, uint8 mbx) void can_rx_queue_clear(void) { nvic_irq_disable(NVIC_USB_LP_CAN_RX0); - can_rx_head = can_rx_tail = can_rx_count = can_rx_lost = 0; + nvic_irq_disable(NVIC_CAN_RX1); + __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee + __asm volatile( "isb" ); // that the protection against interrupts is effective + can_rx_head = can_rx_tail = can_rx_lost = 0; // JMD 2017/07/18 nvic_irq_enable(NVIC_USB_LP_CAN_RX0); + nvic_irq_enable(NVIC_CAN_RX1); } +// JMD 2017/07/18 -- changed uint8 can_rx_available(void) { - return can_rx_count; + if ( can_rx_head >= can_rx_tail ) + return can_rx_head - can_rx_tail ; + else + return CAN_RX_QUEUE_SIZE - ( can_rx_tail - can_rx_head ) ; +} + +// JMD 2017/07/18 -- added +uint8 can_frame_lost(void) +{ + if ( can_rx_lost != 0 ) + { + can_rx_lost = 0 ; + return 1 ; + } + return 0 ; + } CanMsg* can_rx_queue_get(void) { - if (can_rx_count == 0) + if (can_rx_head == can_rx_tail) // JMD 2017/07/18 -- changed return NULL; return &(can_rx_queue[can_rx_tail]); } + void can_rx_queue_free(void) { - if (can_rx_count > 0) + if (can_rx_head != can_rx_tail) // JMD 2017/07/18 -- changed { - nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // JMD problème d'atomicité + nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // JMD atomicity problem + nvic_irq_disable(NVIC_CAN_RX1); + __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee + __asm volatile( "isb" ); // that the protection against interrupts is effective can_rx_tail = (can_rx_tail == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_tail + 1); - --can_rx_count; nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // fin JMD problème d'atomicité + nvic_irq_enable(NVIC_CAN_RX1); } } @@ -527,12 +549,11 @@ void can_rx_release(CAN_Port* CANx, CAN_FIFO fifo) void can_rx_read(CAN_Port* CANx, CAN_FIFO fifo) { - if (can_rx_count < CAN_RX_QUEUE_SIZE) // read the message + if (can_rx_available() < CAN_RX_QUEUE_SIZE) // read the message { CanMsg* msg = &can_rx_queue[can_rx_head]; can_read(CANx, fifo, msg); can_rx_head = (can_rx_head == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_head + 1); - can_rx_count++; } else can_rx_lost = 1; // no place in queue, ignore package @@ -552,6 +573,12 @@ uint8 CAN_RX0_IRQ_Handler(void) return can_active; // return CAN active flag to USB handler } +// Addition JMD: the messages stored in fifo1 must also trigger an interrupt. +void __irq_can_rx1(void) +{ + CAN_RX0_IRQ_Handler() ; +} + void USB_HP_CAN_TX_IRQHandler (void) { if (can_active) diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.c.txt b/STM32F1/libraries/HardwareCAN/src/utility/can.c.txt new file mode 100644 index 000000000..64cedac5e --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.c.txt @@ -0,0 +1,591 @@ +//#include "libmaple.h" +#include "can.h" +//#include "rcc.h" +//#include "gpio.h" +//#include "nvic.h" +//#include "usb.h" + +/** + * CAN_interrupts + */ + +#define CAN_IT_RQCP0 ((uint32)0x00000005) /* Request completed mailbox 0 */ +#define CAN_IT_RQCP1 ((uint32)0x00000006) /* Request completed mailbox 1 */ +#define CAN_IT_RQCP2 ((uint32)0x00000007) /* Request completed mailbox 2 */ +#define CAN_IT_TME ((uint32)0x00000001) /* Transmit mailbox empty */ +#define CAN_IT_FMP0 ((uint32)0x00000002) /* FIFO 0 message pending */ +#define CAN_IT_FF0 ((uint32)0x00000004) /* FIFO 0 full */ +#define CAN_IT_FOV0 ((uint32)0x00000008) /* FIFO 0 overrun */ +#define CAN_IT_FMP1 ((uint32)0x00000010) /* FIFO 1 message pending */ +#define CAN_IT_FF1 ((uint32)0x00000020) /* FIFO 1 full */ +#define CAN_IT_FOV1 ((uint32)0x00000040) /* FIFO 1 overrun */ +#define CAN_IT_EWG ((uint32)0x00000100) /* Error warning */ +#define CAN_IT_EPV ((uint32)0x00000200) /* Error passive */ +#define CAN_IT_BOF ((uint32)0x00000400) /* Bus-off */ +#define CAN_IT_LEC ((uint32)0x00000800) /* Last error code */ +#define CAN_IT_ERR ((uint32)0x00008000) /* Error */ +#define CAN_IT_WKU ((uint32)0x00010000) /* Wake-up */ +#define CAN_IT_SLK ((uint32)0x00020000) /* Sleep */ + +/* Time out for INAK bit */ +#define CAN_INAK_TimeOut ((uint32)0x0000FFFF) + +/* Time out for SLAK bit */ +#define CAN_SLAK_TimeOut ((uint32)0x0000FFFF) + +#define CAN_CONTROL_MASK (CAN_MCR_TTCM | CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_NART | CAN_MCR_RFLM | CAN_MCR_TXFP) +#define CAN_TIMING_MASK (CAN_BTR_SJW | CAN_BTR_TS2 | CAN_BTR_TS1 | CAN_BTR_BRP) +#define CAN_MODE_MASK (CAN_BTR_LBKM | CAN_BTR_SILM) + +struct can_speed_info { + const uint32 btr; +}; + +#define CAN_CLOCK (36000000UL / 18UL) + +static const struct can_speed_info can_speed_table[] = { + [CAN_SPEED_125] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 125000UL - 1) + )}, + [CAN_SPEED_250] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 250000UL - 1) + )}, + [CAN_SPEED_500] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 500000UL - 1) + )}, + [CAN_SPEED_1000] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 1000000UL - 1) + )} +}; + +CAN_STATUS status; +CanMsg can_rx_queue[CAN_RX_QUEUE_SIZE]; + +// JMD 2017/07/18 -- added volatile to fix queue problems +volatile uint8 can_rx_head; +volatile uint8 can_rx_tail; +//volatile uint8 can_rx_count; // JMD 2017/07/18 -- redundant +volatile uint8 can_rx_lost; +uint8 can_active = 0; + +/** + * @brief Return last operation status + */ +CAN_STATUS can_status(void) +{ + return status; +} + +/** + * @brief Enter initialization mode + */ +CAN_STATUS can_init_enter(CAN_Port* CANx) +{ + volatile uint32 wait_ack = 0 ; + + status = CAN_OK; + if ((CANx->MSR & CAN_MSR_INAK) == 0) // Check for initialization mode already set + { + CANx->MCR |= CAN_MCR_INRQ; // Request initialisation + + wait_ack = 0; // Wait the acknowledge + while ((wait_ack != CAN_INAK_TimeOut) && ((CANx->MSR & CAN_MSR_INAK) == 0)) + wait_ack++; + if ((CANx->MSR & CAN_MSR_INAK) == 0) + status = CAN_INIT_E_FAILED; // Timeout + } + return status; +} + +/** + * @brief Leave initialization mode + */ +CAN_STATUS can_init_leave(CAN_Port* CANx) +{ + volatile uint32 wait_ack = 0 ; + + status = CAN_OK; + if ((CANx->MSR & CAN_MSR_INAK) != 0) // Check for initialization mode already reset + { + CANx->MCR &= ~CAN_MCR_INRQ; // Clear Request initialization + + wait_ack = 0; // Wait the acknowledge + while ((wait_ack != CAN_INAK_TimeOut) && ((CANx->MSR & CAN_MSR_INAK) != 0)) + wait_ack++; + if ((CANx->MSR & CAN_MSR_INAK) != 0) + status = CAN_INIT_L_FAILED; + } + return status; +} + +/** + * @brief Deinitializes the CAN peripheral registers to their default reset values. + */ +CAN_STATUS can_deinit(CAN_Port* CANx) +{ + if (CANx == CAN1_BASE) + { + nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // Disable interrupts + nvic_irq_disable(NVIC_CAN_RX1); + nvic_irq_disable(NVIC_USB_HP_CAN_TX); + __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee + __asm volatile( "isb" ); // that the protection against interrupts is effective + rcc_reset_dev(RCC_CAN); + rcc_clk_disable(RCC_CAN); + can_active = 0; + } + return (status = CAN_OK); +} + +/** + * @brief Initialize CAN registers + */ +/* + * Bits in control parameter: + * CAN_MCR_TTCM time triggered communication mode + * CAN_MCR_ABOM automatic bus-off management + * CAN_MCR_AWUM automatic wake-up mode + * CAN_MCR_NART no automatic retransmission + * CAN_MCR_RFLM receive FIFO locked mode + * CAN_MCR_TXFP transmit FIFO priority + */ +CAN_STATUS can_init(CAN_Port* CANx, uint32 control, uint8 speed) +{ + status = CAN_INIT_FAILED; // default result status + // initialize receive message queue +// can_rx_head = can_rx_tail = can_rx_count = can_rx_lost = 0; // JMD 2017/07/18 + can_rx_head = can_rx_tail = can_rx_lost = 0; + + rcc_reset_dev(RCC_USB); //! X893 + rcc_clk_disable(RCC_USB); //! X893 +// line_dtr_rts = 0; //! X893 + rcc_clk_enable(RCC_AFIO); // enable clocks for AFIO + rcc_clk_enable(RCC_CAN); // and CAN + rcc_reset_dev(RCC_CAN); // reset CAN interface + + can_active = 1; // set CAN active flag (for interrupt handler + + CANx->MCR &= ~CAN_MCR_SLEEP; // reset CAN sleep mode (default after reset) + + if (can_init_enter(CANx) != CAN_OK) // enter CAN initialization mode + return status; // error, so return + + CANx->MCR &= ~CAN_CONTROL_MASK; // set mode bits + CANx->MCR |= (control & CAN_CONTROL_MASK); + + CANx->BTR &= ~CAN_TIMING_MASK; // Set the bit timing register + CANx->BTR |= (can_speed_table[speed].btr & CAN_TIMING_MASK); + + nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // Enable interrupts + nvic_irq_enable(NVIC_CAN_RX1); + + nvic_irq_enable(NVIC_USB_HP_CAN_TX); + + CANx->IER = (CAN_IER_FMPIE0 | CAN_IER_FMPIE1 | CAN_IER_TMEIE); + + if (can_init_leave(CANx) == CAN_OK) + { + while (!(CANx->TSR & CAN_TSR_TME0)); // Transmit mailbox 0 is empty + while (!(CANx->TSR & CAN_TSR_TME1)); // Transmit mailbox 0 is empty + while (!(CANx->TSR & CAN_TSR_TME2)); // Transmit mailbox 0 is empty + } + return status; +} + +/** + * @brief Set timing calues (CAN_BTR) + */ +CAN_STATUS can_set_timing(CAN_Port* CANx, uint32 timing) +{ + if (can_init_enter(CANx) == CAN_OK) + { + CANx->BTR = ((CANx->BTR & ~CAN_TIMING_MASK) | (timing & CAN_TIMING_MASK)); + can_init_leave(CANx); + } + return status; +} + +/** + * @brief Set CAN mode + * @param CANx pointer to CAN port + * @param mode CAN mode + */ +CAN_STATUS can_set_mode(CAN_Port* CANx, uint32 mode) +{ + if (can_init_enter(CANx) == CAN_OK) + { + CANx->BTR &= ~CAN_MODE_MASK; + CANx->BTR |= (mode & CAN_MODE_MASK); + can_init_leave(CANx); + } + return status; +} + +/** + * @brief Set CAN to GPIO mapping + */ +CAN_STATUS can_gpio_map(CAN_Port* CANx, CAN_GPIO_MAP map_mode) +{ + rcc_clk_enable(RCC_AFIO); + + status = CAN_INIT_FAILED; + if( CANx == CAN1_BASE) + { + switch(map_mode) + { + case CAN_GPIO_PB8_PB9: + rcc_clk_enable(RCC_GPIOB); + afio_remap(AFIO_MAPR_CAN_REMAP_PB8_PB9); + gpio_set_mode(GPIOB, 8, GPIO_INPUT_FLOATING); + gpio_set_mode(GPIOB, 9, GPIO_AF_OUTPUT_PP); + break; +#if NR_GPIO_PORTS >= 4 + case CAN_GPIO_PD0_PD1: + rcc_clk_enable(RCC_GPIOD); + afio_remap(AFIO_MAPR_CAN_REMAP_PD0_PD1); + gpio_set_mode(GPIOD, 0, GPIO_INPUT_FLOATING); + gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); + break; +#endif + default: + return status; + } + status = CAN_OK; + } + return status; +} + +CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2) +{ + uint32 mask = ((uint32)0x00000001) << filter_idx; + + CANx->FMR |= CAN_FMR_FINIT; // Initialization mode for the filter + CANx->FA1R &= ~mask; // Deactivation filter + + + if (scale == CAN_FILTER_32BIT) + CANx->FS1R |= mask; + else + CANx->FS1R &= ~mask; + + CANx->sFilterRegister[filter_idx].FR1 = fr1; + CANx->sFilterRegister[filter_idx].FR2 = fr2; + + if (mode == CAN_FILTER_MASK) + CANx->FM1R &= ~mask; + else + CANx->FM1R |= mask; + + if (fifo == CAN_FIFO0) + CANx->FFA1R &= ~mask; + else + CANx->FFA1R |= mask; + + CANx->FA1R |= mask; + CANx->FMR &= ~CAN_FMR_FINIT; + return CAN_OK; +} + + +/** + * @brief Initiates the transmission of a message. + * @param CANx: where x can be 1 to select the CAN peripheral. + * @param msg: pointer to a structure which contains CAN Id, CAN DLC and CAN datas. + * @retval : The number of the mailbox that is used for transmission or CAN_NO_MB if there is no empty mailbox. + */ +CAN_TX_MBX can_transmit(CAN_Port* CANx, CanMsg* msg) +{ + CAN_TX_MBX mbx; + uint32 data; + + /* Select one empty transmit mailbox */ + if (CANx->TSR & CAN_TSR_TME0) + mbx = CAN_TX_MBX0; + else if (CANx->TSR & CAN_TSR_TME1) + mbx = CAN_TX_MBX1; + else if (CANx->TSR & CAN_TSR_TME2) + mbx = CAN_TX_MBX2; + else + { + status = CAN_NO_MB; + return CAN_TX_NO_MBX; + } + + /* Set up the Id */ + if (msg->IDE == CAN_ID_STD) + data = (msg->ID << 21); + else + data = (msg->ID << 3) | CAN_ID_EXT; + + data |= ((uint32)msg->RTR); + + /* Set up the DLC */ + CANx->sTxMailBox[mbx].TDTR = (uint32)(msg->DLC & 0x0F); + + /* Set up the data field */ + CANx->sTxMailBox[mbx].TDLR = ( + ((uint32)msg->Data[3] << 24) | + ((uint32)msg->Data[2] << 16) | + ((uint32)msg->Data[1] << 8) | + ((uint32)msg->Data[0]) + ); + CANx->sTxMailBox[mbx].TDHR = ( + ((uint32)msg->Data[7] << 24) | + ((uint32)msg->Data[6] << 16) | + ((uint32)msg->Data[5] << 8) | + ((uint32)msg->Data[4]) + ); + /* Request transmission */ + CANx->sTxMailBox[mbx].TIR = (data | CAN_TMIDxR_TXRQ); + status = CAN_OK; + + return mbx; +} + +/** + * Checks the transmission of a message. + * @param CANx: where x can be 1 to select the CAN peripheral. + * @param mbx: the number of the mailbox that is used for transmission. + * @retval : CAN_TX_OK if the CAN driver transmits the message, CAN_TX_FAILED in an other case. + */ +CAN_STATUS can_tx_status(CAN_Port* CANx, CAN_TX_MBX mbx) +{ + /* RQCP, TXOK and TME bits */ + uint8 state = 0; + + switch (mbx) + { + case CAN_TX_MBX0: + state |= (uint8)((CANx->TSR & CAN_TSR_RQCP0) << 2); + state |= (uint8)((CANx->TSR & CAN_TSR_TXOK0) >> 0); + state |= (uint8)((CANx->TSR & CAN_TSR_TME0) >> 26); + break; + case CAN_TX_MBX1: + state |= (uint8)((CANx->TSR & CAN_TSR_RQCP1) >> 6); + state |= (uint8)((CANx->TSR & CAN_TSR_TXOK1) >> 8); + state |= (uint8)((CANx->TSR & CAN_TSR_TME1) >> 27); + break; + case CAN_TX_MBX2: + state |= (uint8)((CANx->TSR & CAN_TSR_RQCP2) >> 14); + state |= (uint8)((CANx->TSR & CAN_TSR_TXOK2) >> 16); + state |= (uint8)((CANx->TSR & CAN_TSR_TME2) >> 28); + break; + default: + status = CAN_TX_FAILED; + return status; + } + + // state = RQCP TXOK TME + switch (state) + { + /* transmit pending */ + case 0x0: + status = CAN_TX_PENDING; + break; + /* transmit failed */ + case 0x5: + status = CAN_TX_FAILED; + break; + /* transmit succedeed */ + case 0x7: + status = CAN_OK; + break; + default: + status = CAN_TX_FAILED; + break; + } + return status; +} + +/** + * @brief Cancels a transmit request. + * @param CANx: where x can be 1 to select the CAN peripheral. + * @param mbx: Mailbox number. + * @retval : None. + */ +void can_cancel(CAN_Port* CANx, uint8 mbx) +{ + /* abort transmission */ + switch (mbx) + { + case 0: + CANx->TSR |= CAN_TSR_ABRQ0; + break; + case 1: + CANx->TSR |= CAN_TSR_ABRQ1; + break; + case 2: + CANx->TSR |= CAN_TSR_ABRQ2; + break; + default: + break; + } +} + +void can_rx_queue_clear(void) +{ + nvic_irq_disable(NVIC_USB_LP_CAN_RX0); + nvic_irq_disable(NVIC_CAN_RX1); + __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee + __asm volatile( "isb" ); // that the protection against interrupts is effective +// can_rx_head = can_rx_tail = can_rx_count = can_rx_lost = 0; // JMD 2017/07/18 + can_rx_head = can_rx_tail = can_rx_lost = 0; // JMD 2017/07/18 + nvic_irq_enable(NVIC_USB_LP_CAN_RX0); + nvic_irq_enable(NVIC_CAN_RX1); +} + +// JMD 2017/07/18 -- removed +/* +uint8 can_rx_available(void) +{ + return can_rx_count; +} +*/ + +// JMD 2017/07/18 -- added +uint8 can_rx_available(void) +{ + if ( can_rx_head >= can_rx_tail ) + return can_rx_head - can_rx_tail ; + else + return CAN_RX_QUEUE_SIZE - ( can_rx_tail - can_rx_head ) ; +} + +// JMD 2017/07/18 -- added +uint8 can_frame_lost(void) +{ + if ( can_rx_lost != 0 ) + { + can_rx_lost = 0 ; + return 1 ; + } + return 0 ; + +} + +CanMsg* can_rx_queue_get(void) +{ + if (can_rx_head == can_rx_tail) // JMD 2017/07/18 -- changed + return NULL; + return &(can_rx_queue[can_rx_tail]); +} + + +void can_rx_queue_free(void) +{ + if (can_rx_head != can_rx_tail) // JMD 2017/07/18 -- changed + { + nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // JMD atomicity problem + nvic_irq_disable(NVIC_CAN_RX1); + __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee + __asm volatile( "isb" ); // that the protection against interrupts is effective + can_rx_tail = (can_rx_tail == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_tail + 1); +// --can_rx_count; // JMD 2017/07/18 -- removed + nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // fin JMD problème d'atomicité + nvic_irq_enable(NVIC_CAN_RX1); + } +} + +CanMsg* can_read(CAN_Port* CANx, CAN_FIFO fifo, CanMsg* msg) +{ + uint32 data = CANx->sFIFOMailBox[fifo].RIR; + + /* Get the Id */ + if (data & CAN_ID_EXT) + { + msg->ID = 0x1FFFFFFF & (data >> 3); + msg->IDE = (uint8)CAN_ID_EXT; + } + else + { + msg->ID = 0x000007FF & (data >> 21); + msg->IDE = (uint8)CAN_ID_STD; + } + + msg->RTR = (uint8)(CAN_RTR_REMOTE & data); + msg->DLC = (uint8)(0x0F & CANx->sFIFOMailBox[fifo].RDTR); + msg->FMI = (uint8)(0xFF & (CANx->sFIFOMailBox[fifo].RDTR >> 8)); + + /* Get the data field */ + data = CANx->sFIFOMailBox[fifo].RDLR; + uint8* p = msg->Data; + *p++ = (uint8)0xFF & data; + *p++ = (uint8)0xFF & (data >> 8); + *p++ = (uint8)0xFF & (data >> 16); + *p++ = (uint8)0xFF & (data >> 24); + + data = CANx->sFIFOMailBox[fifo].RDHR; + *p++ = (uint8)0xFF & data; + *p++ = (uint8)0xFF & (data >> 8); + *p++ = (uint8)0xFF & (data >> 16); + *p++ = (uint8)0xFF & (data >> 24); + + return msg; +} + +void can_rx_release(CAN_Port* CANx, CAN_FIFO fifo) +{ + if (fifo == CAN_FIFO0) + CANx->RF0R |= (CAN_RF0R_RFOM0); // Release FIFO0 + else + CANx->RF1R |= (CAN_RF1R_RFOM1); // Release FIFO1 +} + +void can_rx_read(CAN_Port* CANx, CAN_FIFO fifo) +{ +// if (can_rx_count < CAN_RX_QUEUE_SIZE) // JMD 2017/07/18 + if (can_rx_available() < CAN_RX_QUEUE_SIZE) // read the message + { + CanMsg* msg = &can_rx_queue[can_rx_head]; + can_read(CANx, fifo, msg); + can_rx_head = (can_rx_head == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_head + 1); +// can_rx_count++; // JMD 2017/07/18 -- removed + } + else + can_rx_lost = 1; // no place in queue, ignore package + + can_rx_release(CANx, fifo); +} + +uint8 CAN_RX0_IRQ_Handler(void) +{ + if (can_active) + { + while ((CAN1_BASE->RF0R & CAN_RF0R_FMP0) != 0) + can_rx_read(CAN1_BASE, CAN_FIFO0); // message pending FIFO0 + while ((CAN1_BASE->RF1R & CAN_RF1R_FMP1) != 0) + can_rx_read(CAN1_BASE, CAN_FIFO1); // message pending FIFO1 + } + return can_active; // return CAN active flag to USB handler +} + +// Addition JMD: the messages stored in fifo1 must also trigger an interrupt. +void __irq_can_rx1(void) +{ + CAN_RX0_IRQ_Handler() ; +} + +void USB_HP_CAN_TX_IRQHandler (void) +{ + if (can_active) + { + if (CAN1_BASE->TSR & CAN_TSR_RQCP0) + CAN1_BASE->TSR |= CAN_TSR_RQCP0; // reset request complete mbx 0 + if (CAN1_BASE->TSR & CAN_TSR_RQCP1) + CAN1_BASE->TSR |= CAN_TSR_RQCP1; // reset request complete mbx 1 + if (CAN1_BASE->TSR & CAN_TSR_RQCP2) + CAN1_BASE->TSR |= CAN_TSR_RQCP2; // reset request complete mbx 2 + } +} diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.h b/STM32F1/libraries/HardwareCAN/src/utility/can.h index 19506ea85..1f2966243 100644 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.h +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.h @@ -288,6 +288,7 @@ CAN_STATUS can_status(void); void can_cancel(CAN_Port* CANx, uint8 mbx); void can_rx_queue_clear(void); uint8 can_rx_available(void); +uint8 can_frame_lost(void); CanMsg* can_rx_queue_get(void); CanMsg* can_read(CAN_Port* CANx, CAN_FIFO fifo, CanMsg* msg); void can_rx_release(CAN_Port* CANx, CAN_FIFO fifo); diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.temp.c b/STM32F1/libraries/HardwareCAN/src/utility/can.temp.c new file mode 100644 index 000000000..e9b270c81 --- /dev/null +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.temp.c @@ -0,0 +1,599 @@ +Skip to content +Features +Business +Explore +Marketplace +Pricing +This repository +Search +Sign in or Sign up + Watch 3 Star 2 Fork 363 megadrifter/Arduino_STM32 +forked from Phonog/Arduino_STM32 + Code Pull requests 0 Projects 0 Insights +Branch: megadrifter-GM… Find file Copy pathArduino_STM32/STM32F1/libraries/HardwareCAN/src/utility/can.c +a9807d2 9 days ago +@megadrifter megadrifter CAN filter corrected by tjb12345 +2 contributors @megadrifter @Phonog +RawBlameHistory +567 lines (500 sloc) 14.3 KB +#include "can.h" + +/** + * CAN_interrupts + */ + +#define CAN_IT_RQCP0 ((uint32)0x00000005) /* Request completed mailbox 0 */ +#define CAN_IT_RQCP1 ((uint32)0x00000006) /* Request completed mailbox 1 */ +#define CAN_IT_RQCP2 ((uint32)0x00000007) /* Request completed mailbox 2 */ +#define CAN_IT_TME ((uint32)0x00000001) /* Transmit mailbox empty */ +#define CAN_IT_FMP0 ((uint32)0x00000002) /* FIFO 0 message pending */ +#define CAN_IT_FF0 ((uint32)0x00000004) /* FIFO 0 full */ +#define CAN_IT_FOV0 ((uint32)0x00000008) /* FIFO 0 overrun */ +#define CAN_IT_FMP1 ((uint32)0x00000010) /* FIFO 1 message pending */ +#define CAN_IT_FF1 ((uint32)0x00000020) /* FIFO 1 full */ +#define CAN_IT_FOV1 ((uint32)0x00000040) /* FIFO 1 overrun */ +#define CAN_IT_EWG ((uint32)0x00000100) /* Error warning */ +#define CAN_IT_EPV ((uint32)0x00000200) /* Error passive */ +#define CAN_IT_BOF ((uint32)0x00000400) /* Bus-off */ +#define CAN_IT_LEC ((uint32)0x00000800) /* Last error code */ +#define CAN_IT_ERR ((uint32)0x00008000) /* Error */ +#define CAN_IT_WKU ((uint32)0x00010000) /* Wake-up */ +#define CAN_IT_SLK ((uint32)0x00020000) /* Sleep */ + +/* Time out for INAK bit */ +#define CAN_INAK_TimeOut ((uint32)0x0000FFFF) + +/* Time out for SLAK bit */ +#define CAN_SLAK_TimeOut ((uint32)0x0000FFFF) + +#define CAN_CONTROL_MASK (CAN_MCR_TTCM | CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_NART | CAN_MCR_RFLM | CAN_MCR_TXFP) +#define CAN_TIMING_MASK (CAN_BTR_SJW | CAN_BTR_TS2 | CAN_BTR_TS1 | CAN_BTR_BRP) +#define CAN_MODE_MASK (CAN_BTR_LBKM | CAN_BTR_SILM) + +struct can_speed_info { + const uint32 btr; +}; + +#define CAN_CLOCK (36000000UL / 18UL) + +static const struct can_speed_info can_speed_table[] = { + [CAN_SPEED_125] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 125000UL - 1) + )}, + [CAN_SPEED_250] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 250000UL - 1) + )}, + [CAN_SPEED_500] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 500000UL - 1) + )}, + [CAN_SPEED_1000] = { .btr = ( + (( 4-1) << CAN_BTR_SJW_POS) | + ((12-1) << CAN_BTR_TS1_POS) | + (( 5-1) << CAN_BTR_TS2_POS) | + (CAN_CLOCK / 1000000UL - 1) + )} +}; + +CAN_STATUS status; +CanMsg can_rx_queue[CAN_RX_QUEUE_SIZE]; + +// JMD 2017/07/18 -- added volatile to fix queue problems, removed can_rx_count +volatile uint8 can_rx_head; +volatile uint8 can_rx_tail; +volatile uint8 can_rx_lost; +uint8 can_active = 0; + +/** + * @brief Return last operation status + */ +CAN_STATUS can_status(void) +{ + return status; +} + +/** + * @brief Enter initialization mode + */ +CAN_STATUS can_init_enter(CAN_Port* CANx) +{ + volatile uint32 wait_ack = 0 ; + + status = CAN_OK; + if ((CANx->MSR & CAN_MSR_INAK) == 0) // Check for initialization mode already set + { + CANx->MCR |= CAN_MCR_INRQ; // Request initialisation + + wait_ack = 0; // Wait the acknowledge + while ((wait_ack != CAN_INAK_TimeOut) && ((CANx->MSR & CAN_MSR_INAK) == 0)) + wait_ack++; + if ((CANx->MSR & CAN_MSR_INAK) == 0) + status = CAN_INIT_E_FAILED; // Timeout + } + return status; +} + +/** + * @brief Leave initialization mode + */ +CAN_STATUS can_init_leave(CAN_Port* CANx) +{ + volatile uint32 wait_ack = 0 ; + + status = CAN_OK; + if ((CANx->MSR & CAN_MSR_INAK) != 0) // Check for initialization mode already reset + { + CANx->MCR &= ~CAN_MCR_INRQ; // Clear Request initialization + + wait_ack = 0; // Wait the acknowledge + while ((wait_ack != CAN_INAK_TimeOut) && ((CANx->MSR & CAN_MSR_INAK) != 0)) + wait_ack++; + if ((CANx->MSR & CAN_MSR_INAK) != 0) + status = CAN_INIT_L_FAILED; + } + return status; +} + +/** + * @brief Deinitializes the CAN peripheral registers to their default reset values. + */ +CAN_STATUS can_deinit(CAN_Port* CANx) +{ + if (CANx == CAN1_BASE) + { + nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // Disable interrupts + nvic_irq_disable(NVIC_CAN_RX1); + nvic_irq_disable(NVIC_USB_HP_CAN_TX); + __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee + __asm volatile( "isb" ); // that the protection against interrupts is effective + rcc_reset_dev(RCC_CAN); + rcc_clk_disable(RCC_CAN); + can_active = 0; + } + return (status = CAN_OK); +} + +/** + * @brief Initialize CAN registers + */ +/* + * Bits in control parameter: + * CAN_MCR_TTCM time triggered communication mode + * CAN_MCR_ABOM automatic bus-off management + * CAN_MCR_AWUM automatic wake-up mode + * CAN_MCR_NART no automatic retransmission + * CAN_MCR_RFLM receive FIFO locked mode + * CAN_MCR_TXFP transmit FIFO priority + */ +CAN_STATUS can_init(CAN_Port* CANx, uint32 control, uint8 speed) +{ + status = CAN_INIT_FAILED; // default result status + // initialize receive message queue + can_rx_head = can_rx_tail = can_rx_lost = 0; + + rcc_reset_dev(RCC_USB); //! X893 + rcc_clk_disable(RCC_USB); //! X893 + rcc_clk_enable(RCC_AFIO); // enable clocks for AFIO + rcc_clk_enable(RCC_CAN); // and CAN + rcc_reset_dev(RCC_CAN); // reset CAN interface + + can_active = 1; // set CAN active flag (for interrupt handler + + CANx->MCR &= ~CAN_MCR_SLEEP; // reset CAN sleep mode (default after reset) + + if (can_init_enter(CANx) != CAN_OK) // enter CAN initialization mode + return status; // error, so return + + CANx->MCR &= ~CAN_CONTROL_MASK; // set mode bits + CANx->MCR |= (control & CAN_CONTROL_MASK); + + CANx->BTR &= ~CAN_TIMING_MASK; // Set the bit timing register + CANx->BTR |= (can_speed_table[speed].btr & CAN_TIMING_MASK); + + nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // Enable interrupts + nvic_irq_enable(NVIC_CAN_RX1); + + nvic_irq_enable(NVIC_USB_HP_CAN_TX); + + CANx->IER = (CAN_IER_FMPIE0 | CAN_IER_FMPIE1 | CAN_IER_TMEIE); + + if (can_init_leave(CANx) == CAN_OK) + { + while (!(CANx->TSR & CAN_TSR_TME0)); // Transmit mailbox 0 is empty + while (!(CANx->TSR & CAN_TSR_TME1)); // Transmit mailbox 0 is empty + while (!(CANx->TSR & CAN_TSR_TME2)); // Transmit mailbox 0 is empty + } + return status; +} + +/** + * @brief Set timing calues (CAN_BTR) + */ +CAN_STATUS can_set_timing(CAN_Port* CANx, uint32 timing) +{ + if (can_init_enter(CANx) == CAN_OK) + { + CANx->BTR = ((CANx->BTR & ~CAN_TIMING_MASK) | (timing & CAN_TIMING_MASK)); + can_init_leave(CANx); + } + return status; +} + +/** + * @brief Set CAN mode + * @param CANx pointer to CAN port + * @param mode CAN mode + */ +CAN_STATUS can_set_mode(CAN_Port* CANx, uint32 mode) +{ + if (can_init_enter(CANx) == CAN_OK) + { + CANx->BTR &= ~CAN_MODE_MASK; + CANx->BTR |= (mode & CAN_MODE_MASK); + can_init_leave(CANx); + } + return status; +} + +/** + * @brief Set CAN to GPIO mapping + */ +CAN_STATUS can_gpio_map(CAN_Port* CANx, CAN_GPIO_MAP map_mode) +{ + rcc_clk_enable(RCC_AFIO); + + status = CAN_INIT_FAILED; + if( CANx == CAN1_BASE) + { + switch(map_mode) + { + case CAN_GPIO_PB8_PB9: + rcc_clk_enable(RCC_GPIOB); + afio_remap(AFIO_MAPR_CAN_REMAP_PB8_PB9); + gpio_set_mode(GPIOB, 8, GPIO_INPUT_FLOATING); + gpio_set_mode(GPIOB, 9, GPIO_AF_OUTPUT_PP); + break; + case CAN_GPIO_PA11_PA12: + rcc_clk_enable(RCC_GPIOA); + afio_remap(AFIO_MAPR_CAN_REMAP_NONE); + gpio_set_mode(GPIOA, 11, GPIO_INPUT_FLOATING); + gpio_set_mode(GPIOA, 12, GPIO_AF_OUTPUT_PP); + break; +#if NR_GPIO_PORTS >= 4 + case CAN_GPIO_PD0_PD1: + rcc_clk_enable(RCC_GPIOD); + afio_remap(AFIO_MAPR_CAN_REMAP_PD0_PD1); + gpio_set_mode(GPIOD, 0, GPIO_INPUT_FLOATING); + gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); + break; +#endif + default: + return status; + } + status = CAN_OK; + } + return status; +} + +CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2, int extID = 0) +{ + uint32 mask = ((uint32)0x00000001) << filter_idx; + + CANx->FMR |= CAN_FMR_FINIT; // Initialization mode for the filter + CANx->FA1R &= ~mask; // Deactivation filter + + + if (scale == CAN_FILTER_32BIT) + CANx->FS1R |= mask; + else + CANx->FS1R &= ~mask; + if (extID) { + CANx->sFilterRegister[filter_idx].FR1 = (fr1 << 3) | CAN_ID_EXT; + CANx->sFilterRegister[filter_idx].FR2 = (fr2 << 3) | CAN_ID_EXT; + } + else { + CANx->sFilterRegister[filter_idx].FR1 = (fr1 << 21); + CANx->sFilterRegister[filter_idx].FR2 = (fr2 << 21); + } + if (mode == CAN_FILTER_MASK) + CANx->FM1R &= ~mask; + else + CANx->FM1R |= mask; + + if (fifo == CAN_FIFO0) + CANx->FFA1R &= ~mask; + else + CANx->FFA1R |= mask; + + CANx->FA1R |= mask; + CANx->FMR &= ~CAN_FMR_FINIT; + return CAN_OK; +} + + +/** + * @brief Initiates the transmission of a message. + * @param CANx: where x can be 1 to select the CAN peripheral. + * @param msg: pointer to a structure which contains CAN Id, CAN DLC and CAN datas. + * @retval : The number of the mailbox that is used for transmission or CAN_NO_MB if there is no empty mailbox. + */ +CAN_TX_MBX can_transmit(CAN_Port* CANx, CanMsg* msg) +{ + CAN_TX_MBX mbx; + uint32 data; + + /* Select one empty transmit mailbox */ + if (CANx->TSR & CAN_TSR_TME0) + mbx = CAN_TX_MBX0; + else if (CANx->TSR & CAN_TSR_TME1) + mbx = CAN_TX_MBX1; + else if (CANx->TSR & CAN_TSR_TME2) + mbx = CAN_TX_MBX2; + else + { + status = CAN_NO_MB; + return CAN_TX_NO_MBX; + } + + /* Set up the Id */ + if (msg->IDE == CAN_ID_STD) + data = (msg->ID << 21); + else + data = (msg->ID << 3) | CAN_ID_EXT; + + data |= ((uint32)msg->RTR); + + /* Set up the DLC */ + CANx->sTxMailBox[mbx].TDTR = (uint32)(msg->DLC & 0x0F); + + /* Set up the data field */ + CANx->sTxMailBox[mbx].TDLR = ( + ((uint32)msg->Data[3] << 24) | + ((uint32)msg->Data[2] << 16) | + ((uint32)msg->Data[1] << 8) | + ((uint32)msg->Data[0]) + ); + CANx->sTxMailBox[mbx].TDHR = ( + ((uint32)msg->Data[7] << 24) | + ((uint32)msg->Data[6] << 16) | + ((uint32)msg->Data[5] << 8) | + ((uint32)msg->Data[4]) + ); + /* Request transmission */ + CANx->sTxMailBox[mbx].TIR = (data | CAN_TMIDxR_TXRQ); + status = CAN_OK; + + return mbx; +} + +/** + * Checks the transmission of a message. + * @param CANx: where x can be 1 to select the CAN peripheral. + * @param mbx: the number of the mailbox that is used for transmission. + * @retval : CAN_TX_OK if the CAN driver transmits the message, CAN_TX_FAILED in an other case. + */ +CAN_STATUS can_tx_status(CAN_Port* CANx, CAN_TX_MBX mbx) +{ + /* RQCP, TXOK and TME bits */ + uint8 state = 0; + + switch (mbx) + { + case CAN_TX_MBX0: + state |= (uint8)((CANx->TSR & CAN_TSR_RQCP0) << 2); + state |= (uint8)((CANx->TSR & CAN_TSR_TXOK0) >> 0); + state |= (uint8)((CANx->TSR & CAN_TSR_TME0) >> 26); + break; + case CAN_TX_MBX1: + state |= (uint8)((CANx->TSR & CAN_TSR_RQCP1) >> 6); + state |= (uint8)((CANx->TSR & CAN_TSR_TXOK1) >> 8); + state |= (uint8)((CANx->TSR & CAN_TSR_TME1) >> 27); + break; + case CAN_TX_MBX2: + state |= (uint8)((CANx->TSR & CAN_TSR_RQCP2) >> 14); + state |= (uint8)((CANx->TSR & CAN_TSR_TXOK2) >> 16); + state |= (uint8)((CANx->TSR & CAN_TSR_TME2) >> 28); + break; + default: + status = CAN_TX_FAILED; + return status; + } + + // state = RQCP TXOK TME + switch (state) + { + /* transmit pending */ + case 0x0: + status = CAN_TX_PENDING; + break; + /* transmit failed */ + case 0x5: + status = CAN_TX_FAILED; + break; + /* transmit succedeed */ + case 0x7: + status = CAN_OK; + break; + default: + status = CAN_TX_FAILED; + break; + } + return status; +} + +/** + * @brief Cancels a transmit request. + * @param CANx: where x can be 1 to select the CAN peripheral. + * @param mbx: Mailbox number. + * @retval : None. + */ +void can_cancel(CAN_Port* CANx, uint8 mbx) +{ + /* abort transmission */ + switch (mbx) + { + case 0: + CANx->TSR |= CAN_TSR_ABRQ0; + break; + case 1: + CANx->TSR |= CAN_TSR_ABRQ1; + break; + case 2: + CANx->TSR |= CAN_TSR_ABRQ2; + break; + default: + break; + } +} + +void can_rx_queue_clear(void) +{ + nvic_irq_disable(NVIC_USB_LP_CAN_RX0); + nvic_irq_disable(NVIC_CAN_RX1); + __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee + __asm volatile( "isb" ); // that the protection against interrupts is effective + can_rx_head = can_rx_tail = can_rx_lost = 0; // JMD 2017/07/18 + nvic_irq_enable(NVIC_USB_LP_CAN_RX0); + nvic_irq_enable(NVIC_CAN_RX1); +} + +// JMD 2017/07/18 -- changed +uint8 can_rx_available(void) +{ + if ( can_rx_head >= can_rx_tail ) + return can_rx_head - can_rx_tail ; + else + return CAN_RX_QUEUE_SIZE - ( can_rx_tail - can_rx_head ) ; +} + +// JMD 2017/07/18 -- added +uint8 can_frame_lost(void) +{ + if ( can_rx_lost != 0 ) + { + can_rx_lost = 0 ; + return 1 ; + } + return 0 ; + +} + +CanMsg* can_rx_queue_get(void) +{ + if (can_rx_head == can_rx_tail) // JMD 2017/07/18 -- changed + return NULL; + return &(can_rx_queue[can_rx_tail]); +} + + +void can_rx_queue_free(void) +{ + if (can_rx_head != can_rx_tail) // JMD 2017/07/18 -- changed + { + nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // JMD atomicity problem + nvic_irq_disable(NVIC_CAN_RX1); + __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee + __asm volatile( "isb" ); // that the protection against interrupts is effective + can_rx_tail = (can_rx_tail == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_tail + 1); + nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // fin JMD problème d'atomicité + nvic_irq_enable(NVIC_CAN_RX1); + } +} + +CanMsg* can_read(CAN_Port* CANx, CAN_FIFO fifo, CanMsg* msg) +{ + uint32 data = CANx->sFIFOMailBox[fifo].RIR; + + /* Get the Id */ + if (data & CAN_ID_EXT) + { + msg->ID = 0x1FFFFFFF & (data >> 3); + msg->IDE = (uint8)CAN_ID_EXT; + } + else + { + msg->ID = 0x000007FF & (data >> 21); + msg->IDE = (uint8)CAN_ID_STD; + } + + msg->RTR = (uint8)(CAN_RTR_REMOTE & data); + msg->DLC = (uint8)(0x0F & CANx->sFIFOMailBox[fifo].RDTR); + msg->FMI = (uint8)(0xFF & (CANx->sFIFOMailBox[fifo].RDTR >> 8)); + + /* Get the data field */ + data = CANx->sFIFOMailBox[fifo].RDLR; + uint8* p = msg->Data; + *p++ = (uint8)0xFF & data; + *p++ = (uint8)0xFF & (data >> 8); + *p++ = (uint8)0xFF & (data >> 16); + *p++ = (uint8)0xFF & (data >> 24); + + data = CANx->sFIFOMailBox[fifo].RDHR; + *p++ = (uint8)0xFF & data; + *p++ = (uint8)0xFF & (data >> 8); + *p++ = (uint8)0xFF & (data >> 16); + *p++ = (uint8)0xFF & (data >> 24); + + return msg; +} + +void can_rx_release(CAN_Port* CANx, CAN_FIFO fifo) +{ + if (fifo == CAN_FIFO0) + CANx->RF0R |= (CAN_RF0R_RFOM0); // Release FIFO0 + else + CANx->RF1R |= (CAN_RF1R_RFOM1); // Release FIFO1 +} + +void can_rx_read(CAN_Port* CANx, CAN_FIFO fifo) +{ + if (can_rx_available() < CAN_RX_QUEUE_SIZE) // read the message + { + CanMsg* msg = &can_rx_queue[can_rx_head]; + can_read(CANx, fifo, msg); + can_rx_head = (can_rx_head == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_head + 1); + } + else + can_rx_lost = 1; // no place in queue, ignore package + + can_rx_release(CANx, fifo); +} + +uint8 CAN_RX0_IRQ_Handler(void) +{ + if (can_active) + { + while ((CAN1_BASE->RF0R & CAN_RF0R_FMP0) != 0) + can_rx_read(CAN1_BASE, CAN_FIFO0); // message pending FIFO0 + while ((CAN1_BASE->RF1R & CAN_RF1R_FMP1) != 0) + can_rx_read(CAN1_BASE, CAN_FIFO1); // message pending FIFO1 + } + return can_active; // return CAN active flag to USB handler +} + +// Addition JMD: the messages stored in fifo1 must also trigger an interrupt. +void __irq_can_rx1(void) +{ + CAN_RX0_IRQ_Handler() ; +} + +void USB_HP_CAN_TX_IRQHandler (void) +{ + if (can_active) + { + if (CAN1_BASE->TSR & CAN_TSR_RQCP0) + CAN1_BASE->TSR |= CAN_TSR_RQCP0; // reset request complete mbx 0 + if (CAN1_BASE->TSR & CAN_TSR_RQCP1) + CAN1_BASE->TSR |= CAN_TSR_RQCP1; // reset request complete mbx 1 + if (CAN1_BASE->TSR & CAN_TSR_RQCP2) + CAN1_BASE->TSR |= CAN_TSR_RQCP2; // reset request complete mbx 2 + } +} From 0ade473ecee8489d5634f5d3b2a6f96b1a9dee3f Mon Sep 17 00:00:00 2001 From: megadrifter Date: Fri, 13 Oct 2017 14:11:25 +0300 Subject: [PATCH 306/307] latest files from Phonog --- STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp | 5 +++++ STM32F1/libraries/HardwareCAN/src/HardwareCAN.h | 1 + 2 files changed, 6 insertions(+) diff --git a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp index f324e865f..8a9933215 100644 --- a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp +++ b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp @@ -59,6 +59,11 @@ uint8 HardwareCAN::available(void) return can_rx_available(); } +uint8 HardwareCAN::frame_lost(void) +{ + return can_frame_lost() ; +} + CanMsg* HardwareCAN::recv(void) { return can_rx_queue_get(); diff --git a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h index ccc318f5b..944187e14 100644 --- a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h +++ b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h @@ -54,6 +54,7 @@ class HardwareCAN void cancel(CAN_TX_MBX mbx); uint8 available(void); + uint8 frame_lost(void); CanMsg* recv(void); From 0c050b8c57bd75e0d9cfa4a0bf385df23e183af5 Mon Sep 17 00:00:00 2001 From: Lacklustrlabs Date: Sat, 27 Jan 2018 17:20:14 +0100 Subject: [PATCH 307/307] Post rebase fixup --- STM32F1/cores/maple/HardwareTimer.h | 1 + .../AstraH_CAN_test/AstraH_CAN_test.ino | 7 +- .../HardwareCAN_simplified_send1.ino | 7 +- .../examples/HardwareCANexample/Changes.h | 2 +- .../HardwareCANexample/HardwareCANexample.ino | 11 +- .../examples/STMdualCAN/STMdualCAN.ino | 4 + .../libraries/HardwareCAN/library.properties | 3 +- .../libraries/HardwareCAN/src/HardwareCAN.cpp | 4 +- .../libraries/HardwareCAN/src/HardwareCAN.h | 12 +- .../libraries/HardwareCAN/src/utility/can.c | 6 +- .../HardwareCAN/src/utility/can.c.txt | 591 ---------------- .../libraries/HardwareCAN/src/utility/can.h | 3 +- .../HardwareCAN/src/utility/can.temp.c | 599 ---------------- STM32F1/libraries/rcc.h | 641 ------------------ STM32F1/libraries/rcc_f1.c | 174 ----- STM32F1/libraries/usb.c | 402 ----------- 16 files changed, 36 insertions(+), 2431 deletions(-) delete mode 100644 STM32F1/libraries/HardwareCAN/src/utility/can.c.txt delete mode 100644 STM32F1/libraries/HardwareCAN/src/utility/can.temp.c delete mode 100644 STM32F1/libraries/rcc.h delete mode 100644 STM32F1/libraries/rcc_f1.c delete mode 100644 STM32F1/libraries/usb.c diff --git a/STM32F1/cores/maple/HardwareTimer.h b/STM32F1/cores/maple/HardwareTimer.h index 4de2ebc07..5be5ee7a3 100644 --- a/STM32F1/cores/maple/HardwareTimer.h +++ b/STM32F1/cores/maple/HardwareTimer.h @@ -143,6 +143,7 @@ class HardwareTimer { * @return The new overflow value. */ uint16 setCycles(uint32 Cycles); + /** * @brief Set the timer's period in microseconds. * diff --git a/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test.ino b/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test.ino index a05576bb9..ff7c55bb4 100644 --- a/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test.ino +++ b/STM32F1/libraries/HardwareCAN/examples/AstraH_CAN_test/AstraH_CAN_test.ino @@ -23,8 +23,9 @@ void CANSetup(void) // will be performed at ease in a task or in the loop. The software fifo is 16 cells long, // allowing at least 15 ms before processing the fifo is needed at 125 kbps Stat = canBus.status(); - if (Stat != CAN_OK) + if (Stat != CAN_OK) { /* Your own error processing here */ ; // Initialization failed + } } @@ -79,6 +80,10 @@ int sState = 0; // variable for reading the switch status byte st = 0x31; // buttot 1 on the CD30MP3 void setup() { +#ifdef SERIAL_USB + Serial.end(); // Disable USB !!! +#endif + // put your setup code here, to run once: CANSetup() ; // Initialize the CAN module and prepare the message structures. pinMode(PC13, OUTPUT); diff --git a/STM32F1/libraries/HardwareCAN/examples/HardwareCAN_simplified_send1/HardwareCAN_simplified_send1.ino b/STM32F1/libraries/HardwareCAN/examples/HardwareCAN_simplified_send1/HardwareCAN_simplified_send1.ino index 17fb07f9b..e20fd80d7 100644 --- a/STM32F1/libraries/HardwareCAN/examples/HardwareCAN_simplified_send1/HardwareCAN_simplified_send1.ino +++ b/STM32F1/libraries/HardwareCAN/examples/HardwareCAN_simplified_send1/HardwareCAN_simplified_send1.ino @@ -27,8 +27,9 @@ void CANSetup(void) // will be performed at ease in a task or in the loop. The software fifo is 16 cells long, // allowing at least 15 ms before processing the fifo is needed at 125 kbps Stat = canBus.status(); - if (Stat != CAN_OK) + if (Stat != CAN_OK) { /* Your own error processing here */ ; // Initialization failed + } } @@ -79,6 +80,10 @@ void SendCANmessage(long id=0x001, byte d0=0x00, byte d1=0x00, byte d2=0x00, byt // The application program starts here void setup() { +#ifdef SERIAL_USB + Serial.end(); // Disable USB !!! +#endif + // put your setup code here, to run once: CANSetup() ; // Initialize the CAN module and prepare the message structures. pinMode(PC13, OUTPUT); diff --git a/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/Changes.h b/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/Changes.h index 1ccd2fe88..207704784 100644 --- a/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/Changes.h +++ b/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/Changes.h @@ -31,7 +31,7 @@ void __irq_usb_hp_can_tx(void) } uint8 __attribute__((weak)) CAN_RX0_IRQ_Handler(void) -{ return 1 ; } // Dummy ISR +{ return 0 ; } // Dummy ISR 2.3.2) and altered function void __irq_usb_lp_can_rx0(void) Was diff --git a/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/HardwareCANexample.ino b/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/HardwareCANexample.ino index 4e3a9e574..0c0a8ecec 100644 --- a/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/HardwareCANexample.ino +++ b/STM32F1/libraries/HardwareCAN/examples/HardwareCANexample/HardwareCANexample.ino @@ -1,5 +1,5 @@ #include -#include "changes.h" +#include "Changes.h" /* * Example of use of the HardwareCAN library * This application receives two frames containing various data. It also produces data that are sent periodically using another two frames. @@ -70,8 +70,9 @@ void CANSetup(void) // will be performed at ease in a task or in the loop. The software fifo is 16 cells long, // allowing at least 15 ms before processing the fifo is needed at 125 kbps Stat = canBus.status(); - if (Stat != CAN_OK) + if (Stat != CAN_OK) { /* Your own error processing here */ ; // Initialization failed + } } // Send one frame. Parameter is a pointer to a frame structure (above), that has previously been updated with data. @@ -151,6 +152,10 @@ void SendCANmessages(void) // The application program starts here void setup() { +#ifdef SERIAL_USB + Serial.end(); // Disable USB !!! +#endif + // put your setup code here, to run once: CANSetup() ; // Initialize the CAN module and prepare the message structures. } @@ -178,4 +183,4 @@ void loop() { delay(CAN_DELAY) ; // The delay must not be greater than the time to overflow the incoming fifo (here about 15 ms) } - + diff --git a/STM32F1/libraries/HardwareCAN/examples/STMdualCAN/STMdualCAN.ino b/STM32F1/libraries/HardwareCAN/examples/STMdualCAN/STMdualCAN.ino index cbeaf8962..c120395e0 100644 --- a/STM32F1/libraries/HardwareCAN/examples/STMdualCAN/STMdualCAN.ino +++ b/STM32F1/libraries/HardwareCAN/examples/STMdualCAN/STMdualCAN.ino @@ -87,6 +87,10 @@ void SendCANmessage(long id=0x001, byte dlength=8, byte d0=0x00, byte d1=0x00, b // The application program starts here byte msgD0 = 0x00; void setup() { // Initialize the CAN module and prepare the message structures. +#ifdef SERIAL_USB + Serial.end(); // Disable USB !!! +#endif + pinMode(PC13, OUTPUT); digitalWrite(PC13, HIGH); delay(10); diff --git a/STM32F1/libraries/HardwareCAN/library.properties b/STM32F1/libraries/HardwareCAN/library.properties index 9186eb6cc..3623c3daa 100644 --- a/STM32F1/libraries/HardwareCAN/library.properties +++ b/STM32F1/libraries/HardwareCAN/library.properties @@ -6,4 +6,5 @@ sentence=Enables managing CAN communication using the built-in CAN port of the O paragraph=With this library you can use the built-in CAN port of the OLIMEX STM32. The library handles both standard and extended frames. category=Communication url= -architectures=* \ No newline at end of file +includes=src/HardwareCAN.h +architectures=STM32F1 diff --git a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp index 8a9933215..010008acd 100644 --- a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp +++ b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.cpp @@ -39,9 +39,9 @@ void HardwareCAN::set_irq_mode(void) return can_set_irq_mode(Port); } -CAN_STATUS HardwareCAN::filter(uint8 idx, uint32 id, uint32 mask) +CAN_STATUS HardwareCAN::filter(uint8 idx, uint32 id, uint32 mask, int ext_id) { - return can_filter(Port, idx, CAN_FIFO0, CAN_FILTER_32BIT, CAN_FILTER_MASK, id, mask); + return can_filter(Port, idx, CAN_FIFO0, CAN_FILTER_32BIT, CAN_FILTER_MASK, id, mask, ext_id); } CAN_STATUS HardwareCAN::status(void) diff --git a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h index 944187e14..c8a10e8fb 100644 --- a/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h +++ b/STM32F1/libraries/HardwareCAN/src/HardwareCAN.h @@ -8,16 +8,6 @@ #include "utility/can.h" #include "usb_serial.h" -#define PID_REQUEST 0x7DF -#define PID_REPLY 0x7E8 - -#define ENGINE_COOLANT_TEMP 0x05 -#define ENGINE_RPM 0x0C -#define VEHICLE_SPEED 0x0D -#define MAF_SENSOR 0x10 -#define O2_VOLTAGE 0x14 -#define THROTTLE 0x11 - /** * Defines the possible SPI communication speeds. */ @@ -46,7 +36,7 @@ class HardwareCAN CAN_STATUS begin(CAN_SPEED speed, uint32 mode); void end(void); - CAN_STATUS filter(uint8 idx, uint32 id, uint32 mask); + CAN_STATUS filter(uint8 idx, uint32 id, uint32 mask, int ext_id = 0); CAN_STATUS map(CAN_GPIO_MAP remap); CAN_STATUS status(void); diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.c b/STM32F1/libraries/HardwareCAN/src/utility/can.c index 324800804..862685fc9 100644 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.c +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.c @@ -277,7 +277,7 @@ CAN_STATUS can_gpio_map(CAN_Port* CANx, CAN_GPIO_MAP map_mode) return status; } -CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2, int extID = 0) +CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2, int extID) { uint32 mask = ((uint32)0x00000001) << filter_idx; @@ -561,7 +561,7 @@ void can_rx_read(CAN_Port* CANx, CAN_FIFO fifo) can_rx_release(CANx, fifo); } -uint8 CAN_RX0_IRQ_Handler(void) +uint8 __attribute__ ((interrupt)) CAN_RX0_IRQ_Handler(void) { if (can_active) { @@ -579,7 +579,7 @@ void __irq_can_rx1(void) CAN_RX0_IRQ_Handler() ; } -void USB_HP_CAN_TX_IRQHandler (void) +void __attribute__ ((interrupt)) USB_HP_CAN_TX_IRQHandler(void) { if (can_active) { diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.c.txt b/STM32F1/libraries/HardwareCAN/src/utility/can.c.txt deleted file mode 100644 index 64cedac5e..000000000 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.c.txt +++ /dev/null @@ -1,591 +0,0 @@ -//#include "libmaple.h" -#include "can.h" -//#include "rcc.h" -//#include "gpio.h" -//#include "nvic.h" -//#include "usb.h" - -/** - * CAN_interrupts - */ - -#define CAN_IT_RQCP0 ((uint32)0x00000005) /* Request completed mailbox 0 */ -#define CAN_IT_RQCP1 ((uint32)0x00000006) /* Request completed mailbox 1 */ -#define CAN_IT_RQCP2 ((uint32)0x00000007) /* Request completed mailbox 2 */ -#define CAN_IT_TME ((uint32)0x00000001) /* Transmit mailbox empty */ -#define CAN_IT_FMP0 ((uint32)0x00000002) /* FIFO 0 message pending */ -#define CAN_IT_FF0 ((uint32)0x00000004) /* FIFO 0 full */ -#define CAN_IT_FOV0 ((uint32)0x00000008) /* FIFO 0 overrun */ -#define CAN_IT_FMP1 ((uint32)0x00000010) /* FIFO 1 message pending */ -#define CAN_IT_FF1 ((uint32)0x00000020) /* FIFO 1 full */ -#define CAN_IT_FOV1 ((uint32)0x00000040) /* FIFO 1 overrun */ -#define CAN_IT_EWG ((uint32)0x00000100) /* Error warning */ -#define CAN_IT_EPV ((uint32)0x00000200) /* Error passive */ -#define CAN_IT_BOF ((uint32)0x00000400) /* Bus-off */ -#define CAN_IT_LEC ((uint32)0x00000800) /* Last error code */ -#define CAN_IT_ERR ((uint32)0x00008000) /* Error */ -#define CAN_IT_WKU ((uint32)0x00010000) /* Wake-up */ -#define CAN_IT_SLK ((uint32)0x00020000) /* Sleep */ - -/* Time out for INAK bit */ -#define CAN_INAK_TimeOut ((uint32)0x0000FFFF) - -/* Time out for SLAK bit */ -#define CAN_SLAK_TimeOut ((uint32)0x0000FFFF) - -#define CAN_CONTROL_MASK (CAN_MCR_TTCM | CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_NART | CAN_MCR_RFLM | CAN_MCR_TXFP) -#define CAN_TIMING_MASK (CAN_BTR_SJW | CAN_BTR_TS2 | CAN_BTR_TS1 | CAN_BTR_BRP) -#define CAN_MODE_MASK (CAN_BTR_LBKM | CAN_BTR_SILM) - -struct can_speed_info { - const uint32 btr; -}; - -#define CAN_CLOCK (36000000UL / 18UL) - -static const struct can_speed_info can_speed_table[] = { - [CAN_SPEED_125] = { .btr = ( - (( 4-1) << CAN_BTR_SJW_POS) | - ((12-1) << CAN_BTR_TS1_POS) | - (( 5-1) << CAN_BTR_TS2_POS) | - (CAN_CLOCK / 125000UL - 1) - )}, - [CAN_SPEED_250] = { .btr = ( - (( 4-1) << CAN_BTR_SJW_POS) | - ((12-1) << CAN_BTR_TS1_POS) | - (( 5-1) << CAN_BTR_TS2_POS) | - (CAN_CLOCK / 250000UL - 1) - )}, - [CAN_SPEED_500] = { .btr = ( - (( 4-1) << CAN_BTR_SJW_POS) | - ((12-1) << CAN_BTR_TS1_POS) | - (( 5-1) << CAN_BTR_TS2_POS) | - (CAN_CLOCK / 500000UL - 1) - )}, - [CAN_SPEED_1000] = { .btr = ( - (( 4-1) << CAN_BTR_SJW_POS) | - ((12-1) << CAN_BTR_TS1_POS) | - (( 5-1) << CAN_BTR_TS2_POS) | - (CAN_CLOCK / 1000000UL - 1) - )} -}; - -CAN_STATUS status; -CanMsg can_rx_queue[CAN_RX_QUEUE_SIZE]; - -// JMD 2017/07/18 -- added volatile to fix queue problems -volatile uint8 can_rx_head; -volatile uint8 can_rx_tail; -//volatile uint8 can_rx_count; // JMD 2017/07/18 -- redundant -volatile uint8 can_rx_lost; -uint8 can_active = 0; - -/** - * @brief Return last operation status - */ -CAN_STATUS can_status(void) -{ - return status; -} - -/** - * @brief Enter initialization mode - */ -CAN_STATUS can_init_enter(CAN_Port* CANx) -{ - volatile uint32 wait_ack = 0 ; - - status = CAN_OK; - if ((CANx->MSR & CAN_MSR_INAK) == 0) // Check for initialization mode already set - { - CANx->MCR |= CAN_MCR_INRQ; // Request initialisation - - wait_ack = 0; // Wait the acknowledge - while ((wait_ack != CAN_INAK_TimeOut) && ((CANx->MSR & CAN_MSR_INAK) == 0)) - wait_ack++; - if ((CANx->MSR & CAN_MSR_INAK) == 0) - status = CAN_INIT_E_FAILED; // Timeout - } - return status; -} - -/** - * @brief Leave initialization mode - */ -CAN_STATUS can_init_leave(CAN_Port* CANx) -{ - volatile uint32 wait_ack = 0 ; - - status = CAN_OK; - if ((CANx->MSR & CAN_MSR_INAK) != 0) // Check for initialization mode already reset - { - CANx->MCR &= ~CAN_MCR_INRQ; // Clear Request initialization - - wait_ack = 0; // Wait the acknowledge - while ((wait_ack != CAN_INAK_TimeOut) && ((CANx->MSR & CAN_MSR_INAK) != 0)) - wait_ack++; - if ((CANx->MSR & CAN_MSR_INAK) != 0) - status = CAN_INIT_L_FAILED; - } - return status; -} - -/** - * @brief Deinitializes the CAN peripheral registers to their default reset values. - */ -CAN_STATUS can_deinit(CAN_Port* CANx) -{ - if (CANx == CAN1_BASE) - { - nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // Disable interrupts - nvic_irq_disable(NVIC_CAN_RX1); - nvic_irq_disable(NVIC_USB_HP_CAN_TX); - __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee - __asm volatile( "isb" ); // that the protection against interrupts is effective - rcc_reset_dev(RCC_CAN); - rcc_clk_disable(RCC_CAN); - can_active = 0; - } - return (status = CAN_OK); -} - -/** - * @brief Initialize CAN registers - */ -/* - * Bits in control parameter: - * CAN_MCR_TTCM time triggered communication mode - * CAN_MCR_ABOM automatic bus-off management - * CAN_MCR_AWUM automatic wake-up mode - * CAN_MCR_NART no automatic retransmission - * CAN_MCR_RFLM receive FIFO locked mode - * CAN_MCR_TXFP transmit FIFO priority - */ -CAN_STATUS can_init(CAN_Port* CANx, uint32 control, uint8 speed) -{ - status = CAN_INIT_FAILED; // default result status - // initialize receive message queue -// can_rx_head = can_rx_tail = can_rx_count = can_rx_lost = 0; // JMD 2017/07/18 - can_rx_head = can_rx_tail = can_rx_lost = 0; - - rcc_reset_dev(RCC_USB); //! X893 - rcc_clk_disable(RCC_USB); //! X893 -// line_dtr_rts = 0; //! X893 - rcc_clk_enable(RCC_AFIO); // enable clocks for AFIO - rcc_clk_enable(RCC_CAN); // and CAN - rcc_reset_dev(RCC_CAN); // reset CAN interface - - can_active = 1; // set CAN active flag (for interrupt handler - - CANx->MCR &= ~CAN_MCR_SLEEP; // reset CAN sleep mode (default after reset) - - if (can_init_enter(CANx) != CAN_OK) // enter CAN initialization mode - return status; // error, so return - - CANx->MCR &= ~CAN_CONTROL_MASK; // set mode bits - CANx->MCR |= (control & CAN_CONTROL_MASK); - - CANx->BTR &= ~CAN_TIMING_MASK; // Set the bit timing register - CANx->BTR |= (can_speed_table[speed].btr & CAN_TIMING_MASK); - - nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // Enable interrupts - nvic_irq_enable(NVIC_CAN_RX1); - - nvic_irq_enable(NVIC_USB_HP_CAN_TX); - - CANx->IER = (CAN_IER_FMPIE0 | CAN_IER_FMPIE1 | CAN_IER_TMEIE); - - if (can_init_leave(CANx) == CAN_OK) - { - while (!(CANx->TSR & CAN_TSR_TME0)); // Transmit mailbox 0 is empty - while (!(CANx->TSR & CAN_TSR_TME1)); // Transmit mailbox 0 is empty - while (!(CANx->TSR & CAN_TSR_TME2)); // Transmit mailbox 0 is empty - } - return status; -} - -/** - * @brief Set timing calues (CAN_BTR) - */ -CAN_STATUS can_set_timing(CAN_Port* CANx, uint32 timing) -{ - if (can_init_enter(CANx) == CAN_OK) - { - CANx->BTR = ((CANx->BTR & ~CAN_TIMING_MASK) | (timing & CAN_TIMING_MASK)); - can_init_leave(CANx); - } - return status; -} - -/** - * @brief Set CAN mode - * @param CANx pointer to CAN port - * @param mode CAN mode - */ -CAN_STATUS can_set_mode(CAN_Port* CANx, uint32 mode) -{ - if (can_init_enter(CANx) == CAN_OK) - { - CANx->BTR &= ~CAN_MODE_MASK; - CANx->BTR |= (mode & CAN_MODE_MASK); - can_init_leave(CANx); - } - return status; -} - -/** - * @brief Set CAN to GPIO mapping - */ -CAN_STATUS can_gpio_map(CAN_Port* CANx, CAN_GPIO_MAP map_mode) -{ - rcc_clk_enable(RCC_AFIO); - - status = CAN_INIT_FAILED; - if( CANx == CAN1_BASE) - { - switch(map_mode) - { - case CAN_GPIO_PB8_PB9: - rcc_clk_enable(RCC_GPIOB); - afio_remap(AFIO_MAPR_CAN_REMAP_PB8_PB9); - gpio_set_mode(GPIOB, 8, GPIO_INPUT_FLOATING); - gpio_set_mode(GPIOB, 9, GPIO_AF_OUTPUT_PP); - break; -#if NR_GPIO_PORTS >= 4 - case CAN_GPIO_PD0_PD1: - rcc_clk_enable(RCC_GPIOD); - afio_remap(AFIO_MAPR_CAN_REMAP_PD0_PD1); - gpio_set_mode(GPIOD, 0, GPIO_INPUT_FLOATING); - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); - break; -#endif - default: - return status; - } - status = CAN_OK; - } - return status; -} - -CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2) -{ - uint32 mask = ((uint32)0x00000001) << filter_idx; - - CANx->FMR |= CAN_FMR_FINIT; // Initialization mode for the filter - CANx->FA1R &= ~mask; // Deactivation filter - - - if (scale == CAN_FILTER_32BIT) - CANx->FS1R |= mask; - else - CANx->FS1R &= ~mask; - - CANx->sFilterRegister[filter_idx].FR1 = fr1; - CANx->sFilterRegister[filter_idx].FR2 = fr2; - - if (mode == CAN_FILTER_MASK) - CANx->FM1R &= ~mask; - else - CANx->FM1R |= mask; - - if (fifo == CAN_FIFO0) - CANx->FFA1R &= ~mask; - else - CANx->FFA1R |= mask; - - CANx->FA1R |= mask; - CANx->FMR &= ~CAN_FMR_FINIT; - return CAN_OK; -} - - -/** - * @brief Initiates the transmission of a message. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param msg: pointer to a structure which contains CAN Id, CAN DLC and CAN datas. - * @retval : The number of the mailbox that is used for transmission or CAN_NO_MB if there is no empty mailbox. - */ -CAN_TX_MBX can_transmit(CAN_Port* CANx, CanMsg* msg) -{ - CAN_TX_MBX mbx; - uint32 data; - - /* Select one empty transmit mailbox */ - if (CANx->TSR & CAN_TSR_TME0) - mbx = CAN_TX_MBX0; - else if (CANx->TSR & CAN_TSR_TME1) - mbx = CAN_TX_MBX1; - else if (CANx->TSR & CAN_TSR_TME2) - mbx = CAN_TX_MBX2; - else - { - status = CAN_NO_MB; - return CAN_TX_NO_MBX; - } - - /* Set up the Id */ - if (msg->IDE == CAN_ID_STD) - data = (msg->ID << 21); - else - data = (msg->ID << 3) | CAN_ID_EXT; - - data |= ((uint32)msg->RTR); - - /* Set up the DLC */ - CANx->sTxMailBox[mbx].TDTR = (uint32)(msg->DLC & 0x0F); - - /* Set up the data field */ - CANx->sTxMailBox[mbx].TDLR = ( - ((uint32)msg->Data[3] << 24) | - ((uint32)msg->Data[2] << 16) | - ((uint32)msg->Data[1] << 8) | - ((uint32)msg->Data[0]) - ); - CANx->sTxMailBox[mbx].TDHR = ( - ((uint32)msg->Data[7] << 24) | - ((uint32)msg->Data[6] << 16) | - ((uint32)msg->Data[5] << 8) | - ((uint32)msg->Data[4]) - ); - /* Request transmission */ - CANx->sTxMailBox[mbx].TIR = (data | CAN_TMIDxR_TXRQ); - status = CAN_OK; - - return mbx; -} - -/** - * Checks the transmission of a message. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param mbx: the number of the mailbox that is used for transmission. - * @retval : CAN_TX_OK if the CAN driver transmits the message, CAN_TX_FAILED in an other case. - */ -CAN_STATUS can_tx_status(CAN_Port* CANx, CAN_TX_MBX mbx) -{ - /* RQCP, TXOK and TME bits */ - uint8 state = 0; - - switch (mbx) - { - case CAN_TX_MBX0: - state |= (uint8)((CANx->TSR & CAN_TSR_RQCP0) << 2); - state |= (uint8)((CANx->TSR & CAN_TSR_TXOK0) >> 0); - state |= (uint8)((CANx->TSR & CAN_TSR_TME0) >> 26); - break; - case CAN_TX_MBX1: - state |= (uint8)((CANx->TSR & CAN_TSR_RQCP1) >> 6); - state |= (uint8)((CANx->TSR & CAN_TSR_TXOK1) >> 8); - state |= (uint8)((CANx->TSR & CAN_TSR_TME1) >> 27); - break; - case CAN_TX_MBX2: - state |= (uint8)((CANx->TSR & CAN_TSR_RQCP2) >> 14); - state |= (uint8)((CANx->TSR & CAN_TSR_TXOK2) >> 16); - state |= (uint8)((CANx->TSR & CAN_TSR_TME2) >> 28); - break; - default: - status = CAN_TX_FAILED; - return status; - } - - // state = RQCP TXOK TME - switch (state) - { - /* transmit pending */ - case 0x0: - status = CAN_TX_PENDING; - break; - /* transmit failed */ - case 0x5: - status = CAN_TX_FAILED; - break; - /* transmit succedeed */ - case 0x7: - status = CAN_OK; - break; - default: - status = CAN_TX_FAILED; - break; - } - return status; -} - -/** - * @brief Cancels a transmit request. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param mbx: Mailbox number. - * @retval : None. - */ -void can_cancel(CAN_Port* CANx, uint8 mbx) -{ - /* abort transmission */ - switch (mbx) - { - case 0: - CANx->TSR |= CAN_TSR_ABRQ0; - break; - case 1: - CANx->TSR |= CAN_TSR_ABRQ1; - break; - case 2: - CANx->TSR |= CAN_TSR_ABRQ2; - break; - default: - break; - } -} - -void can_rx_queue_clear(void) -{ - nvic_irq_disable(NVIC_USB_LP_CAN_RX0); - nvic_irq_disable(NVIC_CAN_RX1); - __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee - __asm volatile( "isb" ); // that the protection against interrupts is effective -// can_rx_head = can_rx_tail = can_rx_count = can_rx_lost = 0; // JMD 2017/07/18 - can_rx_head = can_rx_tail = can_rx_lost = 0; // JMD 2017/07/18 - nvic_irq_enable(NVIC_USB_LP_CAN_RX0); - nvic_irq_enable(NVIC_CAN_RX1); -} - -// JMD 2017/07/18 -- removed -/* -uint8 can_rx_available(void) -{ - return can_rx_count; -} -*/ - -// JMD 2017/07/18 -- added -uint8 can_rx_available(void) -{ - if ( can_rx_head >= can_rx_tail ) - return can_rx_head - can_rx_tail ; - else - return CAN_RX_QUEUE_SIZE - ( can_rx_tail - can_rx_head ) ; -} - -// JMD 2017/07/18 -- added -uint8 can_frame_lost(void) -{ - if ( can_rx_lost != 0 ) - { - can_rx_lost = 0 ; - return 1 ; - } - return 0 ; - -} - -CanMsg* can_rx_queue_get(void) -{ - if (can_rx_head == can_rx_tail) // JMD 2017/07/18 -- changed - return NULL; - return &(can_rx_queue[can_rx_tail]); -} - - -void can_rx_queue_free(void) -{ - if (can_rx_head != can_rx_tail) // JMD 2017/07/18 -- changed - { - nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // JMD atomicity problem - nvic_irq_disable(NVIC_CAN_RX1); - __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee - __asm volatile( "isb" ); // that the protection against interrupts is effective - can_rx_tail = (can_rx_tail == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_tail + 1); -// --can_rx_count; // JMD 2017/07/18 -- removed - nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // fin JMD problème d'atomicité - nvic_irq_enable(NVIC_CAN_RX1); - } -} - -CanMsg* can_read(CAN_Port* CANx, CAN_FIFO fifo, CanMsg* msg) -{ - uint32 data = CANx->sFIFOMailBox[fifo].RIR; - - /* Get the Id */ - if (data & CAN_ID_EXT) - { - msg->ID = 0x1FFFFFFF & (data >> 3); - msg->IDE = (uint8)CAN_ID_EXT; - } - else - { - msg->ID = 0x000007FF & (data >> 21); - msg->IDE = (uint8)CAN_ID_STD; - } - - msg->RTR = (uint8)(CAN_RTR_REMOTE & data); - msg->DLC = (uint8)(0x0F & CANx->sFIFOMailBox[fifo].RDTR); - msg->FMI = (uint8)(0xFF & (CANx->sFIFOMailBox[fifo].RDTR >> 8)); - - /* Get the data field */ - data = CANx->sFIFOMailBox[fifo].RDLR; - uint8* p = msg->Data; - *p++ = (uint8)0xFF & data; - *p++ = (uint8)0xFF & (data >> 8); - *p++ = (uint8)0xFF & (data >> 16); - *p++ = (uint8)0xFF & (data >> 24); - - data = CANx->sFIFOMailBox[fifo].RDHR; - *p++ = (uint8)0xFF & data; - *p++ = (uint8)0xFF & (data >> 8); - *p++ = (uint8)0xFF & (data >> 16); - *p++ = (uint8)0xFF & (data >> 24); - - return msg; -} - -void can_rx_release(CAN_Port* CANx, CAN_FIFO fifo) -{ - if (fifo == CAN_FIFO0) - CANx->RF0R |= (CAN_RF0R_RFOM0); // Release FIFO0 - else - CANx->RF1R |= (CAN_RF1R_RFOM1); // Release FIFO1 -} - -void can_rx_read(CAN_Port* CANx, CAN_FIFO fifo) -{ -// if (can_rx_count < CAN_RX_QUEUE_SIZE) // JMD 2017/07/18 - if (can_rx_available() < CAN_RX_QUEUE_SIZE) // read the message - { - CanMsg* msg = &can_rx_queue[can_rx_head]; - can_read(CANx, fifo, msg); - can_rx_head = (can_rx_head == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_head + 1); -// can_rx_count++; // JMD 2017/07/18 -- removed - } - else - can_rx_lost = 1; // no place in queue, ignore package - - can_rx_release(CANx, fifo); -} - -uint8 CAN_RX0_IRQ_Handler(void) -{ - if (can_active) - { - while ((CAN1_BASE->RF0R & CAN_RF0R_FMP0) != 0) - can_rx_read(CAN1_BASE, CAN_FIFO0); // message pending FIFO0 - while ((CAN1_BASE->RF1R & CAN_RF1R_FMP1) != 0) - can_rx_read(CAN1_BASE, CAN_FIFO1); // message pending FIFO1 - } - return can_active; // return CAN active flag to USB handler -} - -// Addition JMD: the messages stored in fifo1 must also trigger an interrupt. -void __irq_can_rx1(void) -{ - CAN_RX0_IRQ_Handler() ; -} - -void USB_HP_CAN_TX_IRQHandler (void) -{ - if (can_active) - { - if (CAN1_BASE->TSR & CAN_TSR_RQCP0) - CAN1_BASE->TSR |= CAN_TSR_RQCP0; // reset request complete mbx 0 - if (CAN1_BASE->TSR & CAN_TSR_RQCP1) - CAN1_BASE->TSR |= CAN_TSR_RQCP1; // reset request complete mbx 1 - if (CAN1_BASE->TSR & CAN_TSR_RQCP2) - CAN1_BASE->TSR |= CAN_TSR_RQCP2; // reset request complete mbx 2 - } -} diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.h b/STM32F1/libraries/HardwareCAN/src/utility/can.h index 1f2966243..357464fc9 100644 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.h +++ b/STM32F1/libraries/HardwareCAN/src/utility/can.h @@ -280,7 +280,8 @@ CAN_STATUS can_init_enter(CAN_Port* CANx); CAN_STATUS can_init_leave(CAN_Port* CANx); CAN_STATUS can_init(CAN_Port *CANx, uint32 mode, uint8 speed); CAN_STATUS can_deinit(CAN_Port* CANx); -CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo_number, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2); +CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo_number, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2, int extID); + CAN_STATUS can_set_timing(CAN_Port* CANx, uint32 timing); CAN_STATUS can_set_mode(CAN_Port* CANx, uint32 mode); CAN_STATUS can_gpio_map(CAN_Port* CANx, CAN_GPIO_MAP map_mode); diff --git a/STM32F1/libraries/HardwareCAN/src/utility/can.temp.c b/STM32F1/libraries/HardwareCAN/src/utility/can.temp.c deleted file mode 100644 index e9b270c81..000000000 --- a/STM32F1/libraries/HardwareCAN/src/utility/can.temp.c +++ /dev/null @@ -1,599 +0,0 @@ -Skip to content -Features -Business -Explore -Marketplace -Pricing -This repository -Search -Sign in or Sign up - Watch 3 Star 2 Fork 363 megadrifter/Arduino_STM32 -forked from Phonog/Arduino_STM32 - Code Pull requests 0 Projects 0 Insights -Branch: megadrifter-GM… Find file Copy pathArduino_STM32/STM32F1/libraries/HardwareCAN/src/utility/can.c -a9807d2 9 days ago -@megadrifter megadrifter CAN filter corrected by tjb12345 -2 contributors @megadrifter @Phonog -RawBlameHistory -567 lines (500 sloc) 14.3 KB -#include "can.h" - -/** - * CAN_interrupts - */ - -#define CAN_IT_RQCP0 ((uint32)0x00000005) /* Request completed mailbox 0 */ -#define CAN_IT_RQCP1 ((uint32)0x00000006) /* Request completed mailbox 1 */ -#define CAN_IT_RQCP2 ((uint32)0x00000007) /* Request completed mailbox 2 */ -#define CAN_IT_TME ((uint32)0x00000001) /* Transmit mailbox empty */ -#define CAN_IT_FMP0 ((uint32)0x00000002) /* FIFO 0 message pending */ -#define CAN_IT_FF0 ((uint32)0x00000004) /* FIFO 0 full */ -#define CAN_IT_FOV0 ((uint32)0x00000008) /* FIFO 0 overrun */ -#define CAN_IT_FMP1 ((uint32)0x00000010) /* FIFO 1 message pending */ -#define CAN_IT_FF1 ((uint32)0x00000020) /* FIFO 1 full */ -#define CAN_IT_FOV1 ((uint32)0x00000040) /* FIFO 1 overrun */ -#define CAN_IT_EWG ((uint32)0x00000100) /* Error warning */ -#define CAN_IT_EPV ((uint32)0x00000200) /* Error passive */ -#define CAN_IT_BOF ((uint32)0x00000400) /* Bus-off */ -#define CAN_IT_LEC ((uint32)0x00000800) /* Last error code */ -#define CAN_IT_ERR ((uint32)0x00008000) /* Error */ -#define CAN_IT_WKU ((uint32)0x00010000) /* Wake-up */ -#define CAN_IT_SLK ((uint32)0x00020000) /* Sleep */ - -/* Time out for INAK bit */ -#define CAN_INAK_TimeOut ((uint32)0x0000FFFF) - -/* Time out for SLAK bit */ -#define CAN_SLAK_TimeOut ((uint32)0x0000FFFF) - -#define CAN_CONTROL_MASK (CAN_MCR_TTCM | CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_NART | CAN_MCR_RFLM | CAN_MCR_TXFP) -#define CAN_TIMING_MASK (CAN_BTR_SJW | CAN_BTR_TS2 | CAN_BTR_TS1 | CAN_BTR_BRP) -#define CAN_MODE_MASK (CAN_BTR_LBKM | CAN_BTR_SILM) - -struct can_speed_info { - const uint32 btr; -}; - -#define CAN_CLOCK (36000000UL / 18UL) - -static const struct can_speed_info can_speed_table[] = { - [CAN_SPEED_125] = { .btr = ( - (( 4-1) << CAN_BTR_SJW_POS) | - ((12-1) << CAN_BTR_TS1_POS) | - (( 5-1) << CAN_BTR_TS2_POS) | - (CAN_CLOCK / 125000UL - 1) - )}, - [CAN_SPEED_250] = { .btr = ( - (( 4-1) << CAN_BTR_SJW_POS) | - ((12-1) << CAN_BTR_TS1_POS) | - (( 5-1) << CAN_BTR_TS2_POS) | - (CAN_CLOCK / 250000UL - 1) - )}, - [CAN_SPEED_500] = { .btr = ( - (( 4-1) << CAN_BTR_SJW_POS) | - ((12-1) << CAN_BTR_TS1_POS) | - (( 5-1) << CAN_BTR_TS2_POS) | - (CAN_CLOCK / 500000UL - 1) - )}, - [CAN_SPEED_1000] = { .btr = ( - (( 4-1) << CAN_BTR_SJW_POS) | - ((12-1) << CAN_BTR_TS1_POS) | - (( 5-1) << CAN_BTR_TS2_POS) | - (CAN_CLOCK / 1000000UL - 1) - )} -}; - -CAN_STATUS status; -CanMsg can_rx_queue[CAN_RX_QUEUE_SIZE]; - -// JMD 2017/07/18 -- added volatile to fix queue problems, removed can_rx_count -volatile uint8 can_rx_head; -volatile uint8 can_rx_tail; -volatile uint8 can_rx_lost; -uint8 can_active = 0; - -/** - * @brief Return last operation status - */ -CAN_STATUS can_status(void) -{ - return status; -} - -/** - * @brief Enter initialization mode - */ -CAN_STATUS can_init_enter(CAN_Port* CANx) -{ - volatile uint32 wait_ack = 0 ; - - status = CAN_OK; - if ((CANx->MSR & CAN_MSR_INAK) == 0) // Check for initialization mode already set - { - CANx->MCR |= CAN_MCR_INRQ; // Request initialisation - - wait_ack = 0; // Wait the acknowledge - while ((wait_ack != CAN_INAK_TimeOut) && ((CANx->MSR & CAN_MSR_INAK) == 0)) - wait_ack++; - if ((CANx->MSR & CAN_MSR_INAK) == 0) - status = CAN_INIT_E_FAILED; // Timeout - } - return status; -} - -/** - * @brief Leave initialization mode - */ -CAN_STATUS can_init_leave(CAN_Port* CANx) -{ - volatile uint32 wait_ack = 0 ; - - status = CAN_OK; - if ((CANx->MSR & CAN_MSR_INAK) != 0) // Check for initialization mode already reset - { - CANx->MCR &= ~CAN_MCR_INRQ; // Clear Request initialization - - wait_ack = 0; // Wait the acknowledge - while ((wait_ack != CAN_INAK_TimeOut) && ((CANx->MSR & CAN_MSR_INAK) != 0)) - wait_ack++; - if ((CANx->MSR & CAN_MSR_INAK) != 0) - status = CAN_INIT_L_FAILED; - } - return status; -} - -/** - * @brief Deinitializes the CAN peripheral registers to their default reset values. - */ -CAN_STATUS can_deinit(CAN_Port* CANx) -{ - if (CANx == CAN1_BASE) - { - nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // Disable interrupts - nvic_irq_disable(NVIC_CAN_RX1); - nvic_irq_disable(NVIC_USB_HP_CAN_TX); - __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee - __asm volatile( "isb" ); // that the protection against interrupts is effective - rcc_reset_dev(RCC_CAN); - rcc_clk_disable(RCC_CAN); - can_active = 0; - } - return (status = CAN_OK); -} - -/** - * @brief Initialize CAN registers - */ -/* - * Bits in control parameter: - * CAN_MCR_TTCM time triggered communication mode - * CAN_MCR_ABOM automatic bus-off management - * CAN_MCR_AWUM automatic wake-up mode - * CAN_MCR_NART no automatic retransmission - * CAN_MCR_RFLM receive FIFO locked mode - * CAN_MCR_TXFP transmit FIFO priority - */ -CAN_STATUS can_init(CAN_Port* CANx, uint32 control, uint8 speed) -{ - status = CAN_INIT_FAILED; // default result status - // initialize receive message queue - can_rx_head = can_rx_tail = can_rx_lost = 0; - - rcc_reset_dev(RCC_USB); //! X893 - rcc_clk_disable(RCC_USB); //! X893 - rcc_clk_enable(RCC_AFIO); // enable clocks for AFIO - rcc_clk_enable(RCC_CAN); // and CAN - rcc_reset_dev(RCC_CAN); // reset CAN interface - - can_active = 1; // set CAN active flag (for interrupt handler - - CANx->MCR &= ~CAN_MCR_SLEEP; // reset CAN sleep mode (default after reset) - - if (can_init_enter(CANx) != CAN_OK) // enter CAN initialization mode - return status; // error, so return - - CANx->MCR &= ~CAN_CONTROL_MASK; // set mode bits - CANx->MCR |= (control & CAN_CONTROL_MASK); - - CANx->BTR &= ~CAN_TIMING_MASK; // Set the bit timing register - CANx->BTR |= (can_speed_table[speed].btr & CAN_TIMING_MASK); - - nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // Enable interrupts - nvic_irq_enable(NVIC_CAN_RX1); - - nvic_irq_enable(NVIC_USB_HP_CAN_TX); - - CANx->IER = (CAN_IER_FMPIE0 | CAN_IER_FMPIE1 | CAN_IER_TMEIE); - - if (can_init_leave(CANx) == CAN_OK) - { - while (!(CANx->TSR & CAN_TSR_TME0)); // Transmit mailbox 0 is empty - while (!(CANx->TSR & CAN_TSR_TME1)); // Transmit mailbox 0 is empty - while (!(CANx->TSR & CAN_TSR_TME2)); // Transmit mailbox 0 is empty - } - return status; -} - -/** - * @brief Set timing calues (CAN_BTR) - */ -CAN_STATUS can_set_timing(CAN_Port* CANx, uint32 timing) -{ - if (can_init_enter(CANx) == CAN_OK) - { - CANx->BTR = ((CANx->BTR & ~CAN_TIMING_MASK) | (timing & CAN_TIMING_MASK)); - can_init_leave(CANx); - } - return status; -} - -/** - * @brief Set CAN mode - * @param CANx pointer to CAN port - * @param mode CAN mode - */ -CAN_STATUS can_set_mode(CAN_Port* CANx, uint32 mode) -{ - if (can_init_enter(CANx) == CAN_OK) - { - CANx->BTR &= ~CAN_MODE_MASK; - CANx->BTR |= (mode & CAN_MODE_MASK); - can_init_leave(CANx); - } - return status; -} - -/** - * @brief Set CAN to GPIO mapping - */ -CAN_STATUS can_gpio_map(CAN_Port* CANx, CAN_GPIO_MAP map_mode) -{ - rcc_clk_enable(RCC_AFIO); - - status = CAN_INIT_FAILED; - if( CANx == CAN1_BASE) - { - switch(map_mode) - { - case CAN_GPIO_PB8_PB9: - rcc_clk_enable(RCC_GPIOB); - afio_remap(AFIO_MAPR_CAN_REMAP_PB8_PB9); - gpio_set_mode(GPIOB, 8, GPIO_INPUT_FLOATING); - gpio_set_mode(GPIOB, 9, GPIO_AF_OUTPUT_PP); - break; - case CAN_GPIO_PA11_PA12: - rcc_clk_enable(RCC_GPIOA); - afio_remap(AFIO_MAPR_CAN_REMAP_NONE); - gpio_set_mode(GPIOA, 11, GPIO_INPUT_FLOATING); - gpio_set_mode(GPIOA, 12, GPIO_AF_OUTPUT_PP); - break; -#if NR_GPIO_PORTS >= 4 - case CAN_GPIO_PD0_PD1: - rcc_clk_enable(RCC_GPIOD); - afio_remap(AFIO_MAPR_CAN_REMAP_PD0_PD1); - gpio_set_mode(GPIOD, 0, GPIO_INPUT_FLOATING); - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); - break; -#endif - default: - return status; - } - status = CAN_OK; - } - return status; -} - -CAN_STATUS can_filter(CAN_Port* CANx, uint8 filter_idx, CAN_FIFO fifo, CAN_FILTER_SCALE scale, CAN_FILTER_MODE mode, uint32 fr1, uint32 fr2, int extID = 0) -{ - uint32 mask = ((uint32)0x00000001) << filter_idx; - - CANx->FMR |= CAN_FMR_FINIT; // Initialization mode for the filter - CANx->FA1R &= ~mask; // Deactivation filter - - - if (scale == CAN_FILTER_32BIT) - CANx->FS1R |= mask; - else - CANx->FS1R &= ~mask; - if (extID) { - CANx->sFilterRegister[filter_idx].FR1 = (fr1 << 3) | CAN_ID_EXT; - CANx->sFilterRegister[filter_idx].FR2 = (fr2 << 3) | CAN_ID_EXT; - } - else { - CANx->sFilterRegister[filter_idx].FR1 = (fr1 << 21); - CANx->sFilterRegister[filter_idx].FR2 = (fr2 << 21); - } - if (mode == CAN_FILTER_MASK) - CANx->FM1R &= ~mask; - else - CANx->FM1R |= mask; - - if (fifo == CAN_FIFO0) - CANx->FFA1R &= ~mask; - else - CANx->FFA1R |= mask; - - CANx->FA1R |= mask; - CANx->FMR &= ~CAN_FMR_FINIT; - return CAN_OK; -} - - -/** - * @brief Initiates the transmission of a message. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param msg: pointer to a structure which contains CAN Id, CAN DLC and CAN datas. - * @retval : The number of the mailbox that is used for transmission or CAN_NO_MB if there is no empty mailbox. - */ -CAN_TX_MBX can_transmit(CAN_Port* CANx, CanMsg* msg) -{ - CAN_TX_MBX mbx; - uint32 data; - - /* Select one empty transmit mailbox */ - if (CANx->TSR & CAN_TSR_TME0) - mbx = CAN_TX_MBX0; - else if (CANx->TSR & CAN_TSR_TME1) - mbx = CAN_TX_MBX1; - else if (CANx->TSR & CAN_TSR_TME2) - mbx = CAN_TX_MBX2; - else - { - status = CAN_NO_MB; - return CAN_TX_NO_MBX; - } - - /* Set up the Id */ - if (msg->IDE == CAN_ID_STD) - data = (msg->ID << 21); - else - data = (msg->ID << 3) | CAN_ID_EXT; - - data |= ((uint32)msg->RTR); - - /* Set up the DLC */ - CANx->sTxMailBox[mbx].TDTR = (uint32)(msg->DLC & 0x0F); - - /* Set up the data field */ - CANx->sTxMailBox[mbx].TDLR = ( - ((uint32)msg->Data[3] << 24) | - ((uint32)msg->Data[2] << 16) | - ((uint32)msg->Data[1] << 8) | - ((uint32)msg->Data[0]) - ); - CANx->sTxMailBox[mbx].TDHR = ( - ((uint32)msg->Data[7] << 24) | - ((uint32)msg->Data[6] << 16) | - ((uint32)msg->Data[5] << 8) | - ((uint32)msg->Data[4]) - ); - /* Request transmission */ - CANx->sTxMailBox[mbx].TIR = (data | CAN_TMIDxR_TXRQ); - status = CAN_OK; - - return mbx; -} - -/** - * Checks the transmission of a message. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param mbx: the number of the mailbox that is used for transmission. - * @retval : CAN_TX_OK if the CAN driver transmits the message, CAN_TX_FAILED in an other case. - */ -CAN_STATUS can_tx_status(CAN_Port* CANx, CAN_TX_MBX mbx) -{ - /* RQCP, TXOK and TME bits */ - uint8 state = 0; - - switch (mbx) - { - case CAN_TX_MBX0: - state |= (uint8)((CANx->TSR & CAN_TSR_RQCP0) << 2); - state |= (uint8)((CANx->TSR & CAN_TSR_TXOK0) >> 0); - state |= (uint8)((CANx->TSR & CAN_TSR_TME0) >> 26); - break; - case CAN_TX_MBX1: - state |= (uint8)((CANx->TSR & CAN_TSR_RQCP1) >> 6); - state |= (uint8)((CANx->TSR & CAN_TSR_TXOK1) >> 8); - state |= (uint8)((CANx->TSR & CAN_TSR_TME1) >> 27); - break; - case CAN_TX_MBX2: - state |= (uint8)((CANx->TSR & CAN_TSR_RQCP2) >> 14); - state |= (uint8)((CANx->TSR & CAN_TSR_TXOK2) >> 16); - state |= (uint8)((CANx->TSR & CAN_TSR_TME2) >> 28); - break; - default: - status = CAN_TX_FAILED; - return status; - } - - // state = RQCP TXOK TME - switch (state) - { - /* transmit pending */ - case 0x0: - status = CAN_TX_PENDING; - break; - /* transmit failed */ - case 0x5: - status = CAN_TX_FAILED; - break; - /* transmit succedeed */ - case 0x7: - status = CAN_OK; - break; - default: - status = CAN_TX_FAILED; - break; - } - return status; -} - -/** - * @brief Cancels a transmit request. - * @param CANx: where x can be 1 to select the CAN peripheral. - * @param mbx: Mailbox number. - * @retval : None. - */ -void can_cancel(CAN_Port* CANx, uint8 mbx) -{ - /* abort transmission */ - switch (mbx) - { - case 0: - CANx->TSR |= CAN_TSR_ABRQ0; - break; - case 1: - CANx->TSR |= CAN_TSR_ABRQ1; - break; - case 2: - CANx->TSR |= CAN_TSR_ABRQ2; - break; - default: - break; - } -} - -void can_rx_queue_clear(void) -{ - nvic_irq_disable(NVIC_USB_LP_CAN_RX0); - nvic_irq_disable(NVIC_CAN_RX1); - __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee - __asm volatile( "isb" ); // that the protection against interrupts is effective - can_rx_head = can_rx_tail = can_rx_lost = 0; // JMD 2017/07/18 - nvic_irq_enable(NVIC_USB_LP_CAN_RX0); - nvic_irq_enable(NVIC_CAN_RX1); -} - -// JMD 2017/07/18 -- changed -uint8 can_rx_available(void) -{ - if ( can_rx_head >= can_rx_tail ) - return can_rx_head - can_rx_tail ; - else - return CAN_RX_QUEUE_SIZE - ( can_rx_tail - can_rx_head ) ; -} - -// JMD 2017/07/18 -- added -uint8 can_frame_lost(void) -{ - if ( can_rx_lost != 0 ) - { - can_rx_lost = 0 ; - return 1 ; - } - return 0 ; - -} - -CanMsg* can_rx_queue_get(void) -{ - if (can_rx_head == can_rx_tail) // JMD 2017/07/18 -- changed - return NULL; - return &(can_rx_queue[can_rx_tail]); -} - - -void can_rx_queue_free(void) -{ - if (can_rx_head != can_rx_tail) // JMD 2017/07/18 -- changed - { - nvic_irq_disable(NVIC_USB_LP_CAN_RX0); // JMD atomicity problem - nvic_irq_disable(NVIC_CAN_RX1); - __asm volatile( "dsb" ); // Synchronization of the pipeline to guarantee - __asm volatile( "isb" ); // that the protection against interrupts is effective - can_rx_tail = (can_rx_tail == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_tail + 1); - nvic_irq_enable(NVIC_USB_LP_CAN_RX0); // fin JMD problème d'atomicité - nvic_irq_enable(NVIC_CAN_RX1); - } -} - -CanMsg* can_read(CAN_Port* CANx, CAN_FIFO fifo, CanMsg* msg) -{ - uint32 data = CANx->sFIFOMailBox[fifo].RIR; - - /* Get the Id */ - if (data & CAN_ID_EXT) - { - msg->ID = 0x1FFFFFFF & (data >> 3); - msg->IDE = (uint8)CAN_ID_EXT; - } - else - { - msg->ID = 0x000007FF & (data >> 21); - msg->IDE = (uint8)CAN_ID_STD; - } - - msg->RTR = (uint8)(CAN_RTR_REMOTE & data); - msg->DLC = (uint8)(0x0F & CANx->sFIFOMailBox[fifo].RDTR); - msg->FMI = (uint8)(0xFF & (CANx->sFIFOMailBox[fifo].RDTR >> 8)); - - /* Get the data field */ - data = CANx->sFIFOMailBox[fifo].RDLR; - uint8* p = msg->Data; - *p++ = (uint8)0xFF & data; - *p++ = (uint8)0xFF & (data >> 8); - *p++ = (uint8)0xFF & (data >> 16); - *p++ = (uint8)0xFF & (data >> 24); - - data = CANx->sFIFOMailBox[fifo].RDHR; - *p++ = (uint8)0xFF & data; - *p++ = (uint8)0xFF & (data >> 8); - *p++ = (uint8)0xFF & (data >> 16); - *p++ = (uint8)0xFF & (data >> 24); - - return msg; -} - -void can_rx_release(CAN_Port* CANx, CAN_FIFO fifo) -{ - if (fifo == CAN_FIFO0) - CANx->RF0R |= (CAN_RF0R_RFOM0); // Release FIFO0 - else - CANx->RF1R |= (CAN_RF1R_RFOM1); // Release FIFO1 -} - -void can_rx_read(CAN_Port* CANx, CAN_FIFO fifo) -{ - if (can_rx_available() < CAN_RX_QUEUE_SIZE) // read the message - { - CanMsg* msg = &can_rx_queue[can_rx_head]; - can_read(CANx, fifo, msg); - can_rx_head = (can_rx_head == (CAN_RX_QUEUE_SIZE - 1)) ? 0 : (can_rx_head + 1); - } - else - can_rx_lost = 1; // no place in queue, ignore package - - can_rx_release(CANx, fifo); -} - -uint8 CAN_RX0_IRQ_Handler(void) -{ - if (can_active) - { - while ((CAN1_BASE->RF0R & CAN_RF0R_FMP0) != 0) - can_rx_read(CAN1_BASE, CAN_FIFO0); // message pending FIFO0 - while ((CAN1_BASE->RF1R & CAN_RF1R_FMP1) != 0) - can_rx_read(CAN1_BASE, CAN_FIFO1); // message pending FIFO1 - } - return can_active; // return CAN active flag to USB handler -} - -// Addition JMD: the messages stored in fifo1 must also trigger an interrupt. -void __irq_can_rx1(void) -{ - CAN_RX0_IRQ_Handler() ; -} - -void USB_HP_CAN_TX_IRQHandler (void) -{ - if (can_active) - { - if (CAN1_BASE->TSR & CAN_TSR_RQCP0) - CAN1_BASE->TSR |= CAN_TSR_RQCP0; // reset request complete mbx 0 - if (CAN1_BASE->TSR & CAN_TSR_RQCP1) - CAN1_BASE->TSR |= CAN_TSR_RQCP1; // reset request complete mbx 1 - if (CAN1_BASE->TSR & CAN_TSR_RQCP2) - CAN1_BASE->TSR |= CAN_TSR_RQCP2; // reset request complete mbx 2 - } -} diff --git a/STM32F1/libraries/rcc.h b/STM32F1/libraries/rcc.h deleted file mode 100644 index aa9f8d3c9..000000000 --- a/STM32F1/libraries/rcc.h +++ /dev/null @@ -1,641 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file libmaple/stm32f1/include/series/rcc.h - * @brief STM32F1 reset and clock control (RCC) support. - */ - -#ifndef _LIBMAPLE_STM32F1_RCC_H_ -#define _LIBMAPLE_STM32F1_RCC_H_ - -#ifdef __cplusplus -extern "C"{ -#endif - -#include -#include - -/* - * Register map - */ - -/** STM32F1 RCC register map type */ -typedef struct rcc_reg_map { - __io uint32 CR; /**< Clock control register */ - __io uint32 CFGR; /**< Clock configuration register */ - __io uint32 CIR; /**< Clock interrupt register */ - __io uint32 APB2RSTR; /**< APB2 peripheral reset register */ - __io uint32 APB1RSTR; /**< APB1 peripheral reset register */ - __io uint32 AHBENR; /**< AHB peripheral clock enable register */ - __io uint32 APB2ENR; /**< APB2 peripheral clock enable register */ - __io uint32 APB1ENR; /**< APB1 peripheral clock enable register */ - __io uint32 BDCR; /**< Backup domain control register */ - __io uint32 CSR; /**< Control/status register */ -} rcc_reg_map; - -#define RCC_BASE ((struct rcc_reg_map*)0x40021000) - -/* - * Register bit definitions - */ - -/* Clock control register */ - -#define RCC_CR_PLLRDY_BIT 25 -#define RCC_CR_PLLON_BIT 24 -#define RCC_CR_CSSON_BIT 19 -#define RCC_CR_HSEBYP_BIT 18 -#define RCC_CR_HSERDY_BIT 17 -#define RCC_CR_HSEON_BIT 16 -#define RCC_CR_HSIRDY_BIT 1 -#define RCC_CR_HSION_BIT 0 - -#define RCC_CR_PLLRDY (1U << RCC_CR_PLLRDY_BIT) -#define RCC_CR_PLLON (1U << RCC_CR_PLLON_BIT) -#define RCC_CR_CSSON (1U << RCC_CR_CSSON_BIT) -#define RCC_CR_HSEBYP (1U << RCC_CR_HSEBYP_BIT) -#define RCC_CR_HSERDY (1U << RCC_CR_HSERDY_BIT) -#define RCC_CR_HSEON (1U << RCC_CR_HSEON_BIT) -#define RCC_CR_HSICAL (0xFF << 8) -#define RCC_CR_HSITRIM (0x1F << 3) -#define RCC_CR_HSIRDY (1U << RCC_CR_HSIRDY_BIT) -#define RCC_CR_HSION (1U << RCC_CR_HSION_BIT) - -/* Clock configuration register */ - -#define RCC_CFGR_USBPRE_BIT 22 -#define RCC_CFGR_PLLXTPRE_BIT 17 -#define RCC_CFGR_PLLSRC_BIT 16 - -#define RCC_CFGR_MCO (0x3 << 24) -#define RCC_CFGR_USBPRE (0x3 << RCC_CFGR_USBPRE_BIT) -#define RCC_CFGR_PLLMUL (0xF << 18) -#define RCC_CFGR_PLLXTPRE (1U << RCC_CFGR_PLLXTPRE_BIT) -#define RCC_CFGR_PLLSRC (1U << RCC_CFGR_PLLSRC_BIT) -#define RCC_CFGR_ADCPRE (0x3 << 14) -#define RCC_CFGR_PPRE2 (0x7 << 11) -#define RCC_CFGR_PPRE1 (0x7 << 8) -#define RCC_CFGR_HPRE (0xF << 4) -#define RCC_CFGR_SWS (0x3 << 2) -#define RCC_CFGR_SWS_PLL (0x2 << 2) -#define RCC_CFGR_SWS_HSE (0x1 << 2) -#define RCC_CFGR_SW 0x3 -#define RCC_CFGR_SW_PLL 0x2 -#define RCC_CFGR_SW_HSE 0x1 - -/* Clock interrupt register */ - -#define RCC_CIR_CSSC_BIT 23 -#define RCC_CIR_PLLRDYC_BIT 20 -#define RCC_CIR_HSERDYC_BIT 19 -#define RCC_CIR_HSIRDYC_BIT 18 -#define RCC_CIR_LSERDYC_BIT 17 -#define RCC_CIR_LSIRDYC_BIT 16 -#define RCC_CIR_PLLRDYIE_BIT 12 -#define RCC_CIR_HSERDYIE_BIT 11 -#define RCC_CIR_HSIRDYIE_BIT 10 -#define RCC_CIR_LSERDYIE_BIT 9 -#define RCC_CIR_LSIRDYIE_BIT 8 -#define RCC_CIR_CSSF_BIT 7 -#define RCC_CIR_PLLRDYF_BIT 4 -#define RCC_CIR_HSERDYF_BIT 3 -#define RCC_CIR_HSIRDYF_BIT 2 -#define RCC_CIR_LSERDYF_BIT 1 -#define RCC_CIR_LSIRDYF_BIT 0 - -#define RCC_CIR_CSSC (1U << RCC_CIR_CSSC_BIT) -#define RCC_CIR_PLLRDYC (1U << RCC_CIR_PLLRDYC_BIT) -#define RCC_CIR_HSERDYC (1U << RCC_CIR_HSERDYC_BIT) -#define RCC_CIR_HSIRDYC (1U << RCC_CIR_HSIRDYC_BIT) -#define RCC_CIR_LSERDYC (1U << RCC_CIR_LSERDYC_BIT) -#define RCC_CIR_LSIRDYC (1U << RCC_CIR_LSIRDYC_BIT) -#define RCC_CIR_PLLRDYIE (1U << RCC_CIR_PLLRDYIE_BIT) -#define RCC_CIR_HSERDYIE (1U << RCC_CIR_HSERDYIE_BIT) -#define RCC_CIR_HSIRDYIE (1U << RCC_CIR_HSIRDYIE_BIT) -#define RCC_CIR_LSERDYIE (1U << RCC_CIR_LSERDYIE_BIT) -#define RCC_CIR_LSIRDYIE (1U << RCC_CIR_LSIRDYIE_BIT) -#define RCC_CIR_CSSF (1U << RCC_CIR_CSSF_BIT) -#define RCC_CIR_PLLRDYF (1U << RCC_CIR_PLLRDYF_BIT) -#define RCC_CIR_HSERDYF (1U << RCC_CIR_HSERDYF_BIT) -#define RCC_CIR_HSIRDYF (1U << RCC_CIR_HSIRDYF_BIT) -#define RCC_CIR_LSERDYF (1U << RCC_CIR_LSERDYF_BIT) -#define RCC_CIR_LSIRDYF (1U << RCC_CIR_LSIRDYF_BIT) - -/* APB2 peripheral reset register */ - -#define RCC_APB2RSTR_TIM11RST_BIT 21 -#define RCC_APB2RSTR_TIM10RST_BIT 20 -#define RCC_APB2RSTR_TIM9RST_BIT 19 -#define RCC_APB2RSTR_ADC3RST_BIT 15 -#define RCC_APB2RSTR_USART1RST_BIT 14 -#define RCC_APB2RSTR_TIM8RST_BIT 13 -#define RCC_APB2RSTR_SPI1RST_BIT 12 -#define RCC_APB2RSTR_TIM1RST_BIT 11 -#define RCC_APB2RSTR_ADC2RST_BIT 10 -#define RCC_APB2RSTR_ADC1RST_BIT 9 -#define RCC_APB2RSTR_IOPGRST_BIT 8 -#define RCC_APB2RSTR_IOPFRST_BIT 7 -#define RCC_APB2RSTR_IOPERST_BIT 6 -#define RCC_APB2RSTR_IOPDRST_BIT 5 -#define RCC_APB2RSTR_IOPCRST_BIT 4 -#define RCC_APB2RSTR_IOPBRST_BIT 3 -#define RCC_APB2RSTR_IOPARST_BIT 2 -#define RCC_APB2RSTR_AFIORST_BIT 0 - -#define RCC_APB2RSTR_TIM11RST (1U << RCC_APB2RSTR_TIM11RST_BIT) -#define RCC_APB2RSTR_TIM10RST (1U << RCC_APB2RSTR_TIM10RST_BIT) -#define RCC_APB2RSTR_TIM9RST (1U << RCC_APB2RSTR_TIM9RST_BIT) -#define RCC_APB2RSTR_ADC3RST (1U << RCC_APB2RSTR_ADC3RST_BIT) -#define RCC_APB2RSTR_USART1RST (1U << RCC_APB2RSTR_USART1RST_BIT) -#define RCC_APB2RSTR_TIM8RST (1U << RCC_APB2RSTR_TIM8RST_BIT) -#define RCC_APB2RSTR_SPI1RST (1U << RCC_APB2RSTR_SPI1RST_BIT) -#define RCC_APB2RSTR_TIM1RST (1U << RCC_APB2RSTR_TIM1RST_BIT) -#define RCC_APB2RSTR_ADC2RST (1U << RCC_APB2RSTR_ADC2RST_BIT) -#define RCC_APB2RSTR_ADC1RST (1U << RCC_APB2RSTR_ADC1RST_BIT) -#define RCC_APB2RSTR_IOPGRST (1U << RCC_APB2RSTR_IOPGRST_BIT) -#define RCC_APB2RSTR_IOPFRST (1U << RCC_APB2RSTR_IOPFRST_BIT) -#define RCC_APB2RSTR_IOPERST (1U << RCC_APB2RSTR_IOPERST_BIT) -#define RCC_APB2RSTR_IOPDRST (1U << RCC_APB2RSTR_IOPDRST_BIT) -#define RCC_APB2RSTR_IOPCRST (1U << RCC_APB2RSTR_IOPCRST_BIT) -#define RCC_APB2RSTR_IOPBRST (1U << RCC_APB2RSTR_IOPBRST_BIT) -#define RCC_APB2RSTR_IOPARST (1U << RCC_APB2RSTR_IOPARST_BIT) -#define RCC_APB2RSTR_AFIORST (1U << RCC_APB2RSTR_AFIORST_BIT) - -/* APB1 peripheral reset register */ - -#define RCC_APB1RSTR_DACRST_BIT 29 -#define RCC_APB1RSTR_PWRRST_BIT 28 -#define RCC_APB1RSTR_BKPRST_BIT 27 -#define RCC_APB1RSTR_CANRST_BIT 25 -#define RCC_APB1RSTR_USBRST_BIT 23 -#define RCC_APB1RSTR_I2C2RST_BIT 22 -#define RCC_APB1RSTR_I2C1RST_BIT 21 -#define RCC_APB1RSTR_UART5RST_BIT 20 -#define RCC_APB1RSTR_UART4RST_BIT 19 -#define RCC_APB1RSTR_USART3RST_BIT 18 -#define RCC_APB1RSTR_USART2RST_BIT 17 -#define RCC_APB1RSTR_SPI3RST_BIT 15 -#define RCC_APB1RSTR_SPI2RST_BIT 14 -#define RCC_APB1RSTR_WWDRST_BIT 11 -#define RCC_APB1RSTR_TIM14RST_BIT 8 -#define RCC_APB1RSTR_TIM13RST_BIT 7 -#define RCC_APB1RSTR_TIM12RST_BIT 6 -#define RCC_APB1RSTR_TIM7RST_BIT 5 -#define RCC_APB1RSTR_TIM6RST_BIT 4 -#define RCC_APB1RSTR_TIM5RST_BIT 3 -#define RCC_APB1RSTR_TIM4RST_BIT 2 -#define RCC_APB1RSTR_TIM3RST_BIT 1 -#define RCC_APB1RSTR_TIM2RST_BIT 0 - -#define RCC_APB1RSTR_DACRST (1U << RCC_APB1RSTR_DACRST_BIT) -#define RCC_APB1RSTR_PWRRST (1U << RCC_APB1RSTR_PWRRST_BIT) -#define RCC_APB1RSTR_BKPRST (1U << RCC_APB1RSTR_BKPRST_BIT) -#define RCC_APB1RSTR_CANRST (1U << RCC_APB1RSTR_CANRST_BIT) -#define RCC_APB1RSTR_USBRST (1U << RCC_APB1RSTR_USBRST_BIT) -#define RCC_APB1RSTR_I2C2RST (1U << RCC_APB1RSTR_I2C2RST_BIT) -#define RCC_APB1RSTR_I2C1RST (1U << RCC_APB1RSTR_I2C1RST_BIT) -#define RCC_APB1RSTR_UART5RST (1U << RCC_APB1RSTR_UART5RST_BIT) -#define RCC_APB1RSTR_UART4RST (1U << RCC_APB1RSTR_UART4RST_BIT) -#define RCC_APB1RSTR_USART3RST (1U << RCC_APB1RSTR_USART3RST_BIT) -#define RCC_APB1RSTR_USART2RST (1U << RCC_APB1RSTR_USART2RST_BIT) -#define RCC_APB1RSTR_SPI3RST (1U << RCC_APB1RSTR_SPI3RST_BIT) -#define RCC_APB1RSTR_SPI2RST (1U << RCC_APB1RSTR_SPI2RST_BIT) -#define RCC_APB1RSTR_WWDRST (1U << RCC_APB1RSTR_WWDRST_BIT) -#define RCC_APB1RSTR_TIM14RST (1U << RCC_APB1RSTR_TIM14RST_BIT) -#define RCC_APB1RSTR_TIM13RST (1U << RCC_APB1RSTR_TIM13RST_BIT) -#define RCC_APB1RSTR_TIM12RST (1U << RCC_APB1RSTR_TIM12RST_BIT) -#define RCC_APB1RSTR_TIM7RST (1U << RCC_APB1RSTR_TIM7RST_BIT) -#define RCC_APB1RSTR_TIM6RST (1U << RCC_APB1RSTR_TIM6RST_BIT) -#define RCC_APB1RSTR_TIM5RST (1U << RCC_APB1RSTR_TIM5RST_BIT) -#define RCC_APB1RSTR_TIM4RST (1U << RCC_APB1RSTR_TIM4RST_BIT) -#define RCC_APB1RSTR_TIM3RST (1U << RCC_APB1RSTR_TIM3RST_BIT) -#define RCC_APB1RSTR_TIM2RST (1U << RCC_APB1RSTR_TIM2RST_BIT) - -/* AHB peripheral clock enable register */ - -#define RCC_AHBENR_SDIOEN_BIT 10 -#define RCC_AHBENR_FSMCEN_BIT 8 -#define RCC_AHBENR_CRCEN_BIT 7 -#define RCC_AHBENR_FLITFEN_BIT 4 -#define RCC_AHBENR_SRAMEN_BIT 2 -#define RCC_AHBENR_DMA2EN_BIT 1 -#define RCC_AHBENR_DMA1EN_BIT 0 - -#define RCC_AHBENR_SDIOEN (1U << RCC_AHBENR_SDIOEN_BIT) -#define RCC_AHBENR_FSMCEN (1U << RCC_AHBENR_FSMCEN_BIT) -#define RCC_AHBENR_CRCEN (1U << RCC_AHBENR_CRCEN_BIT) -#define RCC_AHBENR_FLITFEN (1U << RCC_AHBENR_FLITFEN_BIT) -#define RCC_AHBENR_SRAMEN (1U << RCC_AHBENR_SRAMEN_BIT) -#define RCC_AHBENR_DMA2EN (1U << RCC_AHBENR_DMA2EN_BIT) -#define RCC_AHBENR_DMA1EN (1U << RCC_AHBENR_DMA1EN_BIT) - -/* APB2 peripheral clock enable register */ - -#define RCC_APB2ENR_TIM11EN_BIT 21 -#define RCC_APB2ENR_TIM10EN_BIT 20 -#define RCC_APB2ENR_TIM9EN_BIT 19 -#define RCC_APB2ENR_ADC3EN_BIT 15 -#define RCC_APB2ENR_USART1EN_BIT 14 -#define RCC_APB2ENR_TIM8EN_BIT 13 -#define RCC_APB2ENR_SPI1EN_BIT 12 -#define RCC_APB2ENR_TIM1EN_BIT 11 -#define RCC_APB2ENR_ADC2EN_BIT 10 -#define RCC_APB2ENR_ADC1EN_BIT 9 -#define RCC_APB2ENR_IOPGEN_BIT 8 -#define RCC_APB2ENR_IOPFEN_BIT 7 -#define RCC_APB2ENR_IOPEEN_BIT 6 -#define RCC_APB2ENR_IOPDEN_BIT 5 -#define RCC_APB2ENR_IOPCEN_BIT 4 -#define RCC_APB2ENR_IOPBEN_BIT 3 -#define RCC_APB2ENR_IOPAEN_BIT 2 -#define RCC_APB2ENR_AFIOEN_BIT 0 - -#define RCC_APB2ENR_TIM11EN (1U << RCC_APB2ENR_TIM11EN_BIT) -#define RCC_APB2ENR_TIM10EN (1U << RCC_APB2ENR_TIM10EN_BIT) -#define RCC_APB2ENR_TIM9EN (1U << RCC_APB2ENR_TIM9EN_BIT) -#define RCC_APB2ENR_ADC3EN (1U << RCC_APB2ENR_ADC3EN_BIT) -#define RCC_APB2ENR_USART1EN (1U << RCC_APB2ENR_USART1EN_BIT) -#define RCC_APB2ENR_TIM8EN (1U << RCC_APB2ENR_TIM8EN_BIT) -#define RCC_APB2ENR_SPI1EN (1U << RCC_APB2ENR_SPI1EN_BIT) -#define RCC_APB2ENR_TIM1EN (1U << RCC_APB2ENR_TIM1EN_BIT) -#define RCC_APB2ENR_ADC2EN (1U << RCC_APB2ENR_ADC2EN_BIT) -#define RCC_APB2ENR_ADC1EN (1U << RCC_APB2ENR_ADC1EN_BIT) -#define RCC_APB2ENR_IOPGEN (1U << RCC_APB2ENR_IOPGEN_BIT) -#define RCC_APB2ENR_IOPFEN (1U << RCC_APB2ENR_IOPFEN_BIT) -#define RCC_APB2ENR_IOPEEN (1U << RCC_APB2ENR_IOPEEN_BIT) -#define RCC_APB2ENR_IOPDEN (1U << RCC_APB2ENR_IOPDEN_BIT) -#define RCC_APB2ENR_IOPCEN (1U << RCC_APB2ENR_IOPCEN_BIT) -#define RCC_APB2ENR_IOPBEN (1U << RCC_APB2ENR_IOPBEN_BIT) -#define RCC_APB2ENR_IOPAEN (1U << RCC_APB2ENR_IOPAEN_BIT) -#define RCC_APB2ENR_AFIOEN (1U << RCC_APB2ENR_AFIOEN_BIT) - -/* APB1 peripheral clock enable register */ - -#define RCC_APB1ENR_DACEN_BIT 29 -#define RCC_APB1ENR_PWREN_BIT 28 -#define RCC_APB1ENR_BKPEN_BIT 27 -#define RCC_APB1ENR_CANEN_BIT 25 -#define RCC_APB1ENR_USBEN_BIT 23 -#define RCC_APB1ENR_I2C2EN_BIT 22 -#define RCC_APB1ENR_I2C1EN_BIT 21 -#define RCC_APB1ENR_UART5EN_BIT 20 -#define RCC_APB1ENR_UART4EN_BIT 19 -#define RCC_APB1ENR_USART3EN_BIT 18 -#define RCC_APB1ENR_USART2EN_BIT 17 -#define RCC_APB1ENR_SPI3EN_BIT 15 -#define RCC_APB1ENR_SPI2EN_BIT 14 -#define RCC_APB1ENR_WWDEN_BIT 11 -#define RCC_APB1ENR_TIM14EN_BIT 8 -#define RCC_APB1ENR_TIM13EN_BIT 7 -#define RCC_APB1ENR_TIM12EN_BIT 6 -#define RCC_APB1ENR_TIM7EN_BIT 5 -#define RCC_APB1ENR_TIM6EN_BIT 4 -#define RCC_APB1ENR_TIM5EN_BIT 3 -#define RCC_APB1ENR_TIM4EN_BIT 2 -#define RCC_APB1ENR_TIM3EN_BIT 1 -#define RCC_APB1ENR_TIM2EN_BIT 0 - -#define RCC_APB1ENR_DACEN (1U << RCC_APB1ENR_DACEN_BIT) -#define RCC_APB1ENR_PWREN (1U << RCC_APB1ENR_PWREN_BIT) -#define RCC_APB1ENR_BKPEN (1U << RCC_APB1ENR_BKPEN_BIT) -#define RCC_APB1ENR_CANEN (1U << RCC_APB1ENR_CANEN_BIT) -#define RCC_APB1ENR_USBEN (1U << RCC_APB1ENR_USBEN_BIT) -#define RCC_APB1ENR_I2C2EN (1U << RCC_APB1ENR_I2C2EN_BIT) -#define RCC_APB1ENR_I2C1EN (1U << RCC_APB1ENR_I2C1EN_BIT) -#define RCC_APB1ENR_UART5EN (1U << RCC_APB1ENR_UART5EN_BIT) -#define RCC_APB1ENR_UART4EN (1U << RCC_APB1ENR_UART4EN_BIT) -#define RCC_APB1ENR_USART3EN (1U << RCC_APB1ENR_USART3EN_BIT) -#define RCC_APB1ENR_USART2EN (1U << RCC_APB1ENR_USART2EN_BIT) -#define RCC_APB1ENR_SPI3EN (1U << RCC_APB1ENR_SPI3EN_BIT) -#define RCC_APB1ENR_SPI2EN (1U << RCC_APB1ENR_SPI2EN_BIT) -#define RCC_APB1ENR_WWDEN (1U << RCC_APB1ENR_WWDEN_BIT) -#define RCC_APB1ENR_TIM14EN (1U << RCC_APB1ENR_TIM14EN_BIT) -#define RCC_APB1ENR_TIM13EN (1U << RCC_APB1ENR_TIM13EN_BIT) -#define RCC_APB1ENR_TIM12EN (1U << RCC_APB1ENR_TIM12EN_BIT) -#define RCC_APB1ENR_TIM7EN (1U << RCC_APB1ENR_TIM7EN_BIT) -#define RCC_APB1ENR_TIM6EN (1U << RCC_APB1ENR_TIM6EN_BIT) -#define RCC_APB1ENR_TIM5EN (1U << RCC_APB1ENR_TIM5EN_BIT) -#define RCC_APB1ENR_TIM4EN (1U << RCC_APB1ENR_TIM4EN_BIT) -#define RCC_APB1ENR_TIM3EN (1U << RCC_APB1ENR_TIM3EN_BIT) -#define RCC_APB1ENR_TIM2EN (1U << RCC_APB1ENR_TIM2EN_BIT) - -/* Backup domain control register */ - -#define RCC_BDCR_BDRST_BIT 16 -#define RCC_BDCR_RTCEN_BIT 15 -#define RCC_BDCR_LSEBYP_BIT 2 -#define RCC_BDCR_LSERDY_BIT 1 -#define RCC_BDCR_LSEON_BIT 0 - -#define RCC_BDCR_BDRST (1U << RCC_BDCR_BDRST_BIT) -#define RCC_BDCR_RTCEN (1U << RCC_BDCR_RTC_BIT) -#define RCC_BDCR_RTCSEL (0x3 << 8) -#define RCC_BDCR_RTCSEL_NONE (0x0 << 8) -#define RCC_BDCR_RTCSEL_LSE (0x1 << 8) -#define RCC_BDCR_RTCSEL_LSI (0x2 << 8) // added to support RTClock -#define RCC_BDCR_RTCSEL_HSE (0x3 << 8) -#define RCC_BDCR_LSEBYP (1U << RCC_BDCR_LSEBYP_BIT) -#define RCC_BDCR_LSERDY (1U << RCC_BDCR_LSERDY_BIT) -#define RCC_BDCR_LSEON (1U << RCC_BDCR_LSEON_BIT) - -/* Control/status register */ - -#define RCC_CSR_LPWRRSTF_BIT 31 -#define RCC_CSR_WWDGRSTF_BIT 30 -#define RCC_CSR_IWDGRSTF_BIT 29 -#define RCC_CSR_SFTRSTF_BIT 28 -#define RCC_CSR_PORRSTF_BIT 27 -#define RCC_CSR_PINRSTF_BIT 26 -#define RCC_CSR_RMVF_BIT 24 -#define RCC_CSR_LSIRDY_BIT 1 -#define RCC_CSR_LSION_BIT 0 - -#define RCC_CSR_LPWRRSTF (1U << RCC_CSR_LPWRRSTF_BIT) -#define RCC_CSR_WWDGRSTF (1U << RCC_CSR_WWDGRSTF_BIT) -#define RCC_CSR_IWDGRSTF (1U << RCC_CSR_IWDGRSTF_BIT) -#define RCC_CSR_SFTRSTF (1U << RCC_CSR_SFTRSTF_BIT) -#define RCC_CSR_PORRSTF (1U << RCC_CSR_PORRSTF_BIT) -#define RCC_CSR_PINRSTF (1U << RCC_CSR_PINRSTF_BIT) -#define RCC_CSR_RMVF (1U << RCC_CSR_RMVF_BIT) -#define RCC_CSR_LSIRDY (1U << RCC_CSR_LSIRDY_BIT) -#define RCC_CSR_LSION (1U << RCC_CSR_LSION_BIT) - -/* - * libmaple-mandated enumeration types. - */ - -/** - * @brief STM32F1 rcc_clk_id. - */ -typedef enum rcc_clk_id { - RCC_ADC1, - RCC_ADC2, - RCC_ADC3, - RCC_AFIO, - RCC_BKP, - RCC_CRC, - RCC_DAC, - RCC_DMA1, - RCC_DMA2, - RCC_FLITF, - RCC_FSMC, - RCC_GPIOA, - RCC_GPIOB, - RCC_GPIOC, - RCC_GPIOD, - RCC_GPIOE, - RCC_GPIOF, - RCC_GPIOG, - RCC_I2C1, - RCC_I2C2, - RCC_PWR, - RCC_SDIO, - RCC_SPI1, - RCC_SPI2, - RCC_SPI3, - RCC_SRAM, - RCC_TIMER1, - RCC_TIMER2, - RCC_TIMER3, - RCC_TIMER4, - RCC_TIMER5, - RCC_TIMER6, - RCC_TIMER7, - RCC_TIMER8, - RCC_TIMER9, - RCC_TIMER10, - RCC_TIMER11, - RCC_TIMER12, - RCC_TIMER13, - RCC_TIMER14, - RCC_USART1, - RCC_USART2, - RCC_USART3, - RCC_UART4, - RCC_UART5, - RCC_USB, - RCC_CAN, //! JMD after X893 -} rcc_clk_id; - -/** - * @brief STM32F1 PLL clock sources. - * @see rcc_configure_pll() - */ -typedef enum rcc_pllsrc { - RCC_PLLSRC_HSE = (0x1 << 16), - RCC_PLLSRC_HSI_DIV_2 = (0x0 << 16) -} rcc_pllsrc; - -/** - * @brief STM32F1 clock domains. - * @see rcc_dev_clk() - */ -typedef enum rcc_clk_domain { - RCC_APB1, - RCC_APB2, - RCC_AHB -} rcc_clk_domain; - -/** - * @brief STM32F1 Prescaler identifiers - * @see rcc_set_prescaler() - */ -typedef enum rcc_prescaler { - RCC_PRESCALER_AHB, - RCC_PRESCALER_APB1, - RCC_PRESCALER_APB2, - RCC_PRESCALER_USB, - RCC_PRESCALER_ADC -} rcc_prescaler; - -/** - * @brief STM32F1 ADC prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_adc_divider { - RCC_ADCPRE_PCLK_DIV_2 = 0x0 << 14, - RCC_ADCPRE_PCLK_DIV_4 = 0x1 << 14, - RCC_ADCPRE_PCLK_DIV_6 = 0x2 << 14, - RCC_ADCPRE_PCLK_DIV_8 = 0x3 << 14, -} rcc_adc_divider; - -/** - * @brief STM32F1 APB1 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb1_divider { - RCC_APB1_HCLK_DIV_1 = 0x0 << 8, - RCC_APB1_HCLK_DIV_2 = 0x4 << 8, - RCC_APB1_HCLK_DIV_4 = 0x5 << 8, - RCC_APB1_HCLK_DIV_8 = 0x6 << 8, - RCC_APB1_HCLK_DIV_16 = 0x7 << 8, -} rcc_apb1_divider; - -/** - * @brief STM32F1 APB2 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb2_divider { - RCC_APB2_HCLK_DIV_1 = 0x0 << 11, - RCC_APB2_HCLK_DIV_2 = 0x4 << 11, - RCC_APB2_HCLK_DIV_4 = 0x5 << 11, - RCC_APB2_HCLK_DIV_8 = 0x6 << 11, - RCC_APB2_HCLK_DIV_16 = 0x7 << 11, -} rcc_apb2_divider; - -/** - * @brief STM32F1 AHB prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_ahb_divider { - RCC_AHB_SYSCLK_DIV_1 = 0x0 << 4, - RCC_AHB_SYSCLK_DIV_2 = 0x8 << 4, - RCC_AHB_SYSCLK_DIV_4 = 0x9 << 4, - RCC_AHB_SYSCLK_DIV_8 = 0xA << 4, - RCC_AHB_SYSCLK_DIV_16 = 0xB << 4, - RCC_AHB_SYSCLK_DIV_32 = 0xC << 4, - RCC_AHB_SYSCLK_DIV_64 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_128 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_256 = 0xE << 4, - RCC_AHB_SYSCLK_DIV_512 = 0xF << 4, -} rcc_ahb_divider; - -/** - * @brief STM32F1 USB prescaler dividers - * @see rcc_set_prescaler() - */ - /* - Set and reset by software to control the USB clock prescaler value. The USB clock -must be 48MHz. These bits can’t be reset if the USB clock is enabled. -00: (CK_PLL / 1.5) selected -01: CK_PLL selected - */ - -typedef enum rcc_usb_divider { - RCC_USB_SYSCLK_DIV_1 = 0x1 << 22, - RCC_USB_SYSCLK_DIV_1_5 = 0x0 << 22, - RCC_USB_SYSCLK_DIV_2 = 0x3 << 22, - RCC_USB_SYSCLK_DIV_2_5 = 0x2 << 22, -} rcc_usb_divider; - - -/** - * @brief Start the low speed internal oscillator - */ -static inline void rcc_start_lsi(void) { - *bb_perip(&RCC_BASE->CSR, RCC_CSR_LSION_BIT) = 1; - while (*bb_perip(&RCC_BASE->CSR, RCC_CSR_LSIRDY_BIT) == 0); -} - -/** - * @brief STM32F1 clock sources. - */ -typedef enum rcc_clk { - RCC_CLK_PLL = (uint16)((offsetof(struct rcc_reg_map, CR) << 8) | - RCC_CR_PLLON_BIT), /**< Main PLL, clocked by - HSI or HSE. */ - RCC_CLK_HSE = (uint16)((offsetof(struct rcc_reg_map, CR) << 8) | - RCC_CR_HSEON_BIT), /**< High speed external. */ - RCC_CLK_HSI = (uint16)((offsetof(struct rcc_reg_map, CR) << 8) | - RCC_CR_HSION_BIT), /**< High speed internal. */ - RCC_CLK_LSE = (uint16)((offsetof(struct rcc_reg_map, BDCR) << 8) | - RCC_BDCR_LSEON_BIT), /**< Low-speed external - * (32.768 KHz). */ - RCC_CLK_LSI = (uint16)((offsetof(struct rcc_reg_map, CSR) << 8) | - RCC_CSR_LSION_BIT), /**< Low-speed internal - * (approximately 32 KHz). */ -} rcc_clk; - -/** - * @brief STM32F1 PLL multipliers. - */ -typedef enum rcc_pll_multiplier { - RCC_PLLMUL_2 = (0x0 << 18), - RCC_PLLMUL_3 = (0x1 << 18), - RCC_PLLMUL_4 = (0x2 << 18), - RCC_PLLMUL_5 = (0x3 << 18), - RCC_PLLMUL_6 = (0x4 << 18), - RCC_PLLMUL_7 = (0x5 << 18), - RCC_PLLMUL_8 = (0x6 << 18), - RCC_PLLMUL_9 = (0x7 << 18), - RCC_PLLMUL_10 = (0x8 << 18), - RCC_PLLMUL_11 = (0x9 << 18), - RCC_PLLMUL_12 = (0xA << 18), - RCC_PLLMUL_13 = (0xB << 18), - RCC_PLLMUL_14 = (0xC << 18), - RCC_PLLMUL_15 = (0xD << 18), - RCC_PLLMUL_16 = (0xE << 18), -} rcc_pll_multiplier; - -/* FIXME [0.0.13] Just have data point to an rcc_pll_multiplier! */ -/** - * @brief Start the low speed external oscillatior - */ -static inline void rcc_start_lse(void) { - bb_peri_set_bit(&RCC_BASE->BDCR, RCC_BDCR_LSEBYP_BIT, 0); - bb_peri_set_bit(&RCC_BASE->BDCR, RCC_BDCR_LSEON_BIT, 1); - while (bb_peri_get_bit(&RCC_BASE->BDCR, RCC_BDCR_LSERDY_BIT ) == 0); -} - -/** - * @brief STM32F1 PLL configuration values. - * Point to one of these with the "data" field in a struct rcc_pll_cfg. - * @see struct rcc_pll_cfg. - */ -typedef struct stm32f1_rcc_pll_data { - rcc_pll_multiplier pll_mul; /**< PLL multiplication factor. */ -} stm32f1_rcc_pll_data; - -/* - * Deprecated bits. - */ -static inline void rcc_start_hse(void) { // Added to support RTClock -// *bb_perip(&RCC_BASE->CR, RCC_CR_HSEON_BIT) = 1; - while (bb_peri_get_bit(&RCC_BASE->CR, RCC_CR_HSERDY_BIT) == 0); -} - -/** - * @brief Deprecated; STM32F1 only. - * - * Initialize the clock control system. Initializes the system - * clock source to use the PLL driven by an external oscillator. - * - * @param sysclk_src system clock source, must be PLL - * @param pll_src pll clock source, must be HSE - * @param pll_mul pll multiplier - */ -__deprecated -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/STM32F1/libraries/rcc_f1.c b/STM32F1/libraries/rcc_f1.c deleted file mode 100644 index 9040a4dc2..000000000 --- a/STM32F1/libraries/rcc_f1.c +++ /dev/null @@ -1,174 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file libmaple/stm32f1/rcc.c - * @brief STM32F1 RCC. - */ - -#include -#include -#include - -#include "rcc_private.h" - -#define APB1 RCC_APB1 -#define APB2 RCC_APB2 -#define AHB RCC_AHB - -/* Device descriptor table, maps rcc_clk_id onto bus and enable/reset - * register bit numbers. */ -const struct rcc_dev_info rcc_dev_table[] = { - [RCC_GPIOA] = { .clk_domain = APB2, .line_num = 2 }, - [RCC_GPIOB] = { .clk_domain = APB2, .line_num = 3 }, - [RCC_GPIOC] = { .clk_domain = APB2, .line_num = 4 }, - [RCC_GPIOD] = { .clk_domain = APB2, .line_num = 5 }, - [RCC_AFIO] = { .clk_domain = APB2, .line_num = 0 }, - [RCC_ADC1] = { .clk_domain = APB2, .line_num = 9 }, - [RCC_ADC2] = { .clk_domain = APB2, .line_num = 10 }, - [RCC_ADC3] = { .clk_domain = APB2, .line_num = 15 }, - [RCC_USART1] = { .clk_domain = APB2, .line_num = 14 }, - [RCC_USART2] = { .clk_domain = APB1, .line_num = 17 }, - [RCC_USART3] = { .clk_domain = APB1, .line_num = 18 }, - [RCC_TIMER1] = { .clk_domain = APB2, .line_num = 11 }, - [RCC_TIMER2] = { .clk_domain = APB1, .line_num = 0 }, - [RCC_TIMER3] = { .clk_domain = APB1, .line_num = 1 }, - [RCC_TIMER4] = { .clk_domain = APB1, .line_num = 2 }, - [RCC_SPI1] = { .clk_domain = APB2, .line_num = 12 }, - [RCC_SPI2] = { .clk_domain = APB1, .line_num = 14 }, - [RCC_DMA1] = { .clk_domain = AHB, .line_num = 0 }, - [RCC_PWR] = { .clk_domain = APB1, .line_num = 28}, - [RCC_BKP] = { .clk_domain = APB1, .line_num = 27}, - [RCC_I2C1] = { .clk_domain = APB1, .line_num = 21 }, - [RCC_I2C2] = { .clk_domain = APB1, .line_num = 22 }, - [RCC_CRC] = { .clk_domain = AHB, .line_num = 6}, - [RCC_FLITF] = { .clk_domain = AHB, .line_num = 4}, - [RCC_SRAM] = { .clk_domain = AHB, .line_num = 2}, - [RCC_USB] = { .clk_domain = APB1, .line_num = 23}, -#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) - [RCC_GPIOE] = { .clk_domain = APB2, .line_num = 6 }, - [RCC_GPIOF] = { .clk_domain = APB2, .line_num = 7 }, - [RCC_GPIOG] = { .clk_domain = APB2, .line_num = 8 }, - [RCC_UART4] = { .clk_domain = APB1, .line_num = 19 }, - [RCC_UART5] = { .clk_domain = APB1, .line_num = 20 }, - [RCC_TIMER5] = { .clk_domain = APB1, .line_num = 3 }, - [RCC_TIMER6] = { .clk_domain = APB1, .line_num = 4 }, - [RCC_TIMER7] = { .clk_domain = APB1, .line_num = 5 }, - [RCC_TIMER8] = { .clk_domain = APB2, .line_num = 13 }, - [RCC_FSMC] = { .clk_domain = AHB, .line_num = 8 }, - [RCC_DAC] = { .clk_domain = APB1, .line_num = 29 }, - [RCC_DMA2] = { .clk_domain = AHB, .line_num = 1 }, - [RCC_SDIO] = { .clk_domain = AHB, .line_num = 10 }, - [RCC_SPI3] = { .clk_domain = APB1, .line_num = 15 }, -#endif -#ifdef STM32_XL_DENSITY - [RCC_TIMER9] = { .clk_domain = APB2, .line_num = 19 }, - [RCC_TIMER10] = { .clk_domain = APB2, .line_num = 20 }, - [RCC_TIMER11] = { .clk_domain = APB2, .line_num = 21 }, - [RCC_TIMER12] = { .clk_domain = APB1, .line_num = 6 }, - [RCC_TIMER13] = { .clk_domain = APB1, .line_num = 7 }, - [RCC_TIMER14] = { .clk_domain = APB1, .line_num = 8 }, -#endif - [RCC_CAN] = { .clk_domain = APB1, .line_num = 25 }, //! JMD after X893 -}; - -__deprecated -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul) { - /* Assume that we're going to clock the chip off the PLL, fed by - * the HSE */ - ASSERT(sysclk_src == RCC_CLKSRC_PLL && - pll_src == RCC_PLLSRC_HSE); - - RCC_BASE->CFGR = pll_src | pll_mul | (0x3<<22); - - /* Turn on, and wait for, HSE. */ - rcc_turn_on_clk(RCC_CLK_HSE); - while (!rcc_is_clk_ready(RCC_CLK_HSE)) - ; - - /* Do the same for the main PLL. */ - rcc_turn_on_clk(RCC_CLK_PLL); - while(!rcc_is_clk_ready(RCC_CLK_PLL)) - ; - - /* Finally, switch over to the PLL. */ - rcc_switch_sysclk(RCC_CLKSRC_PLL); -} - -/* pll_cfg->data must point to a valid struct stm32f1_rcc_pll_data. */ -void rcc_configure_pll(rcc_pll_cfg *pll_cfg) { - stm32f1_rcc_pll_data *data = pll_cfg->data; - rcc_pll_multiplier pll_mul = data->pll_mul; - uint32 cfgr; - /* Check that the PLL is disabled. */ - ASSERT_FAULT(!rcc_is_clk_on(RCC_CLK_PLL)); - - cfgr = RCC_BASE->CFGR; - cfgr &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL); - cfgr |= pll_cfg->pllsrc | pll_mul; - - RCC_BASE->CFGR = cfgr; -} - -void rcc_clk_enable(rcc_clk_id id) { - static __io uint32* enable_regs[] = { - [APB1] = &RCC_BASE->APB1ENR, - [APB2] = &RCC_BASE->APB2ENR, - [AHB] = &RCC_BASE->AHBENR, - }; - rcc_do_clk_enable(enable_regs, id); -} - -void rcc_reset_dev(rcc_clk_id id) { - static __io uint32* reset_regs[] = { - [APB1] = &RCC_BASE->APB1RSTR, - [APB2] = &RCC_BASE->APB2RSTR, - }; - rcc_do_reset_dev(reset_regs, id); -} - -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) { - static const uint32 masks[] = { - [RCC_PRESCALER_AHB] = RCC_CFGR_HPRE, - [RCC_PRESCALER_APB1] = RCC_CFGR_PPRE1, - [RCC_PRESCALER_APB2] = RCC_CFGR_PPRE2, - [RCC_PRESCALER_USB] = RCC_CFGR_USBPRE, - [RCC_PRESCALER_ADC] = RCC_CFGR_ADCPRE, - }; - rcc_do_set_prescaler(masks, prescaler, divider); -} - -void rcc_clk_disable(rcc_clk_id id) { - static __io uint32* enable_regs[] = { - [APB1] = &RCC_BASE->APB1ENR, - [APB2] = &RCC_BASE->APB2ENR, - [AHB] = &RCC_BASE->AHBENR, - }; - rcc_do_clk_disable(enable_regs, id); -} \ No newline at end of file diff --git a/STM32F1/libraries/usb.c b/STM32F1/libraries/usb.c deleted file mode 100644 index f7965351a..000000000 --- a/STM32F1/libraries/usb.c +++ /dev/null @@ -1,402 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file libmaple/usb/stm32f1/usb.c - * @brief USB support. - * - * This is a mess. - */ - -#include - -#include -#include - -/* Private headers */ -#include "usb_reg_map.h" -#include "usb_lib_globals.h" - -/* usb_lib headers */ -#include "usb_type.h" -#include "usb_core.h" - -static void dispatch_ctr_lp(void); - -/* - * usb_lib/ globals - */ - -uint16 SaveTState; /* caches TX status for later use */ -uint16 SaveRState; /* caches RX status for later use */ - -/* - * Other state - */ - -typedef enum { - RESUME_EXTERNAL, - RESUME_INTERNAL, - RESUME_LATER, - RESUME_WAIT, - RESUME_START, - RESUME_ON, - RESUME_OFF, - RESUME_ESOF -} RESUME_STATE; - -struct { - volatile RESUME_STATE eState; - volatile uint8 bESOFcnt; -} ResumeS; - -static usblib_dev usblib = { - .irq_mask = USB_ISR_MSK, - .state = USB_UNCONNECTED, - .prevState = USB_UNCONNECTED, - .clk_id = RCC_USB, -}; -usblib_dev *USBLIB = &usblib; - -/* - * Routines - */ - -void usb_init_usblib(usblib_dev *dev, - void (**ep_int_in)(void), - void (**ep_int_out)(void)) { - rcc_clk_enable(dev->clk_id); - - dev->ep_int_in = ep_int_in; - dev->ep_int_out = ep_int_out; - - /* usb_lib/ declares both and then assumes that pFoo points to Foo - * (even though the names don't always match), which is stupid for - * all of the obvious reasons, but whatever. Here we are. */ - pInformation = &Device_Info; - pProperty = &Device_Property; - pUser_Standard_Requests = &User_Standard_Requests; - - pInformation->ControlState = 2; /* FIXME [0.0.12] use - CONTROL_STATE enumerator */ - pProperty->Init(); -} - -static void usb_suspend(void) { - uint16 cntr; - - /* TODO decide if read/modify/write is really what we want - * (e.g. usb_resume_init() reconfigures CNTR). */ - cntr = USB_BASE->CNTR; - cntr |= USB_CNTR_FSUSP; - USB_BASE->CNTR = cntr; - cntr |= USB_CNTR_LP_MODE; - USB_BASE->CNTR = cntr; - - USBLIB->prevState = USBLIB->state; - USBLIB->state = USB_SUSPENDED; -} - -static void usb_resume_init(void) { - uint16 cntr; - - cntr = USB_BASE->CNTR; - cntr &= ~USB_CNTR_LP_MODE; - USB_BASE->CNTR = cntr; - - /* Enable interrupt lines */ - USB_BASE->CNTR = USB_ISR_MSK; -} - -static void usb_resume(RESUME_STATE eResumeSetVal) { - uint16 cntr; - - if (eResumeSetVal != RESUME_ESOF) { - ResumeS.eState = eResumeSetVal; - } - - switch (ResumeS.eState) { - case RESUME_EXTERNAL: - usb_resume_init(); - ResumeS.eState = RESUME_OFF; - USBLIB->state = USBLIB->prevState; - break; - case RESUME_INTERNAL: - usb_resume_init(); - ResumeS.eState = RESUME_START; - break; - case RESUME_LATER: - ResumeS.bESOFcnt = 2; - ResumeS.eState = RESUME_WAIT; - break; - case RESUME_WAIT: - ResumeS.bESOFcnt--; - if (ResumeS.bESOFcnt == 0) { - ResumeS.eState = RESUME_START; - } - break; - case RESUME_START: - cntr = USB_BASE->CNTR; - cntr |= USB_CNTR_RESUME; - USB_BASE->CNTR = cntr; - ResumeS.eState = RESUME_ON; - ResumeS.bESOFcnt = 10; - break; - case RESUME_ON: - ResumeS.bESOFcnt--; - if (ResumeS.bESOFcnt == 0) { - cntr = USB_BASE->CNTR; - cntr &= ~USB_CNTR_RESUME; - USB_BASE->CNTR = cntr; - USBLIB->state = USBLIB->prevState; - ResumeS.eState = RESUME_OFF; - } - break; - case RESUME_OFF: - case RESUME_ESOF: - default: - ResumeS.eState = RESUME_OFF; - break; - } -} - -// JMD : default ISRs of CAN, to be overridden if HardwareCAN library is used in sketch -void __attribute__((weak)) USB_HP_CAN_TX_IRQHandler(void) -{ ; } // Dummy ISR - -void __irq_usb_hp_can_tx(void) -{ - USB_HP_CAN_TX_IRQHandler () ; -} - -uint8 __attribute__((weak)) CAN_RX0_IRQ_Handler(void) -{ return 0 ; } // Dummy ISR - -#define SUSPEND_ENABLED 1 -void __irq_usb_lp_can_rx0(void) { - uint16 istr = USB_BASE->ISTR; - - if (CAN_RX0_IRQ_Handler()) //! JMD : Call to CAN ISR, returns 1 CAN is active - return; //! JMD - - /* Use USB_ISR_MSK to only include code for bits we care about. */ - -#if (USB_ISR_MSK & USB_ISTR_RESET) - if (istr & USB_ISTR_RESET & USBLIB->irq_mask) { - USB_BASE->ISTR = ~USB_ISTR_RESET; - pProperty->Reset(); - } -#endif - -#if (USB_ISR_MSK & USB_ISTR_PMAOVR) - if (istr & ISTR_PMAOVR & USBLIB->irq_mask) { - USB_BASE->ISTR = ~USB_ISTR_PMAOVR; - } -#endif - -#if (USB_ISR_MSK & USB_ISTR_ERR) - if (istr & USB_ISTR_ERR & USBLIB->irq_mask) { - USB_BASE->ISTR = ~USB_ISTR_ERR; - } -#endif - -#if (USB_ISR_MSK & USB_ISTR_WKUP) - if (istr & USB_ISTR_WKUP & USBLIB->irq_mask) { - USB_BASE->ISTR = ~(USB_ISTR_WKUP | USB_ISTR_SUSP); - usb_resume(RESUME_EXTERNAL); - } -#endif - -#if (USB_ISR_MSK & USB_ISTR_SUSP) - if (istr & USB_ISTR_SUSP & USBLIB->irq_mask) { - /* check if SUSPEND is possible */ - if (SUSPEND_ENABLED) { - usb_suspend(); - } else { - /* if not possible then resume after xx ms */ - usb_resume(RESUME_LATER); - } - /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ - USB_BASE->ISTR = ~(USB_ISTR_WKUP | USB_ISTR_SUSP); - } -#endif - -#if (USB_ISR_MSK & USB_ISTR_SOF) - if (istr & USB_ISTR_SOF & USBLIB->irq_mask) { - USB_BASE->ISTR = ~USB_ISTR_SOF; - } -#endif - -#if (USB_ISR_MSK & USB_ISTR_ESOF) - if (istr & USB_ISTR_ESOF & USBLIB->irq_mask) { - USB_BASE->ISTR = ~USB_ISTR_ESOF; - /* resume handling timing is made with ESOFs */ - usb_resume(RESUME_ESOF); /* request without change of the machine state */ - } -#endif - - /* - * Service the correct transfer interrupt. - */ - -#if (USB_ISR_MSK & USB_ISTR_CTR) - if (istr & USB_ISTR_CTR & USBLIB->irq_mask) { - dispatch_ctr_lp(); - } -#endif -} - -/* - * Auxiliary routines - */ - -static inline uint8 dispatch_endpt_zero(uint16 istr_dir); -static inline void dispatch_endpt(uint8 ep); -static inline void set_rx_tx_status0(uint16 rx, uint16 tx); - -static void handle_setup0(void); -static void handle_in0(void); -static void handle_out0(void); - -static void dispatch_ctr_lp() { - uint16 istr; - while (((istr = USB_BASE->ISTR) & USB_ISTR_CTR) != 0) { - /* TODO WTF, figure this out: RM0008 says CTR is read-only, - * but ST's firmware claims it's clear-only, and emphasizes - * the importance of clearing it in more than one place. */ - USB_BASE->ISTR = ~USB_ISTR_CTR; - uint8 ep_id = istr & USB_ISTR_EP_ID; - if (ep_id == 0) { - /* TODO figure out why it's OK to break out of the loop - * once we're done serving endpoint zero, but not okay if - * there are multiple nonzero endpoint transfers to - * handle. */ - if (dispatch_endpt_zero(istr & USB_ISTR_DIR)) { - return; - } - } else { - dispatch_endpt(ep_id); - } - } -} - -/* FIXME Dataflow on endpoint 0 RX/TX status is based off of ST's - * code, and is ugly/confusing in its use of SaveRState/SaveTState. - * Fixing this requires filling in handle_in0(), handle_setup0(), - * handle_out0(). */ -static inline uint8 dispatch_endpt_zero(uint16 istr_dir) { - uint32 epr = (uint16)USB_BASE->EP[0]; - - if (!(epr & (USB_EP_CTR_TX | USB_EP_SETUP | USB_EP_CTR_RX))) { - return 0; - } - - /* Cache RX/TX statuses in SaveRState/SaveTState, respectively. - * The various handle_foo0() may clobber these values - * before we reset them at the end of this routine. */ - SaveRState = epr & USB_EP_STAT_RX; - SaveTState = epr & USB_EP_STAT_TX; - - /* Set actual RX/TX statuses to NAK while we're thinking */ - set_rx_tx_status0(USB_EP_STAT_RX_NAK, USB_EP_STAT_TX_NAK); - - if (istr_dir == 0) { - /* ST RM0008: "If DIR bit=0, CTR_TX bit is set in the USB_EPnR - * register related to the interrupting endpoint. The - * interrupting transaction is of IN type (data transmitted by - * the USB peripheral to the host PC)." */ - ASSERT_FAULT(epr & USB_EP_CTR_TX); - usb_clear_ctr_tx(USB_EP0); - handle_in0(); - } else { - /* RM0008: "If DIR bit=1, CTR_RX bit or both CTR_TX/CTR_RX - * are set in the USB_EPnR register related to the - * interrupting endpoint. The interrupting transaction is of - * OUT type (data received by the USB peripheral from the host - * PC) or two pending transactions are waiting to be - * processed." - * - * [mbolivar] Note how the following control flow (which - * replicates ST's) doesn't seem to actually handle both - * interrupts that are ostensibly pending when both CTR_RX and - * CTR_TX are set. - * - * TODO sort this mess out. - */ - if (epr & USB_EP_CTR_TX) { - usb_clear_ctr_tx(USB_EP0); - handle_in0(); - } else { /* SETUP or CTR_RX */ - /* SETUP is held constant while CTR_RX is set, so clear it - * either way */ - usb_clear_ctr_rx(USB_EP0); - if (epr & USB_EP_SETUP) { - handle_setup0(); - } else { /* CTR_RX */ - handle_out0(); - } - } - } - - set_rx_tx_status0(SaveRState, SaveTState); - return 1; -} - -static inline void dispatch_endpt(uint8 ep) { - uint32 epr = USB_BASE->EP[ep]; - /* If ISTR_CTR is set and the ISTR gave us this EP_ID to handle, - * then presumably at least one of CTR_RX and CTR_TX is set, but - * again, ST's control flow allows for the possibility of neither. - * - * TODO try to find out if neither being set is possible. */ - if (epr & USB_EP_CTR_RX) { - usb_clear_ctr_rx(ep); - (USBLIB->ep_int_out[ep - 1])(); - } - if (epr & USB_EP_CTR_TX) { - usb_clear_ctr_tx(ep); - (USBLIB->ep_int_in[ep - 1])(); - } -} - -static inline void set_rx_tx_status0(uint16 rx, uint16 tx) { - usb_set_ep_rx_stat(USB_EP0, rx); - usb_set_ep_tx_stat(USB_EP0, tx); -} - -/* TODO Rip out usb_lib/ dependency from the following functions: */ - -static void handle_setup0(void) { - Setup0_Process(); -} - -static void handle_in0(void) { - In0_Process(); -} - -static void handle_out0(void) { - Out0_Process(); -}

    Q9T_#ffn{3$${L-kERM?k97Ch~lq%QpZ;_*M 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�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 A)b@nC4 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 diff --git a/tools/win/cygwin1.dll b/tools/win/cygwin1.dll deleted file mode 100644 index 83e58ea0cb220378ac4a125f9cb63c2e88ef5d9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1872821 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

    P=blKI{EPjXcY+wxIf zcmC98#k|%0-8?0a!W+TA#0z@-`EeHS9xrOq7XE5}vftAD7X1o}$Ee3V-xqwsOCkV_)i{wY!SK$ z8;h?CKL|ewCBm~qoE|vzekU{ujY5G?FEj|v!neY|h3|!h(I16(K(@zx7Y@DQDEcLI z7yT4!gFQrD1_H7j+Z07R3r_klS>hQ+#he+CkJ=^hkJaR2Pw#s5Iub=8LeaNCxe`2|Yz^MeRff z1vFtxQRu5bME;^SB41H2Q6G^!y0_?|u&2m3#!u7(#77i#V@J%Nq5-0aX-=4L-pW3PTUCq$EkFNDKHH-uAf#>5N~QG|m<14Z)zX`_dVGHykbj$H-JiK{|<6LfavtQKDUt*F!X1+1;e9rgmVOY1-k_)f^C9y!E(W7 z!BxQ?!5YDe=w-q)f-J!@LAD@KkR+fBRti=LG6f1jf?&NcPmnLj6PWVDg;jjRf0Y6 z>L?L72tNr#0uT6G>ji2-d!eJyNr*%r5gG-u=pTZULX+U!s1Jf~0+pbpP$Ccu`U)=z zI|{oCd&Kw(I|=2{U4>nQt%YNSli=CjAsiU9RX9KxEu0?{BU~grBa9V>3v-35g_**$ z!hm2lZGR!G^_~Q~d4{C0(u6BrbFt+1^det24><>Hl!_NXm(V~T- zeWLxjf0EaVmWdvgKQ2ElswwYdP8KNu@1lH}+Jfvs9!%~}-YkkBZzb=VHi7qZes{6A zcwsMjuO4C_ara?8#lGVHVt;Wz@t@+sVn6Yjp1Rn+;?{$)wZ((P!^HuBivW)l4-hZU z9W5Ru9xEOp9xomv9w#0qo+_Rqo-7U&PZv)TZ}3aLKS6wy(r)oIF%mmeJX0Jje%-%8 z^twM=Gz0J)@hq{&;yCeaafEoD7`}~$&lR^_+)F&)@BM8CT zb^hWBng!yp#o^{?@gng+af~=tykKN+@kH@LalCkmSQrbv^}u!xNDwEAgT#v1USfLe zG;yRj9C%OQlf=`+Kj&W-<%+I~uw%X=x+dyAEKgJ@QpC1}z8u8{(QOfSZ*qa?j_8)? zspyBOSaer}9rGg*BNh>nME6A{qQ|0_qUWMFqF16aQK_g_OVuN5m2dMD?*;kxFC~>0>{~hMPNzB_ffiy_heOi)13T=ws{z&EFzd@psWT z(NEDY5jN9K;$1NpV}!9DVs|k?+(O(++)cbG;8$6eI77Tbyj*-id`9dupvM5~eHK#b zPVo-$ZShU5u#DxD+g8~3N=VB8r=2t*1Oe-_`6d=l@L?2Ml1ON^L9$J9NpdXig5;58VqKYJu8(!+i-(d2l0r$b1pEHEu5PZ+ zeSANR6ltn7P5M_}hBRH8DZMZnTfvqiofV%YjgMb0T_;^H?H9jax&k6Xh^&^bk#3Z( zl&+O_h~FgLERB`!lJ1o5kZzZ5k#3cCi{C39CG8TwTRQO(&1aAFXWS-fTkyPq9~XaA zdO&(edPKTFdQiGg`ZjLAbeZ%pjCDeKOxj9%O8N(69G9Myo|C%OKS&j&8r0>l&c+{7 zo{^rHD&n%F7o^*y7p1;Z2dOe{x%9MjgLIX&Rzj7~B=r)Oq(P#Hn}yHvljKjSG;Sbd z#Y^8yzDts&UnE~8KO~4mFG-Ysll+Y9ApIpFNMC`HS$2`Ohk16B_JNu8 zlXjQ(mU>GENPS>dPnsKlJ^r5bGOiWqu2C6G z$HCY=1efD;fzQ3>IQX{IaqumWJYb7({<`!o?iWZe49UlWkiZxMZb_A|=T7$-WeAFLsvg9(-bO z2buLA2keg2-ZJ^(c*!*HA4TahvlNxCm&MBF$l5K5leGoGvOh@qQi=U82)HjodR#WI zV9caoS=x1>^mY6^80(lU<7$pf8oyF@(`U`qF_VVK>ZDcDmNM+DF`oB2eymI^-6&fs z^MGF4$wcwvWW}!+$(&?UpiQ8R!yrkCvIVkIX|R93%4B9qES$p^|AfZRaW%b2p6@{aOP zvLcyAmf&sOIcJ!h4fyjCY!@BO62ZQZ72+IZ$knn_GM4PQ->W70sxPvavN~Ci{IYC@ z9J`A|STsXET0S9Rs$3=W%RMbWAiwhDY(lR5kbGkh_IqYl!YjG#Mk?s*35D`XIa&TZ zp-djiIwPMa_t7TGpZD5e3X$)VFNQW7;Wy9+@{$*Aycg&fC!Ce9fEMHZYF@2KxQ@rp z$+tn<)PyYg zd%|91A95IR=;?IrAaVdXgs>C7%jNR@$O`YBxgxnw;wj`flJxKxauU%hn(qm5y5|r1 zIphd(2003C1klg#(YNwqf|!JVnUJW8?)wNA4rfkuu~B@)|jlsDZL>Ba=zU zCFB)S3;$}6zCEiDDpHO-LmnX%#0^G!iOf_|gC<5iL0ZCy50OF8UkOr*V812ynT7pg zx+*C$c}{W`!bIL8^@st{A)k;BhzJoNN<@Q9w~m4+5F;`zS&x(^su1k^&O)BIf`xoW z-XT)tZv;g+h#9FvdL}(UwjvV5gJeu>jk-^9KnZ9Yl!*SN5F>3-FEkH9kVeE4{can7 z1&r^3<|Ma6cO>x;7t|STk4{fKgCCbWYEEFo^`%a8z9EmGH!k9aI-x(2>B(P^7U*E~ z8sd#c4IZZKi1tVOp!6`Wcl_6SW0y-NlN}7S*1DS({p>xqtw67u@J*$jE z#-P|kbtE8^T9fe83R45hB$PvXjWRHTRc%ZncxTRdE zJgYdNpeYIze<}V}o>CMjw<#_rPD3^+&MUeq?<&?SZYZpOW2thN!V|fz*sjP|d`O&* zw8h^OIt5=bM)^)rt&B@*R6bLjRlZfA3g6j?B1CCcXcR9J(WIZs5`|b%uc%afQuIMO zCHuqs$f$UwASl^vA*l>L>1l$(*xNf(u^m3@>^ z$P^_(IV~wi>8|uq_E4@-eo+ipc2O=>&Q#7&@|0_p^OVWTEalduD@cs;j&g}|xpKEM zOu18uDD#wkk$p;<@?KJr@-O9iQFs;V5t!`p!+~O6n{cLpjVf^MNck$ zkDdVei2jX!LBB5b*B=AcNwvxs+keVYMY!&us<{3Q{fRoO+*H5Nhf7^m4?xIE+p0WN zDLsj*ma0~&7Ak_uOZ6DIZO_gZIzdvY;JRT~uatmG3p^^W4a$ zds6=S_H7Vgu|~A3s-3E}>WZ|R>Ib?V-HGl(_oDk@#s|=d8(j3*(yM4S%=RRD6g`EW zMh~M;@1I96z?^TRadjwKfZjvd=nXU<%|q{^gY*xUK12&qI{F$->G=YEiuTjPl3er^ zT7t?^8v1xC8I{3IYf&oNfYzb)C+a0k+%YFZK>@8{9&Ko_zrGKsy=;>s`{#mO49tNsM7ocRDY?~s~)RXsTQhS z3u03ir)*PI-{Giscx&Hz45*OW~Qm)Ze39Y zHtRnH`o942SG^;eIq#Pmep<LcpIYVAF;x>Wr_O`UZMSJfWVJe`z72E>^45YPDscMy*xrAnyTuLwTsyt1m6AR#UOjQfUyStJ!M4 zT7vguQXAFp)Mj-=PNey}`foM;`Wnqz%{t8n%|^|7%_hxe%}&jB%`VMu%@)lL%{I+G z&0fuzwEddHngg2NX~#9aK#pmKq#e|ZC`e5`sTlz1kS09%tmd?)E99jGTUQsQ1&_s7 z8J*C4jGZsWym7GR$f!G~S;jiAxvaUUnU{7+b3yZ$CIalFQ8^mv&B+h)G%;ycHPIlO zXje4XG+Q;-H8&s{rMaoulh&Bg!IZ1HrE%0aX`D6g8dr^*hLF}(@1bdC&_XnbLgLo~xQe`uz>c}VI5N6=d{UNZ=0im!yyjE32d&;)5h zHFGrKnz=Bad73cIDorBHBSy1GvsAN>k*UejEZ3~o4DrTxn=|=-jxLSCcB8A)JWHdb zRj08u^_sW&gRZePMVPN?&@eSz4M)?csYv5#$RI^&&(f+OldqxRn35*YSo^~E@@(oC z_Oa8v)ZEh)X^J&ZHP1CAnpc`KXkP)Xsx=bLccxHtzc;qy(f!_1(5#5lcl|s$Hwq zXhvvTXb-{oL>T`JeiSl|Qlm(V)S{Z<>0`B8%>=DZqt_TU*zDhHytThHKQ%uz7R^VE zmv)X8J4bTSw$wUnTWMX>duZEeJ8Ij(Y&&b)ru%ChQ8WC zueJ9p)3@m!YOm|wq_5W9(zTp_Lw8fx^VLD!0bQZ?p7ud{h4!)bk=EK%pzej1ly1_# zNl(-@XoXs-manbXj?&d>#px0)OUuz#rpM@b+A#dME%rs*c>rt2bf@i4Qc zx)fcqt_Z*4Ly2q9T{S$9Wb2r^?JTa2qpQ@lVm*(n&|%ku;5w0x8A;Pobt}^Lq;)Xy zbv&KLdtLEYomuCU*;CK*GwCL2SbjPks*Ca2R*dMTUDIZ?gUHrr@;WSIlg3Z4&2Y+W zr|+geH)ZN9lj~ z+@K98T&NG%Ph2od-?UrF=)yMMm*g|_n+;nGTMf$$uk_mu7Sj&H`mFtiUWT29ZHC>3 zJ%+soVdgW#VZ#B#F~dH?SN(Cr5yK(FLBmPIc|&97+N@l|8N*q_v&_%>(}uqcCtz0< zY=;$Wf0a{)JBC}pUpA!ZdHP$1s|JUx0>gC!HS@NiR$pj%Whge>GhEJGYj~|c0AoBh zJTN>lJTyEqJU0{>?i-#OUK++h56?2o49E0$4Yh`<%mPET;hdq|&^N2pP-SS5RcY`7 zd2LviRbikQ$c8~#BtyM{WuO{v7*^@yvX}-!7Q;|ypc}dwt{G@q?q;@uXSiv|H~gLX z!q8|C8X62W2EKt~;ARnWa?MhM82*V262lckiJ`aQsNsS^X^@9QRXE>v_3|ks9&c~)92_{>o@9m=y&Ol>Q`p2HyqNR(x22H)Zd+d zLLYB9qCc*`r@yFwq`#xj)!)=R87}FU7_tp__15POu9_NN>api#q2YA~Nx#uB)G*di zqxUn6Hk9dW^;MY;hNt?U`g%QAuhVn%dc9na=+%0$UZH;r&!kYV(T_8H)HmoC8wiG0 zhBU)xeK&)%p&iV69Xwwx3~dcWgQH=p!J_YB7zWSDKto?R)_w*b!yks>hDnC&kuwdm zvIyq!hLMIq!vw>8!`!TSh6RQ>h8#n(A=Qv%2p!;K()$_=Jxrt&f>CYgWkT}&Og&9i zs(z-v!08QZv-_ADvwNF{m`0k0oBmif%rwX}J$tC>Pt#!2K-0^)#l|tFu_m%{ylJxO zn{lFPoN0o|#~5ImW(qP*G2JoFG{t2HnihjhH_bAInj%cIP2nbvD%eDXp68mbXNQ^Y zX7@Kmn&y}!DcJc|h-r~2%Cx{V-?Y^jV~RB`GVX)8Ka4fN7;kDi6N*U1b~F;ImY5Pu z3r$I;X!w_CiZcy2N>YwNFHB>NvD&!UL@}nCmYQ0^5sWsanMRp1O!G|XCJrgn^f7ye z=>tfXX}M`acD8AR$-|UmvKUvGUb0u3;B!1wHrsjt!7*vHt`=ws||>}LFF>|jKV zeB)r_5aU$i2;(&4WTUrfym7X1uCco*(zwL9I6KZb$M_-pqcPT)U|eZDWy~;cHRc$z zjLVD%j0cVDjC$jFW1jJ%@s;tc@lAG_@rJR$SZgddJ~X~CzBH1ICB}cACD{4N#5Hy` zv5f+w*{CwUH-0gGGrF6;8of-dOx;YKVRz4Ux7W>lFmto%d9S1Lt)_L=n77`P-nWjj z(X_{O-L%Ve%(Txm(L3kPZ1TC#-KLwS8>Yf#&rOuj#8m4VTnyd8SK}4{@0$O9RADG~ zk2+?H!CK>YVYP0-vO*jC*v>vNy$}2lID&)ikF#e`smW?fOckbYGsz~Jsm64kR&QdN z_$Hp|ohh{6i?UB9qbWM?v+2DFF$qmN6HzTUX-!4EU#6d?>`YIymzmEUmPLbCKQ}Aa z+`?=zIhl#(Hs+S*Jms^X5=vp-_S6GvUvm%hPSIHN2y^8PY+r(dBWIfrjXe6~b8MLS zeQKoH$_1O>r$(4_#&0vvGtbT0Zr)+uY2IUAZr*3!W!`H}%-L;D0Qr`;-;C{u$i7*4 zeMQbe^8s_TIm3L&oXt86ZRbGSDDwhyJme;t7nzrsW6de%EXY`CUS}2spUk;nKAxXj zBnmzP=%V>AGqytgwE2vAyZ04X*AHv_Yq59ocJE8DcPH%OdEc?uO4`5ohR1vts9}IT zT=5zQ?%)v|JRCe7ya2TTY3b0~p&isbz;Zg`l@BZyC{7L44|)RE%b|}$U#NgEz+s@n zV7v+fmNybAA&kdcSS%C3PKA01(``N$55(~dhgrA{bqI5aaENr6>ktM00*6?fU5sms zB@U`5U~Q5emV!-%Dhd`$rY(l?%N%m--YP(=?H(4jSk^kM`xmpp?r#RP9k0S*&D{t7 z0jS4t2r4oh1B_K=I0sc3u;^c)FF9Ox$a8>gcmdyVxaDxy;U1tOJZ|mbKH!HSPaU4& z>~n_~4lkj80~Rg8bt&lA4sUQ==1>ln43!XN`VUqlu}7siQi4XHE`-X?Tk|Xy4bJF58yt)dW{0=`$!N-KvVS+r`0Vfn zs!RNE_z4vzpirBmv!feSnIJ+v2Ph@#=mpg#TH>`GS~<4CZ981IckG1QuAsZ&2HhFf6qL&36<)PeOB`iT&BS6+fGBMoyhj0{AS$SF zqIWddc%!2UM`oM<-ey1G_M^@F8|){?FE;Nh*l#%g?)U@jPY?%NO%O*XCqT~j3L!3b zgw4|pDyR^EA=+3ECr^941)!ET4@$SxBEA|HXE(`&|KbbNU0S zw0Ps353YUf@t%PEoO(O?JN*f0fYU&yp-#i0a*D+=8f1*qSf_DdCxA=@!5))rb~4xi zr>UT)IR)A{EFJ_HtF{sWb~esOg2w8lL^&-0z0he9)cc8nia(2;;=oUEN_0wcT8dW_ zN^^oQV^BXR8+hwu8K4}H6;3OiR@vD#P&;THcRe zkkSb*h&!qAm=?4iNB`9DGCIA53S`!2;5}3#`v|qjtRB4T?C87G4=0P06I1|mb#`+m zID0`QGAyeluG@lchokmTnGDV)pf*`os805Wb9ZNN=N`_!c&sO`;Wgmg$JyVxuX8_V ztTtKGSnw(UJRa(k1%Pc{p=_#iFw`XrbH?hA&9>)90-EO>1$wb_oO3+bWRNtFrboIB zXE(Ub{0s6c21Kb~Epvxea!CJ5NjpLM=nnQ zKLdf+3FwzDuU*P;4`V8DROM1@XQ*}rpII&q;BjmW54U_5Ay~1Evsk2nWFT@7CC(zC zRUm2*4bEUASu9!?or}JiZ)Ht3#*Eu{Ht(~`S3uuwp2hM5&`*$GR>sc5rZl>5hj zqCR$}2OvM(>w{~5djxCU54=BJ`@0VKjU8zB2H|K3u7`pi?mEgIgU>J<9_Kot84I6h zzj@d=lWk0Z>vY#Z*C41+Yq87(3C8&l*HExwAmJd9IES@rddz9Y%(dZ#HXGe67GuMU zaU0hx5|860b|%3!5pW9bXMxVf(K66EP%n1{?ybbN#j?s~vDvI{hT%Q(n+NZgX8yWn z*m@l6ZOjJOZGiT;?)@!epX(vl6F76$#$T|*Ig%&%l2U^6Fo_b!s!NN_f zHqY9w&Xol8ga`5&9^ZEutFPdY9qpZF|H;5iZ$iHd*2q3 z<5pqwlweV)G7SF%xN4x*ur=RcvrVmyHs9oGwnyH%zIXiym5Hr6pTK^0{bG-PwV`jW z-vRw_{nZp{vUoE`H_SMJc6M{YG3L9u5una7hCJLnZLF7D3qUPFTG<$jr8SP)fNty7 z9><;BI@_aN0Clx{Sa03z-XA#X4mFf99zKKIdfJemJ;xu=0FZ%hgFp{<8v=SLNYi7O z4G(u4;WiTRXnSmo9gTGx=QbYqCgOUM+hn&XfTrT!G|67U?{p9^)I zqXEUZ#o>N}TQY8!f=+SE0-fWw+HH;7TDJ{uo1wb%c3}448GAt=ayt(C6z-qL^#!*} zZkKVC3p(HJrdt8nJ5T}o9?sr}I?zvXgdO2?KrcaFxs|xRwy|&ANH$aswW6`C3Y(8% z>!Zr88s}d2(Pfk-V%MES{gect5gy#rBOQ7zw%uNNAr?pUf+KBUJx3^&5xxI%< z)J<*wcKhV^#qAsJe+T^oN53$QqozFg%z=8+j_ywG&h9R@%F?dCRhV{jC%6;cJ)p9+ zwT%~4xNdFFXye}2hTFNfckkfd5xmYIT|l~mbaVd$ba#+{9^Q7ZhaJId3~)~nzh<1p z(g!MN53n->-3Pf30dFYCaGV`!kBzdUe@6NpjkafufqL9cu?g-I0Z)SZ+yOW@#U8;j zrrNw|?twT8viUQ9%bE#Z@NW#(Hq<@BJrZZgq^hAo!)c5k5#Epm?qv=}4~YJ@Lw zPXLsN$C5xNyD!Bt)_)41RQEK{=^&Xnp9Ojuj<5{uk%N0HK(7Q@jeBcxZH@n~H@I(v z*rxx)H@k0z3gvLc5RdExz1xZ9Y>AD6UY;&ivHaF1yn|dtBdZXwwyBe zavLJMSGrfZSG(6h&2)=}4t3L6?r;mOJIB4zo$oHdvqYdJAX0ZZXa$JMT>~1`_BEn`v=_r=>9j@Pwrnpf5RC#%fsz2cZ_NaSk>F+X;fgb%C5~GWTHClbHrp0#dyr0q&Njx{$3MCY@ZAXA2|WmYfO>)W|0}aE z_<#P3`=>qpUrrc87zXj-c+LoW<|rE)joUGx$AXNrvCVtH@Fc=yLI7dvZ_#NsFNiSn zH~#mw!FVi$5K0IG6oGrQK}X^U%bf#gF7C~;-S1jX6L#NH{_`+AMBudF($-Q;%@9lW^+)iT;z< z9G%8noWb>3(C7Zs!v!02k?)-ppybpxG3111{2|o$H{*~cCbR;?vu^eYyV+j851MEh0w=qPb z2hoez61>(p(+1aViS39Th@EikP4vO7wRLa6eLx1_+%V!O;uzv2z>|pqpr_(2T;(7J z0tx{MBSzRbYx_v>qKNZxE*f+!aWUvP;u4%m#C0+;m6%3MCuV||1(Hq7!Fh{iIdK(n ztqpG=ZX|9ZZU%2VaTjqn@c^Ks#1q7m#M8tx#IxXC0J%u~i+BmF^>GEzb&vvL5%H0o zeT<`LpkEMQf__CTvBgTkz9yCtNyKs+Q(?1BJyzm=6|Sp^HDGH&s30_)gHJn~ZEEqq zEo?MItRptyxg1s*Y$m~5<>`1U{X ze`fsdf5zV1*biVo68|QCB7O$+h4{5u_BY~poA-nGljz{_PoEZxyWJyr5IsC_&(p&T zw=F=o@@Q?(u(oUG(cYtjN2hgYr|0<3q9fi!wpx>GO^hwdL-MKRF5<}hVxpFERSsPmwBwPv8%zZ!SPzq z>pa%mc&wid&G1H#O?GcHpe?w!)ngmj9UwbBc6;mvdjRAh2z)EV^Z6L=~QwVl)2kCPyzPFBdOY zFE=lOm$e_bl4wU>UTpxkwfXJ9w#RV?8`IRHlUHY)=>obdNO#=x@$&WR<<;A(4|x7K zW3lx0>hCqcYoN`uwjcDH*VHFwhx{ut>|cIU?nvNAdyN4-9%KT@B(KR{0br+iP4$}Q z73dWNc!t+3(AGz=4TX4x+BtY!+n5_Rd(&numRojYZGYS57l6Hk<3g`{xGnlW z>i#>vX)A0WhYh8rKs8Eqj2T3X7c zthVe`Rw>Xy83oFoVM8hKyL5D{$bsj1zVDx}KA-!(#(ke7B_v+wh{UXlSq-+9sL0t~ zyjTbQeaw35ZXmcZW>d`OJbmhjAK?8Mvn6J0%(j>v;5!k!V)n%BjoBCTv!Q=~%mJzn zQaq$reF~1@I9`mPO)voJA%t<(>h`Qs{*VB)>1I&Y7S�< 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

    &N-98;2GgVvWv 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È&N=I0dH(Q0)g!!Q1^vf zj%A*+&Ur+~j3PLq)qTOU&f#(`doNWxi)}U6OBYASQ$+3WC!PttSh0uC@?O(S?E``I zb5##lB0@M_i2WlcM^R3kDHBbr9EvloXZGkjG*G=l0yOXF>ghby& zD#%_jY6;&^r0^UJ^-VF4bpK-W?CkUP9pWEHu>JUKju9g7xRL!(Q#e^jPN>al8@)$@ zsUkjs{5ETOL*qnI(+=85RX{xx1_sUdleLu= zYHBTT_GB2{raWr2(pIC(y;6n+x8Hn)ElGbNjBPt z^IrC&p1h**idL-ixWsIK=(ig9teM)abA1XMw2wX|-WRoR=`x;E z(_^*1Ej@;P8!|2{6fY-x_<{T=d{_JASZ7RfPp2$11kxsgKH|gT!w|92-V=^O-v$2b zy_{vnqeT%f@O#46U|+bmo^!5q2ZL5_HLY9wOYc?q^YNqJ?Aj*gOtugxEfWM%B z#-R}hd16l`Fvr|Ev~{z-;;)K9v%sPK&B%)k!dw_DxSBt)ry8@sJik;H_-0hVGmY5b z!^3U;b&QNP&}lsZc`lGzL)z*a>*G1syv|-ams(@Hot+-ehOvZhs-T@UEh&0u^`G7! zj$m!gVz$TXv|ppW+7x$lo{w-H+NkkAy-)QbmZ>S2?D%@A0oO(fQb!Ny1?HEs1)V@C ztOuFi>qlp1e`u2RG}M;HP^Ud8d@>rm_@`XmmcwhSS_^%9n6|<25uS`Okoli=1pVZl&_ve3evNI`Q)DmSaW6g5o?H8K z@0HT-@)s+YtbiT)9PNaw29vl`VZ4pIE!o}k!@ z%sFjNTw15v0`Gdl6z~=KfLP!oXJmux+y;MiW9z`?o_6{IHqsihSpQ=<8}Y2v%#A=h zQ$5^Iepn-@QVs`tjor)<(yQQ0@!0&rDLPhT)h^o3^-I(=-AKK?quu%#6N$r#vXK|e zOVs9_Ol>@3n|*FPs^%P5b{Wr+95PYwb~5|t;rIMv#eHpTZ?sRy^2cXzcF!-lNjYy% zi>8JGd(@xf_JD=`cScWDc1}J}tQ*wtO_WbMi1Ja~|8uR=a#X%&j6*ap*xy?H6Mez= zGwO^z6tI~bV6*i&3?*Gp>Dk2j-&nfcGSx9QA_F37_T+o#t+vR-lI>}r%|*-;b@BwuWj4S zIG@T8*pps+e2>L#R(jZjBe$TByBW_82X%n$dZ$W{k8F$`(KpKe@tJsZ`^mcGTkCV% zo1V+nF$yF1vUuDtv;9mX~mTb9H#>i? zW6rEE`4-t;Cr;Bhj6*FwV@sNfLMzh0tmU2jeexfce@XePqR`?H^3awKlnQ1QP}Dhh zDSuu^8?g7lnpP_uUZ6)IW`oZSbDm8DQvzKDIjer=!?Z`|H=G&HLm;oQy{)rnGex;X z8|hd3+4U5);ku@Cw&@DmS=Ms8#h3gu!V$9X=9q1)>yN8#*PCmkk%Ud7sJ72#A2_6b z)s4*qTL+*+$JKlFX%ymzftJQl&%W%ff4aug%#yoPck#~7h#Y)^a7+BT88ike(UOYhpDwNv@Wy0`Cof;+rkGwUn; zQ;EJGyk!`49ZaYT?D@L!$0%sBzt3niG~y3uPSbSB6fn_3*S&O_wZo#Yw$OG*FNDj} z%0q`Z*le)8K>gC&An@>J5qM+OVN=1#pstTfPbhw+7_)qBd;8Y*fzHF54>O+S4PJ*m zpS?=IRL;K6zou0Me#Hjo+xHS1lt{X+us@^7>mxJ9y&X~XaYT-yEB4Y2uFJV_rB!d- zt*z5SPj%Pczp*tK=zXhloSal9|+In9p{c-e_v8J)6 zaTT=_K_LCa^=${146M4bwte%3e(s(*bo1!V@ki)M*<;(!t>W9XH$pt;V#|QFtaBEi zKK?m>x_6i!3i-#o7Ze`pZ|`r~dXxCCr+sT@Pp4??(Xy4n_M@E_w*1unXfI{U`OQR$ zl=04=^DDa6_wFxT*|Vzj)v@O%PG5RPv4%7+vAR;bP@pizzT$07qI|4b3~Y0eH~9}< zzcU)-Goo%L(kCUXF3r{hCTBTlx5AM&+1x_Ho-fDs+$_DYoIpjwrhwKPArjcHSh&YW zicT2h>cq0d*pRok>gL+^&cV$WyC3a-uD7Ys)Zf_8*s7E|80=|p{5Kem4C)HI-fjhX%nIS~bAvf;apqJe{`({o2~O7Yfb~ zGWL1-k-r_$7#w^X|7?_N%lX}mNHa*>wPk>|9~ja9#qrv^*9~nvwy82w$(4_dca+=9 zP35L>jT}ps3jdgI)za9tu>bDR#?cjwq3DD{;P60!qi#O3<;d2X1N+Hwu@FmnWS6uv~E6&-~mpdY49TL!S#jsJGe z`d>?f25eiSY|@s);m!aQ*w{NKCjD96qFKLymb&(y&4&whgFW=>ACRr{JzMHJkMuse zo3S^_Tg$!WcKE?d+tTyWja*$PznA{r!K1_H51r?~9U#6q=W!SB+Pka%ud9!ZFd8hQ zHcbwnxvf!SVX$52M*9}(dY|k6a%lLkPaS)H{NDJN<3k*OD+1tsmVmx`Fv0 zhc*noI<#@<-Jy3&2S+~{Jvn-SvZ3_Y;O(KuhgR}j)#1{$vHQnXS9VUErss<^P1+|0 z-_SJU@v$Wo+bheRmQ(h$G$97jzlq-ie-E?0mWx(@K#zruKy*+%hN2b_UygIFX&=)- zaxvSdm*WZ29|0@eUX~RWf#wOSRcg z#xQmpg+1KfXc`~+J4#P0+T!5v*P*`gyAz$0!;__n0u6JEDh-u}W4U7u#}-+6p3#Ay zhp|nR=E|b+dt+BQ{>jnrzF5RJeZBG?-}Q$`U(EK2z=XI+p3gIimr|JWXZmOSX(_{B zw8A;+5)HH{#9|N_)U&Y?D=eGLYpxZJaS8+~65&obd4jUTN4XeZX?I)$KHm{ zb_(`$?2*w&M&CZxP}xcO6g4sWG%n}N>$9t;f1Ns^(Tgb?7&Era71xNx740>3A3{$} zeKq~n^shXp{i&(@lhZsgJCE(YJAQop?Y|Mj4ED%wd1ysw6`Y&|qDF&r$mEz+BNN35ao7xv_D$IeCmK1~_0OrRia1jK z=4B7Njpjky171Hc)g0~9EAl5FkXIFZ))NpCAy1Z985xf~G7(5d{j&P!%bmQ>?eKo` zG0S;6i!-R}6jjjpL50rY&mESJwdMSlo4t<~Ug`gM_w7A@EWI;&753DiUa0h;1@#k; zGhmIznC>+S&Att~y43YPQh1Jce!2S>?8jq+KVz?t3~D5Fm7}{a?!G-Fo3nx?)f^r^ zLb)(}3(sf}54{am2T8al)-{DTHqu(CI%e^(VW9CW5On?xP!}OEM4HJ(|E}U2~xnc4v>K{xnQkZQ+`;5N# zW_+aB*JfYSXaKXTXI|5|b5jo{?@vunX)o>f!t4vPuX|zbX}0S#$`hUCFUOxdbQ7yx zw|U^DbBe{3>%_~jrw6L{%(mA?o}M^8^USO)rg?8!j*KRGZ^{*mqi6WuGn18x5%`xz z{~+xP(L>-Y93@is3@nECGM}edqzi3EpD1Tc3CaTzn29~2{%H|Yssd;H7t9iB}1WoZEZgd%z ze*f6rWBFtG(fy+f#-78<4xPDpX6nrCiIqG-xKz>gnVz~ovs&Ct-z!>>6% z8tYYj88ff37doerh&7^NN|kMAjNe2)FTf@l5Z_d(hUL&qTkmpds)cWmN z>^cKKurCG^QqDdj1@i)HzTcWu0rj3x)+9^R#F*D;Gvbn?!Zpi3O#U!iZwlyBCor%V z8B`Wp9-vx6q<_YsEODePs-edq(H>_=e02Tj4xWF1f~z0cvr!pD-uH~y@Y~d{Q{PQ}Wn-LgKvf=_c#P2+ZkI2i z1eeFJRGz4;s&rNgdQYXVva#~S_%CJ3#1j)6C;F%@Ss7+|)x^rm%87T;rBjSV^-1Lk z?N@o6Jy$0CYIKO!DdwS&hr;Ldu zHG?{%?R990`umi~`<>AaBhk!FS(#4GFoM&)nJj$`kvmykFY*Cx&3(Vb z0~CS5B0Gzbz({5~@8n46;Pf41aEE-IN$k>@pUbz($H+l^Y-Jz*3=E-C^)S@O_$a1& zrhC`$f}rn`k5#h>kLlOx@20L!ot!#2d0_HgD}89AXgW3VJw&OPUQSU9vENg!O)}yL zMRTox56v9&(v!w@Qe&L|W_wLz1;rV55v6-=b~WXxnWxYN@He(@cY7z1x@DIjkTx^gtkwGFeM-Bp z4V5Q8WqjlJZR~gP_qnMc&(26l)W~0AQ1%&JHU97b@IE0h%OBfgj<1?NUwcLo6)))_ z9BaJqP$GS&p-x_>ml>(wjAsC|6ejFt8AShdPo{i9C#%*DyY{6N7T7P=VT;8e6yD{@ zL?;-zcK_54yzLE>f1Lc|gvv@Q8}ae_OsR<1Oqry6fjy(oMoePdBve_W*vv4R$n>w` z(F$YQI6XFnE-!2kOWC=NyR;fjqliL|{}iv)*gabkV}U-|S!o*Aw{cfVA8YgTUav{Dz@ZlQTj4oV{3YE(unw$YU0`e#0%a~G#lzy@PZ zOB81j{yYbx+>5sTDEc429VaVYH|J?L&R`=gibry< zbZ;N~_0rQB+xzu(>E1U%2Z=|Lf`?e8e<^>msLooPNAfgJ$qSZO3TS?x^EVyYBfH~; z_>G)4WwsvgFKc;yIWU*<7d${H%;o@%EN9NAg)03Mf7K=I3xO)n8;7!@(x*jHzh<7C z`t{PH#Md)YB1y)Z(Kf3m>+^hl7*yF*TVQFv68Y8KwsQn0jJ4|-+CuGX)J4*yaiY-Y zB2R0sUsel$r*D618W>4Sx$`C8d)_JUoLijl_o}u?1D~HhNgT&BPRfmk4u5oxQ9{-J zR#j*vJlB3O8g(W9%>UX_I z>WBR``X)z=y`5wiDU9|Pij?oidk@jSghHoJQ&iCPFZzHYN=5zfRkU2qTy`yPbLA9+ zjLx7El*>K3ltsmxp}Mb*H@jv2<@aWvoIXGnfqSgav>&}O zNW0BT=hQZsl%6F6O?B-T`fpd7rGD2xbNZNS1kDVCK?gl5HvbR)%wGv%9kCX;(f}*R@-MM)7Pkx72PSCS=J{&pM1Q)U7XLQZ)YUW=g?;(a5`&|xGa6*&|mN- z5=EEurZtu*u|7-Qd$wn+kqv&H2yTJ(?69YtkbiFD{^|kie?iM3J!H0aFDt!T$s2v2 z&wggqeKYIhw@L|F4(zej^iP=>;t$$Mtj$HypA%?I$qRJ))>JK_jIMW656%+ry7F1v zp&S+Tk;77}ii+Ks2YG5=u_FGYf0;aV&eYJgPBhw*X`g3ah<_~~DBiL~R7u}d=S$9+ zo=6^-eD2I-`Ew-{Urw4)m#`-$Vkx@%rP?>&k{FA{mjiX;Zd2T1b8+W{F>ZwI8+p@w z4s)h)BO2+Du?|D=CAg_*^x?FKv~2Np=P{vgL=;AwZTvZ9)K-=Es@6Wm|2sLgoTvRu z0d<%EK;I48rf;atn*M5oT?_hu89g~s3ZCEBvv_?Jji#O!sbE^%{=TlfH~f{Sl<6Oy zJT+COl_zV1)!rcjy^v#x`5IYV=)>lQsMoYFWLygqdFXTMa+Mq{&}xM?+iN*M2n-BH z)oZAZer0)$MN!xcV{UzhxXHx_-_*>lyZ<);|NS<<{z zMOH$fYulV{rg&CcG6MB}Er}|h2EGDkZfPsmWo0YG8BoXzN{mU7R+(S_vJATZsm2J@ z`=xr&CiaX_9nrQ{+2I=g(C0-O>+V~|iPv)`j?#0cpEfw!(FePh7fuZI9eZ+;Ru9iP z8+j-o>WA)GfjiT{$e(;bGKAzMSCe!44eG>S9|R7gg5+W#>vu7S#eE^6Pgy=?Sz-}+ zMjdgl<|X<(l!EegiaIOxv|Qh%XV1NHa{8#BvU1YET00DhDT8F1rF^QZCNI)fO$@$Z|Q?d!=;iW0$8gHgl&=&o?uvPoSB7&ScXQ#xv>sj1GbKjP&(Xy+Ywnm-v z{YI$qS2ca6cTzgh$6N%8H!Z71MFfh&SZ0!?SfhD$EzE_YPtZ|Cp^gfN&bKX*^$YV@ z{~Efn0}Z5qrFs_8|LgqVURp0N4|R@S`(o$BjCzZTDQvGwBrotM3WEg>)|Wlspk?I+ z^ZzV!PgY+9lCPHnO6kZhudxjC8W=R~Q;ykH&)S5h1Aow$@%i!-#$NfZ$TRwwk6j(V zLhcs-kJd5qCu^IQsDnN?o2#}rDk z=z})n&bG0%$$U58vt-9fr{YIEi68ADiZoY^FKJmdULtpqGwl_ZGjs8!W0}gq$UMdA z%ko#vVU|8yc1vt3_i32Mx$-ws#K@mMTi-NNr+Fx|ul@KdPrIX4{o*a!GcVGPbb0(L zJtI~hd#|GYdTT7}Y;A7P=f&s?I%qX!fwhlFwYKHy`{>^(T8;WbtCAEjCD6HBO}w$UE!mVURy2>~`P}ty+Ej36UhOmbY)h6;{9Jil*(?fp9Ve~NyMKT|*N@%0JxZ8QSS3v?R{ zb@Ka6`J6qtL;pH=@tN*|h{iW1qi}&{iT%m2L_NDQ!+ujg?RPjfkWwyi0!oq1Oj18{M9lj`tljpvee~`1LsWj)m+W3sop+!tz<`-LlakoItZc| zi+ZP)vQyjQ`y_jEE#b?E3#zAgh{K9;m&_kRU!+j;EM3v#tF5it$M}XgJGSPZ8iUT4 z)G=CQmgZ2X8s(%Z5=j1(%K4?RIR3c|_?zO&UK3z<=$EA`T#|UD{ zXfwX35k0m1C4BkzKxLM_XmbN~BiGB$o9e|wh%+Kzva$~=k*O?e+BdCFmsRI$73a&= zMBt}HA<%Adi8S!E(dQoFeEdlld0C6GVhAy4#cZk=lh^mPY;GtL{@h)THHMJp?R^G*T>x_<04OG-Pm&aSFRgf zKDu1-M=VJOM&#AolL3uAv$)V_I!Nx>*n_k=v4=A#vgRw!p6i}76p8YARL1IBUn?1N zaf`Dz&or{;%9mx#3AGxxs77OE53yDqV+7SR7UPzbyAe3a7N=5LH*NJPaZ&$b&FKfp z5_>v@HWzb&RG5c8=^mdWOZ*VkJDt%&i*kdK;meUrmPZF)##tmUJ6BfPq7&m({6+PP z*7w!Pm8O85K>Qbz0WE zs-!GM>#Le%xv0HEjYx|{_EmKGdR*hG8+V%ORSxS~``0C9F)le}DR*%x@@DJs=fv?X zs!FiE@&wpN)|N64ks{EU(^TwPfj_l=q~-HuIqYG3zpmV$=Uy!LEd5)lGVy9qK-WOo zVT${Erh8I8d3$~I+LXPe7<*T^=T5qJeC$iKPwKZEl2f&doP<%CtpGS;Z@a5rVy5G?-1U;ZJ)RDS@qYIc1I|G2_LF(sDvnx+HHduIY+u z*{>{1VN0kFN6=c?_NlOMg(baIveZ?tWw-dUsB^;7ZRvVsFV07T9rn+W)`>!!!egj~ zIM=#|TVYX|YM{unb~W?y%-2h(6NzFFWmIh9^ttt&{%zXscA_`jyHF?kR&v*!;$Y83 z(tk(lt8t&i8+=b|SrjZ_hsa^*{~^dMUo*>e5Umh6(Y#`pO))rdJS@Ml`+bw*sG zcK@8eKwz+{*0y1!rP>#l6cdLRq`LRFdge*^`#y<%Uxhpos3=7IIe}^s5qZol){ydf zjs*gVG>CLnpl?6LJwA^(pzqL6(mw9ixiEZz=}(ZSo}kLYz@YA;$#{V|i#-}3j~Cvb z`s`6G2I+)5NUSMhFXb&=k`jucIG4^jRYg-g--0zZJ=B&AYbk$`I6^l+yW~qw0xHV-eZ#bfFjpX@z^yxaH z7^GO#ArfuPmC?OEEkl~yW1pruLTwR&U)xj)C)-~W1O_9s*CqIZ!$ zd4DRMrht7|TYDLKo!DH?E4z!JT?ZiM~#chsphQ8f`umcPfQsI)_4d8cx*C85|D&pR-mBq!nv<^LjC( zEpeXV&+1g~*Upx-Rxu?@xB8OPr)!;khhJxrq571Tv|d}Nhre{|KU)%a)3$H5b&lM{ z_iDfRDJg#<&+M?Nq3Xq)@fNKy?IhyO_wu>+iTpWvUqfJ)L0`7aA0A?$&+cf!`YQ8c z{5gH5e~?HHhI;_b218$G(7lb8WqHC>?~atu*pu?TjqbfYu6tjhkNX>+vxo!w4qf2c z6`{c25!8=+G1LcoMkUogEjf7&N&Z7+IXloNB~cx5TUjg+K{I0938%~NXZakUzz z?+W#nZ}B6=PtzQRM5MGY6xfn32HKoCv3Rc>DI0A*U`}fZgONM8!O8*Vh(e@%S@miEwmVYe$MQ9?qJ7e-mgXxD=g-+oS@X|K*E37* z0gAUd>;>u)JM8R*S|e1pI2KnvsiGD0{az31r`RJ^zjqSvPj|&Sf6B)Y1DoHsQIYP1 z-LW6Y6MbfNi8tKpK01c(S+si-0-?{I2IhXBX`l4($E#8Q6!#_!&ZB)E_nHT&91Q#= z5paPe5$8n4W!0ob7I>Ifi&Q67ul<(E7rQ2MYVG!6m#0H zt6xdxku23!m$^07+vi!sLi^FH=c?1ue9jc*t6nqyTnPh*(E|J2sdL6YbGsbwJ&ycI z|Mb$-BMzl0nHTwf2PY$aZhgtWxc6rsphvu`CZ0HR=gb|{Pr7GM4;cFx zpD*a1`FzHokr$LtmRHYP$(9iLVs({!3GE(H`83Z(8w_zF@~{}B69$_T;v#wZ3~}O7 z{5g5%0h$hqGUqK}F06Cqok5=(309LTU*I$F=zBbL8ud@tG*Xw&wY6;ZqC_-~SdF+7 zf$4lMMLMEteOkReZu8pt_R#xOuW2mRYq8emiT;U6SGden-lEl>zWw!Wr_Tw~)VGMg zPXl{ecKST>P5BdjdalX4Qz?HdrGrubP(QQ3SYY_W>%;b%`hASYw{2|Oxa%JA#u)6m z`lb9ieLP9{h~f?_hllrC=9wN?%0j1iVkSB$tD9J02()5(n3OnQO6{$7cTwD_cT8{ISytrhX*mka>&y#n=^?B#X-fZ>dGD{+$WE_f1(c_G$&MES# zwm7X?%C3o)Sm*Cf*Ro66FBa|hkRsnN-3CEf`XI~t3P$bIJf$yP`pjy5>a{Fmc}1V) z{phuY`gxxNi#^_{(mx_#Yk%|nGu|IXIhU0lb-*9$XY9RV{K1~QKGB!5mwJ9I)#@J+ z2>emz^uKo*(Qem z=S5dIzAHU~*E%zkJxApN|VIH{)^PP57MZm6m z&YX0QI9b!{pJkNKDT`BR3(EJkD_>B*_pQH{t6z*fcnSrXzf}E{eL?>qPO-1rKUAcC zu7Aq6h(EMX7S{^gnfg7VET5Gm>OlLne9j2;XWx1JOS=a-Xl0;LL63lg<#h`@AA!zZ zB(P9LqA1G;1|w}gPoocI0waM@wODsgj~3p*L`tM;d@XJxN(p=Y)49~FJl`Gu8)-mzFo{}FV{(@s*=335{}?=Kbr3&zONp{%JzypFXAue{yhGO{JHlh zrN?*qGZi88mGZo`wR<`lVpCg0iIXVa zRIBY3dpU8w?ls~pt<@H-rA0Mf{K#4kpP%7xXR;UDBa2C$*>u?fj^!m=RFRh`bqD28g;ffduirb85j|$R*%aTe-M2T_e%eyd|Cc#?Jo)l zi!t_49HRDLv%7A4YubO^|8wnQD*Dt0hw7nwN%loc)y0WR^-oKxGwzZYSQ!}OFWOaS z(AWIRRI`>{i&w5@?%e3AIx*q;R_*ohEeQ|ye!W+;vA&fj@# z@cH2jMqgrmt5h#WAHnv{E;64`45~C6bSIuAW{dh_@x~ErKP(S)#De@)$a1M1J zx-4*pL#Hh==xfHG*%Vh$+9L!T%+_JXJ#&A58I}Cx5n|k#!zw`9lOZOIn;Te*ctK9 zG}_>8XG){RAh72pAyD@Bvnr)a$@8Tu{zBFT+pA~Lg{(84A0=yd-# z{nxZF*k4~0d!kPz&V5Z3O8;bYQzCWVOTi{v{0nizw?ibH<;|{@uGhm$`JZfi_`9mN zq{m44OZO0;=^m=ry0e+`CC@MJm95ngeP8{@c2tYBbPlZ88Pcy(zq;g|iSALOdy$Mk zsADPSU&uWhf%C;7VlzXa^|sm>`nzCz@%>!=-U*tQYM&U~nDD3g;}c#5Q3!#t{g-|R z*5kl@z?#@2!{G1{V~{C2Xxdlenct>=u7NO^(YyDqpq!z0VzT%DY(BMNeFm z?`Ql;{WjRsko835l)$Kbnn(33IDz!RA__qRl?8MKlm*5H2kpD*s+a1ZVvpbhVtMHa zyvQK>(rUM6IZd|l|3V!ehn*J))I2SIFRAV?cU$cI z)e@Mfp~b=T@#oq{f0*QnzKVN!;%7o1EpBFev*bzpoIa8FZqoZy6gq)w2~P8Xih|_> z!eEUDXtoy$Q9X-)HT{Wx3G{~M{>$L`dHfr*F9~^(K+Q#-7y2Ir`ov(f(>LoQaY_5~ zrgB>HbE|Xe=T_@dLGd@Nsc5s`zjUA^@6Sj~uaUOfTAU|DB>PxRc}{(GP4!y!d*`lI z@13rtOa7k7m9rPue49=EyH|ZT_Oe?2$D9@8jMZ%0iX6%VL=mN`Zif|nxCa>Q za7v(-WP!c+fiESNH=z&xGx~I=hitF;eo4HMYM;lwk-<~}Kf(HHT!I4keOM+?aWL&5 z-unRlXnFG}1kyq|!aR6^Z2L);m$J?RB2DwOh(eWOm_wSDxk^TXUrTMHhU;Wg+xAbdvi7bn|Jrs|@Bcqvlm4mboyD3@ zS6x;a(`94twrJCt(K*Z8R7>G3aWv8AJ|Ulg2KstxlWX`BkD)kuu7I9%A?|>`V0$(4 zfT^Es?Mhy$_POmn7`#5u!Kn93^Z}VqC=StmZx9$Vf%~lQpK>vgz?+EzDk4Vtg5^c| ztgQF@-sJfy`f&QvR*(#X4Q6{aRrITAGx4vcaHyWpRsNsOV_IZWR8sOpTz1XYIoDD_ zUg9e-Y4h4ETFYNxR99N1T)Tg$DgUz;x>e3;rT)c2?!*1^zUb?lIRDkv*bh=&QPd)K{UF#dKqA5~>8fssTfaDEPTXC@`m_ameA(B^Sc^jRVD zrAP(eF+WhPz*)b~mm_;|uKO^hgR;Sv3$***)CXFxvi>bUmqTayY z!qP(NUUhNJo0EwVhtfS2QRn@zoJG`6<)083&u6NF{_8fa3;bboIoHAViokdcrCK61 zSFRidOyGOe39L~(Pv%Q?zCv)uo3$?|0kBQpL_q&}B5s00`K%uqVRf*g9}=&D*jte?Mk&>R=o&R5tn9#BUM?p;dOpqNy>_@mgFn}1qMp|kd|>3e3QgW@UbFzwTL5@P)mn8XW&K=p~y6F0c$JQl3&GDZ=V@`<_yRu&HbJa{qD zz7YS)2h7GGVcFY$Qvwqmq%T7AJm)TYG|r!M=47SJMb@%B>WZ+R>z(rzX|wAmt%D3x zJrSa-sCAqAGSmNW3>9oYsgT~`)9T~=lOrXcSoBY|?`q%NsH#4W_ObuW{x2>0H}^AA z%b$MB@^2!IelBY%)O&gIr0L##EV{*Y4#l2|#~t6JIEp(CF#ev=7i=%qm;Qf&wKxy# zDH`60wPi}wtCD#Rf3_01(`DV{COBYSZ!#$Hz+;M`i@7T@J-Vaj)8$*18HGuz|0VqVnC{~Px9 z|CT!a%2cS~j8$3TsDaIF(JL)dMyGI-9mz&+nxlfo9ks8EPuD*4`|hc|ZTcWji;n!o ztcxt~0q4%{KMy)+{OQ>T&Ym>T>FYDwYy8>suk;k6T*BXp@e_K&u0P|nv<`ny*7j#( zZ@hoJf3VP7=;&?geI)8%ntz^G|HN8DAkR4@`(ixmOjQ^8e+8?H?8SL%dv(r5oAX#T z<%+VE>jDefE=5$)b>C>&Q zsA;4tdz+ss)Ne;%7e3YpuO zJR;5G6Sv1wMyGF+v=9CweX_mpcuydo6kl5e6Hw2{K*FlDk$!pyoR88Rs88} z)Wp4cs42|LU*u4{Mdo6iuF5c)=k>Z$b~XRs&d%RAj^hl&bQ~zO(y&y?D6wNvO;oxg zkyr^&l}n|fh**hFok~>{mB_%cWT}Rh4ak7i*`*3vb`Tq|yR-r1BnagHBJcCQ^X<%$ zj0{DC+xb1aH}l;4&CIU29#4h5W5c+U3Ree=FGt0~C@CQ%lofmM(9)?1JyVL?7~;vd zYUT_&M@aU$I6tK;Zwf;add)Ssgxe&QZ;~{BCsG=7d>1>Hu?D)=WTzVy*+AL^YRyjS7y{llvVZ#VX2ZErtB^L8)p{w(BeA8+q%?`-X~`@e1W z7wSS^3!nFMrx4h!FCpwNNAEqu;1Y$=z+x-B5lfFJ{gy_t;`oatCKF$@5*k5`qu60I z^-*1Xh2~}vZWM9}j$%fw!3kwl*5i&JHxb+Dq7MAHF0D9}vT2zx=Pl@&Kw>kYrGw9#903$zVUaaff+Uu5Fcw;SXz;~v~e9SnQXJghFdhdZwwzpuaX zyW*Sjp?){L{=n|WiM%sc9a29z+h1$o#9&C&-#mpqz1c|bGkR|J?jPP1d#~U7F)IwQ zw?Drzm#uA@ceK5?wYRnN*5;MXE9=Yp7xl~P1O2lGMgdX56BN=DFnERn&eX^B zF3cqy^+Utx^(x`9^4LI~@^bVzX|z4oV!;{)i4YLh$Wu$jq7{+xuMc^Y<``1K8EKrS zsFUw7=}-qIr+=ABnrGhvH6aTlVub$Gg2d-`d^6)}nZ}wR>CU?usq#`tgNhQ77(1-cGsVEAi$sd$r3xUv%&7rhZo&e_CtUmFh|Fpl;AT zD;{@twX5eh2cmb`RcYM)>yB2naHrM9%I?bbW@#tI%N*}m6c~hn)>B`0%s1`SiIJH5AtU2>+0_syYe%dHLCbMrAEjj?6EqS+Jd}{ zr)!v!g|$VDnLb9BkVs7~v8H7zDM!q7PGQxlFeOYX?U3ptVPZ|?8d1*6)w*P9TdU>s zrzT8>6vgvh-J-)YrO{s-J`x)2E^|JdZLUL#VQnv~J!XG$8WoL{#`EjO-XrZYkIL7z z56k-}?e}?p7veg1QocrBdyj|S8))+MwlqQp>Abe&h)Kr6@U1-_uJkC*ZF>5&}2axDI4#a=04TX)c(qYGIhd1JVb z#-feQ#GhN~`58IoLRQMQk#06tX^_{>O`aXRL1TENw#z#n7UwEKSz@%|dO7+`Q`~7> zpU-0chO_yae3hwH?fAEqtEY5*BlZbGUXGAggsG>eutUY4SQ|A@c9^w>_gQprO-}5+ zfWES{&E95jWtqFj`rp00H>)Y0>@0WA?mV^P!QJ}q%8h3zUbD2B7UTjr0yhI)cO)*ZOAxAC>>hYIprg})pp0_j8T0O~%7L+W4pn|{9LF!6E= zhiWt^S2;_*#xlH7UKBB^oie4RorQb|6G4N^s&q)Rf|WK>vb81)_W^aJX_k#@$}9j?q6`{>{XHX^v?dBySK&Nd>!({oylV#&vU%8 zw9>l^(mQcy@-=Trm(|Dg3{1XR*FQ9`IE?-^6;yw0guY^M=+o+5jY@N2 z>}=*3on?0hkxf|^D%mK4zaoPAZTxkPVlnm*OLzZ?k+zpDi8S>c0v!(6ab){Qr|B@1$Yu&T@ z-Cf-u^^b6In0s*0raeF$8pyXDtuJx?673p)19$U@#q@uUr)h%2N-bYwJf#tCEo4k< ztcfMu)5~^N&cF@YxInkm+QJ{rBUOJv8*x>-(@Z+4{gX1jCbgpcTRcHJF;*e`_gZSw zLR-E|CvQ0v+I+W7`3)Fci36I zt0>Q_n7czgows-@OZ&lXDc~%7F6N7F1 zNp($){lep~W2c2SLq*bDTKp+B1hTd!=2EFy$GV=Xne-~_c89C!XHsa^>hk^PcFa2x zi{Fp)mQyLEecD+SZ?*E3>Sdmz($dbZdR}W3dAXYw_8?E%XZC(8?($)68!OB4C!ISz zr6N14Cq%{F{!_URu(aatgyKQomCd*M3=h3yCuMUrj4g9lv30LBwi)d2@D2^NV7y>)%Xi6Ma*tW__(!y&AdYCt^;F*)%>Gr$OafPNm~h*Y%5u zr83p>BB^7U#*UbiGk@Y|;S!;px{jMxm+NhJf_tdv5^_4{R?E{cth0=Gvyq zyftbTZ~qk~atP_DZ>*H14pndNzLG?(_W*q<4FFZbp0ML-`ton)@ksdd^o2Zb!xb zOo{P(64p7Kmvl;UcYap4C7KG z6rW?L?D79AbOs?y?KHX;?MjyN#x%9V+F@pHb$o$)PbJ?|NoH>^;o914+x#_qt2^rL z*WRdPwX5~5RvFKwc<+CC->VDm;zFM1c(SutTF4W3koVa+zndf6{Z;=HuEeDrSK`niqF5MxYhylQ-B9%oX~y2L8)hkUE! zi})*rE0$FD2kTJwM4NS0@#`DBtiPder{A(anekzJ!=d_6O2};Qr=I7DJng8wE%$CC zPjkK}dUCXEEo%4V+>>*kos-u2tsMEgxc)zo7Y|=qd?)UX;ZEei-KcnN2f5AhxKpd$ zV_VwIwr_lzw6jv0&23~!@z$hwllxHGXAA6g$F53kt!#4}(AHPKxkh5v9-%GA zu7RO#qnOjLHYxNVP6W1jVB%tOB5a-#MZ@6N2&ZfvN$oka6I4{GQ$FR+D%gGF;lhE>U{t^o4U#@Ax>e8RE*qndYdU`;%_R%-@#oW7QkDX+%HHtdV@80+< ziYLv}+hDM?{0)L%qjq}7>38~zk8=A*caEZXn&C}zJa+QxNzk`ee)a6lmyvy0tIl9zKe@IusirHrwmYS+Go`*gxq*Z2DfL~p`tAgK zce1@R-QJPf&}D1rwl(x5*LS5fFnUt#oyqoYo4q@!p5yFvCD(VS)b}LVdlKzE$@U&w zV^>OJcT!`I&F)UHyOZs`NsI;__9iv<@-T(h+Iu)5(c$K)tO*Y_vYxp_%^O>ca4r>(X#uBOLU)fHFGxF1v96<^gEceI_SlB&CGHC>4{ zUHmJj)O4g&w#GHq{#E$fTSb>=7G9oJbY(`- zrFV-i&MG`Vr||5Y!ZUNXpPRk)%$#i}Xa3kWV@vC-Ev+-ZYnl07>#XmZXMXLN@nz#X zpVhziQPn>-l|Q}V=W%QHj#;*6WbW?a*`K+ zi+tZ_>3crm>wH4i_yn)?nV;n|FU>m3W}OygeJkAZ`eMt=^DQsTu{`^><;j;Vlc!q7 zPqvJnUkRYt^&RFrlo5IOTJ)jo(MPUF9k~{D4p zx){kKw_BsWJGG$`sFNYOp(m-q4Wvo%$XBbOJK1{hdP6OV? zUM7J=zTvRu=t*$!<##8DJ3tT@z$-Q(1)$jXk^-{;)!3iRwyDqN=u6WHkOj5_Iw(&2 z5*;2JN1(4s1nEpjcX*Njq;H<0lfiqA8 zDfL$gy~f_;DqC&|v4`oNlG_$f3CF{|`3ZzRGjTi9=4cIr!RV5S03 zFz-%)VkRg(>}8*!)Gyz*|*Z!?O2omG5kX32$_MdxS1b-}q=`DbTsKQn9l=~+J> zpS7iJ#t$cFe1CGrx6L!Yan1V1G5yQNX`k1<^;zx9A6LJ)xqQloU!GXAcigJoBbV(Q zkzE{=x!pG{-#7I~Kil_yiQf&2`(jw^r^8}C^o`o=7yh1K=o+6z%ZDz^9Xc<=Iy=QO zJ<;+`jP;GBmRA;8UYccj;T_8}|FS&sqGiG}L&i?Bj2bg!_y|it;1ECGAwFVxh(PuN zs_p+p?*D!$gbnq)#5&As_4Dxw@bew+>mTGFFw%eIsNthVj~p{@Bou1^>_l)LGk((O z$&0e*h|KK}kb5x~oU;&Kqa5mkOG zru-%YkYg%t#8upgEx#EDzen%I9z}oe0CjxjT@a2rdMl>tmaX~@;u}|eFTNT%zGq_q zEDvis;%mDg7m5>W@7qw`x()_HoWj2;J9Y32n;l8^4w2Y+KdAwbyHoXT=`l}rrrHg{ zY*9>mZ-U^J_{Q725>Z=TW$%eM%-R~!+@3U%+nvl65M?8~e79lh@xDYBX1i1LER%pI z1#*!&i7Z0Q6}%v$-EPo`mvjPeUrHmV^$8il`4RQ^|Y+;rY zl9~om91nO&qElB8;9QwkaWdrU1Wgfac`s%Uu7ilfFBn2=91jH}Ld?e)NN!*P@%~&~ z%B`tGb51|QoB+toPKIu~JI3B0Yxl(2CCzd5Yy~e`jQ8-4MEzEKlIq<8xz25?bptiz z+87OPewpG|EcfD(*hh|&>N*qZz_T|FoU6OztKD%&d*azS+Ldq=A?}K+?2KoprZcgs z6S|YDyHjhr(rdcYs=88+wx?8f#2vXGe&BBKzMJ!QT$@q$`?R7f?-WDvuhR@fyIao8+}bvC%cN`1)Fg4)x0MV}}3#K-N?L^B>6jSS`Lj7QbQE0H0w2z5yfr0#Vh`!$*w? zVvHU;a_sm~V+P2I^&J&dF#9>Qri3X2%={WtPzEOdiR zGUA)k#B>3(z|x=2`HdX!OKt2=g#x4*;$(~^l*ZX2jspM)cam%ezz!taA0*544kQ^W z4UBHNWkKDa=;%+u9&;UDCD~;XKz{+&lkAini&HM*U}kub%5jOcC{AvAklOf=gDDQ+ z)%&9I^33`v22fRI80H)X2EbTxIRP{Df%W-0AK^AT{DAmsDKe84$eY1M1=^7MS@Fv!D$5wa5 zRCUHzVW&HA)WDl)gxFTym0Z)4THTqZ(5WZ2rY9YutMA)zbVu$+9=H?o)Ahys{#dZ{ z+N`o`(@Q}3w`ql!-$jdyugodFJeO_Jm05)sW*45FS9oe}{+T)3PtDriHgoIgnOoXs zZ#gmN$F{jYoS6Gv>&$O3*v&J(bWZ=={?2DdU;m`ymCfZZZun)&>YtuixpRD8@#yTL zk?92^Qnv&oe>=?f&9H?3_{RR*C;CI5rJIL^zh@0wWnH|&x**qQPTJ6!$<`ThmbW8@ zys>!5tHIV6=UZQxZh7Vn%ai|vWy|=dEn~)7f<|GmEq;D7*givtfb;+Q&#S`T1OIy; z@g5jf-#BS!}YjU6#++{m#EkvmGFJZa>(i9zEg zasUyNU>CEgcDF`jZ#w%(a3lLYsZHIf zO`PUVY3xCo`L-jh#J?##tMfUN;nBk;%q;^+?dBX4{0e8UCd$V;#3O=>0R|%I7JVjq z_3Etrv!qt|$iX@WY|a5~jpin?52T8kAA)L%6qa+a*?|9mcgKpSHT7|vVXQS2YnI?y zqGPs-pv@psHt&d@!m_z6FTs;@+%aHy7tYKH3|k{FWPmgK?i71}as%$&gJdVmNQ0y& zslkI`W?ycpWswe(v4+z_8x>IU;Q);`!Zw(K7(rUZC`>9o(DM#-oRoqKF zay#kD^Zo3r!k^wK|Z)Clp6qF-k+0J-Gi+>%Rd7ZjggP;hR3!I^par{@*4 z&E0l--nO>+TiX_HJ-Oh=6Z5tloA*P@yziWIzipiTRsGB_YNvl%_2x&FFK<5b!p2{o zUAy~(MB$5WYq53%?1K zx8n(Z!4`Nc*uNVqggauZ+GDDja>4elG14e6Auy3|J2@*G&RIL{35YKg*LK?KJCg19 zlX1?oj;!Jg9OPLckK-!un;4%uxsPWd zor}w^GdVQ%r)oA}5|9nx?ckS-=)H{h=AjZ|oPLJfX(LFzlq+b+k@bTj1z=5}q z$qijj2FW^}dJHw>rV3{U5{yhsjYgN}wmKLowH>Jv-%cDgu~LS7bw_%Q0%Tj|{rHNG_`~-iez_g` z)6Io@u0rwb((5xzf1g(T+qB|erx!ypF*3gT%Dkdq=M-ODP-=Tbxfw%e zCt9Y*S>B4V5GlX9$nuXlLtcExGUYYPQ~$6$F~vIWIqR4wEu+Q{QQ~X3#oyoJJIpf7 z2b*n@UJ981H@`&0-eK|au?!n#_4V=f8#avG)NtRx5yZK}iH=8(95s5(s4Rtk#St%?DF?L!mx~?65ZAxAt#E^^fb|u#lLlLOT zO_^x7mpDr?FS2VlQrpm-_Frs`3JYG8R9b2Gq{>4Aa!*=QZ>pm!*$K`{7XvB4f^b@6 z4_gB-X!po_n<&^wEkqkRh9KAkE5L+1iK8giK)DcTClo6h#V{wi1cI~`5)GbcAFmZb zFir|fw)uhC_9t<^G`F9Zr#d~!uKr{vBFiK&kgCD^_N6=fQe3<>63>}3%+hX2@Pic1 z34#~@%$1ov7-H5wkYe;#QrkHAU!`XM0S`5G7~h^|l3-X1WxVYW%?nMMU72kHWRo8w zJI$|)K~OK*C468`=t<;Pry~N~M$VbESbc8_jMsZ*+6~%hw**?hRd;f&QDFthp2XVj z#JcXdTBF6)0y(C}O;QV-NotYNvQ>4HlqPygsg{?f20cVZ6S4FBmy@V*=K_uQDb^ZG30xCA+d;w#gNFTY!QWfm#x(#tbT0r}G0qVo%j z!1>(5qI0l3zv#@ug3}A~Pc6zn9kTV*;%&zlZ#x#UrFrp|mW4mK=6%;V=PUcX&+BIV zr{b+o%3pu~(97@d|Hp_p3GqsxKA zhxi$mQCo$~j};iGz5f|UZE|8mhYlsH?C&!y(9b{6KOo3=#0bgps4;<~Mh_RrV@Knk zfp^Tl z*yN^=WcU?^a?Z}aBv(K3YTzBzyNKmJpibkUba?=?4Z^9SSl}mU3(knI_H9lHJV6UeLDl210^}vX z+*-Wv`hwlp=I*>Pqx6sIrN6yff+GL+PRVaTP1br&>E#8*mll?sUs!r!LFu`L#pi>I z&MzoBA6$4YxbW=4!qdTprxzBU49-6pvi(HJ_G7`@nnQkcF8-lu;df1QzG|5JMcvH* zR89Zn=-VGu{A=^iuWZ=&;+ox4R+K%JS1>7K`!HS zbV1e->QFONtkdJHZ$(-E6>fPY*z(dGll6Mr^2{qko_yXiX{u%1)2c>|8aX6rxMg^N zlGv(A!7`<#$1pz@VtDrP(V*VsJIp6QC8t1gTtR*#Mh+h_as)B&=+Pq;0*?zCMLKKj z2>Is&*CP-8iT*}X`9*~hUsFhmEWaIf_;%D0YQf~P?lL9HGb6#OBH^6x#8#8Yx|c}d zuc|$oDpECtU^35l7&fX%;umJ6#mZR`^TMy>So&+qMqLRQFy)*{NvTex)bZnz5MLYi zp%_V(TuMw0swRf@imbdbfoclJjY*b6#`ijm!ZsMY%L(49tGS4=#O`#-G!O}G)X*E8 zN-NDU2#W=q3)S<8vL?ii0gRk1;=H&iz3f#+!7C%3?l9~)AAn)9L)(;QUh*)t>0zo9 z7cDTkpt%mTYNR<7$ueW`?rCJV#4j_$gG9$5^8*M=l#yLIWX^nOYaG;$nJ$dr$~iMv z7+X$-i%+Y7-D{@_;ql%`vy_)aItUXf8w;)InB+NEBabK7t;kx~Dk4_a-CKc@)5am! zliTl0mD3)8eP~TpAlxT@HB_hbo{#H}uXB4=_p_@zKBcx!vf zORJKIg|1dcE4{Wey%r(v%BbzisJWlU-;PfFGAQnofav#!E!{9IY>iKd>QGkdP;*j;&P*6OEqdtN z;nvr}tuHUO{==~R?CV3HdCB_3b3-ORZ5gM^vUSv0%ZQ*M0Ra~2vhU;cm!jtXGnC!( zRn-_rjU4+0`uhh3_>Tyn5KMGT|5!aroxa3hhT7 zxgAq}JLX7xOvSzE3N>$-Mh=yOqmSN=L2#=&5{|Y<*W8aKc|{9H?VUIZzBL^Q1VJ#1 zts?lXCGD(&pc2taWU0KHC@)R6N(CL#RyLY6U|Bh5V|wkxw#c#aP71puxG1v1Sk-xP z&g_tIcCzK5CtV_o+r*I?Q8xPuc$Jvth|*TxSIKOvb|WWj0$Y1AkB%Sf-Q#Gz~vZ(XeNhrN53$4 z^44BE{aAU;L%{4uuagAtLnvk>IUXi8J$wwZW6)S@ZDE-=MQ~FZAIeK}S%uXD>C#_a znK=i)4T(%F6qJ?LHV)hb0!$0Q&T(VBRiXaxkk0Zm3Tk|{aIQ1JavW?`UU!RSgSn~z z4W2Yi6iI25980Y2i?8$0B@$cL9b4;;t#QZIc-V;pbp{|8lJB}QyXZ3Ir&&dp<`!R?UwmO<$+_Utv%$sqYWO|7xbRF! z;pwn~Q(*;dA^E2lZ$Ghk`|+@C$HKQB3;VG-^ap3icaFv1Gz5QL56iPYt9NgCKeW7?bIWB+F&IobPD9Q2CgMUVlf~NmU{`ne-EHpP-ntMI6 z;(E;CyV2!$W6JNuu&prd9PnF#g(mX7Z+bb%W!;NEsunCIwbYk|h3+uQO9}YCIy?{EKf0bO5i(s(;P~90Xt%sZfMoX-aIg-ny<8SNBZ_6i{4n(dzx2s;To@t zfPxtOO1Q~o8Gmc)L?}MIOL=)M+M4VdOmPjSF+>*ddJ!H>a}2_@_d4m4&Oz!*2s8(c zwPpe_;>*n7GFOxCGvVL?Kvh~PxmV6vg=xfB{F=8`icFId(}>roo1aeAF8C#U_U70X zp_^D6gt>x8Kci7+W!jBN<|A<(e03TuYxLuvO;lp0Q;wTUakAQD>P`L-gzL#ps0f9H zw$-ZTgVJyULtR_$IN()Yt2?o(#|FPOfGklK%QYq(Mvet?XBt9W*Ogh-FtoUUXs;+Lhxc zSKcjz=u5MT$y#5SUwUC7LR@koq*y8(!Z1P%#fuA0E-pA8TG$q{{bVR(+p(~%txJA{ zWq}-m$Ntv7@awwyUslcetbF=Mhu;2R|LgDVd}U49i_43i%`JQ)>xT(x-;7E6&*+4I z2gPg-h}hs8Mx?ybXTh?e^D+hUj6}<{Xm6vJ_0Tc1#Q2$(=5ck!Ejz+?!nMrYLNa^@3#-xfdZO7Dj&o7R^;e%&d;JuEtLHz%SJ$ zbUC@YSJ|za?(}+s;!c9%j9TL2uFRV5EJk%#Y87&PFR8pe_R!7PUv5VKa(n6i8;kec zSh(lUIXnKGS^68rrfG%0zEybn?ZQiM6<&hk=|vZ2m0p-va%Exh6&&^Al8YgwmlhRX zSX6vwanYH@g=ZHRoDC^BwW#1kNWs~~`KN;OPb|tmfx8Za<*mn-Y-I&Q93i-Zi z(YN+R-_!?xUAy4(s@b0&n)cy=H{bv1^^H4UT2uVos_j#j{rFVYcN0^;8kh80Q2Ymh z(Hs4jt_uiV?Hjye*n%vdxrlP2bw;f9?MTa;p%zL}^oRUohV}WkhfaOn`pip~$%yi^ zmI+T-$Bnm+9%CIDWHs@!HPGMc?>{ua&&S``X+K{YKYWM#`3BO66|nRW%-*02E9wx1 zBn&f+914MDr^|0e9k~-(emAQ8PE-Xu_o6E4h$f?jg}xVCc|Z0jTf|rVN{*`-iiO$6 zss0PX_i5oE#xdrZ{A3rwFDYn-vdwj-b3@rng}M|LG0!HEr3!C~$)AvXMt@OH+2F^X znSJGxO~T5PE+ly!qW(@C*8^UsIzp|E5W>6=fJXI)@y5ptw}C% zCa3X~H*uuU7{q{1By!wCjI4~7;6>3Sd8n#nl=PIO6BEup7eR=La0k+1mYCQ1P)8II z>mWyP)G1C>n4#+nXUzb{ElYO)GV{qJytK{n$c8u?htFifK-nKpN9NONf^sUqjUgAU zdY06>idKAne1d)=$mLlnta93hZW3RRi{E}oO*xIx#Flt@P@*h#R*<4!sW%=0SRPWD zLa)tl-u&{ZIIG`-ta2(1T~vo_;MZFn?qP>=lH?fuRR~Ncd~Xu%9~79#Ytfdex>8SS z71?PD#I#Qv@kNVCP1kj1)pq67_T<(=aYsf~dwRv4ymB9!?w1BZF4R8(G~WCEA+d@(68$k zepNm1^P_YAeR%pu2jBT{{~Mcj{cFR{S67$5xV+%moGnjgeK#TXiwTLJj*k6cWYqfs zOV;^?toB=!=Q}UUXHKHe%($WN#9H5su)eX_`szaKOS5U(v|_NIdEN5l3+ln1^rU6{ z1k0H5Lq?Caz%pY*pjZy@8#>(IC(v(bfUn>1fQW;CMv=lgc%4BOI{MH}234e}at4X4 z+mRwyB_vWfKWnie@mrz6UnQ4~E7KGtf z&3GiNy#84T+i7*C6Oxu5W^dVMW1dZVS$SrxZ%?{Py`ojXdYv#|7!0#lJDlE5j9!4% z7fiA%@nvvAh7nNdjx1t-MiXj_Ttb`&==Aj#bXZw8&>?W}m2QYIhE~t=FoQ4?&kR|T z$cO2YSIMH#Q!)yu;g@Iofm9f}q@HrfB3))X%{iFrq6jsRqT_?&7kC|ykZC?o20x3! zUWnGfq8kOL@k19$O{gi;d}^FqMXjKMykF>^vA8D=DsUkGX_{Y`T`GCzern4)if zOx{kpYtmv0nZ0Q)5pAMl&Pk{5OHs4zH*O(K*s5(iy@7-nges2a_i5gUeNqQ_A-QY) z!r9@UMu3Ak32GXu35Qt<0l8F%Y3(2#O}})PoHG@rYLZ&LiPdh}x00$g=-on#G1bWm zilx7%S*ufx)9U)@%&hIotLuT^?Ajh2b!KgQc6EC?6d%2xTy;C?$lW;N;-7Al-CDH! z>b#xTW|Ur=R`k2tstc~XlYix%!Yl6-U7l6^+nkasbJ60mi@_xqf=ez1ms|-hz7&k3 zE%3s{uyH!sC+RLhklOM+jRW%R@WuYi?{Hi0nVFcz8~t)3L+vdBnxrr?ti@miA7 zve4PM==$#LhR*D|uI##woci{>+OEvnjvPkyy^M5z=6!E%-1V<@J6>K{^un@jQ*(cOCiCkjQofj!@X@%q zO=BW9j9#*8cu1b#!YtppX^67VyHVCRms4_SddHRnc`7o`5k4kDsM;8 zNJ;TX%-)TzVhKZg6k1I27Zt9)7h8Ro6m+!wGn(6xq>MD}99q8+Uw2<&ugbm@4v37X z{AvjsF|X;L?@Y0GsGZW}qG8rJWN6h8q^jrg^-wYj$q<-K_@sA82(a|K!^i3AFv0n4ub4Ch1mh0}CWPhK@N@@m4~{?ujx zo~e_u%BuTl9?&G9E0C~4e|Z&nrZf+xHjB_yqFs##s4yp_I{!-7K^-?9*sHt`lkvus zl_@icbWFlSM4veXRLy7OgXyhp%7bx`cV})fOgZ>Go=hh{otd(jsdOebo75RwJOe}W zs!I`%%Q8A4gG_s0hP^)n{6%*k^G2qQ zGlhC9?{sI;nuQ9}U^$Rb+o$eIdbDa(Jc3*;LagynU4q|)+75~o948A+lWkHJUyRP= zDixLJmZvmKImz32Nxx+V@IrB2cTRl|Am`LGx&b+>rai0remZgSk=yaO#{)N(?Ef=l z_n!-P{V})Xx7j7XzEdJ*XBA$Y&9WvE)Pa-IRjp~V+N z0ofoNT6ktj;VH-sD>@lgM9TUkjyf#=WEd&0f|iJamPkDIw&w7B7m6JHqbp)-&nHSA6@YIq2Nz{neoxSci-Rh*2W$GT37taszR}x^TV_0Up|%m>Ewh> zW1}~W311x)k~cg!({Fx~&z$(7)1xhKM_S(?eT}=GYyHRDmgoLudFD0CGcQ=5MwFk$ zU|T0nid6H)pONaKyiWd^_}B1D7Fzs9AGr&{WUeABB);@wMH2!aC3D4EBtX7zb^uu} z+B9ORoidJIN|k-pI44J4!-`S-Gbt?i)p}C1MRQGgsJ@3fkvI5FYhd3j9rBV(A<3|; zDgA%=MJ zq=+EuiPS!lI6}RVPAM{`+T^w5#zlcNTHkpybTue*3}(pLKBkz5j5ODy4CkXX$3wy5 zWcz@31i&OLaWfMID$lE+-b^5(Tk)?+d=1!|G4_M<^ZH0ih;e=1(RlB_Y?>wdm<{wf z`MC_dnGOK#%Y-K9K$a|oJ|yZ4ykgeb$B*odie2W6C&9K(hNbZfP#17ptemO_|1^J)aFE3LYtzb8^>xtX~cDpNXYismYSIpL?=q--u@9Sc|sSW?S zI{1sq`JWw{|H;pDKiD^Y)1GPT36=~0xpM1^x!*sV0m%QJnDF8F*!5#0*93(v3k=Q* zn4jrCJH>Z;!mzhvhP{cqUSMUN^2_gdBW3F|FI%5|F8tuNrDm8E76`-de_J@nJgaj< z%lRX;u8=7BPGaS)gbI$sFF7l%Jfa;s79p;_NB>45OBhID)hK@zPy7qWYHK(ADs!dI zXR{<+fiR1Y5MP>^S;Bx@R`4r$#jo@iNtO6|wV2>no*9w#t~>C;C@Pg%)v`OUc{YNG zSV%iC)v}J_8Wom>=2;j7b8VI3;Y%wUES(kI0LZfsGo-wHX>~Fp1;QDqp=>jP1?J7c_9yF48)*_Mp)(B*>BcGG=Tt@XmV#e`ZS!LEX@_nLh91Q|MRK1nj8YJ z;-_vJgxPG(V?fQ|Ge0zg$k!|AoP*z1uAbi>vaZ48;GG{}p9!#ub96+%Pg(I^7*A(; zqghZ)%NBQFp#3tg&J$nTM@NV8&mb&{=?X}w?Ia>5E21U=_=ROw7m~bUsEVYw(a2U=wEIw*?%>3 z&+m(N{=Q)6uk%VT)8oPI0;mqNvT1q|a(r=q(UtjhY89VfSbT0l$(fMSbD@G)T1=%W zr06X0h83R;Ejkxgcs3k<(ci+8ONx$#7AYJKB{VKTi%*0Xwni`tjz{I6h{-<@TX;M! z|9DJcYg~aVuCOT~-;wxZW7H4z5kJ%~{iZVP%Zde`9-jNrPt!N=d23VI8|zD7U0L`- z-jB~_e)n|hS5GGYXMDm(qhdFV3SU1mWc7&PoPhahzH^d&W>Qd&^m#kf`me>TZM42T z19wgSS^gR2J#;Rw!N+MbX z-~G`5)(mWsbD{*9{>yc%l1(TY(uOtSJw$!Fd0A%&uUy;j|laHf_-#KaE#BDLzr zFsWuaXPIY?Xo(+{4&_XsQU=evBipQkj?${VMvjp!H5}qgyRFrvhDty^U`M)!NNI~YW7ILUFa<<CI<=AbIPW~;auN#!8dH-ZbZ zocur*nko{kH4kRG9vbJY86(5RLs7|eA+DW|Ql-~2%re_%1^`<=gHdYpk($l3Lf!+9 zdys2>x$TS}#i_?q*8x=N} zV&-ASP&Q1O%kfNJ$kqU>H`Q_Z9526ofHbn%X33$NvIu+YdgAN2V}RPRVrxBd^lt#K zx;Q8ece8?+rTr;2^inEkr9@V3Pl}P+G}@|JW(csgJqT`AU3V7w=Z0?f^Xhw-)%WDq z_pEB@T~*(++TOjYk^Rn94P7hiJD1mWEU!g~+cT=}WU!`*8WYCyr>jf$UJcpx2NcgQ z{dHc+?{kWO6T*cTXVR=ycxhh##rcH@F-H0v${SL8c2UXMMFRQ!lH#-BrDvqS#plBc z&n+oBMVVMeTJ_@NOY%>K7qo@tA75H{Vrjwgh{EGhW<(aYB^0*B7ay|~A4@4ZmRj7B zROCu7a58M$9C1I^M}Ake_=}2#|0$pI>7h9v{X9$gu3fLKEqzHba^ck6ZBJ+ZFgf+> z2}%DRAOGRFn2lq?*NhBZ9=IqsU}2`;+{B@?;;a;u-&|__SD5_sLDi24e!~ylR@vwf zWh1RWBCkdL$nid($gas*p}ZubRqaK8DJ+_WKc-JoiD;!t z0G4_yUA_u}&bE2dY=OX*&NQew)w0$2QlO)GD#Ygu{pDd>LInp5!>a>0zb=HP>{+J4(v+!}5V2 zWH&#^b@c;pHv6uDtY+}^Fhv-;1t9i-Ie`~uVh{ADW&$yDh@M4Kc}k9YP_nKhgIqK| zglDs*yl8Ge63@O;XLh1sHNO!E(`8NA%Nj#kqggK;uPX3k@l`KYT^|-&E?Pa(EIb6* z-qc#Rq?TnYHNB}dtZ8zmH*}@f_omfT0`ASM?@_2*@75NDZIE-$Yv|6gcdoGauC({8 zwD+!VWOT1?=vh_Yy`sK*WqtRu+RmKXdzsaD)5=Lr--$hNE#jwZOZQ$2+jTW~=O6RS z6cNuVx;%sIbm3*Z^qc|~G0~cJVIhl{3Q2994^dtVoX>}ro)0TMiy||Y6rW#GbaqM6 z=@7!jff<{Bdh@+KudUnl^6H&0tSo+hdBF?0+n&n$ z{^|5@pGx`siKI^^#(y|IX5-k1b)%Q82warqzcAfzZnE#J#7H8AgEyBRyb-SLt*Aq{ zHIAUX*Tc<1B!XYXytGh4t}4Inu@&v`t9Htx_Zj$S)(plF_L{OUIV+rVTs5~}ka?#0 znOt-{H)=3BE3}x~IM6>y^CWE>WS-g5c4cm3#X4U#Jk!9;5_@%6DPg6|mD)C%C?qM2 z^~PnUH$!sF*U8AP)K+Y&&?&bJm~3Tb85mtXivUTX_$C`Ks&G<~tZOjGE45(N>;+KY zaL9rSL8>iON=%Kyk`U%=51vvk1+cQRgtRnlKs2x7A`du{<@`Itguq~qm-ce)&0OKA z4Lis&Ve(&qnWo9%5u}?07i7V&%*H#<1Z!+)DYy&3#Fdf&1N_soXf0lq1otsy5Zcfp;`DN!86%PxeKVx-T96`c()J{OK0 z7o9GM}zqWq=%WL<&w074EYfGP7 zRrK8Q;;A_WQ?q}3HtUC{s6eHBIXUUm2?-yKkA8nl)cR3jt41u&WAWfpQqUSVBfJCI zJR;{D@0I0VL94CB@W{ztdfRr8hsyXnC04 zEQK{<&1rw}l!9Uh)Qe?3OO6ZYtkf33N`IyJdTY$EK*m>daW0t2U^)`ii1-6U)(nYn z4g=+tk$$Klx9sH<=gdp^k-fm``dLt{X~9f8h_Bueeknz9eI#BV4^Lv8vohGqdg-^S zyn)#nB%?*+7K;~P7W151Kj5t#C9op+apkwqFl)jk-5*a2ic^Vd)kNJ(n+Ks2{q06@ zyR+=Q-jUtt&TVw(*?X2X^sXRVWp^)^;P$R;axZV}UEb8Ysf3OFCTQ~cwx>;Y= z&HlV*`e&?rs+{&=`D>egetF~Ge{O)^eg9ay=lRuT&#x|henr`H%S)!_ZJUz2{i*D& zPiB1oWcoKxB!4x@_Mgd#pNx;$O!ISuVqU69H^N!7VEQK`&|j@wAO+2hbnY-r{g+%c zy_Du&I_jd7c}9N;ds#ea(#}d-F_7RmYQ74DJ7WoZxnp4+AX6+L5Qbk<{N*NBN~CZFNwJK zG$XiZYZiopGbeCCy&XeXaeY1#SuB}k>F*%?vQG%CS24sI>2$-deh}hfX=rv6ii~a| z;ykOwIKK^eM4i0?4X~V$zT>IYaF%xYrz zMR4N@d#M>IZRJU-p$g1GGu>s2b6D~qY_-E{-5K_t%tm*n-3_@go7?CSyiJ}wm?b?W zPTgR;qN#U(f4LU5|Bvv!e=OSd+x#-_>2YOt!R1-oDGgtoQFw7y!NocG=jRrjS->)- zqDza5E-or2k#!CW4Z>liUVceuoee8Fy#$I2s4JnrVEdTg$f6U`MWN-R5_ zxT7txq|H`(I>g~@e-u$HMjSr5#wyEN! zjR#&_xBtbpKfSnm|BI{ly|8-sbE|hgzhd`uD|SA&3@ui#^_1MgXL6_@Z+RyDhbPm& zot*Mj7`FMB8%qy(Ltwf%*b%%-DISq<)>^{b5omGwy_h5SV#{Gx#b0wfN;OXs1*?k^ z^L(^D?x^HgitJr{LpIGg(Y#JRs3p|WX*!^oTH__WS+gZd)4xD zvtUrGd+5J4iDf`0qa_JepB1z!C!>~T;#_YBzA1e^?$hw5YcPQlUraIqreaLvfu%1d zM9maUe2w|uas+i7KHSGEc6+|VS--*;qan!C~s`ZshE;eu_b5YO3x&ep0X9UB^IBGD?AyK z-x{&aMW;u|56;{6Xc*?^Qgv;m|W{4nDj3=P9eWTi4Ie ztlmF$&E98M?V7TD&y;2Rr!Lz)b=i)o%Xdy$Q9NZu{*-0;Q}YU*%gqPmrSN;;CjObS zFUc#jeu3q{TFZ}xR{!LYd-Pwa_^am0+iJL?>}y;!WuxfI&KNp3j&^eIve@cQGS4R9 zy&ub+fwlNogN1}~4boq+tZvE91X9qZ=ZafOnkukSUej&GY6X+I62+$N`SBtnIp-!I zg&u5f%xdwzqxT|z z&CV0w$!Asa9azkL4xaymeQ>%TvUQCPj>_;ucowMW0 z>{773!ab;Guq~qSWMs+7$g&eLWv8OcPDYotNqmdX*h)^3zltwt4d2$hWJ}B9?_3MM zX`JzS{hOcEyz*h?^B){}e$$cX-a9m9!-1#P?3=u5@8s3{C$88(Y1PjYR_>p?V)s)k zc0G}|=gDRJr>xlh%<>&mRx(Pbt}1tX? zJhSWwMv2Q}WW|032>x;0$xcUBr zfPAUs(tyv7az6Un8%r$B1x5r>CK>OV+0qYRkcH#ThB6UHoGW$9lEMyxXKD+x!Gp9` zQJI6|6^4d!b1Av;mPdk=>yWQDA+Vs+3?L7HQO8TeRCaSeIV-Pq&o;`4KIV|u($z2$ zd>*zE0ayVUEAEd*6G>c z>Sny>>fO}r-qh0jUUT%&gJll+7iZ*OoRxoJPQh802`^we;T!H-&pPJ9h z%DW8mS3Fb;hbbFT5mwJtHL}~zNTl;wl_RjFUrs9rDb~l;cg9PF@zSOXtFAjyH?JcK zW<8*H@vkyh+(1M3(@<5Hd)IU)iC@gKNmwcWEQC!bq|%|}sSKyeGpi9u31?1FeaG8e zK`mIY%Otav>o%nm69Ri{E)qmU(By5JNf$#RrkZcE>~2Pj5Q2uLjjs4Y2#ZB zDXqd8t^qa|%{982gp*skvA(U3Qgxgx)?XPdf2WhkYI(%qWIQd10d-ajZv26A zTzLByN>>Vmk#$*Lo$OUW#F5i535up+oD;HI{^EjI0(~%J^3h++0Ox29K|nP{{3X#; zbUc{XGMHzc{V%_qsdEg`1G%n;IZOq{ii12qAlCs~a@t;gb0{tohA4UUFstby_X^O> zEm_6T@BoDMM<1vhX(2!Jv+iK2`{R+E7h(-RSCE@90?9*twQsQ(echn)|s`w=*klrXIddAiQ+%)zDqP zFW7NuUdhF|MdxSdUzk~Nc4onu83m`wMbFJYKX3b`dEDZXyY6uB4s~&y4=pAZ2H{f? zAY6QUNij{)q_a*(7Pm!}wndhng5S8}Q)HfPWv3uFzLfa)WNg9lC0mXy-qITUoon{j z_ILi%@cKv9FTPhXb;IE)8xKCU=9kHxxb!pc1_!SAXa&#&A;TXssuunQ# z`m6i@Q~c%6qhO>d9sx2d&OlhJ!bxSwIXiS$I&VKSTipc10pQ-mG8WnZYs@p5XBq;t zX!5hTK>*x`G0bn|K{`XVYmXxXLE6F zNi?aDB+V7Pc`c9fS{^QIew1fum6715<}(d zp2~9pxHrM2Uk-I8!>{0FnG!8_ zd#*l_+tT}fi)XW|?|ql&gJ#c%E-3Ea?Cjpu)V&den>tq6J66@*TTyd2=jh#x@*B28 z*W!M<7QXlQ(A}4V%V?gw$W1Kg6Lq?t|U9X_r+DaUS7K+{NSzdgEztsUJK=Re}}kj z4#6*4d@Yi;Ni|>Hi&6{p9dj4i+c8IJb(RW8tAy09S}-@;XZ->tV67tLE?C{s)!qC- z9Ae%?iod#LnTD-KIcMFXP&b)W%_!ddK_c!jtOdVHUa50K_h~nsld2GL+Xv=$HEAdW z);a~1hr}!Z68xgVS`<(ASSpN#MsukX5eO6KN*_6&Z>iGD-c}7$vIG!Xp-4e10fpAk zv1}?e7*3NcLVYA;#K_1l`!HpqSGLM8dCje2PeG&sgC<8L78L5r4?jQ_^_1CWqMnco z+Ikk%1}o90te5j|^IAv*bJW%=!HRQJjCM=-IA2dOxB?$fvx-hO7tCpS$jEBtO>w+n zJHYt>ZpZ~X;^Id+Q2dzRM=OkJ=M!d|+?^NgT%EvmWVwmlxju6RM{-T5o8uVFWxs`j zGV=q;ZK~A|Gg;C|)|z>h!73!`NBpT5xn=#G2y=I=0j(}L2z4KwRko#TKhJ(c-Bj82R63AZ!ZXAmEUXe zY-%3Z)ZG7mtLObz_xmk9AGY+oFOc0IHhbQ0?)|{k^S(Eo<>**#?^svgv8Lv3UJXUz zTggXmB;um?{Sm(Fx5YbtW&P3I!i#iq%+8k(&)#-^X8wg4+l>ToKf~?fgLS_h6^|$c zFCl+LMM%vQVvDxDf%o2Xyls@$2=>M{X}Y za>uOPzf1m^d*)F8jjHg*!e}x4a(h7fH(<6iTFEQ=H^@J8BOOybswLaZjYAdcCelJ_ znkO;RiQMy9e=vp4D;6(kl_)E|b;Ex`B*BXivnt%X7|kr&RadRX^*oyrjR6oR!0+7|M1^8Ifji%V?G4J^toPcG2;_vReNJYC=wlEVPPWo&tG!X6&@V zUq__f(okj$y%u)7z-A+hT)E|MsjWiVzY#~hZ!0GJFSrIwxpY1lXBrEg)65CFG9M<7 z6VOm7Ms{(|ErVc){vxL42jN5Ny$s_zM|i@up5;}%uVU?7CnqolFwzk11)uCRO_kh` zN9{C?5B29EbVF(Gk~hF#XyTSTFsqef`qxy0bdKZkKy3}b0~}fA99Ye0?pxi0<_-Yw zI@iFu=Kc-Mp7&b%wBzbu*V?zC1%w&>@3r>7f2@B~OW*q~eVbZ6n_JzRTOgN*Al%Et z51V^GhTP_!kD7Zwbarocb-m~6eBarzp{ZkiWBXeBy}bInxmCBa%WtJoPWt)JsJ*{0 z+4Wm++2#2qzs@PTJX?Qp>CEhWwjg|V&h|6&x1Zt`@wn(kh37&F=;AmRT6}78$!T14 zc=4HVHFdN_6rYY_l$?nwJA-Xb+<7A2RDR=W&D!3&Xp8P7KkKWeX`eN|#@}grzx>&C zhbFH(IC1qa6IT2*Hg8W*&hEhM-GN!V12Yico&M>9S0k0}Zojl0e(5^{)5}I=l#R^V zF*c`cTwduD%XdG$V&9aNyPjXYhx*ZyL)SwO-3X_IbWrODSqN-8pUFH^Ho6sAaeFDZ zs#6NfEZ$camiOjYT*crp$o}(lBXnU+~e#KUQ_=cgL4Mq+3PN52nbLNk3bR{%& z(s{-DeRW}ZSMHnpZ0HXK8X;Dzm3p4lGpXh)?pUQP7O^lw445RfP*`tj>v2nlK~*f9 zY?bNPRfmT1RD_eHp1d7~hIA!nGn?g~fs~;{kU?7oUn#FQyw$#v!!p~#Swx!*5?^?} z`FLPLW2DODZK`RZ~kBkC7f=8pO z;E(1GFljIkD(F=!LD1a#~TwzjK@a&gCE3k*uW1jKeq8`}c*Cea?-RiCgrZ+}+@X+ET z+ToOi=6(XEO->n!CJ+76-X#@zuD<2uqg?Ro5yd2yUHxmFeQRZv`__P}t8aZvKVuz1 zZZp^t?e>E$+f6O#Eb#ViI@ZU|2gezGn~%9SxAt#7=GlDQ{b6hGN3HIUTRk7Q_I=#a z_Yp?g<$k|e2#a55J4Sk~y?q6JSv7ZZkKW2Gzh*mdGxp~{Bli9gw(Hm6(#!K$8eDjR z64K24^E2}KqiN^NpH4e9r+`24aAsj4%L$R-b0EA#E}BI288u86orT{Bg}|qx74yz+&3-5k<`R?ad?I!2U2s?CR z30=_eYg#zCgd3-T)Bm8N5;Z1q2ZlIdQcqxrXJ)A2 zOTveT$f(IDt1&|fXU^v|4f05kt_&@yEoFGbHMB~R%~n>{WT$zEZZbHTgJg`g*(oXKpXtgYxd#muRJ~VH}eA+n)yM7 zR_}65*z%4rh$t&nC9x(hhFmn4sX$kTL@4Ir^5%z(Wi5ltK+?sLL0!be+I+|yX*8%l z(wrc`VfHUVW-rbwTtH2tY%rU=y?*Do9q%un9!pjo4yM>u6!xxQ;)G?6{#?OJvvfa! z^NQvNtC|N_I0u$1Pc^W@)xWA4R3EHuA=-sv4}!bCrEh&R!^2jx+uHwL%fQCg2b)^^ zMeZ@rrq;*&et4|!gJbRwj`e*6v&X=;|HD?#N5?!LYQV2@SxRT2!VVDb-0bMs*x0eE z;r`0{dwJEjaw=}59JygT@MrY?KbG$PBV^~L`MBsJ%1IYzl8D|8#b>e5Gq<0f&7Ww= zKf56R+`>Wzr(h)IRpm%6l(cZD z|B5w(H)-2o39uFdle1Fh3X1W}owCjFOD(Ay|Ewkas4&W#Xef>$+w2{bkkmOz<_g&b z;oi9Vp4j@{c<#@jJLizdGQlqtE78Gi*+@HglYh23dbqJOT?E9 zeTBSTxCFWMKU3ErvFu^RoE){hF*QoF@JDVLJW*tFQ?kU63*GD}Po6{us1hyj+Z;THiF>3J>EVlyBYvF4n?oMR7jHDmBDI%wVtq9w|?tr{3< zUdUUJd|pNttK}hjio)g*)tVQAKY$zLMRy)&wm>(hJz9?Ib`36fk-wr2MJ}4YEamfQ z92n+Mjn_OEY#0J9sK!PbLSey`=h#@4>~S_jzo%I@Z41DlUYd=cUgB)b6X{=^{s z5nBy}nB)~&?7>T8q(8(2+Yl8bYSNMzAYDQrO)37)(C^ql-N^Yc$FDBuq8+_p7FEEXO%dSbbpZ%AZCq+ZP19 zIeUj^?H!T1Cm?f=f5t9@X{%z0cm9;(o0M_t7P)> zT}uvJTXOg+OMw4Bs{VsJ&hq@?g<}(%F@Xd~AtWT^PkJB;2?^L>Fvh*$s@{9EtY*m# zLUk{aB}t3^-nR#YxSl+YuwXe3U z?3&MlURr*88Idm(tU!2RbvgBugRAHqtQ?|kkXC(aCRf#rt|Av)$2t{5zGel|x_Vw= z5VXoBsdnCI7R4$Grud2ug=Ulg)f!5T-Js{!*Dxs0in2-UXjb;9=9v_dfh{vPq{>uq z1q_+5sHZZo2z3GP6oIfIUxq7^hy=poUk(uFel^NTLaRdu@EXHe1fwqilHTV^x z0Td7eCW000ESeT7#o#`r4W*hu7#5Zi2Ak;QU z^}$Fde+n$j{mLfm$oiv3T19B4L=!qzzi<#E?^+n81%&aI0r(711-}^A5y<98=^?;- zH`akq#p6sI5C*@9XD1Y_N0f7-6WjT2vU3JF!^kP(+^KEO=`_?bB-=J6@vQ6V%(h85 zSIBLj%4(a+f_z;QX@c-%x^pta;WZJlAe>?Mq_vEtSVj|@M`H1!>-s~g`-3WPY%aaA z{^T_R;U#&O7BTq!@WppzWSxIk;63-wz6*eN!GUuN_nluP7CyW9F!=Q~1$Qnza(ek8 z`1h=wtD|Rij(}eV?6{e$v*=U%e|9&&MYTpo^B>ddUfWvz%f!kT<4azQE=D=e4?8&@ z&zZ0{C~scy@uvd{AYUNNBZk$J0mq1ZK`v;0!vE+zzeCUX9pdpxze7)LIWo`hFc5w| z_}I@va#yH-P_0I$h2gr-d0tUIxT0cMlP4?aMe1jM4$XtBaI4fdNVSIP{8ih&MqsV0 zdQ>?{*(9N^DW0Tk68~94$=KFSAqO>+I^>TG=Mwq)dXCHm$Th1!nHH&Rq}Wm zE5?`5R5Ps6)#hCj>MF{UfCOUZU#W0sq_TmqM6CQ?gWs7D*REZ_SaY=5mw!&wXM$d%VNEVxXu|@}|G+GDWUc&^WnenM2L2m1GgqU|G8VVNk z&P3a1VjMHEB43?YrFwxdugHZ?ASiauBqE!Me4TQu5YMSj&^ilXL2jl9cP8C619G>w zO>S?S+U~vsc)5^}2GJN<&dE%ta>1GQi43u@H{G!CR_jQzMMhS9!(e31P*~N?z_Qz$ zPNAavK0bblDER$D>IgPQH1Y2_V`QBL!fY&kZy)$&Qe_7db!c8#cKFP)qnKA`!S9+Q z=hhwtxt*&ip*-lqwp#S17W-_d8b9G|}h6d!!b@9@)`kIdVAc)tIU z9|azIG58SX75%?7@2h4~Ws~&$8vlw_=_;NyJqv1Epo@^6LA4F~wwO@`P5zhRb*!dZ zXOuIM?;4>Msm$bO<$PI4r{1w9B46!dSl^`l(I?o>Y_Fs2ipCQS#$iZ~8jF}bsl{RB zkMOTlyg|YUwLGE1NL_F~AcqmT{fexCw1wUGiQ zVi@HtDd^O{G=;b3K()q3_A$$S>Y9MCXji=B%dP?_B(z*C)Mgl|Qmi4K$|dGSMV+uV zQrU#Apc0OjR2JS{02XDAqa{ScZVFeC&5B+XpGqN%JtdgAR?sS@zDJM?oVgP=1YDu+ zhaoP`cVW(Nb*Bk(QM@2D()lgC3C#I(BLqENN4oEab3i4>2S(RyIBW|q+wVs?btIKt zNacG`;&C79A4a=452Bq9V_XlSq`LK2icnG*JNkZjEC2cYpH#a9?TQ4&VWgI zSVq`pBU@(C%rOAgaW~qbfH%^?H8`D(cFcm`csq~N1iwVS@ea{3;cybRv)pDM{}S*{ zqL#rgw$(QGopkrz^tS1Y_B-kAFz=mg_jGpKovilhoVGhTK-dMGC$qt|OV??xiA=P# zb0W(*A^bYLX|}OcD=a(`-!v3mKNL}WJGA1qUl}U;>hi+AkMepxfP$HHci@6bqxW^Q zarnP*@xBWS6a}*ojSyJVDVH2%BF7mDp;sP0N9JhlvCefz&&ak?-OUE_gNw6|F${nZTl_ zFrpFC5HXDGm-_@3mS5hpTaL}!a`?xzCUYI3F0F#h&lxt(Gn2}& zokywJSgXoOO@Stz#8ZkVN$xWzN3()CX1o=dU$gB-b%& zqcF)M>LD?&2y$g8iHqe~iTDWO(4{C(q1d>xvV}PUj+`GAK;92>L8g+y`c2T0v^EsX z2a(p4Y;iM?*HaV!O1m1hET|%kc?wkdW_~D4?Inyt4B6<&Tf`e0T)d z(#U{v?vjv}gzkK2KYPPF-`{`w14ct1I&IdkP`QEme0CMg3wRHoTYIQ;#UaJ&r*36e4Ie| zDe5@eh1;=XZ#O5>wk!}@3Qi%ODTRXWs8cK z*EH|Tydnf<3iL9>Gv+fWrfj3eSkN_tt7=D=S9=J4>HNiZreI?&HCJ`aD8sNa#gp~k zwN0LNn)yuGq>8ULpq$ltq-n7nGYFcT(S+G=tFjH>0#N*`0Gn6HRnIR@6x_<>C12Xe z$YW%)l(QUZnuD;azMn6_yOZh@B;duPmLH{JAp>e%OEWvnR1I`5ylgrbRC1}v7l!3s z^RLkuUn-t7u%(^HIL}hiR5i$v7LY}u$7j7R+)@!k0QLEa+J0B;}DN^NSG;9fRUKlx?KAr#QkdA+UQowQa`e=V_cPIn3_q zZS7NOguU$(+3l0rZIj@a(AbAu5iu&-?a6S9d@~*6Su(Ob>5j29+h~eyB-uKW*f=!-= z1-CDyc!T*H@~>1mx%zO&Dr~F$uEpQD-v846&i`8fwcGl)?500w)c!8L>NhD0eqV|^ z^?dZn=OT-LLgpx}@Y#@}AB7h@r^+j`z))~LEc{Fmiu%~oK}P}aGr%_B@Dl-0aNZOC zhoA5}f|h>T@9VXxW-*?IJdg|e&3 z^{je_e>MC{El4b!#l?b!mGET%i;}<0*^q=b!#5adCGkw0Yf3Uy`3$1Xphz>BO={UN zGHgratKME3c=57)@vI&pZXS)>Y^*9mU1sJ8^^*#F)t(@COV^5seO|Q6p($F1YRv(# zK%1hQp7bYEv=-jc~?<0_yucdWAkn1YvnCFz6*7rfmJ<4 z>c<49vWU45k1Hkxdfy^+ffYOpazo)wkty#Yu!UcNTKDj&?@-_p*v6e!0Lza9FchEa z+V?>qsox55@x3VbeK3o7jx=D8c7s!qFA_RNH2rO4+r!8<$?s^VZWE`A>tR^fT=+$t znExl}6M&4d%v;ky6(x*vHaG>vGyFLCXg7k_#l=vtA!5oloYQfxJMnheRyua-B=06T zk@4(i=fZub-`l6P!i)ExS#pReb{#8@D0#H%aQliwohzB5v(H7J!lEzi z|NYGN&mGpkZMO)&Y1OYL)xMHYMewV%Z}h335CTV>e3qK$@Zukb!N`S_IzNYs4nB^T zH7_`i60E1;UqWDIesf{oCj)?O?vtC2J+=7=7S_{S4$a$i08?wJ>Yr~fEu)H~e~B)H zV$!}uzQA^6rC`hBYR;qJ*G!wN8C^r4FO9%T9*wT7A2AdRezCALZ3DN8GJa zGC~^htf7de+t(CR`2t}nXV9(q_YOfW|G?l!lR{Fc3k-o3oQtMaV#rimnP^v7Gg?>O zJ)ug=%I}rdl^snCtM3sc`8L%%kqiZu0);qNcn4MwL+vJ+Yl^H$#hO2bul3zPL~ML% z#jT(KugTjCCk0N5l$VL)NVCx$mL=oP)9>%!uOEU}952M}xzbNN-3VYoTV)P=U{J_M* zlI0N&{@T*sKp6dC;%FRZ4#YYe>m-tuERS*Ai*?)sp%~Y|8RPva5a-?F19%dev!@7Y3;t^4Y4gDu)(j-)RK|4-9bi4 zqe6feY2uc>I9EJCLE49N%O*UVFf=5 zJw6{Hjgb{Z{Cn)_Kngi>F|X#yi#Cq*=G>>Y9DZ_($oJ{Z2RO?~9+ll#R@%R;Y(UIg zaeG-M5LW#LQz*eK<&@NK5dYHrOY%s2jwqg#a;9c-SkpET&$XU4oI1*$P4J6()u`IV6NRbIi!XlC^D1ameN`5G4X4MQ_&Uy-lkUsN%NQ5%}7K`n>o z!7BM{vPH(7mJ6-Sk=S`0z$%f10G6u^gh>FY`PbOac+uiqC4A}grB$Kzjwu>c%nSbp zIj2;iK^LBB^8wn%vTkKM@48qEwjFhe4m*1*8PI;8AwdBWD<}KMY0L%2h_zihm7M z73ca)W-dtjM7q9>1c^o@n{V^I$oBx-Z}}i!YuH(wi>!@xKZu2D-QsJ0D}XI541S|s z_hZ|>jpdPVGiDcArzof38O8693#h`jAQbQlzj#xMc6GzunAZC-09oJ_=f<|8kU_W4 zb|!NKekq>36Yrc7cy;b1kUUb&B>0_4R>6i)tojXHXj6iPayG>qJc3_P40xxg#gbbk z*iwbX1ba^tJV;S~QjI3=fc+o@g`ozg@@o@m>2wZzDFUYDk{&uxA*iSOe*%B$-*-A&j(L4i(|>Y zGfVcKmVW-q_Rgo)zf-o6)A(27-}IW_ZmaoKa``XgD_)K_k1-`bi$3|&sFN?n6uuZm z!(h?#;f2qKouG>WBAy?3{F%UlX9JJV_vb=MVUtM8eR?zT?;)5M@XmvOH|v7t1xDy7 z^UD^M3aMz-T$K-zKU$&6E0`DLa-p3^tH>4!zxY>Fag0*7v8vufsTB~W^9T!TP2=cl z4Sc5fisnH^b2BDXv%9I>Ks=jR*IqMcU}S@Cun8$YI?8woYw)kAR%sxJ*Z|g;(zr};D?lTv1(hOMVNI17=5>MB zNMd33QT!V$4Gh()_DOh6rh6CsaEd?V5>k-ixt+8|!!wBh9RWD~<%SohAjatlM;_ zY-i$JXm`?A|D33@XBA%=2rF}>S`HKZraEUpt}hU#ki%4Q%#aIK!4)B}se<07`seYj zuJKd{Ws?)>kgs|fOi?BL>+%9;1;RiW7IuuKQ<2p&nkot&j%yf;br?f zKK#c09?2v6^mkkTu@nE9R{i?dx7ECsQuS(b<*Ui%uO?RfGPdmH*y5kZp88n~wOEA1 zCtrwAE%Z->V!8;AbLJBctC!*EJWc=>H2(9kdHyKpg9f=ro*T4U?T{MIu3SwmuJK_cvB;4@=$$R9zztDs;t{6fBT0b@k7 zxJnBbfUwFY$sYmI=1~U5D(%}erM4pmKBK6i*YBB^3uaDk(zY`C&ZvLZZY=p!^cfjP zOC^yec|@s(=`&KyEAxtk5tuawwZdTqzv5ZdSVxkfE6~y$ZZceie6nx z9+3lz5`KM%hOePi?iBoe2ZD}ioAE&y3g$(njoPH8AzUyU=L4_%+t{}6V(_w%#IAdB zqHKa<*m*YA=SnH}bQk=B>sWpw;Ar%-UFcRUOsMOk3JcGQb2rvG8|PHzRf3Z?e5xpC zlN@*H5Hv0pWgB3bnyX2YM-)s_{LDp)!eN&!4p}*kgZdkL9n~O@GO#`$JmI@3&RIwyol|ZDp?kVf7D|{wl8I6;K>g z{Ii&%mm&&Y2rqguqVW09LTTyHyyt=neiTTxqqZGQY@p#t1E0q?Y3J{qO;$z0jBcQHbW_U| zC0N>euiktrlwh|*tD$}ea{Q9m9q8&`s!NO9#kmRv( zl|{tnsaTkDjz@3dUtvuw(3ctR7Iz%-lv*}L4v*N-) zn4B-w9XQe^m{lPMj+Ve{DxBdyN}JRgulUhm8EmS4QZgGxCR+qxWj_1(RK61kB{_?$ z+(wp1hOp?{z&yewuNYJ!o1@%D8yjMc6prr2w(+898pxaQ)&#r~#=!hRblU?E>J!iL z?uT*U6wYmjb0KBDPF&1AqF~qkICQmZHqLc7-UUeS$2xW53}zu*-ijgkMT+Yc5iS=} z&LUsQW`P$7JEf%&(xi}7^9+7X^AY_=V3~reBphiRR1`@}eoQq(jiO z9i?D!(N4&*Pj7Wh(Em#p@HPrI?30;}I|_Soo~5G4(a$-q@$F9UcBd!H>B)3>vRX$o zT1K}v4<$7XCe#na*4>N%!eux7i?6LOy0kjKcWG|dhetI+2j#qApTX~5Lg0>t-?YQO z9~|iXh$vX)9PP^wQ!{y*LGnck1O>Y3UcEieHK-d;tm$&wnm7pN7F_L-OVa5e^@oAC&uy z`jQSm6F>_1&{Nc6Z8=O8$GlCd-&m>^26gc>HkRQVVqWlDKFH1^@Vlb=_Uc+L7~Vdz z($rtAsu@{<9bL<+BU%{Lxq$P$!7TjM&Nl0G;pKIyH2B?={6$%^#OTey#>u| zdKNT7=h3y+$jXA&*el@|^3|R)17R6fK15T+A(PpVubD>&keN@VR$obFp<6YUx>>#X zP_2Ujvx<(PX^vn>PCGGbU! z?Y%hngLwD-IQPBy_WN-#uR$xQ=M^4f+Q6?k*Mz{}SLviU=L4`DFDwhxpqLvBgrQ*B zV!oU&xn0nzIxARPb{4TPWzSR8PsS_lJB!<_IU7!pi}?)yN<;@1a&hZ_3#k-w| z*x}8wk8N)mO}7qjwG1Jl{D@h5)~Tk?z8;-5vIcq!_{i{U3; z3Om8r4Om!%ID+zi6qq}oMqrasdd8pPtHblR9Kyw#w|W0kBHxN@($8|P`ej~Knc*91 z9voiIkamV|;9Swapvq@xmnzE9m1t(!&XjO4e*?gxpK1Fg7t9DdTxjB74^c3N6)0xp z?ZR?fYSyDqDy!O=!aszx+%1u>kS-w0 zVb)Us>pSYZ0sFv{76UcRY9z%>xUdYsftz7c!I0N6p8+^%RkslsgmXc(z|MCHj99ob zZ}G(F4gj#iK5?tQhnhxUs4p~iT%u#yT=-EkjSZaTFG&w`fVo~b^onmxz#ENnrrd(m zkLz2kC;3sl-sU4{Y3!)>nW%Q+Uyv?1qjiN-B(eK`JY3v3BZtket?w2BE60@;T3<*O_?NodlOcU9!EZwo<7i4TAu7N*((4 zdnO9@g}sV@2G~;C=@)CpG*kk!e><-VhPr6J5t%j z^;nJ@z>bsr&31c%EzFzKHqI;A$_tNkavYu=cF%U(XlBbus&zQIX(XY3I1UwEdn2Uc znt$=-4Mmri=OdvnGVqGdqxaCy3W2GjJpKM&z~&FCSQ1K8W+o(#!0J)Aj zD|IWVf3RVcJ!NYJWW~aaeTI3dpJaEWHdvX-IU4_~nP%+ohIW~6#_|OfUujU1f?v(q z*g`E93!}BC%q%|w%T!Uaq#M}`Le+4JPo?Gso{ESy14p)%_*W2CA_;ly1GPc)B%n4$ zS&s^&Ls}l4O2RoaD+7D#d@!dPWjMo6m&nWwUzz`G16M755&*%-yD zi~^y?aE6O1gfRD*R}_}|-gSNlT1}8^=vcw;{iyZ_2EWPz%Z!pF=6q|26`g!PwjBsV z!QUppxgE1mHe?ExW8L4ywhPDx%P4I=E<_`qW87eTmPdpAS%_FbhL;_Z(+KQ1CzVvQ zG0fKBQE~B|ICUtfTY>V7IOn9=2GuQiSNS6sfHe>{T3X2?TKLt7WZL=Fl*I75@mP)K z;5Ohtp6D1)q30L3+3|gn$mPue#V%pigt`+u^>i}FHN}fNl@wNu#}2NY<2xN=JMG>a zB(y3jN2$n4Y{JOukE**FT6s07?CR#CzBL8CD{|RI*tO^&gRoAM{N*gz+W~$T?d$kx zAG?rMm?LE zb%2+)1-kXM`Dm1cueyzB9z;bmFo$hN^~QFVa#jn2%x9HtjMKcZK~^(HmbRss=Kb-F z+W)SyNzI>Znc7Irm5QG^Om(1>R3((YDoVw?h-$4tF($L&WzY(8c^!_%-O}1Y(+CWB zxllyhIw5om&ML%u6dj9>0WaC2J0y&P?UPV8I-EyeUogK3CKoJd^HZQK67aOCfzHq| zaj{X(zN#uy32fq4<&Ft>DY`Jew8p-nye1>g*d$n5b46968JiV1YTYFohO`z|oXi!M4IO&J{xUVJwx9 zZ4Y2!$}>!c7gWlU64fG%+j$pO70L2SV#hu3ix&+@6OhNe<(lzPvqUvO)+6AZNf6?ng-bOzHm@zwyR=CeuVLtn{u^2_x_u>zpDA=9*WGW=1w6iGeEJM&yF;Dg?%= z(o-dm7{0-r$w=EIhY@zn(gD254yNUdZ=*wjLwd;R$(B@xSP6JNIqvZtI^NyjSEX6w zJKDUv6#`FY!_mU82mEH+z1v$yGBKiULn)TQgogf@+S?J8*Fwuh!RrbyuR7kdp97|a6{gv&b&uxo8Z+-8xmUnkq-`&;tpB)YV+71y{znM|>*Yuh{0pyg*-zJqZ z8tYeaWiQ8^d?oh8%P}Wjip>9MRN+hE$A280`=j8a&j#l{7o7K8;8D?Wz@g{-4=yhu z{xuLbC0NVpJfeg{xug+X=;hV7m#hA2h{$&(`dKBESXjO+@F0MMM{s5*m#-bk3@r!C3YO(!LBtdXI+Q7<^@bTT@~&Y?rG007byf;&Ii}LX$I&L{ zh0P&ZbtS;vd=_BpT>)P_EAmxZ8NOC%?2Cd)p_<|le=Zm15Xk~+BsZb)-3T`h zm?>Ar)S@oSm|B1f!^%XscOgfDWppy`Q&ih*3Rn$2HLn&v>tN8Yr z_%@hVPZQc^6WffL3;>09;WWWS$|&aq*MlS?Up1( zZ<(sWyCP!VQiZe0`4R=AmJ!l-h=_$>I|`W;FyXCAI5>p8$Yx$AcMSg~+NP3h%;k`H z#-uVn6_c;VvYcZ%jcT^wi^YBu1_agA+vd3QKKy>8C5 zkq$;h4<$DZB-G!IuD&V!mR{L#^77h(p5@1S7E3~_?CQOJ9sk|ix!@b}zil6=c(P-~ zVP@8yU3-k33yhsSy)lHD&Ikn=?TPt2qF8^&}>2DH>f0I!1>)0Y7{EMi9pNF6L zX-NJHp}8-F9DhC#B0l;oTpW1hxxmBPJjl+J3bSoc_0Rn)${2V>B8jpqCgf#5SE{xm{$*yYY9H@1Y%A)opkOIvRb-iREMG+yQLyR!WiOJr zctRmCw-Ex1lqZ8Fwo%uUz76$8FoS3fGG(p{EDW@L(J}ZnJHHH^0k{HTBcTnDLk)g` zp^kCDK%$Ij9~VnngH4~&ylx1oNer2((;sJQ{0La(zzrR&=` z*LOZW9M^_02F_siAsi~$0><{cGOXNqRtkg@+V66kC>Rypb~nC_FVT@l-F7$5tye_K zuGwVw-6Z#25E_qccHZN}JMM9f$qbg`D3S!8dKcuvyi`c4+czHD+0<-sZKh3{=6z=7 zIA&7pnu4V&N+&{kGD-7bnG;KHNaJKvD1$UDf!VE|>{e2`qgnRh-K}Fe_EB7^9J?pS z<=G`U?FF_H%x&Oza;J;OshxzzP7gtGwnGrk=4QJmvlR#rCtC&+8~QP#L#wX^m0sIY zd}aNK-qpvuSiV5R0-n{olwf_+`L5#M_77PEOyv~~zemrk&pop#@2p?mIltp)gYr%X z=63kyo!)Y+W5c2L4Ts$8545j8;9h&sxq7d2`B#o5Us*r;s`dT<*%t0;TCk&eK~Cd; zcQm}Uz2+b3HUCJf{%dN*pSG6&CAIudDdoRUIQ6^u;#Xr&{u~MpD|jg)@23&@F9aWd zKIq8vL5F`5ocm%h{YUIv=wHgTx^ithT3Oc56j>@a%|B^Z`{*^sYkHT4Z_@eP>$o}*35NpMz0mddv< zqJ!*c>B&d)W}#z4&B2T?B^+iOCdJRpSZle1NCx}jVpF(9*|RD-1UD62`D`u-TC*8V zA{g8mkixC%#}QLYZxc`(hZ(eTjnkzpuox4BLhIk(hGzvN;c?Yx;$w$mWmD87l2v*L zoWiI0U07J)QA!);r3ZmQG^((IWTlf)%hwbb$*;e0Et;^(t6wE@kadVut-O9O4*a%DDhugGUB@G#+h)<&970_pVl1q9zFdS0 z!-7yCJj-}Gd}bsu4M(VDNLG0zAnY`ilayV#CJ2Q8Kll~x(vCz34D*VAk;*`r!VEJr zb|QruNCsQAs+lOQbu8URJ=I8N>(GwYk?r=e9S)9XhjT334T{IXDX`t+p4jc4L_Zri z177bA(2X7K0L8+4mW^D}SZecd5=M00t;m`iVdXdcPhHtaA~?Ti*|7^BF$H>m`}^OB zd>8H|e?$x6>1BuMT#T)5WZ)~gl zOKQbmQp*3BSo(T=$*VC%zlu8Xi|B%%N9Mm6dXy1ZFN7WaY3Pxkh8<<{hKjE$`j?gW zFR5gHERioM;DM!8WR3~3EgB5< zB~b9V5!j#`Ap2${Vl{IuMB`!^sx>y3>Mg&Ih|N9%L0cRxMpkoyP^qvQIP(f2w&{fR zkvPJeDKygtp$6fm{Ac;Ie4aHWqSU*Q)lqp_iEs1}>rsAW^>;j_qi5uB=^ z5iAo3t4bMyCPr4|Ytlo8OmV2_M1Y-PVG_H*+?=-A*ml6E+N!vA1-}WW@4~-a6Bj2) zKLc2$hIQR8j3*kJPHex=MUs0q(UfdK>kupAS=4OAGi+-#Gtn;m%Xmou3vwl!fvxZh z-pyO&j1sYpGkqTAzuxQok(^}B%6WHKv->nR9M-@sew!r zZw_YIhO$})GFk^RTL-i4gWJ*43Wt4Bu$-$sZ49D5C6_l9UjC$@Yen99Bs5cG-`{(7(Klxn;a?qSrv+){ zk<-ZLO}Xa+j$a5l(G_~4E4-jPval=q#Kp+M3*q@^gN}CwAMXsz>kQ28^gq(Enf;*$ zoof#{)*i5-r9b?_`q7syAAixZ_*3hJZ<*z9rdPa?R{qE2 zlGoyje;a%9*F?n8`9F)uVP^=v8LWj3j>u`)L*G>!Hn9_w$KLUe|gFyOV~j!uod|d z4x65i1AeUsZaEC!1A|VZav8>0H zL^cT~d@T?P$tsjK?5vyRV;k7|@$OY8u=yBbpstVGi_0QL|i(zGON-|d$lvfc2 z$HUZZ#=HWs9rvR-Z6NyFc!OUfp=SYaJZS9@Y(=#|Rp&v1Td+-ZeUWpI5}) z!YmHhOq`2U5eK(wI+kHpSjS>#OfBF!9q*cwgjUTJh8X0_Y*=Y&oGYv?YMv3&Civwk zRnV+7(yE0-H&zunraQ@YGQS9E$}`3pDalEKHx0s*WR!$iH;Q^37FIZngm#W*lMZ%_X4^-zTShXK3m!~q7>KL66IlU09l&{ z34t{_mQ@Pov* zZ$URUl+>~WGdBk1!$hoU zf?x2f#IdhQ5UC7`fvVOk=t8+9iZ_(-1)&-^sV;tFXR#**z{>cVVE+OEZ<1}2C1q?F zOl7M=>)6)T(QPe5>COF_js59Ow=$Y;ZRa%K+-~j9vJLI95AU=O?{Im*F9~0o_jkF+ zcVR(GKTqy-8sy?pJ8`!}(>oM0k7e0MGHk=C*1?pffy6o}_!EeuuLJ^}BVs*zQdkMO$^BTGc=SzYU)|ChGk)!-MmN<>UM(!?6t8E~W< z#YT)7}QZ{Iu{t5Lkp7dYv$(|=0*2PLTf9uS_m~; zm`4L-A3Wh!InpR+)0(91gi0SH!UISd^H~MdY9*GV1&XaY!PbdD3tNLl!~*prb{3%r zwcvDVYNDnVn>r9pE#^o_`)n?>G#0ebC-P;ilkj_o9rr@3UNM9Vy0sZZ%&X7p8w_R% zt_>aY)E7+~&J})DC8FUourT1|Yo`&_sBwn166!{vqG4gaU*9=F=R2)EQLa0LnH;tJ zxCkmuiG_+M@v&C^!<%( zwGM4-y1lLOdPd##^xD3(+P?JqtJ|AzWm^VvT86S)M{=BFVAEJwlc0DP{^#{f8yFNxq?4)0F8C)+-f)iRuB834aY4gGPoH=`?W1eadfQgmrue$Vow3~xX8 z;Q{7vbn>|LaL3x*Gk(V}1QlEeFYJyv*&TbTC!wq_xx6>ItT&;oJHDhR;bc!tQCHl_ z?wG=hv4!WOPIQKI3QmXRoes|J*mA_>cf_^vuw(7P*46u4SMRm0+1s-6YwPkatxLXW ze*g2P_x{(ga986yIrVR4RKK~c?2T=uZ)_`J$M+u+i~o>R{KurCKP49aA@Ky+Ub00? zDc-0UBnqZrV?|Z}vg#pdm$VW6gKN#$x)tzmjVZx0(_&ZEp`v{~N1m1SW2@*q(t(1( ztco`%zQVuS%=%`4+~i?%8I8aKFPUF8{7OaB!XV|W8`zEqYvngU=6+s; zpt;Q(X!F9$AuZ!UEnEO(*qJ&mv2dtT!>lD${43rRe&tIW-3u^P7UH90u62B@4NlE$ zOu);cA4XE}dYHMvRE+TDa6PZ+d&IwbstXvIZ-at$m{!53pkT$qijny>;I{&Rt80%} zTr-i*N$!afkYyZ2Y8u`&j2z{jiGiI}T=A&H0z?}}3ylpP6mkJwxV_U`} z8@*xmBO!Ie5w*k7^@B-`x6^B`rB?N%m0wJ&xUj9_e0uezjQXotO*eK}ku9Oqt#qz?q2K75^qd<6@h41gj#fq-F9$I!a;AHQH zf}S3C}+rbo_KcUYmbz`{pBU8xA>O;mrqKoA=w-?{%)) zYhU_}?c=X3%f4t{w5R#q9ZmnuuKoA+s()ovyp>t@X4ptKdq_zW`bFljvs+&ly@p=O99wIxB|f)Q+2-3mTyV z1v9YStoj{8Id7nZqsa@L=>o>WLNjlMi>bw87Dv-0E80Jy;RvXjE?{lHQZ5)$hI|Q! z)y}{=LYAip$YN*kYv@=I2GN{xnhiy`Ox^kZ8fcR{4zxhBV0qNf;t8;D;R!}RH+#7b zu#5-rB6KWj2FqjI7G&|5`?(XEmd(WpZ5;|PWb@BhwGzisG z?h*eA+6KkuQ+L?7rw{VjI)P9J*DTtLv`=wD9a9nZDcBrr@*@!LxD)2Q11inHx9Ldd z9eidcS7_%K;APtvIVR{BfWu{v@Cyag;Df-XHGsGnX-$6+v@7pR)lhDtPSr|bBSWAR zTwz$ncH9HMkZ*Fw{S>4!aW3R5kqn&g8=vao*0%e}ur26rhnj)#Y_e$mUXq(b&S-`M z#uLFWN*J7iR@W56oH3}WoFst@ew9B`3TZ~0xLdXNGqzffDk;)1q3*c&*FCut7t4hmtwQLXF7IwUY8Og-bQj14zjp9D zmen$nW*JUyR3bR0`g(Zz<)GrejRigHa=Si0dS)rZpBbBT`1E?RMFnSrPh1Qy>WV4r zN+`dywW2SrvTs{eZ)#<4YDG^{MOR|kC4ih~PEPfIb86ns ztoe6l_1jtH|H?e|&-7FO$S7u88IkYO%3Dw{Kt?tb`2u8>Z4mjI`5Wp&Qo{oNvzh$N z*c_vrSJN;k{L%tU¬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ⅇ3i%MZ(U;W6hOM!Td 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 z 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 H){6fN&|QfB diff --git a/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/motivation.565 b/STM32F1/libraries/ILI9341_due_STM/examples/sdFatTftBitmap/images/motivation.565 deleted file mode 100644 index 21cbc4f613553c7dcc649b827dfc20d99e4002a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153654 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