Merge pull request #3110 from prusa3d/MK3_3.10.0
merge MK3_3.10.0 into MK3
This commit is contained in:
commit
10de97c042
@ -16,8 +16,8 @@ extern uint16_t nPrinterType;
|
||||
extern PGM_P sPrinterName;
|
||||
|
||||
// Firmware version
|
||||
#define FW_VERSION "3.9.3"
|
||||
#define FW_COMMIT_NR 3556
|
||||
#define FW_VERSION "3.10.0-RC2"
|
||||
#define FW_COMMIT_NR 4104
|
||||
// FW_VERSION_UNKNOWN means this is an unofficial build.
|
||||
// The firmware should only be checked into github with this symbol.
|
||||
#define FW_DEV_VERSION FW_VERSION_UNKNOWN
|
||||
|
@ -387,6 +387,12 @@ const unsigned int dropsegments=5; //everything with less than this number of st
|
||||
*/
|
||||
#define EXTENDED_CAPABILITIES_REPORT
|
||||
|
||||
/**
|
||||
* Enable M120/M121 G-code commands
|
||||
*
|
||||
*/
|
||||
//#define M120_M121_ENABLED //Be careful enabling and using these G-code commands.
|
||||
|
||||
//===========================================================================
|
||||
//============================= Define Defines ============================
|
||||
//===========================================================================
|
||||
|
@ -363,8 +363,8 @@ extern bool mmu_print_saved;
|
||||
|
||||
//estimated time to end of the print
|
||||
extern uint8_t print_percent_done_normal;
|
||||
extern uint16_t print_time_remaining_normal;
|
||||
extern uint8_t print_percent_done_silent;
|
||||
extern uint16_t print_time_remaining_normal;
|
||||
extern uint16_t print_time_remaining_silent;
|
||||
extern uint16_t print_time_to_change_normal;
|
||||
extern uint16_t print_time_to_change_silent;
|
||||
@ -376,7 +376,7 @@ extern uint16_t gcode_in_progress;
|
||||
|
||||
extern LongTimer safetyTimer;
|
||||
|
||||
#define PRINT_PERCENT_DONE_INIT 0xff
|
||||
#define PRINT_PERCENT_DONE_INIT 0xff
|
||||
#define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == CustomMsg::TempCal) || saved_printing || (lcd_commands_type == LcdCommands::Layer1Cal) || mmu_print_saved || homing_flag || mesh_bed_leveling_flag)
|
||||
|
||||
//! Beware - mcode_in_progress is set as soon as the command gets really processed,
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -178,14 +178,17 @@ eof_or_fail:
|
||||
}
|
||||
|
||||
bool SdFile::gfEnsureBlock(){
|
||||
if ( vol_->cacheRawBlock(gfBlock, SdVolume::CACHE_FOR_READ)){
|
||||
// this comparison is heavy-weight, especially when there is another one inside cacheRawBlock
|
||||
// but it is necessary to avoid computing of terminateOfs if not needed
|
||||
if( gfBlock != vol_->cacheBlockNumber_ ){
|
||||
if ( ! vol_->cacheRawBlock(gfBlock, SdVolume::CACHE_FOR_READ)){
|
||||
return false;
|
||||
}
|
||||
// terminate with a '\n'
|
||||
const uint16_t terminateOfs = fileSize_ - gfOffset;
|
||||
const uint32_t terminateOfs = fileSize_ - gfOffset;
|
||||
vol_->cache()->data[ terminateOfs < 512 ? terminateOfs : 512 ] = '\n';
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SdFile::gfComputeNextFileBlock() {
|
||||
|
@ -59,9 +59,12 @@ public:
|
||||
|
||||
FORCE_INLINE bool isFileOpen() { return file.isOpen(); }
|
||||
bool eof() { return sdpos>=filesize; }
|
||||
// There may be a potential performance problem - when the comment reading fails, sdpos points to the last correctly read character.
|
||||
// However, repeated reading (e.g. after power panic) the comment will be read again - it should survive correctly, it will just take a few moments to skip
|
||||
FORCE_INLINE int16_t getFilteredGcodeChar() { sdpos = file.curPosition();return (int16_t)file.readFilteredGcode();};
|
||||
FORCE_INLINE int16_t getFilteredGcodeChar()
|
||||
{
|
||||
int16_t c = (int16_t)file.readFilteredGcode();
|
||||
sdpos = file.curPosition();
|
||||
return c;
|
||||
};
|
||||
void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);};
|
||||
FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;};
|
||||
FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;};
|
||||
|
@ -600,7 +600,7 @@ void get_command()
|
||||
}
|
||||
// The new command buffer could be updated non-atomically, because it is not yet considered
|
||||
// to be inside the active queue.
|
||||
sd_count.value = (card.get_sdpos()+1) - sdpos_atomic;
|
||||
sd_count.value = card.get_sdpos() - sdpos_atomic;
|
||||
cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_SDCARD;
|
||||
cmdbuffer[bufindw+1] = sd_count.lohi.lo;
|
||||
cmdbuffer[bufindw+2] = sd_count.lohi.hi;
|
||||
@ -625,7 +625,7 @@ void get_command()
|
||||
// or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz.
|
||||
++ buflen;
|
||||
bufindw += len;
|
||||
sdpos_atomic = card.get_sdpos()+1;
|
||||
sdpos_atomic = card.get_sdpos();
|
||||
if (bufindw == sizeof(cmdbuffer))
|
||||
bufindw = 0;
|
||||
sei();
|
||||
|
@ -54,14 +54,6 @@
|
||||
#define TMC2130_SPCR SPI_SPCR(TMC2130_SPI_RATE, 1, 1, 1, 0)
|
||||
#define TMC2130_SPSR SPI_SPSR(TMC2130_SPI_RATE)
|
||||
|
||||
//W25X20CL configuration
|
||||
//pinout:
|
||||
#define W25X20CL_PIN_CS 32
|
||||
//spi:
|
||||
#define W25X20CL_SPI_RATE 0 // fosc/4 = 4MHz
|
||||
#define W25X20CL_SPCR SPI_SPCR(W25X20CL_SPI_RATE, 1, 1, 1, 0)
|
||||
#define W25X20CL_SPSR SPI_SPSR(W25X20CL_SPI_RATE)
|
||||
|
||||
//LANG - Multi-language support
|
||||
//#define LANG_MODE 0 // primary language only
|
||||
#define LANG_MODE 1 // sec. language support
|
||||
|
@ -97,6 +97,9 @@ void eeprom_init()
|
||||
#ifdef PINDA_TEMP_COMP
|
||||
if (eeprom_read_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_PINDA_TEMP_COMPENSATION, 0);
|
||||
#endif //PINDA_TEMP_COMP
|
||||
|
||||
if (eeprom_read_dword((uint32_t*)EEPROM_JOB_ID) == EEPROM_EMPTY_VALUE32)
|
||||
eeprom_update_dword((uint32_t*)EEPROM_JOB_ID, 0);
|
||||
}
|
||||
|
||||
//! @brief Get default sheet name for index
|
||||
|
@ -324,6 +324,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
|
||||
| 0x0D11 3345 | float | EEPROM_UVLO_ACCELL | ??? | ff ff ff ffh | Power panic saved normal acceleration | ??? | D3 Ax0d11 C4
|
||||
| 0x0D0D 3341 | float | EEPROM_UVLO_RETRACT_ACCELL | ??? | ff ff ff ffh | Power panic saved retract acceleration | ??? | D3 Ax0d0d C4
|
||||
| 0x0D09 3337 | float | EEPROM_UVLO_TRAVEL_ACCELL | ??? | ff ff ff ffh | Power panic saved travel acceleration | ??? | D3 Ax0d09 C4
|
||||
| 0x0D05 3333 | uint32_t | EEPROM_JOB_ID | ??? | 00 00 00 00h | Job ID used by host software | D3 only | D3 Ax0d05 C4
|
||||
|
||||
| Address begin | Bit/Type | Name | Valid values | Default/FactoryReset | Description | Gcode/Function| Debug code
|
||||
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--:
|
||||
@ -337,6 +338,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
|
||||
|
||||
#define EEPROM_EMPTY_VALUE 0xFF
|
||||
#define EEPROM_EMPTY_VALUE16 0xFFFF
|
||||
#define EEPROM_EMPTY_VALUE32 0xFFFFFFFFl
|
||||
// The total size of the EEPROM is
|
||||
// 4096 for the Atmega2560
|
||||
#define EEPROM_TOP 4096
|
||||
@ -534,8 +536,10 @@ static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE);
|
||||
#define EEPROM_UVLO_RETRACT_ACCELL (EEPROM_UVLO_ACCELL-4) // float
|
||||
#define EEPROM_UVLO_TRAVEL_ACCELL (EEPROM_UVLO_RETRACT_ACCELL-4) // float
|
||||
|
||||
#define EEPROM_JOB_ID (EEPROM_UVLO_TRAVEL_ACCELL-4) //uint32_t
|
||||
|
||||
//This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items.
|
||||
#define EEPROM_LAST_ITEM EEPROM_UVLO_TRAVEL_ACCELL
|
||||
#define EEPROM_LAST_ITEM EEPROM_JOB_ID
|
||||
// !!!!!
|
||||
// !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!!
|
||||
// !!!!!
|
||||
|
@ -7,9 +7,9 @@
|
||||
#include "Configuration.h"
|
||||
#include "pins.h"
|
||||
|
||||
#ifdef W25X20CL
|
||||
#include "w25x20cl.h"
|
||||
#endif //W25X20CL
|
||||
#ifdef XFLASH
|
||||
#include "xflash.h"
|
||||
#endif //XFLASH
|
||||
|
||||
// Currently active language selection.
|
||||
uint8_t lang_selected = 0;
|
||||
@ -54,7 +54,7 @@ uint8_t lang_select(uint8_t lang)
|
||||
lang_table = 0;
|
||||
lang_selected = lang;
|
||||
}
|
||||
#ifdef W25X20CL
|
||||
#ifdef XFLASH
|
||||
if (lang_get_code(lang) == lang_get_code(LANG_ID_SEC)) lang = LANG_ID_SEC;
|
||||
if (lang == LANG_ID_SEC) //current secondary language
|
||||
{
|
||||
@ -68,7 +68,7 @@ uint8_t lang_select(uint8_t lang)
|
||||
}
|
||||
}
|
||||
}
|
||||
#else //W25X20CL
|
||||
#else //XFLASH
|
||||
if (lang == LANG_ID_SEC)
|
||||
{
|
||||
uint16_t table = _SEC_LANG_TABLE;
|
||||
@ -82,7 +82,7 @@ uint8_t lang_select(uint8_t lang)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif //W25X20CL
|
||||
#endif //XFLASH
|
||||
if (lang_selected == lang)
|
||||
{
|
||||
eeprom_update_byte((unsigned char*)EEPROM_LANG, lang_selected);
|
||||
@ -107,19 +107,19 @@ uint8_t lang_get_count()
|
||||
{
|
||||
if (pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE))) == 0xffffffff)
|
||||
return 1; //signature not set - only primary language will be available
|
||||
#ifdef W25X20CL
|
||||
W25X20CL_SPI_ENTER();
|
||||
#ifdef XFLASH
|
||||
XFLASH_SPI_ENTER();
|
||||
uint8_t count = 2; //count = 1+n (primary + secondary + all in xflash)
|
||||
uint32_t addr = 0x00000; //start of xflash
|
||||
lang_table_header_t header; //table header structure
|
||||
while (1)
|
||||
{
|
||||
w25x20cl_rd_data(addr, (uint8_t*)&header, sizeof(lang_table_header_t)); //read table header from xflash
|
||||
xflash_rd_data(addr, (uint8_t*)&header, sizeof(lang_table_header_t)); //read table header from xflash
|
||||
if (header.magic != LANG_MAGIC) break; //break if magic not valid
|
||||
addr += header.size; //calc address of next table
|
||||
count++; //inc counter
|
||||
}
|
||||
#else //W25X20CL
|
||||
#else //XFLASH
|
||||
uint16_t table = _SEC_LANG_TABLE;
|
||||
uint8_t count = 1; //count = 1 (primary)
|
||||
while (pgm_read_dword(((uint32_t*)table)) == LANG_MAGIC) //magic valid
|
||||
@ -127,14 +127,14 @@ uint8_t lang_get_count()
|
||||
table += pgm_read_word((uint16_t*)(table + 4));
|
||||
count++;
|
||||
}
|
||||
#endif //W25X20CL
|
||||
#endif //XFLASH
|
||||
return count;
|
||||
}
|
||||
|
||||
uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* offset)
|
||||
{
|
||||
if (lang == LANG_ID_PRI) return 0; //primary lang not supported for this function
|
||||
#ifdef W25X20CL
|
||||
#ifdef XFLASH
|
||||
if (lang == LANG_ID_SEC)
|
||||
{
|
||||
uint16_t ui = _SEC_LANG_TABLE; //table pointer
|
||||
@ -142,18 +142,18 @@ uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* off
|
||||
if (offset) *offset = ui;
|
||||
return (header->magic == LANG_MAGIC)?1:0; //return 1 if magic valid
|
||||
}
|
||||
W25X20CL_SPI_ENTER();
|
||||
XFLASH_SPI_ENTER();
|
||||
uint32_t addr = 0x00000; //start of xflash
|
||||
lang--;
|
||||
while (1)
|
||||
{
|
||||
w25x20cl_rd_data(addr, (uint8_t*)(header), sizeof(lang_table_header_t)); //read table header from xflash
|
||||
xflash_rd_data(addr, (uint8_t*)(header), sizeof(lang_table_header_t)); //read table header from xflash
|
||||
if (header->magic != LANG_MAGIC) break; //break if not valid
|
||||
if (offset) *offset = addr;
|
||||
if (--lang == 0) return 1;
|
||||
addr += header->size; //calc address of next table
|
||||
}
|
||||
#else //W25X20CL
|
||||
#else //XFLASH
|
||||
if (lang == LANG_ID_SEC)
|
||||
{
|
||||
uint16_t ui = _SEC_LANG_TABLE; //table pointer
|
||||
@ -161,32 +161,32 @@ uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* off
|
||||
if (offset) *offset = ui;
|
||||
return (header->magic == LANG_MAGIC)?1:0; //return 1 if magic valid
|
||||
}
|
||||
#endif //W25X20CL
|
||||
#endif //XFLASH
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint16_t lang_get_code(uint8_t lang)
|
||||
{
|
||||
if (lang == LANG_ID_PRI) return LANG_CODE_EN; //primary lang = EN
|
||||
#ifdef W25X20CL
|
||||
#ifdef XFLASH
|
||||
if (lang == LANG_ID_SEC)
|
||||
{
|
||||
uint16_t ui = _SEC_LANG_TABLE; //table pointer
|
||||
if (pgm_read_dword(((uint32_t*)(ui + 0))) != LANG_MAGIC) return LANG_CODE_XX; //magic not valid
|
||||
return pgm_read_word(((uint32_t*)(ui + 10))); //return lang code from progmem
|
||||
}
|
||||
W25X20CL_SPI_ENTER();
|
||||
XFLASH_SPI_ENTER();
|
||||
uint32_t addr = 0x00000; //start of xflash
|
||||
lang_table_header_t header; //table header structure
|
||||
lang--;
|
||||
while (1)
|
||||
{
|
||||
w25x20cl_rd_data(addr, (uint8_t*)&header, sizeof(lang_table_header_t)); //read table header from xflash
|
||||
xflash_rd_data(addr, (uint8_t*)&header, sizeof(lang_table_header_t)); //read table header from xflash
|
||||
if (header.magic != LANG_MAGIC) break; //break if not valid
|
||||
if (--lang == 0) return header.code;
|
||||
addr += header.size; //calc address of next table
|
||||
}
|
||||
#else //W25X20CL
|
||||
#else //XFLASH
|
||||
uint16_t table = _SEC_LANG_TABLE;
|
||||
uint8_t count = 1; //count = 1 (primary)
|
||||
while (pgm_read_dword((uint32_t*)table) == LANG_MAGIC) //magic valid
|
||||
@ -195,7 +195,7 @@ uint16_t lang_get_code(uint8_t lang)
|
||||
table += pgm_read_word((uint16_t*)(table + 4));
|
||||
count++;
|
||||
}
|
||||
#endif //W25X20CL
|
||||
#endif //XFLASH
|
||||
return LANG_CODE_XX;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
#include "Marlin.h"
|
||||
#include "Configuration.h"
|
||||
#include "ConfigurationStore.h"
|
||||
#include "language.h"
|
||||
@ -1065,7 +1064,7 @@ error:
|
||||
}
|
||||
|
||||
#ifdef NEW_XYZCAL
|
||||
bool xyzcal_find_bed_induction_sensor_point_xy();
|
||||
BedSkewOffsetDetectionResultType xyzcal_find_bed_induction_sensor_point_xy();
|
||||
#endif //NEW_XYZCAL
|
||||
// Search around the current_position[X,Y],
|
||||
// look for the induction sensor response.
|
||||
@ -1081,7 +1080,7 @@ bool xyzcal_find_bed_induction_sensor_point_xy();
|
||||
#endif //HEATBED_V2
|
||||
|
||||
#ifdef HEATBED_V2
|
||||
bool find_bed_induction_sensor_point_xy(int
|
||||
BedSkewOffsetDetectionResultType find_bed_induction_sensor_point_xy(int
|
||||
#if !defined (NEW_XYZCAL) && defined (SUPPORT_VERBOSITY)
|
||||
verbosity_level
|
||||
#endif
|
||||
@ -1137,7 +1136,7 @@ bool find_bed_induction_sensor_point_xy(int
|
||||
|
||||
// go_xyz(current_position[X_AXIS], current_position[Y_AXIS], MESH_HOME_Z_SEARCH, homing_feedrate[Z_AXIS]/60);
|
||||
go_xyz(x0, y0, current_position[Z_AXIS], feedrate);
|
||||
// Continously lower the Z axis.
|
||||
// Continuously lower the Z axis.
|
||||
endstops_hit_on_purpose();
|
||||
enable_z_endstop(true);
|
||||
bool direction = false;
|
||||
@ -1335,7 +1334,7 @@ bool find_bed_induction_sensor_point_xy(int
|
||||
#endif //NEW_XYZCAL
|
||||
}
|
||||
#else //HEATBED_V2
|
||||
bool find_bed_induction_sensor_point_xy(int verbosity_level)
|
||||
BedSkewOffsetDetectionResultType find_bed_induction_sensor_point_xy(int verbosity_level)
|
||||
{
|
||||
#ifdef NEW_XYZCAL
|
||||
return xyzcal_find_bed_induction_sensor_point_xy();
|
||||
@ -1531,7 +1530,9 @@ bool find_bed_induction_sensor_point_xy(int verbosity_level)
|
||||
}
|
||||
|
||||
enable_z_endstop(false);
|
||||
return found;
|
||||
if (found)
|
||||
return BED_SKEW_OFFSET_DETECTION_POINT_FOUND;
|
||||
return BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND;
|
||||
#endif //NEW_XYZCAL
|
||||
}
|
||||
|
||||
@ -2238,9 +2239,15 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level
|
||||
|
||||
// Collect the rear 2x3 points.
|
||||
current_position[Z_AXIS] = MESH_HOME_Z_SEARCH + FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP * iteration * 0.3;
|
||||
for (int k = 0; k < 4; ++k) {
|
||||
// Don't let the manage_inactivity() function remove power from the motors.
|
||||
refresh_cmd_timeout();
|
||||
|
||||
/// Retry point scanning if a point with bad data appears.
|
||||
/// Bad data could be cause by "cold" sensor.
|
||||
/// This behavior vanishes after few point scans so retry will help.
|
||||
for (int retries = 0; retries <= 1; ++retries) {
|
||||
bool retry = false;
|
||||
for (int k = 0; k < 4; ++k) {
|
||||
// Don't let the manage_inactivity() function remove power from the motors.
|
||||
refresh_cmd_timeout();
|
||||
#ifdef MESH_BED_CALIBRATION_SHOW_LCD
|
||||
lcd_set_cursor(0, next_line);
|
||||
lcd_print(k + 1);
|
||||
@ -2304,8 +2311,19 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level
|
||||
if (verbosity_level >= 10)
|
||||
delay_keep_alive(3000);
|
||||
#endif // SUPPORT_VERBOSITY
|
||||
if (!find_bed_induction_sensor_point_xy(verbosity_level))
|
||||
return BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND;
|
||||
|
||||
BedSkewOffsetDetectionResultType result;
|
||||
result = find_bed_induction_sensor_point_xy(verbosity_level);
|
||||
switch(result){
|
||||
case BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND:
|
||||
return BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND;
|
||||
case BED_SKEW_OFFSET_DETECTION_POINT_SCAN_FAILED:
|
||||
retry = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
#ifndef NEW_XYZCAL
|
||||
#ifndef HEATBED_V2
|
||||
|
||||
@ -2380,6 +2398,9 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level
|
||||
}
|
||||
#endif // SUPPORT_VERBOSITY
|
||||
}
|
||||
if (!retry)
|
||||
break;
|
||||
}
|
||||
DBG(_n("All 4 calibration points found.\n"));
|
||||
delay_keep_alive(0); //manage_heater, reset watchdog, manage inactivity
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
#ifndef MESH_BED_CALIBRATION_H
|
||||
#define MESH_BED_CALIBRATION_H
|
||||
#pragma once
|
||||
|
||||
#include "Marlin.h"
|
||||
|
||||
#define BED_ZERO_REF_X (- 22.f + X_PROBE_OFFSET_FROM_EXTRUDER) // -22 + 23 = 1
|
||||
#define BED_ZERO_REF_Y (- 0.6f + Y_PROBE_OFFSET_FROM_EXTRUDER + 4.f) // -0.6 + 5 + 4 = 8.4
|
||||
@ -145,11 +146,6 @@ inline bool world2machine_clamp(float &x, float &y)
|
||||
machine2world(tmpx, tmpy, x, y);
|
||||
return clamped;
|
||||
}
|
||||
|
||||
bool find_bed_induction_sensor_point_z(float minimum_z = -10.f, uint8_t n_iter = 3, int verbosity_level = 0);
|
||||
bool find_bed_induction_sensor_point_xy(int verbosity_level = 0);
|
||||
void go_home_with_z_lift();
|
||||
|
||||
/**
|
||||
* @brief Bed skew and offest detection result
|
||||
*
|
||||
@ -159,8 +155,10 @@ void go_home_with_z_lift();
|
||||
|
||||
enum BedSkewOffsetDetectionResultType {
|
||||
// Detection failed, some point was not found.
|
||||
BED_SKEW_OFFSET_DETECTION_POINT_FOUND = 0, //!< Point found
|
||||
BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND = -1, //!< Point not found.
|
||||
BED_SKEW_OFFSET_DETECTION_FITTING_FAILED = -2, //!< Fitting failed
|
||||
BED_SKEW_OFFSET_DETECTION_POINT_SCAN_FAILED = -3, //!< Point scan failed, try again
|
||||
|
||||
// Detection finished with success.
|
||||
BED_SKEW_OFFSET_DETECTION_PERFECT = 0, //!< Perfect.
|
||||
@ -168,6 +166,10 @@ enum BedSkewOffsetDetectionResultType {
|
||||
BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME = 2 //!< Extremely skewed.
|
||||
};
|
||||
|
||||
bool find_bed_induction_sensor_point_z(float minimum_z = -10.f, uint8_t n_iter = 3, int verbosity_level = 0);
|
||||
BedSkewOffsetDetectionResultType find_bed_induction_sensor_point_xy(int verbosity_level = 0);
|
||||
void go_home_with_z_lift();
|
||||
|
||||
extern BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level, uint8_t &too_far_mask);
|
||||
#ifndef NEW_XYZCAL
|
||||
extern BedSkewOffsetDetectionResultType improve_bed_offset_and_skew(int8_t method, int8_t verbosity_level, uint8_t &too_far_mask);
|
||||
@ -213,4 +215,3 @@ extern void mbl_settings_init();
|
||||
|
||||
extern bool mbl_point_measurement_valid(uint8_t ix, uint8_t iy, uint8_t meas_points, bool zigzag);
|
||||
extern void mbl_interpolation(uint8_t meas_points);
|
||||
#endif /* MESH_BED_CALIBRATION_H */
|
||||
|
@ -1,6 +0,0 @@
|
||||
#ifndef OPTIBOOT_W25X20CL_H
|
||||
#define OPTIBOOT_W25X20CL_H
|
||||
|
||||
extern uint8_t optiboot_w25x20cl_enter();
|
||||
|
||||
#endif /* OPTIBOOT_W25X20CL_H */
|
@ -4,7 +4,7 @@
|
||||
// Licence GLP 2 or later.
|
||||
|
||||
#include "Marlin.h"
|
||||
#include "w25x20cl.h"
|
||||
#include "xflash.h"
|
||||
#include "stk500.h"
|
||||
#include "bootapp.h"
|
||||
#include <avr/wdt.h>
|
||||
@ -16,14 +16,14 @@ static unsigned const int __attribute__((section(".version")))
|
||||
optiboot_version = 256*(OPTIBOOT_MAJVER + OPTIBOOT_CUSTOMVER) + OPTIBOOT_MINVER;
|
||||
|
||||
#if 0
|
||||
#define W25X20CL_SIGNATURE_0 9
|
||||
#define W25X20CL_SIGNATURE_1 8
|
||||
#define W25X20CL_SIGNATURE_2 7
|
||||
#define XFLASH_SIGNATURE_0 9
|
||||
#define XFLASH_SIGNATURE_1 8
|
||||
#define XFLASH_SIGNATURE_2 7
|
||||
#else
|
||||
//FIXME this is a signature of ATmega2560!
|
||||
#define W25X20CL_SIGNATURE_0 0x1E
|
||||
#define W25X20CL_SIGNATURE_1 0x98
|
||||
#define W25X20CL_SIGNATURE_2 0x01
|
||||
#define XFLASH_SIGNATURE_0 0x1E
|
||||
#define XFLASH_SIGNATURE_1 0x98
|
||||
#define XFLASH_SIGNATURE_2 0x01
|
||||
#endif
|
||||
|
||||
#define RECV_READY ((UCSR0A & _BV(RXC0)) != 0)
|
||||
@ -78,7 +78,7 @@ extern struct block_t *block_buffer;
|
||||
//! @brief Enter an STK500 compatible Optiboot boot loader waiting for flashing the languages to an external flash memory.
|
||||
//! @return 1 if "start\n" was not sent. Optiboot was skipped
|
||||
//! @return 0 if "start\n" was sent. Optiboot ran normally. No need to send "start\n" in setup()
|
||||
uint8_t optiboot_w25x20cl_enter()
|
||||
uint8_t optiboot_xflash_enter()
|
||||
{
|
||||
// Make sure to check boot_app_magic as well. Since these bootapp flags are located right in the middle of the stack,
|
||||
// they can be unintentionally changed. As a workaround to the language upload problem, do not only check for one bit if it's set,
|
||||
@ -154,7 +154,7 @@ uint8_t optiboot_w25x20cl_enter()
|
||||
}
|
||||
|
||||
spi_init();
|
||||
w25x20cl_init();
|
||||
xflash_init();
|
||||
wdt_disable();
|
||||
|
||||
/* Forever loop: exits by causing WDT reset */
|
||||
@ -254,16 +254,16 @@ uint8_t optiboot_w25x20cl_enter()
|
||||
// During a single bootloader run, only erase a 64kB block once.
|
||||
// An 8bit bitmask 'pages_erased' covers 512kB of FLASH memory.
|
||||
if ((address == 0) && (pages_erased & (1 << (addr >> 16))) == 0) {
|
||||
w25x20cl_wait_busy();
|
||||
w25x20cl_enable_wr();
|
||||
w25x20cl_block64_erase(addr);
|
||||
xflash_wait_busy();
|
||||
xflash_enable_wr();
|
||||
xflash_block64_erase(addr);
|
||||
pages_erased |= (1 << (addr >> 16));
|
||||
}
|
||||
w25x20cl_wait_busy();
|
||||
w25x20cl_enable_wr();
|
||||
w25x20cl_page_program(addr, buff, savelength);
|
||||
w25x20cl_wait_busy();
|
||||
w25x20cl_disable_wr();
|
||||
xflash_wait_busy();
|
||||
xflash_enable_wr();
|
||||
xflash_page_program(addr, buff, savelength);
|
||||
xflash_wait_busy();
|
||||
xflash_disable_wr();
|
||||
}
|
||||
}
|
||||
/* Read memory block mode, length is big endian. */
|
||||
@ -279,8 +279,8 @@ uint8_t optiboot_w25x20cl_enter()
|
||||
// Read the destination type. It should always be 'F' as flash. It is not checked.
|
||||
(void)getch();
|
||||
verifySpace();
|
||||
w25x20cl_wait_busy();
|
||||
w25x20cl_rd_data(addr, buff, length);
|
||||
xflash_wait_busy();
|
||||
xflash_rd_data(addr, buff, length);
|
||||
for (i = 0; i < length; ++ i)
|
||||
putch(buff[i]);
|
||||
}
|
||||
@ -288,9 +288,9 @@ uint8_t optiboot_w25x20cl_enter()
|
||||
else if(ch == STK_READ_SIGN) {
|
||||
// READ SIGN - return what Avrdude wants to hear
|
||||
verifySpace();
|
||||
putch(W25X20CL_SIGNATURE_0);
|
||||
putch(W25X20CL_SIGNATURE_1);
|
||||
putch(W25X20CL_SIGNATURE_2);
|
||||
putch(XFLASH_SIGNATURE_0);
|
||||
putch(XFLASH_SIGNATURE_1);
|
||||
putch(XFLASH_SIGNATURE_2);
|
||||
}
|
||||
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
|
||||
// Adaboot no-wait mod
|
6
Firmware/optiboot_xflash.h
Normal file
6
Firmware/optiboot_xflash.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef OPTIBOOT_XFLASH_H
|
||||
#define OPTIBOOT_XFLASH_H
|
||||
|
||||
extern uint8_t optiboot_xflash_enter();
|
||||
|
||||
#endif /* OPTIBOOT_XFLASH_H */
|
@ -15,9 +15,11 @@
|
||||
#define AMBIENT_THERMISTOR
|
||||
#define PINDA_THERMISTOR
|
||||
|
||||
#define W25X20CL // external 256kB flash
|
||||
#define XFLASH // external 256kB flash
|
||||
#define BOOTAPP // bootloader support
|
||||
|
||||
#define XFLASH_PIN_CS 32
|
||||
|
||||
#define X_TMC2130_CS 41
|
||||
#define X_TMC2130_DIAG 64 // !!! changed from 40 (EINY03)
|
||||
#define X_STEP_PIN 37
|
||||
|
@ -68,8 +68,9 @@ uint8_t tmc2130_sg_diag_mask = 0x00;
|
||||
uint8_t tmc2130_sg_crash = 0;
|
||||
uint16_t tmc2130_sg_err[4] = {0, 0, 0, 0};
|
||||
uint16_t tmc2130_sg_cnt[4] = {0, 0, 0, 0};
|
||||
#ifdef DEBUG_CRASHDET_COUNTERS
|
||||
bool tmc2130_sg_change = false;
|
||||
|
||||
#endif
|
||||
|
||||
bool skip_debug_msg = false;
|
||||
|
||||
@ -255,7 +256,9 @@ void tmc2130_st_isr()
|
||||
if (tmc2130_sg_cnt[axis] < tmc2130_sg_err[axis])
|
||||
{
|
||||
tmc2130_sg_cnt[axis] = tmc2130_sg_err[axis];
|
||||
#ifdef DEBUG_CRASHDET_COUNTERS
|
||||
tmc2130_sg_change = true;
|
||||
#endif
|
||||
uint8_t sg_thr = 64;
|
||||
// if (axis == Y_AXIS) sg_thr = 64;
|
||||
if (tmc2130_sg_err[axis] >= sg_thr)
|
||||
@ -409,7 +412,9 @@ void tmc2130_check_overtemp()
|
||||
|
||||
}
|
||||
checktime = _millis();
|
||||
#ifdef DEBUG_CRASHDET_COUNTERS
|
||||
tmc2130_sg_change = true;
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG_CRASHDET_COUNTERS
|
||||
if (tmc2130_sg_change)
|
||||
|
@ -510,9 +510,9 @@ void lcdui_print_time(void)
|
||||
//if remaining print time estimation is available print it else print elapsed time
|
||||
int chars = 0;
|
||||
if (PRINTER_ACTIVE) {
|
||||
uint16_t print_t = 0;
|
||||
uint16_t print_tr = 0;
|
||||
uint16_t print_tc = 0;
|
||||
uint16_t print_t = PRINT_TIME_REMAINING_INIT;
|
||||
uint16_t print_tr = PRINT_TIME_REMAINING_INIT;
|
||||
uint16_t print_tc = PRINT_TIME_REMAINING_INIT;
|
||||
char suff = ' ';
|
||||
char suff_doubt = ' ';
|
||||
|
||||
@ -542,12 +542,12 @@ void lcdui_print_time(void)
|
||||
|
||||
clock_interval++;
|
||||
|
||||
if (print_tc != 0 && clock_interval > CLOCK_INTERVAL_TIME) {
|
||||
if (print_tc != PRINT_TIME_REMAINING_INIT && clock_interval > CLOCK_INTERVAL_TIME) {
|
||||
print_t = print_tc;
|
||||
suff = 'C';
|
||||
} else
|
||||
//#endif //CLOCK_INTERVAL_TIME
|
||||
if (print_tr != 0) {
|
||||
if (print_tr != PRINT_TIME_REMAINING_INIT) {
|
||||
print_t = print_tr;
|
||||
suff = 'R';
|
||||
} else
|
||||
@ -4361,7 +4361,7 @@ void menu_setlang(unsigned char lang)
|
||||
}
|
||||
|
||||
#ifdef COMMUNITY_LANG_SUPPORT
|
||||
#ifdef W25X20CL
|
||||
#ifdef XFLASH
|
||||
static void lcd_community_language_menu()
|
||||
{
|
||||
MENU_BEGIN();
|
||||
@ -4375,7 +4375,7 @@ static void lcd_community_language_menu()
|
||||
}
|
||||
MENU_END();
|
||||
}
|
||||
#endif //W25X20CL
|
||||
#endif //XFLASH
|
||||
#endif //COMMUNITY_LANG_SUPPORT && W52X20CL
|
||||
|
||||
|
||||
@ -4390,7 +4390,7 @@ static void lcd_language_menu()
|
||||
return;
|
||||
}
|
||||
uint8_t cnt = lang_get_count();
|
||||
#ifdef W25X20CL
|
||||
#ifdef XFLASH
|
||||
if (cnt == 2) //display secondary language in case of clear xflash
|
||||
{
|
||||
if (menu_item_text_P(lang_get_name_by_code(lang_get_code(1))))
|
||||
@ -4401,9 +4401,9 @@ static void lcd_language_menu()
|
||||
}
|
||||
else
|
||||
for (int i = 2; i < 8; i++) //skip seconday language - solved in lang_select (MK3) 'i < 8' for 7 official languages
|
||||
#else //W25X20CL
|
||||
#else //XFLASH
|
||||
for (int i = 1; i < cnt; i++) //all seconday languages (MK2/25)
|
||||
#endif //W25X20CL
|
||||
#endif //XFLASH
|
||||
if (menu_item_text_P(lang_get_name_by_code(lang_get_code(i))))
|
||||
{
|
||||
menu_setlang(i);
|
||||
@ -4411,9 +4411,9 @@ static void lcd_language_menu()
|
||||
}
|
||||
|
||||
#ifdef COMMUNITY_LANG_SUPPORT
|
||||
#ifdef W25X20CL
|
||||
#ifdef XFLASH
|
||||
MENU_ITEM_SUBMENU_P(_T(MSG_COMMUNITY_MADE), lcd_community_language_menu); ////MSG_COMMUNITY_MADE c=18
|
||||
#endif //W25X20CL
|
||||
#endif //XFLASH
|
||||
#endif //COMMUNITY_LANG_SUPPORT && W52X20CL
|
||||
|
||||
MENU_END();
|
||||
@ -6323,15 +6323,15 @@ unsigned char lcd_choose_color() {
|
||||
|
||||
}
|
||||
|
||||
#include "w25x20cl.h"
|
||||
#include "xflash.h"
|
||||
|
||||
#ifdef LCD_TEST
|
||||
static void lcd_test_menu()
|
||||
{
|
||||
W25X20CL_SPI_ENTER();
|
||||
w25x20cl_enable_wr();
|
||||
w25x20cl_chip_erase();
|
||||
w25x20cl_disable_wr();
|
||||
XFLASH_SPI_ENTER();
|
||||
xflash_enable_wr();
|
||||
xflash_chip_erase();
|
||||
xflash_disable_wr();
|
||||
}
|
||||
#endif //LCD_TEST
|
||||
|
||||
@ -6672,7 +6672,7 @@ static void lcd_main_menu()
|
||||
}
|
||||
MENU_ITEM_SUBMENU_P(_i("Support"), lcd_support_menu);////MSG_SUPPORT
|
||||
#ifdef LCD_TEST
|
||||
MENU_ITEM_SUBMENU_P(_i("W25x20CL init"), lcd_test_menu);////MSG_SUPPORT
|
||||
MENU_ITEM_SUBMENU_P(_i("XFLASH init"), lcd_test_menu);////MSG_SUPPORT
|
||||
#endif //LCD_TEST
|
||||
|
||||
MENU_END();
|
||||
|
@ -159,7 +159,7 @@
|
||||
|
||||
//#define DEBUG_BUILD
|
||||
//#define DEBUG_SEC_LANG //secondary language debug output at startup
|
||||
//#define DEBUG_W25X20CL //debug external spi flash
|
||||
//#define DEBUG_XFLASH //debug external spi flash
|
||||
#ifdef DEBUG_BUILD
|
||||
//#define _NO_ASM
|
||||
#define DEBUG_DCODES //D codes
|
||||
|
@ -161,7 +161,7 @@
|
||||
|
||||
//#define DEBUG_BUILD
|
||||
//#define DEBUG_SEC_LANG //secondary language debug output at startup
|
||||
//#define DEBUG_W25X20CL //debug external spi flash
|
||||
//#define DEBUG_XFLASH //debug external spi flash
|
||||
#ifdef DEBUG_BUILD
|
||||
//#define _NO_ASM
|
||||
#define DEBUG_DCODES //D codes
|
||||
|
@ -1,44 +0,0 @@
|
||||
//w25x20cl.h
|
||||
#ifndef _W25X20CL_H
|
||||
#define _W25X20CL_H
|
||||
|
||||
#include <inttypes.h>
|
||||
#include "config.h"
|
||||
#include "spi.h"
|
||||
|
||||
|
||||
|
||||
#define W25X20CL_STATUS_BUSY 0x01
|
||||
#define W25X20CL_STATUS_WEL 0x02
|
||||
#define W25X20CL_STATUS_BP0 0x04
|
||||
#define W25X20CL_STATUS_BP1 0x08
|
||||
#define W25X20CL_STATUS_TB 0x20
|
||||
#define W25X20CL_STATUS_SRP 0x80
|
||||
|
||||
#define W25X20CL_SPI_ENTER() spi_setup(W25X20CL_SPCR, W25X20CL_SPSR)
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif //defined(__cplusplus)
|
||||
|
||||
|
||||
extern int8_t w25x20cl_init(void);
|
||||
extern void w25x20cl_enable_wr(void);
|
||||
extern void w25x20cl_disable_wr(void);
|
||||
extern uint8_t w25x20cl_rd_status_reg(void);
|
||||
extern void w25x20cl_wr_status_reg(uint8_t val);
|
||||
extern void w25x20cl_rd_data(uint32_t addr, uint8_t* data, uint16_t cnt);
|
||||
extern void w25x20cl_page_program(uint32_t addr, uint8_t* data, uint16_t cnt);
|
||||
extern void w25x20cl_page_program_P(uint32_t addr, uint8_t* data, uint16_t cnt);
|
||||
extern void w25x20cl_sector_erase(uint32_t addr);
|
||||
extern void w25x20cl_block32_erase(uint32_t addr);
|
||||
extern void w25x20cl_block64_erase(uint32_t addr);
|
||||
extern void w25x20cl_chip_erase(void);
|
||||
extern void w25x20cl_page_program(uint32_t addr, uint8_t* data, uint16_t cnt);
|
||||
extern void w25x20cl_rd_uid(uint8_t* uid);
|
||||
extern void w25x20cl_wait_busy(void);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif //defined(__cplusplus)
|
||||
#endif //_W25X20CL_H
|
@ -1,13 +1,18 @@
|
||||
//w25x20cl.c
|
||||
//xflash.c
|
||||
|
||||
#include "w25x20cl.h"
|
||||
#include "xflash.h"
|
||||
#include <avr/io.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "spi.h"
|
||||
#include "fastio.h"
|
||||
|
||||
#define _MFRID 0xEF
|
||||
#define _DEVID 0x11
|
||||
#ifdef XFLASH
|
||||
|
||||
#define _MFRID_W25X20CL 0xEF
|
||||
#define _DEVID_W25X20CL 0x11
|
||||
|
||||
#define _MFRID_GD25Q20C 0xC8
|
||||
#define _DEVID_GD25Q20C 0x11
|
||||
|
||||
#define _CMD_ENABLE_WR 0x06
|
||||
#define _CMD_ENABLE_WR_VSR 0x50
|
||||
@ -31,8 +36,8 @@
|
||||
#define _CMD_JEDEC_ID 0x9f
|
||||
#define _CMD_RD_UID 0x4b
|
||||
|
||||
#define _CS_LOW() WRITE(W25X20CL_PIN_CS, 0)
|
||||
#define _CS_HIGH() WRITE(W25X20CL_PIN_CS, 1)
|
||||
#define _CS_LOW() WRITE(XFLASH_PIN_CS, 0)
|
||||
#define _CS_HIGH() WRITE(XFLASH_PIN_CS, 1)
|
||||
|
||||
//#define _SPI_TX swspi_tx
|
||||
//#define _SPI_RX swspi_rx
|
||||
@ -40,33 +45,33 @@
|
||||
#define _SPI_RX() spi_txrx(0xff)
|
||||
|
||||
|
||||
int w25x20cl_mfrid_devid(void);
|
||||
int xflash_mfrid_devid(void);
|
||||
|
||||
|
||||
int8_t w25x20cl_init(void)
|
||||
int8_t xflash_init(void)
|
||||
{
|
||||
_CS_HIGH();
|
||||
SET_OUTPUT(W25X20CL_PIN_CS);
|
||||
W25X20CL_SPI_ENTER();
|
||||
if (!w25x20cl_mfrid_devid()) return 0;
|
||||
SET_OUTPUT(XFLASH_PIN_CS);
|
||||
XFLASH_SPI_ENTER();
|
||||
if (!xflash_mfrid_devid()) return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void w25x20cl_enable_wr(void)
|
||||
void xflash_enable_wr(void)
|
||||
{
|
||||
_CS_LOW();
|
||||
_SPI_TX(_CMD_ENABLE_WR); // send command 0x06
|
||||
_CS_HIGH();
|
||||
}
|
||||
|
||||
void w25x20cl_disable_wr(void)
|
||||
void xflash_disable_wr(void)
|
||||
{
|
||||
_CS_LOW();
|
||||
_SPI_TX(_CMD_DISABLE_WR); // send command 0x04
|
||||
_CS_HIGH();
|
||||
}
|
||||
|
||||
uint8_t w25x20cl_rd_status_reg(void)
|
||||
uint8_t xflash_rd_status_reg(void)
|
||||
{
|
||||
_CS_LOW();
|
||||
_SPI_TX(_CMD_RD_STATUS_REG); // send command 0x90
|
||||
@ -75,6 +80,7 @@ uint8_t w25x20cl_rd_status_reg(void)
|
||||
return val;
|
||||
}
|
||||
|
||||
#if 0
|
||||
void w25x20cl_wr_status_reg(uint8_t val)
|
||||
{
|
||||
_CS_LOW();
|
||||
@ -82,8 +88,9 @@ void w25x20cl_wr_status_reg(uint8_t val)
|
||||
_SPI_TX(val); // send value
|
||||
_CS_HIGH();
|
||||
}
|
||||
#endif
|
||||
|
||||
void w25x20cl_rd_data(uint32_t addr, uint8_t* data, uint16_t cnt)
|
||||
void xflash_rd_data(uint32_t addr, uint8_t* data, uint16_t cnt)
|
||||
{
|
||||
_CS_LOW();
|
||||
_SPI_TX(_CMD_RD_DATA); // send command 0x03
|
||||
@ -95,7 +102,7 @@ void w25x20cl_rd_data(uint32_t addr, uint8_t* data, uint16_t cnt)
|
||||
_CS_HIGH();
|
||||
}
|
||||
|
||||
void w25x20cl_page_program(uint32_t addr, uint8_t* data, uint16_t cnt)
|
||||
void xflash_page_program(uint32_t addr, uint8_t* data, uint16_t cnt)
|
||||
{
|
||||
_CS_LOW();
|
||||
_SPI_TX(_CMD_PAGE_PROGRAM); // send command 0x02
|
||||
@ -107,7 +114,7 @@ void w25x20cl_page_program(uint32_t addr, uint8_t* data, uint16_t cnt)
|
||||
_CS_HIGH();
|
||||
}
|
||||
|
||||
void w25x20cl_page_program_P(uint32_t addr, uint8_t* data, uint16_t cnt)
|
||||
void xflash_page_program_P(uint32_t addr, uint8_t* data, uint16_t cnt)
|
||||
{
|
||||
_CS_LOW();
|
||||
_SPI_TX(_CMD_PAGE_PROGRAM); // send command 0x02
|
||||
@ -119,7 +126,7 @@ void w25x20cl_page_program_P(uint32_t addr, uint8_t* data, uint16_t cnt)
|
||||
_CS_HIGH();
|
||||
}
|
||||
|
||||
void w25x20cl_erase(uint8_t cmd, uint32_t addr)
|
||||
void xflash_erase(uint8_t cmd, uint32_t addr)
|
||||
{
|
||||
_CS_LOW();
|
||||
_SPI_TX(cmd); // send command 0x20
|
||||
@ -129,22 +136,22 @@ void w25x20cl_erase(uint8_t cmd, uint32_t addr)
|
||||
_CS_HIGH();
|
||||
}
|
||||
|
||||
void w25x20cl_sector_erase(uint32_t addr)
|
||||
void xflash_sector_erase(uint32_t addr)
|
||||
{
|
||||
return w25x20cl_erase(_CMD_SECTOR_ERASE, addr);
|
||||
return xflash_erase(_CMD_SECTOR_ERASE, addr);
|
||||
}
|
||||
|
||||
void w25x20cl_block32_erase(uint32_t addr)
|
||||
void xflash_block32_erase(uint32_t addr)
|
||||
{
|
||||
return w25x20cl_erase(_CMD_BLOCK32_ERASE, addr);
|
||||
return xflash_erase(_CMD_BLOCK32_ERASE, addr);
|
||||
}
|
||||
|
||||
void w25x20cl_block64_erase(uint32_t addr)
|
||||
void xflash_block64_erase(uint32_t addr)
|
||||
{
|
||||
return w25x20cl_erase(_CMD_BLOCK64_ERASE, addr);
|
||||
return xflash_erase(_CMD_BLOCK64_ERASE, addr);
|
||||
}
|
||||
|
||||
void w25x20cl_chip_erase(void)
|
||||
void xflash_chip_erase(void)
|
||||
{
|
||||
_CS_LOW();
|
||||
_SPI_TX(_CMD_CHIP_ERASE); // send command 0xc7
|
||||
@ -152,33 +159,37 @@ void w25x20cl_chip_erase(void)
|
||||
}
|
||||
|
||||
|
||||
void w25x20cl_rd_uid(uint8_t* uid)
|
||||
void xflash_rd_uid(uint8_t* uid)
|
||||
{
|
||||
_CS_LOW();
|
||||
_SPI_TX(_CMD_RD_UID); // send command 0x4b
|
||||
uint8_t cnt = 4; // 4 dummy bytes
|
||||
while (cnt--) // receive dummy bytes
|
||||
_SPI_RX();
|
||||
while (cnt--) // transmit dummy bytes
|
||||
_SPI_TX(0x00);
|
||||
cnt = 8; // 8 bytes UID
|
||||
while (cnt--) // receive UID
|
||||
uid[7 - cnt] = _SPI_RX();
|
||||
_CS_HIGH();
|
||||
}
|
||||
|
||||
int w25x20cl_mfrid_devid(void)
|
||||
int xflash_mfrid_devid(void)
|
||||
{
|
||||
_CS_LOW();
|
||||
_SPI_TX(_CMD_MFRID_DEVID); // send command 0x90
|
||||
uint8_t cnt = 3; // 3 address bytes
|
||||
while (cnt--) // send address bytes
|
||||
_SPI_TX(0x00);
|
||||
uint8_t w25x20cl_mfrid = _SPI_RX(); // receive mfrid
|
||||
uint8_t w25x20cl_devid = _SPI_RX(); // receive devid
|
||||
uint8_t xflash_mfrid = _SPI_RX(); // receive mfrid
|
||||
uint8_t xflash_devid = _SPI_RX(); // receive devid
|
||||
_CS_HIGH();
|
||||
return ((w25x20cl_mfrid == _MFRID) && (w25x20cl_devid == _DEVID));
|
||||
return
|
||||
((xflash_mfrid == _MFRID_W25X20CL) && (xflash_devid == _DEVID_W25X20CL)) ||
|
||||
((xflash_mfrid == _MFRID_GD25Q20C) && (xflash_devid == _DEVID_GD25Q20C));
|
||||
}
|
||||
|
||||
void w25x20cl_wait_busy(void)
|
||||
void xflash_wait_busy(void)
|
||||
{
|
||||
while (w25x20cl_rd_status_reg() & W25X20CL_STATUS_BUSY) ;
|
||||
while (xflash_rd_status_reg() & XFLASH_STATUS_BUSY) ;
|
||||
}
|
||||
|
||||
#endif //XFLASH
|
50
Firmware/xflash.h
Normal file
50
Firmware/xflash.h
Normal file
@ -0,0 +1,50 @@
|
||||
//xflash.h
|
||||
#ifndef _XFLASH_H
|
||||
#define _XFLASH_H
|
||||
|
||||
#include <inttypes.h>
|
||||
#include "config.h"
|
||||
#include "spi.h"
|
||||
|
||||
|
||||
|
||||
#define XFLASH_STATUS_BUSY 0x01
|
||||
#define XFLASH_STATUS_WEL 0x02
|
||||
#define XFLASH_STATUS_BP0 0x04
|
||||
#define XFLASH_STATUS_BP1 0x08
|
||||
#define XFLASH_STATUS_TB 0x20
|
||||
#define XFLASH_STATUS_SRP 0x80
|
||||
|
||||
#define XFLASH_SPI_RATE 0 // fosc/4 = 4MHz
|
||||
#define XFLASH_SPCR SPI_SPCR(XFLASH_SPI_RATE, 1, 1, 1, 0)
|
||||
#define XFLASH_SPSR SPI_SPSR(XFLASH_SPI_RATE)
|
||||
|
||||
#define XFLASH_SPI_ENTER() spi_setup(XFLASH_SPCR, XFLASH_SPSR)
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif //defined(__cplusplus)
|
||||
|
||||
|
||||
extern int8_t xflash_init(void);
|
||||
extern void xflash_enable_wr(void);
|
||||
extern void xflash_disable_wr(void);
|
||||
extern uint8_t xflash_rd_status_reg(void);
|
||||
#if 0
|
||||
extern void w25x20cl_wr_status_reg(uint8_t val);
|
||||
#endif
|
||||
extern void xflash_rd_data(uint32_t addr, uint8_t* data, uint16_t cnt);
|
||||
extern void xflash_page_program(uint32_t addr, uint8_t* data, uint16_t cnt);
|
||||
extern void xflash_page_program_P(uint32_t addr, uint8_t* data, uint16_t cnt);
|
||||
extern void xflash_sector_erase(uint32_t addr);
|
||||
extern void xflash_block32_erase(uint32_t addr);
|
||||
extern void xflash_block64_erase(uint32_t addr);
|
||||
extern void xflash_chip_erase(void);
|
||||
extern void xflash_page_program(uint32_t addr, uint8_t* data, uint16_t cnt);
|
||||
extern void xflash_rd_uid(uint8_t* uid);
|
||||
extern void xflash_wait_busy(void);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif //defined(__cplusplus)
|
||||
#endif //_XFLASH_H
|
@ -837,7 +837,7 @@ void dynamic_circle(uint8_t *matrix_32x32, float &x, float &y, float &r, uint8_t
|
||||
for (int8_t i = iterations; i > 0; --i){
|
||||
|
||||
//@size=128B
|
||||
DBG(_n(" [%f, %f][%f] circle\n"), x, y, r);
|
||||
// DBG(_n(" [%f, %f][%f] circle\n"), x, y, r);
|
||||
|
||||
/// read points on the circle
|
||||
for (uint8_t p = 0; p < num_points; ++p){
|
||||
@ -904,12 +904,42 @@ uint8_t find_patterns(uint8_t *matrix32, uint16_t *pattern08, uint16_t *pattern1
|
||||
return match10;
|
||||
}
|
||||
|
||||
/// Scan should include normal data.
|
||||
/// If it's too extreme (00, FF) it could be caused by biased sensor.
|
||||
/// \return true if data looks normal
|
||||
bool check_scan(uint8_t *matrix32){
|
||||
/// magic constants that define normality
|
||||
const int16_t threshold_total = 900;
|
||||
const int threshold_extreme = 50;
|
||||
|
||||
int16_t mins = 0;
|
||||
int16_t maxs = 0;
|
||||
|
||||
for (int16_t i = 0; i < 32*32;++i){
|
||||
if (matrix32[i] == 0) {
|
||||
++mins;
|
||||
} else if (matrix32[i] == 0xFF){
|
||||
++maxs;
|
||||
}
|
||||
}
|
||||
const int16_t rest = 1024 - mins - maxs;
|
||||
|
||||
if (mins + maxs > threshold_total
|
||||
&& mins > threshold_extreme
|
||||
&& maxs > threshold_extreme
|
||||
&& mins > rest
|
||||
&& maxs > rest)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// scans area around the current head location and
|
||||
/// searches for the center of the calibration pin
|
||||
bool xyzcal_scan_and_process(void){
|
||||
BedSkewOffsetDetectionResultType xyzcal_scan_and_process(){
|
||||
//@size=44
|
||||
DBG(_n("sizeof(block_buffer)=%d\n"), sizeof(block_t)*BLOCK_BUFFER_SIZE);
|
||||
bool ret = false;
|
||||
// DBG(_n("sizeof(block_buffer)=%d\n"), sizeof(block_t)*BLOCK_BUFFER_SIZE);
|
||||
BedSkewOffsetDetectionResultType ret = BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND;
|
||||
int16_t x = _X;
|
||||
int16_t y = _Y;
|
||||
const int16_t z = _Z;
|
||||
@ -925,6 +955,8 @@ bool xyzcal_scan_and_process(void){
|
||||
|
||||
xyzcal_scan_pixels_32x32_Zhop(x, y, z, 2400, 200, matrix32);
|
||||
print_image(matrix32);
|
||||
if (!check_scan(matrix32))
|
||||
return BED_SKEW_OFFSET_DETECTION_POINT_SCAN_FAILED;
|
||||
|
||||
/// SEARCH FOR BINARY CIRCLE
|
||||
uint8_t uc = 0;
|
||||
@ -955,7 +987,7 @@ bool xyzcal_scan_and_process(void){
|
||||
x = round_to_i16(xf);
|
||||
y = round_to_i16(yf);
|
||||
xyzcal_lineXYZ_to(x, y, z, 200, 0);
|
||||
ret = true;
|
||||
ret = BED_SKEW_OFFSET_DETECTION_POINT_FOUND;
|
||||
}
|
||||
|
||||
/// wipe buffer
|
||||
@ -964,11 +996,11 @@ bool xyzcal_scan_and_process(void){
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool xyzcal_find_bed_induction_sensor_point_xy(void){
|
||||
bool ret = false;
|
||||
BedSkewOffsetDetectionResultType xyzcal_find_bed_induction_sensor_point_xy(void){
|
||||
BedSkewOffsetDetectionResultType ret = BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND;
|
||||
|
||||
//@size=258
|
||||
DBG(_n("xyzcal_find_bed_induction_sensor_point_xy x=%ld y=%ld z=%ld\n"), count_position[X_AXIS], count_position[Y_AXIS], count_position[Z_AXIS]);
|
||||
// DBG(_n("xyzcal_find_bed_induction_sensor_point_xy x=%ld y=%ld z=%ld\n"), count_position[X_AXIS], count_position[Y_AXIS], count_position[Z_AXIS]);
|
||||
st_synchronize();
|
||||
|
||||
xyzcal_meassure_enter();
|
||||
|
@ -1,9 +1,9 @@
|
||||
//xyzcal.h - xyz calibration with image processing
|
||||
#ifndef _XYZCAL_H
|
||||
#define _XYZCAL_H
|
||||
#pragma once
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "mesh_bed_calibration.h"
|
||||
|
||||
extern void xyzcal_meassure_enter(void);
|
||||
|
||||
@ -17,11 +17,4 @@ extern bool xyzcal_spiral8(int16_t cx, int16_t cy, int16_t z0, int16_t dz, int16
|
||||
|
||||
//extern int8_t xyzcal_meassure_pinda_hysterezis(int16_t min_z, int16_t max_z, uint16_t delay_us, uint8_t samples);
|
||||
|
||||
extern bool xyzcal_searchZ(void);
|
||||
|
||||
extern bool xyzcal_scan_and_process(void);
|
||||
|
||||
extern bool xyzcal_find_bed_induction_sensor_point_xy(void);
|
||||
|
||||
|
||||
#endif //_XYZCAL_H
|
||||
extern BedSkewOffsetDetectionResultType xyzcal_find_bed_induction_sensor_point_xy();
|
||||
|
Loading…
Reference in New Issue
Block a user