diff --git a/module_usb_audio/usb_buffer/decouple.xc b/module_usb_audio/usb_buffer/decouple.xc index c28d00db..5cfafc9e 100644 --- a/module_usb_audio/usb_buffer/decouple.xc +++ b/module_usb_audio/usb_buffer/decouple.xc @@ -648,7 +648,7 @@ void decouple(chanend c_mix_out } #endif - set_interrupt_handler(handle_audio_request, 200, 1, c_mix_out, 0); + set_interrupt_handler(handle_audio_request, 1, c_mix_out, 0); /* Wait for usb_buffer() to set up globals for us to use * Note: assumed that buffer_aud_ctl_chan is also setup before these globals are !0 */ diff --git a/module_usb_audio/usb_buffer/decouple_interrupt.c b/module_usb_audio/usb_buffer/decouple_interrupt.c new file mode 100644 index 00000000..ef3e78f1 --- /dev/null +++ b/module_usb_audio/usb_buffer/decouple_interrupt.c @@ -0,0 +1,3 @@ +#include + +register_interrupt_handler(handle_audio_request, 1, 200) diff --git a/module_usb_audio/usb_buffer/interrupt.h b/module_usb_audio/usb_buffer/interrupt.h index efbea2c5..9a39d560 100644 --- a/module_usb_audio/usb_buffer/interrupt.h +++ b/module_usb_audio/usb_buffer/interrupt.h @@ -143,10 +143,19 @@ //int ksp_enter, ksp_exit, r11_store; +#ifdef __XS2A__ +#define ISSUE_MODE_SINGLE ".issue_mode single\n" +#define ISSUE_MODE_DUAL ".issue_mode dual\n" +#else +#define ISSUE_MODE_SINGLE +#define ISSUE_MODE_DUAL +#endif + #define do_interrupt_handler(f,args) \ - asm("bu .L__" #f "_handler_skip;\n" \ + asm(ISSUE_MODE_SINGLE\ ".align 4\n" \ "__" #f "_handler:\n" \ + "ENTSP_lu6 0\n" \ "kentsp " #args " + 19\n" \ "__kent:" \ save_state(f,args) \ @@ -155,19 +164,24 @@ restore_state(f,args) \ "krestsp " #args " + 19 \n" \ "__kret:\n" \ - "kret\n" \ - ".L__" #f "_handler_skip:\n"); + "kret\n"); -#define set_interrupt_handler(f, nstackwords, args, c, ...) \ - asm (" .section .dp.data, \"adw\", @progbits\n" \ - " .align 8\n" \ - "__" #f "_kernel_stack%=:\n" \ +#define register_interrupt_handler(f, args, nstackwords) \ + asm (" .section .dp.data, \"adw\", @progbits\n" \ + " .globl __" #f "_kernel_stack_end\n" \ + " .globl __" #f "_handler\n" \ + " .align 8\n" \ + "__" #f "_kernel_stack:\n" \ " .space " #nstackwords ", 0\n" \ - " .text\n" \ - "mov r10, %0; ldaw r11, dp[__" #f "_kernel_stack%=];add r11, r11, r10;ldaw r10, sp[0]; "\ - "set sp,r11;stw r10, sp[0]; krestsp 0"::"r"(nstackwords-8):"r10","r11"); \ + "__" #f "_kernel_stack_end:\n" \ + " .space 2\n"\ + " .text\n"); \ + do_interrupt_handler(f, args) + +#define set_interrupt_handler(f, args, c, ...) \ + asm("ldaw r11, dp[__" #f "_kernel_stack_end];ldaw r10, sp[0]; " \ + "set sp,r11;stw r10, sp[0]; krestsp 0":::"r10","r11"); \ store_args ## args(c, __VA_ARGS__) \ - do_interrupt_handler(f, args) \ asm("ldap r11, __" #f "_handler; setv res[%0],r11"::"r"(c):"r11"); \ asm("setc res[%0], 0xa; eeu res[%0]"::"r"(c)); \ asm("setsr (((0) & ~(((1 << 0x1) - 1) << 0x1)) | (((1) << 0x1) & (((1 << 0x1) - 1) << 0x1)))");