Browse Source

Refactored bootloader jumping. Added USBaspLoader support.

tmk 14 năm trước cách đây
mục cha
commit
e65575d4a5
10 tập tin đã thay đổi với 107 bổ sung17 xóa
  1. 22 0
      bootloader.c
  2. 25 0
      bootloader.h
  3. 4 5
      command.c
  4. 1 0
      common.mk
  5. 1 1
      pjrc.mk
  6. 2 1
      pjrc/bootloader_teensy.c
  7. 0 7
      pjrc/jump_bootloader.h
  8. 2 2
      pjrc/main.c
  9. 3 1
      vusb.mk
  10. 47 0
      vusb/bootloader_usbasp.c

+ 22 - 0
bootloader.c

@@ -0,0 +1,22 @@
+/*
+Copyright 2011 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "bootloader.h"
+
+
+void bootloader_jump(void) __attribute__ ((weak));
+void bootloader_jump(void) {}

+ 25 - 0
bootloader.h

@@ -0,0 +1,25 @@
+/*
+Copyright 2011 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef BOOTLOADER_H
+#define BOOTLOADER_H
+
+
+/* give code for your bootloader to come up if needed */
+void bootloader_jump(void);
+
+#endif

+ 4 - 5
command.c

@@ -25,10 +25,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "timer.h"
 #include "layer.h"
 #include "matrix.h"
+#include "bootloader.h"
 #include "command.h"
 
 #ifdef HOST_PJRC
-#   include "jump_bootloader.h"
 #   include "usb_keyboard.h"
 #   ifdef EXTRAKEY_ENABLE
 #       include "usb_extra.h"
@@ -78,13 +78,12 @@ static uint8_t command_common(void)
             help();
             break;
         case KB_B:
-#ifdef HOST_PJRC
             host_clear_keyboard_report();
             host_send_keyboard_report();
-            print("jump to bootloader...\n");
+            print("jump to bootloader... ");
             _delay_ms(1000);
-            jump_bootloader(); // not return
-#endif
+            bootloader_jump(); // not return
+            print("not supported.\n");
             break;
         case KB_D:
             debug_enable = !debug_enable;

+ 1 - 0
common.mk

@@ -4,6 +4,7 @@ SRC +=	host.c \
 	layer.c \
 	timer.c \
 	print.c \
+	bootloader.c \
 	util.c
 
 

+ 1 - 1
pjrc.mk

@@ -4,7 +4,7 @@ SRC +=	pjrc.c \
 	usb_keyboard.c \
 	usb_debug.c \
 	usb.c \
-	jump_bootloader.c
+	bootloader_teensy.c
 
 
 # Search Path

+ 2 - 1
pjrc/jump_bootloader.c → pjrc/bootloader_teensy.c

@@ -2,8 +2,9 @@
 #include <avr/io.h>
 #include <avr/interrupt.h>
 #include <util/delay.h>
+#include "bootloader.h"
 
-void jump_bootloader(void) {
+void bootloader_jump(void) {
     cli();
     // disable watchdog, if enabled
     // disable all peripherals

+ 0 - 7
pjrc/jump_bootloader.h

@@ -1,7 +0,0 @@
-/* See  http://www.pjrc.com/teensy/jump_to_bootloader.html */
-#ifndef JUMP_BOOTLOADER_H
-#define JUMP_BOOTLOADER_H 1
-
-void jump_bootloader(void);
-
-#endif

+ 2 - 2
pjrc/main.c

@@ -31,7 +31,7 @@
 #include "print.h"
 #include "debug.h"
 #include "util.h"
-#include "jump_bootloader.h"
+#include "bootloader.h"
 #ifdef PS2_MOUSE_ENABLE
 #   include "ps2_mouse.h"
 #endif
@@ -86,7 +86,7 @@ int main(void)
     if (matrix_key_count() >= 4) {
         print("jump to bootloader...\n");
         _delay_ms(1000);
-        jump_bootloader(); // not return
+        bootloader_jump(); // not return
     }
 
 

+ 3 - 1
vusb.mk

@@ -3,7 +3,9 @@ OPT_DEFS += -DHOST_VUSB
 SRC +=	vusb.c \
 	usbdrv.c \
 	usbdrvasm.S \
-	oddebug.c
+	oddebug.c \
+	bootloader_usbasp.c \
+
 
 ifdef NO_UART
 SRC +=	sendchar_null.c

+ 47 - 0
vusb/bootloader_usbasp.c

@@ -0,0 +1,47 @@
+/*
+Copyright 2011 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include "bootloader.h"
+
+
+void bootloader_jump(void) {
+    cli();
+    // This makes custom USBasploader come up.
+    MCUSR = 0;
+
+    // ATmega168PA
+    // initialize ports
+    PORTB = 0; PORTC= 0; PORTD = 0;
+    DDRB = 0; DDRC= 0; DDRD = 0;
+
+    // disable interrupts
+    EIMSK = 0; EECR = 0; SPCR = 0;
+    ACSR = 0; SPMCSR = 0; WDTCSR = 0; PCICR = 0;
+    TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0;
+    ADCSRA = 0; TWCR = 0; UCSR0B = 0;
+    
+    // Boot Loader Section Start Address:
+    // BOOTSZ       Size        Address
+    // (lock bit)   (word)      (word)      (byte)
+    // '11'         128         0x1F80      0x3F00
+    // '10'         256         0x1F00      0x3E00
+    // '01'         512         0x1E00      0x3C00
+    // '00'         1024        0x1C00      0x3800
+    asm volatile("jmp 0x3800");
+}