Commit 9ca8a5d4ca128c1e045f9cdf36df221ff689c260
receivedSat, 13. Jul 2024, 17:35:45 (by user sx)
Sat, 13 Jul 2024 15:35:45 +0000 (17:35 +0200)
authorManfred Steiner <sx@htl-kaindorf.at>
Fri, 12 Jul 2024 07:45:19 +0000 (09:45 +0200)
committerManfred Steiner <sx@htl-kaindorf.at>
Fri, 12 Jul 2024 07:45:19 +0000 (09:45 +0200)
16 files changed:
bootloader/.vscode/c_cpp_properties.json [new file with mode: 0644]
bootloader/.vscode/launch.json [new file with mode: 0644]
bootloader/.vscode/settings.json [new file with mode: 0644]
bootloader/.vscode/tasks.json [new file with mode: 0644]
bootloader/ATmegaBOOT_168.c [new file with mode: 0644]
bootloader/ATmegaBOOT_168_atmega644p.hex [new file with mode: 0644]
bootloader/Makefile [new file with mode: 0755]
kicad/bom.ods
kicad/dist/v1a/README.md
kicad/dist/v1a/nano-644_v1a_schematic-bw.pdf
kicad/dist/v1a/nano-644_v1a_schematic.pdf
kicad/dist/v1a/nano-664_v1a_bom.pdf
kicad/dist/v1a/sha256
kicad/nano-644.kicad_pcb
kicad/nano-644.kicad_pro
kicad/nano-644.kicad_sch

diff --git a/bootloader/.vscode/c_cpp_properties.json b/bootloader/.vscode/c_cpp_properties.json
new file mode 100644 (file)
index 0000000..72a37cf
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "configurations": [
+        {
+            "name": "Linux AVR",
+            "includePath": [
+                "/usr/lib/avr/include/**",
+                "/usr/lib/gcc/avr/**"
+            ],
+            "defines": [],
+            "compilerPath": "/usr/bin/avr-gcc",
+            "compilerArgs": [ "-mmcu=atmega644p", "-DF_CPU=12000000", "-Os", "-DMAX_TIME_COUNT=F_CPU>>4", "-DNUM_LED_FLASHES=1", "-DBAUD_RATE=115200", "-DDOUBLE_SPEED" ],
+            "cStandard": "c11",
+            "cppStandard": "gnu++11",
+            "intelliSenseMode": "linux-gcc-x64"
+        }
+    ],
+    "version": 4
+}
\ No newline at end of file
diff --git a/bootloader/.vscode/launch.json b/bootloader/.vscode/launch.json
new file mode 100644 (file)
index 0000000..3d98d07
--- /dev/null
@@ -0,0 +1,38 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "Build",
+            // "request": "launch",
+            "type": "node-terminal",
+            "preLaunchTask": "build"
+        },{
+            "name": "Flash",
+            // "request": "launch",
+            "type": "node-terminal",
+            "preLaunchTask": "flash"
+        },{
+            "name": "Clean",
+            // "request": "launch",
+            "type": "node-terminal",
+            "preLaunchTask": "clean"
+        },{
+            
+            // es muss mit simuc --board arduino dist/programm.elf der Simulator 
+            // gestartet werden. Dessen gdb-stub öffnet auf localhost:1234 einen Port
+            "name": "Start Gdb",
+            "type": "cppdbg",
+            "request": "launch",
+            "program": "${workspaceFolder}/dist/atmega328p.elf",
+            "cwd": "${workspaceFolder}",
+            "externalConsole": false,
+            "MIMode": "gdb",
+            "miDebuggerPath": "/usr/bin/avr-gdb",
+            "miDebuggerServerAddress": ":1234",
+            "preLaunchTask": "build"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/bootloader/.vscode/settings.json b/bootloader/.vscode/settings.json
new file mode 100644 (file)
index 0000000..0af80d1
--- /dev/null
@@ -0,0 +1,6 @@
+{
+    "cSpell.words": [],
+    "cSpell.ignorePaths": [
+        "**/*.json", "**/*.c", "**/*.h", "**/Makefile"
+    ]
+}
diff --git a/bootloader/.vscode/tasks.json b/bootloader/.vscode/tasks.json
new file mode 100644 (file)
index 0000000..74fb1c7
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    // See https://go.microsoft.com/fwlink/?LinkId=733558
+    // for the documentation about the tasks.json format
+    "version": "2.0.0",
+    "tasks": [{
+        "label": "build",
+        "type": "shell",
+        "command": "make",
+        "problemMatcher":[
+            "$gcc"
+        ]
+    },{
+        "label": "clean",
+        "type": "shell",
+        "command": "make",
+        "args": [ "clean" ],
+    },{
+        "label": "flash",
+        "type": "shell",
+        "command": "make",
+        "args": [ "flash" ],
+    }]
+}
\ No newline at end of file
diff --git a/bootloader/ATmegaBOOT_168.c b/bootloader/ATmegaBOOT_168.c
new file mode 100644 (file)
index 0000000..f598702
--- /dev/null
@@ -0,0 +1,1077 @@
+/**********************************************************/\r
+/* Serial Bootloader for Atmel megaAVR Controllers        */\r
+/*                                                        */\r
+/* tested with ATmega8, ATmega128 and ATmega168           */\r
+/* should work with other mega's, see code for details    */\r
+/*                                                        */\r
+/* ATmegaBOOT.c                                           */\r
+/*                                                        */\r
+/*                                                        */\r
+/* 20090308: integrated Mega changes into main bootloader */\r
+/*           source by D. Mellis                          */\r
+/* 20080930: hacked for Arduino Mega (with the 1280       */\r
+/*           processor, backwards compatible)             */\r
+/*           by D. Cuartielles                            */\r
+/* 20070626: hacked for Arduino Diecimila (which auto-    */\r
+/*           resets when a USB connection is made to it)  */\r
+/*           by D. Mellis                                 */\r
+/* 20060802: hacked for Arduino by D. Cuartielles         */\r
+/*           based on a previous hack by D. Mellis        */\r
+/*           and D. Cuartielles                           */\r
+/*                                                        */\r
+/* Monitor and debug functions were added to the original */\r
+/* code by Dr. Erik Lins, chip45.com. (See below)         */\r
+/*                                                        */\r
+/* Thanks to Karl Pitrich for fixing a bootloader pin     */\r
+/* problem and more informative LED blinking!             */\r
+/*                                                        */\r
+/* For the latest version see:                            */\r
+/* http://www.chip45.com/                                 */\r
+/*                                                        */\r
+/* ------------------------------------------------------ */\r
+/*                                                        */\r
+/* based on stk500boot.c                                  */\r
+/* Copyright (c) 2003, Jason P. Kyle                      */\r
+/* All rights reserved.                                   */\r
+/* see avr1.org for original file and information         */\r
+/*                                                        */\r
+/* This program is free software; you can redistribute it */\r
+/* and/or modify it under the terms of the GNU General    */\r
+/* Public License as published by the Free Software       */\r
+/* Foundation; either version 2 of the License, or        */\r
+/* (at your option) any later version.                    */\r
+/*                                                        */\r
+/* This program is distributed in the hope that it will   */\r
+/* be useful, but WITHOUT ANY WARRANTY; without even the  */\r
+/* implied warranty of MERCHANTABILITY or FITNESS FOR A   */\r
+/* PARTICULAR PURPOSE.  See the GNU General Public        */\r
+/* License for more details.                              */\r
+/*                                                        */\r
+/* You should have received a copy of the GNU General     */\r
+/* Public License along with this program; if not, write  */\r
+/* to the Free Software Foundation, Inc.,                 */\r
+/* 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA */\r
+/*                                                        */\r
+/* Licence can be viewed at                               */\r
+/* http://www.fsf.org/licenses/gpl.txt                    */\r
+/*                                                        */\r
+/* Target = Atmel AVR m128,m64,m32,m16,m8,m162,m163,m169, */\r
+/* m8515,m8535. ATmega161 has a very small boot block so  */\r
+/* isn't supported.                                       */\r
+/*                                                        */\r
+/* Tested with m168                                       */\r
+/**********************************************************/\r
+\r
+\r
+/* some includes */\r
+#include <inttypes.h>\r
+#include <avr/io.h>\r
+#include <avr/pgmspace.h>\r
+#include <avr/interrupt.h>\r
+#include <avr/wdt.h>\r
+#include <util/delay.h>\r
+\r
+/* the current avr-libc eeprom functions do not support the ATmega168 */\r
+/* own eeprom write/read functions are used instead */\r
+#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) || !defined(__AVR_ATmega328__) || defined(__AVR_ATmega644P__)\r
+#include <avr/eeprom.h>\r
+#endif\r
+\r
+/* Use the F_CPU defined in Makefile */\r
+\r
+/* 20060803: hacked by DojoCorp */\r
+/* 20070626: hacked by David A. Mellis to decrease waiting time for auto-reset */\r
+/* set the waiting time for the bootloader */\r
+/* get this from the Makefile instead */\r
+/* #define MAX_TIME_COUNT (F_CPU>>4) */\r
+\r
+/* 20070707: hacked by David A. Mellis - after this many errors give up and launch application */\r
+#define MAX_ERROR_COUNT 5\r
+\r
+/* set the UART baud rate */\r
+/* 20060803: hacked by DojoCorp */\r
+//#define BAUD_RATE   115200\r
+#ifndef BAUD_RATE\r
+#define BAUD_RATE   19200\r
+#endif\r
+\r
+\r
+/* SW_MAJOR and MINOR needs to be updated from time to time to avoid warning message from AVR Studio */\r
+/* never allow AVR Studio to do an update !!!! */\r
+#define HW_VER  0x02\r
+#define SW_MAJOR 0x01\r
+#define SW_MINOR 0x10\r
+\r
+\r
+/* Adjust to suit whatever pin your hardware uses to enter the bootloader */\r
+/* ATmega128 has two UARTS so two pins are used to enter bootloader and select UART */\r
+/* ATmega1280 has four UARTS, but for Arduino Mega, we will only use RXD0 to get code */\r
+/* BL0... means UART0, BL1... means UART1 */\r
+#ifdef __AVR_ATmega128__\r
+#define BL_DDR  DDRF\r
+#define BL_PORT PORTF\r
+#define BL_PIN  PINF\r
+#define BL0     PINF7\r
+#define BL1     PINF6\r
+#elif defined __AVR_ATmega1280__ \r
+/* we just don't do anything for the MEGA and enter bootloader on reset anyway*/\r
+#else\r
+/* other ATmegas have only one UART, so only one pin is defined to enter bootloader */\r
+#define BL_DDR  DDRD\r
+#define BL_PORT PORTD\r
+#define BL_PIN  PIND\r
+#define BL      PIND6\r
+#endif\r
+\r
+\r
+/* onboard LED is used to indicate, that the bootloader was entered (3x flashing) */\r
+/* if monitor functions are included, LED goes on after monitor was entered */\r
+#if defined __AVR_ATmega128__ || defined __AVR_ATmega1280__\r
+/* Onboard LED is connected to pin PB7 (e.g. Crumb128, PROBOmega128, Savvy128, Arduino Mega) */\r
+#define LED_DDR  DDRB\r
+#define LED_PORT PORTB\r
+#define LED_PIN  PINB\r
+#define LED      PINB7\r
+#elif __AVR_ATmega644P__\r
+#define LED_DDR  DDRC\r
+#define LED_PORT PORTC\r
+#define LED_PIN  PINC\r
+#define LED      PINC4\r
+\r
+#else\r
+/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duomilanuove */ \r
+/* other boards like e.g. Crumb8, Crumb168 are using PB2 */\r
+#define LED_DDR  DDRB\r
+#define LED_PORT PORTB\r
+#define LED_PIN  PINB\r
+#define LED      PINB5\r
+#endif\r
+\r
+\r
+/* monitor functions will only be compiled when using ATmega128, due to bootblock size constraints */\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)\r
+#define MONITOR 1\r
+#endif\r
+\r
+\r
+/* define various device id's */\r
+/* manufacturer byte is always the same */\r
+#define SIG1   0x1E    // Yep, Atmel is the only manufacturer of AVR micros.  Single source :(\r
+\r
+#if defined __AVR_ATmega1280__\r
+#define SIG2   0x97\r
+#define SIG3   0x03\r
+#define PAGE_SIZE      0x80U   //128 words\r
+\r
+#elif defined __AVR_ATmega1281__\r
+#define SIG2   0x97\r
+#define SIG3   0x04\r
+#define PAGE_SIZE      0x80U   //128 words\r
+\r
+#elif defined __AVR_ATmega128__\r
+#define SIG2   0x97\r
+#define SIG3   0x02\r
+#define PAGE_SIZE      0x80U   //128 words\r
+\r
+#elif defined __AVR_ATmega64__\r
+#define SIG2   0x96\r
+#define SIG3   0x02\r
+#define PAGE_SIZE      0x80U   //128 words\r
+\r
+#elif defined __AVR_ATmega32__\r
+#define SIG2   0x95\r
+#define SIG3   0x02\r
+#define PAGE_SIZE      0x40U   //64 words\r
+\r
+#elif defined __AVR_ATmega16__\r
+#define SIG2   0x94\r
+#define SIG3   0x03\r
+#define PAGE_SIZE      0x40U   //64 words\r
+\r
+#elif defined __AVR_ATmega8__\r
+#define SIG2   0x93\r
+#define SIG3   0x07\r
+#define PAGE_SIZE      0x20U   //32 words\r
+\r
+#elif defined __AVR_ATmega88__\r
+#define SIG2   0x93\r
+#define SIG3   0x0a\r
+#define PAGE_SIZE      0x20U   //32 words\r
+\r
+#elif defined __AVR_ATmega168__\r
+#define SIG2   0x94\r
+#define SIG3   0x06\r
+#define PAGE_SIZE      0x40U   //64 words\r
+\r
+#elif defined __AVR_ATmega328P__\r
+#define SIG2   0x95\r
+#define SIG3   0x0F\r
+#define PAGE_SIZE      0x40U   //64 words\r
+\r
+#elif defined __AVR_ATmega328__\r
+#define SIG2   0x95\r
+#define SIG3   0x14\r
+#define PAGE_SIZE      0x40U   //64 words\r
+\r
+#elif defined __AVR_ATmega644P__\r
+#define SIG2   0x96\r
+#define SIG3   0x0A\r
+#define PAGE_SIZE      0x80U   //128 words\r
+\r
+#elif defined __AVR_ATmega162__\r
+#define SIG2   0x94\r
+#define SIG3   0x04\r
+#define PAGE_SIZE      0x40U   //64 words\r
+\r
+#elif defined __AVR_ATmega163__\r
+#define SIG2   0x94\r
+#define SIG3   0x02\r
+#define PAGE_SIZE      0x40U   //64 words\r
+\r
+#elif defined __AVR_ATmega169__\r
+#define SIG2   0x94\r
+#define SIG3   0x05\r
+#define PAGE_SIZE      0x40U   //64 words\r
+\r
+#elif defined __AVR_ATmega8515__\r
+#define SIG2   0x93\r
+#define SIG3   0x06\r
+#define PAGE_SIZE      0x20U   //32 words\r
+\r
+#elif defined __AVR_ATmega8535__\r
+#define SIG2   0x93\r
+#define SIG3   0x08\r
+#define PAGE_SIZE      0x20U   //32 words\r
+#endif\r
+\r
+\r
+/* function prototypes */\r
+void putch(char);\r
+char getch(void);\r
+void getNch(uint8_t);\r
+void byte_response(uint8_t);\r
+void nothing_response(void);\r
+char gethex(void);\r
+void puthex(char);\r
+void flash_led(uint8_t);\r
+\r
+/* some variables */\r
+union address_union {\r
+       uint16_t word;\r
+       uint8_t  byte[2];\r
+} address;\r
+\r
+union length_union {\r
+       uint16_t word;\r
+       uint8_t  byte[2];\r
+} length;\r
+\r
+struct flags_struct {\r
+       unsigned eeprom : 1;\r
+       unsigned rampz  : 1;\r
+} flags;\r
+\r
+uint8_t buff[256];\r
+uint8_t address_high;\r
+\r
+uint8_t pagesz=0x80;\r
+\r
+uint8_t i;\r
+uint8_t bootuart = 0;\r
+\r
+uint8_t error_count = 0;\r
+\r
+void (*app_start)(void) = 0x0000;\r
+\r
+\r
+/* main program starts here */\r
+int main(void)\r
+{\r
+       uint8_t ch,ch2;\r
+       uint16_t w;\r
+\r
+\r
+#ifdef __AVR_ATmega644P__\r
+       DDRC = 0x1C;\r
+       PORTC = 0;\r
+#endif\r
+\r
+#ifdef WATCHDOG_MODS\r
+       ch = MCUSR;\r
+       MCUSR = 0;\r
+\r
+       WDTCSR |= _BV(WDCE) | _BV(WDE);\r
+       WDTCSR = 0;\r
+\r
+       // Check if the WDT was used to reset, in which case we dont bootload and skip straight to the code. woot.\r
+       if (! (ch &  _BV(EXTRF))) // if its a not an external reset...\r
+               app_start();  // skip bootloader\r
+#else\r
+       asm volatile("nop\n\t");\r
+#endif\r
+\r
+       /* set pin direction for bootloader pin and enable pullup */\r
+       /* for ATmega128, two pins need to be initialized */\r
+#ifdef __AVR_ATmega128__\r
+       BL_DDR &= ~_BV(BL0);\r
+       BL_DDR &= ~_BV(BL1);\r
+       BL_PORT |= _BV(BL0);\r
+       BL_PORT |= _BV(BL1);\r
+#else\r
+       /* We run the bootloader regardless of the state of this pin.  Thus, don't\r
+       put it in a different state than the other pins.  --DAM, 070709\r
+       This also applies to Arduino Mega -- DC, 080930\r
+       BL_DDR &= ~_BV(BL);\r
+       BL_PORT |= _BV(BL);\r
+       */\r
+#endif\r
+\r
+\r
+#ifdef __AVR_ATmega128__\r
+       /* check which UART should be used for booting */\r
+       if(bit_is_clear(BL_PIN, BL0)) {\r
+               bootuart = 1;\r
+       }\r
+       else if(bit_is_clear(BL_PIN, BL1)) {\r
+               bootuart = 2;\r
+       }\r
+#endif\r
+\r
+#if defined __AVR_ATmega1280__\r
+       /* the mega1280 chip has four serial ports ... we could eventually use any of them, or not? */\r
+       /* however, we don't wanna confuse people, to avoid making a mess, we will stick to RXD0, TXD0 */\r
+       bootuart = 1;\r
+#endif\r
+\r
+       /* check if flash is programmed already, if not start bootloader anyway */\r
+       if(pgm_read_byte_near(0x0000) != 0xFF) {\r
+\r
+#ifdef __AVR_ATmega128__\r
+       /* no UART was selected, start application */\r
+       if(!bootuart) {\r
+               app_start();\r
+       }\r
+#else\r
+       /* check if bootloader pin is set low */\r
+       /* we don't start this part neither for the m8, nor m168 */\r
+       //if(bit_is_set(BL_PIN, BL)) {\r
+       //      app_start();\r
+       //    }\r
+#endif\r
+       }\r
+\r
+#ifdef __AVR_ATmega128__    \r
+       /* no bootuart was selected, default to uart 0 */\r
+       if(!bootuart) {\r
+               bootuart = 1;\r
+       }\r
+#endif\r
+\r
+\r
+       /* initialize UART(s) depending on CPU defined */\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)\r
+       if(bootuart == 1) {\r
+               UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1);\r
+               UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8;\r
+               UCSR0A = 0x00;\r
+               UCSR0C = 0x06;\r
+               UCSR0B = _BV(TXEN0)|_BV(RXEN0);\r
+       }\r
+       if(bootuart == 2) {\r
+               UBRR1L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1);\r
+               UBRR1H = (F_CPU/(BAUD_RATE*16L)-1) >> 8;\r
+               UCSR1A = 0x00;\r
+               UCSR1C = 0x06;\r
+               UCSR1B = _BV(TXEN1)|_BV(RXEN1);\r
+       }\r
+#elif defined __AVR_ATmega163__\r
+       UBRR = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1);\r
+       UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8;\r
+       UCSRA = 0x00;\r
+       UCSRB = _BV(TXEN)|_BV(RXEN);    \r
+#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__) || defined __AVR_ATmega644P__\r
+\r
+#ifdef DOUBLE_SPEED\r
+       UCSR0A = (1<<U2X0); //Double speed mode USART0\r
+       UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*8L)-1);\r
+       UBRR0H = (F_CPU/(BAUD_RATE*8L)-1) >> 8;\r
+#else\r
+       UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1);\r
+       UBRR0H = (F_CPU/(BAUD_RATE*16L)-1) >> 8;\r
+#endif\r
+\r
+       UCSR0B = (1<<RXEN0) | (1<<TXEN0);\r
+       UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);\r
+\r
+       /* Enable internal pull-up resistor on pin D0 (RX), in order\r
+       to suppress line noise that prevents the bootloader from\r
+       timing out (DAM: 20070509) */\r
+       DDRD &= ~_BV(PIND0);\r
+       PORTD |= _BV(PIND0);\r
+#elif defined __AVR_ATmega8__\r
+       /* m8 */\r
+       UBRRH = (((F_CPU/BAUD_RATE)/16)-1)>>8;  // set baud rate\r
+       UBRRL = (((F_CPU/BAUD_RATE)/16)-1);\r
+       UCSRB = (1<<RXEN)|(1<<TXEN);  // enable Rx & Tx\r
+       UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // config USART; 8N1\r
+#else\r
+       /* m16,m32,m169,m8515,m8535 */\r
+       UBRRL = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1);\r
+       UBRRH = (F_CPU/(BAUD_RATE*16L)-1) >> 8;\r
+       UCSRA = 0x00;\r
+       UCSRC = 0x06;\r
+       UCSRB = _BV(TXEN)|_BV(RXEN);\r
+#endif\r
+\r
+#if defined __AVR_ATmega1280__\r
+       /* Enable internal pull-up resistor on pin D0 (RX), in order\r
+       to suppress line noise that prevents the bootloader from\r
+       timing out (DAM: 20070509) */\r
+       /* feature added to the Arduino Mega --DC: 080930 */\r
+       DDRE &= ~_BV(PINE0);\r
+       PORTE |= _BV(PINE0);\r
+#endif\r
+\r
+\r
+       /* set LED pin as output */\r
+       LED_DDR |= _BV(LED);\r
+\r
+\r
+       /* flash onboard LED to signal entering of bootloader */\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)\r
+       // 4x for UART0, 5x for UART1\r
+       flash_led(NUM_LED_FLASHES + bootuart);\r
+#else\r
+       flash_led(NUM_LED_FLASHES);\r
+#endif\r
+\r
+       /* 20050803: by DojoCorp, this is one of the parts provoking the\r
+                system to stop listening, cancelled from the original */\r
+       //putch('\0');\r
+\r
+       /* forever loop */\r
+       for (;;) {\r
+\r
+       /* get character from UART */\r
+       ch = getch();\r
+\r
+       /* A bunch of if...else if... gives smaller code than switch...case ! */\r
+\r
+       /* Hello is anyone home ? */ \r
+       if(ch=='0') {\r
+               nothing_response();\r
+       }\r
+\r
+\r
+       /* Request programmer ID */\r
+       /* Not using PROGMEM string due to boot block in m128 being beyond 64kB boundary  */\r
+       /* Would need to selectively manipulate RAMPZ, and it's only 9 characters anyway so who cares.  */\r
+       else if(ch=='1') {\r
+               if (getch() == ' ') {\r
+                       putch(0x14);\r
+                       putch('A');\r
+                       putch('V');\r
+                       putch('R');\r
+                       putch(' ');\r
+                       putch('I');\r
+                       putch('S');\r
+                       putch('P');\r
+                       putch(0x10);\r
+               } else {\r
+                       if (++error_count == MAX_ERROR_COUNT)\r
+                               app_start();\r
+               }\r
+       }\r
+\r
+\r
+       /* AVR ISP/STK500 board commands  DON'T CARE so default nothing_response */\r
+       else if(ch=='@') {\r
+               ch2 = getch();\r
+               if (ch2>0x85) getch();\r
+               nothing_response();\r
+       }\r
+\r
+\r
+       /* AVR ISP/STK500 board requests */\r
+       else if(ch=='A') {\r
+               ch2 = getch();\r
+               if(ch2==0x80) byte_response(HW_VER);            // Hardware version\r
+               else if(ch2==0x81) byte_response(SW_MAJOR);     // Software major version\r
+               else if(ch2==0x82) byte_response(SW_MINOR);     // Software minor version\r
+               else if(ch2==0x98) byte_response(0x03);         // Unknown but seems to be required by avr studio 3.56\r
+               else byte_response(0x00);                               // Covers various unnecessary responses we don't care about\r
+       }\r
+\r
+\r
+       /* Device Parameters  DON'T CARE, DEVICE IS FIXED  */\r
+       else if(ch=='B') {\r
+               getNch(20);\r
+               nothing_response();\r
+       }\r
+\r
+\r
+       /* Parallel programming stuff  DON'T CARE  */\r
+       else if(ch=='E') {\r
+               getNch(5);\r
+               nothing_response();\r
+       }\r
+\r
+\r
+       /* P: Enter programming mode  */\r
+       /* R: Erase device, don't care as we will erase one page at a time anyway.  */\r
+       else if(ch=='P' || ch=='R') {\r
+               nothing_response();\r
+       }\r
+\r
+\r
+       /* Leave programming mode  */\r
+       else if(ch=='Q') {\r
+               nothing_response();\r
+#ifdef WATCHDOG_MODS\r
+               // autoreset via watchdog (sneaky!)\r
+               WDTCSR = _BV(WDE);\r
+               while (1); // 16 ms\r
+#endif\r
+       }\r
+\r
+\r
+       /* Set address, little endian. EEPROM in bytes, FLASH in words  */\r
+       /* Perhaps extra address bytes may be added in future to support > 128kB FLASH.  */\r
+       /* This might explain why little endian was used here, big endian used everywhere else.  */\r
+       else if(ch=='U') {\r
+               address.byte[0] = getch();\r
+               address.byte[1] = getch();\r
+               nothing_response();\r
+       }\r
+\r
+\r
+       /* Universal SPI programming command, disabled.  Would be used for fuses and lock bits.  */\r
+       else if(ch=='V') {\r
+               if (getch() == 0x30) {\r
+                       getch();\r
+                       ch = getch();\r
+                       getch();\r
+                       if (ch == 0) {\r
+                               byte_response(SIG1);\r
+                       } else if (ch == 1) {\r
+                               byte_response(SIG2); \r
+                       } else {\r
+                               byte_response(SIG3);\r
+                       } \r
+               } else {\r
+                       getNch(3);\r
+                       byte_response(0x00);\r
+               }\r
+       }\r
+\r
+\r
+       /* Write memory, length is big endian and is in bytes  */\r
+       else if(ch=='d') {\r
+               length.byte[1] = getch();\r
+               length.byte[0] = getch();\r
+               flags.eeprom = 0;\r
+               if (getch() == 'E') flags.eeprom = 1;\r
+               for (w=0;w<length.word;w++) {\r
+                       buff[w] = getch();                              // Store data in buffer, can't keep up with serial data stream whilst programming pages\r
+               }\r
+               if (getch() == ' ') {\r
+                       if (flags.eeprom) {                             //Write to EEPROM one byte at a time\r
+                               address.word <<= 1;\r
+                               for(w=0;w<length.word;w++) {\r
+#if defined(__AVR_ATmega168__)  || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega644P__)\r
+                                       while(EECR & (1<<EEPE));\r
+                                       EEAR = (uint16_t)(void *)address.word;\r
+                                       EEDR = buff[w];\r
+                                       EECR |= (1<<EEMPE);\r
+                                       EECR |= (1<<EEPE);\r
+#else\r
+                                       eeprom_write_byte((void *)address.word,buff[w]);\r
+#endif\r
+                                       address.word++;\r
+                               }                       \r
+                       }\r
+                       else {                                          //Write to FLASH one page at a time\r
+                               if (address.byte[1]>127) address_high = 0x01;   //Only possible with m128, m256 will need 3rd address byte. FIXME\r
+                               else address_high = 0x00;\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__)\r
+                               RAMPZ = address_high;\r
+#endif\r
+                               address.word = address.word << 1;               //address * 2 -> byte location\r
+                               /* if ((length.byte[0] & 0x01) == 0x01) length.word++;  //Even up an odd number of bytes */\r
+                               if ((length.byte[0] & 0x01)) length.word++;     //Even up an odd number of bytes\r
+                               cli();                                  //Disable interrupts, just to be sure\r
+#if defined(EEPE)\r
+                               while(bit_is_set(EECR,EEPE));                   //Wait for previous EEPROM writes to complete\r
+#else\r
+                               while(bit_is_set(EECR,EEWE));                   //Wait for previous EEPROM writes to complete\r
+#endif\r
+                               asm volatile(\r
+                                        "clr   r17             \n\t"   //page_word_count\r
+                                        "lds   r30,address     \n\t"   //Address of FLASH location (in bytes)\r
+                                        "lds   r31,address+1   \n\t"\r
+                                        "ldi   r28,lo8(buff)   \n\t"   //Start of buffer array in RAM\r
+                                        "ldi   r29,hi8(buff)   \n\t"\r
+                                        "lds   r24,length      \n\t"   //Length of data to be written (in bytes)\r
+                                        "lds   r25,length+1    \n\t"\r
+                                        "length_loop:          \n\t"   //Main loop, repeat for number of words in block                                                                                                                 \r
+                                        "cpi   r17,0x00        \n\t"   //If page_word_count=0 then erase page\r
+                                        "brne  no_page_erase   \n\t"                                            \r
+                                        "wait_spm1:            \n\t"\r
+                                        "lds   r16,%0          \n\t"   //Wait for previous spm to complete\r
+                                        "andi  r16,1           \n\t"\r
+                                        "cpi   r16,1           \n\t"\r
+                                        "breq  wait_spm1       \n\t"\r
+                                        "ldi   r16,0x03        \n\t"   //Erase page pointed to by Z\r
+                                        "sts   %0,r16          \n\t"\r
+                                        "spm                   \n\t"                                                    \r
+#ifdef __AVR_ATmega163__\r
+                                        ".word 0xFFFF          \n\t"\r
+                                        "nop                   \n\t"\r
+#endif\r
+                                        "wait_spm2:            \n\t"\r
+                                        "lds   r16,%0          \n\t"   //Wait for previous spm to complete\r
+                                        "andi  r16,1           \n\t"\r
+                                        "cpi   r16,1           \n\t"\r
+                                        "breq  wait_spm2       \n\t"                                                                    \r
+\r
+                                        "ldi   r16,0x11        \n\t"   //Re-enable RWW section\r
+                                        "sts   %0,r16          \n\t"                                                                    \r
+                                        "spm                   \n\t"\r
+#ifdef __AVR_ATmega163__\r
+                                        ".word 0xFFFF          \n\t"\r
+                                        "nop                   \n\t"\r
+#endif\r
+                                        "no_page_erase:                \n\t"                                                    \r
+                                        "ld    r0,Y+           \n\t"   //Write 2 bytes into page buffer\r
+                                        "ld    r1,Y+           \n\t"                                                    \r
+                                                                \r
+                                        "wait_spm3:            \n\t"\r
+                                        "lds   r16,%0          \n\t"   //Wait for previous spm to complete\r
+                                        "andi  r16,1           \n\t"\r
+                                        "cpi   r16,1           \n\t"\r
+                                        "breq  wait_spm3       \n\t"\r
+                                        "ldi   r16,0x01        \n\t"   //Load r0,r1 into FLASH page buffer\r
+                                        "sts   %0,r16          \n\t"\r
+                                        "spm                   \n\t"\r
+                                                                \r
+                                        "inc   r17             \n\t"   //page_word_count++\r
+                                        "cpi r17,%1            \n\t"\r
+                                        "brlo  same_page       \n\t"   //Still same page in FLASH\r
+                                        "write_page:           \n\t"\r
+                                        "clr   r17             \n\t"   //New page, write current one first\r
+                                        "wait_spm4:            \n\t"\r
+                                        "lds   r16,%0          \n\t"   //Wait for previous spm to complete\r
+                                        "andi  r16,1           \n\t"\r
+                                        "cpi   r16,1           \n\t"\r
+                                        "breq  wait_spm4       \n\t"\r
+#ifdef __AVR_ATmega163__\r
+                                        "andi  r30,0x80        \n\t"   // m163 requires Z6:Z1 to be zero during page write\r
+#endif                                                                                                          \r
+                                        "ldi   r16,0x05        \n\t"   //Write page pointed to by Z\r
+                                        "sts   %0,r16          \n\t"\r
+                                        "spm                   \n\t"\r
+#ifdef __AVR_ATmega163__\r
+                                        ".word 0xFFFF          \n\t"\r
+                                        "nop                   \n\t"\r
+                                        "ori   r30,0x7E        \n\t"   // recover Z6:Z1 state after page write (had to be zero during write)\r
+#endif\r
+                                        "wait_spm5:            \n\t"\r
+                                        "lds   r16,%0          \n\t"   //Wait for previous spm to complete\r
+                                        "andi  r16,1           \n\t"\r
+                                        "cpi   r16,1           \n\t"\r
+                                        "breq  wait_spm5       \n\t"                                                                    \r
+                                        "ldi   r16,0x11        \n\t"   //Re-enable RWW section\r
+                                        "sts   %0,r16          \n\t"                                                                    \r
+                                        "spm                   \n\t"                                                    \r
+#ifdef __AVR_ATmega163__\r
+                                        ".word 0xFFFF          \n\t"\r
+                                        "nop                   \n\t"\r
+#endif\r
+                                        "same_page:            \n\t"                                                    \r
+                                        "adiw  r30,2           \n\t"   //Next word in FLASH\r
+                                        "sbiw  r24,2           \n\t"   //length-2\r
+                                        "breq  final_write     \n\t"   //Finished\r
+                                        "rjmp  length_loop     \n\t"\r
+                                        "final_write:          \n\t"\r
+                                        "cpi   r17,0           \n\t"\r
+                                        "breq  block_done      \n\t"\r
+                                        "adiw  r24,2           \n\t"   //length+2, fool above check on length after short page write\r
+                                        "rjmp  write_page      \n\t"\r
+                                        "block_done:           \n\t"\r
+                                        "clr   __zero_reg__    \n\t"   //restore zero register\r
+#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega644P__)\r
+                                        : "=m" (SPMCSR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31"\r
+\r
+#else\r
+                                        : "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31"\r
+#endif\r
+                                        );\r
+                               /* Should really add a wait for RWW section to be enabled, don't actually need it since we never */\r
+                               /* exit the bootloader without a power cycle anyhow */\r
+                       }\r
+                       putch(0x14);\r
+                       putch(0x10);\r
+               } else {\r
+                       if (++error_count == MAX_ERROR_COUNT)\r
+                               app_start();\r
+               }               \r
+       }\r
+\r
+\r
+       /* Read memory block mode, length is big endian.  */\r
+       else if(ch=='t') {\r
+               length.byte[1] = getch();\r
+               length.byte[0] = getch();\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)\r
+               if (address.word>0x7FFF) flags.rampz = 1;               // No go with m256, FIXME\r
+               else flags.rampz = 0;\r
+#endif\r
+               address.word = address.word << 1;               // address * 2 -> byte location\r
+               if (getch() == 'E') flags.eeprom = 1;\r
+               else flags.eeprom = 0;\r
+               if (getch() == ' ') {                           // Command terminator\r
+                       putch(0x14);\r
+                       for (w=0;w < length.word;w++) {                 // Can handle odd and even lengths okay\r
+                               if (flags.eeprom) {                             // Byte access EEPROM read\r
+#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega644P__)\r
+                                       while(EECR & (1<<EEPE));\r
+                                       EEAR = (uint16_t)(void *)address.word;\r
+                                       EECR |= (1<<EERE);\r
+                                       putch(EEDR);\r
+#else\r
+                                       putch(eeprom_read_byte((void *)address.word));\r
+#endif\r
+                                       address.word++;\r
+                               }\r
+                               else {\r
+\r
+                                       if (!flags.rampz) putch(pgm_read_byte_near(address.word));\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)\r
+                                       else putch(pgm_read_byte_far(address.word + 0x10000));\r
+                                       // Hmmmm, yuck  FIXME when m256 arrives\r
+#endif\r
+                                       address.word++;\r
+                               }\r
+                       }\r
+                       putch(0x10);\r
+               }\r
+       }\r
+\r
+\r
+       /* Get device signature bytes  */\r
+       else if(ch=='u') {\r
+               if (getch() == ' ') {\r
+                       putch(0x14);\r
+                       putch(SIG1);\r
+                       putch(SIG2);\r
+                       putch(SIG3);\r
+                       putch(0x10);\r
+               } else {\r
+                       if (++error_count == MAX_ERROR_COUNT)\r
+                               app_start();\r
+               }\r
+       }\r
+\r
+\r
+       /* Read oscillator calibration byte */\r
+       else if(ch=='v') {\r
+               byte_response(0x00);\r
+       }\r
+\r
+\r
+#if defined MONITOR \r
+\r
+       /* here come the extended monitor commands by Erik Lins */\r
+\r
+       /* check for three times exclamation mark pressed */\r
+       else if(ch=='!') {\r
+               ch = getch();\r
+               if(ch=='!') {\r
+               ch = getch();\r
+               if(ch=='!') {\r
+                       PGM_P welcome = "";\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)\r
+                       uint16_t extaddr;\r
+#endif\r
+                       uint8_t addrl, addrh;\r
+\r
+#ifdef CRUMB128\r
+                       welcome = "ATmegaBOOT / Crumb128 - (C) J.P.Kyle, E.Lins - 050815\n\r";\r
+#elif defined PROBOMEGA128\r
+                       welcome = "ATmegaBOOT / PROBOmega128 - (C) J.P.Kyle, E.Lins - 050815\n\r";\r
+#elif defined SAVVY128\r
+                       welcome = "ATmegaBOOT / Savvy128 - (C) J.P.Kyle, E.Lins - 050815\n\r";\r
+#elif defined __AVR_ATmega1280__ \r
+                       welcome = "ATmegaBOOT / Arduino Mega - (C) Arduino LLC - 090930\n\r";\r
+#endif\r
+\r
+                       /* turn on LED */\r
+                       LED_DDR |= _BV(LED);\r
+                       LED_PORT &= ~_BV(LED);\r
+\r
+                       /* print a welcome message and command overview */\r
+                       for(i=0; welcome[i] != '\0'; ++i) {\r
+                               putch(welcome[i]);\r
+                       }\r
+\r
+                       /* test for valid commands */\r
+                       for(;;) {\r
+                               putch('\n');\r
+                               putch('\r');\r
+                               putch(':');\r
+                               putch(' ');\r
+\r
+                               ch = getch();\r
+                               putch(ch);\r
+\r
+                               /* toggle LED */\r
+                               if(ch == 't') {\r
+                                       if(bit_is_set(LED_PIN,LED)) {\r
+                                               LED_PORT &= ~_BV(LED);\r
+                                               putch('1');\r
+                                       } else {\r
+                                               LED_PORT |= _BV(LED);\r
+                                               putch('0');\r
+                                       }\r
+                               } \r
+\r
+                               /* read byte from address */\r
+                               else if(ch == 'r') {\r
+                                       ch = getch(); putch(ch);\r
+                                       addrh = gethex();\r
+                                       addrl = gethex();\r
+                                       putch('=');\r
+                                       ch = *(uint8_t *)((addrh << 8) + addrl);\r
+                                       puthex(ch);\r
+                               }\r
+\r
+                               /* write a byte to address  */\r
+                               else if(ch == 'w') {\r
+                                       ch = getch(); putch(ch);\r
+                                       addrh = gethex();\r
+                                       addrl = gethex();\r
+                                       ch = getch(); putch(ch);\r
+                                       ch = gethex();\r
+                                       *(uint8_t *)((addrh << 8) + addrl) = ch;\r
+                               }\r
+\r
+                               /* read from uart and echo back */\r
+                               else if(ch == 'u') {\r
+                                       for(;;) {\r
+                                               putch(getch());\r
+                                       }\r
+                               }\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)\r
+                               /* external bus loop  */\r
+                               else if(ch == 'b') {\r
+                                       putch('b');\r
+                                       putch('u');\r
+                                       putch('s');\r
+                                       MCUCR = 0x80;\r
+                                       XMCRA = 0;\r
+                                       XMCRB = 0;\r
+                                       extaddr = 0x1100;\r
+                                       for(;;) {\r
+                                               ch = *(volatile uint8_t *)extaddr;\r
+                                               if(++extaddr == 0) {\r
+                                                       extaddr = 0x1100;\r
+                                               }\r
+                                       }\r
+                               }\r
+#endif\r
+\r
+                               else if(ch == 'j') {\r
+                                       app_start();\r
+                               }\r
+\r
+                       } /* end of monitor functions */\r
+\r
+               }\r
+               }\r
+       }\r
+       /* end of monitor */\r
+#endif\r
+       else if (++error_count == MAX_ERROR_COUNT) {\r
+               app_start();\r
+       }\r
+       } /* end of forever loop */\r
+\r
+}\r
+\r
+\r
+char gethexnib(void) {\r
+       char a;\r
+       a = getch(); putch(a);\r
+       if(a >= 'a') {\r
+               return (a - 'a' + 0x0a);\r
+       } else if(a >= '0') {\r
+               return(a - '0');\r
+       }\r
+       return a;\r
+}\r
+\r
+\r
+char gethex(void) {\r
+       return (gethexnib() << 4) + gethexnib();\r
+}\r
+\r
+\r
+void puthex(char ch) {\r
+       char ah;\r
+\r
+       ah = ch >> 4;\r
+       if(ah >= 0x0a) {\r
+               ah = ah - 0x0a + 'a';\r
+       } else {\r
+               ah += '0';\r
+       }\r
+       \r
+       ch &= 0x0f;\r
+       if(ch >= 0x0a) {\r
+               ch = ch - 0x0a + 'a';\r
+       } else {\r
+               ch += '0';\r
+       }\r
+       \r
+       putch(ah);\r
+       putch(ch);\r
+}\r
+\r
+\r
+void putch(char ch)\r
+{\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)\r
+       if(bootuart == 1) {\r
+               while (!(UCSR0A & _BV(UDRE0)));\r
+               UDR0 = ch;\r
+       }\r
+       else if (bootuart == 2) {\r
+               while (!(UCSR1A & _BV(UDRE1)));\r
+               UDR1 = ch;\r
+       }\r
+#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__) || defined(__AVR_ATmega644P__)\r
+       while (!(UCSR0A & _BV(UDRE0)));\r
+       UDR0 = ch;\r
+#else\r
+       /* m8,16,32,169,8515,8535,163 */\r
+       while (!(UCSRA & _BV(UDRE)));\r
+       UDR = ch;\r
+#endif\r
+}\r
+\r
+\r
+char getch(void)\r
+{\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)\r
+       uint32_t count = 0;\r
+       if(bootuart == 1) {\r
+               while(!(UCSR0A & _BV(RXC0))) {\r
+                       /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/               \r
+                       /* HACKME:: here is a good place to count times*/\r
+                       count++;\r
+                       if (count > MAX_TIME_COUNT)\r
+                               app_start();\r
+               }\r
+\r
+               return UDR0;\r
+       }\r
+       else if(bootuart == 2) {\r
+               while(!(UCSR1A & _BV(RXC1))) {\r
+                       /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/               \r
+                       /* HACKME:: here is a good place to count times*/\r
+                       count++;\r
+                       if (count > MAX_TIME_COUNT)\r
+                               app_start();\r
+               }\r
+\r
+               return UDR1;\r
+       }\r
+       return 0;\r
+#elif defined(__AVR_ATmega168__)  || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__) || defined (__AVR_ATmega644P__)\r
+       uint32_t count = 0;\r
+       while(!(UCSR0A & _BV(RXC0))){\r
+               /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/               \r
+               /* HACKME:: here is a good place to count times*/\r
+               count++;\r
+               if (count > MAX_TIME_COUNT) {\r
+                       app_start();\r
+               }\r
+       }\r
+       return UDR0;\r
+\r
+#else\r
+       /* m8,16,32,169,8515,8535,163 */\r
+       uint32_t count = 0;\r
+       while(!(UCSRA & _BV(RXC))){\r
+               /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/               \r
+               /* HACKME:: here is a good place to count times*/\r
+               count++;\r
+               if (count > MAX_TIME_COUNT)\r
+                       app_start();\r
+       }\r
+       return UDR;\r
+#endif\r
+}\r
+\r
+\r
+void getNch(uint8_t count)\r
+{\r
+       while(count--) {\r
+#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)\r
+               if(bootuart == 1) {\r
+                       while(!(UCSR0A & _BV(RXC0)));\r
+                       UDR0;\r
+               } \r
+               else if(bootuart == 2) {\r
+                       while(!(UCSR1A & _BV(RXC1)));\r
+                       UDR1;\r
+               }\r
+#elif defined(__AVR_ATmega168__)  || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__) || defined(__AVR_ATmega644P__)\r
+               getch();\r
+#else\r
+               /* m8,16,32,169,8515,8535,163 */\r
+               /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/               \r
+               //while(!(UCSRA & _BV(RXC)));\r
+               //UDR;\r
+               getch(); // need to handle time out\r
+#endif         \r
+       }\r
+}\r
+\r
+\r
+void byte_response(uint8_t val)\r
+{\r
+       if (getch() == ' ') {\r
+               putch(0x14);\r
+               putch(val);\r
+               putch(0x10);\r
+       } else {\r
+               if (++error_count == MAX_ERROR_COUNT)\r
+                       app_start();\r
+       }\r
+}\r
+\r
+\r
+void nothing_response(void)\r
+{\r
+       if (getch() == ' ') {\r
+               putch(0x14);\r
+               putch(0x10);\r
+       } else {\r
+               if (++error_count == MAX_ERROR_COUNT)\r
+                       app_start();\r
+       }\r
+}\r
+\r
+void flash_led(uint8_t count)\r
+{\r
+       while (count--) {\r
+               LED_PORT |= _BV(LED);\r
+               _delay_ms(100);\r
+               LED_PORT &= ~_BV(LED);\r
+               _delay_ms(100);\r
+       }\r
+}\r
+\r
+\r
+/* end of file ATmegaBOOT.c */\r
diff --git a/bootloader/ATmegaBOOT_168_atmega644p.hex b/bootloader/ATmegaBOOT_168_atmega644p.hex
new file mode 100644 (file)
index 0000000..9dbe6b5
--- /dev/null
@@ -0,0 +1,98 @@
+:107000000C943E380C945B380C945B380C945B38D1\r
+:107010000C945B380C945B380C945B380C945B38A4\r
+:107020000C945B380C945B380C945B380C945B3894\r
+:107030000C945B380C945B380C945B380C945B3884\r
+:107040000C945B380C945B380C945B380C945B3874\r
+:107050000C945B380C945B380C945B380C945B3864\r
+:107060000C945B380C945B380C945B380C945B3854\r
+:107070000C945B380C945B380C945B3811241FBE65\r
+:10708000CFEFD0E1DEBFCDBF11E0A0E0B1E0E6EE92\r
+:10709000F5E702C005900D92A230B107D9F722E0C2\r
+:1070A000A2E0B1E001C01D92AD30B207E1F70E944D\r
+:1070B00014390C94F13A0C9400389091C00095FF6B\r
+:1070C000FCCF8093C6000895CF93982F8595859522\r
+:1070D00085958595805D9F709A3014F0C7E501C055\r
+:1070E000C0E3C90F0E945D388C2FCF910C945D389E\r
+:1070F000CF92DF92EF92FF92C12CD12C760180913A\r
+:10710000C00087FD13C08FEFC81AD80AE80AF80A32\r
+:1071100081EBC81681E7D8068BE0E806F10478F326\r
+:10712000E0910201F09103010995E9CF8091C60039\r
+:10713000FF90EF90DF90CF900895CF930E94783822\r
+:10714000C82F0E945D38C13614F089EA03C0C033ED\r
+:107150001CF080ED8C0F01C08C2FCF910895CF9340\r
+:107160000E949D38C82F0E949D3890E1C99F800DD4\r
+:107170001124CF910895CF93C82FCC2321F00E94E2\r
+:107180007838C150FACFCF910895CF93C82F0E947D\r
+:107190007838803251F484E10E945D388C2F0E944F\r
+:1071A0005D3880E1CF910C945D38809104018F5F50\r
+:1071B00080930401853031F4E0910201F0910301E4\r
+:1071C000CF910994CF9108950E947838803231F49C\r
+:1071D00084E10E945D3880E10C945D388091040167\r
+:1071E0008F5F80930401853029F4E0910201F091D2\r
+:1071F0000301099408958823B1F0449A2FE739EAEE\r
+:1072000093E0215030409040E1F700C000004498E6\r
+:107210002FE739EA93E0215030409040E1F700C079\r
+:1072200000008150E8CF08958CE187B918B80000BC\r
+:10723000E0E0F0E0E49182E08093C0008CE0809395\r
+:10724000C4001092C50088E18093C10086E080935D\r
+:10725000C2005098589A3C9A81E00E94FB38FF2463\r
+:10726000F3940E947838803309F442C08133E1F40A\r
+:107270000E947838803209F0A6C184E10E945D380E\r
+:1072800081E40E945D3886E50E945D3882E50E94B7\r
+:107290005D3880E20E945D3889E40E945D3883E5B4\r
+:1072A0000E945D3880E586C1803439F40E947838C8\r
+:1072B0008638F0F00E9478381BC08134A1F40E9417\r
+:1072C0007838803811F482E003C0813821F481E0FD\r
+:1072D0000E94C538C6CF823811F480E1F9CF8839D1\r
+:1072E000C9F583E0F5CF823431F484E10E94BB38E4\r
+:1072F0000E94E438B6CF853411F485E0F7CF982F9B\r
+:107300009D7F9035A9F3813599F3853549F40E9425\r
+:107310007838809306010E94783880930701E8CF7F\r
+:107320008635D1F40E947838803389F40E94783809\r
+:107330000E947838182F0E947838111102C08EE10F\r
+:10734000C7CF113011F486E9C3CF8AE0C1CF83E003\r
+:107350000E94BB3880E0BCCF843609F0C6C00E94D2\r
+:107360007838809309020E947838809308028091CF\r
+:107370000C028E7F80930C020E947838853429F4A9\r
+:1073800080910C02816080930C0208E011E0209152\r
+:10739000080230910902C801885091408217930772\r
+:1073A00030F40E947838F80181938F01F0CF0E9469\r
+:1073B0007838803209F007C180910C0220910601D3\r
+:1073C0003091070180FF29C0220F331F309307013E\r
+:1073D00020930601E8E0F1E02091080230910902D3\r
+:1073E000CF01885091408217930708F07CC0F9992B\r
+:1073F000FECF809106019091070192BD81BD8191E0\r
+:1074000080BDFA9AF99A8091060190910701019640\r
+:107410009093070180930601DFCF80910701880FC9\r
+:10742000880B8F2180930B02220F331F30930701AB\r
+:10743000209306018091080280FF09C08091080214\r
+:107440009091090201969093090280930802F894A2\r
+:10745000F999FECF1127E0910601F0910701C8E0EC\r
+:10746000D1E08091080290910902103091F40091CE\r
+:10747000570001700130D9F303E000935700E895FD\r
+:107480000091570001700130D9F301E100935700DA\r
+:10749000E895099019900091570001700130D9F3D7\r
+:1074A00001E000935700E8951395103898F01127E4\r
+:1074B0000091570001700130D9F305E000935700A7\r
+:1074C000E8950091570001700130D9F301E1009374\r
+:1074D0005700E8953296029709F0C7CF103011F0A7\r
+:1074E0000296E5CF112484E165C0843709F052C0CB\r
+:1074F0000E947838809309020E94783880930802AD\r
+:107500008091060190910701880F991F90930701C0\r
+:10751000809306010E94783890910C02853411F412\r
+:10752000916001C09E7F90930C020E947838803257\r
+:1075300009F097CE84E10E945D3800E010E0809170\r
+:1075400008029091090208171907B0F580910C0202\r
+:1075500080FF0BC0F999FECF809106019091070141\r
+:1075600092BD81BDF89A80B507C081FD07C0E0914A\r
+:107570000601F091070184910E945D388091060117\r
+:1075800090910701019690930701809306010F5F88\r
+:107590001F4FD5CF8537A1F40E947838803299F4F7\r
+:1075A00084E10E945D388EE10E945D3886E90E9488\r
+:1075B0005D388AE00E945D3880E10E945D3851CEDE\r
+:1075C000863709F4C7CE809104018F5F8093040150\r
+:1075D000853009F046CEE0910201F0910301099552\r
+:0675E00040CEF894FFCF3D\r
+:0275E600800023\r
+:040000030000700089\r
+:00000001FF\r
diff --git a/bootloader/Makefile b/bootloader/Makefile
new file mode 100755 (executable)
index 0000000..3d96959
--- /dev/null
@@ -0,0 +1,253 @@
+# Makefile for ATmegaBOOT
+# E.Lins, 18.7.2005
+#
+# Instructions
+#
+# To make bootloader .hex file:
+# make diecimila
+# make lilypad
+# make ng
+# etc...
+#
+# To burn bootloader .hex file:
+# make diecimila_isp
+# make lilypad_isp
+# make ng_isp
+# etc...
+
+# program name should not be changed...
+PROGRAM    = ATmegaBOOT_168
+
+# enter the parameters for the avrdude isp tool
+ISPTOOL           = stk500v2
+ISPPORT           = usb
+ISPSPEED   = -b 115200
+
+MCU_TARGET = atmega168
+LDSECTION  = --section-start=.text=0x3800
+
+# the efuse should really be 0xf8; since, however, only the lower
+# three bits of that byte are used on the atmega168, avrdude gets
+# confused if you specify 1's for the higher bits, see:
+# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/
+#
+# similarly, the lock bits should be 0xff instead of 0x3f (to
+# unlock the bootloader section) and 0xcf instead of 0x0f (to
+# lock it), but since the high two bits of the lock byte are
+# unused, avrdude would get confused.
+
+ISPFUSES    = avrdude -c $(ISPTOOL) -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
+-e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m
+ISPFLASH    = avrdude -c $(ISPTOOL) -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
+-U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x0f:m
+
+STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe"
+STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \
+-lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt
+STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt
+
+
+OBJ        = $(PROGRAM).o
+OPTIMIZE   = -Os
+
+DEFS       =
+LIBS       =
+
+CC         = avr-gcc
+
+# Override is only needed by avr-lib build system.
+
+override CFLAGS        = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS)
+override LDFLAGS       = -Wl,$(LDSECTION)
+#override LDFLAGS       = -Wl,-Map,$(PROGRAM).map,$(LDSECTION)
+
+OBJCOPY        = avr-objcopy
+OBJDUMP        = avr-objdump
+
+all:
+
+lilypad: TARGET = lilypad
+lilypad: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>1' '-DNUM_LED_FLASHES=3'
+lilypad: AVR_FREQ = 8000000L
+lilypad: $(PROGRAM)_lilypad.hex
+
+lilypad_isp: lilypad
+lilypad_isp: TARGET = lilypad
+lilypad_isp: HFUSE = DD
+lilypad_isp: LFUSE = E2
+lilypad_isp: EFUSE = 00
+lilypad_isp: isp
+
+lilypad_resonator: TARGET = lilypad_resonator
+lilypad_resonator: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=3'
+lilypad_resonator: AVR_FREQ = 8000000L
+lilypad_resonator: $(PROGRAM)_lilypad_resonator.hex
+
+lilypad_resonator_isp: lilypad_resonator
+lilypad_resonator_isp: TARGET = lilypad_resonator
+lilypad_resonator_isp: HFUSE = DD
+lilypad_resonator_isp: LFUSE = C6
+lilypad_resonator_isp: EFUSE = 00
+lilypad_resonator_isp: isp
+
+pro8: TARGET = pro_8MHz
+pro8: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' '-DWATCHDOG_MODS'
+pro8: AVR_FREQ = 8000000L
+pro8: $(PROGRAM)_pro_8MHz.hex
+
+pro8_isp: pro8
+pro8_isp: TARGET = pro_8MHz
+pro8_isp: HFUSE = DD
+pro8_isp: LFUSE = C6
+pro8_isp: EFUSE = 00
+pro8_isp: isp
+
+pro16: TARGET = pro_16MHz
+pro16: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' '-DWATCHDOG_MODS'
+pro16: AVR_FREQ = 16000000L
+pro16: $(PROGRAM)_pro_16MHz.hex
+
+pro16_isp: pro16
+pro16_isp: TARGET = pro_16MHz
+pro16_isp: HFUSE = DD
+pro16_isp: LFUSE = C6
+pro16_isp: EFUSE = 00
+pro16_isp: isp
+
+pro20: TARGET = pro_20mhz
+pro20: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' '-DWATCHDOG_MODS'
+pro20: AVR_FREQ = 20000000L
+pro20: $(PROGRAM)_pro_20mhz.hex
+
+pro20_isp: pro20
+pro20_isp: TARGET = pro_20mhz
+pro20_isp: HFUSE = DD
+pro20_isp: LFUSE = C6
+pro20_isp: EFUSE = 00
+pro20_isp: isp
+
+diecimila: TARGET = diecimila
+diecimila: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1'
+diecimila: AVR_FREQ = 16000000L
+diecimila: $(PROGRAM)_diecimila.hex
+
+diecimila_isp: diecimila
+diecimila_isp: TARGET = diecimila
+diecimila_isp: HFUSE = DD
+diecimila_isp: LFUSE = FF
+diecimila_isp: EFUSE = 00
+diecimila_isp: isp
+
+ng: TARGET = ng
+ng: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>1' '-DNUM_LED_FLASHES=3'
+ng: AVR_FREQ = 16000000L
+ng: $(PROGRAM)_ng.hex
+
+ng_isp: ng
+ng_isp: TARGET = ng
+ng_isp: HFUSE = DD
+ng_isp: LFUSE = FF
+ng_isp: EFUSE = 00
+ng_isp: isp
+
+atmega644: TARGET = atmega644
+atmega644: MCU_TARGET = atmega644p
+atmega644: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DDOUBLE_SPEED -DBAUD_RATE=115200
+atmega644: AVR_FREQ = 12000000L
+atmega644: LDSECTION  = --section-start=.text=0x7000
+atmega644: $(PROGRAM)_atmega644p.hex
+
+atmega644_isp: atmega644
+atmega644_isp: TARGET = atmega644
+atmega644_isp: MCU_TARGET = atmega644p
+atmega644_isp: HFUSE = D8
+atmega644_isp: LFUSE = FF
+atmega644_isp: EFUSE = FF
+atmega644_isp: isp
+
+atmega328: TARGET = atmega328
+atmega328: MCU_TARGET = atmega328p
+atmega328: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600
+atmega328: AVR_FREQ = 16000000L
+atmega328: LDSECTION  = --section-start=.text=0x7800
+atmega328: $(PROGRAM)_atmega328.hex
+
+atmega328_isp: atmega328
+atmega328_isp: TARGET = atmega328
+atmega328_isp: MCU_TARGET = atmega328p
+atmega328_isp: HFUSE = DA
+atmega328_isp: LFUSE = FF
+atmega328_isp: EFUSE = 05
+atmega328_isp: isp
+
+atmega328_notp: TARGET = atmega328_notp
+atmega328_notp: MCU_TARGET = atmega328
+atmega328_notp: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600
+atmega328_notp: AVR_FREQ = 16000000L
+atmega328_notp: LDSECTION  = --section-start=.text=0x7800
+atmega328_notp: $(PROGRAM)_atmega328_notp.hex
+
+atmega328_notp_isp: atmega328_notp
+atmega328_notp_isp: TARGET = atmega328
+atmega328_notp_isp: MCU_TARGET = atmega328
+atmega328_notp_isp: HFUSE = DA
+atmega328_notp_isp: LFUSE = FF
+atmega328_notp_isp: EFUSE = 05
+atmega328_notp_isp: isp
+
+atmega328_pro8: TARGET = atmega328_pro_8MHz
+atmega328_pro8: MCU_TARGET = atmega328p
+atmega328_pro8: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 -DDOUBLE_SPEED
+atmega328_pro8: AVR_FREQ = 8000000L
+atmega328_pro8: LDSECTION  = --section-start=.text=0x7800
+atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.hex
+
+atmega328_pro8_isp: atmega328_pro8
+atmega328_pro8_isp: TARGET = atmega328_pro_8MHz
+atmega328_pro8_isp: MCU_TARGET = atmega328p
+atmega328_pro8_isp: HFUSE = DA
+atmega328_pro8_isp: LFUSE = FF
+atmega328_pro8_isp: EFUSE = 05
+atmega328_pro8_isp: isp
+
+mega: TARGET = atmega1280
+mega: MCU_TARGET = atmega1280
+mega: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=0' -DBAUD_RATE=57600
+mega: AVR_FREQ = 16000000L
+mega: LDSECTION  = --section-start=.text=0x1F000
+mega: $(PROGRAM)_atmega1280.hex
+
+mega_isp: mega
+mega_isp: TARGET = atmega1280
+mega_isp: MCU_TARGET = atmega1280
+mega_isp: HFUSE = DA
+mega_isp: LFUSE = FF
+mega_isp: EFUSE = F5
+mega_isp: isp
+
+isp: $(TARGET)
+       $(ISPFUSES)
+       $(ISPFLASH)
+
+isp-stk500: $(PROGRAM)_$(TARGET).hex
+       $(STK500-1)
+       $(STK500-2)
+
+%.elf: $(OBJ)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
+
+clean:
+       rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex
+
+%.lst: %.elf
+       $(OBJDUMP) -h -S $< > $@
+
+%.hex: %.elf
+       $(OBJCOPY) -j .text -j .data -O ihex $< $@
+
+%.srec: %.elf
+       $(OBJCOPY) -j .text -j .data -O srec $< $@
+
+%.bin: %.elf
+       $(OBJCOPY) -j .text -j .data -O binary $< $@
+       
index f5a85efbf849160e8be669a460bbe49b9ab80014..df6c2749e0480458008637f560eb27b4152462fc 100644 (file)
Binary files a/kicad/bom.ods and b/kicad/bom.ods differ
index 5a8fabb8b03510d9de49d021010b00be09001192..26e79521a8f87ef6c0054b383a50eae1dad96d65 100644 (file)
@@ -60,24 +60,31 @@ Q1 bewusst nahe am Rand platziert, damit keine Kollision mit Lötstelle J1-15 au
 
 ## Fehler / Verbesserungen
 
+ Datum    | Reference      | Beschreibung                                               |
+--------- | -------------- | ---------------------------------------------------------- |
+16.6.2024 | J3, U3, U1     | JLCPCB plugin, Rotation um 90°                             |
+
+
 ### Konzept
 
 Keine
 
 ### Schaltung
 
-Keine
+ Datum    | Reference          | Beschreibung                                               |
+--------- | ------------------ | ---------------------------------------------------------- |
+12.7.2024 | R1                 | Änderung 560R -> 1K (JLCPCB C4410)                         |
+12.7.2024 | R3                 | Änderung 560R -> 4K7 (JLCPCB C17936)                       |
+12.7.2024 | Netz LED-GREEN/PC2 | Umbenennung auf Netz LED-RED/PC2                           |
+12.7.2024 | Netz LED-RED/PC4   | Umbenennung auf Netz LED-GRENN/PC4                         |
 
-| Reference      | Beschreibung                                               |
-| -------------- | ---------------------------------------------------------- |
 
 ### Bestückung
 
-Keine
-
-| Reference      | Beschreibung                                               |
-| -------------- | ---------------------------------------------------------- |
-| J3, U3, U1     | JLCPCB plugin, Rotation um 90°                             |
+ Datum    | Reference      | Beschreibung                                               |
+--------- | -------------- | ---------------------------------------------------------- |
+12.7.2024 | R1             | Änderung 560R -> 1K (JLCPCB C4410)                         |
+12.7.2024 | R3             | Änderung 560R -> 4K7 (JLCPCB C17936)                       |
 
 ### Funktion / Software
 
@@ -87,4 +94,23 @@ Keine
 
 ## Inbetriebnahme / Test
 
-Noch nicht erfolgt.
+### Erstinbetriebnahme (2.7.2024/SX)
+
+Folgende Einheiten getestet:
+
+* µC: OK
+* USB-C: OK
+* UART0: OK
+* UART1: OK
+* ISP: OK
+* LEDs: Deaktivierung JTAG-Interface via Fuses erforderlich, Grün und Rot zu hell -> Anpassung der Vorwiderstände erforderlich
+* Reset-Taster: OK
+* Taster SW2: OK
+
+Noch nicht getestet:
+
+* 868MHz-Modem (U3, E07-900MM10S)
+* RTC (U5, BM8563EMA)
+
+
+C16 des CH349K ist sehr nahe an einem der LED-Vorwiderständen die zu tauschen sind. Daher besondere Vorsicht beim Austausch von R1!
index 06fae9b89f74451e44e593d7030c6ae2cc8f96da..e21e3abf13315b77a5f3666fb2ab1e7605735aa6 100644 (file)
Binary files a/kicad/dist/v1a/nano-644_v1a_schematic-bw.pdf and b/kicad/dist/v1a/nano-644_v1a_schematic-bw.pdf differ
index 682194c53f258e84875e35d17721f9debfc98cd8..75e224724ecdcdb04de7b4dc79590e7bee5f5e51 100644 (file)
Binary files a/kicad/dist/v1a/nano-644_v1a_schematic.pdf and b/kicad/dist/v1a/nano-644_v1a_schematic.pdf differ
index 345830fff1dd03f60c55775887a85ebdfc4bfd6e..037884b292068f22e19295818c85fee712452708 100644 (file)
Binary files a/kicad/dist/v1a/nano-664_v1a_bom.pdf and b/kicad/dist/v1a/nano-664_v1a_bom.pdf differ
index 9facdefd0cf35d20185f74de70b5387c153d75ff..f32600e1abf7b642198a9f98a508b75afe1239db 100644 (file)
@@ -2,16 +2,13 @@ cd0939076bea3bbfc7f43482d4ef51a0b6bae810384ebbc7c871fe304cc4f547  ./nano-644_v1a
 f14de00b6f5b7f684754fa891f65af34f711059627ce607c53b75f4e89968869  ./nano-644_v1a_image-front.png
 a123293f3764f899ee23a7de2b31aeaa9b7ca42deabd8db167462433b47dd948  ./nano-644_v1a_image-front_no-comp.png
 ab7ec2575437005e1491c88af3d4f0f7c0fe911f17f33eeaa7bcb1eacb91cbce  ./nano-644_v1a_image-back.png
-dba98903ea60230eab725333e6eea293a5cc35b750c8d9d672eb39d419361a59  ./README.md
-3d87c10a757ca599e0a60a7b6273b5a1b80743dbb2374e25774e201a639a6459  ./sha256
-bf94b5cfb3b45d6e431913b6246689d5e89661f3b483224a4e1525fdfc8cdb26  ./production_files/order-payment.png
+5a1a5d8673bbec138cb4a27bc73b78aa5edab0039229bfa00c1adc0a89dc9861  ./README.md
+a8a0472884e79a33d3e1aabc50968060d8ad8c7482b511c623ef5a6e21a7bdf6  ./sha256
 706a4baf6b2be008b120eb2e3a66aad21ca4fb303f16679610f3ececa631ede2  ./production_files/BOM-nano-644.csv
 0a1deec3331a56b3f79fc29161304db9a0cdbd36578cf15c90c457ac87eb8781  ./production_files/CPL-nano-644.csv
 4d4996d5c766df92c4dfdc5b2a7846a8937f97ff9548fc433535af31683d4a5f  ./production_files/GERBER-nano-644.zip
-6d6e6669787b557e5a0e7187bf30a312328f59a38a69d1269d2f61847f375841  ./production_files/order-charge-details.png
-43dbce940940895c1540fce7ebfd9687fede70303b44716a92990842d46783c3  ./production_files/order-shopping-cart.png
 5341d2c20fa5cde483bd389e72d3a912cd24d135e67f0ef4f89731be5436a37a  ./nano-644_v1a_bestueckung.pdf
-f843f4667b73bb27b426dbd0a1020d16d642ca8a1cead38cb2feff84fa81b1ec  ./nano-644_v1a_schematic-bw.pdf
+2ae8120e387e8147029823e9ea83679394b99680c4a769497e52d0aee24c7944  ./nano-644_v1a_schematic-bw.pdf
 50092cfeb720d5cab0f7f7ad7681966ec23d7cf31de4a28fd1629eedfc35ca30  ./lagen/svg/nano-644-F_Fab.svg
 586489aa67a5b2ccd42f2e3ca79a6d2cf8618fabc5117c03e785a2452905bf91  ./lagen/svg/nano-644-B_Cu.svg
 7cd35fb0456ef780ffa164c2a3652bd81fb4662e659e34e7b0a823126fd62f07  ./lagen/svg/nano-644-In2_Cu.svg
@@ -30,9 +27,15 @@ ffff0edc99972b868b0a96c4d54d1f9a142ca2403bc08c92db7f2222fb4b0954  ./lagen/pdf/na
 1dde2e6086d5ec98ed5e21c4661365047cf76ca7d4148f1dcc939bbb1aa54752  ./lagen/pdf/nano-644-In2_Cu.pdf
 4b5ae3868fc2c23ea32eb4b1c5f0679df665677780d99cf96df789cd19eecde8  ./lagen/pdf/nano-644-B_Fab.pdf
 b0b1a6b98c42bc9b5b4c1e59dd2e82cc50b395c3273e8d46009b616604c0c46c  ./lagen/pdf/nano-644-F_Cu.pdf
+bf94b5cfb3b45d6e431913b6246689d5e89661f3b483224a4e1525fdfc8cdb26  ./order_W202406171605422_2024-06-17/order-payment.png
+6d6e6669787b557e5a0e7187bf30a312328f59a38a69d1269d2f61847f375841  ./order_W202406171605422_2024-06-17/order-charge-details.png
+031c7d0d8838e1f44c623936677c8f775c4dbc7ba387c4aacfa366c9e2414197  ./order_W202406171605422_2024-06-17/kosten.txt
+43dbce940940895c1540fce7ebfd9687fede70303b44716a92990842d46783c3  ./order_W202406171605422_2024-06-17/order-shopping-cart.png
+ceacfb2a41c2566b0bbf98ca68332d7c1379e992ae05b120677d21718d5b0471  ./order_W202406171605422_2024-06-17/order-component-placement-bottom.png
+b7cb972a265345c6c5ef5c1ebeef6e3f1249057ad1c7793685911d2ecab58e3e  ./order_W202406171605422_2024-06-17/order-component-placement-top.png
 994422e4d7801264bd761460b161c05a10e9350f9a6f926d000278aee9ea4b9c  ./reports/bom.csv
 b6ac49554fc039148501dc0169f29b84a95cb05256b7fdf0b2495889ddce7a4b  ./reports/jlcpcb-plugin
 af8cc9e2b0974fbcac6f4cf778fe883c7dc2febd20057a4ab4582ba9807c9b86  ./reports/DRC.rpt
 966604422d68b4c5160aabc76740a8c3828e0c08af5518301ca567e0ce8f2095  ./reports/ERC.rpt
-90858ba1bb775852a2cbd4a44d1d4e2add168777d809f20c5f8e86801053a900  ./nano-664_v1a_bom.pdf
-b5d461bab8a0fdca25619c6bc3aa9368220269f25e4d9a3383d74dbfe868a2ce  ./nano-644_v1a_schematic.pdf
+8d02de3a493212395b26aff005a25d883c70f69fb1aef750b2361ea38b0be859  ./nano-664_v1a_bom.pdf
+ad99c4c53aa6990d0fc43ebc610ccf1efd04a7e9948b6d9ccaf49acccd73c39b  ./nano-644_v1a_schematic.pdf
index 072ba8d094091aad5bf9f10dfbf7fa8f22310c5d..7605b1fddc7004ae4c2c92b20b94ecd15170e751 100644 (file)
@@ -9,7 +9,7 @@
        (paper "A4")
        (title_block
                (title "Nano-644")
-               (date "2024-06-11")
+               (date "2024-07-12")
                (rev "V1a")
                (company "HTBLA Kaindorf ")
                (comment 1 "SX/LI")
        (net 63 "/MISO{slash}PB6")
        (net 64 "/PA0{slash}ADC0")
        (net 65 "/PB2{slash}INT2{slash}AIN0")
-       (net 66 "/LED-GREEN{slash}PC2")
+       (net 66 "/LED-RED{slash}PC2")
        (net 67 "/LED-YELLOW{slash}PC3")
-       (net 68 "/LED-RED{slash}PC4")
+       (net 68 "/LED-GREEN{slash}PC4")
        (net 69 "/~{CS}")
        (net 70 "Net-(U4-TXD)")
        (net 71 "/~{SW2}{slash}PC5")
                                )
                        )
                )
-               (property "Value" "560R"
+               (property "Value" "4K7"
                        (at 0 1.65 90)
                        (layer "F.Fab")
                        (hide yes)
                                )
                        )
                )
-               (property "LCSC" "C28636"
+               (property "LCSC" "C17936"
                        (at 0 0 -90)
                        (unlocked yes)
                        (layer "F.Fab")
                                )
                        )
                )
+               (property "LCSC-Link" "https://jlcpcb.com/partdetail/18624-1206W4F4701T5E/C17936"
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "700c1bec-681f-4478-a697-3b74a39b001e")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "DIGIKEY" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "2391f343-b0f8-4e78-b1b2-b143d7dd2ba1")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "DIGIKEY-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "fc95e59e-3bc6-45f7-a7d9-c106ac862be0")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "REICHELT" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "f0846d15-e267-4eff-a6cf-bf3a801809cc")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "REICHELT-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "6548e139-eee8-4b2b-8f53-644795107120")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "RS" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "a1c9a9ee-188b-497c-ab7a-0ca796023da9")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "RS-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "c41de729-db7f-4e1a-9ef0-0bde49383426")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "CONRAD" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "ddd8602b-5998-4193-833b-1e02149842b5")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "CONRAD-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "88908c18-2a91-4431-8029-ff9049a2143b")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "EBAY" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "11f4df6e-fb7e-4127-aa7f-8086c5717fea")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "EBAY-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "7153aaba-7171-48f8-a33b-d1eb6f1c01cc")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "MOUSER" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "70a88fac-cf5c-4975-84e1-bcd9282c43cb")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "MOUSER-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "b0dad899-e157-4181-b83b-cccc604947da")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
                (property ki_fp_filters "R_*")
                (path "/e094a73d-603e-4098-a5e9-6bacedeed6ba")
                (sheetname "Stammblatt")
                        (size 1.2 1.4)
                        (layers "F.Cu" "F.Paste" "F.Mask")
                        (roundrect_rratio 0.208333)
-                       (net 68 "/LED-RED{slash}PC4")
+                       (net 68 "/LED-GREEN{slash}PC4")
                        (pintype "passive")
                        (uuid "102c52a8-7043-48e3-b294-9c0fb6612bfc")
                )
                                )
                        )
                )
-               (property "Value" "560R"
+               (property "Value" "1K"
                        (at 0 1.65 90)
                        (layer "F.Fab")
                        (hide yes)
                                )
                        )
                )
-               (property "LCSC" "C28636"
+               (property "LCSC" "C4410"
                        (at 0 0 -90)
                        (unlocked yes)
                        (layer "F.Fab")
                                )
                        )
                )
+               (property "LCSC-Link" "https://jlcpcb.com/partdetail/4817-1206W4F1001T5E/C4410"
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "8bd5436d-9d9c-4fa8-bb17-50d3fd880b22")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "DIGIKEY" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "4a7b2f68-1e7c-4558-899d-99204bacfd75")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "DIGIKEY-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "c3168779-6461-4c18-97bc-3fa9cd4b0ca0")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "REICHELT" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "b70d49e4-7d36-445b-a5c5-f837e44269be")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "REICHELT-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "46e98806-ce70-4db7-a8d1-b6b5a257ba66")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "RS" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "6bff66bb-973d-43aa-8ab5-7c61cdc6c7ec")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "RS-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "c81e10f8-1b83-41e0-8094-92d48287e24e")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "CONRAD" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "efe4cf80-7897-45f4-bdd7-078e4e3a3a9d")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "CONRAD-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "336252d2-3590-4d81-b6cc-f48d7c470dfa")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "EBAY" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "cadd9d22-915e-4664-8014-dea062e7c2f0")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "EBAY-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "c8ef5d97-2650-4870-97e8-15df8c90eba4")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "MOUSER" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "711f571c-10d6-4fc9-b882-c55a656ec1a5")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
+               (property "MOUSER-LINK" ""
+                       (at 0 0 -90)
+                       (unlocked yes)
+                       (layer "F.Fab")
+                       (hide yes)
+                       (uuid "a087dc75-e77b-4392-b36e-b9fd4a3d79bb")
+                       (effects
+                               (font
+                                       (size 1 1)
+                                       (thickness 0.15)
+                               )
+                       )
+               )
                (property ki_fp_filters "R_*")
                (path "/4d0a896d-8a94-4c0e-a8e6-470ac5b7108b")
                (sheetname "Stammblatt")
                        (size 1.2 1.4)
                        (layers "F.Cu" "F.Paste" "F.Mask")
                        (roundrect_rratio 0.208333)
-                       (net 66 "/LED-GREEN{slash}PC2")
+                       (net 66 "/LED-RED{slash}PC2")
                        (pintype "passive")
                        (uuid "5130eae2-fb78-466d-927f-6543fca91357")
                )
                        (size 0.25 1.075)
                        (layers "B.Cu" "B.Paste" "B.Mask")
                        (roundrect_rratio 0.25)
-                       (net 66 "/LED-GREEN{slash}PC2")
+                       (net 66 "/LED-RED{slash}PC2")
                        (pinfunction "PC2")
                        (pintype "bidirectional")
                        (uuid "3739242b-f224-4e02-b83b-dd031ff32df6")
                        (size 1.075 0.25)
                        (layers "B.Cu" "B.Paste" "B.Mask")
                        (roundrect_rratio 0.25)
-                       (net 68 "/LED-RED{slash}PC4")
+                       (net 68 "/LED-GREEN{slash}PC4")
                        (pinfunction "PC4")
                        (pintype "bidirectional")
                        (uuid "a93e1459-5739-4a94-903b-e96b97dc2f51")
index 511361c7d058e479c2c074c5cdc8ed846d3e2b7e..cf069ca743be788ac7827144c6b5d083e3d68e8d 100644 (file)
           "label": "JLCPCB Rotation Offset",
           "name": "JLCPCB Rotation Offset",
           "show": false
+        },
+        {
+          "group_by": false,
+          "label": "EBAY",
+          "name": "EBAY",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "CONRAD",
+          "name": "CONRAD",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "MOUSER",
+          "name": "MOUSER",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "MOUSER-LINK",
+          "name": "MOUSER-LINK",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "REICHELT",
+          "name": "REICHELT",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "REICHELT-LINK",
+          "name": "REICHELT-LINK",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "RS",
+          "name": "RS",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "RS-LINK",
+          "name": "RS-LINK",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "CONRAD-LINK",
+          "name": "CONRAD-LINK",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "DIGIKEY",
+          "name": "DIGIKEY",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "DIGIKEY-LINK",
+          "name": "DIGIKEY-LINK",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "EBAY-LINK",
+          "name": "EBAY-LINK",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "LCSC-Link",
+          "name": "LCSC-Link",
+          "show": false
         }
       ],
       "filter_string": "",
index 85a6c38c334bb1b21fc306c05c2fada72ff157db..3995747eb6d1808e33691e00dd8c744008834374 100644 (file)
@@ -6,7 +6,7 @@
        (paper "A4")
        (title_block
                (title "Nano-644")
-               (date "2024-06-17")
+               (date "2024-07-12")
                (rev "V1a")
                (company "HTBLA Kaindorf")
                (comment 1 "SX/LI")
                )
                (uuid "1c1a8836-0d09-4023-b572-291dadde3588")
        )
-       (label "LED-RED{slash}PC4"
+       (label "LED-GREEN{slash}PC4"
                (at 86.36 100.33 0)
                (fields_autoplaced yes)
                (effects
                )
                (uuid "6947ceeb-8c57-4731-8b6e-f6546079d328")
        )
-       (label "LED-GREEN{slash}PC2"
+       (label "LED-RED{slash}PC2"
                (at 86.36 95.25 0)
                (fields_autoplaced yes)
                (effects
                )
                (uuid "b54e705b-40a6-405f-a7a7-cb27bf069128")
        )
-       (label "LED-GREEN{slash}PC2"
+       (label "LED-RED{slash}PC2"
                (at 77.47 167.64 0)
                (fields_autoplaced yes)
                (effects
                )
                (uuid "eda604a6-3080-4dde-a780-2a659db038c0")
        )
-       (label "LED-RED{slash}PC4"
+       (label "LED-GREEN{slash}PC4"
                (at 77.47 182.88 0)
                (fields_autoplaced yes)
                (effects
                                )
                        )
                )
-               (property "Value" "560R"
+               (property "Value" "1K"
                        (at 102.362 165.354 90)
                        (effects
                                (font
                                (hide yes)
                        )
                )
-               (property "Description" "125mW Thick Film Resistors 150V ±100ppm/℃ ±1% 560Ω 0805 Chip Resistor - Surface Mount ROHS"
+               (property "Description" "250mW Thick Film Resistors 200V ±1% 1kΩ 1206 Chip Resistor - Surface Mount ROHS"
                        (at 100.33 167.64 0)
                        (effects
                                (font
                                (hide yes)
                        )
                )
-               (property "LCSC" "C28636"
+               (property "LCSC" "C4410"
                        (at 100.33 167.64 0)
                        (effects
                                (font
                                (hide yes)
                        )
                )
+               (property "LCSC-Link" "https://jlcpcb.com/partdetail/4817-1206W4F1001T5E/C4410"
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "DIGIKEY" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "DIGIKEY-LINK" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "REICHELT" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "REICHELT-LINK" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "RS" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "RS-LINK" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "CONRAD" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "CONRAD-LINK" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "EBAY" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "EBAY-LINK" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "MOUSER" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "MOUSER-LINK" ""
+                       (at 100.33 167.64 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
                (pin "2"
                        (uuid "8f93c7ad-7839-40aa-8d4d-49ef2b89493b")
                )
                                )
                        )
                )
-               (property "Value" "560R"
+               (property "Value" "4K7"
                        (at 102.362 180.594 90)
                        (effects
                                (font
                                (hide yes)
                        )
                )
-               (property "LCSC" "C28636"
+               (property "LCSC" "C17936"
                        (at 100.33 182.88 0)
                        (effects
                                (font
                                (hide yes)
                        )
                )
+               (property "LCSC-Link" "https://jlcpcb.com/partdetail/18624-1206W4F4701T5E/C17936"
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "DIGIKEY" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "DIGIKEY-LINK" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "REICHELT" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "REICHELT-LINK" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "RS" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "RS-LINK" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "CONRAD" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "CONRAD-LINK" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "EBAY" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "EBAY-LINK" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "MOUSER" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
+               (property "MOUSER-LINK" ""
+                       (at 100.33 182.88 0)
+                       (effects
+                               (font
+                                       (size 1.27 1.27)
+                               )
+                               (hide yes)
+                       )
+               )
                (pin "2"
                        (uuid "a1fae828-704c-466c-8800-17e98e6a2ba6")
                )