Browse Source

adds support for the atmega328 (#9043)

Co-authored-by: Ryan <fauxpark@gmail.com>
itsnoteasy 5 years ago
parent
commit
7aa4cc9603

+ 2 - 2
docs/adc_driver.md

@@ -22,7 +22,7 @@ Then place this include at the top of your code:
 
 ### AVR
 
-|Channel|AT90USB64/128|ATmega16/32U4|ATmega32A|ATmega328P|
+|Channel|AT90USB64/128|ATmega16/32U4|ATmega32A|ATmega328/P|
 |-------|-------------|-------------|---------|----------|
 |0      |`F0`         |`F0`         |`A0`     |`C0`      |
 |1      |`F1`         |`F1`         |`A1`     |`C1`      |
@@ -39,7 +39,7 @@ Then place this include at the top of your code:
 |12     |             |`B5`         |         |          |
 |13     |             |`B6`         |         |          |
 
-<sup>\* The ATmega328P possesses two extra ADC channels; however, they are not present on the DIP pinout, and are not shared with GPIO pins. You can use `adc_read()` directly to gain access to these.</sup>
+<sup>\* The ATmega328/P possesses two extra ADC channels; however, they are not present on the DIP pinout, and are not shared with GPIO pins. You can use `adc_read()` directly to gain access to these.</sup>
 
 ### ARM
 

+ 1 - 0
docs/compatible_microcontrollers.md

@@ -14,6 +14,7 @@ Certain MCUs which do not have native USB will use [V-USB](https://www.obdev.at/
 
 * [ATmega32A](https://www.microchip.com/wwwproducts/en/ATmega32A)
 * [ATmega328P](https://www.microchip.com/wwwproducts/en/ATmega328P)
+* [ATmega328](https://www.microchip.com/wwwproducts/en/ATmega328)
 
 ## ARM
 

+ 1 - 1
docs/feature_backlight.md

@@ -89,7 +89,7 @@ BACKLIGHT_DRIVER = pwm
 
 Hardware PWM is supported according to the following table:
 
-|Backlight Pin|AT90USB64/128|ATmega16/32U4|ATmega16/32U2|ATmega32A|ATmega328P|
+|Backlight Pin|AT90USB64/128|ATmega16/32U4|ATmega16/32U2|ATmega32A|ATmega328/P|
 |-------------|-------------|-------------|-------------|---------|----------|
 |`B1`         |             |             |             |         |Timer 1   |
 |`B2`         |             |             |             |         |Timer 1   |

+ 1 - 1
docs/spi_driver.md

@@ -11,7 +11,7 @@ No special setup is required - just connect the `SS`, `SCK`, `MOSI` and `MISO` p
 |ATMega16/32U2/4|`B0`|`B1` |`B2`  |`B3`  |
 |AT90USB64/128  |`B0`|`B1` |`B2`  |`B3`  |
 |ATmega32A      |`B4`|`B7` |`B5`  |`B6`  |
-|ATmega328P     |`B2`|`B5` |`B3`  |`B4`  |
+|ATmega328/P    |`B2`|`B5` |`B3`  |`B4`  |
 
 You may use more than one slave select pin, not just the `SS` pin. This is useful when you have multiple devices connected and need to communicate with them individually.
 `SPI_SS_PIN` can be passed to `spi_start()` to refer to `SS`.

+ 2 - 2
drivers/avr/analog.c

@@ -38,7 +38,7 @@ int16_t analogRead(uint8_t pin) {
     // clang-format on
     if (pin >= 12) return 0;
     return adc_read(pgm_read_byte(pin_to_mux + pin));
-#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega328P__)
+#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
     if (pin >= 8) return 0;
     return adc_read(pin);
 #else
@@ -85,7 +85,7 @@ uint8_t pinToMux(pin_t pin) {
         case A6: return _BV(MUX2) | _BV(MUX1);  // ADC6
         case A7: return _BV(MUX2) | _BV(MUX1) | _BV(MUX0);  // ADC7
         default: return _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0);  // 0V
-#elif defined(__AVR_ATmega328P__)
+#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
         case C0: return 0;  // ADC0
         case C1: return _BV(MUX0);  // ADC1
         case C2: return _BV(MUX1);  // ADC2

+ 1 - 1
drivers/avr/spi_master.c

@@ -28,7 +28,7 @@
 #    define SPI_SCK_PIN B7
 #    define SPI_MOSI_PIN B5
 #    define SPI_MISO_PIN B6
-#elif defined(__AVR_ATmega328P__)
+#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
 #    define SPI_SCK_PIN B5
 #    define SPI_MOSI_PIN B3
 #    define SPI_MISO_PIN B4

+ 1 - 1
drivers/avr/spi_master.h

@@ -25,7 +25,7 @@ typedef int16_t spi_status_t;
 #    define SPI_SS_PIN B0
 #elif defined(__AVR_ATmega32A__)
 #    define SPI_SS_PIN B4
-#elif defined(__AVR_ATmega328P__)
+#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
 #    define SPI_SS_PIN B2
 #endif
 

+ 1 - 1
quantum/backlight/backlight_avr.c

@@ -103,7 +103,7 @@
 #        define COMxx1 COM1A1
 #        define OCRxx OCR1A
 #    endif
-#elif defined(__AVR_ATmega328P__) && (BACKLIGHT_PIN == B1 || BACKLIGHT_PIN == B2)
+#elif (defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)) && (BACKLIGHT_PIN == B1 || BACKLIGHT_PIN == B2)
 #    define HARDWARE_PWM
 #    define ICRx ICR1
 #    define TCCRxA TCCR1A

+ 1 - 1
quantum/config_common.h

@@ -58,7 +58,7 @@
 #        define PINC_ADDRESS 0x3
 #        define PINB_ADDRESS 0x6
 #        define PINA_ADDRESS 0x9
-#    elif defined(__AVR_ATmega328P__)
+#    elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
 #        define ADDRESS_BASE 0x00
 #        define PINB_ADDRESS 0x3
 #        define PINC_ADDRESS 0x6

+ 18 - 0
quantum/mcu_selection.mk

@@ -288,6 +288,24 @@ ifneq (,$(filter $(MCU),atmega328p))
   NO_SUSPEND_POWER_DOWN ?= yes
 endif
 
+ifneq (,$(filter $(MCU),atmega328))
+  # MCU name for avrdude
+  AVRDUDE_MCU = m328
+
+  PROTOCOL = VUSB
+
+  # Processor frequency.
+  #     This will define a symbol, F_CPU, in all source code files equal to the
+  #     processor frequency in Hz. You can then use this symbol in your source code to
+  #     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+  #     automatically to create a 32-bit value in your source code.
+  F_CPU ?= 16000000
+
+  # unsupported features for now
+  NO_UART ?= yes
+  NO_SUSPEND_POWER_DOWN ?= yes
+endif
+
 ifneq (,$(filter $(MCU),attiny85))
   PROTOCOL = VUSB
 

+ 1 - 1
tmk_core/common/avr/bootloader.c

@@ -247,7 +247,7 @@ void bootloader_jump(void) {
 
 #else  // Assume remaining boards are DFU, even if the flag isn't set
 
-#    if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATtiny85__))  // no USB - maybe BOOTLOADER_BOOTLOADHID instead though?
+#    if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATtiny85__))  // no USB - maybe BOOTLOADER_BOOTLOADHID instead though?
     UDCON  = 1;
     USBCON = (1 << FRZCLK);  // disable USB
     UCSR1B = 0;

+ 1 - 1
tmk_core/common/uart.c

@@ -31,7 +31,7 @@
 
 #include "uart.h"
 
-#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__)
+#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
 #    define UDRn UDR0
 #    define UBRRnL UBRR0L
 #    define UCSRnA UCSR0A