Copyright notices in docs
[mw/milkymist.git] / cores / ac97 / doc / ac97.tex
1 \documentclass[a4paper,11pt]{article}
2 \usepackage{fullpage}
3 \usepackage[latin1]{inputenc}
4 \usepackage[T1]{fontenc}
5 \usepackage[normalem]{ulem}
6 \usepackage[english]{babel}
7 \usepackage{listings,babel}
8 \lstset{breaklines=true,basicstyle=\ttfamily}
9 \usepackage{graphicx}
10 \usepackage{moreverb}
11 \usepackage{url}
12 \usepackage{tabularx}
13
14 \title{AC'97 controller}
15 \author{S\'ebastien Bourdeauducq}
16 \date{December 2009}
17 \begin{document}
18 \setlength{\parindent}{0pt}
19 \setlength{\parskip}{5pt}
20 \maketitle{}
21 \section{Introduction}
22 The AC'97 controller core enables a system-on-chip (SoC) to interface directly with off-the-shelf AC'97 codecs popular in PCs.
23
24 It provides a cost-efficient solution to add good quality sound input and output to a FPGA-based system.
25
26 \section{Registers}
27 \subsection{Codec register access, offsets 0x00, 0x04, 0x08 and 0x0c}
28 Those registers are used to read and write the registers inside the off-chip AC'97 codec.
29
30 Register 0x04 holds the current register address, while registers 0x08 and 0x0c contain data respectively written to and read from the AC'97 codec.
31
32 Register 0x00 controls the transfers to and from the AC'97 codec registers. Its bits are mapped as follows:
33
34 \begin{tabularx}{\textwidth}{|l|X|}
35 \hline
36 \textbf{Bit} & \textbf{Description} \\
37 \hline
38 0 & Request pending. Write 1 to this bit to initiate a read or write request. \\
39 \hline
40 1 & Selects between a read (0) and write (1) request. \\
41 \hline
42 2--31 & Reserved. \\
43 \hline
44 \end{tabularx}
45
46 \subsection{Downstream control registers, offsets 0x10, 0x14 and 0x18}
47 Those registers control the stream of PCM data from the SoC to the AC'97 codec (audio playback).
48
49 The PCM data is transferred via DMA. Stereo samples are interleaved and use the signed 16-bit big-endian format. The sample rate is fixed at 48kHz.
50
51 The register 0x14 holds the current DMA address. It is incremented by 4 (two 2-byte values --- one for each channel) after each transferred sample.
52 The register 0x18 (counter register) holds the number of bytes that can still be transferred in the DMA buffer before a new buffer address must be programmed. It is decremented by 4 after each transferred sample. The maximum value is \verb!0x3fffc!. When this register reaches 0, a ``DMA read'' interrupt is generated and the AC'97 controller uses its built-in FIFO to supply the codec with data.
53
54 The DMA address must be aligned on a 32-bit boundary, and the number of bytes must be a multiple of 4.
55
56 The register 0x10 controls the stream of data:
57
58 \begin{tabularx}{\textwidth}{|l|X|}
59 \hline
60 \textbf{Bit} & \textbf{Description} \\
61 \hline
62 0 & Downstream enabled. When this bit is set by the CPU, the AC'97 controller sends PCM data to the codec and reads the DMA buffer (if the counter register is not zero). \\
63 \hline
64 1--31 & Reserved. \\
65 \hline
66 \end{tabularx}
67
68 \subsection{Upstream control registers, offsets 0x20, 0x24 and 0x28}
69 Those registers control the stream of PCM data from the AC'97 codec to the SoC (audio recording).
70
71 They work exactly like the downstream control registers.
72
73 \section{Interrupts}
74 The AC'97 core is equipped with 4 active-high edge-sensitive interrupt lines:
75
76 \begin{tabularx}{\textwidth}{|l|X|}
77 \hline
78 \textbf{Line} & \textbf{Description} \\
79 \hline
80 crrequest\_irq & The codec configuration register read/write request has been sent. \\
81 \hline
82 crreply\_irq & The value of a codec configuration register has been received (after a read request). \\
83 \hline
84 dmar\_irq & The read (downstream/playback) DMA counter register has reached 0. \\
85 \hline
86 dmaw\_irq & The write (upstream/recording) DMA counter register has reached 0. \\
87 \hline
88 \end{tabularx}
89
90 \section{Using the DMA engine}
91 The downstream and upstream DMA engines work exactly the same, and can be enabled at the same time.
92
93 \subsection{Initiating the stream}
94 \begin{itemize}
95 \item Prepare a memory buffer. If you want to play sound, it must be initialized with the samples. If you want to record, it does not need to be initialized.
96 \item Program the buffer address and the buffer length.
97 \item Set bit 0 in the stream control register.
98 \end{itemize}
99
100 \subsection{Refilling the stream}
101 Once your buffer has been transferred, the AC'97 will send an interrupt to request another buffer.
102 \begin{itemize}
103 \item Prepare a new buffer.
104 \item Program the new buffer address \underline{then} the buffer length\footnote{When the stream is enabled, the AC'97 controller starts making transfers on the bus as soon as the counter register is non-zero.}.
105 \item Write any value to the stream control register to ack the interrupt (however, the bit 0 must still be set so that the stream continues).
106 \end{itemize}
107
108 \subsection{Terminating the stream}
109 Clear the bit 0 in the stream control register.
110
111 If the AC'97 controller is in the middle of a Wishbone bus cycle, this cycle will be allowed to finish. No new bus cycle will be started.
112
113 \section{Connections}
114
115 \begin{tabularx}{\textwidth}{|l|X|}
116 \hline
117 \textbf{Port} & \textbf{Description} \\
118 \hline
119 sys\_clk & System clock. \\
120 sys\_rst & System reset. \\
121 \hline
122 ac97\_clk & AC'97 clock. Entirely asynchronous to the system clock. \\
123 ac97\_rst\_n & AC'97 reset signal (input). \\
124 ac97\_sin & AC'97 serial data line (codec to SoC). \\
125 ac97\_sout & AC'97 serial data line (SoC to codec). \\
126 ac97\_sync & AC'97 synchronization line. \\
127 \hline
128 csr\_* & CSR bus interface. \\
129 \hline
130 crrequest\_irq & Codec register request sent interrupt. \\
131 crreply\_irq & Codec register reply received interrupt. \\
132 dmar\_irq & DMA read (downstream) interrupt. \\
133 dmaw\_irq & DMA write (upstream) interrupt. \\
134 \hline
135 wbm\_* & Wishbone master interface for DMA. \\
136 \hline
137 \end{tabularx}
138
139 \section*{Copyright notice}
140 Copyright \copyright 2007-2009 S\'ebastien Bourdeauducq. \\
141 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the LICENSE.FDL file at the root of the Milkymist source distribution.
142
143 \end{document}