xref: /openbmc/qemu/include/hw/audio/asc.h (revision 5243e554)
1ac13a6b3SMark Cave-Ayland /*
2ac13a6b3SMark Cave-Ayland  * QEMU Apple Sound Chip emulation
3ac13a6b3SMark Cave-Ayland  *
4ac13a6b3SMark Cave-Ayland  * Apple Sound Chip (ASC) 344S0063
5ac13a6b3SMark Cave-Ayland  * Enhanced Apple Sound Chip (EASC) 343S1063
6ac13a6b3SMark Cave-Ayland  *
7ac13a6b3SMark Cave-Ayland  * Copyright (c) 2012-2018 Laurent Vivier <laurent@vivier.eu>
8ac13a6b3SMark Cave-Ayland  * Copyright (c) 2022 Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
9ac13a6b3SMark Cave-Ayland  *
10ac13a6b3SMark Cave-Ayland  * SPDX-License-Identifier: GPL-2.0-or-later
11ac13a6b3SMark Cave-Ayland  */
12ac13a6b3SMark Cave-Ayland 
13ac13a6b3SMark Cave-Ayland #ifndef HW_AUDIO_ASC_H
14ac13a6b3SMark Cave-Ayland #define HW_AUDIO_ASC_H
15ac13a6b3SMark Cave-Ayland 
16ac13a6b3SMark Cave-Ayland #include "qemu/osdep.h"
17ac13a6b3SMark Cave-Ayland #include "hw/sysbus.h"
18ac13a6b3SMark Cave-Ayland #include "audio/audio.h"
19ac13a6b3SMark Cave-Ayland 
20ac13a6b3SMark Cave-Ayland #define ASC_FREQ 22257
21ac13a6b3SMark Cave-Ayland 
22ac13a6b3SMark Cave-Ayland enum {
23ac13a6b3SMark Cave-Ayland     ASC_TYPE_ASC    = 0,  /* original discrete Apple Sound Chip */
24ac13a6b3SMark Cave-Ayland     ASC_TYPE_EASC   = 1   /* discrete Enhanced Apple Sound Chip */
25ac13a6b3SMark Cave-Ayland };
26ac13a6b3SMark Cave-Ayland 
27ac13a6b3SMark Cave-Ayland #define ASC_FIFO_OFFSET    0x0
28ac13a6b3SMark Cave-Ayland #define ASC_FIFO_SIZE      0x400
29ac13a6b3SMark Cave-Ayland 
30ac13a6b3SMark Cave-Ayland #define ASC_REG_OFFSET     0x800
31ac13a6b3SMark Cave-Ayland #define ASC_REG_SIZE       0x60
32ac13a6b3SMark Cave-Ayland 
33ac13a6b3SMark Cave-Ayland #define ASC_EXTREG_OFFSET  0xf00
34ac13a6b3SMark Cave-Ayland #define ASC_EXTREG_SIZE    0x20
35ac13a6b3SMark Cave-Ayland 
36ac13a6b3SMark Cave-Ayland typedef struct ASCFIFOState {
37ac13a6b3SMark Cave-Ayland     int index;
38ac13a6b3SMark Cave-Ayland 
39ac13a6b3SMark Cave-Ayland     MemoryRegion mem_fifo;
40ac13a6b3SMark Cave-Ayland     uint8_t fifo[ASC_FIFO_SIZE];
41ac13a6b3SMark Cave-Ayland     uint8_t int_status;
42ac13a6b3SMark Cave-Ayland 
43ac13a6b3SMark Cave-Ayland     int cnt;
44ac13a6b3SMark Cave-Ayland     int wptr;
45ac13a6b3SMark Cave-Ayland     int rptr;
46ac13a6b3SMark Cave-Ayland 
47ac13a6b3SMark Cave-Ayland     MemoryRegion mem_extregs;
48ac13a6b3SMark Cave-Ayland     uint8_t extregs[ASC_EXTREG_SIZE];
49ac13a6b3SMark Cave-Ayland 
50ac13a6b3SMark Cave-Ayland     int xa_cnt;
51ac13a6b3SMark Cave-Ayland     uint8_t xa_val;
52ac13a6b3SMark Cave-Ayland     uint8_t xa_flags;
53ac13a6b3SMark Cave-Ayland     int16_t xa_last[2];
54ac13a6b3SMark Cave-Ayland } ASCFIFOState;
55ac13a6b3SMark Cave-Ayland 
56ac13a6b3SMark Cave-Ayland struct ASCState {
57ac13a6b3SMark Cave-Ayland     SysBusDevice parent_obj;
58ac13a6b3SMark Cave-Ayland 
59ac13a6b3SMark Cave-Ayland     uint8_t type;
60ac13a6b3SMark Cave-Ayland     MemoryRegion asc;
61ac13a6b3SMark Cave-Ayland     MemoryRegion mem_fifo;
62ac13a6b3SMark Cave-Ayland     MemoryRegion mem_regs;
63ac13a6b3SMark Cave-Ayland     MemoryRegion mem_extregs;
64ac13a6b3SMark Cave-Ayland 
65ac13a6b3SMark Cave-Ayland     QEMUSoundCard card;
66ac13a6b3SMark Cave-Ayland     SWVoiceOut *voice;
67ac13a6b3SMark Cave-Ayland     uint8_t *mixbuf;
68ac13a6b3SMark Cave-Ayland     int samples;
69ac13a6b3SMark Cave-Ayland     int shift;
70ac13a6b3SMark Cave-Ayland 
71*5243e554SMark Cave-Ayland     uint8_t *silentbuf;
72*5243e554SMark Cave-Ayland 
73ac13a6b3SMark Cave-Ayland     /* Time when we were last able to generate samples */
74ac13a6b3SMark Cave-Ayland     int64_t fifo_empty_ns;
75ac13a6b3SMark Cave-Ayland 
76ac13a6b3SMark Cave-Ayland     qemu_irq irq;
77ac13a6b3SMark Cave-Ayland 
78ac13a6b3SMark Cave-Ayland     ASCFIFOState fifos[2];
79ac13a6b3SMark Cave-Ayland 
80ac13a6b3SMark Cave-Ayland     uint8_t regs[ASC_REG_SIZE];
81ac13a6b3SMark Cave-Ayland };
82ac13a6b3SMark Cave-Ayland 
83ac13a6b3SMark Cave-Ayland #define TYPE_ASC "apple-sound-chip"
84ac13a6b3SMark Cave-Ayland OBJECT_DECLARE_SIMPLE_TYPE(ASCState, ASC)
85ac13a6b3SMark Cave-Ayland 
86ac13a6b3SMark Cave-Ayland #endif
87