xd_protocol.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. #include "xd_port.h"
  2. #include "xd_misc.h"
  3. #include "xd_sm.h"
  4. #include "xd_protocol.h"
  5. #include "xd_enc.h"
  6. unsigned xd_power_delay = 0;
  7. extern unsigned char xd_reset_flag_read, xd_reset_flag_write;
  8. //Check if any card is inserted
  9. int xd_check_insert()
  10. {
  11. int level;
  12. if(xd_sm_info->xd_get_ins)
  13. {
  14. level = xd_sm_info->xd_get_ins();
  15. }
  16. else
  17. {
  18. xd_set_ins_input();
  19. level = xd_get_ins_value();
  20. }
  21. if(level)
  22. {
  23. if(xd_sm_info->xd_init_retry)
  24. {
  25. xd_sm_power_off();
  26. xd_sm_info->xd_init_retry = 0;
  27. }
  28. if(xd_sm_info->xd_inited_flag)
  29. {
  30. xd_sm_power_off();
  31. xd_sm_info->xd_removed_flag = 1;
  32. xd_sm_info->xd_inited_flag = 0;
  33. }
  34. return 0; //No card is inserted
  35. }
  36. else
  37. {
  38. xd_sm_info->card_type = CARD_TYPE_XD;
  39. return 1; //A card is inserted
  40. }
  41. }
  42. void xd_power_on()
  43. {
  44. xd_sm_delay_ms(xd_power_delay+1);
  45. #ifdef XD_POWER_CONTROL
  46. if(xd_sm_info->xd_power)
  47. {
  48. xd_sm_info->xd_power(0);
  49. }
  50. else
  51. {
  52. xd_set_disable();
  53. }
  54. if ((!xd_reset_flag_read) && (!xd_reset_flag_write))
  55. xd_sm_delay_ms(100);
  56. else
  57. xd_sm_delay_ms(10);
  58. if(xd_sm_info->xd_power)
  59. {
  60. if(xd_check_insert()) //ensure card wasn't removed at this time
  61. {
  62. xd_sm_info->xd_power(1);
  63. }
  64. }
  65. else
  66. {
  67. if(xd_check_insert()) //ensure card wasn't removed at this time
  68. {
  69. xd_set_enable();
  70. }
  71. }
  72. if ((!xd_reset_flag_read) && (!xd_reset_flag_write))
  73. xd_sm_delay_ms(100);
  74. else
  75. xd_sm_delay_ms(10);
  76. #else
  77. xd_sm_delay_ms(100);
  78. #endif
  79. }
  80. void xd_power_off()
  81. {
  82. #ifdef XD_POWER_CONTROL
  83. if(xd_sm_info->xd_power)
  84. {
  85. xd_sm_info->xd_power(0);
  86. }
  87. else
  88. {
  89. xd_set_disable();
  90. }
  91. #endif
  92. }
  93. void xd_io_config()
  94. {
  95. xd_gpio_enable();
  96. xd_set_rb_input();
  97. xd_set_re_output();
  98. xd_set_re_disable();
  99. xd_set_ce_output();
  100. xd_set_ce_disable();
  101. xd_set_ale_output();
  102. xd_set_ale_disable();
  103. xd_set_cle_output();
  104. xd_set_cle_disable();
  105. xd_set_we_output();
  106. xd_set_we_disable();
  107. xd_set_wp_output();
  108. xd_set_wp_enable();
  109. xd_set_dat0_7_input();
  110. }
  111. void xd_cmd_input_cycle(unsigned char cmd, int enable_write)
  112. {
  113. xd_set_dat0_7_output();
  114. xd_set_ale_disable();
  115. xd_set_ce_enable();
  116. xd_set_cle_enable();
  117. xd_sm_delay_20ns(); // Tcls = Tcs = Tals = 20ns
  118. xd_set_dat0_7_value(cmd);
  119. if(enable_write)
  120. xd_set_wp_disable();
  121. xd_set_we_enable();
  122. xd_sm_delay_40ns(); // Twp = 40ns, Tds = 30ns
  123. xd_set_we_disable();
  124. xd_sm_delay_40ns(); // Tclh = Tch = Talh = 40ns, Tdh = 20ns
  125. xd_set_ce_disable();
  126. xd_set_cle_disable();
  127. }
  128. void xd_addr_input_cycle(unsigned long addr, int cycles)
  129. {
  130. int data,i;
  131. xd_set_ale_enable();
  132. xd_set_cle_disable();
  133. xd_set_ce_enable();
  134. xd_sm_delay_20ns(); // Tcls = Tcs = Tals = 20ns
  135. for(i=0; i<cycles; i++)
  136. {
  137. data = (addr >> (i << 3)) & 0xFF;
  138. xd_set_dat0_7_value(data);
  139. xd_set_we_enable();
  140. xd_sm_delay_40ns(); // Twp = 40ns, Tds = 30ns
  141. xd_set_we_disable();
  142. xd_sm_delay_40ns(); // Twh = 20ns, Tdh = 20ns, Twc = Twp + Twh = 80ns
  143. }
  144. xd_set_ale_disable(); // Talh = 40ns, Tdh = 20ns
  145. }
  146. void xd_data_input_cycle(unsigned char *data_buf, unsigned long data_cnt, unsigned char *redundant_buf, unsigned long redundant_cnt)
  147. {
  148. int i;
  149. xd_set_ale_disable();
  150. xd_sm_delay_20ns(); // Tals = 20ns
  151. for(i=0; i<data_cnt; i++)
  152. {
  153. xd_set_dat0_7_value(*data_buf++);
  154. xd_set_we_enable();
  155. xd_sm_delay_40ns(); // Twp = 40ns, Tds = 30ns
  156. xd_set_we_disable();
  157. xd_sm_delay_40ns(); // Twh = 20ns, Tdh = 20ns, Twc = Twp + Twh = 80ns
  158. }
  159. for(i=0; i<redundant_cnt; i++)
  160. {
  161. xd_set_dat0_7_value(*redundant_buf++);
  162. xd_set_we_enable();
  163. xd_sm_delay_40ns(); // Twp = 40ns, Tds = 30ns
  164. xd_set_we_disable();
  165. xd_sm_delay_40ns(); // Twh = 20ns, Tdh = 20ns, Twc = Twp + Twh = 80ns
  166. }
  167. }
  168. void xd_serial_read_cycle(unsigned char *data_buf, unsigned long data_cnt, unsigned char *redundant_buf, unsigned long redundant_cnt)
  169. {
  170. int i;
  171. #ifdef AMLOGIC_CHIP_SUPPORT
  172. unsigned long data;
  173. if((unsigned long)data_buf == 0x3400000)
  174. {
  175. for(i=0; i<data_cnt; i++)
  176. {
  177. xd_set_re_enable();
  178. xd_sm_delay_60ns(); // Trp = 60ns
  179. data = xd_get_dat0_7_value();
  180. WRITE_BYTE_TO_FIFO(data);
  181. xd_set_re_disable();
  182. xd_sm_delay_20ns(); // Treh = 20ns, Trhz = 30ns, Trc = Trp + Treh = 80ns
  183. }
  184. }
  185. else
  186. #endif
  187. {
  188. for(i=0; i<data_cnt; i++)
  189. {
  190. xd_set_re_enable();
  191. xd_sm_delay_60ns(); // Trp = 60ns
  192. *data_buf++ = xd_get_dat0_7_value();
  193. xd_set_re_disable();
  194. xd_sm_delay_20ns(); // Treh = 20ns, Trhz = 30ns, Trc = Trp + Treh = 80ns
  195. }
  196. }
  197. for(i=0; i<redundant_cnt; i++)
  198. {
  199. xd_set_re_enable();
  200. xd_sm_delay_60ns(); // Trp = 60ns
  201. *redundant_buf++ = xd_get_dat0_7_value();
  202. xd_set_re_disable();
  203. xd_sm_delay_20ns(); // Treh = 20ns, Trhz = 30ns, Trc = Trp + Treh = 80ns
  204. }
  205. }
  206. int xd_test_ready()
  207. {
  208. return xd_get_rb_value();
  209. }
  210. int xd_card_capacity_determin(unsigned char device_code)
  211. {
  212. unsigned long temp = 0;
  213. unsigned short cis_search_max = 23;
  214. char *capacity_str = NULL;
  215. switch(device_code)
  216. {
  217. case 0x73:
  218. xd_sm_total_zones = ZONE_NUMS_16MB;
  219. capacity_str = xd_sm_capacity_16MB;
  220. break;
  221. case 0x75:
  222. xd_sm_total_zones = ZONE_NUMS_32MB;
  223. capacity_str = xd_sm_capacity_32MB;
  224. break;
  225. case 0x76:
  226. xd_sm_total_zones = ZONE_NUMS_64MB;
  227. capacity_str = xd_sm_capacity_64MB;
  228. break;
  229. case 0x79:
  230. xd_sm_total_zones = ZONE_NUMS_128MB;
  231. capacity_str = xd_sm_capacity_128MB;
  232. break;
  233. case 0x71:
  234. xd_sm_total_zones = ZONE_NUMS_256MB;
  235. capacity_str = xd_sm_capacity_256MB;
  236. break;
  237. case 0xDC:
  238. xd_sm_total_zones = ZONE_NUMS_512MB;
  239. capacity_str = xd_sm_capacity_512MB;
  240. break;
  241. case 0xD3:
  242. xd_sm_total_zones = ZONE_NUMS_1GB;
  243. capacity_str = xd_sm_capacity_1GB;
  244. break;
  245. case 0xD5:
  246. xd_sm_total_zones = ZONE_NUMS_2GB;
  247. capacity_str = xd_sm_capacity_2GB;
  248. break;
  249. case 0xD6:
  250. case 0xD9:
  251. return XD_SM_ERROR_UNSUPPORTED_CAPACITY;
  252. default:
  253. return XD_SM_ERROR_DEVICE_ID;
  254. }
  255. #ifdef XD_SM_ALLOC_MEMORY
  256. if(!xd_sm_buf)
  257. {
  258. xd_sm_buf = (XD_SM_Card_Buffer_t *)xd_sm_malloc(sizeof(XD_SM_Card_Buffer_t),GFP_KERNEL);
  259. if(xd_sm_buf == NULL)
  260. return XD_SM_ERROR_NO_MEMORY;
  261. memset(xd_sm_buf, 0, sizeof(XD_SM_Card_Buffer_t));
  262. }
  263. #ifdef XD_SM_NUM_POINTER
  264. xd_sm_actually_zones = xd_sm_total_zones;
  265. if(!xd_sm_buf->logical_physical_table)
  266. {
  267. xd_sm_buf->logical_physical_table = xd_sm_malloc(sizeof(unsigned short)*xd_sm_actually_zones*MAX_LOGICAL_BLKS_PER_ZONE,GFP_KERNEL);
  268. if(!xd_sm_buf->logical_physical_table)
  269. return XD_SM_ERROR_NO_MEMORY;
  270. memset(xd_sm_buf->logical_physical_table, 0, sizeof(unsigned short)*xd_sm_actually_zones*MAX_LOGICAL_BLKS_PER_ZONE);
  271. }
  272. if(!xd_sm_buf->free_block_table)
  273. {
  274. xd_sm_buf->free_block_table = xd_sm_malloc(sizeof(unsigned char)*xd_sm_actually_zones*MAX_PHYSICAL_BLKS_PER_ZONE / 8,GFP_KERNEL);
  275. if(!xd_sm_buf->free_block_table)
  276. return XD_SM_ERROR_NO_MEMORY;
  277. memset(xd_sm_buf->free_block_table, 0, sizeof(unsigned char)*xd_sm_actually_zones*MAX_PHYSICAL_BLKS_PER_ZONE / 8);
  278. }
  279. #endif
  280. #endif
  281. xd_sm_buf->capacity_str = capacity_str;
  282. xd_sm_buf->cis_search_max = cis_search_max;
  283. xd_sm_physical_blks_perzone = 1024;
  284. xd_sm_logical_blks_perzone = 1000;
  285. xd_sm_pages_per_blk = 32;
  286. xd_sm_page_size = 512;
  287. xd_sm_redundant_size = 16;
  288. xd_sm_buf->addr_cycles = 4;
  289. temp = xd_sm_total_zones;
  290. temp *= xd_sm_physical_blks_perzone;
  291. xd_sm_totoal_physical_blks = temp;
  292. temp = xd_sm_total_zones;
  293. temp *= xd_sm_logical_blks_perzone;
  294. xd_sm_totoal_logical_blks = temp;
  295. return XD_SM_NO_ERROR;
  296. }
  297. void xd_exit()
  298. {
  299. if(xd_sm_info->xd_io_release){
  300. xd_sm_info->xd_io_release();
  301. //AVDebug_OS_Irq_Check(NULL);
  302. }
  303. #ifdef XD_SM_ALLOC_MEMORY
  304. if((!xd_sm_info->sm_inited_flag) && (!xd_sm_info->sm_init_retry))
  305. {
  306. if(xd_sm_buf)
  307. {
  308. #ifdef XD_SM_NUM_POINTER
  309. if(xd_sm_buf->logical_physical_table)
  310. {
  311. xd_sm_free(xd_sm_buf->logical_physical_table);
  312. // AVDebug_OS_Irq_Check(NULL);
  313. xd_sm_buf->logical_physical_table = NULL;
  314. // AVDebug_OS_Irq_Check(NULL);
  315. }
  316. if(xd_sm_buf->free_block_table)
  317. {
  318. xd_sm_free(xd_sm_buf->free_block_table);
  319. // AVDebug_OS_Irq_Check(NULL);
  320. xd_sm_buf->free_block_table = NULL;
  321. // AVDebug_OS_Irq_Check(NULL);
  322. }
  323. #endif
  324. xd_sm_free(xd_sm_buf);
  325. // AVDebug_OS_Irq_Check(NULL);
  326. xd_sm_buf = NULL;
  327. // AVDebug_OS_Irq_Check(NULL);
  328. }
  329. }
  330. #endif
  331. }
  332. void xd_prepare_init()
  333. {
  334. //if(xd_power_register)
  335. // xd_sm_info->xd_power = xd_power_register;
  336. //if(xd_ins_register)
  337. // xd_sm_info->xd_get_ins = xd_ins_register;
  338. //if(xd_io_release_register)
  339. // xd_sm_info->xd_io_release = xd_io_release_register;
  340. }