nm256.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:8k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _NM256_H_
  2. #define _NM256_H_
  3. #include "ac97.h"
  4. /* The revisions that we currently handle.  */
  5. enum nm256rev {
  6.     REV_NM256AV, REV_NM256ZX
  7. };
  8. /* Per-card structure. */
  9. struct nm256_info 
  10. {
  11.     /* Magic number used to verify that this struct is valid. */
  12. #define NM_MAGIC_SIG 0x55aa00ff
  13.     int magsig;
  14.     /* Revision number */
  15.     enum nm256rev rev;
  16.     struct ac97_hwint mdev;
  17.     /* Our audio device numbers. */
  18.     int dev[2];
  19.     /* The # of times each device has been opened. (Should only be 
  20.        0 or 1). */
  21.     int opencnt[2];
  22.     /* We use two devices, because we can do simultaneous play and record.
  23.        This keeps track of which device is being used for what purpose;
  24.        these are the actual device numbers. */
  25.     int dev_for_play;
  26.     int dev_for_record;
  27.     /* The mixer device. */
  28.     int mixer_oss_dev;
  29.     /* 
  30.      * Can only be opened once for each operation.  These aren't set
  31.      * until an actual I/O operation is performed; this allows one
  32.      * device to be open for read/write without inhibiting I/O to
  33.      * the other device.
  34.      */
  35.     int is_open_play;
  36.     int is_open_record;
  37.     /* Non-zero if we're currently playing a sample. */
  38.     int playing;
  39.     /* Ditto for recording a sample. */
  40.     int recording;
  41.     /* The two memory ports.  */
  42.     struct nm256_ports {
  43. /* Physical address of the port. */
  44. u32 physaddr;
  45. /* Our mapped-in pointer. */
  46. char *ptr;
  47. /* PTR's offset within the physical port.  */
  48. u32 start_offset;
  49. /* And the offset of the end of the buffer.  */
  50. u32 end_offset;
  51.     } port[2];
  52.     /* The following are offsets within memory port 1. */
  53.     u32 coeffBuf;
  54.     u32 allCoeffBuf;
  55.     /* Record and playback buffers. */
  56.     u32 abuf1, abuf2;
  57.     /* Offset of the AC97 mixer in memory port 2. */
  58.     u32 mixer;
  59.     /* Offset of the mixer status register in memory port 2.  */
  60.     u32 mixer_status_offset;
  61.     /* Non-zero if we have written initial values to the mixer. */
  62.     u8 mixer_values_init;
  63.     /* 
  64.      * Status mask bit; (*mixer_status_loc & mixer_status_mask) == 0 means
  65.      * it's ready.  
  66.      */
  67.     u16 mixer_status_mask;
  68.     /* The sizes of the playback and record ring buffers. */
  69.     u32 playbackBufferSize;
  70.     u32 recordBufferSize;
  71.     /* Are the coefficient values in the memory cache current? */
  72.     u8 coeffsCurrent;
  73.     /* For writes, the amount we last wrote. */
  74.     u32 requested_amt;
  75.     /* The start of the block currently playing. */
  76.     u32 curPlayPos;
  77.     /* The amount of data we were requested to record. */
  78.     u32 requestedRecAmt;
  79.     /* The offset of the currently-recording block. */
  80.     u32 curRecPos;
  81.     /* The destination buffer. */
  82.     char *recBuf;
  83.     /* Our IRQ number. */
  84.     int irq;
  85.     /* A flag indicating how many times we've grabbed the IRQ. */
  86.     int has_irq;
  87.     /* The card interrupt service routine. */
  88.     void (*introutine) (int, void *, struct pt_regs *);
  89.     /* Current audio config, cached. */
  90.     struct sinfo {
  91. u32 samplerate;
  92. u8 bits;
  93. u8 stereo;
  94.     } sinfo[2]; /* goes with each device */
  95.     /* The cards are stored in a chain;  this is the next card. */
  96.     struct nm256_info *next_card;
  97. };
  98. /* Debug flag--bigger numbers mean more output. */
  99. extern int nm256_debug;
  100. /* The BIOS signature. */
  101. #define NM_SIGNATURE 0x4e4d0000
  102. /* Signature mask. */
  103. #define NM_SIG_MASK 0xffff0000
  104. /* Size of the second memory area. */
  105. #define NM_PORT2_SIZE 4096
  106. /* The base offset of the mixer in the second memory area. */
  107. #define NM_MIXER_OFFSET 0x600
  108. /* The maximum size of a coefficient entry. */
  109. #define NM_MAX_COEFFICIENT 0x5000
  110. /* The interrupt register. */
  111. #define NM_INT_REG 0xa04
  112. /* And its bits. */
  113. #define NM_PLAYBACK_INT 0x40
  114. #define NM_RECORD_INT 0x100
  115. #define NM_MISC_INT_1 0x4000
  116. #define NM_MISC_INT_2 0x1
  117. #define NM_ACK_INT(CARD, X) nm256_writePort16((CARD), 2, NM_INT_REG, (X) << 1)
  118. /* The AV's "mixer ready" status bit and location. */
  119. #define NM_MIXER_STATUS_OFFSET 0xa04
  120. #define NM_MIXER_READY_MASK 0x0800
  121. #define NM_MIXER_PRESENCE 0xa06
  122. #define NM_PRESENCE_MASK 0x0050
  123. #define NM_PRESENCE_VALUE 0x0040
  124. /*
  125.  * For the ZX.  It uses the same interrupt register, but it holds 32
  126.  * bits instead of 16.
  127.  */
  128. #define NM2_PLAYBACK_INT 0x10000
  129. #define NM2_RECORD_INT 0x80000
  130. #define NM2_MISC_INT_1 0x8
  131. #define NM2_MISC_INT_2 0x2
  132. #define NM2_ACK_INT(CARD, X) nm256_writePort32((CARD), 2, NM_INT_REG, (X))
  133. /* The ZX's "mixer ready" status bit and location. */
  134. #define NM2_MIXER_STATUS_OFFSET 0xa06
  135. #define NM2_MIXER_READY_MASK 0x0800
  136. /* The playback registers start from here. */
  137. #define NM_PLAYBACK_REG_OFFSET 0x0
  138. /* The record registers start from here. */
  139. #define NM_RECORD_REG_OFFSET 0x200
  140. /* The rate register is located 2 bytes from the start of the register area. */
  141. #define NM_RATE_REG_OFFSET 2
  142. /* Mono/stereo flag, number of bits on playback, and rate mask. */
  143. #define NM_RATE_STEREO 1
  144. #define NM_RATE_BITS_16 2
  145. #define NM_RATE_MASK 0xf0
  146. /* Playback enable register. */
  147. #define NM_PLAYBACK_ENABLE_REG (NM_PLAYBACK_REG_OFFSET + 0x1)
  148. #define NM_PLAYBACK_ENABLE_FLAG 1
  149. #define NM_PLAYBACK_ONESHOT 2
  150. #define NM_PLAYBACK_FREERUN 4
  151. /* Mutes the audio output. */
  152. #define NM_AUDIO_MUTE_REG (NM_PLAYBACK_REG_OFFSET + 0x18)
  153. #define NM_AUDIO_MUTE_LEFT 0x8000
  154. #define NM_AUDIO_MUTE_RIGHT 0x0080
  155. /* Recording enable register. */
  156. #define NM_RECORD_ENABLE_REG (NM_RECORD_REG_OFFSET + 0)
  157. #define NM_RECORD_ENABLE_FLAG 1
  158. #define NM_RECORD_FREERUN 2
  159. #define NM_RBUFFER_START (NM_RECORD_REG_OFFSET + 0x4)
  160. #define NM_RBUFFER_END   (NM_RECORD_REG_OFFSET + 0x10)
  161. #define NM_RBUFFER_WMARK (NM_RECORD_REG_OFFSET + 0xc)
  162. #define NM_RBUFFER_CURRP (NM_RECORD_REG_OFFSET + 0x8)
  163. #define NM_PBUFFER_START (NM_PLAYBACK_REG_OFFSET + 0x4)
  164. #define NM_PBUFFER_END   (NM_PLAYBACK_REG_OFFSET + 0x14)
  165. #define NM_PBUFFER_WMARK (NM_PLAYBACK_REG_OFFSET + 0xc)
  166. #define NM_PBUFFER_CURRP (NM_PLAYBACK_REG_OFFSET + 0x8)
  167. /* A few trivial routines to make it easier to work with the registers
  168.    on the chip. */
  169. /* This is a common code portion used to fix up the port offsets. */
  170. #define NM_FIX_PORT 
  171.   if (port < 1 || port > 2 || card == NULL) 
  172.       return -1; 
  173.     if (offset < card->port[port - 1].start_offset 
  174. || offset >= card->port[port - 1].end_offset) { 
  175. printk (KERN_ERR "Bad access: port %d, offset 0x%xn", port, offset); 
  176. return -1; 
  177.     } 
  178.     offset -= card->port[port - 1].start_offset;
  179. #define DEFwritePortX(X, func) 
  180. static inline int nm256_writePort##X (struct nm256_info *card,
  181.       int port, int offset, int value)
  182. {
  183.     u##X *addr;
  184.     if (nm256_debug > 1)
  185.         printk (KERN_DEBUG "Writing 0x%x to %d:0x%xn", value, port, offset);
  186.     NM_FIX_PORT;
  187.     addr = (u##X *)(card->port[port - 1].ptr + offset);
  188.     func (value, addr);
  189.     return 0;
  190. }
  191. DEFwritePortX (8, writeb)
  192. DEFwritePortX (16, writew)
  193. DEFwritePortX (32, writel)
  194. #define DEFreadPortX(X, func) 
  195. static inline u##X nm256_readPort##X (struct nm256_info *card,
  196. int port, int offset)
  197. {
  198.     u##X *addr;
  199.     NM_FIX_PORT
  200.     addr = (u##X *)(card->port[port - 1].ptr + offset);
  201.     return func(addr);
  202. }
  203. DEFreadPortX (8, readb)
  204. DEFreadPortX (16, readw)
  205. DEFreadPortX (32, readl)
  206. static inline int
  207. nm256_writeBuffer8 (struct nm256_info *card, u8 *src, int port, int offset,
  208.       int amt)
  209. {
  210.     NM_FIX_PORT;
  211.     memcpy_toio (card->port[port - 1].ptr + offset, src, amt);
  212.     return 0;
  213. }
  214. static inline int
  215. nm256_readBuffer8 (struct nm256_info *card, u8 *dst, int port, int offset,
  216.      int amt)
  217. {
  218.     NM_FIX_PORT;
  219.     memcpy_fromio (dst, card->port[port - 1].ptr + offset, amt);
  220.     return 0;
  221. }
  222. /* Returns a non-zero value if we should use the coefficient cache. */
  223. extern int nm256_cachedCoefficients (struct nm256_info *card);
  224. #endif
  225. /*
  226.  * Local variables:
  227.  * c-basic-offset: 4
  228.  * End:
  229.  */