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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Diva Server 4BRI specific part of initialisation
  3.  *
  4.  * Copyright (C) Eicon Technology Corporation, 2000.
  5.  *
  6.  * Eicon File Revision :    1.7  
  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. #include "sys.h"
  13. #include "idi.h"
  14. #include "divas.h"
  15. #include "pc.h"
  16. #include "pr_pc.h"
  17. #include "dsp_defs.h"
  18. #include "constant.h"
  19. #include "adapter.h"
  20. #include "uxio.h"
  21. #define TEST_INT_DIVAS_Q 0x13
  22. #define DIVAS_MAINT_OFFSET 0xff00 /* value for 4BRI card */
  23. #define MQ_BOARD_DSP_OFFSET 0x00a00000
  24. #define MQ_DSP1_ADDR_OFFSET 0x00000008
  25. #define MQ_DSP_JUNK_OFFSET  0x00000400
  26. #define MQ_DSP1_DATA_OFFSET 0x00000000
  27. #define MQ_BOARD_ISAC_DSP_RESET  0x00800028
  28. #define MQ_BREG_RISC  0x1200      /* RISC Reset */
  29. #define MQ_ISAC_DSP_RESET 0x0028 /* ISAC and DSP reset address offset */
  30. #define MQ_RISC_COLD_RESET_MASK         0x0001      /* RISC Cold reset                        */
  31. #define MQ_RISC_WARM_RESET_MASK         0x0002      /* RISC Warm reset                        */
  32. #define MQ_IRQ_REQ_ON                   0x1
  33. #define MQ_IRQ_REQ_OFF                  0x0
  34. #define MQ_BREG_IRQ_TEST                0x0608
  35. #define PLX9054_INTCSR      0x69 
  36. #define PLX9054_INT_ENA     0x09
  37. #define DIVAS_IOBASE 0x01
  38. #define M_PCI_RESET 0x10
  39. byte mem_in(ADAPTER *a, void *adr);
  40. word mem_inw(ADAPTER *a, void *adr);
  41. void mem_in_buffer(ADAPTER *a, void *adr, void *P, word length);
  42. void mem_look_ahead(ADAPTER *a, PBUFFER *RBuffer, ENTITY *e);
  43. void mem_out(ADAPTER *a, void *adr, byte data);
  44. void mem_outw(ADAPTER *a, void *adr, word data);
  45. void mem_out_buffer(ADAPTER *a, void *adr, void *P, word length);
  46. void mem_inc(ADAPTER *a, void *adr);
  47. int Divas4BRIInitPCI(card_t *card, dia_card_t *cfg);
  48. static int fourbri_ISR (card_t* card);
  49. int FPGA_Download(word, dword, byte *, byte *, int);
  50. extern byte FPGA_Bytes[];
  51. extern void *get_card(int);
  52. byte UxCardPortIoIn(ux_diva_card_t *card, byte *base, int offset);
  53. void UxCardPortIoOut(ux_diva_card_t *card, byte *base, int offset, byte);
  54. word GetProtFeatureValue(char *sw_id);
  55. void memcp(byte *dst, byte *src, dword dwLen);
  56. int memcm(byte *dst, byte *src, dword dwLen);
  57. static int diva_server_4bri_reset(card_t *card)
  58. {
  59. byte *ctl;
  60. DPRINTF(("divas: reset Diva Server 4BRI"));
  61. ctl = UxCardMemAttach(card->hw, DIVAS_CTL_MEMORY);
  62. /* stop RISC, DSP's and ISAC  */
  63.    UxCardMemOut(card->hw, &ctl[MQ_BREG_RISC], 0);
  64.    UxCardMemOut(card->hw, &ctl[MQ_ISAC_DSP_RESET], 0);
  65. UxCardMemDetach(card->hw, ctl);
  66. return 0;
  67. }
  68. static int diva_server_4bri_config(card_t *card, dia_config_t *config)
  69. {
  70. byte *shared;
  71. int i, j;
  72. DPRINTF(("divas: configure Diva Server 4BRI"));
  73. shared = (byte *) UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY);
  74. for (i=0; i<256; i++)
  75. {
  76. UxCardMemOut(card->hw, &shared[i], 0);
  77. }
  78. UxCardMemOut(card->hw, &shared[ 8], config->tei);
  79. UxCardMemOut(card->hw, &shared[ 9], config->nt2);
  80. UxCardMemOut(card->hw, &shared[10], config->sig_flags);
  81. UxCardMemOut(card->hw, &shared[11], config->watchdog);
  82. UxCardMemOut(card->hw, &shared[12], config->permanent);
  83. UxCardMemOut(card->hw, &shared[13], config->x_interface);
  84. UxCardMemOut(card->hw, &shared[14], config->stable_l2);
  85. UxCardMemOut(card->hw, &shared[15], config->no_order_check);
  86. UxCardMemOut(card->hw, &shared[16], config->handset_type);
  87. UxCardMemOut(card->hw, &shared[17], 0);
  88. UxCardMemOut(card->hw, &shared[18], config->low_channel);
  89. UxCardMemOut(card->hw, &shared[19], config->prot_version);
  90. UxCardMemOut(card->hw, &shared[20], config->crc4);
  91. if ((card->hw->features) && (card->hw->features & PROTCAP_V90D))
  92. {
  93. DPRINTF(("divas: Signifying V.90"));
  94. UxCardMemOut(card->hw, &shared[22], 4);
  95. }
  96. else
  97. {
  98. UxCardMemOut(card->hw, &shared[22], 0);
  99. }
  100. for (i=0; i<2; i++)
  101. {
  102. for (j=0; j<32; j++)
  103. {
  104. UxCardMemOut(card->hw, &shared[32+(i*96)+j],config->terminal[i].oad[j]);
  105. }
  106. for (j=0; j<32; j++)
  107. {
  108. UxCardMemOut(card->hw, &shared[64+(i*96)+j],config->terminal[i].osa[j]);
  109. }
  110. for (j=0; j<32; j++)
  111. {
  112. UxCardMemOut(card->hw, &shared[96+(i*96)+j],config->terminal[i].spid[j]);
  113. }
  114. }
  115. UxCardMemDetach(card->hw, shared);
  116. return 0;
  117. }
  118. static
  119. void diva_server_4bri_reset_int(card_t *card)
  120. {
  121. byte *ctl;
  122. ctl = UxCardMemAttach(card->hw, DIVAS_CTL_MEMORY);
  123. UxCardMemOut(card->hw, &ctl[MQ_BREG_IRQ_TEST], MQ_IRQ_REQ_OFF);
  124. UxCardMemDetach(card->hw, ctl);
  125. return;
  126. }
  127.  
  128. static int diva_server_4bri_test_int(card_t *card)
  129. {
  130. byte *ctl, i;
  131. byte *reg;
  132. DPRINTF(("divas: test interrupt for Diva Server 4BRI"));
  133. /* We get the last (dummy) adapter in so we need to go back to the first */
  134. card = get_card(card->cfg.card_id - 3);
  135. /* Enable interrupts on PLX chip */
  136. reg = UxCardMemAttach(card->hw, DIVAS_REG_MEMORY);
  137. UxCardPortIoOut(card->hw, reg, PLX9054_INTCSR, PLX9054_INT_ENA);
  138. UxCardMemDetach(card->hw, reg);
  139. /* Set the test interrupt flag */
  140. card->test_int_pend = TEST_INT_DIVAS_Q;
  141. /* Now to trigger the interrupt */
  142. ctl = UxCardMemAttach(card->hw, DIVAS_CTL_MEMORY);
  143. UxCardMemOut(card->hw, &ctl[MQ_BREG_IRQ_TEST], MQ_IRQ_REQ_ON);
  144. UxCardMemDetach(card->hw, ctl);
  145. for (i = 0; i < 50; i++)
  146. {
  147. if (!card->test_int_pend)
  148. {
  149. break;
  150. }
  151. UxPause(10);
  152. }
  153. if (card->test_int_pend)
  154. {
  155. DPRINTF(("active: timeout waiting for card to interrupt"));
  156. return (-1);
  157. }
  158. return 0;
  159. }
  160. static void print_hdr(unsigned char *code, int offset)
  161. {
  162. unsigned char hdr[80];
  163. int i;
  164. i = 0;
  165. while ((i < (DIM(hdr) -1)) && 
  166. (code[offset + i] != '') &&
  167. (code[offset + i] != 'r') &&
  168. (code[offset + i] != 'n'))
  169. {
  170. hdr[i] = code[offset + i];
  171. i++;
  172. }
  173. hdr[i] = '';
  174. DPRINTF(("divas: loading %s", hdr));
  175. }
  176. static int diva_server_4bri_load(card_t *card, dia_load_t *load)
  177. {
  178. byte *pRAM=NULL;
  179. int download_offset=0;
  180. card_t *FirstCard;
  181. byte sw_id[80];
  182. DPRINTF(("divas: loading Diva Server 4BRI[%d]", load->card_id));
  183. switch(load->code_type)
  184. {
  185. case DIA_CPU_CODE:
  186. DPRINTF(("divas: RISC code"));
  187. print_hdr(load->code, 0x80);
  188. card->hw->features = GetProtFeatureValue((char *)&load->code[0x80]);
  189. download_offset = 0; // Protocol code written to offset 0
  190. pRAM = UxCardMemAttach(card->hw, DIVAS_RAM_MEMORY);
  191. break;
  192. case DIA_DSP_CODE:
  193. DPRINTF(("divas: DSP code"));
  194. print_hdr(load->code, 0x0); 
  195. FirstCard = get_card(load->card_id - 3);
  196. if ((card->hw->features) && (card->hw->features & PROTCAP_V90D))
  197. {
  198. download_offset = MQ_V90D_DSP_CODE_BASE;
  199. }
  200. else
  201. {
  202. download_offset = MQ_ORG_DSP_CODE_BASE;
  203. }
  204. pRAM = UxCardMemAttach(FirstCard->hw, DIVAS_RAM_MEMORY);
  205. download_offset += (((sizeof(dword) + (sizeof(t_dsp_download_desc)* DSP_MAX_DOWNLOAD_COUNT)) + 3) & 0xFFFFFFFC);
  206. break;
  207. case DIA_TABLE_CODE:
  208. DPRINTF(("divas: TABLE code"));
  209. FirstCard = get_card(load->card_id - 3);
  210. if ((card->hw->features) && (card->hw->features & PROTCAP_V90D))
  211. {
  212. download_offset = MQ_V90D_DSP_CODE_BASE + sizeof(dword);
  213. }
  214. else
  215. {
  216. download_offset = MQ_ORG_DSP_CODE_BASE + sizeof(dword);
  217. }
  218. pRAM = UxCardMemAttach(FirstCard->hw, DIVAS_RAM_MEMORY);
  219. break;
  220. case DIA_CONT_CODE:
  221. DPRINTF(("divas: continuation code"));
  222. break;
  223.         case DIA_DLOAD_CNT:
  224. DPRINTF(("divas: COUNT code"));
  225. FirstCard = get_card(load->card_id - 3);
  226. if ((card->hw->features) && (card->hw->features & PROTCAP_V90D))
  227. {
  228. download_offset = MQ_V90D_DSP_CODE_BASE;
  229. }
  230. else
  231. {
  232. download_offset = MQ_ORG_DSP_CODE_BASE;
  233. }
  234. pRAM = UxCardMemAttach(FirstCard->hw, DIVAS_RAM_MEMORY);
  235. break;
  236. case DIA_FPGA_CODE:
  237. DPRINTF(("divas: 4BRI FPGA download - %d bytes", load->length));
  238. if (FPGA_Download(IDI_ADAPTER_MAESTRAQ,
  239.   card->hw->io_base,
  240.  sw_id,
  241.  load->code,
  242.  load->length
  243. ) == -1)
  244. {
  245. DPRINTF(("divas: FPGA download failed"));
  246. return -1;
  247. }
  248. /* NOW reset the 4BRI */
  249. diva_server_4bri_reset(card);
  250. return 0; // No need for anything further loading
  251. default:
  252. DPRINTF(("divas: unknown code type"));
  253. return -1;
  254. }
  255.    memcp(pRAM + (download_offset & 0x3FFFFF), load->code, load->length);
  256. {
  257. int mism_off;
  258. if ((mism_off = memcm(pRAM + (download_offset & 0x3FFFFF), load->code, load->length)))
  259. {
  260. DPRINTF(("divas: memory mismatch at offset %d", mism_off));
  261. UxCardMemDetach(card->hw, pRAM);
  262. return -1;
  263. }
  264. }
  265. UxCardMemDetach(card->hw, pRAM);
  266. return 0;
  267. }
  268. static int diva_server_4bri_start(card_t *card, byte *channels)
  269. {
  270. byte *ctl;
  271. byte *shared, i;
  272. int adapter_num;
  273. DPRINTF(("divas: start Diva Server 4BRI"));
  274. *channels = 0;
  275. card->is_live = FALSE;
  276. ctl = UxCardMemAttach(card->hw, DIVAS_CTL_MEMORY);
  277. UxCardMemOutW(card->hw, &ctl[MQ_BREG_RISC], MQ_RISC_COLD_RESET_MASK);
  278. UxPause(2);
  279. UxCardMemOutW(card->hw, &ctl[MQ_BREG_RISC], MQ_RISC_WARM_RESET_MASK | MQ_RISC_COLD_RESET_MASK);
  280. UxPause(10);
  281. UxCardMemDetach(card->hw, ctl);
  282. shared = (byte *) UxCardMemAttach(card->hw, DIVAS_SHARED_MEMORY);
  283. for ( i = 0 ; i < 300 ; ++i )
  284. {
  285. UxPause (10) ;
  286. if ( UxCardMemInW(card->hw, &shared[0x1E]) == 0x4447 )
  287. {
  288. DPRINTF(("divas: Protocol startup time %d.%02d seconds",
  289.          (i / 100), (i % 100) ));
  290. break;
  291. }
  292. }
  293. if (i==300)
  294. {
  295. DPRINTF(("divas: Timeout starting card"));
  296. DPRINTF(("divas: Signature == 0x%04X", UxCardMemInW(card->hw, &shared[0x1E])));
  297. UxCardMemDetach(card->hw, shared);
  298. return -1;
  299. }
  300. UxCardMemDetach(card->hw, shared);
  301. for (adapter_num=3; adapter_num >= 0; adapter_num--)
  302. {
  303. card_t *qbri_card;
  304. qbri_card = get_card(card->cfg.card_id - adapter_num);
  305. if (qbri_card)
  306. {
  307. qbri_card->is_live = TRUE;
  308. shared = UxCardMemAttach(qbri_card->hw, DIVAS_SHARED_MEMORY);
  309. *channels += UxCardMemIn(qbri_card->hw, &shared[0x3F6]);
  310. UxCardMemDetach(qbri_card->hw, shared);
  311. }
  312. else
  313. {
  314. DPRINTF(("divas: Couldn't get card info %d", card->cfg.card_id));
  315. }
  316. }
  317. diva_server_4bri_test_int(card);
  318. return 0;
  319. }
  320. static
  321. int  diva_server_4bri_mem_get(card_t *card, mem_block_t *mem_block)
  322. {
  323. byte *a;
  324. byte *card_addr;
  325. word length = 0;
  326. int i;
  327. a = UxCardMemAttach(card->hw, DIVAS_RAM_MEMORY);
  328. card_addr = a;
  329. card_addr += mem_block->addr;
  330. for (i=0; i < sizeof(mem_block->data); i++)
  331. {
  332. mem_block->data[i] = UxCardMemIn(card->hw, card_addr);
  333. card_addr++;
  334. length++;
  335. }
  336. UxCardMemDetach(card->hw, a);
  337. return length;
  338. }
  339. /*
  340.  * Initialise 4BRI specific entry points
  341.  */
  342. int Divas4BriInit(card_t *card, dia_card_t *cfg)
  343. {
  344. // byte sw_id[80];
  345. // extern int FPGA_Done;
  346. DPRINTF(("divas: initialise Diva Server 4BRI"));
  347. if (Divas4BRIInitPCI(card, cfg) == -1)
  348. {
  349. return -1;
  350. }
  351. /* Need to download the FPGA */
  352. /* if (!FPGA_Done)
  353. {
  354. int retVal;
  355. retVal=FPGA_Download(IDI_ADAPTER_MAESTRAQ,
  356.   cfg->io_base,
  357.  sw_id,
  358.  FPGA_Bytes
  359. );
  360. if(retVal==-1)
  361. {
  362. DPRINTF(("divas: FPGA Download Failed"));
  363. return -1;
  364. }
  365. FPGA_Done = 1;
  366. } */
  367. card->card_reset = diva_server_4bri_reset;
  368. card->card_load = diva_server_4bri_load;
  369. card->card_config = diva_server_4bri_config;
  370. card->card_start = diva_server_4bri_start;
  371. card->reset_int = diva_server_4bri_reset_int;
  372. card->card_mem_get = diva_server_4bri_mem_get;
  373. card->xlog_offset = DIVAS_MAINT_OFFSET;
  374. card->out = DivasOut;
  375. card->test_int = DivasTestInt;
  376. card->dpc = DivasDpc;
  377. card->clear_int = DivasClearInt;
  378. card->card_isr = fourbri_ISR;
  379. card->a.ram_out = mem_out;
  380. card->a.ram_outw = mem_outw;
  381. card->a.ram_out_buffer = mem_out_buffer;
  382. card->a.ram_inc = mem_inc;
  383. card->a.ram_in = mem_in;
  384. card->a.ram_inw = mem_inw;
  385. card->a.ram_in_buffer = mem_in_buffer;
  386. card->a.ram_look_ahead = mem_look_ahead;
  387. return 0;
  388. }
  389. void memcp(byte *dst, byte *src, dword dwLen)
  390. {
  391. while (dwLen)
  392. {
  393. *dst = *src;
  394. dst++; src++;
  395. dwLen--;
  396. }
  397. }
  398. int memcm(byte *dst, byte *src, dword dwLen)
  399. {
  400. int offset = 0;
  401. while (offset < dwLen)
  402. {
  403. if(*dst != *src)
  404. return (offset+1);
  405. offset++;
  406. src++;
  407. dst++;
  408. }
  409. return 0;
  410. }
  411. /*int fourbri_ISR (card_t* card) 
  412. {
  413. int served = 0;
  414. byte *DivasIOBase = UxCardMemAttach(card->hw, DIVAS_IOBASE);
  415. if (UxCardPortIoIn (card->hw, DivasIOBase, M_PCI_RESET) & 0x01) 
  416. {
  417. served = 1;
  418. card->int_pend  += 1;
  419. DivasDpcSchedule(); 
  420. UxCardPortIoOut (card->hw, DivasIOBase, M_PCI_RESET, 0x08);
  421. }
  422. UxCardMemDetach(card->hw, DivasIOBase);
  423. return (served != 0);
  424. }*/
  425. static int fourbri_ISR (card_t* card) 
  426. {
  427. byte *ctl;
  428. card->int_pend  += 1;
  429. DivasDpcSchedule(); /* ISR DPC */
  430. ctl = UxCardMemAttach(card->hw, DIVAS_CTL_MEMORY);
  431. UxCardMemOut(card->hw, &ctl[MQ_BREG_IRQ_TEST], MQ_IRQ_REQ_OFF);
  432. UxCardMemDetach(card->hw, ctl);
  433. return (1);
  434. }