xd_misc.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. #include "xd_misc.h"
  2. static unsigned long start_time,timeout_value,overflow_cnt,timeout_flag;
  3. static unsigned long last_time_diff,time_diff,time_diff,cur_time;
  4. void xd_sm_start_timer(unsigned long time_value)
  5. {
  6. timeout_value = time_value;
  7. overflow_cnt = 0;
  8. last_time_diff = 0;
  9. timeout_flag = 0;
  10. start_time = xd_sm_get_timer_tick();
  11. }
  12. int xd_sm_check_timer()
  13. {
  14. cur_time = xd_sm_get_timer_tick();
  15. if(cur_time < start_time)
  16. {
  17. time_diff = XD_SM_MAX_TIMER_TICK - start_time + cur_time + 1;
  18. }
  19. else
  20. {
  21. time_diff = cur_time - start_time;
  22. }
  23. if(last_time_diff > time_diff)
  24. {
  25. overflow_cnt++;
  26. }
  27. last_time_diff = time_diff;
  28. #ifdef AML_ATHENA
  29. time_diff += (overflow_cnt << 24);
  30. #else
  31. time_diff += (overflow_cnt << 16);
  32. #endif
  33. if(time_diff >= timeout_value)
  34. {
  35. timeout_flag = 1;
  36. return 1;
  37. }
  38. else
  39. {
  40. return 0;
  41. }
  42. }
  43. int xd_sm_check_timeout()
  44. {
  45. return timeout_flag;
  46. }
  47. void xd_sm_delay_100ns(unsigned long num_100ns)
  48. {
  49. unsigned long i;
  50. for(i = 0; i < num_100ns; i++)
  51. {
  52. __asm__("nop");
  53. __asm__("nop");
  54. __asm__("nop");
  55. __asm__("nop");
  56. __asm__("nop");
  57. __asm__("nop");
  58. __asm__("nop");
  59. #if (defined T3510) || (defined T3511) //For 3295, not need this one
  60. __asm__("nop");
  61. #endif
  62. }
  63. }
  64. void xd_sm_delay_us(unsigned long num_us)
  65. {
  66. udelay(num_us);
  67. }
  68. void xd_sm_delay_ms(unsigned long num_ms)
  69. {
  70. unsigned long i;
  71. for(i = 0; i < num_ms; i++)
  72. {
  73. #ifdef AML_ATHENA
  74. msleep(1);
  75. #else
  76. xd_sm_delay_us(1000);
  77. #endif
  78. }
  79. }
  80. //ECC routines
  81. unsigned char ecc_table[256] = {
  82. 0x00, 0x55, 0x56, 0x03, 0x59, 0x0C, 0x0F, 0x5A, 0x5A, 0x0F, 0x0C, 0x59, 0x03, 0x56, 0x55, 0x00,
  83. 0x65, 0x30, 0x33, 0x66, 0x3C, 0x69, 0x6A, 0x3F, 0x3F, 0x6A, 0x69, 0x3C, 0x66, 0x33, 0x30, 0x65,
  84. 0x66, 0x33, 0x30, 0x65, 0x3F, 0x6A, 0x69, 0x3C, 0x3C, 0x69, 0x6A, 0x3F, 0x65, 0x30, 0x33, 0x66,
  85. 0x03, 0x56, 0x55, 0x00, 0x5A, 0x0F, 0x0C, 0x59, 0x59, 0x0C, 0x0F, 0x5A, 0x00, 0x55, 0x56, 0x03,
  86. 0x69, 0x3C, 0x3F, 0x6A, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6A, 0x3F, 0x3C, 0x69,
  87. 0x0C, 0x59, 0x5A, 0x0F, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0F, 0x5A, 0x59, 0x0C,
  88. 0x0F, 0x5A, 0x59, 0x0C, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0C, 0x59, 0x5A, 0x0F,
  89. 0x6A, 0x3F, 0x3C, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3C, 0x3F, 0x6A,
  90. 0x6A, 0x3F, 0x3C, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3C, 0x3F, 0x6A,
  91. 0x0F, 0x5A, 0x59, 0x0C, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0C, 0x59, 0x5A, 0x0F,
  92. 0x0C, 0x59, 0x5A, 0x0F, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0F, 0x5A, 0x59, 0x0C,
  93. 0x69, 0x3C, 0x3F, 0x6A, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6A, 0x3F, 0x3C, 0x69,
  94. 0x03, 0x56, 0x55, 0x00, 0x5A, 0x0F, 0x0C, 0x59, 0x59, 0x0C, 0x0F, 0x5A, 0x00, 0x55, 0x56, 0x03,
  95. 0x66, 0x33, 0x30, 0x65, 0x3F, 0x6A, 0x69, 0x3C, 0x3C, 0x69, 0x6A, 0x3F, 0x65, 0x30, 0x33, 0x66,
  96. 0x65, 0x30, 0x33, 0x66, 0x3C, 0x69, 0x6A, 0x3F, 0x3F, 0x6A, 0x69, 0x3C, 0x66, 0x33, 0x30, 0x65,
  97. 0x00, 0x55, 0x56, 0x03, 0x59, 0x0C, 0x0F, 0x5A, 0x5A, 0x0F, 0x0C, 0x59, 0x03, 0x56, 0x55, 0x00
  98. };
  99. #if 0
  100. unsigned char cis_data[] = {
  101. 0x01, 0x03, 0xD9, 0x01, 0xFF, 0x18, 0x02, 0xDF, 0x01, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x21,
  102. 0x02, 0x04, 0x01, 0x22, 0x02, 0x01, 0x01, 0x22, 0x03, 0x02, 0x04, 0x07, 0x1A, 0x05, 0x01, 0x03,
  103. 0x00, 0x02, 0x0F, 0x1B, 0x08, 0xC0, 0xC0, 0xA1, 0x01, 0x55, 0x08, 0x00, 0x20, 0x1B, 0x0A, 0xc1,
  104. 0x41, 0x99, 0x01, 0x55, 0x64, 0xF0, 0xFF, 0xFF, 0x20, 0x1B, 0x0C, 0x82, 0x41, 0x18, 0xEA, 0x61,
  105. 0xF0, 0x01, 0x07, 0xF6, 0x03, 0x01, 0xEE, 0x1B, 0x0C, 0x83, 0x41, 0x18, 0xEA, 0x61, 0x70, 0x01,
  106. 0x07, 0x76, 0x03, 0x01, 0xEE, 0x15, 0x14, 0x05, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
  107. 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x30, 0x2E, 0x30, 0x00, 0xFF, 0x14, 0x00, 0xFF, 0x00, 0x00,
  108. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  109. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  110. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  111. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  112. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  113. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  114. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  115. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  116. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  117. 0x0C, 0xCC, 0xC3
  118. };
  119. #endif
  120. #define BIT7 0x80
  121. #define BIT6 0x40
  122. #define BIT2 0x04
  123. #define BIT0 0x01
  124. #define BIT1BIT0 0x03
  125. #define BIT23 0x00800000
  126. #define MASK_CPS 0x3F
  127. #define CORRECTABLE 0x00555554
  128. // Transfer result
  129. // LP14, 12, 10,... & LP15, 13, 11,... -> LP15, 14, 13,... & LP7, 6, 5,...
  130. // reg2: LP14, 12, 10,...
  131. // reg3: LP15, 13, 11,...
  132. // ecc1: LP15, 14, 13,...
  133. // ecc2: LP07, 06, 05,...
  134. void ecc_trans_result(unsigned char reg2, unsigned char reg3, unsigned char *ecc1, unsigned char *ecc2)
  135. {
  136. unsigned char a; // Working for reg2, reg3
  137. unsigned char b; // Working for ecc1, ecc2
  138. unsigned char i; // For counting
  139. a = BIT7; b = BIT7;
  140. *ecc1 = *ecc2 = 0; // Clear ecc1, ecc2
  141. for(i=0; i<4; ++i)
  142. {
  143. if((reg3 & a) != 0) // LP15, 13, 11, 9 --> ecc1
  144. *ecc1 |= b;
  145. b >>= 1; // Right shift
  146. if((reg2 & a) != 0) // LP14, 12, 10, 8 --> ecc1
  147. *ecc1 |= b;
  148. b >>= 1; // Right shift
  149. a >>= 1; // Right shift
  150. }
  151. b = BIT7;
  152. for(i=0; i<4; ++i)
  153. {
  154. if((reg3 & a) != 0) // LP7, 5, 3, 1 --> ecc2
  155. *ecc2 |= b;
  156. b >>= 1; // Right shift
  157. if((reg2 & a) != 0) // LP6, 4, 2, 0 --> ecc2
  158. *ecc2 |= b;
  159. b >>= 1; // Right shift
  160. a >>= 1; // Right shift
  161. }
  162. }
  163. // Calculating ECC
  164. // data[0-255] -> ecc1, ecc2, ecc3 using CP0-CP5 code table[0-255]
  165. // table: CP0-CP5 code table
  166. // data: DATA
  167. // ecc1: LP15, 14, 13,...
  168. // ecc2: LP07, 06, 05,...
  169. // ecc3: CP5, CP4, CP3,... "1", "1"
  170. void ecc_calculate_ecc(unsigned char *table, unsigned char *data, unsigned char *ecc1, unsigned char *ecc2, unsigned char *ecc3)
  171. {
  172. unsigned int i; // For counting
  173. unsigned char a; // Working for table
  174. unsigned char reg1; // D-all, CP5, CP4, CP3,...
  175. unsigned char reg2; // LP14, 12, 10,...
  176. unsigned char reg3; // LP15, 13, 11,...
  177. reg1 = reg2 = reg3 = 0; // Clear parameter
  178. for(i=0; i<256; i++)
  179. {
  180. a = table[data[i]]; // Get CP0-CP5 code from table
  181. reg1 ^= (a & MASK_CPS); // XOR with a
  182. if((a & BIT6) != 0) // if D-all(all bit XOR) = 1
  183. {
  184. reg3 ^= (unsigned char)i; // XOR with counter
  185. reg2 ^= ~((unsigned char)i);// XOR with inv. of counter
  186. }
  187. }
  188. // Trans LP14, 12, 10,... & LP15, 13, 11,... -> LP15, 14, 13,... & LP7, 6, 5,...
  189. ecc_trans_result(reg2,reg3,ecc1,ecc2);
  190. *ecc1 = ~(*ecc1); *ecc2 = ~(*ecc2); // Inv. ecc2 & ecc3
  191. *ecc3 = ((~reg1) << 2) | BIT1BIT0; // Make TEL format
  192. }
  193. // data: DATA
  194. // ecc1: LP15, 14, 13,...
  195. // ecc2: LP07, 06, 05,...
  196. // ecc3: CP5, CP4, CP3,... "1", "1"
  197. unsigned char ecc_correct_data(unsigned char *data, unsigned char *data_ecc, unsigned char ecc1, unsigned char ecc2, unsigned char ecc3)
  198. {
  199. unsigned long l; // Working to check d
  200. unsigned long d; // Result for comparison
  201. unsigned int i; // For counting
  202. unsigned char d1, d2, d3; // Result for comparison
  203. unsigned char a; // Working for add
  204. unsigned char add; // Byte address of cor. DATA
  205. unsigned char b; // Working for bit
  206. unsigned char bit; // Bit address of cor. DATA
  207. d1 = ecc1 ^ data_ecc[1];//data[257]; // Compare LP's
  208. d2 = ecc2 ^ data_ecc[0];//data[256];
  209. d3 = ecc3 ^ data_ecc[2];//data[258]; // Compare CP's
  210. d = ((unsigned long)d1 << 16) + ((unsigned long)d2 << 8) + (unsigned long)d3; // Result for comparison
  211. if(d == 0) // if No error, return
  212. return 0;
  213. if(((d ^ (d >> 1)) & CORRECTABLE) == CORRECTABLE) // if correctable
  214. {
  215. l = BIT23;
  216. add = 0; // Clear parameter
  217. a = BIT7;
  218. for(i=0; i<8; ++i) // Checking 8 bit
  219. {
  220. if((d & l) != 0) // Make byte address from LP's
  221. add |= a;
  222. l >>= 2; // Right shift
  223. a >>= 1;
  224. }
  225. bit = 0; // Clear parameter
  226. b = BIT2;
  227. for(i=0; i<3; ++i) // Checking 3 bit
  228. {
  229. if((d & l) != 0) // Make byte address from LP's
  230. bit |= b;
  231. l >>= 2; // Right shift
  232. b >>= 1;
  233. }
  234. b = BIT0;
  235. data[add] ^= (b << bit); // Put corrected data
  236. return 1;
  237. }
  238. i = 0; // Clear count
  239. d &= 0x00FFFFFF; // Masking
  240. while(d) // if d=0 finish counting
  241. {
  242. if(d & BIT0) // Clear number of 1 bit
  243. ++i;
  244. d >>= 1; // Right shift
  245. }
  246. if(i == 1) // if ECC error
  247. {
  248. //data[257] = ecc1; // Put right ECC code
  249. //data[256] = ecc2;
  250. //data[258] = ecc3;
  251. data_ecc[1] = ecc1; // Put right ECC code
  252. data_ecc[0] = ecc2;
  253. data_ecc[2] = ecc3;
  254. return 2; // ECC error
  255. }
  256. return 3; // Uncorrectable error
  257. }