es1370.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  1. /*
  2. * QEMU ES1370 emulation
  3. *
  4. * Copyright (c) 2005 Vassili Karpov (malc)
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * THE SOFTWARE.
  23. */
  24. #define DEBUG_ES1370 0
  25. #define VERBOSE_ES1370 0
  26. #include "qemu/osdep.h"
  27. #include "hw/audio/soundhw.h"
  28. #include "audio/audio.h"
  29. #include "hw/pci/pci_device.h"
  30. #include "migration/vmstate.h"
  31. #include "qemu/cutils.h"
  32. #include "qemu/module.h"
  33. #include "system/dma.h"
  34. #include "qom/object.h"
  35. #include "trace.h"
  36. /* Missing stuff:
  37. SCTRL_P[12](END|ST)INC
  38. SCTRL_P1SCTRLD
  39. SCTRL_P2DACSEN
  40. CTRL_DAC_SYNC
  41. MIDI
  42. non looped mode
  43. surely more
  44. */
  45. /*
  46. Following macros and samplerate array were copied verbatim from
  47. Linux kernel 2.4.30: drivers/sound/es1370.c
  48. Copyright (C) 1998-2001, 2003 Thomas Sailer (t.sailer@alumni.ethz.ch)
  49. */
  50. /* Start blatant GPL violation */
  51. #define ES1370_REG_CONTROL 0x00
  52. #define ES1370_REG_STATUS 0x04
  53. #define ES1370_REG_UART_DATA 0x08
  54. #define ES1370_REG_UART_STATUS 0x09
  55. #define ES1370_REG_UART_CONTROL 0x09
  56. #define ES1370_REG_UART_TEST 0x0a
  57. #define ES1370_REG_MEMPAGE 0x0c
  58. #define ES1370_REG_CODEC 0x10
  59. #define ES1370_REG_SERIAL_CONTROL 0x20
  60. #define ES1370_REG_DAC1_SCOUNT 0x24
  61. #define ES1370_REG_DAC2_SCOUNT 0x28
  62. #define ES1370_REG_ADC_SCOUNT 0x2c
  63. #define ES1370_REG_DAC1_FRAMEADR 0xc30
  64. #define ES1370_REG_DAC1_FRAMECNT 0xc34
  65. #define ES1370_REG_DAC2_FRAMEADR 0xc38
  66. #define ES1370_REG_DAC2_FRAMECNT 0xc3c
  67. #define ES1370_REG_ADC_FRAMEADR 0xd30
  68. #define ES1370_REG_ADC_FRAMECNT 0xd34
  69. #define ES1370_REG_PHANTOM_FRAMEADR 0xd38
  70. #define ES1370_REG_PHANTOM_FRAMECNT 0xd3c
  71. static const unsigned dac1_samplerate[] = { 5512, 11025, 22050, 44100 };
  72. #define DAC2_SRTODIV(x) (((1411200+(x)/2)/(x))-2)
  73. #define DAC2_DIVTOSR(x) (1411200/((x)+2))
  74. #define CTRL_ADC_STOP 0x80000000 /* 1 = ADC stopped */
  75. #define CTRL_XCTL1 0x40000000 /* electret mic bias */
  76. #define CTRL_OPEN 0x20000000 /* no function, can be read and written */
  77. #define CTRL_PCLKDIV 0x1fff0000 /* ADC/DAC2 clock divider */
  78. #define CTRL_SH_PCLKDIV 16
  79. #define CTRL_MSFMTSEL 0x00008000 /* MPEG serial data fmt: 0 = Sony, 1 = I2S */
  80. #define CTRL_M_SBB 0x00004000 /* DAC2 clock: 0 = PCLKDIV, 1 = MPEG */
  81. #define CTRL_WTSRSEL 0x00003000 /* DAC1 clock freq: 0=5512, 1=11025, 2=22050, 3=44100 */
  82. #define CTRL_SH_WTSRSEL 12
  83. #define CTRL_DAC_SYNC 0x00000800 /* 1 = DAC2 runs off DAC1 clock */
  84. #define CTRL_CCB_INTRM 0x00000400 /* 1 = CCB "voice" ints enabled */
  85. #define CTRL_M_CB 0x00000200 /* recording source: 0 = ADC, 1 = MPEG */
  86. #define CTRL_XCTL0 0x00000100 /* 0 = Line in, 1 = Line out */
  87. #define CTRL_BREQ 0x00000080 /* 1 = test mode (internal mem test) */
  88. #define CTRL_DAC1_EN 0x00000040 /* enable DAC1 */
  89. #define CTRL_DAC2_EN 0x00000020 /* enable DAC2 */
  90. #define CTRL_ADC_EN 0x00000010 /* enable ADC */
  91. #define CTRL_UART_EN 0x00000008 /* enable MIDI uart */
  92. #define CTRL_JYSTK_EN 0x00000004 /* enable Joystick port (presumably at address 0x200) */
  93. #define CTRL_CDC_EN 0x00000002 /* enable serial (CODEC) interface */
  94. #define CTRL_SERR_DIS 0x00000001 /* 1 = disable PCI SERR signal */
  95. #define STAT_INTR 0x80000000 /* wired or of all interrupt bits */
  96. #define STAT_CSTAT 0x00000400 /* 1 = codec busy or codec write in progress */
  97. #define STAT_CBUSY 0x00000200 /* 1 = codec busy */
  98. #define STAT_CWRIP 0x00000100 /* 1 = codec write in progress */
  99. #define STAT_VC 0x00000060 /* CCB int source, 0=DAC1, 1=DAC2, 2=ADC, 3=undef */
  100. #define STAT_SH_VC 5
  101. #define STAT_MCCB 0x00000010 /* CCB int pending */
  102. #define STAT_UART 0x00000008 /* UART int pending */
  103. #define STAT_DAC1 0x00000004 /* DAC1 int pending */
  104. #define STAT_DAC2 0x00000002 /* DAC2 int pending */
  105. #define STAT_ADC 0x00000001 /* ADC int pending */
  106. #define USTAT_RXINT 0x80 /* UART rx int pending */
  107. #define USTAT_TXINT 0x04 /* UART tx int pending */
  108. #define USTAT_TXRDY 0x02 /* UART tx ready */
  109. #define USTAT_RXRDY 0x01 /* UART rx ready */
  110. #define UCTRL_RXINTEN 0x80 /* 1 = enable RX ints */
  111. #define UCTRL_TXINTEN 0x60 /* TX int enable field mask */
  112. #define UCTRL_ENA_TXINT 0x20 /* enable TX int */
  113. #define UCTRL_CNTRL 0x03 /* control field */
  114. #define UCTRL_CNTRL_SWR 0x03 /* software reset command */
  115. #define SCTRL_P2ENDINC 0x00380000 /* */
  116. #define SCTRL_SH_P2ENDINC 19
  117. #define SCTRL_P2STINC 0x00070000 /* */
  118. #define SCTRL_SH_P2STINC 16
  119. #define SCTRL_R1LOOPSEL 0x00008000 /* 0 = loop mode */
  120. #define SCTRL_P2LOOPSEL 0x00004000 /* 0 = loop mode */
  121. #define SCTRL_P1LOOPSEL 0x00002000 /* 0 = loop mode */
  122. #define SCTRL_P2PAUSE 0x00001000 /* 1 = pause mode */
  123. #define SCTRL_P1PAUSE 0x00000800 /* 1 = pause mode */
  124. #define SCTRL_R1INTEN 0x00000400 /* enable interrupt */
  125. #define SCTRL_P2INTEN 0x00000200 /* enable interrupt */
  126. #define SCTRL_P1INTEN 0x00000100 /* enable interrupt */
  127. #define SCTRL_P1SCTRLD 0x00000080 /* reload sample count register for DAC1 */
  128. #define SCTRL_P2DACSEN 0x00000040 /* 1 = DAC2 play back last sample when disabled */
  129. #define SCTRL_R1SEB 0x00000020 /* 1 = 16bit */
  130. #define SCTRL_R1SMB 0x00000010 /* 1 = stereo */
  131. #define SCTRL_R1FMT 0x00000030 /* format mask */
  132. #define SCTRL_SH_R1FMT 4
  133. #define SCTRL_P2SEB 0x00000008 /* 1 = 16bit */
  134. #define SCTRL_P2SMB 0x00000004 /* 1 = stereo */
  135. #define SCTRL_P2FMT 0x0000000c /* format mask */
  136. #define SCTRL_SH_P2FMT 2
  137. #define SCTRL_P1SEB 0x00000002 /* 1 = 16bit */
  138. #define SCTRL_P1SMB 0x00000001 /* 1 = stereo */
  139. #define SCTRL_P1FMT 0x00000003 /* format mask */
  140. #define SCTRL_SH_P1FMT 0
  141. /* End blatant GPL violation */
  142. #define NB_CHANNELS 3
  143. #define DAC1_CHANNEL 0
  144. #define DAC2_CHANNEL 1
  145. #define ADC_CHANNEL 2
  146. static void es1370_dac1_callback (void *opaque, int free);
  147. static void es1370_dac2_callback (void *opaque, int free);
  148. static void es1370_adc_callback (void *opaque, int avail);
  149. static void print_ctl(uint32_t val)
  150. {
  151. if (DEBUG_ES1370) {
  152. char buf[1024];
  153. buf[0] = '\0';
  154. #define a(n) if (val & CTRL_##n) pstrcat(buf, sizeof(buf), " "#n)
  155. a(ADC_STOP);
  156. a(XCTL1);
  157. a(OPEN);
  158. a(MSFMTSEL);
  159. a(M_SBB);
  160. a(DAC_SYNC);
  161. a(CCB_INTRM);
  162. a(M_CB);
  163. a(XCTL0);
  164. a(BREQ);
  165. a(DAC1_EN);
  166. a(DAC2_EN);
  167. a(ADC_EN);
  168. a(UART_EN);
  169. a(JYSTK_EN);
  170. a(CDC_EN);
  171. a(SERR_DIS);
  172. #undef a
  173. AUD_log("es1370", "ctl - PCLKDIV %d(DAC2 freq %d), freq %d,%s\n",
  174. (val & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV,
  175. DAC2_DIVTOSR((val & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV),
  176. dac1_samplerate[(val & CTRL_WTSRSEL) >> CTRL_SH_WTSRSEL],
  177. buf);
  178. }
  179. }
  180. static void print_sctl(uint32_t val)
  181. {
  182. if (DEBUG_ES1370) {
  183. static const char *fmt_names[] = {"8M", "8S", "16M", "16S"};
  184. char buf[1024];
  185. buf[0] = '\0';
  186. #define a(n) if (val & SCTRL_##n) pstrcat(buf, sizeof(buf), " "#n)
  187. #define b(n) if (!(val & SCTRL_##n)) pstrcat(buf, sizeof(buf), " "#n)
  188. b(R1LOOPSEL);
  189. b(P2LOOPSEL);
  190. b(P1LOOPSEL);
  191. a(P2PAUSE);
  192. a(P1PAUSE);
  193. a(R1INTEN);
  194. a(P2INTEN);
  195. a(P1INTEN);
  196. a(P1SCTRLD);
  197. a(P2DACSEN);
  198. if (buf[0]) {
  199. pstrcat(buf, sizeof(buf), "\n ");
  200. } else {
  201. buf[0] = ' ';
  202. buf[1] = '\0';
  203. }
  204. #undef b
  205. #undef a
  206. AUD_log("es1370",
  207. "%s p2_end_inc %d, p2_st_inc %d,"
  208. " r1_fmt %s, p2_fmt %s, p1_fmt %s\n",
  209. buf,
  210. (val & SCTRL_P2ENDINC) >> SCTRL_SH_P2ENDINC,
  211. (val & SCTRL_P2STINC) >> SCTRL_SH_P2STINC,
  212. fmt_names[(val >> SCTRL_SH_R1FMT) & 3],
  213. fmt_names[(val >> SCTRL_SH_P2FMT) & 3],
  214. fmt_names[(val >> SCTRL_SH_P1FMT) & 3]);
  215. }
  216. }
  217. #define lwarn(...) \
  218. do { \
  219. if (VERBOSE_ES1370) { \
  220. AUD_log("es1370: warning", __VA_ARGS__); \
  221. } \
  222. } while (0)
  223. #define TYPE_ES1370 "ES1370"
  224. OBJECT_DECLARE_SIMPLE_TYPE(ES1370State, ES1370)
  225. struct chan {
  226. uint32_t shift;
  227. uint32_t leftover;
  228. uint32_t scount;
  229. uint32_t frame_addr;
  230. uint32_t frame_cnt;
  231. };
  232. struct ES1370State {
  233. PCIDevice dev;
  234. QEMUSoundCard card;
  235. MemoryRegion io;
  236. struct chan chan[NB_CHANNELS];
  237. SWVoiceOut *dac_voice[2];
  238. SWVoiceIn *adc_voice;
  239. uint32_t ctl;
  240. uint32_t status;
  241. uint32_t mempage;
  242. uint32_t codec;
  243. uint32_t sctl;
  244. };
  245. struct chan_bits {
  246. uint32_t ctl_en;
  247. uint32_t stat_int;
  248. uint32_t sctl_pause;
  249. uint32_t sctl_inten;
  250. uint32_t sctl_fmt;
  251. uint32_t sctl_sh_fmt;
  252. uint32_t sctl_loopsel;
  253. void (*calc_freq) (ES1370State *s, uint32_t ctl,
  254. uint32_t *old_freq, uint32_t *new_freq);
  255. };
  256. static void es1370_dac1_calc_freq (ES1370State *s, uint32_t ctl,
  257. uint32_t *old_freq, uint32_t *new_freq);
  258. static void es1370_dac2_and_adc_calc_freq (ES1370State *s, uint32_t ctl,
  259. uint32_t *old_freq,
  260. uint32_t *new_freq);
  261. static const struct chan_bits es1370_chan_bits[] = {
  262. {CTRL_DAC1_EN, STAT_DAC1, SCTRL_P1PAUSE, SCTRL_P1INTEN,
  263. SCTRL_P1FMT, SCTRL_SH_P1FMT, SCTRL_P1LOOPSEL,
  264. es1370_dac1_calc_freq},
  265. {CTRL_DAC2_EN, STAT_DAC2, SCTRL_P2PAUSE, SCTRL_P2INTEN,
  266. SCTRL_P2FMT, SCTRL_SH_P2FMT, SCTRL_P2LOOPSEL,
  267. es1370_dac2_and_adc_calc_freq},
  268. {CTRL_ADC_EN, STAT_ADC, 0, SCTRL_R1INTEN,
  269. SCTRL_R1FMT, SCTRL_SH_R1FMT, SCTRL_R1LOOPSEL,
  270. es1370_dac2_and_adc_calc_freq}
  271. };
  272. static void es1370_update_status (ES1370State *s, uint32_t new_status)
  273. {
  274. uint32_t level = new_status & (STAT_DAC1 | STAT_DAC2 | STAT_ADC);
  275. if (level) {
  276. s->status = new_status | STAT_INTR;
  277. } else {
  278. s->status = new_status & ~STAT_INTR;
  279. }
  280. pci_set_irq(&s->dev, !!level);
  281. }
  282. static void es1370_reset (ES1370State *s)
  283. {
  284. size_t i;
  285. s->ctl = 1;
  286. s->status = 0x60;
  287. s->mempage = 0;
  288. s->codec = 0;
  289. s->sctl = 0;
  290. for (i = 0; i < NB_CHANNELS; ++i) {
  291. struct chan *d = &s->chan[i];
  292. d->scount = 0;
  293. d->leftover = 0;
  294. if (i == ADC_CHANNEL) {
  295. AUD_close_in (&s->card, s->adc_voice);
  296. s->adc_voice = NULL;
  297. } else {
  298. AUD_close_out (&s->card, s->dac_voice[i]);
  299. s->dac_voice[i] = NULL;
  300. }
  301. }
  302. pci_irq_deassert(&s->dev);
  303. }
  304. static void es1370_maybe_lower_irq (ES1370State *s, uint32_t sctl)
  305. {
  306. uint32_t new_status = s->status;
  307. if (!(sctl & SCTRL_P1INTEN) && (s->sctl & SCTRL_P1INTEN)) {
  308. new_status &= ~STAT_DAC1;
  309. }
  310. if (!(sctl & SCTRL_P2INTEN) && (s->sctl & SCTRL_P2INTEN)) {
  311. new_status &= ~STAT_DAC2;
  312. }
  313. if (!(sctl & SCTRL_R1INTEN) && (s->sctl & SCTRL_R1INTEN)) {
  314. new_status &= ~STAT_ADC;
  315. }
  316. if (new_status != s->status) {
  317. es1370_update_status (s, new_status);
  318. }
  319. }
  320. static void es1370_dac1_calc_freq (ES1370State *s, uint32_t ctl,
  321. uint32_t *old_freq, uint32_t *new_freq)
  322. {
  323. *old_freq = dac1_samplerate[(s->ctl & CTRL_WTSRSEL) >> CTRL_SH_WTSRSEL];
  324. *new_freq = dac1_samplerate[(ctl & CTRL_WTSRSEL) >> CTRL_SH_WTSRSEL];
  325. }
  326. static void es1370_dac2_and_adc_calc_freq (ES1370State *s, uint32_t ctl,
  327. uint32_t *old_freq,
  328. uint32_t *new_freq)
  329. {
  330. uint32_t old_pclkdiv, new_pclkdiv;
  331. new_pclkdiv = (ctl & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV;
  332. old_pclkdiv = (s->ctl & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV;
  333. *new_freq = DAC2_DIVTOSR (new_pclkdiv);
  334. *old_freq = DAC2_DIVTOSR (old_pclkdiv);
  335. }
  336. static void es1370_update_voices (ES1370State *s, uint32_t ctl, uint32_t sctl)
  337. {
  338. size_t i;
  339. uint32_t old_freq, new_freq, old_fmt, new_fmt;
  340. for (i = 0; i < NB_CHANNELS; ++i) {
  341. struct chan *d = &s->chan[i];
  342. const struct chan_bits *b = &es1370_chan_bits[i];
  343. new_fmt = (sctl & b->sctl_fmt) >> b->sctl_sh_fmt;
  344. old_fmt = (s->sctl & b->sctl_fmt) >> b->sctl_sh_fmt;
  345. b->calc_freq (s, ctl, &old_freq, &new_freq);
  346. if ((old_fmt != new_fmt) || (old_freq != new_freq)) {
  347. d->shift = (new_fmt & 1) + (new_fmt >> 1);
  348. trace_es1370_stream_format(i, new_freq,
  349. new_fmt & 2 ? "s16" : "u8", new_fmt & 1 ? "stereo" : "mono",
  350. d->shift);
  351. if (new_freq) {
  352. struct audsettings as;
  353. as.freq = new_freq;
  354. as.nchannels = 1 << (new_fmt & 1);
  355. as.fmt = (new_fmt & 2) ? AUDIO_FORMAT_S16 : AUDIO_FORMAT_U8;
  356. as.endianness = 0;
  357. if (i == ADC_CHANNEL) {
  358. s->adc_voice =
  359. AUD_open_in (
  360. &s->card,
  361. s->adc_voice,
  362. "es1370.adc",
  363. s,
  364. es1370_adc_callback,
  365. &as
  366. );
  367. } else {
  368. s->dac_voice[i] =
  369. AUD_open_out (
  370. &s->card,
  371. s->dac_voice[i],
  372. i ? "es1370.dac2" : "es1370.dac1",
  373. s,
  374. i ? es1370_dac2_callback : es1370_dac1_callback,
  375. &as
  376. );
  377. }
  378. }
  379. }
  380. if (((ctl ^ s->ctl) & b->ctl_en)
  381. || ((sctl ^ s->sctl) & b->sctl_pause)) {
  382. int on = (ctl & b->ctl_en) && !(sctl & b->sctl_pause);
  383. if (i == ADC_CHANNEL) {
  384. AUD_set_active_in (s->adc_voice, on);
  385. } else {
  386. AUD_set_active_out (s->dac_voice[i], on);
  387. }
  388. }
  389. }
  390. s->ctl = ctl;
  391. s->sctl = sctl;
  392. }
  393. static inline uint32_t es1370_fixup (ES1370State *s, uint32_t addr)
  394. {
  395. addr &= 0xff;
  396. if (addr >= 0x30 && addr <= 0x3f) {
  397. addr |= s->mempage << 8;
  398. }
  399. return addr;
  400. }
  401. static void es1370_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
  402. {
  403. ES1370State *s = opaque;
  404. struct chan *d = &s->chan[0];
  405. addr = es1370_fixup (s, addr);
  406. switch (addr) {
  407. case ES1370_REG_CONTROL:
  408. es1370_update_voices (s, val, s->sctl);
  409. print_ctl (val);
  410. break;
  411. case ES1370_REG_MEMPAGE:
  412. s->mempage = val & 0xf;
  413. break;
  414. case ES1370_REG_SERIAL_CONTROL:
  415. es1370_maybe_lower_irq (s, val);
  416. es1370_update_voices (s, s->ctl, val);
  417. print_sctl (val);
  418. break;
  419. case ES1370_REG_DAC1_SCOUNT:
  420. case ES1370_REG_DAC2_SCOUNT:
  421. case ES1370_REG_ADC_SCOUNT:
  422. d += (addr - ES1370_REG_DAC1_SCOUNT) >> 2;
  423. d->scount = (val & 0xffff) << 16 | (val & 0xffff);
  424. trace_es1370_sample_count_wr(d - &s->chan[0],
  425. d->scount >> 16, d->scount & 0xffff);
  426. break;
  427. case ES1370_REG_ADC_FRAMEADR:
  428. d += 2;
  429. goto frameadr;
  430. case ES1370_REG_DAC1_FRAMEADR:
  431. case ES1370_REG_DAC2_FRAMEADR:
  432. d += (addr - ES1370_REG_DAC1_FRAMEADR) >> 3;
  433. frameadr:
  434. d->frame_addr = val;
  435. trace_es1370_frame_address_wr(d - &s->chan[0], d->frame_addr);
  436. break;
  437. case ES1370_REG_PHANTOM_FRAMECNT:
  438. lwarn("writing to phantom frame count 0x%" PRIx64 "\n", val);
  439. break;
  440. case ES1370_REG_PHANTOM_FRAMEADR:
  441. lwarn("writing to phantom frame address 0x%" PRIx64 "\n", val);
  442. break;
  443. case ES1370_REG_ADC_FRAMECNT:
  444. d += 2;
  445. goto framecnt;
  446. case ES1370_REG_DAC1_FRAMECNT:
  447. case ES1370_REG_DAC2_FRAMECNT:
  448. d += (addr - ES1370_REG_DAC1_FRAMECNT) >> 3;
  449. framecnt:
  450. d->frame_cnt = val;
  451. d->leftover = 0;
  452. trace_es1370_frame_count_wr(d - &s->chan[0],
  453. d->frame_cnt >> 16, d->frame_cnt & 0xffff);
  454. break;
  455. default:
  456. lwarn("writel 0x%" PRIx64 " <- 0x%" PRIx64 "\n", addr, val);
  457. break;
  458. }
  459. }
  460. static uint64_t es1370_read(void *opaque, hwaddr addr, unsigned size)
  461. {
  462. ES1370State *s = opaque;
  463. uint32_t val;
  464. struct chan *d = &s->chan[0];
  465. addr = es1370_fixup (s, addr);
  466. switch (addr) {
  467. case ES1370_REG_CONTROL:
  468. val = s->ctl;
  469. break;
  470. case ES1370_REG_STATUS:
  471. val = s->status;
  472. break;
  473. case ES1370_REG_MEMPAGE:
  474. val = s->mempage;
  475. break;
  476. case ES1370_REG_CODEC:
  477. val = s->codec;
  478. break;
  479. case ES1370_REG_SERIAL_CONTROL:
  480. val = s->sctl;
  481. break;
  482. case ES1370_REG_DAC1_SCOUNT:
  483. case ES1370_REG_DAC2_SCOUNT:
  484. case ES1370_REG_ADC_SCOUNT:
  485. d += (addr - ES1370_REG_DAC1_SCOUNT) >> 2;
  486. trace_es1370_sample_count_rd(d - &s->chan[0],
  487. d->scount >> 16, d->scount & 0xffff);
  488. val = d->scount;
  489. break;
  490. case ES1370_REG_ADC_FRAMECNT:
  491. d += 2;
  492. goto framecnt;
  493. case ES1370_REG_DAC1_FRAMECNT:
  494. case ES1370_REG_DAC2_FRAMECNT:
  495. d += (addr - ES1370_REG_DAC1_FRAMECNT) >> 3;
  496. framecnt:
  497. trace_es1370_frame_count_rd(d - &s->chan[0],
  498. d->frame_cnt >> 16, d->frame_cnt & 0xffff);
  499. val = d->frame_cnt;
  500. break;
  501. case ES1370_REG_ADC_FRAMEADR:
  502. d += 2;
  503. goto frameadr;
  504. case ES1370_REG_DAC1_FRAMEADR:
  505. case ES1370_REG_DAC2_FRAMEADR:
  506. d += (addr - ES1370_REG_DAC1_FRAMEADR) >> 3;
  507. frameadr:
  508. trace_es1370_frame_address_rd(d - &s->chan[0], d->frame_addr);
  509. val = d->frame_addr;
  510. break;
  511. case ES1370_REG_PHANTOM_FRAMECNT:
  512. val = ~0U;
  513. lwarn("reading from phantom frame count\n");
  514. break;
  515. case ES1370_REG_PHANTOM_FRAMEADR:
  516. val = ~0U;
  517. lwarn("reading from phantom frame address\n");
  518. break;
  519. default:
  520. val = ~0U;
  521. lwarn("readl 0x%" PRIx64 " -> 0x%x\n", addr, val);
  522. break;
  523. }
  524. return val;
  525. }
  526. static void es1370_transfer_audio (ES1370State *s, struct chan *d, int loop_sel,
  527. int max, bool *irq)
  528. {
  529. uint8_t tmpbuf[4096];
  530. size_t to_transfer;
  531. uint32_t addr = d->frame_addr;
  532. int sc = d->scount & 0xffff;
  533. int csc = d->scount >> 16;
  534. int csc_bytes = (csc + 1) << d->shift;
  535. int cnt = d->frame_cnt >> 16;
  536. int size = d->frame_cnt & 0xffff;
  537. if (size < cnt) {
  538. return;
  539. }
  540. int left = ((size - cnt + 1) << 2) + d->leftover;
  541. int transferred = 0;
  542. int index = d - &s->chan[0];
  543. to_transfer = MIN(max, MIN(left, csc_bytes));
  544. addr += (cnt << 2) + d->leftover;
  545. if (index == ADC_CHANNEL) {
  546. while (to_transfer > 0) {
  547. int acquired, to_copy;
  548. to_copy = MIN(to_transfer, sizeof(tmpbuf));
  549. acquired = AUD_read (s->adc_voice, tmpbuf, to_copy);
  550. if (!acquired) {
  551. break;
  552. }
  553. pci_dma_write (&s->dev, addr, tmpbuf, acquired);
  554. to_transfer -= acquired;
  555. addr += acquired;
  556. transferred += acquired;
  557. }
  558. } else {
  559. SWVoiceOut *voice = s->dac_voice[index];
  560. while (to_transfer > 0) {
  561. int copied, to_copy;
  562. to_copy = MIN(to_transfer, sizeof(tmpbuf));
  563. pci_dma_read (&s->dev, addr, tmpbuf, to_copy);
  564. copied = AUD_write (voice, tmpbuf, to_copy);
  565. if (!copied) {
  566. break;
  567. }
  568. to_transfer -= copied;
  569. addr += copied;
  570. transferred += copied;
  571. }
  572. }
  573. if (csc_bytes == transferred) {
  574. if (*irq) {
  575. trace_es1370_lost_interrupt(index);
  576. }
  577. *irq = true;
  578. d->scount = sc | (sc << 16);
  579. } else {
  580. *irq = false;
  581. d->scount = sc | (((csc_bytes - transferred - 1) >> d->shift) << 16);
  582. }
  583. cnt += (transferred + d->leftover) >> 2;
  584. if (s->sctl & loop_sel) {
  585. /*
  586. * loop_sel tells us which bit in the SCTL register to look at
  587. * (either P1_LOOP_SEL, P2_LOOP_SEL or R1_LOOP_SEL). The sense
  588. * of these bits is 0 for loop mode (set interrupt and keep recording
  589. * when the sample count reaches zero) or 1 for stop mode (set
  590. * interrupt and stop recording).
  591. */
  592. AUD_log ("es1370: warning", "non looping mode\n");
  593. } else {
  594. d->frame_cnt = size;
  595. if ((uint32_t) cnt <= d->frame_cnt) {
  596. d->frame_cnt |= cnt << 16;
  597. }
  598. }
  599. d->leftover = (transferred + d->leftover) & 3;
  600. trace_es1370_transfer_audio(index,
  601. d->frame_cnt >> 16, d->frame_cnt & 0xffff,
  602. d->scount >> 16, d->scount & 0xffff,
  603. d->leftover, *irq);
  604. }
  605. static void es1370_run_channel (ES1370State *s, size_t chan, int free_or_avail)
  606. {
  607. uint32_t new_status = s->status;
  608. int max_bytes;
  609. bool irq;
  610. struct chan *d = &s->chan[chan];
  611. const struct chan_bits *b = &es1370_chan_bits[chan];
  612. if (!(s->ctl & b->ctl_en) || (s->sctl & b->sctl_pause)) {
  613. return;
  614. }
  615. max_bytes = free_or_avail;
  616. max_bytes &= ~((1 << d->shift) - 1);
  617. if (!max_bytes) {
  618. return;
  619. }
  620. irq = s->sctl & b->sctl_inten && s->status & b->stat_int;
  621. es1370_transfer_audio (s, d, b->sctl_loopsel, max_bytes, &irq);
  622. if (irq) {
  623. if (s->sctl & b->sctl_inten) {
  624. new_status |= b->stat_int;
  625. }
  626. }
  627. if (new_status != s->status) {
  628. es1370_update_status (s, new_status);
  629. }
  630. }
  631. static void es1370_dac1_callback (void *opaque, int free)
  632. {
  633. ES1370State *s = opaque;
  634. es1370_run_channel (s, DAC1_CHANNEL, free);
  635. }
  636. static void es1370_dac2_callback (void *opaque, int free)
  637. {
  638. ES1370State *s = opaque;
  639. es1370_run_channel (s, DAC2_CHANNEL, free);
  640. }
  641. static void es1370_adc_callback (void *opaque, int avail)
  642. {
  643. ES1370State *s = opaque;
  644. es1370_run_channel (s, ADC_CHANNEL, avail);
  645. }
  646. static const MemoryRegionOps es1370_io_ops = {
  647. .read = es1370_read,
  648. .write = es1370_write,
  649. .valid = {
  650. .min_access_size = 1,
  651. .max_access_size = 4,
  652. },
  653. .impl = {
  654. .min_access_size = 4,
  655. .max_access_size = 4,
  656. },
  657. .endianness = DEVICE_LITTLE_ENDIAN,
  658. };
  659. static const VMStateDescription vmstate_es1370_channel = {
  660. .name = "es1370_channel",
  661. .version_id = 2,
  662. .minimum_version_id = 2,
  663. .fields = (const VMStateField[]) {
  664. VMSTATE_UINT32 (shift, struct chan),
  665. VMSTATE_UINT32 (leftover, struct chan),
  666. VMSTATE_UINT32 (scount, struct chan),
  667. VMSTATE_UINT32 (frame_addr, struct chan),
  668. VMSTATE_UINT32 (frame_cnt, struct chan),
  669. VMSTATE_END_OF_LIST ()
  670. }
  671. };
  672. static int es1370_post_load (void *opaque, int version_id)
  673. {
  674. uint32_t ctl, sctl;
  675. ES1370State *s = opaque;
  676. size_t i;
  677. for (i = 0; i < NB_CHANNELS; ++i) {
  678. if (i == ADC_CHANNEL) {
  679. if (s->adc_voice) {
  680. AUD_close_in (&s->card, s->adc_voice);
  681. s->adc_voice = NULL;
  682. }
  683. } else {
  684. if (s->dac_voice[i]) {
  685. AUD_close_out (&s->card, s->dac_voice[i]);
  686. s->dac_voice[i] = NULL;
  687. }
  688. }
  689. }
  690. ctl = s->ctl;
  691. sctl = s->sctl;
  692. s->ctl = 0;
  693. s->sctl = 0;
  694. es1370_update_voices (s, ctl, sctl);
  695. return 0;
  696. }
  697. static const VMStateDescription vmstate_es1370 = {
  698. .name = "es1370",
  699. .version_id = 2,
  700. .minimum_version_id = 2,
  701. .post_load = es1370_post_load,
  702. .fields = (const VMStateField[]) {
  703. VMSTATE_PCI_DEVICE (dev, ES1370State),
  704. VMSTATE_STRUCT_ARRAY (chan, ES1370State, NB_CHANNELS, 2,
  705. vmstate_es1370_channel, struct chan),
  706. VMSTATE_UINT32 (ctl, ES1370State),
  707. VMSTATE_UINT32 (status, ES1370State),
  708. VMSTATE_UINT32 (mempage, ES1370State),
  709. VMSTATE_UINT32 (codec, ES1370State),
  710. VMSTATE_UINT32 (sctl, ES1370State),
  711. VMSTATE_END_OF_LIST ()
  712. }
  713. };
  714. static void es1370_on_reset(DeviceState *dev)
  715. {
  716. ES1370State *s = ES1370(dev);
  717. es1370_reset (s);
  718. }
  719. static void es1370_realize(PCIDevice *dev, Error **errp)
  720. {
  721. ES1370State *s = ES1370(dev);
  722. uint8_t *c = s->dev.config;
  723. if (!AUD_register_card ("es1370", &s->card, errp)) {
  724. return;
  725. }
  726. c[PCI_STATUS + 1] = PCI_STATUS_DEVSEL_SLOW >> 8;
  727. #if 0
  728. c[PCI_CAPABILITY_LIST] = 0xdc;
  729. c[PCI_INTERRUPT_LINE] = 10;
  730. c[0xdc] = 0x00;
  731. #endif
  732. c[PCI_INTERRUPT_PIN] = 1;
  733. c[PCI_MIN_GNT] = 0x0c;
  734. c[PCI_MAX_LAT] = 0x80;
  735. memory_region_init_io (&s->io, OBJECT(s), &es1370_io_ops, s, "es1370", 256);
  736. pci_register_bar (&s->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
  737. es1370_reset (s);
  738. }
  739. static void es1370_exit(PCIDevice *dev)
  740. {
  741. ES1370State *s = ES1370(dev);
  742. int i;
  743. for (i = 0; i < 2; ++i) {
  744. AUD_close_out(&s->card, s->dac_voice[i]);
  745. }
  746. AUD_close_in(&s->card, s->adc_voice);
  747. AUD_remove_card(&s->card);
  748. }
  749. static const Property es1370_properties[] = {
  750. DEFINE_AUDIO_PROPERTIES(ES1370State, card),
  751. };
  752. static void es1370_class_init (ObjectClass *klass, void *data)
  753. {
  754. DeviceClass *dc = DEVICE_CLASS (klass);
  755. PCIDeviceClass *k = PCI_DEVICE_CLASS (klass);
  756. k->realize = es1370_realize;
  757. k->exit = es1370_exit;
  758. k->vendor_id = PCI_VENDOR_ID_ENSONIQ;
  759. k->device_id = PCI_DEVICE_ID_ENSONIQ_ES1370;
  760. k->class_id = PCI_CLASS_MULTIMEDIA_AUDIO;
  761. k->subsystem_vendor_id = 0x4942;
  762. k->subsystem_id = 0x4c4c;
  763. set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
  764. dc->desc = "ENSONIQ AudioPCI ES1370";
  765. dc->vmsd = &vmstate_es1370;
  766. device_class_set_legacy_reset(dc, es1370_on_reset);
  767. device_class_set_props(dc, es1370_properties);
  768. }
  769. static const TypeInfo es1370_info = {
  770. .name = TYPE_ES1370,
  771. .parent = TYPE_PCI_DEVICE,
  772. .instance_size = sizeof (ES1370State),
  773. .class_init = es1370_class_init,
  774. .interfaces = (InterfaceInfo[]) {
  775. { INTERFACE_CONVENTIONAL_PCI_DEVICE },
  776. { },
  777. },
  778. };
  779. static void es1370_register_types (void)
  780. {
  781. type_register_static (&es1370_info);
  782. deprecated_register_soundhw("es1370", "ENSONIQ AudioPCI ES1370",
  783. 0, TYPE_ES1370);
  784. }
  785. type_init (es1370_register_types)