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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Unix Eicon active card driver
  3.  * XLOG related functions
  4.  *
  5.  * Copyright (C) Eicon Technology Corporation, 2000.
  6.  *
  7.  * Eicon File Revision :    1.2  
  8.  *
  9.  * This software may be used and distributed according to the terms
  10.  * of the GNU General Public License, incorporated herein by reference.
  11.  *
  12.  */
  13. #include "sys.h"
  14. #include "idi.h"
  15. #include "pc.h"
  16. #include "pc_maint.h"
  17. #include "divalog.h"
  18. #include "adapter.h"
  19. #include "uxio.h"
  20. /*
  21.  * convert/copy XLOG info into a KLOG entry
  22.  */
  23. static
  24. void xlog_to_klog(byte *b, int size, int card_num)
  25. {
  26. typedef struct
  27. {
  28. word code;
  29. word time_hi;
  30. word time_lo;
  31. word xcode;
  32. byte data[2];
  33. } card_xlog_t;
  34. card_xlog_t *x;
  35. klog_t klog;
  36. x = (card_xlog_t *) b;
  37. memset(&klog, 0, sizeof(klog));
  38. klog.time_stamp = (dword) x->time_hi;
  39. klog.time_stamp = (klog.time_stamp << 16) | (dword) x->time_lo;
  40. klog.length = size > sizeof(klog.buffer) ? sizeof(klog.buffer) : size;
  41. klog.card = card_num;
  42. if (x->code == 1)
  43. {
  44. klog.type = KLOG_XTXT_MSG;
  45. klog.code = 0;
  46. memcpy(klog.buffer, &x->xcode, klog.length);
  47. }
  48. else if (x->code == 2)
  49. {
  50. klog.type = KLOG_XLOG_MSG;
  51. klog.code = x->xcode;
  52. memcpy(klog.buffer, &x->data, klog.length);
  53. }
  54. else
  55. {
  56. char *c; int i;
  57. klog.type = KLOG_TEXT_MSG;
  58. klog.code = 0;
  59. c = "divas: invalid xlog message code from card";
  60. i = 0;
  61. while (*c)
  62. {
  63. klog.buffer[i] = *c;
  64. c++;
  65. i++;
  66. }
  67. klog.buffer[i] = *c;
  68. }
  69.     /* send to the log driver and return */
  70.     DivasLogAdd(&klog, sizeof(klog));
  71. return;
  72. }
  73. /*
  74.  * send an XLOG request down to specified card
  75.  * if response available from previous request then read it
  76.  * if not then just send down new request, ready for next time
  77.  */
  78. void DivasXlogReq(int card_num)
  79. {
  80. card_t *card;
  81. ADAPTER  *a;
  82. if ((card_num < 0) || (card_num > DivasCardNext))
  83. {
  84. DPRINTF(("xlog: invalid card number"));
  85. return;
  86. }
  87. card = &DivasCards[card_num];
  88. if (DivasXlogRetrieve(card))
  89. {
  90. return;
  91. }
  92. /* send down request for next time */
  93. a = &card->a;
  94. a->ram_out(a, (word *) (card->xlog_offset + 1), 0);
  95. a->ram_out(a, (word *) (dword) (card->xlog_offset), DO_LOG);
  96. return;
  97. }
  98. /*
  99.  * retrieve XLOG request from specified card
  100.  * returns non-zero if new request sent to card
  101.  */
  102. int DivasXlogRetrieve(card_t *card)
  103. {
  104. ADAPTER  *a;
  105. struct mi_pc_maint pcm;
  106. a = &card->a;
  107. /* get status of last request */
  108. pcm.rc = a->ram_in(a, (word *)(card->xlog_offset + 1));
  109. /* if nothing there from previous request, send down a new one */
  110. if (pcm.rc == OK)
  111. {
  112. /* read in response */
  113. a->ram_in_buffer(a, (word *) (dword) card->xlog_offset, &pcm, sizeof(pcm)); 
  114. xlog_to_klog((byte *) &pcm.data, sizeof(pcm.data), 
  115. (int) (card - DivasCards));
  116. }
  117. /* if any response received from card, re-send request */
  118. if (pcm.rc)
  119. {
  120. a->ram_out(a, (word *) (card->xlog_offset + 1), 0);
  121. a->ram_out(a, (word *) (dword) (card->xlog_offset), DO_LOG);
  122. return 1;
  123. return 0;
  124. }