Bläddra i källkod

Improve Due SW SPI, Fysetc sanity checks, &c. (#13939)

Bob Kuhn 5 år sedan
förälder
incheckning
456a0ee76b

+ 21
- 23
Marlin/src/HAL/HAL_AVR/u8g_com_HAL_AVR_sw_spi.cpp Visa fil

@@ -64,10 +64,8 @@
64 64
 
65 65
 #include <U8glib.h>
66 66
 
67
-uint8_t u8g_bitData, u8g_bitNotData;
68
-uint8_t u8g_bitClock, u8g_bitNotClock;
69
-volatile uint8_t *u8g_outData;
70
-volatile uint8_t *u8g_outClock;
67
+uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock;
68
+volatile uint8_t *u8g_outData, *u8g_outClock;
71 69
 
72 70
 static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) {
73 71
   u8g_outData = portOutputRegister(digitalPinToPort(dataPin));
@@ -82,13 +80,13 @@ static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) {
82 80
   u8g_bitNotData ^= 0xFF;
83 81
 }
84 82
 
85
-void U8G_spiSend_sw_AVR_mode_0(uint8_t val) {
86
-  uint8_t bitData = u8g_bitData;
87
-  uint8_t bitNotData = u8g_bitNotData;
88
-  uint8_t bitClock = u8g_bitClock;
89
-  uint8_t bitNotClock = u8g_bitNotClock;
90
-  volatile uint8_t *outData = u8g_outData;
91
-  volatile uint8_t *outClock = u8g_outClock;
83
+void u8g_spiSend_sw_AVR_mode_0(uint8_t val) {
84
+  uint8_t bitData = u8g_bitData,
85
+          bitNotData = u8g_bitNotData,
86
+          bitClock = u8g_bitClock,
87
+          bitNotClock = u8g_bitNotClock;
88
+  volatile uint8_t *outData = u8g_outData,
89
+                   *outClock = u8g_outClock;
92 90
   U8G_ATOMIC_START();
93 91
   for (uint8_t i = 0; i < 8; i++) {
94 92
     if (val & 0x80)
@@ -102,13 +100,13 @@ void U8G_spiSend_sw_AVR_mode_0(uint8_t val) {
102 100
   U8G_ATOMIC_END();
103 101
 }
104 102
 
105
-void U8G_spiSend_sw_AVR_mode_3(uint8_t val) {
106
-  uint8_t bitData = u8g_bitData;
107
-  uint8_t bitNotData = u8g_bitNotData;
108
-  uint8_t bitClock = u8g_bitClock;
109
-  uint8_t bitNotClock = u8g_bitNotClock;
110
-  volatile uint8_t *outData = u8g_outData;
111
-  volatile uint8_t *outClock = u8g_outClock;
103
+void u8g_spiSend_sw_AVR_mode_3(uint8_t val) {
104
+  uint8_t bitData = u8g_bitData,
105
+          bitNotData = u8g_bitNotData,
106
+          bitClock = u8g_bitClock,
107
+          bitNotClock = u8g_bitNotClock;
108
+  volatile uint8_t *outData = u8g_outData,
109
+                   *outClock = u8g_outClock;
112 110
   U8G_ATOMIC_START();
113 111
   for (uint8_t i = 0; i < 8; i++) {
114 112
     *outClock &= bitNotClock;
@@ -124,9 +122,9 @@ void U8G_spiSend_sw_AVR_mode_3(uint8_t val) {
124 122
 
125 123
 
126 124
 #if ENABLED(FYSETC_MINI_12864)
127
-  #define U8G_spiSend_sw_AVR U8G_spiSend_sw_AVR_mode_3
125
+  #define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_3
128 126
 #else
129
-  #define U8G_spiSend_sw_AVR U8G_spiSend_sw_AVR_mode_0
127
+  #define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_0
130 128
 #endif
131 129
 
132 130
 uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
@@ -162,13 +160,13 @@ uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
162 160
       break;
163 161
 
164 162
     case U8G_COM_MSG_WRITE_BYTE:
165
-      U8G_spiSend_sw_AVR(arg_val);
163
+      SPISEND_SW_AVR(arg_val);
166 164
       break;
167 165
 
168 166
     case U8G_COM_MSG_WRITE_SEQ: {
169 167
         uint8_t *ptr = (uint8_t *)arg_ptr;
170 168
         while (arg_val > 0) {
171
-          U8G_spiSend_sw_AVR(*ptr++);
169
+          SPISEND_SW_AVR(*ptr++);
172 170
           arg_val--;
173 171
         }
174 172
       }
@@ -177,7 +175,7 @@ uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
177 175
       case U8G_COM_MSG_WRITE_SEQ_P: {
178 176
         uint8_t *ptr = (uint8_t *)arg_ptr;
179 177
         while (arg_val > 0) {
180
-          U8G_spiSend_sw_AVR(u8g_pgm_read(ptr));
178
+          SPISEND_SW_AVR(u8g_pgm_read(ptr));
181 179
           ptr++;
182 180
           arg_val--;
183 181
         }

+ 12
- 28
Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp Visa fil

@@ -57,42 +57,26 @@
57 57
 
58 58
 #include "../../inc/MarlinConfigPre.h"
59 59
 
60
-#if HAS_GRAPHICAL_LCD
60
+#if ENABLED(U8GLIB_ST7920)
61
+
62
+#include "u8g_com_HAL_DUE_sw_spi_shared.h"
61 63
 
62
-#include "../shared/Marduino.h"
63 64
 #include "../shared/Delay.h"
64 65
 
65 66
 #include <U8glib.h>
66 67
 
67
-#include "u8g_com_HAL_DUE_sw_spi_shared.h"
68
-
69
-Pio *SCK_pPio, *MOSI_pPio;
70
-uint32_t SCK_dwMask, MOSI_dwMask;
71
-
72
-static void spiSend_sw_DUE(uint8_t val) { // 800KHz
73
-  for (uint8_t i = 0; i < 8; i++) {
74
-    if (val & 0x80)
75
-      MOSI_pPio->PIO_SODR = MOSI_dwMask;
76
-    else
77
-      MOSI_pPio->PIO_CODR = MOSI_dwMask;
78
-    DELAY_NS(48);
79
-    SCK_pPio->PIO_SODR = SCK_dwMask;
80
-    DELAY_NS(905); // 762 dead, 810 garbage, 858/0 900kHz, 905/1 825k, 953/1 800k, 1000/2 725KHz
81
-    val <<= 1;
82
-    SCK_pPio->PIO_CODR = SCK_dwMask;
83
-  }
84
-}
68
+#define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_0
85 69
 
86 70
 static uint8_t rs_last_state = 255;
87 71
 
88 72
 static void u8g_com_DUE_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) {
89 73
   if (rs != rs_last_state) {  // time to send a command/data byte
90 74
     rs_last_state = rs;
91
-    spiSend_sw_DUE(rs ? 0x0FA : 0x0F8); // Command or Data
75
+    SPISEND_SW_DUE(rs ? 0x0FA : 0x0F8); // Command or Data
92 76
     DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe
93 77
   }
94
-  spiSend_sw_DUE(val & 0xF0);
95
-  spiSend_sw_DUE(val << 4);
78
+  SPISEND_SW_DUE(val & 0xF0);
79
+  SPISEND_SW_DUE(val << 4);
96 80
 }
97 81
 
98 82
 uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
@@ -182,20 +166,20 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
182 166
   }
183 167
 
184 168
   void ST7920_set_cmd() {
185
-    spiSend_sw_DUE(0xF8);
169
+    SPISEND_SW_DUE(0xF8);
186 170
     DELAY_US(40);
187 171
   }
188 172
 
189 173
   void ST7920_set_dat() {
190
-    spiSend_sw_DUE(0xFA);
174
+    SPISEND_SW_DUE(0xFA);
191 175
     DELAY_US(40);
192 176
   }
193 177
 
194 178
   void ST7920_write_byte(const uint8_t val) {
195
-    spiSend_sw_DUE(val & 0xF0);
196
-    spiSend_sw_DUE(val << 4);
179
+    SPISEND_SW_DUE(val & 0xF0);
180
+    SPISEND_SW_DUE(val << 4);
197 181
   }
198 182
 #endif // LIGHTWEIGHT_UI
199 183
 
200
-#endif // HAS_GRAPHICAL_LCD
184
+#endif // U8GLIB_ST7920
201 185
 #endif // ARDUINO_ARCH_SAM

+ 7
- 13
Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_sw_spi.cpp Visa fil

@@ -62,23 +62,17 @@
62 62
 #undef SPI_SPEED
63 63
 #define SPI_SPEED 2  // About 2 MHz
64 64
 
65
+#include "u8g_com_HAL_DUE_sw_spi_shared.h"
66
+
65 67
 #include "../shared/Marduino.h"
66 68
 #include "../shared/Delay.h"
67 69
 
68 70
 #include <U8glib.h>
69 71
 
70
-void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index);
71
-void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level);
72
-void U8G_spiSend_sw_DUE_mode_0(uint8_t val);
73
-void U8G_spiSend_sw_DUE_mode_3(uint8_t val);
74
-
75
-Pio *SCK_pPio, *MOSI_pPio;
76
-uint32_t SCK_dwMask, MOSI_dwMask;
77
-
78 72
 #if ENABLED(FYSETC_MINI_12864)
79
-  #define U8G_spiSend_sw_DUE U8G_spiSend_sw_DUE_mode_3
73
+  #define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_3
80 74
 #else
81
-  #define U8G_spiSend_sw_DUE U8G_spiSend_sw_DUE_mode_0
75
+  #define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_0
82 76
 #endif
83 77
 
84 78
 uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
@@ -121,13 +115,13 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
121 115
       break;
122 116
 
123 117
     case U8G_COM_MSG_WRITE_BYTE:
124
-      U8G_spiSend_sw_DUE(arg_val);
118
+      SPISEND_SW_DUE(arg_val);
125 119
       break;
126 120
 
127 121
     case U8G_COM_MSG_WRITE_SEQ: {
128 122
         uint8_t *ptr = (uint8_t *)arg_ptr;
129 123
         while (arg_val > 0) {
130
-          U8G_spiSend_sw_DUE(*ptr++);
124
+          SPISEND_SW_DUE(*ptr++);
131 125
           arg_val--;
132 126
         }
133 127
       }
@@ -136,7 +130,7 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
136 130
       case U8G_COM_MSG_WRITE_SEQ_P: {
137 131
         uint8_t *ptr = (uint8_t *)arg_ptr;
138 132
         while (arg_val > 0) {
139
-          U8G_spiSend_sw_DUE(u8g_pgm_read(ptr));
133
+          SPISEND_SW_DUE(u8g_pgm_read(ptr));
140 134
           ptr++;
141 135
           arg_val--;
142 136
         }

+ 11
- 11
Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_sw_spi_shared.cpp Visa fil

@@ -59,13 +59,12 @@
59 59
 
60 60
 #if HAS_GRAPHICAL_LCD
61 61
 
62
-#include "../shared/Marduino.h"
62
+#include "u8g_com_HAL_DUE_sw_spi_shared.h"
63
+
63 64
 #include "../shared/Delay.h"
64 65
 
65 66
 #include <U8glib.h>
66 67
 
67
-#include "u8g_com_HAL_DUE_sw_spi_shared.h"
68
-
69 68
 void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index) {
70 69
   PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1,
71 70
     g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration);  // OUTPUT
@@ -77,10 +76,10 @@ void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level) {
77 76
   if (level) port->PIO_SODR = mask; else port->PIO_CODR = mask;
78 77
 }
79 78
 
80
-extern Pio *SCK_pPio, *MOSI_pPio;
81
-extern uint32_t SCK_dwMask, MOSI_dwMask;
79
+Pio *SCK_pPio, *MOSI_pPio;
80
+uint32_t SCK_dwMask, MOSI_dwMask;
82 81
 
83
-void U8G_spiSend_sw_DUE_mode_0(uint8_t val) { // 800KHz
82
+void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz
84 83
   for (uint8_t i = 0; i < 8; i++) {
85 84
     if (val & 0x80)
86 85
       MOSI_pPio->PIO_SODR = MOSI_dwMask;
@@ -88,23 +87,24 @@ void U8G_spiSend_sw_DUE_mode_0(uint8_t val) { // 800KHz
88 87
       MOSI_pPio->PIO_CODR = MOSI_dwMask;
89 88
     DELAY_NS(48);
90 89
     SCK_pPio->PIO_SODR = SCK_dwMask;
91
-    DELAY_NS(905); // 762 dead, 810 garbage, 858/0 900kHz, 905/1 825k, 953/1 800k, 1000/2 725KHz
90
+    DELAY_NS(125);
92 91
     val <<= 1;
93 92
     SCK_pPio->PIO_CODR = SCK_dwMask;
94 93
   }
95 94
 }
96 95
 
97
-void U8G_spiSend_sw_DUE_mode_3(uint8_t val) { // 800KHz
96
+void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz
98 97
   for (uint8_t i = 0; i < 8; i++) {
99 98
     SCK_pPio->PIO_CODR = SCK_dwMask;
100
-    DELAY_NS(48);
99
+    DELAY_NS(50);
101 100
     if (val & 0x80)
102 101
       MOSI_pPio->PIO_SODR = MOSI_dwMask;
103 102
     else
104 103
       MOSI_pPio->PIO_CODR = MOSI_dwMask;
105
-    SCK_pPio->PIO_SODR = SCK_dwMask;
106
-    DELAY_NS(905); // 762 dead, 810 garbage, 858/0 900kHz, 905/1 825k, 953/1 800k, 1000/2 725KHz
107 104
     val <<= 1;
105
+    DELAY_NS(10);
106
+    SCK_pPio->PIO_SODR = SCK_dwMask;
107
+    DELAY_NS(70);
108 108
   }
109 109
 }
110 110
 

+ 9
- 0
Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_sw_spi_shared.h Visa fil

@@ -21,5 +21,14 @@
21 21
  */
22 22
 #pragma once
23 23
 
24
+#include "../../inc/MarlinConfigPre.h"
25
+#include "../shared/Marduino.h"
26
+
24 27
 void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index);
25 28
 void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level);
29
+
30
+void u8g_spiSend_sw_DUE_mode_0(uint8_t val);
31
+void u8g_spiSend_sw_DUE_mode_3(uint8_t val);
32
+
33
+extern Pio *SCK_pPio, *MOSI_pPio;
34
+extern uint32_t SCK_dwMask, MOSI_dwMask;

+ 2
- 3
Marlin/src/HAL/HAL_LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp Visa fil

@@ -57,7 +57,7 @@
57 57
 
58 58
 #include "../../../inc/MarlinConfigPre.h"
59 59
 
60
-#if HAS_GRAPHICAL_LCD
60
+#if ENABLED(U8GLIB_ST7920)
61 61
 
62 62
 #include <U8glib.h>
63 63
 #include "SoftwareSPI.h"
@@ -141,6 +141,5 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar
141 141
   return 1;
142 142
 }
143 143
 
144
-#endif // HAS_GRAPHICAL_LCD
145
-
144
+#endif // U8GLIB_ST7920
146 145
 #endif // TARGET_LPC1768

+ 2
- 2
Marlin/src/HAL/HAL_LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp Visa fil

@@ -57,7 +57,7 @@
57 57
 
58 58
 #include "../../../inc/MarlinConfigPre.h"
59 59
 
60
-#if HAS_GRAPHICAL_LCD
60
+#if HAS_GRAPHICAL_LCD && DISABLED(U8GLIB_ST7920)
61 61
 
62 62
 #include "SoftwareSPI.h"
63 63
 
@@ -203,5 +203,5 @@ uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val,
203 203
   return 1;
204 204
 }
205 205
 
206
-#endif // HAS_GRAPHICAL_LCD
206
+#endif // HAS_GRAPHICAL_LCD && !U8GLIB_ST7920
207 207
 #endif // TARGET_LPC1768

+ 7
- 2
Marlin/src/inc/Conditionals_LCD.h Visa fil

@@ -156,9 +156,14 @@
156 156
     #define RGB_LED
157 157
   #elif ENABLED(FYSETC_MINI_12864_2_1)
158 158
     #define NEOPIXEL_LED
159
-    #define NEOPIXEL_TYPE       NEO_GRB
159
+    #undef NEOPIXEL_TYPE
160
+    #define NEOPIXEL_TYPE       NEO_RGB
161
+    #undef NEOPIXEL_PIXELS
160 162
     #define NEOPIXEL_PIXELS     3
161
-    #define NEOPIXEL_BRIGHTNESS 127
163
+    #ifndef NEOPIXEL_BRIGHTNESS
164
+      #define NEOPIXEL_BRIGHTNESS 127
165
+    #endif
166
+    #define NEOPIXEL_STARTUP_TEST
162 167
   #endif
163 168
 
164 169
 #endif

+ 18
- 0
Marlin/src/inc/Conditionals_adv.h Visa fil

@@ -79,3 +79,21 @@
79 79
     #endif
80 80
   #endif
81 81
 #endif
82
+
83
+#if ENABLED(FYSETC_MINI_12864_2_1)
84
+  #define LED_CONTROL_MENU
85
+  #define LED_USER_PRESET_STARTUP
86
+  #define LED_COLOR_PRESETS
87
+  #ifndef LED_USER_PRESET_RED
88
+    #define LED_USER_PRESET_RED        255
89
+  #endif
90
+  #ifndef LED_USER_PRESET_GREEN
91
+    #define LED_USER_PRESET_GREEN      128
92
+  #endif
93
+  #ifndef LED_USER_PRESET_BLUE
94
+    #define LED_USER_PRESET_BLUE         0
95
+  #endif
96
+  #ifndef LED_USER_PRESET_BRIGHTNESS
97
+    #define LED_USER_PRESET_BRIGHTNESS 255
98
+  #endif
99
+#endif

+ 0
- 20
Marlin/src/inc/SanityCheck.h Visa fil

@@ -1830,26 +1830,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1830 1830
   #error "RGB_LED is required for FYSETC_MINI_12864 1.2 and 2.0."
1831 1831
 #elif EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1) && DISABLED(LED_USER_PRESET_STARTUP)
1832 1832
   #error "LED_USER_PRESET_STARTUP is required for FYSETC_MINI_12864 2.x displays."
1833
-#elif ENABLED(FYSETC_MINI_12864_2_1)
1834
-  #if DISABLED(NEOPIXEL_LED)
1835
-    #error "NEOPIXEL_LED is required for FYSETC_MINI_12864 Rev. 2.1."
1836
-  #elif NEOPIXEL_PIXELS != 3
1837
-    #error "NEOPIXEL_PIXELS should be 3 for FYSETC_MINI_12864 Rev. 2.1."
1838
-  #elif NEOPIXEL_BRIGHTNESS != 127
1839
-    #error "NEOPIXEL_BRIGHTNESS should be 127 for FYSETC_MINI_12864 Rev. 2.1."
1840
-  #else
1841
-    #ifndef NEO_GRB
1842
-      #define NEO_GRB 0xFAD
1843
-      #define _UNDO_NEO_GRB
1844
-    #endif
1845
-    #if NEOPIXEL_TYPE != NEO_GRB
1846
-      #error "NEOPIXEL_TYPE should be NEO_GRB for FYSETC_MINI_12864 Rev. 2.1."
1847
-    #endif
1848
-    #ifdef _UNDO_NEO_GRB
1849
-      #undef NEO_GRB
1850
-      #undef _UNDO_NEO_GRB
1851
-    #endif
1852
-  #endif
1853 1833
 #endif
1854 1834
 
1855 1835
 /**

Laddar…
Avbryt
Spara