.extern system_init .extern __bss_start .extern __bss_end .extern vFreeRTOS_ISR .extern vPortYieldProcessor .extern DisableInterrupts .extern FreeRTOS_Main .section .init .globl _start ;; _start: ;@ All the following instruction should be read as: ;@ Load the address at symbol into the program counter. ldr pc,reset_handler ;@ Processor Reset handler -- we will have to force this on the raspi! ;@ Because this is the first instruction executed, of cause it causes an immediate branch into reset! ldr pc,undefined_handler ;@ Undefined instruction handler -- processors that don't have thumb can emulate thumb! ldr pc,swi_handler ;@ Software interrupt / TRAP (SVC) -- system SVC handler for switching to kernel mode. ldr pc,prefetch_handler ;@ Prefetch/abort handler. ldr pc,data_handler ;@ Data abort handler/ ldr pc,unused_handler ;@ -- Historical from 26-bit addressing ARMs -- was invalid address handler. ldr pc,irq_handler ;@ IRQ handler ldr pc,fiq_handler ;@ Fast interrupt handler. ;@ Here we create an exception address table! This means that reset/hang/irq can be absolute addresses reset_handler: .word reset undefined_handler: .word undefined_instruction swi_handler: .word vPortYieldProcessor prefetch_handler: .word prefetch_abort data_handler: .word data_abort unused_handler: .word unused irq_handler: .word vFreeRTOS_ISR fiq_handler: .word fiq reset: ;@ In the reset handler, we need to copy our interrupt vector table to 0x0000, its currently at 0x8000 mov r0,#0x8000 ;@ Store the source pointer mov r1,#0x0000 ;@ Store the destination pointer. ;@ Here we copy the branching instructions ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9} ;@ Load multiple values from indexed address. ; Auto-increment R0 stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9} ;@ Store multiple values from the indexed address. ; Auto-increment R1 ;@ So the branches get the correct address we also need to copy our vector table! ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9} ;@ Load from 4*n of regs (8) as R0 is now incremented. stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9} ;@ Store this extra set of data. ;@ Set up the various STACK pointers for different CPU modes ;@ (PSR_IRQ_MODE|PSR_FIQ_DIS|PSR_IRQ_DIS) mov r0,#0xD2 msr cpsr_c,r0 mov sp,#0x8000 ;@ (PSR_FIQ_MODE|PSR_FIQ_DIS|PSR_IRQ_DIS) mov r0,#0xD1 msr cpsr_c,r0 mov sp,#0x4000 ;@ (PSR_SVC_MODE|PSR_FIQ_DIS|PSR_IRQ_DIS) mov r0,#0xD3 msr cpsr_c,r0 mov sp,#0x8000000 ldr r0, =__bss_start ldr r1, =__bss_end mov r2, #0 zero_loop: cmp r0,r1 it lt strlt r2,[r0], #4 blt zero_loop bl DisableInterrupts ;@ mov sp,#0x1000000 b FreeRTOS_Main ;@ We're ready?? Lets start main execution! .section .text undefined_instruction: b undefined_instruction prefetch_abort: b prefetch_abort data_abort: b data_abort unused: b unused fiq: b fiq hang: b hang =2a71bc9fde59a686bdae85beb74ab3358ba996ad'>lufa/Projects/MIDIToneGenerator/MIDIToneGenerator.h
blob: 026a6ee38d24fef3a8ef17ba0f6412538b2e2865 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
             LUFA Library
     Copyright (C) Dean Camera, 2017.

  dean [at] fourwalledcubicle [dot] com
           www.lufa-lib.org
*/

/*
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)

  Permission to use, copy, modify, distribute, and sell this
  software and its documentation for any purpose is hereby granted
  without fee, provided that the above copyright notice appear in
  all copies and that both that the copyright notice and this
  permission notice and warranty disclaimer appear in supporting
  documentation, and that the name of the author not be used in
  advertising or publicity pertaining to distribution of the
  software without specific, written prior permission.

  The author disclaims all warranties with regard to this
  software, including all implied warranties of merchantability
  and fitness.  In no event shall the author be liable for any
  special, indirect or consequential damages or any damages
  whatsoever resulting from loss of use, data or profits, whether
  in an action of contract, negligence or other tortious action,
  arising out of or in connection with the use or performance of
  this software.
*/

/** \file
 *
 *  Header file for AudioOutput.c.
 */

#ifndef _AUDIO_OUTPUT_H_
#define _AUDIO_OUTPUT_H_

	/* Includes: */
		#include <avr/io.h>
		#include <avr/wdt.h>
		#include <avr/power.h>
		#include <avr/pgmspace.h>
		#include <avr/interrupt.h>
		#include <stdbool.h>

		#include "Descriptors.h"
		#include "Config/AppConfig.h"

		#include <LUFA/Drivers/Board/LEDs.h>
		#include <LUFA/Drivers/USB/USB.h>
		#include <LUFA/Platform/Platform.h>

	/* Macros: */
		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
		#define LEDMASK_USB_NOTREADY      LEDS_LED1

		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3)

		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4)

		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3)

		/** Scale factor used to convert the floating point frequencies and ratios into a fixed point number */
		#define SCALE_FACTOR               65536

		/** Base (lowest) allowable MIDI note frequency */
		#define BASE_FREQUENCY             27.5

		/** Ratio between each note in an octave */
		#define NOTE_OCTIVE_RATIO          1.05946

		/** Lowest valid MIDI pitch index */
		#define BASE_PITCH_INDEX           21

		/** Number of samples in the virtual sample table (can be expanded to lower maximum frequency, but allow for
		 *  more simultaneous notes due to the reduced amount of processing time needed when the samples are spaced out)
		 */
		#define VIRTUAL_SAMPLE_TABLE_SIZE  512

		/** Sample table increments per period for the base MIDI note frequency */
		#define BASE_INCREMENT             (((F_CPU / VIRTUAL_SAMPLE_TABLE_SIZE / 2) / BASE_FREQUENCY))

	/* Type Defines: */
		typedef struct
		{
			uint8_t  LRUAge;
			uint8_t  Pitch;
			uint32_t TableIncrement;
			uint32_t TablePosition;
		} DDSNoteData;

	/* Function Prototypes: */
		void SetupHardware(void);

		void EVENT_USB_Device_Connect(void);
		void EVENT_USB_Device_Disconnect(void);
		void EVENT_USB_Device_ConfigurationChanged(void);
		void EVENT_USB_Device_UnhandledControlRequest(void);

#endif