add reset line irq handling
This commit is contained in:
parent
a741a2ff3a
commit
507957f7cc
@ -27,6 +27,7 @@
|
|||||||
#include "requests.h"
|
#include "requests.h"
|
||||||
#include "sram.h"
|
#include "sram.h"
|
||||||
#include "info.h"
|
#include "info.h"
|
||||||
|
#include "irq.h"
|
||||||
|
|
||||||
extern uint32_t req_bank_size;
|
extern uint32_t req_bank_size;
|
||||||
|
|
||||||
@ -41,7 +42,6 @@ void send_reset()
|
|||||||
snes_reset_hi();
|
snes_reset_hi();
|
||||||
snes_reset_off();
|
snes_reset_off();
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_irq()
|
void send_irq()
|
||||||
|
|||||||
72
avr/usbload/irq.c
Normal file
72
avr/usbload/irq.c
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* =====================================================================================
|
||||||
|
*
|
||||||
|
* ________ .__ __ ________ ____ ________
|
||||||
|
* \_____ \ __ __|__| ____ | | __\______ \ _______ _/_ |/ _____/
|
||||||
|
* / / \ \| | \ |/ ___\| |/ / | | \_/ __ \ \/ /| / __ \
|
||||||
|
* / \_/. \ | / \ \___| < | ` \ ___/\ / | \ |__\ \
|
||||||
|
* \_____\ \_/____/|__|\___ >__|_ \/_______ /\___ >\_/ |___|\_____ /
|
||||||
|
* \__> \/ \/ \/ \/ \/
|
||||||
|
*
|
||||||
|
* www.optixx.org
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Version: 1.0
|
||||||
|
* Created: 07/21/2009 03:32:16 PM
|
||||||
|
* Author: david@optixx.org
|
||||||
|
*
|
||||||
|
* =====================================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h> /* for sei() */
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "usbdrv.h"
|
||||||
|
#include "oddebug.h" /* This is also an example for using debug
|
||||||
|
* macros */
|
||||||
|
#include "debug.h"
|
||||||
|
#include "info.h"
|
||||||
|
#include "sram.h"
|
||||||
|
|
||||||
|
|
||||||
|
void (*jump_to_app) (void) = 0x0000;
|
||||||
|
|
||||||
|
void irq_init(){
|
||||||
|
cli();
|
||||||
|
PCMSK3 |=(1<<PCINT27);
|
||||||
|
PCICR |= (1<<PCIE3);
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
void irq_stop(){
|
||||||
|
cli();
|
||||||
|
PCMSK3 &=~(1<<PCINT27);
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
void leave_application(void)
|
||||||
|
{
|
||||||
|
cli();
|
||||||
|
usbDeviceDisconnect();
|
||||||
|
wdt_enable(WDTO_15MS);
|
||||||
|
while (1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ISR (SIG_PIN_CHANGE3)
|
||||||
|
{
|
||||||
|
if (snes_reset_test()){
|
||||||
|
info("Catch SNES reset button\n");
|
||||||
|
info("Set watchdog...\n");
|
||||||
|
leave_application();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
25
avr/usbload/irq.h
Normal file
25
avr/usbload/irq.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* =====================================================================================
|
||||||
|
*
|
||||||
|
* ________ .__ __ ________ ____ ________
|
||||||
|
* \_____ \ __ __|__| ____ | | __\______ \ _______ _/_ |/ _____/
|
||||||
|
* / / \ \| | \ |/ ___\| |/ / | | \_/ __ \ \/ /| / __ \
|
||||||
|
* / \_/. \ | / \ \___| < | ` \ ___/\ / | \ |__\ \
|
||||||
|
* \_____\ \_/____/|__|\___ >__|_ \/_______ /\___ >\_/ |___|\_____ /
|
||||||
|
* \__> \/ \/ \/ \/ \/
|
||||||
|
*
|
||||||
|
* www.optixx.org
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Version: 1.0
|
||||||
|
* Created: 07/21/2009 03:32:16 PM
|
||||||
|
* Author: david@optixx.org
|
||||||
|
*
|
||||||
|
* =====================================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __IRQ_H__
|
||||||
|
#define __IRQ_H__
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -51,7 +51,7 @@
|
|||||||
extern const char _rom[] PROGMEM;
|
extern const char _rom[] PROGMEM;
|
||||||
extern FILE uart_stdout;
|
extern FILE uart_stdout;
|
||||||
|
|
||||||
uint8_t debug_level = (DEBUG | DEBUG_USB | DEBUG_CRC | DEBUG_SHM );
|
uint8_t debug_level = (DEBUG | DEBUG_USB | DEBUG_CRC | DEBUG_SHM);
|
||||||
|
|
||||||
uint8_t read_buffer[TRANSFER_BUFFER_SIZE];
|
uint8_t read_buffer[TRANSFER_BUFFER_SIZE];
|
||||||
uint32_t req_addr = 0;
|
uint32_t req_addr = 0;
|
||||||
@ -164,11 +164,13 @@ usbMsgLen_t usbFunctionSetup(uchar data[8])
|
|||||||
sram_bulk_write_start(req_addr);
|
sram_bulk_write_start(req_addr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if SHM_SCRATCHPAD
|
||||||
if (!shared_memory_scratchpad_region_save_helper(req_addr)){
|
if (!shared_memory_scratchpad_region_save_helper(req_addr)){
|
||||||
debug(DEBUG_USB,
|
debug(DEBUG_USB,
|
||||||
"USB_BULK_UPLOAD_NEXT: scratchpad_region_save_helper was dirty\n");
|
"USB_BULK_UPLOAD_NEXT: scratchpad_region_save_helper was dirty\n");
|
||||||
sram_bulk_write_start(req_addr);
|
sram_bulk_write_start(req_addr);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
if (req_addr && (req_addr % req_bank_size) == 0) {
|
if (req_addr && (req_addr % req_bank_size) == 0) {
|
||||||
@ -278,9 +280,9 @@ void usb_connect()
|
|||||||
i = 10;
|
i = 10;
|
||||||
while (--i) { /* fake USB disconnect for > 250 ms */
|
while (--i) { /* fake USB disconnect for > 250 ms */
|
||||||
led_on();
|
led_on();
|
||||||
_delay_ms(35);
|
_delay_ms(15);
|
||||||
led_off();
|
led_off();
|
||||||
_delay_ms(65);
|
_delay_ms(35);
|
||||||
}
|
}
|
||||||
led_on();
|
led_on();
|
||||||
usbDeviceConnect();
|
usbDeviceConnect();
|
||||||
@ -290,7 +292,7 @@ void usb_connect()
|
|||||||
|
|
||||||
void boot_startup_rom()
|
void boot_startup_rom()
|
||||||
{
|
{
|
||||||
|
info("Boot startup rom\n");
|
||||||
info("Activate AVR bus\n");
|
info("Activate AVR bus\n");
|
||||||
avr_bus_active();
|
avr_bus_active();
|
||||||
info("IRQ off\n");
|
info("IRQ off\n");
|
||||||
@ -299,13 +301,14 @@ void boot_startup_rom()
|
|||||||
snes_lorom();
|
snes_lorom();
|
||||||
rle_decode(&_rom, ROM_BUFFER_SIZE, 0x000000);
|
rle_decode(&_rom, ROM_BUFFER_SIZE, 0x000000);
|
||||||
info("\n");
|
info("\n");
|
||||||
#if 0
|
#if 1
|
||||||
dump_memory(0x10000 - 0x100, 0x10000);
|
dump_memory(0x10000 - 0x100, 0x10000);
|
||||||
#endif
|
#endif
|
||||||
snes_hirom();
|
snes_hirom();
|
||||||
snes_wr_disable();
|
snes_wr_disable();
|
||||||
snes_bus_active();
|
snes_bus_active();
|
||||||
info("Activate SNES bus\n");
|
info("Activate SNES bus\n");
|
||||||
|
send_reset();
|
||||||
_delay_ms(50);
|
_delay_ms(50);
|
||||||
send_reset();
|
send_reset();
|
||||||
_delay_ms(50);
|
_delay_ms(50);
|
||||||
@ -328,6 +331,15 @@ void banner(){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void globals_init(){
|
||||||
|
req_addr = 0;
|
||||||
|
req_addr_end = 0;
|
||||||
|
req_state = REQ_STATUS_IDLE;
|
||||||
|
rx_remaining = 0;
|
||||||
|
tx_remaining = 0;
|
||||||
|
sync_errors = 0;
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -337,9 +349,9 @@ int main(void)
|
|||||||
system_init();
|
system_init();
|
||||||
snes_reset_hi();
|
snes_reset_hi();
|
||||||
snes_reset_off();
|
snes_reset_off();
|
||||||
info("Boot startup rom\n");
|
irq_init();
|
||||||
boot_startup_rom();
|
boot_startup_rom();
|
||||||
//irq_init();
|
globals_init();
|
||||||
usbInit();
|
usbInit();
|
||||||
usb_connect();
|
usb_connect();
|
||||||
while (1) {
|
while (1) {
|
||||||
@ -350,18 +362,22 @@ int main(void)
|
|||||||
snes_wr_disable();
|
snes_wr_disable();
|
||||||
sei();
|
sei();
|
||||||
info("USB poll\n");
|
info("USB poll\n");
|
||||||
while ((req_state != REQ_STATUS_SNES)) {
|
while (req_state != REQ_STATUS_SNES) {
|
||||||
usbPoll();
|
usbPoll();
|
||||||
}
|
}
|
||||||
shared_memory_write(SHARED_MEM_TX_CMD_TERMINATE, 0);
|
shared_memory_write(SHARED_MEM_TX_CMD_TERMINATE, 0);
|
||||||
//shared_memory_scratchpad_region_tx_restore();
|
|
||||||
//shared_memory_scratchpad_region_rx_restore();
|
#if SHM_SCRATCHPAD
|
||||||
|
shared_memory_scratchpad_region_tx_restore();
|
||||||
|
shared_memory_scratchpad_region_rx_restore();
|
||||||
|
#endif
|
||||||
info("USB poll done\n");
|
info("USB poll done\n");
|
||||||
set_rom_mode();
|
set_rom_mode();
|
||||||
snes_wr_disable();
|
snes_wr_disable();
|
||||||
info("Disable SNES WR\n");
|
info("Disable SNES WR\n");
|
||||||
snes_bus_active();
|
snes_bus_active();
|
||||||
info("Activate SNES bus\n");
|
info("Activate SNES bus\n");
|
||||||
|
irq_stop();
|
||||||
send_reset();
|
send_reset();
|
||||||
info("Poll USB\n");
|
info("Poll USB\n");
|
||||||
while ((req_state != REQ_STATUS_AVR)) {
|
while ((req_state != REQ_STATUS_AVR)) {
|
||||||
@ -400,8 +416,9 @@ int main(void)
|
|||||||
info("Read 0x3000=%c\n", c);
|
info("Read 0x3000=%c\n", c);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
info("Boot startup rom\n");
|
irq_init();
|
||||||
boot_startup_rom();
|
boot_startup_rom();
|
||||||
|
globals_init();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -64,7 +64,7 @@ uint8_t shared_memory_scratchpad_region_save_helper(uint32_t addr){
|
|||||||
|
|
||||||
void shared_memory_scratchpad_region_tx_save()
|
void shared_memory_scratchpad_region_tx_save()
|
||||||
{
|
{
|
||||||
#if 1
|
#if 0
|
||||||
uint16_t crc;
|
uint16_t crc;
|
||||||
crc = crc_check_bulk_memory((uint32_t)SHARED_MEM_TX_LOC_STATE,
|
crc = crc_check_bulk_memory((uint32_t)SHARED_MEM_TX_LOC_STATE,
|
||||||
(uint32_t)(SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE), 0x8000);
|
(uint32_t)(SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE), 0x8000);
|
||||||
@ -86,7 +86,7 @@ void shared_memory_scratchpad_region_tx_save()
|
|||||||
|
|
||||||
void shared_memory_scratchpad_region_rx_save()
|
void shared_memory_scratchpad_region_rx_save()
|
||||||
{
|
{
|
||||||
#if 1
|
#if 0
|
||||||
uint16_t crc;
|
uint16_t crc;
|
||||||
crc = crc_check_bulk_memory((uint32_t)SHARED_MEM_RX_LOC_STATE,
|
crc = crc_check_bulk_memory((uint32_t)SHARED_MEM_RX_LOC_STATE,
|
||||||
(uint32_t)(SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE), 0x8000);
|
(uint32_t)(SHARED_MEM_RX_LOC_STATE + SHARED_MEM_RX_LOC_SIZE), 0x8000);
|
||||||
@ -118,7 +118,7 @@ void shared_memory_scratchpad_region_tx_restore()
|
|||||||
dump_memory(SHARED_MEM_TX_LOC_STATE, SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE);
|
dump_memory(SHARED_MEM_TX_LOC_STATE, SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
uint16_t crc;
|
uint16_t crc;
|
||||||
crc = crc_check_bulk_memory((uint32_t)SHARED_MEM_TX_LOC_STATE,
|
crc = crc_check_bulk_memory((uint32_t)SHARED_MEM_TX_LOC_STATE,
|
||||||
(uint32_t)(SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE), 0x8000);
|
(uint32_t)(SHARED_MEM_TX_LOC_STATE + SHARED_MEM_TX_LOC_SIZE), 0x8000);
|
||||||
|
|||||||
@ -37,7 +37,7 @@
|
|||||||
#define SHARED_MEM_TX_CMD_TERMINATE 0x06
|
#define SHARED_MEM_TX_CMD_TERMINATE 0x06
|
||||||
|
|
||||||
#define SHARED_MEM_TX_LOC_STATE 0x000000
|
#define SHARED_MEM_TX_LOC_STATE 0x000000
|
||||||
#define SHARED_MEM_TX_LOC_SIZE 0x000100
|
#define SHARED_MEM_TX_LOC_SIZE 0x000040
|
||||||
#define SHARED_MEM_TX_LOC_CMD 0x000001
|
#define SHARED_MEM_TX_LOC_CMD 0x000001
|
||||||
#define SHARED_MEM_TX_LOC_PAYLOAD 0x000002
|
#define SHARED_MEM_TX_LOC_PAYLOAD 0x000002
|
||||||
|
|
||||||
@ -48,7 +48,7 @@
|
|||||||
#define SHARED_MEM_RX_CMD_FILESEL 0x01
|
#define SHARED_MEM_RX_CMD_FILESEL 0x01
|
||||||
|
|
||||||
#define SHARED_MEM_RX_LOC_STATE 0x001000
|
#define SHARED_MEM_RX_LOC_STATE 0x001000
|
||||||
#define SHARED_MEM_RX_LOC_SIZE 0x000100
|
#define SHARED_MEM_RX_LOC_SIZE 0x000040
|
||||||
#define SHARED_MEM_RX_LOC_CMD 0x001001
|
#define SHARED_MEM_RX_LOC_CMD 0x001001
|
||||||
#define SHARED_MEM_RX_LOC_LEN 0x001002
|
#define SHARED_MEM_RX_LOC_LEN 0x001002
|
||||||
#define SHARED_MEM_RX_LOC_PAYLOAD 0x001003
|
#define SHARED_MEM_RX_LOC_PAYLOAD 0x001003
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user