kb_dc.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:16k
源码类别:

DVD

开发平台:

C/C++

  1. //*****************************************************************************
  2. //文件名:kb_dsmcc_carosel.c 
  3. //
  4. //描     述 : Dsmcc 处理主文件.
  5. //
  6. //作     者:shriek
  7. //
  8. //日     期: 2007.3.01
  9. //
  10. //版     本: v1.0
  11. //*****************************************************************************
  12. //-----------------------------------------------------------------------------
  13. // Project include files:
  14. //-----------------------------------------------------------------------------
  15. #include "kb_dc_pub.h"
  16. #include "kb_dc.h"
  17. #include "stbmoviesinfo.h"
  18. extern unsigned char byFilterBuf[];
  19. extern void kb_dc_LoadCurTs(void);
  20. unsigned char * kb_dc_getMainFreqCfgBuf(int *xmlSize);
  21. /**
  22.  * init dsmcc module 
  23.  * @return none.
  24.  */
  25. void kb_dc_init(void)
  26. {
  27.       int err;
  28.        DCDebug2("nn-------------------kb_dsmcc_init new version----------------------n");
  29.        err = KB_DC_DmxInit();
  30. if(err!=0) 
  31. {
  32. DCDebug1("n kb_dsmcc_init erro:%d",err);
  33. return;
  34. }
  35. Section_Pool_Init();
  36. }
  37. /** kb_dc_getMainFreqCfg
  38.  * get main frequency cfg file
  39.  * 
  40.  * 
  41.  * @return.
  42.  */
  43. int kb_dc_getMainFreqCfg(void)
  44. {
  45. unsigned char *xmlBuf=NULL;
  46. int xmlLen;
  47. xmlBuf = kb_dc_getMainFreqCfgBuf(&xmlLen);
  48. if(xmlBuf==NULL) 
  49. {
  50. DCDebug1("n kb_dc_getMainFreqCfgBuf NULL!");
  51. return 0;
  52. }
  53. KB_XmlParse((char*)xmlBuf, xmlLen);
  54. KBDcFree(xmlBuf);
  55. xmlBuf=NULL;
  56. //装载数据
  57. KB_DC_ReloadXmlServCfgMap();
  58. return 1;
  59. }
  60. /**
  61.  * get main frequency cfg file
  62.  * 
  63.  * 
  64.  * @return.
  65.  */
  66. unsigned char * kb_dc_getMainFreqCfgBuf(int *xmlSize)
  67. {
  68. unsigned char *buf=NULL, *sec=NULL;
  69. unsigned char *cfgFile=NULL;
  70. int dLen=0, secLen=0;
  71. char deffName[KB_DCFILE_NAME_MAX_LEN];
  72. unsigned short es_pid;
  73. unsigned short exId;
  74. KBServiceCfgDes *servDes=NULL;
  75. unsigned long freq, sym;
  76. unsigned char  mod;
  77. int res;
  78. KB_DC_ServCfg_Map_Array *ServMapArry=NULL;
  79. static int cnt=0;
  80. #ifndef KB_DC_SERVICECFG_IN_WHOLENET_MODE
  81. #ifdef KB_DC_SERVICECFG_IN_MAINFREQ_MODE
  82. freq = 339000;
  83. sym = 6875;
  84. mod = 3;
  85. if(KB_DC_SetQam(freq, sym, mod)!=MB_SUCCESS)
  86. {
  87. DCDebug1("n main frequency %ld lock failure!", freq);
  88. return NULL;
  89. }
  90. else
  91. DCDebug1("n main frequency %ld lock success!", freq);
  92. #endif
  93. #endif
  94. ServMapArry = KB_GetXmlServCfgMapHead();
  95. if(ServMapArry==NULL)   /*第一次搜索业务配置文件*/
  96. {
  97. if(cnt==0)
  98. {
  99. DCDebug2("n 第一次搜索业务配置文件");
  100. res =KBDsmccSipsiProc(0x00);
  101. if(res<=0)
  102. {
  103. DCDebug1("n KBDsmccSipsiProc failed");
  104. return NULL;
  105. }
  106. cnt++;
  107. }  
  108. }  
  109. else
  110. {
  111. ServMapArry->count = 0;   /*清空数据*/
  112. }
  113. servDes = (KBServiceCfgDes *)KBGetSerCfgDesPtr("service_cfg_xml");
  114. if(servDes==NULL)
  115. {
  116. DCDebug1("n kb_dc_getMainFreqCfgBuf: servDes is NULL");
  117. return NULL;
  118. }
  119. //取transactionId 低16位
  120. exId = (unsigned short)((servDes->transaction_id)&0xffff);
  121. es_pid = servDes->es_pid;
  122. sprintf(deffName, "%s", servDes->CfgName);
  123. DCDebug3("n kb_dc_getMovieCfg:  exid=%x", exId);
  124. dLen=KBDsmccGetDIITable(es_pid, exId, &buf);
  125. if(dLen<0)
  126. {
  127. buf =NULL;
  128. KBFreeSectionBuffer(buf);
  129. return NULL;
  130. }
  131. sec=buf;
  132. DCDebug2("Got DII...n");
  133. while(dLen>0)
  134. {
  135. secLen=(((unsigned short)(sec[1]<<8)|sec[2])&0x0fff)+3;
  136. if(ParseDIISection(deffName, sec, secLen)!=1)
  137. {
  138. DCDebug1("n ParseDIISection error");
  139. KBFreeSectionBuffer(buf);
  140. FreeDCFILE();
  141. FreeDCDIR();
  142. return NULL;
  143. }
  144. sec+=secLen;
  145. dLen-=secLen;
  146. }
  147. DCDebug2("parsed DII...n");
  148. //保存业务配置文件版本号
  149. kb_dc_SaveServCfgVersion(deffName);
  150. dLen = KBDsmccGetDDBTable(es_pid, (unsigned short)Get_firstModID_ByName(deffName), &buf);
  151. if(dLen<0)
  152. {
  153. DCDebug1("n KBDsmccGetDDBTable error");
  154. KBFreeSectionBuffer(buf);
  155. FreeDCFILE();
  156. FreeDCDIR();
  157. return NULL;
  158. }
  159. DCDebug2("Got DDB...n");
  160. sec=buf;
  161. while(TRUE)
  162. {              
  163. secLen=(((unsigned short)(sec[1]<<8)|sec[2])&0x0fff)+3;   
  164. res = ParseALLDDBSection(sec, (unsigned int)Get_firstModID_ByName(deffName));  
  165. sec+=secLen;
  166. dLen-=secLen;
  167. if(res==1||res<0) 
  168. break;
  169. }
  170. DCDebug2("Parsed DDB...n");
  171. KBFreeSectionBuffer(buf);
  172. if(cfgFile==NULL)
  173. {
  174. cfgFile=(unsigned char*)KBDcMalloc(GetDCFILE()->fileLength*sizeof(unsigned char));
  175. if(cfgFile==NULL) 
  176. {
  177. DCDebug1("malloc error!n"); 
  178. FreeDCFILE();
  179. FreeDCDIR();
  180. return NULL;
  181. }
  182. KBDcMemset(cfgFile, 0x00, GetDCFILE()->fileLength*sizeof(unsigned char));
  183. KBDcMemcpy((void*)cfgFile, (const void*)GetDCFILE()->section, (size_t)GetDCFILE()->fileLength);
  184. *xmlSize=GetDCFILE()->fileLength;
  185. FreeDCFILE();
  186. FreeDCDIR();
  187. }
  188. //test only
  189. kb_dc_moduleInfo_Test();
  190. if(*xmlSize==0) 
  191. return NULL;
  192. else
  193. return cfgFile;
  194. }
  195. /**
  196. *   kb_dc_CfgDiiCheck
  197.  *  DII 监测,主要监测版本号
  198.  * 
  199.  * 
  200.  * @return.
  201.  */
  202. int kb_dc_CfgDiiCheckByType(unsigned char type)
  203. {
  204. unsigned char *buf=NULL, *sec=NULL;
  205. int dLen=0, secLen=0;
  206. char deffName[KB_DCFILE_NAME_MAX_LEN];
  207. unsigned short es_pid;
  208. unsigned short exId;
  209. KB_DC_ServCfg_Map *servMap=NULL;
  210. KBServiceCfgDes *servDes=NULL;
  211. DCDIR *dir;
  212. int res;
  213. if(type==SERV_CFG_MAIN)
  214. {
  215. servDes = (KBServiceCfgDes *)KBGetSerCfgDesPtr("service_cfg_xml");
  216. if(servDes==NULL)
  217. {
  218. DCDebug1("n kb_dc_CfgDiiCheckByType: servDes is NULL");
  219. return 0;
  220. }
  221. //取transactionId 低16位
  222. exId = (unsigned short)((servDes->transaction_id)&0xffff);
  223. es_pid = servDes->es_pid;
  224. sprintf(deffName, "%s", servDes->CfgName);
  225. }
  226. else
  227. {
  228. servMap = KB_GetCurServMapItem(type);
  229. if(servMap==NULL)
  230. {
  231. DCDebug1("n KB_GetCurServMapItem NULL! type=%d",type);
  232. return 0;
  233. }
  234. //取transactionId 低16位
  235. exId = (unsigned short)(servMap->m_transactionsId&0xffff);
  236. es_pid= servMap->m_nPid;
  237. sprintf(deffName, "Group_@_PID%d_StbCfg.xml", es_pid);
  238. }
  239. dLen=KBDsmccGetDIITable(es_pid, exId, &buf);
  240. if(dLen<0)
  241. {
  242. KBFreeSectionBuffer(buf);
  243. return 0;
  244. }
  245. DCDebug2("Got DII...n");
  246. sec=buf;
  247. while(dLen>0)
  248. {
  249. secLen=(((unsigned short)(sec[1]<<8)|sec[2])&0x0fff)+3;
  250. if(ParseDIISection(deffName, sec, secLen)!=1)
  251. {
  252. DCDebug1("n ParseDIISection error");
  253. KBFreeSectionBuffer(buf);
  254. FreeDCFILE();
  255. FreeDCDIR();
  256. return 0;
  257. }
  258. sec+=secLen;
  259. dLen-=secLen;
  260. }
  261. DCDebug2("parsed DII...n");
  262. dir = GetDCDIR();
  263. if(dir!=NULL) dir->pid = es_pid;
  264. //module version check
  265. if(kb_dc_CfgVerCheck((unsigned char *)deffName, type))   //||kb_dc_FreqIsChanged())
  266. {
  267. DCDebug1("n -[kb_dc_CfgDiiCheck]-module version be changed! return===");
  268. if(type==SERV_CFG_MAIN)
  269. {
  270. FreeDCFILE();
  271. FreeDCDIR();
  272. }
  273. res = 1;
  274. }
  275. else
  276. {
  277. if(type==SERV_CFG_MAIN)
  278. DCDebug2("n -[kb_dc_CfgDiiCheck]-service configure file version not updated! return===");
  279. else
  280. DCDebug2("n -[kb_dc_CfgDiiCheck]-movie configure file version not updated! return===");
  281. FreeDCFILE();
  282. FreeDCDIR();
  283. res = 0;
  284. }
  285. kb_dc_LoadCurTs();
  286. //free memory before exit
  287. KBFreeSectionBuffer(buf);
  288. sec=NULL;
  289. return res;
  290. }
  291.    
  292. /**
  293. *   kb_dc_CfgDiiCheck
  294.  *  DII 监测,主要监测版本号
  295.  *  
  296.  * 
  297.  * @return.
  298.  */
  299. int kb_dc_CfgDiiCheck(void)
  300. {
  301. KB_DC_ServCfg_Map *servMap=NULL;
  302. int flag=1;
  303. DCDebug2("n -----kb_dc_getCfgVersion-------");
  304. servMap = KB_GetCurServMapItem(SERV_CFG_ADVERTISE);
  305. if(servMap==NULL)
  306. {
  307. DCDebug2("n KB_GetCurServMapItem NULL!  To recieve service configure files");
  308. //第一次搜索业务配置文件
  309. if(kb_dc_getMainFreqCfg()==0)
  310. {
  311. DCDebug1("n kb_dc_getMainFreqCfg failure!");
  312. return 0;
  313. }
  314. flag =1;
  315. }
  316. //如果刚搜索过业务配置文件,则不在同一接口再次检查版本号了
  317. if(flag==0)
  318. {
  319. if(kb_dc_CfgDiiCheckByType(SERV_CFG_MAIN)==1)
  320. {
  321. DCDebug2("n service configure version change!  To update service configure files");
  322. if(kb_dc_getMainFreqCfg()==0)
  323. {
  324. DCDebug1("n kb_dc_getMainFreqCfg failure!");
  325. return 0;
  326. }
  327. }
  328. }
  329. return (kb_dc_CfgDiiCheckByType(SERV_CFG_ADVERTISE));
  330. }
  331. /**
  332.  * get xml config file
  333.  * xmlSize < pointer to storage size of xml file >
  334.  
  335.  * @return pointer of xml file
  336.  */
  337. unsigned char *kb_dc_getCfgXml(unsigned long *xmlSize)
  338. {
  339. int  res;
  340. unsigned char *cfgFile=NULL;
  341. char deffName[KB_DCFILE_NAME_MAX_LEN];
  342. unsigned char *buf=NULL, *sec=NULL;
  343. int dLen=0, secLen=0;
  344. pDCDIR dir;
  345. DCDebug2("n  ----------kb_dsmcc_getCfgXml-------------n");
  346. dir = GetDCDIR();
  347. if(dir==NULL)
  348. {
  349. DCDebug1("kb_dc_getCfgXml: dir is NULLn"); 
  350. FreeDCFILE();
  351. return 0;
  352. }
  353. sprintf(deffName, "Group_@_PID%d_StbCfg.xml", dir->pid);
  354.        dLen = KBDsmccGetDDBTable(dir->pid, (unsigned short)Get_firstModID_ByName(deffName), &buf);
  355. if(dLen<0)
  356. {
  357. KBFreeSectionBuffer(buf);
  358. FreeDCFILE();
  359. FreeDCDIR();
  360. return 0;
  361. }
  362. DCDebug2("Got DDB...n");
  363. sec=buf;
  364. while(TRUE)
  365. {              
  366. secLen=(((unsigned short)(sec[1]<<8)|sec[2])&0x0fff)+3;   
  367. res = ParseALLDDBSection(sec, (unsigned int)Get_firstModID_ByName(deffName));  
  368. sec+=secLen;
  369. dLen-=secLen;
  370. if(res==1||res<0) 
  371. break;
  372. }
  373. DCDebug2("Parsed DDB...n");
  374. KBFreeSectionBuffer(buf);
  375. if(cfgFile==NULL)
  376. {
  377. cfgFile=(unsigned char*)KBDcMalloc(GetDCFILE()->fileLength*sizeof(unsigned char));
  378. if(cfgFile==NULL) 
  379. {
  380. DCDebug1("malloc error!n"); 
  381. FreeDCFILE();
  382. FreeDCDIR();
  383. return NULL;
  384. }
  385. KBDcMemset(cfgFile, 0x00, GetDCFILE()->fileLength*sizeof(unsigned char));
  386. KBDcMemcpy((void*)cfgFile, (const void*)GetDCFILE()->section, (size_t)GetDCFILE()->fileLength);
  387. *xmlSize=GetDCFILE()->fileLength;
  388. FreeDCFILE();
  389. FreeDCDIR();
  390. }
  391. //test only
  392. kb_dc_moduleInfo_Test();
  393. if(*xmlSize==0) 
  394. return NULL;
  395. else
  396. return cfgFile;
  397. }
  398. void kb_dc_Test0(unsigned short index)
  399. {
  400. int i=0, k=0;
  401. DCFILE *file=NULL;
  402. DCDebug3("n --------------kb_dc_Test0----------------");
  403. file=GetDCFILE();
  404. DCDebug3("n module %d  have total %d blocks ",index,  file->BufStatus.modStat[index].blockCount);
  405. for(i=0;i<file->BufStatus.modStat[index].blockCount;i++)
  406. {
  407. if(file->BufStatus.modStat[index].blockStat[i]==FILLED)
  408. {
  409. k++;
  410. DCDebug3("n block %d been received!!!",i);
  411. }
  412. }
  413. DCDebug3("n total %d  block been received!!!",k);
  414. k=0;
  415. for(i=0;i<file->BufStatus.modStat[index].blockCount;i++)
  416. {
  417. if(file->BufStatus.modStat[index].blockStat[i]==EMPTY)
  418. {
  419. k++;
  420. DCDebug3("n block %d not received!!!",i);
  421. }
  422. }
  423. DCDebug3("n total %d  block not received!!!",k);
  424. }
  425. int kb_dc_OneByOneGet(unsigned short esPid, unsigned short firstModuleId, unsigned short index)
  426. {
  427. unsigned char *sec=NULL;
  428. int i=0, k=0;
  429. unsigned short secLen = 0;
  430. DCFILE *file=NULL;
  431. unsigned long ErrCode;
  432. int res = 0;
  433. DCDebug2("n --------------kb_dc_OneByOneGet----------------");
  434. kb_dc_Test0(index);
  435. file=GetDCFILE();
  436. for(i=0;i<file->BufStatus.modStat[index].blockCount;i++)
  437. {
  438. if(file->BufStatus.modStat[index].blockStat[i]==EMPTY)
  439. {
  440. k = 0;
  441. while(k<=5)
  442. {
  443. DCDebug3("n to re-receive block %d ",i);
  444. ErrCode = KB_DC_FilterReSet( esPid, 0x3c, firstModuleId+index, UNSET_PARAM, i);
  445. if ( ErrCode != Err_OK )return -1;
  446. KBDcMemset(byFilterBuf, EMPTY, PSI_SECTION_SIZE);
  447. ErrCode  = KB_DC_GetSection(byFilterBuf, &secLen);
  448. if(Err_OK != ErrCode)
  449. {
  450. DCDebug1("nr Get block %d error[%d].rn",i, ErrCode );
  451. return -2;
  452. }
  453. if(0 != crc32(byFilterBuf, secLen))
  454. {
  455. k++;
  456. DCDebug1("[kb_dc_getSingleMovie]:Get block %d Crc error in filter process.rn" , i);
  457. if(k>5)
  458. return -3;
  459. else
  460. continue;
  461. }
  462. sec = byFilterBuf;
  463. res = ParseALLDDBSection(sec, firstModuleId);  
  464. //数据全部收取完毕,跳出循环
  465. if(res==1)
  466. return 1;
  467. else if(res==0)
  468. break;
  469. else 
  470. return -4;
  471. }
  472. }
  473. }
  474. return 0;
  475. }
  476. /**
  477.  * get single movie data
  478.  * @return
  479.  */
  480. int kb_dc_getSingleMovie(unsigned short esPid, unsigned short firstModuleId,
  481. const unsigned char *fName, long fSize, unsigned char *dMovie)
  482. {
  483. unsigned char  *sec=NULL;
  484. int  i=0, modulesCnt=0, blocksCnt=0;
  485. unsigned short secLen = 0;
  486. unsigned short moduleId=firstModuleId;
  487. DCFILE *file=NULL, *pfile=NULL;
  488. int lastModuleSize=0;
  489. unsigned long ErrCode, Err_Counter = 0;
  490. int res;
  491. blocksCnt=(int)fSize/4066+(((int)fSize%4066==0)?0:1);
  492. modulesCnt=blocksCnt/256+((blocksCnt%256==0)?0:1);
  493. lastModuleSize=(int)fSize-(modulesCnt-1)*256*4066;
  494. pfile = (DCFILE*)KBDcMalloc(sizeof(DCFILE));
  495. if(pfile==NULL) 
  496. {
  497. DCDebug1("nfile malloc error");
  498. return 0;
  499. }
  500. InitFileStruct(pfile);
  501. pfile->section = (unsigned char *)KBDcMalloc(fSize);
  502. if(pfile->section==NULL) 
  503. {
  504. DCDebug1("n filesection malloc error");
  505. FreeOneDCFILE(pfile);
  506. return 0;
  507. }
  508. KBDcMemset(pfile->section, 0, fSize);
  509. //初始化buffer status
  510. if(kb_dc_bufferStatusBuild(pfile, blocksCnt) == 0)
  511. {
  512. DCDebug1("n kb_dc_bufferStatusBuild failed");
  513. FreeOneDCFILE(pfile);
  514. return 0;
  515. }
  516. //save pfile to gDCFile
  517. SetDCFILE(pfile);
  518. pfile = NULL;
  519. file=GetDCFILE();
  520. if(file==NULL)
  521. {
  522. DCDebug1("n GetDCFILE NULL");
  523. FreeOneDCFILE(file);
  524. return 0;
  525. }
  526. file->fileLength=fSize;
  527. strcpy((char*)file->fileName, (const char*)fName); 
  528. file->position=0;
  529. DCDebug3("nn ----modulesCnt =%d    blocksCnt=%d",modulesCnt, blocksCnt);
  530. for(i=0; i<modulesCnt; i++)
  531. {
  532. moduleId = firstModuleId + i;
  533. ErrCode = KB_DC_FilterReSet( esPid, 0x3c, moduleId, UNSET_PARAM, UNSET_PARAM);
  534. if ( ErrCode != Err_OK)
  535. {
  536. FreeDCFILE();
  537. return 0;
  538. }
  539. ResetTimeOut();
  540. while(kb_dc_moduleIsEnd(file,i)!=1)
  541. {
  542. ErrCode  = KB_DC_GetSection(byFilterBuf, &secLen);
  543. if(Err_OK != ErrCode)
  544. {
  545. DCDebug1("nr Get section error[%d].rn",ErrCode );
  546. FreeDCFILE();
  547. return 0;
  548. }
  549. #if 1
  550. if(0 != crc32(byFilterBuf, secLen))
  551. {
  552. DCDebug1("[kb_dc_getSingleMovie]:block %d Crc error in filter process.rn", byFilterBuf[6]);
  553. Err_Counter++;
  554. if(Err_Counter>=30)
  555. {
  556. DCDebug1("[kb_dc_getSingleMovie]:Receive packet too error!rn");
  557. KB_DC_FilterStop();
  558. FreeDCFILE();
  559. return 0;
  560. }
  561. continue;
  562. }   
  563. #endif
  564. sec = byFilterBuf;
  565. res = ParseALLDDBSection(sec, firstModuleId);  
  566. //数据全部收取完毕,跳出循环
  567. if(res==1) break;
  568. //冗余处理
  569. if(res<0)
  570. {
  571. if(res == -1 )
  572. {
  573. DCDebug1("n parameter error, please check the cofigure file!");
  574. KB_DC_FilterStop();
  575. FreeDCFILE();
  576. return 0;
  577. }
  578. //循环次数过多,采用one-by-one filter mode收取剩余的block
  579. else if(res==-2)
  580. {
  581. KB_DC_FilterStop();
  582. KB_OSPTaskDelay(500);
  583. res = kb_dc_OneByOneGet(esPid, firstModuleId, i);
  584. if(res<0) //error in filtering
  585. {
  586. DCDebug1("n The oneByone get mode also failed[%d", res);
  587. FreeDCFILE();
  588. return 0;
  589. }
  590. else if(res==1) //all file data over
  591. {
  592. break;
  593. }
  594. else //one module data over, only break while
  595. {
  596. DCDebug4("n -just do nothing");
  597. }
  598. }
  599. }
  600. }
  601. }
  602. if(dMovie==NULL) 
  603. {
  604. FreeDCFILE();
  605. return 0;
  606. }
  607. else 
  608. {      
  609. KBDcMemcpy((void*)dMovie, (const void*)GetDCFILE()->section, (size_t)GetDCFILE()->fileLength);
  610. FreeDCFILE();
  611. return 1;
  612. }
  613. }
  614.    
  615. /**
  616.  * get movie data by information
  617.  * pInfo < information to get data and buf to storage data >
  618.  
  619.  * @return true, false otherwise.
  620.  */
  621. bool kb_dc_getMovie(KB_MovieInfoNode *pInfo)
  622. {
  623. if(pInfo==NULL) 
  624. return FALSE;  
  625. DCDebug2("n KBDsmccGetMovie():pid=[%d], fMid=[%d], name=[%s], size=[%d]...n", pInfo->st_MovieInfo.m_nPid, 
  626. pInfo->st_MovieInfo.m_nFirstModuleId, pInfo->st_MovieInfo.m_strName, pInfo->st_MovieInfo.m_nSize);
  627. if(!kb_dc_getSingleMovie(pInfo->st_MovieInfo.m_nPid, pInfo->st_MovieInfo.m_nFirstModuleId,
  628. pInfo->st_MovieInfo.m_strName, pInfo->st_MovieInfo.m_nSize,
  629. pInfo->st_MovieInfo.m_pData))
  630. {
  631. DCDebug2("n Got Movie error!!! n");
  632. return FALSE;
  633. }
  634. else 
  635. DCDebug2("nGot Movie Sucess...n");
  636. return TRUE;
  637. }
  638. void PrintfData(unsigned char *buf, unsigned int len)
  639. {
  640.   int i;
  641.   unsigned int line = 0x00000000;
  642.   DCDebug4("buf_len=[%d]n", len);
  643.          for(i=0;i<len;i++) 
  644. {   
  645.   if(i==0)
  646.   {
  647.          DCDebug4("n");
  648.          DCDebug4("%04x: ",line);
  649.   }
  650.         
  651.       DCDebug4("%4.2x",buf[i]);  
  652.   if((i+1)%16==0)
  653.   {      
  654.   line = line + 16;
  655.   DCDebug4("n");
  656.   DCDebug4("%04x: ",line);   
  657.   }
  658.     
  659. }  
  660. DCDebug4("n print endn");
  661. return;
  662. }