Sergey
5 years ago
9 changed files with 1587 additions and 351 deletions
File diff suppressed because it is too large
@ -0,0 +1,787 @@ |
|||||
|
/**
|
||||
|
* Marlin 3D Printer Firmware |
||||
|
* Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
|
* |
||||
|
* Based on Sprinter and grbl. |
||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm |
||||
|
* |
||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
/*
|
||||
|
|
||||
|
u8g_dev_tft_480x320_upscale_from_128x64.cpp |
||||
|
|
||||
|
Universal 8bit Graphics Library |
||||
|
|
||||
|
Copyright (c) 2011, olikraus@gmail.com |
||||
|
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. |
||||
|
|
||||
|
*/ |
||||
|
|
||||
|
/*
|
||||
|
modified by alpine to 3x upscale for 3.5 TFT of the TwoTrees Sapphire Pro |
||||
|
|
||||
|
ToDo: |
||||
|
|
||||
|
* DONE - linear upscale algorithm to safe cpu |
||||
|
* DONE - touchUI in general |
||||
|
* DONE - check touch control to match hotzones to desired design |
||||
|
(not quite exact but reasonable close) |
||||
|
* color selection / temperature indicator |
||||
|
(see old MKS version) |
||||
|
* G-Code control ("on/off"/"brightness"/color profiles) |
||||
|
* nyan cat |
||||
|
|
||||
|
longterm: |
||||
|
* DONE make selectable upscale options (in own classes) |
||||
|
* still missing non-DMA mode |
||||
|
* DONE configurable through main/board config |
||||
|
* submit to marlin |
||||
|
|
||||
|
*/ |
||||
|
|
||||
|
#include "../../inc/MarlinConfig.h" |
||||
|
|
||||
|
#if HAS_GRAPHICAL_LCD && PIN_EXISTS(FSMC_CS) |
||||
|
|
||||
|
#include "HAL_LCD_com_defines.h" |
||||
|
#include "ultralcd_DOGM.h" |
||||
|
|
||||
|
#include <string.h> |
||||
|
|
||||
|
#if ENABLED(LCD_USE_DMA_FSMC) |
||||
|
extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); |
||||
|
extern void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length); |
||||
|
extern void LCD_IO_WaitSequence_Async(); |
||||
|
extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); |
||||
|
#endif |
||||
|
|
||||
|
/*
|
||||
|
desired screen arrangement: |
||||
|
|
||||
|
(0/0) <-- 480 px --> |
||||
|
\/_________________________ |
||||
|
|_| top offset: y 32 px |_| |
||||
|
|_|______________________|_| /\ |
||||
|
| | Marlin display |_| | |
||||
|
| | 384*192 px |_| | |
||||
|
|_|______________________|_| 320 px |
||||
|
|_| middle spacing 16 px |_| | |
||||
|
|_|______________________|_| | |
||||
|
|| touch UI: 384*64 px || \/ |
||||
|
|| UIelement Y 2+60+2 px || |
||||
|
||________________________|| |
||||
|
|_| bottom offset y 16 px|_| |
||||
|
|_|______________________|_|<- (479/319) |
||||
|
^- left offset: ^- right offset: |
||||
|
48 px 48 px |
||||
|
*/ |
||||
|
|
||||
|
#define WIDTH LCD_PIXEL_WIDTH |
||||
|
#define HEIGHT LCD_PIXEL_HEIGHT |
||||
|
#define PAGE_HEIGHT 8 |
||||
|
|
||||
|
#define X_LO LCD_PIXEL_OFFSET_X |
||||
|
#define Y_LO LCD_PIXEL_OFFSET_Y |
||||
|
// 3x upscale
|
||||
|
#define X_HI (X_LO + 3 * WIDTH - 1) |
||||
|
#define Y_HI (Y_LO + 3 * HEIGHT - 1) |
||||
|
|
||||
|
#define LCD_COLUMN 0x2A /* Colomn address register */ |
||||
|
#define LCD_ROW 0x2B /* Row address register */ |
||||
|
#define LCD_WRITE_RAM 0x2C |
||||
|
|
||||
|
/*
|
||||
|
Touch UI |
||||
|
||----------------------------|| |
||||
|
|| middle spacing 384*16px || |
||||
|
||----------------------------||/___ y = 242 px |
||||
|
|| ELX | | ELA || ELB | | ELC ||\ |
||||
|
x ||^24 ^136 ^248 ^360 ||/___ y = 301 px |
||||
|
||----------------------------||\ |
||||
|
24 px + 96*4 px + 16*3 px + 24 px |
||||
|
*/ |
||||
|
|
||||
|
#define BUTTON_SIZE_X 32 |
||||
|
#define BUTTON_SIZE_Y 20 |
||||
|
|
||||
|
#define BUTTOND_X_LO 24 |
||||
|
#define BUTTOND_X_HI (BUTTOND_X_LO + 3 * BUTTON_SIZE_X -1) |
||||
|
|
||||
|
#define BUTTONA_X_LO 136 |
||||
|
#define BUTTONA_X_HI (BUTTONA_X_LO + 3 * BUTTON_SIZE_X -1) |
||||
|
|
||||
|
#define BUTTONB_X_LO 248 |
||||
|
#define BUTTONB_X_HI (BUTTONB_X_LO + 3 * BUTTON_SIZE_X -1) |
||||
|
|
||||
|
#define BUTTONC_X_LO 360 |
||||
|
#define BUTTONC_X_HI (BUTTONC_X_LO + 3 * BUTTON_SIZE_X -1) |
||||
|
|
||||
|
#define BUTTON_Y_LO 242 |
||||
|
#define BUTTON_Y_HI (BUTTON_Y_LO + 3 * BUTTON_SIZE_Y -1) |
||||
|
|
||||
|
|
||||
|
|
||||
|
// see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html
|
||||
|
|
||||
|
#define COLOR_BLACK 0x0000 // #000000
|
||||
|
#define COLOR_WHITE 0xFFFF // #FFFFFF
|
||||
|
#define COLOR_SILVER 0xC618 // #C0C0C0
|
||||
|
#define COLOR_GREY 0x7BEF // #808080
|
||||
|
#define COLOR_DARKGREY 0x4208 // #404040
|
||||
|
#define COLOR_DARKGREY2 0x39E7 // #303030
|
||||
|
#define COLOR_DARK 0x0003 // Some dark color
|
||||
|
|
||||
|
#define COLOR_RED 0xF800 // #FF0000
|
||||
|
#define COLOR_LIME 0x7E00 // #00FF00
|
||||
|
#define COLOR_BLUE 0x001F // #0000FF
|
||||
|
#define COLOR_YELLOW 0xFFE0 // #FFFF00
|
||||
|
#define COLOR_MAGENTA 0xF81F // #FF00FF
|
||||
|
#define COLOR_FUCHSIA 0xF81F // #FF00FF
|
||||
|
#define COLOR_CYAN 0x07FF // #00FFFF
|
||||
|
#define COLOR_AQUA 0x07FF // #00FFFF
|
||||
|
|
||||
|
#define COLOR_MAROON 0x7800 // #800000
|
||||
|
#define COLOR_GREEN 0x27E0 // #008000
|
||||
|
#define COLOR_NAVY 0x000F // #000080
|
||||
|
#define COLOR_OLIVE 0x8400 // #808000
|
||||
|
#define COLOR_PURPLE 0x8010 // #800080
|
||||
|
#define COLOR_TEAL 0x0410 // #008080
|
||||
|
|
||||
|
#define COLOR_ORANGE 0xFC00 // #FF7F00
|
||||
|
|
||||
|
#ifndef TFT_MARLINUI_COLOR |
||||
|
#define TFT_MARLINUI_COLOR COLOR_WHITE |
||||
|
#endif |
||||
|
#ifndef TFT_MARLINBG_COLOR |
||||
|
#define TFT_MARLINBG_COLOR COLOR_NAVY |
||||
|
#endif |
||||
|
#ifndef TFT_DISABLED_COLOR |
||||
|
#define TFT_DISABLED_COLOR COLOR_DARK |
||||
|
#endif |
||||
|
#ifndef TFT_BTCANCEL_COLOR |
||||
|
#define TFT_BTCANCEL_COLOR COLOR_WHITE |
||||
|
#endif |
||||
|
#ifndef TFT_BTARROWS_COLOR |
||||
|
#define TFT_BTARROWS_COLOR COLOR_WHITE |
||||
|
#endif |
||||
|
#ifndef TFT_BTOKMENU_COLOR |
||||
|
#define TFT_BTOKMENU_COLOR COLOR_WHITE |
||||
|
#endif |
||||
|
|
||||
|
#ifndef TFT_PRESET_UI_0 |
||||
|
#define TFT_PRESET_UI_0 COLOR_WHITE |
||||
|
#endif |
||||
|
#ifndef TFT_PRESET_BG_0 |
||||
|
#define TFT_PRESET_BG_0 COLOR_BLACK |
||||
|
#endif |
||||
|
#ifndef TFT_PRESET_UI_1 |
||||
|
#define TFT_PRESET_UI_1 COLOR_WHITE |
||||
|
#endif |
||||
|
#ifndef TFT_PRESET_BG_1 |
||||
|
#define TFT_PRESET_BG_1 COLOR_NAVY |
||||
|
#endif |
||||
|
#ifndef TFT_PRESET_UI_2 |
||||
|
#define TFT_PRESET_UI_2 COLOR_BLACK |
||||
|
#endif |
||||
|
#ifndef TFT_PRESET_BG_2 |
||||
|
#define TFT_PRESET_BG_2 COLOR_WHITE |
||||
|
#endif |
||||
|
#ifndef TFT_PRESET_UI_3 |
||||
|
#define TFT_PRESET_UI_3 COLOR_DARK |
||||
|
#endif |
||||
|
#ifndef TFT_PRESET_BG_3 |
||||
|
#define TFT_PRESET_BG_3 COLOR_OLIVE |
||||
|
#endif |
||||
|
#ifndef TFT_PRESET_UI_4 |
||||
|
#define TFT_PRESET_UI_4 COLOR_SILVER |
||||
|
#endif |
||||
|
#ifndef TFT_PRESET_BG_4 |
||||
|
#define TFT_PRESET_BG_4 COLOR_DARKGREY |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
|
||||
|
static uint32_t lcd_id = 0; |
||||
|
uint16_t ui_color1 = TFT_BTCANCEL_COLOR; |
||||
|
uint16_t ui_color2 = TFT_BTARROWS_COLOR; |
||||
|
uint16_t ui_color3 = TFT_BTARROWS_COLOR ; |
||||
|
uint16_t ui_color4 = TFT_BTOKMENU_COLOR; |
||||
|
uint16_t bg_color = TFT_MARLINBG_COLOR; |
||||
|
uint16_t ui_color = TFT_MARLINUI_COLOR; |
||||
|
static bool reqDrawButtons = false; |
||||
|
static bool reqClearScreen = false; |
||||
|
|
||||
|
#define U8G_ESC_DATA(x) (uint8_t)(x >> 8), (uint8_t)(x & 0xFF) |
||||
|
|
||||
|
static const uint8_t page_first_sequence[] = { |
||||
|
U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(X_LO), U8G_ESC_DATA(X_HI), |
||||
|
U8G_ESC_ADR(0), LCD_ROW, U8G_ESC_ADR(1), U8G_ESC_DATA(Y_LO), U8G_ESC_DATA(Y_HI), |
||||
|
U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), |
||||
|
U8G_ESC_END |
||||
|
}; |
||||
|
|
||||
|
static const uint8_t clear_screen_sequence[] = { |
||||
|
U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), 0x00, 0x00, U8G_ESC_DATA(LCD_FULL_PIXEL_WIDTH), |
||||
|
U8G_ESC_ADR(0), LCD_ROW, U8G_ESC_ADR(1), 0x00, 0x00, U8G_ESC_DATA(LCD_FULL_PIXEL_HEIGHT), |
||||
|
U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), |
||||
|
U8G_ESC_END |
||||
|
}; |
||||
|
|
||||
|
//@ ToDo
|
||||
|
// check positions for new offsets
|
||||
|
// --> done. see marlin/src/feature/touch/xpt2046.cpp
|
||||
|
|
||||
|
#if ENABLED(TOUCH_BUTTONS) |
||||
|
|
||||
|
static const uint8_t separation_line_sequence_left[] = { |
||||
|
U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(10), U8G_ESC_DATA(159), |
||||
|
U8G_ESC_ADR(0), LCD_ROW, U8G_ESC_ADR(1), U8G_ESC_DATA(170), U8G_ESC_DATA(173), |
||||
|
U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), |
||||
|
U8G_ESC_END |
||||
|
}; |
||||
|
|
||||
|
static const uint8_t separation_line_sequence_right[] = { |
||||
|
U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(160), U8G_ESC_DATA(309), |
||||
|
U8G_ESC_ADR(0), LCD_ROW, U8G_ESC_ADR(1), U8G_ESC_DATA(170), U8G_ESC_DATA(173), |
||||
|
U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), |
||||
|
U8G_ESC_END |
||||
|
}; |
||||
|
|
||||
|
static const uint8_t buttonD_sequence[] = { |
||||
|
U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(BUTTOND_X_LO), U8G_ESC_DATA(BUTTOND_X_HI), |
||||
|
U8G_ESC_ADR(0), LCD_ROW, U8G_ESC_ADR(1), U8G_ESC_DATA(BUTTON_Y_LO), U8G_ESC_DATA(BUTTON_Y_HI), |
||||
|
U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), |
||||
|
U8G_ESC_END |
||||
|
}; |
||||
|
|
||||
|
static const uint8_t buttonA_sequence[] = { |
||||
|
U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(BUTTONA_X_LO), U8G_ESC_DATA(BUTTONA_X_HI), |
||||
|
U8G_ESC_ADR(0), LCD_ROW, U8G_ESC_ADR(1), U8G_ESC_DATA(BUTTON_Y_LO), U8G_ESC_DATA(BUTTON_Y_HI), |
||||
|
U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), |
||||
|
U8G_ESC_END |
||||
|
}; |
||||
|
|
||||
|
static const uint8_t buttonB_sequence[] = { |
||||
|
U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(BUTTONB_X_LO), U8G_ESC_DATA(BUTTONB_X_HI), |
||||
|
U8G_ESC_ADR(0), LCD_ROW, U8G_ESC_ADR(1), U8G_ESC_DATA(BUTTON_Y_LO), U8G_ESC_DATA(BUTTON_Y_HI), |
||||
|
U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), |
||||
|
U8G_ESC_END |
||||
|
}; |
||||
|
|
||||
|
static const uint8_t buttonC_sequence[] = { |
||||
|
U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(BUTTONC_X_LO), U8G_ESC_DATA(BUTTONC_X_HI), |
||||
|
U8G_ESC_ADR(0), LCD_ROW, U8G_ESC_ADR(1), U8G_ESC_DATA(BUTTON_Y_LO), U8G_ESC_DATA(BUTTON_Y_HI), |
||||
|
U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), |
||||
|
U8G_ESC_END |
||||
|
}; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
static const uint8_t st7789v_init_sequence[] = { // 0x8552 - ST7789V
|
||||
|
U8G_ESC_ADR(0), |
||||
|
0x10, |
||||
|
U8G_ESC_DLY(10), |
||||
|
0x01, |
||||
|
U8G_ESC_DLY(100), U8G_ESC_DLY(100), |
||||
|
0x11, |
||||
|
U8G_ESC_DLY(120), |
||||
|
0x36, U8G_ESC_ADR(1), 0xA0, |
||||
|
U8G_ESC_ADR(0), 0x3A, U8G_ESC_ADR(1), 0x05, |
||||
|
U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), 0x00, 0x00, 0x01, 0x3F, |
||||
|
U8G_ESC_ADR(0), LCD_ROW, U8G_ESC_ADR(1), 0x00, 0x00, 0x00, 0xEF, |
||||
|
U8G_ESC_ADR(0), 0xB2, U8G_ESC_ADR(1), 0x0C, 0x0C, 0x00, 0x33, 0x33, |
||||
|
U8G_ESC_ADR(0), 0xB7, U8G_ESC_ADR(1), 0x35, |
||||
|
U8G_ESC_ADR(0), 0xBB, U8G_ESC_ADR(1), 0x1F, |
||||
|
U8G_ESC_ADR(0), 0xC0, U8G_ESC_ADR(1), 0x2C, |
||||
|
U8G_ESC_ADR(0), 0xC2, U8G_ESC_ADR(1), 0x01, 0xC3, |
||||
|
U8G_ESC_ADR(0), 0xC4, U8G_ESC_ADR(1), 0x20, |
||||
|
U8G_ESC_ADR(0), 0xC6, U8G_ESC_ADR(1), 0x0F, |
||||
|
U8G_ESC_ADR(0), 0xD0, U8G_ESC_ADR(1), 0xA4, 0xA1, |
||||
|
U8G_ESC_ADR(0), 0xE0, U8G_ESC_ADR(1), 0xD0, 0x08, 0x11, 0x08, 0x0C, 0x15, 0x39, 0x33, 0x50, 0x36, 0x13, 0x14, 0x29, 0x2D, |
||||
|
U8G_ESC_ADR(0), 0xE1, U8G_ESC_ADR(1), 0xD0, 0x08, 0x10, 0x08, 0x06, 0x06, 0x39, 0x44, 0x51, 0x0B, 0x16, 0x14, 0x2F, 0x31, |
||||
|
U8G_ESC_ADR(0), 0x29, 0x11, 0x35, U8G_ESC_ADR(1), 0x00, |
||||
|
U8G_ESC_END |
||||
|
}; |
||||
|
|
||||
|
static const uint8_t ili9341_init_sequence[] = { // 0x9341 - ILI9341
|
||||
|
U8G_ESC_ADR(0), |
||||
|
0x10, |
||||
|
U8G_ESC_DLY(10), |
||||
|
0x01, |
||||
|
U8G_ESC_DLY(100), U8G_ESC_DLY(100), |
||||
|
0x36, U8G_ESC_ADR(1), 0xE8, |
||||
|
U8G_ESC_ADR(0), 0x3A, U8G_ESC_ADR(1), 0x55, |
||||
|
U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), 0x00, 0x00, 0x01, 0x3F, |
||||
|
U8G_ESC_ADR(0), LCD_ROW, U8G_ESC_ADR(1), 0x00, 0x00, 0x00, 0xEF, |
||||
|
U8G_ESC_ADR(0), 0xC5, U8G_ESC_ADR(1), 0x3E, 0x28, |
||||
|
U8G_ESC_ADR(0), 0xC7, U8G_ESC_ADR(1), 0x86, |
||||
|
U8G_ESC_ADR(0), 0xB1, U8G_ESC_ADR(1), 0x00, 0x18, |
||||
|
U8G_ESC_ADR(0), 0xC0, U8G_ESC_ADR(1), 0x23, |
||||
|
U8G_ESC_ADR(0), 0xC1, U8G_ESC_ADR(1), 0x10, |
||||
|
U8G_ESC_ADR(0), 0x29, |
||||
|
U8G_ESC_ADR(0), 0x11, |
||||
|
U8G_ESC_DLY(100), |
||||
|
U8G_ESC_END |
||||
|
}; |
||||
|
|
||||
|
#if ENABLED(TOUCH_BUTTONS) |
||||
|
|
||||
|
static const uint8_t buttonD[] = { |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00011000,B00110000,B00000001, |
||||
|
B10000000,B00001100,B01100000,B00000001, |
||||
|
B10000000,B00000110,B11000000,B00000001, |
||||
|
B10000000,B00000011,B10000000,B00000001, |
||||
|
B10000000,B00000011,B10000000,B00000001, |
||||
|
B10000000,B00000110,B11000000,B00000001, |
||||
|
B10000000,B00001100,B01100000,B00000001, |
||||
|
B10000000,B00011000,B00110000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
}; |
||||
|
|
||||
|
#if ENABLED(REVERSE_MENU_DIRECTION) |
||||
|
|
||||
|
static const uint8_t buttonA[] = { |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B11100000,B00000000,B00000001, |
||||
|
B10000000,B11100000,B00000000,B00000001, |
||||
|
B10000000,B11100000,B00000000,B00000001, |
||||
|
B10000000,B11100000,B00000000,B00000001, |
||||
|
B10000000,B11100000,B00111111,B11100001, |
||||
|
B10000111,B11111100,B00111111,B11100001, |
||||
|
B10000011,B11111000,B00000000,B00000001, |
||||
|
B10000001,B11110000,B00000000,B00000001, |
||||
|
B10000000,B11100000,B00000000,B00000001, |
||||
|
B10000000,B01000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
}; |
||||
|
static const uint8_t buttonB[] = { |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B01100000,B00000010,B00000001, |
||||
|
B10000000,B01100000,B00000111,B00000001, |
||||
|
B10000000,B01100000,B00001111,B10000001, |
||||
|
B10000000,B01100000,B00011111,B11000001, |
||||
|
B10000111,B11111110,B00111111,B11100001, |
||||
|
B10000111,B11111110,B00000111,B00000001, |
||||
|
B10000000,B01100000,B00000111,B00000001, |
||||
|
B10000000,B01100000,B00000111,B00000001, |
||||
|
B10000000,B01100000,B00000111,B00000001, |
||||
|
B10000000,B01100000,B00000111,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
}; |
||||
|
|
||||
|
#else |
||||
|
|
||||
|
static const uint8_t buttonA[] = { |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B01000000,B00000000,B00000001, |
||||
|
B10000000,B11100000,B00000000,B00000001, |
||||
|
B10000001,B11110000,B00000000,B00000001, |
||||
|
B10000011,B11111000,B00000000,B00000001, |
||||
|
B10000111,B11111100,B00111111,B11100001, |
||||
|
B10000000,B11100000,B00111111,B11100001, |
||||
|
B10000000,B11100000,B00000000,B00000001, |
||||
|
B10000000,B11100000,B00000000,B00000001, |
||||
|
B10000000,B11100000,B00000000,B00000001, |
||||
|
B10000000,B11100000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
}; |
||||
|
|
||||
|
static const uint8_t buttonB[] = { |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B01100000,B00000111,B00000001, |
||||
|
B10000000,B01100000,B00000111,B00000001, |
||||
|
B10000000,B01100000,B00000111,B00000001, |
||||
|
B10000000,B01100000,B00000111,B00000001, |
||||
|
B10000111,B11111110,B00000111,B00000001, |
||||
|
B10000111,B11111110,B00111111,B11100001, |
||||
|
B10000000,B01100000,B00011111,B11000001, |
||||
|
B10000000,B01100000,B00001111,B10000001, |
||||
|
B10000000,B01100000,B00000111,B00000001, |
||||
|
B10000000,B01100000,B00000010,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
}; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
static const uint8_t buttonC[] = { |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00011100,B00000001, |
||||
|
B10000000,B00000100,B00011100,B00000001, |
||||
|
B10000000,B00001100,B00011100,B00000001, |
||||
|
B10000000,B00011111,B11111100,B00000001, |
||||
|
B10000000,B00111111,B11111100,B00000001, |
||||
|
B10000000,B00011111,B11111100,B00000001, |
||||
|
B10000000,B00001100,B00000000,B00000001, |
||||
|
B10000000,B00000100,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B10000000,B00000000,B00000000,B00000001, |
||||
|
B01111111,B11111111,B11111111,B11111110, |
||||
|
}; |
||||
|
|
||||
|
//@ ToDo
|
||||
|
// *check for button sizes and how to upscale to fit on screen
|
||||
|
// *check if other parts of marlin use drawImage
|
||||
|
|
||||
|
static void switchColor(uint16_t uiColor, uint16_t bgColor) { |
||||
|
ui_color = uiColor; |
||||
|
bg_color = bgColor; |
||||
|
} |
||||
|
|
||||
|
static void clearScreen() { |
||||
|
reqClearScreen = true; |
||||
|
} |
||||
|
|
||||
|
static void drawButtons() { |
||||
|
reqDrawButtons = true; |
||||
|
} |
||||
|
|
||||
|
void switchColorPreset(uint8_t colorPreset) { |
||||
|
switch (colorPreset) |
||||
|
{ |
||||
|
case 1: switchColor(TFT_PRESET_UI_1, TFT_PRESET_BG_1); break; |
||||
|
case 2: switchColor(TFT_PRESET_UI_2, TFT_PRESET_BG_2); break; |
||||
|
case 3: switchColor(TFT_PRESET_UI_3, TFT_PRESET_BG_3); break; |
||||
|
case 4: switchColor(TFT_PRESET_UI_4, TFT_PRESET_BG_4); break; |
||||
|
default: switchColor(TFT_PRESET_UI_0, TFT_PRESET_BG_0); break; |
||||
|
} |
||||
|
drawButtons(); |
||||
|
clearScreen(); |
||||
|
} |
||||
|
|
||||
|
static void drawImage(const uint8_t *data, u8g_t *u8g, u8g_dev_t *dev, uint16_t length, uint16_t height, uint16_t color) { |
||||
|
static uint16_t p_buffer[288]; |
||||
|
uint16_t* buffer = &p_buffer[0]; |
||||
|
|
||||
|
for (uint16_t i = 0; i < height; i++) { |
||||
|
uint32_t k = 0; |
||||
|
for (uint16_t j = 0; j < length; j++) { |
||||
|
uint16_t v = bg_color; |
||||
|
if (*(data + (i * (length >> 3) + (j >> 3))) & (0x80 >> (j & 7))) |
||||
|
v = color; |
||||
|
else |
||||
|
v = bg_color; |
||||
|
|
||||
|
// linear write should be faster
|
||||
|
// optimize later
|
||||
|
//
|
||||
|
// buffer[k+96] = v;
|
||||
|
// buffer[k+192] = v;
|
||||
|
// buffer[k++] = v;
|
||||
|
// buffer[k+96] = v;
|
||||
|
// buffer[k+192] = v;
|
||||
|
// buffer[k++] = v;
|
||||
|
// buffer[k+96] = v;
|
||||
|
// buffer[k+192] = v;
|
||||
|
// buffer[k++] = v;
|
||||
|
|
||||
|
// upscale X 3x
|
||||
|
buffer[k++] = v; |
||||
|
buffer[k++] = v; |
||||
|
buffer[k++] = v; |
||||
|
} |
||||
|
#ifdef LCD_USE_DMA_FSMC |
||||
|
// if (k <= 80) { // generally is... for our buttons
|
||||
|
// memcpy(&buffer[k], &buffer[0], k * sizeof(uint16_t));
|
||||
|
|
||||
|
// LCD_IO_WriteSequence(buffer, k * sizeof(uint16_t));
|
||||
|
// }
|
||||
|
// else {
|
||||
|
// LCD_IO_WriteSequence(buffer, k);
|
||||
|
|
||||
|
// LCD_IO_WriteSequence(buffer, k);
|
||||
|
// }
|
||||
|
|
||||
|
// Upscale Y 3x
|
||||
|
// linear write should be faster for big arrays
|
||||
|
//
|
||||
|
for (uint16_t l = 0; l < 96; l++) |
||||
|
{ |
||||
|
buffer[l+96] = buffer[l]; |
||||
|
} |
||||
|
for (uint16_t l = 0; l < 96; l++) |
||||
|
{ |
||||
|
buffer[l+192] = buffer[l]; |
||||
|
} |
||||
|
|
||||
|
LCD_IO_WriteSequence(p_buffer, 288); |
||||
|
#else |
||||
|
u8g_WriteSequence(u8g, dev, k << 1, (uint8_t *)buffer); |
||||
|
u8g_WriteSequence(u8g, dev, k << 1, (uint8_t *)buffer); |
||||
|
#endif |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif // TOUCH_BUTTONS
|
||||
|
|
||||
|
// Used to fill RGB565 (16bits) background
|
||||
|
inline void memset2(const void *ptr, uint16_t fill, size_t cnt) { |
||||
|
uint16_t* wptr = (uint16_t*)ptr; |
||||
|
for (size_t i = 0; i < cnt; i += 2) { *wptr = fill; wptr++; } |
||||
|
} |
||||
|
|
||||
|
static void clearScreenSequence(u8g_t *u8g, u8g_dev_t *dev) { |
||||
|
u8g_WriteEscSeqP(u8g, dev, clear_screen_sequence); |
||||
|
#ifdef LCD_USE_DMA_FSMC |
||||
|
LCD_IO_WriteMultiple(bg_color, (480*320)); |
||||
|
#endif |
||||
|
} |
||||
|
|
||||
|
static void drawButtonSequence(u8g_t *u8g, u8g_dev_t *dev) { |
||||
|
#if ENABLED(TOUCH_BUTTONS) |
||||
|
u8g_WriteEscSeqP(u8g, dev, buttonD_sequence); |
||||
|
drawImage(buttonD, u8g, dev, 32, 20, ui_color1); |
||||
|
|
||||
|
u8g_WriteEscSeqP(u8g, dev, buttonA_sequence); |
||||
|
drawImage(buttonA, u8g, dev, 32, 20, ui_color2); |
||||
|
|
||||
|
u8g_WriteEscSeqP(u8g, dev, buttonB_sequence); |
||||
|
drawImage(buttonB, u8g, dev, 32, 20, ui_color3); |
||||
|
|
||||
|
u8g_WriteEscSeqP(u8g, dev, buttonC_sequence); |
||||
|
drawImage(buttonC, u8g, dev, 32, 20, ui_color4); |
||||
|
#endif // TOUCH_BUTTONS
|
||||
|
} |
||||
|
|
||||
|
static bool preinit = true; |
||||
|
static uint8_t page; |
||||
|
|
||||
|
uint8_t u8g_dev_tft_480x320_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { |
||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); |
||||
|
#ifdef LCD_USE_DMA_FSMC |
||||
|
// new buffer sizes needed?
|
||||
|
static uint16_t bufferA[1152], bufferB[1152]; |
||||
|
uint16_t* buffer = &bufferA[0]; |
||||
|
bool allow_async = true; |
||||
|
#else |
||||
|
uint16_t buffer[WIDTH*2]; // 16-bit RGB 565 pixel line buffer
|
||||
|
#endif |
||||
|
switch (msg) { |
||||
|
case U8G_DEV_MSG_INIT: |
||||
|
dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id); |
||||
|
if (lcd_id == 0x040404) return 0; // No connected display on FSMC
|
||||
|
if (lcd_id == 0xFFFFFF) return 0; // No connected display on SPI
|
||||
|
|
||||
|
if ((lcd_id & 0xFFFF) == 0x8552) // ST7789V
|
||||
|
u8g_WriteEscSeqP(u8g, dev, st7789v_init_sequence); |
||||
|
if ((lcd_id & 0xFFFF) == 0x9341) // ILI9341
|
||||
|
u8g_WriteEscSeqP(u8g, dev, ili9341_init_sequence); |
||||
|
|
||||
|
if (preinit) { |
||||
|
preinit = false; |
||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); |
||||
|
} |
||||
|
|
||||
|
// Clear Screen Sequence
|
||||
|
// u8g_WriteEscSeqP(u8g, dev, clear_screen_sequence);
|
||||
|
// #ifdef LCD_USE_DMA_FSMC
|
||||
|
// LCD_IO_WriteMultiple(bg_color, (480*320));
|
||||
|
// #else
|
||||
|
// memset2(buffer, TFT_MARLINBG_COLOR, 160);
|
||||
|
// for (uint16_t i = 0; i < 960; i++)
|
||||
|
// u8g_WriteSequence(u8g, dev, 160, (uint8_t *)buffer);
|
||||
|
// #endif
|
||||
|
|
||||
|
clearScreenSequence(u8g, dev); |
||||
|
drawButtonSequence(u8g, dev); |
||||
|
|
||||
|
// // bottom line and buttons
|
||||
|
// #if ENABLED(TOUCH_BUTTONS)
|
||||
|
// //@ check button sizes
|
||||
|
// u8g_WriteEscSeqP(u8g, dev, buttonD_sequence);
|
||||
|
// drawImage(buttonD, u8g, dev, 32, 20, TFT_BTCANCEL_COLOR);
|
||||
|
|
||||
|
// u8g_WriteEscSeqP(u8g, dev, buttonA_sequence);
|
||||
|
// drawImage(buttonA, u8g, dev, 32, 20, TFT_BTARROWS_COLOR);
|
||||
|
|
||||
|
// u8g_WriteEscSeqP(u8g, dev, buttonB_sequence);
|
||||
|
// drawImage(buttonB, u8g, dev, 32, 20, TFT_BTARROWS_COLOR);
|
||||
|
|
||||
|
// u8g_WriteEscSeqP(u8g, dev, buttonC_sequence);
|
||||
|
// drawImage(buttonC, u8g, dev, 32, 20, TFT_BTOKMENU_COLOR);
|
||||
|
// #endif // TOUCH_BUTTONS
|
||||
|
|
||||
|
return 0; |
||||
|
|
||||
|
case U8G_DEV_MSG_STOP: preinit = true; break; |
||||
|
|
||||
|
case U8G_DEV_MSG_PAGE_FIRST: |
||||
|
page = 0; |
||||
|
if (reqClearScreen) |
||||
|
{ |
||||
|
clearScreenSequence(u8g, dev); |
||||
|
reqClearScreen = false; |
||||
|
} |
||||
|
|
||||
|
if (reqDrawButtons) |
||||
|
{ |
||||
|
drawButtonSequence(u8g, dev); |
||||
|
reqDrawButtons = false; |
||||
|
} |
||||
|
u8g_WriteEscSeqP(u8g, dev, page_first_sequence); |
||||
|
break; |
||||
|
|
||||
|
case U8G_DEV_MSG_PAGE_NEXT: |
||||
|
if (++page > (HEIGHT / PAGE_HEIGHT)) return 1; |
||||
|
|
||||
|
for (uint8_t y = 0; y < PAGE_HEIGHT; y++) { |
||||
|
uint32_t k = 0; |
||||
|
#ifdef LCD_USE_DMA_FSMC |
||||
|
buffer = (y & 1) ? bufferB : bufferA; |
||||
|
#endif |
||||
|
for (uint16_t i = 0; i < (uint32_t)pb->width; i++) { |
||||
|
const uint8_t b = *(((uint8_t *)pb->buf) + i); |
||||
|
const uint16_t c = TEST(b, y) ? ui_color : bg_color; |
||||
|
//@ 2x upscale X
|
||||
|
// resulting buffersize RGB565 * 256 - 128*2
|
||||
|
//buffer[k++] = c;
|
||||
|
//buffer[k++] = c;
|
||||
|
|
||||
|
//@ 3x upscale X and Y in same loop
|
||||
|
// 1 px -> 3*3 px
|
||||
|
// resulting buffersize RGB565 * 1152 - 128*3*3
|
||||
|
buffer[k++] = c; |
||||
|
buffer[k++] = c; |
||||
|
buffer[k++] = c; |
||||
|
} |
||||
|
#ifdef LCD_USE_DMA_FSMC |
||||
|
//@ 2x upscale Y
|
||||
|
// resulting buffersize RGB565 * 512 - 256*2
|
||||
|
//memcpy(&buffer[256], &buffer[0], 512);
|
||||
|
// Upscale Y 3x
|
||||
|
// linear write should be faster for big arrays
|
||||
|
//
|
||||
|
for (uint16_t l = 0; l < 384; l++) |
||||
|
{ |
||||
|
buffer[l+384] = buffer[l]; |
||||
|
} |
||||
|
for (uint16_t l = 0; l < 384; l++) |
||||
|
{ |
||||
|
buffer[l+768] = buffer[l]; |
||||
|
} |
||||
|
|
||||
|
if (allow_async) { |
||||
|
if (y > 0 || page > 1) LCD_IO_WaitSequence_Async(); |
||||
|
if (y == 7 && page == 8) |
||||
|
//LCD_IO_WriteSequence(buffer, 512); // last line of last page
|
||||
|
LCD_IO_WriteSequence(buffer, 1152); |
||||
|
else |
||||
|
//LCD_IO_WriteSequence_Async(buffer, 512);
|
||||
|
LCD_IO_WriteSequence_Async(buffer, 1152); |
||||
|
} |
||||
|
else |
||||
|
LCD_IO_WriteSequence(buffer, 1152); |
||||
|
#else |
||||
|
uint8_t* bufptr = (uint8_t*) buffer; |
||||
|
for (uint8_t i = 2; i--;) { |
||||
|
u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[0]); |
||||
|
u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH]); |
||||
|
u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH*2]); |
||||
|
u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH*3]); |
||||
|
} |
||||
|
#endif |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case U8G_DEV_MSG_SLEEP_ON: |
||||
|
// Enter Sleep Mode (10h)
|
||||
|
return 1; |
||||
|
case U8G_DEV_MSG_SLEEP_OFF: |
||||
|
// Sleep Out (11h)
|
||||
|
return 1; |
||||
|
} |
||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
U8G_PB_DEV(u8g_dev_tft_480x320_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_480x320_upscale_from_128x64_fn, U8G_COM_HAL_FSMC_FN); |
||||
|
|
||||
|
#endif // HAS_GRAPHICAL_LCD && FSMC_CS
|
@ -0,0 +1,4 @@ |
|||||
|
r |
||||
|
loadbin ./.pio/build/mks_robin_nano/firmware.bin 0x08007000 |
||||
|
rnh |
||||
|
q |
@ -0,0 +1,240 @@ |
|||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* OnProjectLoad |
||||
|
* |
||||
|
* Function description |
||||
|
* Project load routine. Required. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
void OnProjectLoad (void) { |
||||
|
// |
||||
|
// Dialog-generated settings |
||||
|
// |
||||
|
Project.SetDevice ("STM32F103VE"); |
||||
|
Project.SetHostIF ("USB", ""); |
||||
|
Project.SetTargetIF ("SWD"); |
||||
|
Project.SetTIFSpeed ("4 MHz"); |
||||
|
Project.AddSvdFile ("$(InstallDir)/Config/CPU/Cortex-M3.svd"); |
||||
|
Project.AddSvdFile ("/home/sergey/Projects/STM32/F103/BluePill-F103/PWM/STM32F103.svd"); |
||||
|
Project.AddPathSubstitute ("/home/sergey/Projects/3D_Printer/FirmWare/Marlin/Marlin2.0", "$(ProjectDir)"); |
||||
|
///home/sergey/Projects/3D_Printer/FirmWare/Marlin/Marlin2.0/ozone.jdebug |
||||
|
// User settings |
||||
|
// |
||||
|
|
||||
|
File.Open ("$(ProjectDir)/.pio/build/mks_robin_nano/firmware.elf"); |
||||
|
} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* TargetReset |
||||
|
* |
||||
|
* Function description |
||||
|
* Replaces the default target device reset routine. Optional. |
||||
|
* |
||||
|
* Notes |
||||
|
* This example demonstrates the usage when |
||||
|
* debugging a RAM program on a Cortex-M target device |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void TargetReset (void) { |
||||
|
// |
||||
|
// unsigned int SP; |
||||
|
// unsigned int PC; |
||||
|
// unsigned int VectorTableAddr; |
||||
|
// |
||||
|
// Exec.Reset(); |
||||
|
// |
||||
|
// VectorTableAddr = Elf.GetBaseAddr(); |
||||
|
// |
||||
|
// if (VectorTableAddr != 0xFFFFFFFF) { |
||||
|
// |
||||
|
// Util.Log("Resetting Program."); |
||||
|
// |
||||
|
// SP = Target.ReadU32(VectorTableAddr); |
||||
|
// Target.SetReg("SP", SP); |
||||
|
// |
||||
|
// PC = Target.ReadU32(VectorTableAddr + 4); |
||||
|
// Target.SetReg("PC", PC); |
||||
|
// } |
||||
|
//} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* BeforeTargetReset |
||||
|
* |
||||
|
* Function description |
||||
|
* Event handler routine. Optional. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void BeforeTargetReset (void) { |
||||
|
//} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* AfterTargetReset |
||||
|
* |
||||
|
* Function description |
||||
|
* Event handler routine. |
||||
|
* - Sets the PC register to program reset value. |
||||
|
* - Sets the SP register to program reset value on Cortex-M. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
void AfterTargetReset (void) { |
||||
|
unsigned int SP; |
||||
|
unsigned int PC; |
||||
|
unsigned int VectorTableAddr; |
||||
|
|
||||
|
VectorTableAddr = Elf.GetBaseAddr(); |
||||
|
|
||||
|
if (VectorTableAddr == 0xFFFFFFFF) { |
||||
|
Util.Log("Project file error: failed to get program base"); |
||||
|
} else { |
||||
|
SP = Target.ReadU32(VectorTableAddr); |
||||
|
Target.SetReg("SP", SP); |
||||
|
|
||||
|
PC = Target.ReadU32(VectorTableAddr + 4); |
||||
|
Target.SetReg("PC", PC); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* DebugStart |
||||
|
* |
||||
|
* Function description |
||||
|
* Replaces the default debug session startup routine. Optional. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void DebugStart (void) { |
||||
|
//} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* TargetConnect |
||||
|
* |
||||
|
* Function description |
||||
|
* Replaces the default target IF connection routine. Optional. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void TargetConnect (void) { |
||||
|
//} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* BeforeTargetConnect |
||||
|
* |
||||
|
* Function description |
||||
|
* Event handler routine. Optional. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void BeforeTargetConnect (void) { |
||||
|
//} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* AfterTargetConnect |
||||
|
* |
||||
|
* Function description |
||||
|
* Event handler routine. Optional. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void AfterTargetConnect (void) { |
||||
|
//} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* TargetDownload |
||||
|
* |
||||
|
* Function description |
||||
|
* Replaces the default program download routine. Optional. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void TargetDownload (void) { |
||||
|
//} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* BeforeTargetDownload |
||||
|
* |
||||
|
* Function description |
||||
|
* Event handler routine. Optional. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void BeforeTargetDownload (void) { |
||||
|
//} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* AfterTargetDownload |
||||
|
* |
||||
|
* Function description |
||||
|
* Event handler routine. |
||||
|
* - Sets the PC register to program reset value. |
||||
|
* - Sets the SP register to program reset value on Cortex-M. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
void AfterTargetDownload (void) { |
||||
|
unsigned int SP; |
||||
|
unsigned int PC; |
||||
|
unsigned int VectorTableAddr; |
||||
|
|
||||
|
VectorTableAddr = Elf.GetBaseAddr(); |
||||
|
|
||||
|
if (VectorTableAddr == 0xFFFFFFFF) { |
||||
|
Util.Log("Project file error: failed to get program base"); |
||||
|
} else { |
||||
|
SP = Target.ReadU32(VectorTableAddr); |
||||
|
Target.SetReg("SP", SP); |
||||
|
|
||||
|
PC = Target.ReadU32(VectorTableAddr + 4); |
||||
|
Target.SetReg("PC", PC); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* BeforeTargetDisconnect |
||||
|
* |
||||
|
* Function description |
||||
|
* Event handler routine. Optional. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void BeforeTargetDisconnect (void) { |
||||
|
//} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* AfterTargetDisconnect |
||||
|
* |
||||
|
* Function description |
||||
|
* Event handler routine. Optional. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void AfterTargetDisconnect (void) { |
||||
|
//} |
||||
|
|
||||
|
/********************************************************************* |
||||
|
* |
||||
|
* AfterTargetHalt |
||||
|
* |
||||
|
* Function description |
||||
|
* Event handler routine. Optional. |
||||
|
* |
||||
|
********************************************************************** |
||||
|
*/ |
||||
|
//void AfterTargetHalt (void) { |
||||
|
//} |
@ -0,0 +1,28 @@ |
|||||
|
|
||||
|
Breakpoint=3119860543: 43: 0, State=BP_STATE_DISABLED |
||||
|
OpenDocument="main.cpp", FilePath="/home/sergey/.platformio/packages/framework-arduinoststm32-maple/STM32F1/cores/maple/main.cpp", Line=13 |
||||
|
OpenDocument="ultralcd.cpp", FilePath="/home/sergey/Projects/3D_Printer/FirmWare/Marlin/Marlin2.0/Marlin/src/lcd/ultralcd.cpp", Line=745 |
||||
|
OpenDocument="wirish_time.h", FilePath="/home/sergey/.platformio/packages/framework-arduinoststm32-maple/STM32F1/cores/maple/wirish_time.h", Line=62 |
||||
|
OpenDocument="start.S", FilePath="/home/sergey/.platformio/packages/framework-arduinoststm32-maple/STM32F1/variants/generic_stm32f103v/wirish/start.S", Line=26 |
||||
|
OpenDocument="gpio.h", FilePath="/home/sergey/.platformio/packages/framework-arduinoststm32-maple/STM32F1/system/libmaple/stm32f1/include/series/gpio.h", Line=401 |
||||
|
OpenDocument="MarlinCore.cpp", FilePath="/home/sergey/Projects/3D_Printer/FirmWare/Marlin/Marlin2.0/Marlin/src/MarlinCore.cpp", Line=1086 |
||||
|
OpenToolbar="Debug", Floating=0, x=0, y=0 |
||||
|
OpenWindow="Call Stack", DockArea=RIGHT, x=0, y=0, w=427, h=523, FilterBarShown=0, ToolBarShown=0 |
||||
|
OpenWindow="Registers 1", DockArea=RIGHT, x=0, y=0, w=427, h=523, FilterBarShown=0, ToolBarShown=0, FilteredItems=[], RefreshRate=1 |
||||
|
OpenWindow="Source Files", DockArea=LEFT, x=0, y=0, w=301, h=523, FilterBarShown=1, ToolBarShown=0 |
||||
|
OpenWindow="Disassembly", DockArea=LEFT, x=0, y=0, w=301, h=523, FilterBarShown=0, ToolBarShown=0, ExecCountersShown=0, InstEncodingsShown=0 |
||||
|
OpenWindow="Source", x=0, y=0, w=0, h=0, FilterBarShown=0, ToolBarShown=0, ExecCountersShown=0 |
||||
|
OpenWindow="Break & Tracepoints", DockArea=LEFT, x=0, y=0, w=301, h=523, FilterBarShown=0, ToolBarShown=0, VectorCatchIndexMask=254 |
||||
|
OpenWindow="Memory 1", DockArea=BOTTOM, x=1, y=0, w=524, h=220, FilterBarShown=0, ToolBarShown=0, EditorAddress=0x30000000 |
||||
|
OpenWindow="Watched Data", DockArea=BOTTOM, x=2, y=0, w=424, h=220, FilterBarShown=0, ToolBarShown=0 |
||||
|
OpenWindow="Terminal", DockArea=BOTTOM, x=0, y=0, w=580, h=220, FilterBarShown=0, ToolBarShown=0 |
||||
|
OpenWindow="RTOS", DockArea=RIGHT, x=0, y=0, w=427, h=523, FilterBarShown=0, ToolBarShown=0, Showing="" |
||||
|
TableHeader="Registers 1", SortCol="Name", SortOrder="ASCENDING", VisibleCols=["Name";"Value";"Description"], ColWidths=[232;195;259] |
||||
|
TableHeader="Vector Catches", SortCol="None", SortOrder="ASCENDING", VisibleCols=["";"Vector Catch";"Description"], ColWidths=[50;300;500] |
||||
|
TableHeader="Break & Tracepoints", SortCol="None", SortOrder="ASCENDING", VisibleCols=["";"Type";"Location";"Extras"], ColWidths=[55;102;112;123] |
||||
|
TableHeader="Source Files", SortCol="Path", SortOrder="ASCENDING", VisibleCols=["File";"Status";"Size";"#Insts";"Path"], ColWidths=[147;59;48;57;1015] |
||||
|
TableHeader="Watched Data", SortCol="Expression", SortOrder="ASCENDING", VisibleCols=["Expression";"Value";"Location";"Refresh";"Access"], ColWidths=[125;172;117;54;51] |
||||
|
TableHeader="Call Stack", SortCol="Function", SortOrder="ASCENDING", VisibleCols=["Function";"Stack Frame";"Source";"PC";"Return Address";"Stack Used"], ColWidths=[201;96;88;82;156;73] |
||||
|
TableHeader="Power Sampling", SortCol="Index", SortOrder="ASCENDING", VisibleCols=["Index";"Time";"Ch 0"], ColWidths=[100;100;100] |
||||
|
TableHeader="RegisterSelectionDialog", SortCol="Name", SortOrder="ASCENDING", VisibleCols=["Auto";"Name";"Address";"Description"], ColWidths=[27;27;27;27] |
||||
|
WatchedExpression="case_light_arg_flag" |
Loading…
Reference in new issue