forked from mirrors/qmk_userspace
		
	Refactored bootloader jumping. Added USBaspLoader support.
This commit is contained in:
		
					parent
					
						
							
								e67c988824
							
						
					
				
			
			
				commit
				
					
						e65575d4a5
					
				
			
		
					 10 changed files with 107 additions and 17 deletions
				
			
		
							
								
								
									
										22
									
								
								bootloader.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								bootloader.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								bootloader.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								bootloader.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@ SRC +=	host.c \
 | 
			
		|||
	layer.c \
 | 
			
		||||
	timer.c \
 | 
			
		||||
	print.c \
 | 
			
		||||
	bootloader.c \
 | 
			
		||||
	util.c
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								pjrc.mk
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								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,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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								vusb.mk
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								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
									
								
								vusb/bootloader_usbasp.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								vusb/bootloader_usbasp.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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");
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue