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
9 * Sept 26, 2003: Created
12 #ifndef __INCLUDES_MPU401_H__
13 #define __INCLUDES_MPU401_H__
16 //#include <mmsystem.h>
18 //#include <winioctl.h>
19 #include "../../../lib/mmdrv/mmdef.h"
21 #define DEFAULT_PORT 0x330
24 #define DEVICE_SUBKEY L"Devices"
25 #define PARMS_SUBKEY L"Parameters"
27 #define REGISTRY_PORT L"Port"
29 // At the moment, we just support a single device with fixed parameters:
30 #define MPU401_PORT DEFAULT_PORT
31 #define MPU401_IRQ DEFAULT_IRQ
33 #define MPU401_TIMEOUT 10000
35 /* OBSOLETE - see mmdef.h instead:
36 #define IOCTL_SOUND_BASE FILE_DEVICE_SOUND
38 #define IOCTL_MIDI_BASE 0x0080
40 #define IOCTL_MIDI_GET_CAPABILITIES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
41 #define IOCTL_MIDI_SET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS)
42 #define IOCTL_MIDI_GET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS)
43 #define IOCTL_MIDI_SET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
44 #define IOCTL_MIDI_GET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS)
45 #define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS)
46 #define IOCTL_MIDI_RECORD CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS)
47 #define IOCTL_MIDI_CACHE_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS)
48 #define IOCTL_MIDI_CACHE_DRUM_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
51 // The MPU-401 has 2 ports, usually 0x330 and 0x331, which are known as
52 // "data" and "status/command", respectively. These macros deal with
53 // reading from and writing to these ports:
55 #define MPU401_WRITE_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp, x)
56 #define MPU401_READ_DATA(bp) READ_PORT_UCHAR((PUCHAR) bp)
57 #define MPU401_WRITE_COMMAND(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+1, x)
58 #define MPU401_READ_STATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+1)
63 #define MPU401_READY_TO_SEND(bp) \
64 MPU401_READ_STATUS(bp) & 0x80
66 #define MPU401_READY_TO_RECEIVE(bp) \
67 MPU401_READ_STATUS(bp) & 0x40
70 #define MPU401_WRITE_BYTE(bp, x) \
71 if (WaitToSend(bp)) MPU401_WRITE_DATA(bp, x)
73 #define MPU401_WRITE_MESSAGE(bp, status, da, db) \
74 MPU401_WRITE(bp, status); \
75 MPU401_WRITE(bp, da); \
78 //#define MPU401_READ(bp)
79 // if (WaitToRead(bp)) ... ???
82 DEVICE_EXTENSION contains the settings for each individual device
85 typedef struct _DEVICE_EXTENSION
87 PUNICODE_STRING RegistryPath
;
88 PDRIVER_OBJECT DriverObject
;
95 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
;
98 DEVICE_INSTANCE contains ???
101 typedef struct _DEVICE_INSTANCE
104 PDRIVER_OBJECT DriverObject
;
105 } DEVICE_INSTANCE
, *PDEVICE_INSTANCE
;
108 CONFIG contains device parameters (port/IRQ)
109 THIS STRUCTURE IS REDUNDANT
112 //typedef struct _CONFIG
116 //} CONFIG, *PCONFIG;
119 Some callback typedefs
122 typedef NTSTATUS
REGISTRY_CALLBACK_ROUTINE(PWSTR RegistryPath
, PVOID Context
);
123 typedef REGISTRY_CALLBACK_ROUTINE
*PREGISTRY_CALLBACK_ROUTINE
;
127 Prototypes for functions in portio.c :
130 BOOLEAN
WaitToSend(UINT BasePort
);
131 BOOLEAN
WaitToReceive(UINT BasePort
);
132 BOOLEAN
InitUARTMode(UINT BasePort
);
135 Prototypes for functions in settings.c :
138 NTSTATUS STDCALL
EnumDeviceKeys(
139 IN PUNICODE_STRING RegistryPath
,
141 IN PREGISTRY_CALLBACK_ROUTINE Callback
,
144 NTSTATUS STDCALL
LoadSettings(
148 IN ULONG ValueLength
,
150 IN PVOID EntryContext
);