isicom.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:7k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _LINUX_ISICOM_H
  2. #define _LINUX_ISICOM_H
  3. /*#define ISICOM_DEBUG*/
  4. /*#define ISICOM_DEBUG_DTR_RTS*/
  5. /*
  6.  * Firmware Loader definitions ...
  7.  */
  8.  
  9. #define __MultiTech ('M'<<8)
  10. #define MIOCTL_LOAD_FIRMWARE (__MultiTech | 0x01)
  11. #define         MIOCTL_READ_FIRMWARE    (__MultiTech | 0x02)
  12. #define         MIOCTL_XFER_CTRL (__MultiTech | 0x03)
  13. #define         MIOCTL_RESET_CARD (__MultiTech | 0x04)
  14. #define DATA_SIZE 16
  15. typedef struct {
  16. unsigned short exec_segment;
  17. unsigned short exec_addr;
  18. } exec_record;
  19. typedef struct {
  20. int board; /* Board to load */
  21. unsigned short addr;
  22. unsigned short count;
  23. } bin_header;
  24. typedef struct {
  25. int board; /* Board to load */
  26. unsigned short addr;
  27. unsigned short count;
  28. unsigned short segment;
  29. unsigned char bin_data[DATA_SIZE];
  30. } bin_frame;
  31. #ifdef __KERNEL__
  32. #define YES 1
  33. #define NO 0
  34. #define ISILOAD_MISC_MINOR 155 /* /dev/isctl */
  35. #define ISILOAD_NAME "ISILoad"
  36. /*
  37.  *  ISICOM Driver definitions ...
  38.  *
  39.  */
  40. #define ISICOM_NAME "ISICom"
  41. /*
  42.  *      PCI definitions
  43.  */
  44.  #define        DEVID_COUNT     9
  45.  #define        VENDOR_ID       0x10b5
  46. /*
  47.  * These are now officially allocated numbers
  48.  */
  49. #define ISICOM_NMAJOR 112 /* normal  */
  50. #define ISICOM_CMAJOR 113 /* callout */
  51. #define ISICOM_MAGIC (('M' << 8) | 'T')
  52. #define WAKEUP_CHARS 256 /* hard coded for now */ 
  53. #define TX_SIZE 254 
  54.  
  55. #define BOARD_COUNT 4
  56. #define PORT_COUNT (BOARD_COUNT*16)
  57. #define SERIAL_TYPE_NORMAL 1
  58. #define SERIAL_TYPE_CALLOUT 2
  59. /*   character sizes  */
  60. #define ISICOM_CS5 0x0000
  61. #define ISICOM_CS6 0x0001
  62. #define ISICOM_CS7 0x0002
  63. #define ISICOM_CS8 0x0003
  64. /* stop bits */
  65. #define ISICOM_1SB 0x0000
  66. #define ISICOM_2SB 0x0004
  67. /* parity */
  68. #define ISICOM_NOPAR 0x0000
  69. #define ISICOM_ODPAR 0x0008
  70. #define ISICOM_EVPAR 0x0018
  71. /* flow control */
  72. #define ISICOM_CTSRTS 0x03
  73. #define ISICOM_INITIATE_XONXOFF 0x04
  74. #define ISICOM_RESPOND_XONXOFF 0x08
  75. #define InterruptTheCard(base) (outw(0,(base)+0xc)) 
  76. #define ClearInterrupt(base) (inw((base)+0x0a))
  77. #define BOARD(line)  (((line) >> 4) & 0x3)
  78. #define MIN(a, b) ( (a) < (b) ? (a) : (b) )
  79. /* isi kill queue bitmap */
  80. #define ISICOM_KILLTX 0x01
  81. #define ISICOM_KILLRX 0x02
  82. /* isi_board status bitmap */
  83. #define FIRMWARE_LOADED 0x0001
  84. #define BOARD_ACTIVE 0x0002
  85.   /* isi_port status bitmap  */
  86. #define ISI_CTS 0x1000
  87. #define ISI_DSR 0x2000
  88. #define ISI_RI 0x4000
  89. #define ISI_DCD 0x8000
  90. #define ISI_DTR 0x0100
  91. #define ISI_RTS 0x0200
  92. #define ISI_TXOK 0x0001 
  93.  
  94. struct isi_board {
  95. unsigned short base;
  96. unsigned char irq;
  97. unsigned char port_count;
  98. unsigned short status;
  99. unsigned short port_status; /* each bit represents a single port */
  100. unsigned short shift_count;
  101. struct isi_port * ports;
  102. signed char count;
  103. unsigned char isa;
  104. };
  105. struct isi_port {
  106. unsigned short magic;
  107. unsigned int flags;
  108. int count;
  109. int blocked_open;
  110. int close_delay;
  111. unsigned short channel;
  112. unsigned short status;
  113. unsigned short closing_wait;
  114. long  session;
  115. long pgrp;
  116. struct isi_board * card;
  117. struct tty_struct  * tty;
  118. wait_queue_head_t close_wait;
  119. wait_queue_head_t open_wait;
  120. struct tq_struct hangup_tq;
  121. struct tq_struct bh_tqueue;
  122. unsigned char * xmit_buf;
  123. int xmit_head;
  124. int xmit_tail;
  125. int xmit_cnt;
  126. struct termios  normal_termios;
  127. struct termios callout_termios;
  128. };
  129. /*
  130.  *  ISI Card specific ops ...
  131.  */
  132.  
  133. static inline void raise_dtr(struct isi_port * port)
  134. {
  135. struct isi_board * card = port->card;
  136. unsigned short base = card->base;
  137. unsigned char channel = port->channel;
  138. short wait=400;
  139. while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
  140. if (wait <= 0) {
  141. printk(KERN_WARNING "ISICOM: Card found busy in raise_dtr.n");
  142. return;
  143. }
  144. #ifdef ISICOM_DEBUG_DTR_RTS
  145. printk(KERN_DEBUG "ISICOM: raise_dtr.n");
  146. #endif
  147. outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
  148. outw(0x0504, base);
  149. InterruptTheCard(base);
  150. port->status |= ISI_DTR;
  151. }
  152. static inline void drop_dtr(struct isi_port * port)
  153. {
  154. struct isi_board * card = port->card;
  155. unsigned short base = card->base;
  156. unsigned char channel = port->channel;
  157. short wait=400;
  158. while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
  159. if (wait <= 0) {
  160. printk(KERN_WARNING "ISICOM: Card found busy in drop_dtr.n");
  161. return;
  162. }
  163. #ifdef ISICOM_DEBUG_DTR_RTS
  164. printk(KERN_DEBUG "ISICOM: drop_dtr.n");
  165. #endif
  166. outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
  167. outw(0x0404, base);
  168. InterruptTheCard(base);
  169. port->status &= ~ISI_DTR;
  170. }
  171. static inline void raise_rts(struct isi_port * port)
  172. {
  173. struct isi_board * card = port->card;
  174. unsigned short base = card->base;
  175. unsigned char channel = port->channel;
  176. short wait=400;
  177. while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
  178. if (wait <= 0) {
  179. printk(KERN_WARNING "ISICOM: Card found busy in raise_rts.n");
  180. return;
  181. }
  182. #ifdef ISICOM_DEBUG_DTR_RTS
  183. printk(KERN_DEBUG "ISICOM: raise_rts.n");
  184. #endif
  185. outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
  186. outw(0x0a04, base);
  187. InterruptTheCard(base);
  188. port->status |= ISI_RTS;
  189. }
  190. static inline void drop_rts(struct isi_port * port)
  191. {
  192. struct isi_board * card = port->card;
  193. unsigned short base = card->base;
  194. unsigned char channel = port->channel;
  195. short wait=400;
  196. while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
  197. if (wait <= 0) {
  198. printk(KERN_WARNING "ISICOM: Card found busy in drop_rts.n");
  199. return;
  200. }
  201. #ifdef ISICOM_DEBUG_DTR_RTS
  202. printk(KERN_DEBUG "ISICOM: drop_rts.n");
  203. #endif
  204. outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
  205. outw(0x0804, base);
  206. InterruptTheCard(base);
  207. port->status &= ~ISI_RTS;
  208. }
  209. static inline void raise_dtr_rts(struct isi_port * port)
  210. {
  211. struct isi_board * card = port->card;
  212. unsigned short base = card->base;
  213. unsigned char channel = port->channel;
  214. short wait=400;
  215. while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
  216. if (wait <= 0) {
  217. printk(KERN_WARNING "ISICOM: Card found busy in raise_dtr_rts.n");
  218. return;
  219. }
  220. #ifdef ISICOM_DEBUG_DTR_RTS
  221. printk(KERN_DEBUG "ISICOM: raise_dtr_rts.n");
  222. #endif
  223. outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
  224. outw(0x0f04, base);
  225. InterruptTheCard(base);
  226. port->status |= (ISI_DTR | ISI_RTS);
  227. }
  228. static inline void drop_dtr_rts(struct isi_port * port)
  229. {
  230. struct isi_board * card = port->card;
  231. unsigned short base = card->base;
  232. unsigned char channel = port->channel;
  233. short wait=400;
  234. while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
  235. if (wait <= 0) {
  236. printk(KERN_WARNING "ISICOM: Card found busy in drop_dtr_rts.n");
  237. return;
  238. }
  239. #ifdef ISICOM_DEBUG_DTR_RTS
  240. printk(KERN_DEBUG "ISICOM: drop_dtr_rts.n");
  241. #endif
  242. outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
  243. outw(0x0c04, base);
  244. InterruptTheCard(base);
  245. port->status &= ~(ISI_RTS | ISI_DTR);
  246. }
  247. static inline void kill_queue(struct isi_port * port, short queue)
  248. {
  249. struct isi_board * card = port->card;
  250. unsigned short base = card->base;
  251. unsigned char channel = port->channel;
  252. short wait=400;
  253. while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
  254. if (wait <= 0) {
  255. printk(KERN_WARNING "ISICOM: Card found busy in kill_queue.n");
  256. return;
  257. }
  258. #ifdef ISICOM_DEBUG
  259. printk(KERN_DEBUG "ISICOM: kill_queue 0x%x.n", queue);
  260. #endif
  261. outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
  262. outw((queue << 8) | 0x06, base);
  263. InterruptTheCard(base);
  264. }
  265. #endif /* __KERNEL__ */
  266. #endif /* ISICOM_H */