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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/asm-arm/ecard.h
  3.  *
  4.  * definitions for expansion cards
  5.  *
  6.  * This is a new system as from Linux 1.2.3
  7.  *
  8.  * Changelog:
  9.  *  11-12-1996 RMK Further minor improvements
  10.  *  12-09-1997 RMK Added interrupt enable/disable for card level
  11.  *
  12.  * Reference: Acorns Risc OS 3 Programmers Reference Manuals.
  13.  */
  14. #ifndef __ASM_ECARD_H
  15. #define __ASM_ECARD_H
  16. /*
  17.  * Currently understood cards (but not necessarily
  18.  * supported):
  19.  *                        Manufacturer  Product ID
  20.  */
  21. #define MANU_ACORN 0x0000
  22. #define PROD_ACORN_SCSI 0x0002
  23. #define PROD_ACORN_ETHER1 0x0003
  24. #define PROD_ACORN_MFM 0x000b
  25. #define MANU_ANT2 0x0011
  26. #define PROD_ANT_ETHER3 0x00a4
  27. #define MANU_ATOMWIDE 0x0017
  28. #define PROD_ATOMWIDE_3PSERIAL 0x0090
  29. #define MANU_IRLAM_INSTRUMENTS 0x001f
  30. #define MANU_IRLAM_INSTRUMENTS_ETHERN 0x5678
  31. #define MANU_OAK 0x0021
  32. #define PROD_OAK_SCSI 0x0058
  33. #define MANU_MORLEY 0x002b
  34. #define PROD_MORLEY_SCSI_UNCACHED 0x0067
  35. #define MANU_CUMANA 0x003a
  36. #define PROD_CUMANA_SCSI_2 0x003a
  37. #define PROD_CUMANA_SCSI_1 0x00a0
  38. #define MANU_ICS 0x003c
  39. #define PROD_ICS_IDE 0x00ae
  40. #define MANU_ICS2 0x003d
  41. #define PROD_ICS2_IDE 0x00ae
  42. #define MANU_SERPORT 0x003f
  43. #define PROD_SERPORT_DSPORT 0x00b9
  44. #define MANU_I3 0x0046
  45. #define PROD_I3_ETHERLAN500 0x00d4
  46. #define PROD_I3_ETHERLAN600 0x00ec
  47. #define PROD_I3_ETHERLAN600A 0x011e
  48. #define MANU_ANT 0x0053
  49. #define PROD_ANT_ETHERM 0x00d8
  50. #define PROD_ANT_ETHERB 0x00e4
  51. #define MANU_ALSYSTEMS 0x005b
  52. #define PROD_ALSYS_SCSIATAPI 0x0107
  53. #define MANU_MCS 0x0063
  54. #define PROD_MCS_CONNECT32 0x0125
  55. #define MANU_EESOX 0x0064
  56. #define PROD_EESOX_SCSI2 0x008c
  57. #define MANU_YELLOWSTONE 0x0096
  58. #define PROD_YELLOWSTONE_RAPIDE32 0x0120
  59. #ifdef ECARD_C
  60. #define CONST
  61. #else
  62. #define CONST const
  63. #endif
  64. #define MAX_ECARDS 9
  65. typedef enum { /* Cards address space */
  66. ECARD_IOC,
  67. ECARD_MEMC,
  68. ECARD_EASI
  69. } card_type_t;
  70. typedef enum { /* Speed for ECARD_IOC space */
  71. ECARD_SLOW  = 0,
  72. ECARD_MEDIUM  = 1,
  73. ECARD_FAST  = 2,
  74. ECARD_SYNC  = 3
  75. } card_speed_t;
  76. typedef struct  { /* Card ID structure */
  77. unsigned short manufacturer;
  78. unsigned short product;
  79. } card_ids;
  80. struct in_ecid { /* Packed card ID information */
  81. unsigned short product; /* Product code */
  82. unsigned short manufacturer; /* Manufacturer code */
  83. unsigned char id:4; /* Simple ID */
  84. unsigned char cd:1; /* Chunk dir present */
  85. unsigned char is:1; /* Interrupt status pointers */
  86. unsigned char w:2; /* Width */
  87. unsigned char country; /* Country */
  88. unsigned char irqmask; /* IRQ mask */
  89. unsigned char fiqmask; /* FIQ mask */
  90. unsigned long irqoff; /* IRQ offset */
  91. unsigned long fiqoff; /* FIQ offset */
  92. };
  93. typedef struct expansion_card ecard_t;
  94. typedef unsigned long *loader_t;
  95. typedef struct { /* Card handler routines */
  96. void (*irqenable)(ecard_t *ec, int irqnr);
  97. void (*irqdisable)(ecard_t *ec, int irqnr);
  98. int  (*irqpending)(ecard_t *ec);
  99. void (*fiqenable)(ecard_t *ec, int fiqnr);
  100. void (*fiqdisable)(ecard_t *ec, int fiqnr);
  101. int  (*fiqpending)(ecard_t *ec);
  102. } expansioncard_ops_t;
  103. /*
  104.  * This contains all the info needed on an expansion card
  105.  */
  106. struct expansion_card {
  107. struct expansion_card  *next;
  108. /* Public data */
  109. volatile unsigned char *irqaddr; /* address of IRQ register */
  110. volatile unsigned char *fiqaddr; /* address of FIQ register */
  111. unsigned char irqmask; /* IRQ mask */
  112. unsigned char fiqmask; /* FIQ mask */
  113. unsigned char   claimed; /* Card claimed? */
  114. void *irq_data; /* Data for use for IRQ by card */
  115. void *fiq_data; /* Data for use for FIQ by card */
  116. expansioncard_ops_t *ops; /* Enable/Disable Ops for card */
  117. CONST unsigned int slot_no; /* Slot number */
  118. CONST unsigned int dma; /* DMA number (for request_dma) */
  119. CONST unsigned int irq; /* IRQ number (for request_irq) */
  120. CONST unsigned int fiq; /* FIQ number (for request_irq) */
  121. CONST card_type_t type; /* Type of card */
  122. CONST struct in_ecid cid; /* Card Identification */
  123. /* Private internal data */
  124. const char *card_desc; /* Card description */
  125. CONST unsigned int podaddr; /* Base Linux address for card */
  126. CONST loader_t loader; /* loader program */
  127. };
  128. struct in_chunk_dir {
  129. unsigned int start_offset;
  130. union {
  131. unsigned char string[256];
  132. unsigned char data[1];
  133. } d;
  134. };
  135. /*
  136.  * ecard_claim: claim an expansion card entry
  137.  */
  138. #define ecard_claim(ec) ((ec)->claimed = 1)
  139. /*
  140.  * ecard_release: release an expansion card entry
  141.  */
  142. #define ecard_release(ec) ((ec)->claimed = 0)
  143. /*
  144.  * Start finding cards from the top of the list
  145.  */
  146. extern void ecard_startfind (void);
  147. /*
  148.  * Find an expansion card with the correct cid, product and manufacturer code
  149.  */
  150. extern struct expansion_card *ecard_find (int cid, const card_ids *ids);
  151.  
  152. /*
  153.  * Read a chunk from an expansion card
  154.  * cd : where to put read data
  155.  * ec : expansion card info struct
  156.  * id : id number to find
  157.  * num: (n+1)'th id to find.
  158.  */
  159. extern int ecard_readchunk (struct in_chunk_dir *cd, struct expansion_card *ec, int id, int num);
  160. /*
  161.  * Obtain the address of a card
  162.  */
  163. extern unsigned int ecard_address (struct expansion_card *ec, card_type_t card_type, card_speed_t speed);
  164. #ifdef ECARD_C
  165. /* Definitions internal to ecard.c - for it's use only!!
  166.  *
  167.  * External expansion card header as read from the card
  168.  */
  169. struct ex_ecid {
  170. unsigned char r_irq:1;
  171. unsigned char r_zero:1;
  172. unsigned char r_fiq:1;
  173. unsigned char r_id:4;
  174. unsigned char r_a:1;
  175. unsigned char r_cd:1;
  176. unsigned char r_is:1;
  177. unsigned char r_w:2;
  178. unsigned char r_r1:4;
  179. unsigned char r_r2:8;
  180. unsigned char r_prod[2];
  181. unsigned char r_manu[2];
  182. unsigned char r_country;
  183. unsigned char r_irqmask;
  184. unsigned char r_irqoff[3];
  185. unsigned char r_fiqmask;
  186. unsigned char r_fiqoff[3];
  187. };
  188. /*
  189.  * Chunk directory entry as read from the card
  190.  */
  191. struct ex_chunk_dir {
  192. unsigned char r_id;
  193. unsigned char r_len[3];
  194. unsigned long r_start;
  195. union {
  196. char string[256];
  197. char data[1];
  198. } d;
  199. #define c_id(x) ((x)->r_id)
  200. #define c_len(x) ((x)->r_len[0]|((x)->r_len[1]<<8)|((x)->r_len[2]<<16))
  201. #define c_start(x) ((x)->r_start)
  202. };
  203. #endif
  204. #endif