4b2ce0b5f6e07beec9b2376c4bd4c5ca7c6f13e1
[reactos.git] / reactos / drivers / dd / blue / mpu401.h
1 /*
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: services/dd/mpu401/mpu401.h
6 * PURPOSE: MPU-401 MIDI device driver header
7 * PROGRAMMER: Andrew Greenwood
8 * UPDATE HISTORY:
9 * Sept 26, 2003: Created
10 */
11
12 #ifndef __INCLUDES_MPU401_H__
13 #define __INCLUDES_MPU401_H__
14
15 #define DEFAULT_PORT 0x330
16 #define DEFAULT_IRQ 9
17
18 #define DEVICE_SUBKEY L"Devices"
19 #define PARMS_SUBKEY L"Parameters"
20
21 #define REGISTRY_PORT L"Port"
22
23 // At the moment, we just support a single device with fixed parameters:
24 #define MPU401_PORT DEFAULT_PORT
25 #define MPU401_IRQ DEFAULT_IRQ
26
27 #define MPU401_TIMEOUT 10000
28
29 #define IOCTL_SOUND_BASE FILE_DEVICE_SOUND
30 // wave base 0
31 #define IOCTL_MIDI_BASE 0x0080
32
33 #define IOCTL_MIDI_GET_CAPABILITIES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
34 #define IOCTL_MIDI_SET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS)
35 #define IOCTL_MIDI_GET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS)
36 #define IOCTL_MIDI_SET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
37 #define IOCTL_MIDI_GET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS)
38 #define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS)
39 #define IOCTL_MIDI_RECORD CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS)
40 #define IOCTL_MIDI_CACHE_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS)
41 #define IOCTL_MIDI_CACHE_DRUM_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
42
43
44 // The MPU-401 has 2 ports, usually 0x330 and 0x331, which are known as
45 // "data" and "status/command", respectively. These macros deal with
46 // reading from and writing to these ports:
47
48 #define MPU401_WRITE_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp, x)
49 #define MPU401_READ_DATA(bp) READ_PORT_UCHAR((PUCHAR) bp)
50 #define MPU401_WRITE_COMMAND(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+1, x)
51 #define MPU401_READ_STATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+1)
52
53
54 // Flow control
55
56 #define MPU401_READY_TO_SEND(bp) \
57 MPU401_READ_STATUS(bp) & 0x80
58
59 #define MPU401_READY_TO_RECEIVE(bp) \
60 MPU401_READ_STATUS(bp) & 0x40
61
62
63 #define MPU401_WRITE_BYTE(bp, x) \
64 if (WaitToSend(bp)) MPU401_WRITE_DATA(bp, x)
65
66 #define MPU401_WRITE_MESSAGE(bp, status, da, db) \
67 MPU401_WRITE(bp, status); \
68 MPU401_WRITE(bp, da); \
69 MPU401_WRITE(bp, db)
70
71 //#define MPU401_READ(bp)
72 // if (WaitToRead(bp)) ... ???
73
74 /*
75 DEVICE_EXTENSION contains the settings for each individual device
76 */
77
78 typedef struct _DEVICE_EXTENSION
79 {
80 PWSTR RegistryPath;
81 PDRIVER_OBJECT DriverObject;
82 UINT Port;
83 UINT IRQ;
84 // KDPC Dpc;
85 // KTIMER Timer;
86 // KEVENT Event;
87 // BOOLEAN BeepOn;
88 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
89
90 /*
91 DEVICE_INSTANCE contains ???
92 */
93
94 typedef struct _DEVICE_INSTANCE
95 {
96 // pPrevGDI
97 PDRIVER_OBJECT DriverObject;
98 } DEVICE_INSTANCE, *PDEVICE_INSTANCE;
99
100 /*
101 CONFIG contains device parameters (port/IRQ)
102 THIS STRUCTURE IS REDUNDANT
103 */
104
105 //typedef struct _CONFIG
106 //{
107 // UINT Port;
108 // UINT IRQ;
109 //} CONFIG, *PCONFIG;
110
111 /*
112 Some callback typedefs
113 */
114
115 typedef NTSTATUS REGISTRY_CALLBACK_ROUTINE(PWSTR RegistryPath, PVOID Context);
116 typedef REGISTRY_CALLBACK_ROUTINE *PREGISTRY_CALLBACK_ROUTINE;
117
118
119 /*
120 Prototypes for functions in portio.c :
121 */
122
123 BOOLEAN WaitToSend(UINT BasePort);
124 BOOLEAN WaitToReceive(UINT BasePort);
125 BOOLEAN InitUARTMode(UINT BasePort);
126
127 /*
128 Prototypes for functions in settings.c :
129 */
130
131 NTSTATUS EnumDeviceKeys(
132 IN PUNICODE_STRING RegistryPath,
133 IN PWSTR SubKey,
134 IN PREGISTRY_CALLBACK_ROUTINE Callback,
135 IN PVOID Context);
136
137 NTSTATUS LoadSettings(
138 IN PWSTR ValueName,
139 IN ULONG ValueType,
140 IN PVOID ValueData,
141 IN ULONG ValueLength,
142 IN PVOID Context,
143 IN PVOID EntryContext);
144
145 #endif