From c66d1ac6511ca39d55b3a64f2f168cf8fadd15e2 Mon Sep 17 00:00:00 2001 From: Christopher Pepper Date: Tue, 25 Jul 2017 18:53:14 +0100 Subject: [PATCH] Debug Pins Support --- Marlin/Marlin_main.cpp | 15 +- Marlin/pinsDebug_list.h | 12 + Marlin/src/HAL/HAL_LPC1768/HAL_pinsDebug.h | 215 ++++++++++++++++++ Marlin/src/HAL/HAL_LPC1768/pinsDebug_Re_ARM.h | 92 ++++++++ Marlin/src/HAL/HAL_pinsDebug.h | 2 + 5 files changed, 330 insertions(+), 6 deletions(-) create mode 100644 Marlin/src/HAL/HAL_LPC1768/HAL_pinsDebug.h create mode 100644 Marlin/src/HAL/HAL_LPC1768/pinsDebug_Re_ARM.h diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 9b84c8e23..4b5ebe917 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -6632,7 +6632,7 @@ inline void gcode_M42() { #if ENABLED(PINS_DEBUGGING) - #include "pinsDebug.h" + #include "src/HAL/HAL_pinsDebug.h" inline void toggle_pins() { const bool I_flag = parser.boolval('I'); @@ -6643,7 +6643,7 @@ inline void gcode_M42() { for (uint8_t pin = start; pin <= end; pin++) { //report_pin_state_extended(pin, I_flag, false); - + if (!VALID_PIN(pin)) continue; if (!I_flag && pin_is_protected(pin)) { report_pin_state_extended(pin, I_flag, true, "Untouched "); SERIAL_EOL(); @@ -6869,14 +6869,15 @@ inline void gcode_M42() { // Watch until click, M108, or reset if (parser.boolval('W')) { SERIAL_PROTOCOLLNPGM("Watching pins"); - byte pin_state[last_pin - first_pin + 1]; + uint8_t pin_state[last_pin - first_pin + 1]; for (int8_t pin = first_pin; pin <= last_pin; pin++) { + if (!VALID_PIN(pin)) continue; if (pin_is_protected(pin) && !ignore_protection) continue; pinMode(pin, INPUT_PULLUP); delay(1); /* if (IS_ANALOG(pin)) - pin_state[pin - first_pin] = analogRead(pin - analogInputToDigitalPin(0)); // int16_t pin_state[...] + pin_state[pin - first_pin] = analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin)); // int16_t pin_state[...] else //*/ pin_state[pin - first_pin] = digitalRead(pin); @@ -6889,11 +6890,12 @@ inline void gcode_M42() { for (;;) { for (int8_t pin = first_pin; pin <= last_pin; pin++) { + if (!VALID_PIN(pin)) continue; if (pin_is_protected(pin) && !ignore_protection) continue; const byte val = /* IS_ANALOG(pin) - ? analogRead(pin - analogInputToDigitalPin(0)) : // int16_t val + ? analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin)) : // int16_t val : //*/ digitalRead(pin); @@ -6917,7 +6919,7 @@ inline void gcode_M42() { // Report current state of selected pin(s) for (uint8_t pin = first_pin; pin <= last_pin; pin++) - report_pin_state_extended(pin, ignore_protection, true); + if (VALID_PIN(pin)) report_pin_state_extended(pin, ignore_protection, true); } #endif // PINS_DEBUGGING @@ -11086,6 +11088,7 @@ void process_next_command() { gcode_M140(); break; + case 105: // M105: Report current temperature gcode_M105(); KEEPALIVE_STATE(NOT_BUSY); diff --git a/Marlin/pinsDebug_list.h b/Marlin/pinsDebug_list.h index b4cc4c29f..a197b93ee 100644 --- a/Marlin/pinsDebug_list.h +++ b/Marlin/pinsDebug_list.h @@ -575,6 +575,9 @@ #if defined(TC2) && TC2 >= 0 && TC2 < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(TC2, __LINE__ ) #endif +#if PIN_EXISTS(FILWIDTH) && FILWIDTH_PIN < NUM_ANALOG_INPUTS + REPORT_NAME_ANALOG(FILWIDTH_PIN, __LINE__ ) +#endif #if PIN_EXISTS(TEMP_0) && TEMP_0_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(TEMP_0_PIN, __LINE__ ) #endif @@ -590,6 +593,15 @@ #if PIN_EXISTS(TEMP_4) && TEMP_4_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(TEMP_4_PIN, __LINE__ ) #endif +#if PIN_EXISTS(TEMP_5) && TEMP_5_PIN < NUM_ANALOG_INPUTS + REPORT_NAME_ANALOG(TEMP_5_PIN, __LINE__ ) +#endif +#if PIN_EXISTS(TEMP_6) && TEMP_6_PIN < NUM_ANALOG_INPUTS + REPORT_NAME_ANALOG(TEMP_6_PIN, __LINE__ ) +#endif +#if PIN_EXISTS(TEMP_7) && TEMP_7_PIN < NUM_ANALOG_INPUTS + REPORT_NAME_ANALOG(TEMP_7_PIN, __LINE__ ) +#endif #if PIN_EXISTS(TEMP_BED) && TEMP_BED_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(TEMP_BED_PIN, __LINE__ ) #endif diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_pinsDebug.h b/Marlin/src/HAL/HAL_LPC1768/HAL_pinsDebug.h new file mode 100644 index 000000000..03dc0674a --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_pinsDebug.h @@ -0,0 +1,215 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 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 . + * + */ + +bool endstop_monitor_flag = false; + +#define MAX_NAME_LENGTH 35 // one place to specify the format of all the sources of names + // "-" left justify, "35" minimum width of name, pad with blanks + +/** + * This routine minimizes RAM usage by creating a FLASH resident array to + * store the pin names, pin numbers and analog/digital flag. + * + * Creating the array in FLASH is a two pass process. The first pass puts the + * name strings into FLASH. The second pass actually creates the array. + * + * Both passes use the same pin list. The list contains two macro names. The + * actual macro definitions are changed depending on which pass is being done. + * + */ + +// first pass - put the name strings into FLASH + +#define _ADD_PIN_2(PIN_NAME, ENTRY_NAME) static const char ENTRY_NAME[] PROGMEM = { PIN_NAME }; +#define _ADD_PIN(PIN_NAME, COUNTER) _ADD_PIN_2(PIN_NAME, entry_NAME_##COUNTER) +#define REPORT_NAME_DIGITAL(NAME, COUNTER) _ADD_PIN(#NAME, COUNTER) +#define REPORT_NAME_ANALOG(NAME, COUNTER) _ADD_PIN(#NAME, COUNTER) + +#include "../../../pinsDebug_list.h" +#line 51 + +///////////////////////////////////////////////////////////////////////////// + +// second pass - create the array + +#undef _ADD_PIN_2 +#undef _ADD_PIN +#undef REPORT_NAME_DIGITAL +#undef REPORT_NAME_ANALOG + +#define _ADD_PIN_2(ENTRY_NAME, NAME, IS_DIGITAL) { ENTRY_NAME, NAME, IS_DIGITAL }, +#define _ADD_PIN(NAME, COUNTER, IS_DIGITAL) _ADD_PIN_2(entry_NAME_##COUNTER, NAME, IS_DIGITAL) +#define REPORT_NAME_DIGITAL(NAME, COUNTER) _ADD_PIN(NAME, COUNTER, true) +#define REPORT_NAME_ANALOG(NAME, COUNTER) _ADD_PIN(analogInputToDigitalPin(NAME), COUNTER, false) + + +typedef struct { + const char * const name; + uint8_t pin; + bool is_digital; +} PinInfo; + +const PinInfo pin_array[] PROGMEM = { + + /** + * [pin name] [pin number] [is digital or analog] 1 = digital, 0 = analog + * Each entry takes up 6 bytes in FLASH: + * 2 byte pointer to location of the name string + * 2 bytes containing the pin number + * analog pin numbers were convereted to digital when the array was created + * 2 bytes containing the digital/analog bool flag + */ + + // manually add pins ... + #if SERIAL_PORT == 0 + + #endif + + #include "../../../pinsDebug_list.h" + #line 102 + +}; + +#define AVR_ATmega2560_FAMILY_PLUS_70 (MOTHERBOARD == BOARD_BQ_ZUM_MEGA_3D \ +|| MOTHERBOARD == BOARD_MIGHTYBOARD_REVE \ +|| MOTHERBOARD == BOARD_MINIRAMBO \ +|| MOTHERBOARD == BOARD_SCOOVO_X9H) + + +#include "pinsDebug_Re_ARM.h" + +#define PWM_PRINT(V) do{ sprintf_P(buffer, PSTR("PWM: %4d"), V); SERIAL_ECHO(buffer); }while(0) +#define PWM_CASE(N,Z) \ + case TIMER##N##Z: \ + if (TCCR##N##A & (_BV(COM##N##Z##1) | _BV(COM##N##Z##0))) { \ + PWM_PRINT(OCR##N##Z); \ + return true; \ + } else return false + +bool PWM_ok = true; + +static void print_input_or_output(const bool isout) { + serialprintPGM(isout ? PSTR("Output = ") : PSTR("Input = ")); +} + +// pretty report with PWM info +inline void report_pin_state_extended(int8_t pin, bool ignore, bool extended = false, const char *start_string = "") { + uint8_t temp_char; + char *name_mem_pointer, buffer[30]; // for the sprintf statements + bool found = false, multi_name_pin = false; + for (uint8_t x = 0; x < COUNT(pin_array); x++) { // scan entire array and report all instances of this pin + if (GET_ARRAY_PIN(x) == pin) { + GET_PIN_INFO(pin); + if (found) multi_name_pin = true; + found = true; + if (!multi_name_pin) { // report digitial and analog pin number only on the first time through + sprintf_P(buffer, PSTR("%sPIN: %3d "), start_string, pin); // digital pin number + SERIAL_ECHO(buffer); + PRINT_PORT(pin); + if (IS_ANALOG(pin)) { + sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); // analog pin number + SERIAL_ECHO(buffer); + } + else SERIAL_ECHO_SP(8); // add padding if not an analog pin + } + else { + SERIAL_CHAR('.'); + SERIAL_ECHO_SP(26 + strlen(start_string)); // add padding if not the first instance found + } + PRINT_ARRAY_NAME(x); + if (extended) { + if (pin_is_protected(pin) && !ignore) + SERIAL_ECHOPGM("protected "); + else { +//SERIAL_PROTOCOLPAIR(" GET_ARRAY_IS_DIGITAL(x) 0 = analog : ", GET_ARRAY_IS_DIGITAL(x)); + + if (!GET_ARRAY_IS_DIGITAL(x)) { + sprintf_P(buffer, PSTR("Analog in = %5d"), analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin))); + SERIAL_ECHO(buffer); + } + else { + +//MYSERIAL.printf(" GET_PINMODE(pin) 1 = output : %d ", GET_PINMODE(pin)); + if (!GET_PINMODE(pin)) { + //pinMode(pin, INPUT_PULLUP); // make sure input isn't floating - stopped doing this + // because this could interfere with inductive/capacitive + // sensors (high impedance voltage divider) and with PT100 amplifier + print_input_or_output(false); + SERIAL_PROTOCOL(digitalRead_mod(pin)); + } + #if PWM_ok + else if (pwm_status(pin)) { + // do nothing + } + #endif + else { + print_input_or_output(true); + SERIAL_PROTOCOL(digitalRead_mod(pin)); + } + } + #if PWM_ok + if (!multi_name_pin && extended) pwm_details(pin); // report PWM capabilities only on the first pass & only if doing an extended report + #endif + } + } + SERIAL_EOL(); + } // end of IF + } // end of for loop + + if (!found) { + GET_PIN_INFO(pin); + sprintf_P(buffer, PSTR("%sPIN: %3d "), start_string, pin); + SERIAL_ECHO(buffer); + PRINT_PORT(pin); + if (IS_ANALOG(pin)) { + sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); // analog pin number + SERIAL_ECHO(buffer); + } + else + SERIAL_ECHO_SP(8); // add padding if not an analog pin + SERIAL_ECHOPGM(""); + if (extended) { + if (GET_PINMODE(pin)) { + SERIAL_PROTOCOL_SP(MAX_NAME_LENGTH - 16); + print_input_or_output(true); + SERIAL_PROTOCOL(digitalRead_mod(pin)); + } + else { + if (IS_ANALOG(pin)) { + sprintf_P(buffer, PSTR(" Analog in = %5d"), analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin))); + SERIAL_ECHO(buffer); + SERIAL_ECHOPGM(" "); + } + else + SERIAL_ECHO_SP(MAX_NAME_LENGTH - 16); // add padding if not an analog pin + + print_input_or_output(false); + SERIAL_PROTOCOL(digitalRead_mod(pin)); + } + //if (!pwm_status(pin)) SERIAL_CHAR(' '); // add padding if it's not a PWM pin + #if PWM_ok + if (extended) pwm_details(pin); // report PWM capabilities only if doing an extended report + #endif + } + SERIAL_EOL(); + } +} diff --git a/Marlin/src/HAL/HAL_LPC1768/pinsDebug_Re_ARM.h b/Marlin/src/HAL/HAL_LPC1768/pinsDebug_Re_ARM.h new file mode 100644 index 000000000..560fba607 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/pinsDebug_Re_ARM.h @@ -0,0 +1,92 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 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 . + * + */ + +/** + * Support routines for Re-ARM board + */ + + + +typedef struct { + int8_t pin; + bool output; + bool analog; + uint8_t resistors; + bool open_drain; + char function_string[15]; +} pin_info; + +pin_info pin_Re_ARM; + +void get_pin_info(int8_t pin) { + pin_Re_ARM.analog = 0; + pin_Re_ARM.pin = pin; + int8_t pin_port = pin_map[pin].port; + int8_t pin_port_pin = pin_map[pin].pin; + + // active ADC function/mode/code values for PINSEL registers + int8_t ADC_pin_mode = pin_port == 0 && pin_port_pin == 2 ? 2 : + pin_port == 0 && pin_port_pin == 3 ? 2 : + pin_port == 0 && pin_port_pin == 23 ? 1 : + pin_port == 0 && pin_port_pin == 24 ? 1 : + pin_port == 0 && pin_port_pin == 25 ? 1 : + pin_port == 0 && pin_port_pin == 26 ? 1 : + pin_port == 1 && pin_port_pin == 30 ? 3 : + pin_port == 1 && pin_port_pin == 31 ? 3 : -1; + //get appropriate PINSEL register + volatile uint32_t * pinsel_reg = (pin_port == 0 && pin_port_pin <= 15) ? &LPC_PINCON->PINSEL0 : + (pin_port == 0) ? &LPC_PINCON->PINSEL1 : + (pin_port == 1 && pin_port_pin <= 15) ? &LPC_PINCON->PINSEL2 : + pin_port == 1 ? &LPC_PINCON->PINSEL3 : + pin_port == 2 ? &LPC_PINCON->PINSEL4 : + pin_port == 3 ? &LPC_PINCON->PINSEL7 : &LPC_PINCON->PINSEL9; + + uint8_t pinsel_start_bit = pin_port_pin > 15 ? 2 * (pin_port_pin - 16) : 2 * pin_port_pin; + uint8_t pin_mode = (uint8_t) ((*pinsel_reg >> pinsel_start_bit) & 0x3); + + uint32_t * FIO_reg[5] PROGMEM = {(uint32_t*) 0x2009C000,(uint32_t*) 0x2009C020,(uint32_t*) 0x2009C040,(uint32_t*) 0x2009C060,(uint32_t*) 0x2009C080}; + pin_Re_ARM.output = (*FIO_reg[pin_map[pin].port] >> pin_map[pin].pin) & 1; //input/output state except if active ADC + + if (pin_mode) { // if function/mode/code value not 0 then could be an active analog channel + if (ADC_pin_mode == pin_mode) { // found an active analog pin + pin_Re_ARM.output = 0; + pin_Re_ARM.analog = 1; + } + } +} + +/** + * translation of routines & variables used by pinsDebug.h + */ + +#define GET_PIN_INFO(pin) get_pin_info(pin) +#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) +#define GET_PINMODE(pin) pin_Re_ARM.output +#define digitalRead_mod(p) digitalRead(p) +#define digitalPinToPort_DEBUG(p) 0 +#define digitalPinToBitMask_DEBUG(pin) 0 +#define PRINT_PORT(p) SERIAL_ECHO_SP(10); +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define NAME_FORMAT(p) PSTR("%-##p##s") +// #define PRINT_ARRAY_NAME(x) do {sprintf_P(buffer, NAME_FORMAT(MAX_NAME_LENGTH) , pin_array[x].name); SERIAL_ECHO(buffer);} while (0) +#define PRINT_ARRAY_NAME(x) do {sprintf_P(buffer, PSTR("%-35s") , pin_array[x].name); SERIAL_ECHO(buffer);} while (0) +#define GET_ARRAY_IS_DIGITAL(x) !pin_Re_ARM.analog \ No newline at end of file diff --git a/Marlin/src/HAL/HAL_pinsDebug.h b/Marlin/src/HAL/HAL_pinsDebug.h index 48c95438e..fc3ef95fa 100644 --- a/Marlin/src/HAL/HAL_pinsDebug.h +++ b/Marlin/src/HAL/HAL_pinsDebug.h @@ -28,6 +28,8 @@ #include "HAL_DUE/HAL_pinsDebug_Due.h" #elif IS_32BIT_TEENSY #include "HAL_TEENSY35_36/HAL_pinsDebug_Teensy.h" +#elif defined(TARGET_LPC1768) + #include "HAL_LPC1768/HAL_pinsDebug.h" #else #error Unsupported Platform! #endif