hdd_copy.c
上传用户:caisangzi8
上传日期:2013-10-25
资源大小:15756k
文件大小:10k
源码类别:

DVD

开发平台:

C/C++

  1. /*=================================================================
  2.   hdd_play.c: Some FileSystem Info Function for HDD
  3.   
  4. 2002-04-28 10:00AM Created  by Verdure
  5. 2002-06-12 08:42AM Modified by cyue
  6.   Copyright(c)2000-2002 by Worldplus Technology (ShenZhen) Co., Ltd.
  7.   ALL RIGHTS RESERVED
  8. =================================================================*/
  9. #include "config.h"
  10. #include "global.h"
  11. #include "hdd_if.h"
  12. #include "hdd_fs.h"
  13. #include "fsNav.h"
  14. #include "user_init.h"
  15. #ifdef SUPPORT_HDD_ACCESS
  16. #define D printf("MIKEY: __%d__(%s:%s)n",__LINE__,__FILE__,__FUNCTION__);
  17. int ucosmain();
  18. char *strcpy();
  19. void *memcpy();
  20. unsigned strlen();
  21. BYTE ran_read();
  22. UINT32 addmsf();
  23. UINT8 FS_cd();
  24. UINT8 FS_dir();
  25. UINT8 FS_mkdir();
  26. UINT8 FS_rm();
  27. UINT8 FILE_filesize();
  28. UINT32 FILE_write();
  29. FILE_INFO *FILE_create();
  30. UINT32 mikey_timer0_count=0;
  31. UINT32 mikey_ucos_loaded=0;
  32. UINT8 f_do_copy_vcd=0;
  33. UINT8 f_vcd=0;
  34. UINT8 f_hdd=0;
  35. FILE_INFO copy_vcd_fd;
  36. extern UINT8 f_force_browser;
  37. extern UINT8 f_browser_mode;
  38. int do_copy_file()
  39. {
  40. #ifdef SUPPORT_CARD_STORAGE
  41. if (media_type==MEDIA_CARD) {
  42. fsgui_del();
  43. }
  44. else
  45. #endif
  46. if(f_browser_mode) {
  47. watchdog_onoff(0);
  48. // if(cd_type_loaded==CDVCD10 || cd_type_loaded==CDVCD20 || cd_type_loaded==CDSVCD) {
  49. if(f_browser_mode==CDVCD10 || f_browser_mode==CDVCD20 || f_browser_mode==CDSVCD) {
  50. f_vcd=1; // the vcd type
  51. }
  52. fsgui_copy();
  53. return 0;
  54. }
  55. if(cd_type_loaded==CDVCD10 || cd_type_loaded==CDVCD20 || cd_type_loaded==CDSVCD || cd_type_loaded==CDDVD) {
  56. f_force_browser++;
  57. ircmd_eject_toggle();
  58. // ircmd_eject_toggle();
  59. }
  60. else
  61. fsgui_copy();
  62. return 0;
  63. }
  64. #if 0
  65. int dvd_start_ucos()
  66. {
  67. LoadModual(MODUAL_UCOS);
  68. delay_1ms(100);
  69. mikey_ucos_loaded=1;
  70. ucosmain(0,0);
  71. D while(1);
  72. }
  73. #endif
  74. //#define COPYCOUNT (100)
  75. #define COPYCOUNT (20)
  76. #define COPYBUFSIZE (2048*COPYCOUNT)
  77. #define COPYBUFSTART (0xa03c0000+ 2048) // 0xa03c0000 40k
  78. #define COPYVCDBUFSTART (COPYBUFSTART+ COPYBUFSIZE) // 0xa03c0000 40k
  79. //#define COPYBUFSTART (JPGCDBUFSTART) // 0xA03AA800 208k MIKEY_BUG: why reinsert the CD DISK will panic!!
  80. int do_mount_hdd()
  81. {
  82. // check hdd
  83. if(f_hdd==0) {
  84. if(HDD_Mount()==1) {
  85. f_hdd=1;
  86. #ifdef MIKEY_CREATE_DIR
  87. #else
  88. FS_cd("/");
  89. // MIKEY_BUG: we need 11 chars. dirname, and donot with pathname
  90. FS_mkdir("JPEG       ");
  91. FS_mkdir("MP3        ");
  92. FS_mkdir("GAME       ");
  93. FS_mkdir("MOVIES     ");
  94. FS_dir();
  95. #endif
  96. }
  97. }
  98. return f_hdd;
  99. }
  100. UINT32 copy_cd_to_hdd(UINT8 *filename, UINT32 cd_msf, UINT32 cd_size, UINT32 fs_state)
  101. {
  102. UINT32 msf=cd_msf;
  103. UINT32 count;
  104. UINT8 *buf=(UINT8 *)(COPYBUFSTART);
  105. UINT32 i;
  106. UINT8 name[16];
  107. UINT8 dirname[16];
  108. FILE_INFO fd;
  109. FILE_INFO *fp=NULL;
  110. UINT8 f_copy=0;
  111. UINT8 f_try=0;
  112. static UINT32 f_error=0;
  113. UINT32 bufsize=COPYBUFSIZE;
  114. UINT32 lastbufsize=0;
  115. printf("nINFO: buf[%x]n",buf);
  116. count=(cd_size+COPYBUFSIZE-1) / COPYBUFSIZE;
  117. lastbufsize = cd_size % COPYBUFSIZE;
  118. printf("nINFO: COPY this file[%s] msf[%x] len(%d) fs_state[%x] count(%d)n",filename, msf, cd_size, fs_state, count);
  119. fsgui_100(0);
  120. if(do_mount_hdd()) {
  121. //MIKEY_BUG
  122. //D return;
  123. FS_cd("/");
  124. switch(fs_state) {
  125. case  FS_STATE_MP3:
  126. strcpy(dirname, "/MP3");
  127. strcpy(name, "        MP3");
  128. break;
  129. case  FS_STATE_JPEG:
  130. strcpy(dirname, "/JPEG");
  131. strcpy(name, "        JPG");
  132. break;
  133. case  FS_STATE_GAME:
  134. strcpy(dirname, "/GAME");
  135. strcpy(name, "        NES");
  136. break;
  137. case  FS_STATE_OTHER:
  138. strcpy(dirname, "/MOVIES");
  139. strcpy(name, "        MPG");
  140. break;
  141. default:
  142. strcpy(dirname, "/");
  143. strcpy(name, "        MPG");
  144. break;
  145. }
  146. for(i=0;i<strlen(filename);i++) {
  147. name[i] = filename[i];
  148. }
  149. printf("INFO: DIR[%s] filename[%s]n",dirname ,name);
  150. FS_cd(dirname);
  151. FS_dir();
  152. D FS_rm(name); //MIKEY
  153. D if((fp=FILE_create(name))!=NULL) {
  154. memcpy(&fd, fp,sizeof(FILE_INFO));
  155. if(f_do_copy_vcd) { // f_do_copy_vcd=1 skip do copy
  156. memcpy(&copy_vcd_fd, fp,sizeof(FILE_INFO));
  157. copy_vcd_fd.fsize=cd_size;
  158. }
  159. fp = &fd;
  160. printf("MIKEY: create file [%s/%s] OK!!n",dirname,name);
  161. f_copy=1;
  162. }
  163. else {
  164. printf("MIKEY: create file [%s/%s] ERROR!!n",dirname,name);
  165. f_copy=0;
  166. }
  167. }
  168. #define ATAPI_OK (0)
  169. D if(f_do_copy_vcd) { // f_do_copy_vcd=1 skip do copy
  170. printf("INFO: DO VCD/SVCD COPY [%s/%s]!!n",dirname,name);
  171. #define VCD_SECLEN 2352
  172. f_do_copy_vcd=0;
  173. buf=(UINT8 *)(COPYVCDBUFSTART);
  174. bufsize=VCD_SECLEN;
  175. count=(cd_size+bufsize-1) / bufsize;
  176. lastbufsize = cd_size % bufsize;
  177. for(i=0;i<count;i++) {
  178. if((i==(count-1)) && (lastbufsize!=0)) {
  179. bufsize=lastbufsize;
  180. printf("INFO: COPY LAST [%4d] msf[%x] bufsize[%x](%d)n",i,msf,bufsize,bufsize);
  181. }
  182. for(f_try=0;f_try<100;f_try++) {
  183. if(ran_read_vcd(buf, msf, bufsize)==ATAPI_OK)
  184. break;
  185. f_error++;
  186. printf("INFO: TRY(%d): COPY [%4d] msf[%x] f_error(%ld)n",f_try,i,msf,f_error);
  187. }
  188. if(f_copy) {
  189. stream_FILE_write(buf, bufsize);
  190. }
  191. msf = addmsf(msf, 1);
  192. fsgui_100(1+ ((i+1)*99/count) % 100);
  193. }
  194. flush_stream_FILE_write();
  195. }
  196. else { // do MP3, JPG, MPG file copy from CD to HDD
  197. for(i=0;i<count;i++) {
  198. if((i==(count-1)) && (lastbufsize!=0)) {
  199. bufsize=lastbufsize;
  200. printf("INFO: COPY LAST [%4d] msf[%x] bufsize[%x](%d)n",i,msf,bufsize,bufsize);
  201. }
  202. for(f_try=0;f_try<100;f_try++) {
  203. if(ran_read(buf, msf, bufsize)==ATAPI_OK)
  204. break;
  205. f_error++;
  206. printf("INFO: TRY(%d): COPY [%4d] msf[%x] f_error(%ld)n",f_try,i,msf,f_error);
  207. }
  208. if(f_copy) {
  209. FILE_write(fp, buf, bufsize);
  210. }
  211. msf = addmsf(msf, COPYCOUNT);
  212. fsgui_100(1+ ((i+1)*99/count) % 100);
  213. // fsgui_100((i+1)*100/count);
  214. }
  215. } //f_do_copy_vcd
  216. if(f_copy) {
  217. FILE_filesize(fp, cd_size); 
  218. }
  219. printf("INFO: COPY END!! [%s/%s]n",dirname,name);
  220. return 0;
  221. }
  222. UINT32 rm_file_from_hdd(UINT8 *filename, UINT32 cd_msf, UINT32 cd_size, UINT32 fs_state)
  223. {
  224. UINT32 i;
  225. UINT8 name[16];
  226. UINT8 dirname[16];
  227. printf("nINFO: del this file[%s] msf[%x] len(%d) fs_state[%x]n",filename, cd_msf, cd_size, fs_state);
  228. if(do_mount_hdd()) {
  229. FS_cd("/");
  230. switch(fs_state) {
  231. case  FS_STATE_MP3:
  232. strcpy(dirname, "/MP3");
  233. strcpy(name, "        MP3");
  234. break;
  235. case  FS_STATE_JPEG:
  236. strcpy(dirname, "/JPEG");
  237. strcpy(name, "        JPG");
  238. break;
  239. case  FS_STATE_GAME:
  240. strcpy(dirname, "/GAME");
  241. strcpy(name, "        NES");
  242. break;
  243. case  FS_STATE_OTHER:
  244. strcpy(dirname, "/MOVIES");
  245. strcpy(name, "        MPG");
  246. break;
  247. default:
  248. strcpy(dirname, "/");
  249. strcpy(name, "        MPG");
  250. break;
  251. }
  252. for(i=0;i<strlen(filename);i++) {
  253. name[i] = filename[i];
  254. }
  255. printf("INFO: DIR[%s] filename[%s]n",dirname ,name);
  256. FS_cd(dirname);
  257. FS_dir();
  258. FS_rm(name); //MIKEY
  259. FS_dir();
  260. }
  261. }
  262. UINT32 rename_file_from_hdd(UINT8 *newfilename, UINT8 *filename, UINT32 cd_msf, UINT32 cd_size, UINT32 fs_state)
  263. {
  264. UINT32 i;
  265. UINT8 name[16];
  266. UINT8 newname[16];
  267. UINT8 oldname[16];
  268. UINT8 dirname[16];
  269. printf("nINFO: rename this file[%s]->[%s] msf[%x] len(%d) fs_state[%x]n",filename,newfilename, cd_msf, cd_size, fs_state);
  270. if(do_mount_hdd()) {
  271. FS_cd("/");
  272. switch(fs_state) {
  273. case  FS_STATE_MP3:
  274. strcpy(dirname, "/MP3");
  275. strcpy(name, "        MP3");
  276. break;
  277. case  FS_STATE_JPEG:
  278. strcpy(dirname, "/JPEG");
  279. strcpy(name, "        JPG");
  280. break;
  281. case  FS_STATE_GAME:
  282. strcpy(dirname, "/GAME");
  283. strcpy(name, "        NES");
  284. break;
  285. case  FS_STATE_OTHER:
  286. strcpy(dirname, "/MOVIES");
  287. strcpy(name, "        MPG");
  288. break;
  289. default:
  290. strcpy(dirname, "/");
  291. strcpy(name, "        MPG");
  292. break;
  293. }
  294. strcpy(oldname, name);
  295. for(i=0;i<strlen(filename);i++) {
  296. oldname[i] = filename[i];
  297. }
  298. strcpy(newname, name);
  299. for(i=0;i<strlen(newfilename);i++) {
  300. newname[i] = newfilename[i];
  301. }
  302. printf("INFO: DIR[%s] oldname[%s]->[%s]n",dirname ,oldname, newname);
  303. FS_cd(dirname);
  304. FS_dir();
  305. FS_rename(newname, oldname); //MIKEY
  306. FS_dir();
  307. }
  308. }
  309. int cache_FILE_write(FILE_INFO *fp, void *buf, UINT32 count, UINT8 opt) // opt=1 flush_cache, force write to hdd
  310. {
  311. UINT8 *cachebuf=(BYTE *)(COPYBUFSTART);
  312. UINT8 *dst;
  313. static UINT32 leftlen=0;
  314. int newcount=0;
  315. if(opt) { // force write cache(leftlen) to hdd
  316. FILE_write(fp, cachebuf, leftlen); // write cache(200k) to hdd
  317. printf("INFO: WRITE CACHE bufsize[%x] leftlen(%d):(%d)n",COPYBUFSIZE,leftlen,count);
  318. leftlen=0;
  319. return 0; // write cache OK
  320. }
  321. while(1) {
  322. if((count+leftlen)>=COPYBUFSIZE) {
  323. if(leftlen) { // cache not empty
  324. dst=(UINT8 *) (cachebuf + leftlen);
  325. newcount = COPYBUFSIZE - leftlen;
  326. memcpy(dst, buf, newcount);
  327. FILE_write(fp, cachebuf, COPYBUFSIZE); // write cache(COPYBUFSIZE) to hdd
  328. // printf("INFO: WRITE CACHE bufsize[%x] leftlen(%d):(%d)n",COPYBUFSIZE,leftlen,count);
  329. buf= (UINT8 *)(buf + newcount);
  330. count-=newcount;
  331. leftlen=0;
  332. }
  333. else { // >=COPYBUFSIZE, write to hdd 
  334. FILE_write(fp, buf, COPYBUFSIZE);  // write buf(COPYBUFSIZE) to hdd
  335. // printf("INFO: WRITE BUF bufsize[%x] leftlen(%d):(%d)n",COPYBUFSIZE,leftlen,count);
  336. buf= (UINT8 *)(buf + COPYBUFSIZE);
  337. count-=COPYBUFSIZE;
  338. }
  339. }
  340. else { // <COPYBUFSIZE, write to cache
  341. dst=(UINT8 *) (cachebuf + leftlen);
  342. memcpy(dst, buf, count);
  343. leftlen+=count;
  344. // printf("INFO: CACHE dst[%x] leftlen(%d):(%d)n",dst,leftlen,count);
  345. return 0; // write cache OK
  346. }
  347. }
  348. }
  349. UINT32 stream_FILE_write(void *buf, UINT32 count)
  350. {
  351. FILE_INFO *fp=&copy_vcd_fd;
  352. return cache_FILE_write(fp, buf, count, 0); // opt=1 flush_cache, force write to hdd
  353. }
  354. UINT32 flush_stream_FILE_write()
  355. {
  356. FILE_INFO *fp=&copy_vcd_fd;
  357. return cache_FILE_write(fp, NULL, 0, 1); // opt=1 flush_cache, force write to hdd
  358. }
  359. #endif //#ifdef SUPPORT_HDD_ACCESS