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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Driver for ST5481 USB ISDN modem
  3.  *
  4.  * Author       Frode Isaksen
  5.  * Copyright    2001 by Frode Isaksen      <fisaksen@bewan.com>
  6.  *              2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
  7.  * 
  8.  * This software may be used and distributed according to the terms
  9.  * of the GNU General Public License, incorporated herein by reference.
  10.  *
  11.  */
  12. #ifndef _ST5481_H_
  13. #define _ST5481_H_
  14. #include <linux/config.h>
  15. // USB IDs, the Product Id is in the range 0x4810-0x481F
  16. #define ST_VENDOR_ID 0x0483
  17. #define ST5481_PRODUCT_ID 0x4810
  18. #define ST5481_PRODUCT_ID_MASK 0xFFF0
  19. // ST5481 endpoints when using alternative setting 3 (2B+D).
  20. // To get the endpoint address, OR with 0x80 for IN endpoints.
  21. #define EP_CTRL   0x00U /* Control endpoint */
  22. #define EP_INT    0x01U /* Interrupt endpoint */
  23. #define EP_B1_OUT 0x02U /* B1 channel out */
  24. #define EP_B1_IN  0x03U /* B1 channel in */
  25. #define EP_B2_OUT 0x04U /* B2 channel out */
  26. #define EP_B2_IN  0x05U /* B2 channel in */
  27. #define EP_D_OUT  0x06U /* D channel out */
  28. #define EP_D_IN   0x07U /* D channel in */
  29.   
  30. // Number of isochronous packets. With 20 packets we get
  31. // 50 interrupts/sec for each endpoint.
  32. #define NUM_ISO_PACKETS_D      20
  33. #define NUM_ISO_PACKETS_B      20
  34. // Size of each isochronous packet.
  35. // In outgoing direction we need to match ISDN data rates:
  36. // D:  2 bytes / msec -> 16 kbit / s
  37. // B: 16 bytes / msec -> 64 kbit / s
  38. #define SIZE_ISO_PACKETS_D_IN  16
  39. #define SIZE_ISO_PACKETS_D_OUT 2
  40. #define SIZE_ISO_PACKETS_B_IN  32
  41. #define SIZE_ISO_PACKETS_B_OUT 8
  42. // If we overrun/underrun, we send one packet with +/- 2 bytes
  43. #define B_FLOW_ADJUST 2
  44. // Registers that are written using vendor specific device request
  45. // on endpoint 0. 
  46. #define LBA 0x02 /* S loopback */
  47. #define SET_DEFAULT 0x06 /* Soft reset */
  48. #define LBB 0x1D /* S maintenance loopback */
  49. #define STT 0x1e /* S force transmission signals */
  50. #define SDA_MIN 0x20 /* SDA-sin minimal value */
  51. #define SDA_MAX 0x21 /* SDA-sin maximal value */
  52. #define SDELAY_VALUE 0x22 /* Delay between Tx and Rx clock */
  53. #define IN_D_COUNTER 0x36 /* D receive channel fifo counter */
  54. #define OUT_D_COUNTER 0x37 /* D transmit channel fifo counter */
  55. #define IN_B1_COUNTER 0x38 /* B1 receive channel fifo counter */
  56. #define OUT_B1_COUNTER 0x39 /* B1 transmit channel fifo counter */
  57. #define IN_B2_COUNTER 0x3a /* B2 receive channel fifo counter */
  58. #define OUT_B2_COUNTER 0x3b /* B2 transmit channel fifo counter */
  59. #define FFCTRL_IN_D 0x3C /* D receive channel fifo threshold low */
  60. #define FFCTRH_IN_D 0x3D /* D receive channel fifo threshold high */
  61. #define FFCTRL_OUT_D 0x3E /* D transmit channel fifo threshold low */
  62. #define FFCTRH_OUT_D 0x3F /* D transmit channel fifo threshold high */
  63. #define FFCTRL_IN_B1 0x40 /* B1 receive channel fifo threshold low */
  64. #define FFCTRH_IN_B1 0x41 /* B1 receive channel fifo threshold high */
  65. #define FFCTRL_OUT_B1 0x42 /* B1 transmit channel fifo threshold low */
  66. #define FFCTRH_OUT_B1 0x43 /* B1 transmit channel fifo threshold high */
  67. #define FFCTRL_IN_B2 0x44 /* B2 receive channel fifo threshold low */
  68. #define FFCTRH_IN_B2 0x45 /* B2 receive channel fifo threshold high */
  69. #define FFCTRL_OUT_B2 0x46 /* B2 transmit channel fifo threshold low */
  70. #define FFCTRH_OUT_B2 0x47 /* B2 transmit channel fifo threshold high */
  71. #define MPMSK 0x4A /* Multi purpose interrupt MASK register */
  72. #define FFMSK_D 0x4c /* D fifo interrupt MASK register */
  73. #define FFMSK_B1 0x4e /* B1 fifo interrupt MASK register */
  74. #define FFMSK_B2 0x50 /* B2 fifo interrupt MASK register */
  75. #define GPIO_DIR 0x52 /* GPIO pins direction registers */
  76. #define GPIO_OUT 0x53 /* GPIO pins output register */
  77. #define GPIO_IN 0x54 /* GPIO pins input register */ 
  78. #define TXCI 0x56 /* CI command to be transmitted */
  79. // Format of the interrupt packet received on endpoint 1:
  80. //
  81. // +--------+--------+--------+--------+--------+--------+
  82. // !MPINT   !FFINT_D !FFINT_B1!FFINT_B2!CCIST   !GPIO_INT!
  83. // +--------+--------+--------+--------+--------+--------+
  84. // Offsets in the interrupt packet
  85. #define MPINT 0
  86. #define FFINT_D 1
  87. #define FFINT_B1 2
  88. #define FFINT_B2 3
  89. #define CCIST 4
  90. #define GPIO_INT 5
  91. #define INT_PKT_SIZE            6
  92. // MPINT
  93. #define LSD_INT                 0x80 /* S line activity detected */
  94. #define RXCI_INT 0x40 /* Indicate primitive arrived */
  95. #define DEN_INT 0x20 /* Signal enabling data out of D Tx fifo */
  96. #define DCOLL_INT 0x10 /* D channel collision */
  97. #define AMIVN_INT 0x04 /* AMI violation number reached 2 */
  98. #define INFOI_INT 0x04 /* INFOi changed */
  99. #define DRXON_INT               0x02 /* Reception channel active */
  100. #define GPCHG_INT               0x01 /* GPIO pin value changed */
  101. // FFINT_x
  102. #define IN_OVERRUN 0x80 /* In fifo overrun */
  103. #define OUT_UNDERRUN 0x40 /* Out fifo underrun */
  104. #define IN_UP 0x20 /* In fifo thresholdh up-crossed */
  105. #define IN_DOWN 0x10 /* In fifo thresholdl down-crossed */
  106. #define OUT_UP 0x08 /* Out fifo thresholdh up-crossed */
  107. #define OUT_DOWN 0x04 /* Out fifo thresholdl down-crossed */
  108. #define IN_COUNTER_ZEROED 0x02 /* In down-counter reached 0 */
  109. #define OUT_COUNTER_ZEROED 0x01 /* Out down-counter reached 0 */
  110. #define ANY_REC_INT (IN_OVERRUN+IN_UP+IN_DOWN+IN_COUNTER_ZEROED)
  111. #define ANY_XMIT_INT (OUT_UNDERRUN+OUT_UP+OUT_DOWN+OUT_COUNTER_ZEROED)
  112. // Level 1 commands that are sent using the TXCI device request
  113. #define ST5481_CMD_DR  0x0 /* Deactivation Request */
  114. #define ST5481_CMD_RES  0x1 /* state machine RESet */
  115. #define ST5481_CMD_TM1  0x2 /* Test Mode 1 */
  116. #define ST5481_CMD_TM2  0x3 /* Test Mode 2 */
  117. #define ST5481_CMD_PUP  0x7 /* Power UP */
  118. #define ST5481_CMD_AR8  0x8 /* Activation Request class 1 */
  119. #define ST5481_CMD_AR10  0x9 /* Activation Request class 2 */
  120. #define ST5481_CMD_ARL  0xA /* Activation Request Loopback */
  121. #define ST5481_CMD_PDN  0xF /* Power DoWn */
  122. // Turn on/off the LEDs using the GPIO device request.
  123. // To use the B LEDs, number_of_leds must be set to 4
  124. #define B1_LED 0x10U
  125. #define B2_LED 0x20U
  126. #define GREEN_LED 0x40U
  127. #define RED_LED         0x80U
  128. // D channel out states
  129. enum {
  130. ST_DOUT_NONE,
  131. ST_DOUT_SHORT_INIT,
  132. ST_DOUT_SHORT_WAIT_DEN,
  133. ST_DOUT_LONG_INIT,
  134. ST_DOUT_LONG_WAIT_DEN,
  135. ST_DOUT_NORMAL,
  136. ST_DOUT_WAIT_FOR_UNDERRUN,
  137.         ST_DOUT_WAIT_FOR_NOT_BUSY,
  138. ST_DOUT_WAIT_FOR_STOP,
  139. ST_DOUT_WAIT_FOR_RESET,
  140. };
  141. #define DOUT_STATE_COUNT (ST_DOUT_WAIT_FOR_RESET + 1)
  142. // D channel out events
  143. enum {
  144. EV_DOUT_START_XMIT,
  145. EV_DOUT_COMPLETE,
  146. EV_DOUT_DEN,
  147. EV_DOUT_RESETED,
  148. EV_DOUT_STOPPED,
  149. EV_DOUT_COLL,
  150. EV_DOUT_UNDERRUN,
  151. };
  152. #define DOUT_EVENT_COUNT (EV_DOUT_UNDERRUN + 1)
  153. // ----------------------------------------------------------------------
  154. enum {
  155. ST_L1_F3,
  156. ST_L1_F4,
  157. ST_L1_F6,
  158. ST_L1_F7,
  159. ST_L1_F8,
  160. };
  161. #define L1_STATE_COUNT (ST_L1_F8+1)
  162. // The first 16 entries match the Level 1 indications that 
  163. // are found at offset 4 (CCIST) in the interrupt packet
  164. enum {
  165. EV_IND_DP,  // 0000 Deactivation Pending
  166. EV_IND_1,   // 0001
  167. EV_IND_2,   // 0010
  168. EV_IND_3,   // 0011
  169. EV_IND_RSY, // 0100 ReSYnchronizing
  170. EV_IND_5,   // 0101
  171. EV_IND_6,   // 0110
  172. EV_IND_7,   // 0111
  173. EV_IND_AP,  // 1000 Activation Pending
  174. EV_IND_9,   // 1001
  175. EV_IND_10,  // 1010
  176. EV_IND_11,  // 1011
  177. EV_IND_AI8, // 1100 Activation Indication class 8
  178. EV_IND_AI10,// 1101 Activation Indication class 10
  179. EV_IND_AIL, // 1110 Activation Indication Loopback
  180. EV_IND_DI,  // 1111 Deactivation Indication
  181. EV_PH_ACTIVATE_REQ,
  182. EV_PH_DEACTIVATE_REQ,
  183. EV_TIMER3,
  184. };
  185. #define L1_EVENT_COUNT (EV_TIMER3 + 1)
  186. #define ERR(format, arg...) 
  187. printk(KERN_ERR __FILE__ ": " __FUNCTION__ ": " format "n" , ## arg)
  188. #define WARN(format, arg...) 
  189. printk(KERN_WARNING __FILE__ ": " __FUNCTION__ ": " format "n" , ## arg)
  190. #define INFO(format, arg...) 
  191. printk(KERN_INFO __FILE__ ": " __FUNCTION__ ": " format "n" , ## arg)
  192. #include "st5481_hdlc.h"
  193. #include "fsm.h"
  194. #include "hisax_if.h"
  195. #include <linux/skbuff.h>
  196. /* ======================================================================
  197.  * FIFO handling
  198.  */
  199. /* Generic FIFO structure */ 
  200. struct fifo {
  201. u_char r,w,count,size;
  202. spinlock_t lock;
  203. };
  204. /*
  205.  * Init an FIFO
  206.  */
  207. static inline void fifo_init(struct fifo *fifo, int size)
  208. {
  209. fifo->r = fifo->w = fifo->count = 0;
  210. fifo->size = size;
  211. spin_lock_init(&fifo->lock);
  212. }
  213. /*
  214.  * Add an entry to the FIFO
  215.  */
  216. static inline int fifo_add(struct fifo *fifo)
  217. {
  218. unsigned long flags;
  219. int index;
  220. if (!fifo) {
  221. return -1;
  222. }
  223. spin_lock_irqsave(&fifo->lock, flags);
  224. if (fifo->count == fifo->size) {
  225. // FIFO full
  226. index = -1;
  227. } else {
  228. // Return index where to get the next data to add to the FIFO
  229. index = fifo->w++ & (fifo->size-1); 
  230. fifo->count++;
  231. }
  232. spin_unlock_irqrestore(&fifo->lock, flags);
  233. return index;
  234. }
  235. /*
  236.  * Remove an entry from the FIFO with the index returned.
  237.  */
  238. static inline int fifo_remove(struct fifo *fifo)
  239. {
  240. unsigned long flags;
  241. int index;
  242. if (!fifo) {
  243. return -1;
  244. }
  245. spin_lock_irqsave(&fifo->lock, flags);
  246. if (!fifo->count) {
  247. // FIFO empty
  248. index = -1;
  249. } else {
  250. // Return index where to get the next data from the FIFO
  251. index = fifo->r++ & (fifo->size-1); 
  252. fifo->count--;
  253. }
  254. spin_unlock_irqrestore(&fifo->lock, flags);
  255. return index;
  256. }
  257. /* ======================================================================
  258.  * control pipe
  259.  */
  260. typedef void (*ctrl_complete_t)(void *);
  261. typedef struct ctrl_msg {
  262. struct usb_ctrlrequest dr;
  263. ctrl_complete_t complete;
  264. void *context;
  265. } ctrl_msg; 
  266. /* FIFO of ctrl messages waiting to be sent */
  267. #define MAX_EP0_MSG 16
  268. struct ctrl_msg_fifo {
  269. struct fifo f;
  270. struct ctrl_msg data[MAX_EP0_MSG];
  271. };
  272. #define MAX_DFRAME_LEN_L1 300
  273. #define HSCX_BUFMAX 4096
  274. struct st5481_ctrl {
  275. struct ctrl_msg_fifo msg_fifo;
  276. unsigned long busy;
  277. struct urb *urb;
  278. };
  279. struct st5481_intr {
  280.   // struct evt_fifo evt_fifo;
  281. struct urb *urb;
  282. };
  283. struct st5481_d_out {
  284. struct hdlc_vars hdlc_state;
  285. struct urb *urb[2]; /* double buffering */
  286. unsigned long busy;
  287. struct sk_buff *tx_skb;
  288. struct FsmInst fsm;
  289. };
  290. struct st5481_b_out {
  291. struct hdlc_vars hdlc_state;
  292. struct urb *urb[2]; /* double buffering */
  293. u_char flow_event;
  294. u_long busy;
  295. struct sk_buff *tx_skb;
  296. };
  297. struct st5481_in {
  298. struct hdlc_vars hdlc_state;
  299. struct urb *urb[2]; /* double buffering */
  300. int mode;
  301. int bufsize;
  302. unsigned int num_packets;
  303. unsigned int packet_size;
  304. unsigned char ep, counter;
  305. unsigned char *rcvbuf;
  306. struct st5481_adapter *adapter;
  307. struct hisax_if *hisax_if;
  308. };
  309. int st5481_setup_in(struct st5481_in *in);
  310. void st5481_release_in(struct st5481_in *in);
  311. void st5481_in_mode(struct st5481_in *in, int mode);
  312. struct st5481_bcs {
  313. struct hisax_b_if b_if;
  314. struct st5481_adapter *adapter;
  315. struct st5481_in b_in;
  316. struct st5481_b_out b_out;
  317. int channel;
  318. int mode;
  319. };
  320. struct st5481_adapter {
  321. struct list_head list;
  322. int number_of_leds;
  323. struct usb_device *usb_dev;
  324. struct hisax_d_if hisax_d_if;
  325. struct st5481_ctrl ctrl;
  326. struct st5481_intr intr;
  327. struct st5481_in d_in;
  328. struct st5481_d_out d_out;
  329. unsigned char leds;
  330. unsigned int led_counter;
  331. unsigned long event;
  332. struct FsmInst l1m;
  333. struct FsmTimer timer;
  334. struct st5481_bcs bcs[2];
  335. };
  336. #define TIMER3_VALUE 7000
  337. /* ======================================================================
  338.  *
  339.  */
  340. /*
  341.  * Submit an URB with error reporting. This is a macro so
  342.  * the __FUNCTION__ returns the caller function name.
  343.  */
  344. #define SUBMIT_URB(urb) 
  345. ({ 
  346. int status; 
  347. if ((status = usb_submit_urb(urb)) < 0) { 
  348. WARN("usb_submit_urb failed,status=%d", status); 
  349.         status; 
  350. })
  351. /*
  352.  * USB double buffering, return the URB index (0 or 1).
  353.  */
  354. static inline int get_buf_nr(struct urb *urbs[], struct urb *urb)
  355. {
  356.         return (urbs[0]==urb ? 0 : 1); 
  357. }
  358. /* ---------------------------------------------------------------------- */
  359. /* B Channel */
  360. int  st5481_setup_b(struct st5481_bcs *bcs);
  361. void st5481_release_b(struct st5481_bcs *bcs);
  362. void st5481_d_l2l1(struct hisax_if *hisax_d_if, int pr, void *arg);
  363. /* D Channel */
  364. int  st5481_setup_d(struct st5481_adapter *adapter);
  365. void st5481_release_d(struct st5481_adapter *adapter);
  366. void st5481_b_l2l1(struct hisax_if *b_if, int pr, void *arg);
  367. int  st5481_d_init(void);
  368. void st5481_d_exit(void);
  369. /* USB */
  370. void st5481_ph_command(struct st5481_adapter *adapter, unsigned int command);
  371. int st5481_setup_isocpipes(struct urb* urb[2], struct usb_device *dev, 
  372.    unsigned int pipe, int num_packets,
  373.    int packet_size, int buf_size,
  374.    usb_complete_t complete, void *context);
  375. void st5481_release_isocpipes(struct urb* urb[2]);
  376. int  st5481_isoc_flatten(struct urb *urb);
  377. void st5481_usb_pipe_reset(struct st5481_adapter *adapter,
  378.     u_char pipe, ctrl_complete_t complete, void *context);
  379. void st5481_usb_ctrl_msg(struct st5481_adapter *adapter,
  380.   u8 request, u8 requesttype, u16 value, u16 index,
  381.   ctrl_complete_t complete, void *context);
  382. void st5481_usb_device_ctrl_msg(struct st5481_adapter *adapter,
  383.  u8 request, u16 value,
  384.  ctrl_complete_t complete, void *context);
  385. int  st5481_setup_usb(struct st5481_adapter *adapter);
  386. void st5481_release_usb(struct st5481_adapter *adapter);
  387. void st5481_start(struct st5481_adapter *adapter);
  388. void st5481_stop(struct st5481_adapter *adapter);
  389. // ----------------------------------------------------------------------
  390. // debugging macros
  391. #define __debug_variable st5481_debug
  392. #include "hisax_debug.h"
  393. #ifdef CONFIG_HISAX_DEBUG
  394. extern int st5481_debug;
  395. #define DBG_ISO_PACKET(level,urb) 
  396.   if (level & __debug_variable) dump_iso_packet(__FUNCTION__,urb)
  397. static void __attribute__((unused))
  398. dump_iso_packet(const char *name,struct urb *urb)
  399. {
  400. int i,j;
  401. int len,ofs;
  402. u_char *data;
  403. printk(KERN_DEBUG "%s: packets=%d,errors=%dn",
  404.        name,urb->number_of_packets,urb->error_count);
  405. for (i = 0; i  < urb->number_of_packets; ++i) {
  406. if (urb->pipe & USB_DIR_IN) {
  407. len = urb->iso_frame_desc[i].actual_length;
  408. } else {
  409. len = urb->iso_frame_desc[i].length;
  410. }
  411. ofs = urb->iso_frame_desc[i].offset;
  412. printk(KERN_DEBUG "len=%.2d,ofs=%.3d ",len,ofs);
  413. if (len) {
  414. data = urb->transfer_buffer+ofs;
  415. for (j=0; j < len; j++) {
  416. printk ("%.2x", data[j]);
  417. }
  418. }
  419. printk("n");
  420. }
  421. }
  422. static inline const char *ST5481_CMD_string(int evt)
  423. {
  424. static char s[16];
  425. switch (evt) {
  426. case ST5481_CMD_DR: return "DR";
  427. case ST5481_CMD_RES: return "RES";
  428. case ST5481_CMD_TM1: return "TM1";
  429. case ST5481_CMD_TM2: return "TM2";
  430. case ST5481_CMD_PUP: return "PUP";
  431. case ST5481_CMD_AR8: return "AR8";
  432. case ST5481_CMD_AR10: return "AR10";
  433. case ST5481_CMD_ARL: return "ARL";
  434. case ST5481_CMD_PDN: return "PDN";
  435. };
  436. sprintf(s,"0x%x",evt);
  437. return s;
  438. }
  439. #else
  440. #define DBG_ISO_PACKET(level,urb) do {} while (0)
  441. #endif
  442. #endif