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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: dbri.h,v 1.13 2000/10/13 00:34:24 uzi Exp $
  2.  * drivers/sbus/audio/cs4231.h
  3.  *
  4.  * Copyright (C) 1997 Rudolf Koenig (rfkoenig@immd4.informatik.uni-erlangen.de)
  5.  */
  6. #ifndef _DBRI_H_
  7. #define _DBRI_H_
  8. #include <linux/types.h>
  9. /* DBRI main registers */
  10. #define REG0 0x00UL /* Status and Control */
  11. #define REG1 0x04UL /* Mode and Interrupt */
  12. #define REG2 0x08UL /* Parallel IO */
  13. #define REG3 0x0cUL /* Test */
  14. #define REG8 0x20UL /* Command Queue Pointer */
  15. #define REG9 0x24UL /* Interrupt Queue Pointer */
  16. #define DBRI_NO_CMDS 64
  17. #define DBRI_NO_INTS 1 /* Note: the value of this define was
  18.  * originally 2.  The ringbuffer to store
  19.  * interrupts in dma is currently broken.
  20.  * This is a temporary fix until the ringbuffer
  21.  * is fixed.
  22.  */
  23. #define DBRI_INT_BLK 64
  24. #define DBRI_NO_DESCS 64
  25. #define DBRI_MM_ONB 1
  26. #define DBRI_MM_SB 2
  27. struct dbri_mem {
  28. volatile __u32 word1;
  29. volatile __u32 ba; /* Transmit/Receive Buffer Address */
  30. volatile __u32 nda; /* Next Descriptor Address */
  31. volatile __u32 word4;
  32. };
  33. #include "cs4215.h"
  34. /* This structure is in a DMA region where it can accessed by both
  35.  * the CPU and the DBRI
  36.  */
  37. struct dbri_dma {
  38. volatile s32 cmd[DBRI_NO_CMDS]; /* Place for commands */
  39. volatile s32 intr[DBRI_NO_INTS * DBRI_INT_BLK]; /* Interrupt field */
  40. struct dbri_mem desc[DBRI_NO_DESCS]; /* Xmit/receive descriptors */
  41. };
  42. #define dbri_dma_off(member, elem)
  43. ((u32)(unsigned long)
  44.  (&(((struct dbri_dma *)0)->member[elem])))
  45. enum in_or_out { PIPEinput, PIPEoutput };
  46. enum direction { in, out };
  47. struct dbri_pipe {
  48.         u32 sdp; /* SDP command word */
  49. enum direction direction;
  50.         int nextpipe; /* Next pipe in linked list */
  51. int prevpipe;
  52.         int cycle; /* Offset of timeslot (bits) */
  53.         int length; /* Length of timeslot (bits) */
  54.         int desc; /* Index of active descriptor*/
  55. volatile __u32 *recv_fixed_ptr; /* Ptr to receive fixed data */
  56. };
  57. struct dbri_desc {
  58.         int inuse; /* Boolean flag */
  59.         int next; /* Index of next desc, or -1 */
  60.         void *buffer; /* CPU view of buffer */
  61. u32 buffer_dvma; /* Device view */
  62.         unsigned int len;
  63.         void (*output_callback)(void *, int);
  64.         void *output_callback_arg;
  65.         void (*input_callback)(void *, int, unsigned int);
  66.         void *input_callback_arg;
  67. };
  68. /* This structure holds the information for both chips (DBRI & CS4215) */
  69. struct dbri {
  70. int regs_size, irq; /* Needed for unload */
  71. struct sbus_dev *sdev; /* SBUS device info */
  72. volatile struct dbri_dma *dma; /* Pointer to our DMA block */
  73. u32 dma_dvma; /* DBRI visible DMA address */
  74. unsigned long regs; /* dbri HW regs */
  75. int dbri_version; /* 'e' and up is OK */
  76. int dbri_irqp; /* intr queue pointer */
  77. int wait_seen;
  78. struct dbri_pipe pipes[32]; /* DBRI's 32 data pipes */
  79. struct dbri_desc descs[DBRI_NO_DESCS];
  80. int chi_in_pipe;
  81. int chi_out_pipe;
  82. int chi_bpf;
  83. struct cs4215 mm; /* mmcodec special info */
  84. #if 0
  85. /* Where to sleep if busy */
  86. wait_queue_head_t wait, int_wait;
  87. #endif
  88. struct audio_info perchip_info;
  89. /* Track ISDN LIU and notify changes */
  90. int liu_state;
  91. void (*liu_callback)(void *);
  92. void *liu_callback_arg;
  93. };
  94. /* DBRI Reg0 - Status Control Register - defines. (Page 17) */
  95. #define D_P (1<<15) /* Program command & queue pointer valid */
  96. #define D_G (1<<14) /* Allow 4-Word SBus Burst */
  97. #define D_S (1<<13) /* Allow 16-Word SBus Burst */
  98. #define D_E (1<<12) /* Allow 8-Word SBus Burst */
  99. #define D_X (1<<7) /* Sanity Timer Disable */
  100. #define D_T (1<<6) /* Permit activation of the TE interface */
  101. #define D_N (1<<5) /* Permit activation of the NT interface */
  102. #define D_C (1<<4) /* Permit activation of the CHI interface */
  103. #define D_F (1<<3) /* Force Sanity Timer Time-Out */
  104. #define D_D (1<<2) /* Disable Master Mode */
  105. #define D_H (1<<1) /* Halt for Analysis */
  106. #define D_R (1<<0) /* Soft Reset */
  107. /* DBRI Reg1 - Mode and Interrupt Register - defines. (Page 18) */
  108. #define D_LITTLE_END (1<<8) /* Byte Order */
  109. #define D_BIG_END (0<<8) /* Byte Order */
  110. #define D_MRR (1<<4) /* Multiple Error Ack on SBus (readonly) */
  111. #define D_MLE (1<<3) /* Multiple Late Error on SBus (readonly) */
  112. #define D_LBG (1<<2) /* Lost Bus Grant on SBus (readonly) */
  113. #define D_MBE (1<<1) /* Burst Error on SBus (readonly) */
  114. #define D_IR (1<<0) /* Interrupt Indicator (readonly) */
  115. /* DBRI Reg2 - Parallel IO Register - defines. (Page 18) */
  116. #define D_ENPIO3 (1<<7) /* Enable Pin 3 */
  117. #define D_ENPIO2 (1<<6) /* Enable Pin 2 */
  118. #define D_ENPIO1 (1<<5) /* Enable Pin 1 */
  119. #define D_ENPIO0 (1<<4) /* Enable Pin 0 */
  120. #define D_ENPIO (0xf0) /* Enable all the pins */
  121. #define D_PIO3 (1<<3) /* Pin 3: 1: Data mode, 0: Ctrl mode */
  122. #define D_PIO2 (1<<2) /* Pin 2: 1: Onboard PDN */
  123. #define D_PIO1 (1<<1) /* Pin 1: 0: Reset */
  124. #define D_PIO0 (1<<0) /* Pin 0: 1: Speakerbox PDN */
  125. /* DBRI Commands (Page 20) */
  126. #define D_WAIT 0x0 /* Stop execution */
  127. #define D_PAUSE 0x1 /* Flush long pipes */
  128. #define D_JUMP 0x2 /* New command queue */
  129. #define D_IIQ 0x3 /* Initialize Interrupt Queue */
  130. #define D_REX 0x4 /* Report command execution via interrupt */
  131. #define D_SDP 0x5 /* Setup Data Pipe */
  132. #define D_CDP 0x6 /* Continue Data Pipe (reread NULL Pointer) */
  133. #define D_DTS 0x7 /* Define Time Slot */
  134. #define D_SSP 0x8 /* Set short Data Pipe */
  135. #define D_CHI 0x9 /* Set CHI Global Mode */
  136. #define D_NT 0xa /* NT Command */
  137. #define D_TE 0xb /* TE Command */
  138. #define D_CDEC 0xc /* Codec setup */
  139. #define D_TEST 0xd /* No comment */
  140. #define D_CDM 0xe /* CHI Data mode command */
  141. /* Special bits for some commands */
  142. #define D_PIPE(v)      ((v)<<0)        /* Pipe Nr: 0-15 long, 16-21 short */
  143. /* Setup Data Pipe */
  144. /* IRM */
  145. #define D_SDP_2SAME (1<<18) /* Report 2nd time in a row value rcvd*/
  146. #define D_SDP_CHANGE (2<<18) /* Report any changes */
  147. #define D_SDP_EVERY (3<<18) /* Report any changes */
  148. #define D_SDP_EOL (1<<17) /* EOL interrupt enable */
  149. #define D_SDP_IDLE (1<<16) /* HDLC idle interrupt enable */
  150. /* Pipe data MODE */
  151. #define D_SDP_MEM (0<<13) /* To/from memory */
  152. #define D_SDP_HDLC (2<<13)
  153. #define D_SDP_HDLC_D (3<<13) /* D Channel (prio control)*/
  154. #define D_SDP_SER (4<<13) /* Serial to serial */
  155. #define D_SDP_FIXED (6<<13) /* Short only */
  156. #define D_SDP_MODE(v) ((v)&(7<<13))
  157. #define D_SDP_TO_SER (1<<12) /* Direction */
  158. #define D_SDP_FROM_SER (0<<12) /* Direction */
  159. #define D_SDP_MSB (1<<11) /* Bit order within Byte */
  160. #define D_SDP_LSB (0<<11) /* Bit order within Byte */
  161. #define D_SDP_P (1<<10) /* Pointer Valid */
  162. #define D_SDP_A (1<<8) /* Abort */
  163. #define D_SDP_C (1<<7) /* Clear */
  164. /* Define Time Slot */
  165. #define D_DTS_VI (1<<17) /* Valid Input Time-Slot Descriptor */
  166. #define D_DTS_VO (1<<16) /* Valid Output Time-Slot Descriptor */
  167. #define D_DTS_INS (1<<15) /* Insert Time Slot */
  168. #define D_DTS_DEL (0<<15) /* Delete Time Slot */
  169. #define D_DTS_PRVIN(v) ((v)<<10) /* Previous In Pipe */
  170. #define D_DTS_PRVOUT(v)        ((v)<<5)  /* Previous Out Pipe */
  171. /* Time Slot defines */
  172. #define D_TS_LEN(v) ((v)<<24) /* Number of bits in this time slot */
  173. #define D_TS_CYCLE(v) ((v)<<14) /* Bit Count at start of TS */
  174. #define D_TS_DI (1<<13) /* Data Invert */
  175. #define D_TS_1CHANNEL (0<<10) /* Single Channel / Normal mode */
  176. #define D_TS_MONITOR (2<<10) /* Monitor pipe */
  177. #define D_TS_NONCONTIG (3<<10) /* Non contiguous mode */
  178. #define D_TS_ANCHOR (7<<10) /* Starting short pipes */
  179. #define D_TS_MON(v)    ((v)<<5)        /* Monitor Pipe */
  180. #define D_TS_NEXT(v)   ((v)<<0)        /* Pipe Nr: 0-15 long, 16-21 short */
  181. /* Concentration Highway Interface Modes */
  182. #define D_CHI_CHICM(v) ((v)<<16) /* Clock mode */
  183. #define D_CHI_IR (1<<15) /* Immediate Interrupt Report */
  184. #define D_CHI_EN (1<<14) /* CHIL Interrupt enabled */
  185. #define D_CHI_OD (1<<13) /* Open Drain Enable */
  186. #define D_CHI_FE (1<<12) /* Sample CHIFS on Rising Frame Edge */
  187. #define D_CHI_FD (1<<11) /* Frame Drive */
  188. #define D_CHI_BPF(v) ((v)<<0) /* Bits per Frame */
  189. /* NT: These are here for completeness */
  190. #define D_NT_FBIT (1<<17) /* Frame Bit */
  191. #define D_NT_NBF (1<<16) /* Number of bad frames to loose framing */
  192. #define D_NT_IRM_IMM (1<<15) /* Interrupt Report & Mask: Immediate */
  193. #define D_NT_IRM_EN (1<<14) /* Interrupt Report & Mask: Enable */
  194. #define D_NT_ISNT (1<<13) /* Configfure interface as NT */
  195. #define D_NT_FT (1<<12) /* Fixed Timing */
  196. #define D_NT_EZ (1<<11) /* Echo Channel is Zeros */
  197. #define D_NT_IFA (1<<10) /* Inhibit Final Activation */
  198. #define D_NT_ACT (1<<9) /* Activate Interface */
  199. #define D_NT_MFE (1<<8) /* Multiframe Enable */
  200. #define D_NT_RLB(v) ((v)<<5) /* Remote Loopback */
  201. #define D_NT_LLB(v) ((v)<<2) /* Local Loopback */
  202. #define D_NT_FACT (1<<1) /* Force Activation */
  203. #define D_NT_ABV (1<<0) /* Activate Bipolar Violation */
  204. /* Codec Setup */
  205. #define D_CDEC_CK(v) ((v)<<24) /* Clock Select */
  206. #define D_CDEC_FED(v) ((v)<<12) /* FSCOD Falling Edge Delay */
  207. #define D_CDEC_RED(v) ((v)<<0) /* FSCOD Rising Edge Delay */
  208. /* Test */
  209. #define D_TEST_RAM(v) ((v)<<16) /* RAM Pointer */
  210. #define D_TEST_SIZE(v) ((v)<<11) /* */
  211. #define D_TEST_ROMONOFF 0x5 /* Toggle ROM opcode monitor on/off */
  212. #define D_TEST_PROC 0x6 /* MicroProcessor test */
  213. #define D_TEST_SER 0x7 /* Serial-Controller test */
  214. #define D_TEST_RAMREAD 0x8 /* Copy from Ram to system memory */
  215. #define D_TEST_RAMWRITE 0x9 /* Copy into Ram from system memory */
  216. #define D_TEST_RAMBIST 0xa /* RAM Built-In Self Test */
  217. #define D_TEST_MCBIST 0xb /* Microcontroller Built-In Self Test */
  218. #define D_TEST_DUMP 0xe /* ROM Dump */
  219. /* CHI Data Mode */
  220. #define D_CDM_THI (1<<8) /* Transmit Data on CHIDR Pin */
  221. #define D_CDM_RHI (1<<7) /* Receive Data on CHIDX Pin */
  222. #define D_CDM_RCE (1<<6) /* Receive on Rising Edge of CHICK */
  223. #define D_CDM_XCE (1<<2) /* Transmit Data on Rising Edge of CHICK */
  224. #define D_CDM_XEN (1<<1) /* Transmit Highway Enable */
  225. #define D_CDM_REN (1<<0) /* Receive Highway Enable */
  226. /* The Interrupts */
  227. #define D_INTR_BRDY 1 /* Buffer Ready for processing */
  228. #define D_INTR_MINT 2 /* Marked Interrupt in RD/TD */
  229. #define D_INTR_IBEG 3 /* Flag to idle transition detected (HDLC) */
  230. #define D_INTR_IEND 4 /* Idle to flag transition detected (HDLC) */
  231. #define D_INTR_EOL 5 /* End of List */
  232. #define D_INTR_CMDI 6 /* Command has bean read */
  233. #define D_INTR_XCMP 8 /* Transmission of frame complete */
  234. #define D_INTR_SBRI 9 /* BRI status change info */
  235. #define D_INTR_FXDT 10 /* Fixed data change */
  236. #define D_INTR_CHIL 11 /* CHI lost frame sync (channel 36 only) */
  237. #define D_INTR_COLL 11 /* Unrecoverable D-Channel collision */
  238. #define D_INTR_DBYT 12 /* Dropped by frame slip */
  239. #define D_INTR_RBYT 13 /* Repeated by frame slip */
  240. #define D_INTR_LINT 14 /* Lost Interrupt */
  241. #define D_INTR_UNDR 15 /* DMA underrun */
  242. #define D_INTR_TE 32
  243. #define D_INTR_NT 34
  244. #define D_INTR_CHI 36
  245. #define D_INTR_CMD 38
  246. #define D_INTR_GETCHAN(v) (((v)>>24) & 0x3f)
  247. #define D_INTR_GETCODE(v) (((v)>>20) & 0xf)
  248. #define D_INTR_GETCMD(v) (((v)>>16) & 0xf)
  249. #define D_INTR_GETVAL(v) ((v) & 0xffff)
  250. #define D_INTR_GETRVAL(v) ((v) & 0xfffff)
  251. #define D_P_0 0 /* TE receive anchor */
  252. #define D_P_1 1 /* TE transmit anchor */
  253. #define D_P_2 2 /* NT transmit anchor */
  254. #define D_P_3 3 /* NT receive anchor */
  255. #define D_P_4 4 /* CHI send data */
  256. #define D_P_5 5 /* CHI receive data */
  257. #define D_P_6 6 /* */
  258. #define D_P_7 7 /* */
  259. #define D_P_8 8 /* */
  260. #define D_P_9 9 /* */
  261. #define D_P_10 10 /* */
  262. #define D_P_11 11 /* */
  263. #define D_P_12 12 /* */
  264. #define D_P_13 13 /* */
  265. #define D_P_14 14 /* */
  266. #define D_P_15 15 /* */
  267. #define D_P_16 16 /* CHI anchor pipe */
  268. #define D_P_17 17 /* CHI send */
  269. #define D_P_18 18 /* CHI receive */
  270. #define D_P_19 19 /* CHI receive */
  271. #define D_P_20 20 /* CHI receive */
  272. #define D_P_21 21 /* */
  273. #define D_P_22 22 /* */
  274. #define D_P_23 23 /* */
  275. #define D_P_24 24 /* */
  276. #define D_P_25 25 /* */
  277. #define D_P_26 26 /* */
  278. #define D_P_27 27 /* */
  279. #define D_P_28 28 /* */
  280. #define D_P_29 29 /* */
  281. #define D_P_30 30 /* */
  282. #define D_P_31 31 /* */
  283. /* Transmit descriptor defines */
  284. #define DBRI_TD_F (1<<31) /* End of Frame */
  285. #define DBRI_TD_D (1<<30) /* Do not append CRC */
  286. #define DBRI_TD_CNT(v) ((v)<<16) /* Number of valid bytes in the buffer */
  287. #define DBRI_TD_B (1<<15) /* Final interrupt */
  288. #define DBRI_TD_M (1<<14) /* Marker interrupt */
  289. #define DBRI_TD_I (1<<13) /* Transmit Idle Characters */
  290. #define DBRI_TD_FCNT(v) (v) /* Flag Count */
  291. #define DBRI_TD_UNR (1<<3) /* Underrun: transmitter is out of data */
  292. #define DBRI_TD_ABT (1<<2) /* Abort: frame aborted */
  293. #define DBRI_TD_TBC (1<<0) /* Transmit buffer Complete */
  294. #define DBRI_TD_STATUS(v)       ((v)&0xff)      /* Transmit status */
  295. /* Receive descriptor defines */
  296. #define DBRI_RD_F (1<<31) /* End of Frame */
  297. #define DBRI_RD_C (1<<30) /* Completed buffer */
  298. #define DBRI_RD_B (1<<15) /* Final interrupt */
  299. #define DBRI_RD_M (1<<14) /* Marker interrupt */
  300. #define DBRI_RD_BCNT(v) (v) /* Buffer size */
  301. #define DBRI_RD_CRC (1<<7) /* 0: CRC is correct */
  302. #define DBRI_RD_BBC (1<<6) /* 1: Bad Byte received */
  303. #define DBRI_RD_ABT (1<<5) /* Abort: frame aborted */
  304. #define DBRI_RD_OVRN (1<<3) /* Overrun: data lost */
  305. #define DBRI_RD_STATUS(v)      ((v)&0xff)      /* Receive status */
  306. #define DBRI_RD_CNT(v) (((v)>>16)&0x1fff)        /* Number of valid bytes in the buffer */
  307. #endif /* _DBRI_H_ */