atapi_if720.c
上传用户:poi891205
上传日期:2013-07-15
资源大小:9745k
文件大小:49k
源码类别:

DVD

开发平台:

C/C++

  1. /*=================================================================
  2. atapi_if.c: ATAPI INTERFACE
  3. 2000-01-01         Created  by 
  4. 2002-06-12 08:42AM Modified by cyue
  5. 2004-04-16         Modified by Terry
  6. Copyright(c)2000-2002 by Sunplus Technology (HsingChu) Co., Ltd.
  7.                    ALL RIGHTS RESERVED
  8. =================================================================*/
  9. //#define NPRINTF
  10. //#define NEPRINTF
  11. #include "config.h"
  12. #include "misc.h"
  13. #include "global.h"
  14. #include "ata.h"
  15. #include "image.h"
  16. #include "fs.h"
  17. #include "func.h"
  18. #include "cderr.h"
  19. #include "avd.h"
  20. #include "drv.h"
  21. #include "atapi_if.h"
  22. #include "pu8560.h"
  23. extern UINT8   bReadSubChannel; //Jeff 20020927
  24. extern UINT16  iBlockLen;
  25.  
  26. //#define UDETEST
  27. #ifndef DVDRELEASE
  28. //#define DBG_ATAPI
  29. #endif
  30. #ifndef DBG_ATAPI
  31. #undef  printf
  32. #undef  print_block
  33. #define printf(f, a...) do {} while (0)
  34. #define print_block(x,y) do {} while (0)
  35. #endif
  36. #define POLLING_MODE //if test interrupt mode, mark this define
  37. #ifdef DVD728
  38. #ifdef DVD_SERVO
  39. #define DVDDSP_CONFIG_DEF   ATA_INTR_MODE //ATAPI_INTR_MODE
  40. #else
  41. #define DVDDSP_CONFIG_DEF   ATA_POLLING_MODE //ATAPI_INTR_MODE
  42. #endif
  43. #define WaitIRQ()   while ((regs0->dvddsp_function & DEVICE_INT) == 0) ;//for test DRQ mode
  44. #else
  45. #define POLLING_MODE //if test interrupt mode, mark this define
  46. #define DVDDSP_CONFIG_DEF   ATAPI_ADV_POLLING
  47. #endif
  48. #define SHORT_TIME_OUT      400//4 sec
  49. #define NORMAL_TIME_OUT     700//7 sec 
  50. #define LONG_TIME_OUT       800//8 sec
  51. #define MAX_TIME_OUT       1000//10 sec
  52. /*
  53. * variable
  54. */
  55. /*UINT8 pc[12];
  56. UINT8 pc_rdata[32];*/
  57. UINT16  request_sense_flag;
  58. UINT8 DiscType = CDDVD;// 0: DISC_VCD, 1: DISC_DVD
  59. UINT8 CSSEnable = 0;
  60. /*
  61. * external function
  62. */
  63. UINT32 udf_find_anchor(void);
  64. void disp_fan_in(void);
  65. void flush_atapi(void);;
  66. void cppm_init( UINT32 );
  67. // for compatible issue
  68. int atapi_read_error(void)      {return 0;}
  69. int atapi_standby_mode(void)    {return 0;}
  70. #ifndef DVD_SERVO
  71. void SetIDETimeOut(UINT32 time) {}
  72. #endif
  73. #ifndef ROM_ATA_SHARE_BUS           
  74. UINT16
  75. atapi_reg_read(UINT8 addr)
  76. {   
  77.     UINT32 i=0;
  78.     
  79.     regs0->dvddsp_function = (addr<<8) | ATAPI_READ | REG_MODE | HOST_START;    
  80.     while ((regs0->dvddsp_function & HOST_BUSY) != 0)
  81.     {
  82.         i++;        
  83.         if(i>0xfffffff0)
  84.         {
  85.             printf(__FUNCTION__" ==> always busyn");
  86.             break;
  87.         }
  88.     }
  89.     //NowPrint("@");
  90.     if (addr == IDE_DATA)
  91.         return regs0->dvddsp_blocklength;
  92.     
  93.     return (UINT16) (regs0->dvddsp_function & 0xFF);
  94. }
  95. void
  96. atapi_reg_write(UINT8 addr, UINT16 data)
  97. {   
  98.     UINT32 i=0;
  99.     if (addr == IDE_DATA) {
  100.         regs0->dvddsp_blocklength = data;
  101.         regs0->dvddsp_function = (addr<<8) | ATAPI_WRITE | REG_MODE | HOST_START;
  102.     } else {
  103.         regs0->dvddsp_function = (data & 0x00FF) | 
  104.             (addr<<8) | ATAPI_WRITE | REG_MODE | HOST_START;
  105.     }
  106.     while ((regs0->dvddsp_function & HOST_BUSY) != 0) 
  107.     {
  108.         i++;        
  109.         if(i>0xfffffff0)
  110.         {
  111.             printf(__FUNCTION__" ==> always busyn");
  112.             break;
  113.         }
  114.     }
  115. }
  116. #endif
  117. #ifdef DVD728
  118. void read_device_signature(UINT8 dev)
  119. {
  120.     unsigned cylinder_hi;
  121.     unsigned sector_cnt;
  122.     printf("device %x sign.n", dev);
  123.     atapi_reg_write(IDE_DEVICE_HEAD, (dev) ? 0x10 : 0x00);
  124.     printf("tdevice%x's diag. code = %xn", dev, atapi_reg_read(IDE_ERROR));
  125.     sector_cnt = atapi_reg_read(IDE_SECTOR_CNT);
  126.     if (sector_cnt)
  127.     {
  128.         cylinder_hi = atapi_reg_read(IDE_CYLINDER_HI);
  129.         if (cylinder_hi == 0xeb) printf("implement PACKET commandn");
  130.         else if (cylinder_hi == 0x00) printf("NOT implement PACKET commandn");
  131.     }
  132.     else
  133.     {
  134.         printf("device%x occurs UNKNOWN read_device_signature %02xn", dev, sector_cnt);
  135.     }
  136. }
  137. #endif
  138. // ATAPI Procedure
  139. // return 1: ERR, 0: OK
  140. //inline UINT8 
  141. UINT8 
  142. atapi_is_error(void)
  143. {
  144. //  return (atapi_reg_read(IDE_STATUS) & STATUS_ERR);
  145.     if ((atapi_reg_read(IDE_STATUS) & STATUS_ERR) != 0) {
  146.         printf("atapi status error      n");
  147.         return ATAPI_ERROR;
  148.     }
  149.     return ATAPI_OK;
  150. }
  151. #ifdef DVD728
  152. UINT8
  153. atapi_rst(UINT8 mode)
  154. {
  155.     UINT16  old_config,i;
  156.     UINT16  status=0;
  157.     printf(__FUNCTION__": mode:%xnn",mode);
  158.     if (mode & DSP_HOST_RESET) {
  159.         if (mode & ATA_HW_RESET)
  160.             old_config = 0x0000;
  161.         else
  162.             old_config = regs0->dvddsp_public;
  163.         regs0->dvddsp_public =  old_config|ATAPI_DEVICE|ATAPI_HOST_RESET;
  164.         delay(1);   // assert RESET - at least 25us
  165.         regs0->dvddsp_public = old_config;
  166.         delay(5);   // negate_wait 2 ms
  167.         if(mode & ATA_HW_RESET)
  168.         {
  169.             regs0->dvddsp_ata_pio_cycle = 0x7764;       // set ATAPI_PIO_CYCLE, PIO-MODE4
  170.             regs0->dvddsp_ata_udma_cycle = 0x4924;      // set ATAPI_UDMA_CYCLE
  171.             regs0->dvddsp_ata_config = 0x0000 | ATA_INTR_MODE;
  172.             // setup UDE configuration (useless now)
  173.             regs0->dvddsp_ude_config = 0x0000;
  174.             regs0->dvddsp_public = ATAPI_DEVICE|ATAPI_DEV_HRESET;
  175.             delay(1);
  176.             regs0->dvddsp_public = ATAPI_DEVICE;
  177.             delay(5);
  178. #ifdef ROM_ATA_SHARE_BUS    
  179.                         #define RST_GPIO   4        
  180.             //atapi hw reset
  181.             
  182.             regs0->gpio_master[RST_GPIO/16] |= (0x1)<<(RST_GPIO%16);
  183.             regs0->gpio_oe[RST_GPIO/16]     |= (0x1)<<(RST_GPIO%16);// -> 0         
  184.             regs0->gpio_out[RST_GPIO/16]    &= ~((0x1)<<(RST_GPIO%16));// -> 0         
  185.                 
  186.                 printf("<o0 >n");
  187.                 
  188.                 delay(1);
  189.                 regs0->gpio_out[RST_GPIO/16]    |= ((0x1)<<(RST_GPIO%16));// -> 1                           
  190.                 printf("<o1 >n");
  191.                 delay(5);
  192.                 //while(1);
  193. #endif       
  194.             // select device
  195.             atapi_reg_write(IDE_DEVICE_HEAD, (DEV) ? 0x10: 0x00);
  196.             do {
  197.                 status = atapi_reg_read(IDE_STATUS);
  198.             } while (status & STATUS_BSY);
  199.             
  200.             atapi_reg_write(IDE_DEVICE_CTRL, 0x00);
  201.           
  202.             // read read_device_signature
  203.             //read_device_signature(1);
  204.             //read_device_signature(0);
  205.         }
  206.     }
  207.     if(mode&ATA_SW_RESET)
  208.     { 
  209.         atapi_reg_write(IDE_DEVICE_CTRL, 0x04);
  210.         delay(5);
  211.         atapi_reg_write(IDE_DEVICE_CTRL, 0x00);
  212.         
  213.         delay(3);
  214.         atapi_reg_write(IDE_DEVICE_HEAD, (DEV) ? 0x10: 0x00);
  215.         do {
  216.             status = atapi_reg_read(IDE_STATUS);
  217.         } while (status & STATUS_BSY);
  218.         regs0->dvddsp_ata_config = 0x0000 | ATA_INTR_MODE;
  219.         atapi_reg_write(IDE_DEVICE_CTRL, 0x00);
  220.         // set UDE config
  221.         regs0->dvddsp_ude_config = 0x0000;
  222.         
  223.         // read read_device_signature
  224.         //read_device_signature(1);
  225.         //read_device_signature(0);
  226.         
  227.         // set ATAPI_PIO_CYCLE, PIO-MODE4
  228.         regs0->dvddsp_ata_pio_cycle = 0x7764;
  229.         
  230.         // set ATAPI_UDMA_CYCLE
  231.         regs0->dvddsp_ata_udma_cycle = 0x4924;
  232. #if 0
  233.         if(atapi_chk_time_out(WAIT_STATUS_NO_BSY,LONG_TIME_OUT))
  234.         {           
  235.             printf(__FUNCTION__" ==> Timout 1n");          
  236.             return ATAPI_ERROR;
  237.         }
  238. #endif
  239.     }
  240.     if(mode&ATA_WAIT_RDY)
  241.     {//terry,2002/5/31 09:56PM, FUSS request: open must be avaible
  242.         //dev_status_flag|=ATAPI_RETRY_READY;
  243.         for(i=0;i<100;i++)
  244.         {    
  245.             if(atapi_p_test_unit_ready()==0)
  246.             {
  247.                 //dev_status_flag&=~ATAPI_RETRY_READY;
  248.                 return 0;//test unit ready
  249.             }    
  250.             delay(100);         
  251.         }
  252.         //dev_status_flag&=~ATAPI_RETRY_READY;
  253.         printf("!!!!!!STILL Not Readyn");
  254.         return ATAPI_ERROR;
  255.     }
  256.     return 0;
  257. }
  258. #else
  259. UINT8
  260. atapi_rst(UINT8 mode)
  261. {
  262.     UINT16 old_config,i;    
  263.     
  264.     printf(__FUNCTION__": reset mode:%xnn",mode);
  265.       
  266.     if(mode&DSP_HOST_RESET)
  267.     {
  268.         if(mode&ATA_HW_RESET)
  269.             old_config=0;
  270.         else
  271.             old_config=regs0->dvddsp_config ;       
  272.         
  273.         regs0->dvddsp_config =  old_config|ATAPI_HOST_RESET;
  274.     
  275.         delay(1);
  276.         regs0->dvddsp_config = old_config;
  277.         delay(1);
  278.        
  279.         if(mode&ATA_HW_RESET)
  280.         {
  281.             
  282.             regs0->dvddsp_config = ATAPI_DEV_HRESET;
  283.             delay(100);
  284.             regs0->dvddsp_config = 0;
  285.             delay(1);
  286.         }
  287.     }
  288.     
  289.     
  290.     if(mode&ATA_SW_RESET)
  291.     { 
  292.         atapi_reg_write(IDE_DEVICE_HEAD, (DEV) ? 0x10: 0x00);
  293.         atapi_reg_write(IDE_FEATURE, 0x00);
  294.         atapi_reg_write(IDE_SECTOR_CNT, 0x00);
  295.         atapi_reg_write(IDE_SECTOR_NUM, 0x00);
  296.         atapi_reg_write(IDE_CYLINDER_LO, 0x00);
  297.         atapi_reg_write(IDE_CYLINDER_HI, 0x00);
  298.         atapi_reg_write(IDE_COMMAND, 0x08);/*Drive reset*/  
  299.         
  300.         delay(3);        
  301.         if(atapi_chk_time_out(WAIT_STATUS_NO_BSY,LONG_TIME_OUT))
  302.         {           
  303.             printf(__FUNCTION__" ==> Timout 1n");          
  304.             return ATAPI_ERROR;
  305.         }
  306.     }
  307.     
  308.     if(mode&ATA_WAIT_RDY)
  309.     {//terry,2002/5/31 09:56PM, FUSS request: open must be avaible
  310.         //dev_status_flag|=ATAPI_RETRY_READY;
  311.         for(i=0;i<100;i++)
  312.         {    
  313.             
  314.             
  315.             
  316.             //polling();
  317.             //if(sys_cmd==(CMD_FUNC|CMD_FUNC_OPEN))
  318.                 // break;
  319.             
  320.             if(atapi_p_test_unit_ready()==0)
  321.             {
  322.                 //dev_status_flag&=~ATAPI_RETRY_READY;
  323.                 return 0;//test unit ready
  324.             }    
  325.                 
  326.                 
  327.             delay(100);         
  328.         }
  329.         
  330.         //dev_status_flag&=~ATAPI_RETRY_READY;
  331.         printf("!!!!!!STILL Not Readyn");
  332.         return ATAPI_ERROR;
  333.     }
  334.     
  335.     return 0;
  336. }
  337. #endif
  338. UINT8 
  339. atapi_write_block(UINT8 *p)
  340. {
  341. //  UINT32 i=0;
  342.     
  343.     //atapi_device_sel();
  344.     /*****
  345.     * Write any required command parameter to the Features, Sector
  346.     * Count, Sector Number, Cylinder High, Cylinder Low, and Device/
  347.     * Head registers
  348.     * 1. Features reg. (09h):
  349.     *   Normal: 0x00
  350.     *   NOP:    0x00, return command aborted and aborted
  351.     *       any outstanding queued commands.
  352.     *   Set Features: 0x03, set transfer mode.
  353.     * 2. Sector Count reg. (0Ah):
  354.     *   Set Features:   0x00, PIO default mode
  355.     *           0x22, Multiword DMA mode, Mode 2
  356.     * 3. Cylinder Low reg. (0Ch)
  357.     * 4. Cylinder High reg. (0Dh)
  358.     * 5. Device/Head reg. (0Eh) with appropriate DEV
  359.     *****/
  360.     atapi_reg_write(IDE_FEATURE, *p);
  361.     atapi_reg_write(IDE_SECTOR_CNT, *(p+1));
  362.     atapi_reg_write(IDE_SECTOR_NUM, *(p+2));
  363.     atapi_reg_write(IDE_CYLINDER_LO, 0xFE);
  364.     atapi_reg_write(IDE_CYLINDER_HI, 0xFF);
  365.     atapi_reg_write(IDE_DEVICE_HEAD, (DEV) ? 0x10: 0x00);
  366.     /*****
  367.     * Write command code to the command register (The host shall
  368.     * wair at least 400ns before reading the Status register to
  369.     * ensure the content is valid
  370.     * 1. NOP:           0x00
  371.     * 2. ATAPI PACKET COMMAND:  0xa0
  372.     * 3. IDENTIFY PACKET DEVICE:    0xa1
  373.     * 4. CHECK POWER MODE:  0xE5 
  374.     * 5. SLEEP:         0xE6
  375.     *****/
  376.     atapi_reg_write(IDE_COMMAND, *(p+3));
  377.     /*****
  378.      * The host shall wait at least 400ns before reading the Status
  379.      * register to ensure the content is valid.
  380.      *****/
  381.     //delay(1);
  382.   /*** Host: Read Status register until BSY=0 ***/
  383.     
  384.     
  385.     if(atapi_chk_time_out(WAIT_ALT_NO_BUSY,LONG_TIME_OUT))
  386.       {          
  387.                 
  388.             printf(__FUNCTION__" ==> Timout 1n");
  389.             
  390.             return ATAPI_ERROR;
  391.             
  392.             
  393.      }
  394.     
  395.     
  396.     
  397.     return atapi_is_error();
  398. }
  399. UINT8   
  400. atapi_send_data(UINT8 *p, int n)
  401. {
  402.     int i=0;
  403. //  UINT32 j;
  404.     
  405.     /*** Host: Read Status register until BSY=0 & DRQ=1 ***/
  406.     
  407.     
  408.     
  409.          if(atapi_chk_time_out(WAIT_DRQ_OK,LONG_TIME_OUT))
  410.          {          
  411.                 
  412.             printf(__FUNCTION__" ==> Timout 1n");
  413.             
  414.             
  415.             return ATAPI_ERROR;
  416.             
  417.             
  418.          }
  419.     
  420.     
  421.     
  422.     for (i=0; i<n; i+=2)
  423.     {
  424.         atapi_reg_write(IDE_DATA,
  425.         ( ((UINT16)(*(p+i+1))) << 8) | (UINT16)(*(p+i)) );
  426.     }
  427.     /*****
  428.     * Host: wait device to clear BSY=0, it indicates command is complete.
  429.     *****/
  430.     
  431.     
  432.     
  433.          if(atapi_chk_time_out(WAIT_STATUS_NO_BSY,LONG_TIME_OUT))
  434.         {          
  435.                 
  436.             printf(__FUNCTION__" ==> Timout 2n");
  437.             
  438.             atapi_is_error();
  439.             return ATAPI_ERROR;
  440.             
  441.             
  442.         }
  443.     
  444.     
  445.     /*****
  446.     * Host: read Alternate status register and ignore results. This prevent
  447.     *   polling host from reading status before it is valid.
  448.     * Note - Device is command complete, it should perform its error routine if
  449.     *   an error is reported
  450.     *****/
  451.     atapi_reg_read(IDE_ALT_STATUS);
  452.     return atapi_is_error();
  453. }
  454. UINT8   
  455. atapi_receive_data(UINT8 *p, int n)
  456. {
  457.     UINT16 USER_DATA;
  458.     int i, j,status;
  459. //  UINT32 k;
  460.         
  461. #ifdef USE_HDD
  462.     //Verdure add, cyue:2002-06-12 04:45PM modified
  463.     if (hd_play) return atapi_is_error();
  464. #endif
  465.         
  466.     /*****
  467.      * Host: read Alternate status register and ignore results. This
  468.      * prevent polling host from reading status before it is valid
  469.      *****
  470.      */
  471.     atapi_reg_read(IDE_ALT_STATUS);
  472.    j = 0;
  473.    do {
  474.         /*****
  475.         * Host: read Status register until BSY=0 & DRQ=1. Status register
  476.         * is read to clear pending interrput
  477.         *****/
  478.         
  479.         #ifdef POLLING_MODE
  480.             if(atapi_chk_time_out(WAIT_DRQ_OK,LONG_TIME_OUT))
  481.         {          
  482.                 
  483.             printf(__FUNCTION__" ==> Timout 1n");
  484.             cderr_handler(CDERR_ATA_BUSY);
  485.             return ATAPI_ERROR;
  486.             
  487.          }
  488.         #else
  489.     
  490.         while ( (atapi_reg_read(IDE_STATUS) & STATUS_BSY) ||
  491.              !(atapi_reg_read(IDE_STATUS) & STATUS_DRQ) ) 
  492.         
  493.         {
  494.         
  495.             WaitIRQ();
  496.         }   
  497.             
  498.         #endif
  499.                
  500.           status=atapi_reg_read(IDE_STATUS);      
  501.           if((status==0x51)||(status==0x50))//BSY=0, DRQ=0, DSC=1
  502.         {          
  503.                 
  504.             printf(__FUNCTION__" ==> skip directlyn");
  505.             
  506.             return ATAPI_ERROR;
  507.             
  508.          }        
  509.         
  510.                 
  511.                 
  512.      
  513.      
  514.         i = atapi_reg_read(IDE_CYLINDER_HI);
  515.         i = atapi_reg_read(IDE_CYLINDER_LO) + i * 256;
  516.       //printf("data length: %dn", i);
  517.       if (i > n)
  518.          i = n;
  519.      
  520.       /*****
  521.       * DRQ block transfer
  522.       *****/
  523.         for (; i > 0; i-=2)
  524.         {
  525.             USER_DATA   = atapi_reg_read(IDE_DATA);
  526.             *(p+j+1)    = USER_DATA >> 8;
  527.             *(p+j)  = USER_DATA & 0xff;
  528.          j += 2;
  529.          n -= 2;
  530.         }
  531. //ycwen 2004/08/10
  532. #ifdef NO_DVD_SERVO
  533. return ATAPI_ERROR;
  534. #endif
  535.    } while (n != 0);
  536.     /*****
  537.     * Host: wait device to clear BSY=0, it indicates command is complete.
  538.     *****/
  539.     
  540.     
  541.     if(atapi_chk_time_out(WAIT_STATUS_NO_BSY,LONG_TIME_OUT))
  542.     {          
  543.                 
  544.             printf(__FUNCTION__" ==> Timout 2n");
  545.             
  546.             //cderr_handler(CDERR_ATA_BUSY);
  547.             if(atapi_is_error()==0)
  548.             printf(__FUNCTION__" ==> !!!!ATAPI ERROR n");
  549.             
  550.             return ATAPI_ERROR;
  551.             
  552.             
  553.     }
  554.     
  555.     
  556.     
  557.     
  558.     
  559.     
  560.     /*****
  561.     * Host: read Alternate status register and ignore results. This 
  562.     *   polling host from reading status before it is valid.
  563.     * Note - Device is command complete, it should perform its error routine if
  564.     *   an error is reported
  565.     *****/
  566.     atapi_reg_read(IDE_ALT_STATUS);
  567.     return atapi_is_error();
  568. }
  569. // ATA command
  570. // packet size 12
  571. #ifdef  POLLING_MODE
  572. //terry,2002/8/22 08:29PM
  573. const UINT8 block_data[7] = {0, 0, 0, 0xFE, 0xFF, 0, 0xA0 };
  574. #else
  575. const UINT8 block_data[7] = {0, 0, 0, 0x00, 0x08, 0, 0xA0 };
  576. #endif
  577. UINT8 
  578. atapi_do_packet(UINT8 *pck)
  579. {
  580.     int i;
  581.     UINT32 wait_time;
  582.     
  583. #ifdef USE_HDD
  584.     //Verdure add, cyue:2002-06-12 04:45PM modified
  585.     if (hd_play)
  586.     {
  587.              hdd_do_packet(wait_time,pck);
  588.              return 0;
  589.     }
  590. #endif
  591.     
  592.     if(dev_status_flag&READ_PRESENT_DATA)
  593.         wait_time=SHORT_TIME_OUT;
  594.     else
  595.         wait_time=NORMAL_TIME_OUT;
  596.         
  597.     if(atapi_chk_time_out(WAIT_ALT_NO_BUSY,wait_time))
  598.     {          
  599.         printf(__FUNCTION__" ==> Timout 1n");          
  600.         cderr_handler(CDERR_ATA_BUSY);
  601.         return ATAPI_ERROR;
  602.     }
  603.      
  604.     for (i = 0; i <= 6; i++)    
  605.         atapi_reg_write(i + 0x11, block_data[i]);
  606.         
  607.     if(atapi_chk_time_out(WAIT_ALT_NO_BUSY,wait_time))
  608.     {                       
  609.             printf(__FUNCTION__" ==> Timout 2n");          
  610.             cderr_handler(CDERR_ATA_BUSY);
  611.             return ATAPI_ERROR;
  612.     }
  613.     
  614.     i = atapi_reg_read(IDE_ALT_STATUS); 
  615.     if ((i & STATUS_ERR) != 0) 
  616.     {
  617.         printf("write_block in do_packet error:%xn",i);
  618.         return ATAPI_ERROR;
  619.     }
  620.     if(atapi_chk_time_out(WAIT_DRQ_OK,wait_time))
  621.     {                   
  622.             printf(__FUNCTION__" ==> Timout 3n");      
  623.             cderr_handler(CDERR_ATA_BUSY);
  624.             return ATAPI_ERROR;
  625.     }
  626.     
  627.     for (i=0; i<12; i+=2)
  628.     {
  629.         atapi_reg_write(IDE_DATA,
  630.         ( ((UINT16)(*(pck+i+1))) << 8) | (UINT16)(*(pck+i)) );
  631.     }
  632.     
  633. #ifdef WAIT_ATA_ITRQ    
  634.     if(atapi_chk_time_out(WAIT_IRQ,MAX_TIME_OUT))
  635.     {          
  636.                 
  637.             printf(__FUNCTION__" ==>< IRQ Timout >n");
  638.             cderr_handler(CDERR_ATA_BUSY);
  639.             return ATAPI_ERROR;
  640.             
  641.     }
  642. #endif  
  643.     
  644.                  //Actually, when timeout loader is still busy,  
  645.                  //So I think output next command to loader, it will let loader hang up
  646.                  //Normal method, it should do software reset to reset loader and return ATAPI ERROR
  647.                  //But some loader will support software reset function
  648.                  
  649.                
  650.         #ifdef POLLING_MODE
  651.         if(atapi_chk_time_out(WAIT_STATUS_NO_BSY,wait_time))
  652.         {          
  653.                 
  654.             printf(__FUNCTION__" ==> Timout 4n");
  655.             
  656.             cderr_handler(CDERR_ATA_BUSY);
  657.             return ATAPI_ERROR;
  658.             
  659.             
  660.         }
  661.         #else
  662.         WaitIRQ();
  663.         while (atapi_reg_read(IDE_STATUS) & STATUS_BSY) 
  664.         {
  665.          ;
  666.         }
  667.         
  668.         
  669.         #endif
  670.     
  671.     
  672.     atapi_reg_read(IDE_ALT_STATUS);
  673.     if (atapi_is_error() != 0) {
  674.         printf("send_data in do_packet errorn");       
  675.          print_block(pck, 12);
  676.      //  atapi_p_request_sense(pc_rdata);//kenny mark it
  677.         return ATAPI_ERROR;
  678.     }
  679.          
  680.     return ATAPI_OK;
  681. }
  682. /*****************************************************/
  683. /*                          */
  684. /*                          */
  685. /*                          */
  686. /******************************************************/
  687. extern void polling();
  688. BYTE atapi_chk_time_out(BYTE wait_state,int w_time)
  689. {
  690.    int res=1,i=0;
  691.    UINT16 timenow,diff=0,old_t,status;
  692.    
  693.   if(dev_status_flag&ATAPI_WAIT_TIME_OUT)
  694.   {
  695.      printf("<bug:reentry>");
  696.      return 0;
  697.   }  
  698.   dev_status_flag|=ATAPI_WAIT_TIME_OUT;
  699.   old_t=regs0->rtc_15_0;   
  700.   while(diff<w_time)
  701.   {
  702.     
  703.     timenow = regs0->rtc_15_0;  
  704.     diff        = timenow-old_t;     
  705.     
  706.     if(wait_state == WAIT_IRQ)
  707.     {
  708.       #ifdef DVD728
  709.         if(regs0->dvddsp_ata_config & ATAPI_DEVICE_INT)
  710.       #else
  711.         if(regs0->dvddsp_config & ATAPI_DEVICE_INT)
  712.       #endif
  713.            res=0;       
  714.     }else if(wait_state== WAIT_STATUS_NO_BSY)
  715.     {//wait BUSY bit of STATUS register is 0         
  716.          res=(atapi_reg_read(IDE_STATUS) & STATUS_BSY);             
  717.     }else if(wait_state== WAIT_ALT_NO_BUSY)
  718.     {//wait BUSY bit of ALT STATUS register is 0
  719.         res=(atapi_reg_read(IDE_ALT_STATUS) & STATUS_BSY);
  720.              
  721.     }else if(wait_state== WAIT_DRQ_OK)
  722.     {//wait DRQ=1 or BUSY bit=0
  723.        status = atapi_reg_read(IDE_STATUS);
  724.        if( !(status & STATUS_BSY)|| (status & STATUS_DRQ) )
  725.                 res=0;           
  726.        
  727. //       printf("<w:%x>",status);           
  728.     }else if(wait_state== WAIT_DRQ_HIGH)
  729.     {//wait DRQ=1
  730.         if( (atapi_reg_read(IDE_STATUS) & STATUS_DRQ) )
  731.               res=0;
  732.     }else if(wait_state== WAIT_DRQ_BSY_ZERO)
  733.     {//wait DRQ=0 and BUSY=0
  734.         res=(atapi_reg_read(IDE_STATUS) & (STATUS_BSY | STATUS_DRQ));           
  735.     }
  736.             
  737.     if(res)
  738.     {//terry,2-5-15 15:56,reduce sensetive ability.
  739.      //terry,2002/6/4 05:38PM,avoiding many confuse on read navigation data
  740.        if( (dev_status_flag&READ_PRESENT_DATA)||(cd_type_loaded==CDROM) )
  741.        {
  742.           if( (system_state==SYSTEM_BROWSE)&&(i>200) )
  743.           {
  744.              polling();           
  745.              cderr_update_show_time();                         
  746.           }else
  747.              disp_fan_in();
  748.           
  749.           i++;  
  750.        }else if(system_state==SYSTEM_IDLE)
  751.             polling();       
  752.             
  753.        delay_1us(500);               
  754.     }else
  755.        break;
  756.     
  757.   }//while
  758.     
  759.     
  760.   dev_status_flag&=~ATAPI_WAIT_TIME_OUT;
  761.   
  762.    return res;  
  763. }   
  764. UINT8 
  765. atapi_do_set_features(void)
  766. {
  767.     UINT8 block_cmd[4];
  768.     // enable PIO mode 4
  769.     block_cmd[0] = 0x03;
  770.     block_cmd[1] = 0x0C;
  771.     block_cmd[2] = 0x00;
  772.     block_cmd[3] = 0xEF;
  773.     atapi_write_block(block_cmd);
  774.     if (atapi_is_error() == 1) {
  775.         printf("do_set_features errorn");
  776.         return 1;
  777.     }
  778.     return 0;
  779. }
  780. // Packet command
  781. // read 18 bytes
  782. UINT8 
  783. atapi_p_request_sense(UINT8 *block_info)
  784. {
  785.     int sense_key;
  786.     UINT8 pc[12];
  787.     
  788. #ifdef USE_HDD
  789.     //Verdure add, cyue:2002-06-12 04:45PM modified
  790.     if (hd_play) return 0;
  791. #endif
  792.     request_sense_flag=0;
  793.     
  794.     memset(pc, 0, 12);
  795.     pc[0] = 0x03;
  796.     pc[4] = 0x12;
  797.     
  798.     
  799.     
  800.     if (atapi_do_packet(pc) == 1) {
  801.         printf("p_request_sense do_packet errorn");
  802.         cderr_handler(CDERR_ATA_NOT_READY);
  803.         
  804.         return 1;
  805.     }
  806.     memset(block_info, 0xFF, 18);
  807.     if (atapi_receive_data(block_info, 18) == 1) {
  808.         printf("p_request_sense receive data errorn");
  809.         return 1;
  810.     }
  811.     sense_key=block_info[2]&0xf;
  812.     if (block_info[2] == 00) {
  813.         printf("no sensen");
  814.     } else {        
  815.         printf("Sense key: 0x%02xn",sense_key);
  816.         printf("ASC: 0x%02xn", block_info[12]);
  817.         printf("ASCQ:0x%02xn", block_info[13]);
  818.         
  819.         
  820.         if(sense_key==2)
  821.         {
  822.             if(block_info[12]==0x04)
  823.                request_sense_flag|=ATAPI_NOT_READY;
  824.             else if((block_info[12]==0x3A)&&(block_info[13]==0x00))
  825.                request_sense_flag|=ATAPI_NO_MEDIA;
  826.             else if((block_info[12]==0x06)&&(block_info[13]==0x00))
  827.                request_sense_flag|=ATAPI_MEDIA_UPSIDE_DOWN;
  828.         }else if(sense_key==5)
  829.         {
  830.             if(block_info[12]==0x30)
  831.                request_sense_flag|=ATAPI_UNKNOWN_MEDIA;
  832.             else if(block_info[12]==0x64)
  833.                request_sense_flag|=ATAPI_ILLEGAL_MODE;
  834.         }
  835.     }
  836.     //printf("sense info:n");
  837.     //print_block(block_info, 18);
  838.     return 0;
  839. }
  840.     
  841. UINT8
  842. atapi_p_test_unit_ready(void)
  843. {
  844.     UINT8 pc[12];
  845.     UINT8 pc_rdata[32];
  846.     int ret;
  847.     memset(pc, 0, 12);
  848.     //printf("!");
  849.     
  850.     ret=atapi_do_packet(pc);//ret==0, unit is ready
  851.     
  852.     if(ret==1)
  853.     {
  854.      atapi_p_request_sense(pc_rdata);//kenny
  855.      
  856.      if(request_sense_flag&ATAPI_NO_MEDIA)
  857.      ret=ATAPI_NO_MEDIA;
  858.     else if(request_sense_flag&ATAPI_NOT_READY)
  859.       ret=ATAPI_NOT_READY;
  860.     
  861.     else if(request_sense_flag&ATAPI_MEDIA_UPSIDE_DOWN)
  862.       ret=ATAPI_MEDIA_UPSIDE_DOWN; 
  863.     else if(request_sense_flag&ATAPI_UNKNOWN_MEDIA)
  864.       ret=ATAPI_UNKNOWN_MEDIA; 
  865.     else
  866.       ret=0xff; 
  867.      
  868.     }
  869.     
  870.     return ret;
  871. }
  872. UINT8 
  873. atapi_p_start_stop_unit(UINT8 start)
  874. {
  875.     UINT8 pc[12];
  876.     UINT8 pc_rdata[32];
  877.     flush_atapi();
  878.     
  879.     if (atapi_is_error() == ATAPI_ERROR) {
  880.         printf("enter atapi_p_start_stop_unit errorn");
  881.         atapi_p_request_sense(pc_rdata);
  882.         
  883.     }   
  884.     
  885.     memset(pc, 0, 12);
  886.     pc[0] = 0x1B;
  887.     pc[1] = 0x01;
  888.     pc[4] = start;
  889.     if (atapi_do_packet(pc) == 1) {
  890.         printf("p_start_stop_unit errorn");
  891.          atapi_p_request_sense(pc_rdata);//kenny
  892.         return 1;
  893.     }
  894.     return 0;
  895. }
  896. UINT8 
  897. atapi_p_mechanism_status(void)
  898. {
  899.     UINT8 pc[12];
  900.     UINT8 pc_rdata[32];
  901.     flush_atapi();//alan 2002/5/30 06:29PM added to solve standby wake up fail when power on/off
  902.     memset(pc, 0, 12);
  903.     pc[0] = 0xBD;
  904.     pc[9] = 0x08;
  905.     if (atapi_do_packet(pc) == ATAPI_ERROR) {
  906.         printf("p_mechanism_status do_packet errorn");
  907.          atapi_p_request_sense(pc_rdata);//kenny
  908.         return ATAPI_ERROR;
  909.     }
  910.     memset(pc_rdata, 0, 8);
  911.     if (atapi_receive_data(pc_rdata, 8) == ATAPI_ERROR) {
  912.         printf("p_mechanism_status receive data errorn");
  913.         return ATAPI_ERROR;
  914.     }
  915.    //printf("%dn", pc_rdata[1] >> 5);
  916.     if (((pc_rdata[1] >> 4) & 1) == 0) {
  917. //      printf("door closen");
  918.       return ATAPI_DOOR_CLOSE;
  919.     }
  920. //   printf("door openn");
  921.     return ATAPI_DOOR_OPEN;
  922. }
  923. UINT8 
  924. atapi_p_read_12(UINT32 lba, UINT32 len)
  925. {
  926.     BYTE ret;
  927.     UINT8 pc[12];
  928.     UINT8 pc_rdata[32];
  929.     memset(pc, 0, 12);
  930.     pc[0] = 0xA8;
  931.     pc[2] = (lba >> 24) & 0x000000ff;   /* LBA (MSB) */
  932.     pc[3] = (lba >> 16) & 0x000000ff;
  933.     pc[4] = (lba >> 8) & 0x000000ff;
  934.     pc[5] =  lba & 0x000000ff;              /* LBA (LSB) */
  935.     pc[6] = (len >> 24) & 0x000000ff;   // transfer length(MSB)
  936.     pc[7] = (len >> 16) & 0x000000ff;        
  937.     pc[8] = (len >> 8) & 0x000000ff;          
  938.     pc[9] =  len & 0x000000ff;  
  939.     
  940.     ret=atapi_do_packet(pc);
  941.     
  942.     if(dev_status_flag&READ_PRESENT_DATA)
  943.          dev_status_flag&=~READ_PRESENT_DATA;
  944.     if (ret == 1) {
  945.         printf("!!!!!!!!p_read_12 errorn");
  946.         
  947.             atapi_p_request_sense(pc_rdata);
  948.             printf("!!!!!!!!Request outn");
  949.           
  950.           if(request_sense_flag&ATAPI_NOT_READY)
  951.           {
  952.             printf("!!!!!!!!p_read_12 error, unit not readyn");
  953.             
  954.                     cderr_handler(CDERR_ATA_NOT_READY);
  955.                  
  956.                     if(atapi_do_packet(pc) == 1) 
  957.                     {
  958.                     printf("p_read_12 again errorn");  
  959.                      atapi_p_request_sense(pc_rdata);//kenny
  960.                 
  961.                 }
  962.             
  963.                         
  964.             
  965.           }//not ready  
  966.           else if(request_sense_flag&ATAPI_ILLEGAL_MODE)
  967.           {
  968.             
  969.             return ATAPI_ILLEGAL;
  970.             
  971.         
  972.         
  973.           }     
  974.           
  975.         return 1;
  976.     }
  977.     return 0;
  978. }
  979. // generic packet command
  980. void 
  981. init_cdrom_command(struct cdrom_generic_command *cgc, void *buffer, int len)
  982. {
  983.     memset(cgc, 0, sizeof(*cgc));
  984.     memset(buffer, 0, len);
  985.     cgc->buffer = (char *) buffer;
  986.     cgc->buflen = len;
  987. }
  988. // only support 3 commands now
  989. // return 0: ok, -1: error
  990. int 
  991. generic_packet(struct cdrom_generic_command *cgc)
  992. {
  993.     UINT8 pc_rdata[32];
  994.     
  995.     //atapi_p_test_unit_ready();
  996.     
  997.     #if 0 //mark it to reduce code
  998.     if (0)
  999.     {
  1000.         //printf("generic_packet startn");
  1001.         print_block(cgc->cmd, 12); //printf("n");
  1002.     }
  1003.     
  1004.     switch (cgc->cmd[0]) {
  1005.         case GPCMD_READ_DVD_STRUCTURE:
  1006.         case GPCMD_REPORT_KEY:
  1007.             if (atapi_do_packet(cgc->cmd)) {
  1008.                 printf("----------------generic packet errorn");
  1009.                  atapi_p_request_sense(pc_rdata);//kenny
  1010.                 return -1;
  1011.             }
  1012.             atapi_receive_data(cgc->buffer, cgc->buflen);
  1013.             break;
  1014.         case GPCMD_SEND_KEY:
  1015.             if (atapi_do_packet(cgc->cmd)) {
  1016.                 printf("----------------generic packet errorn");
  1017.                  atapi_p_request_sense(pc_rdata);//kenny
  1018.                 return -1;
  1019.             }
  1020.             atapi_send_data(cgc->buffer, cgc->buflen);
  1021.             break;
  1022.     }
  1023.     #endif
  1024.     
  1025.     #if 1 //reduced code
  1026.     if ((cgc->cmd[0]==GPCMD_READ_DVD_STRUCTURE)||(cgc->cmd[0]==GPCMD_REPORT_KEY))
  1027.     {
  1028.         if (atapi_do_packet(cgc->cmd)!=0)
  1029.         {
  1030.             printf(__FUNCTION__ ":packet errorn");
  1031.             atapi_p_request_sense(pc_rdata);
  1032.             memset(cgc->buffer,0,cgc->buflen);
  1033.             return -1;
  1034.         }
  1035.         atapi_receive_data(cgc->buffer, cgc->buflen);
  1036.     }   
  1037.     else if(cgc->cmd[0]==GPCMD_SEND_KEY)
  1038.     {
  1039.         if (atapi_do_packet(cgc->cmd)!=0)
  1040.         {
  1041.             printf(__FUNCTION__ ":packet errorn");
  1042.             atapi_p_request_sense(pc_rdata);
  1043.             memset(cgc->buffer,0,cgc->buflen);
  1044.             return -1;
  1045.         }
  1046.         atapi_send_data(cgc->buffer, cgc->buflen);
  1047.     }   
  1048.     #endif
  1049.     { 
  1050.         int i;
  1051.         i = atapi_is_error();
  1052.         if (i != 0) { 
  1053.             UINT8 ubuf[20];
  1054.             printf(__FUNCTION__":error %dn", i);
  1055.             atapi_p_request_sense(ubuf);
  1056.         }
  1057.         return -i;
  1058.     }
  1059. }
  1060. UINT8 
  1061. atapi_get_cprm_config(void)
  1062. {
  1063.     BYTE ret=0;
  1064.     UINT8 pc[12];
  1065.     UINT8 pc_rdata[32];
  1066.     memset(pc, 0, 12);
  1067.     pc[0] = 0x46;     
  1068.     pc[1] = 0x02; //feature descriptor be returned
  1069.     pc[2] = 0x01; //cprm 
  1070.     pc[3] = 0x0B;
  1071.     
  1072.     // transfer length
  1073.     pc[8] = 0x08;       
  1074.     if( atapi_do_packet(pc)==0 )
  1075.     {
  1076.         if(atapi_receive_data(pc_rdata, 8) ) 
  1077.         {
  1078.             printf("atapi_get_cprm_config  receive errorn");
  1079.             //memset(pc_rdata, 0, 2048*len);    
  1080.             ret = ATAPI_ERROR;    
  1081.         }else
  1082.         {
  1083.             print_block(pc_rdata,8);//01:0x010B         
  1084.             if(pc_rdata[2]&0x01)
  1085.             {
  1086.                 printf("DVD-R,DVD-RW or DVD-RAMn");
  1087.             }
  1088.         } 
  1089.     }else
  1090.     {
  1091.         printf("get cprm config failn");
  1092.         atapi_p_request_sense(pc_rdata);        
  1093.         ret = ATAPI_ERROR;    
  1094.     }
  1095.     
  1096.     return ret;
  1097. }
  1098. UINT8 
  1099. atapi_block_read(UINT32 lba, UINT32 len)
  1100. {
  1101.     UINT8 pc_rdata[32];
  1102.     
  1103. #ifdef USE_HDD
  1104.       //Verdure add, cyue:2002-06-12 04:45PM modified
  1105.       if  (hd_play)
  1106.       {
  1107.           hdd_block_read(lba, len);
  1108.           return 0;
  1109.       }
  1110. #endif
  1111.     if (atapi_is_error() == ATAPI_ERROR) {
  1112.         printf("enter block_read errorn");
  1113.         atapi_p_request_sense(pc_rdata);
  1114.         
  1115.         cderr_handler(CDERR_DAT_DISCONTINUE);
  1116.         //lba=lba_st.lba;
  1117.         return ATAPI_ERROR;//2001/12/20
  1118.         
  1119.     }
  1120.     if (is_user_opened())
  1121.     {
  1122.         printf("USER OPEN!!!n");
  1123.         return ATAPI_ERROR;
  1124.     }   
  1125.     
  1126.     dev_status_flag|=READ_PRESENT_DATA;//kenny
  1127.    
  1128.     if (DiscType != CDDVD)
  1129.     {
  1130.         //printf("readcdn");
  1131.         if (atapi_read_cd(lba, len) == ATAPI_ERROR) return ATAPI_ERROR;
  1132.         
  1133.         if ( (cd_type_loaded==CDDA) && (cd_subtype!=CD_DTS) )
  1134.             regs0->dvddsp_blocksize = iBlockLen; //Jeff 20020927
  1135.         else
  1136.            regs0->dvddsp_blocksize = 2352/2;
  1137.         regs0->dvddsp_blocklength = len;        
  1138.       #ifdef DVD728
  1139.         regs0->dvddsp_ata_config = DVDDSP_CONFIG_DEF;
  1140.       #else
  1141.         regs0->dvddsp_config = PIO_MODE2|DVDDSP_CONFIG_DEF;//DVDDSP_CONFIG_DEF;
  1142.       #endif
  1143.     }
  1144.     else
  1145.     { // DVD
  1146.         //printf("read12n");
  1147.     if (atapi_p_read_12(lba, len) == ATAPI_ERROR) return ATAPI_ERROR;
  1148. #ifdef DVD728
  1149.     regs0->dvddsp_public    = 0;
  1150.     if (CSSEnable)
  1151.     {
  1152. #define CPPM_ENABLE             
  1153. #ifdef CPPM_ENABLE      
  1154.       /*if(len==1)
  1155.       {
  1156.         regs0->dvddsp_public = 0x0080;        
  1157.       }else      */
  1158.       {
  1159.         //regs0->dvddsp_public = 0x80|ATAPI_CSS_ENABLE|(1<<8);      // for FPGA
  1160.         regs0->dvddsp_public = 0x80|ATAPI_CSS_ENABLE;       // for 8200 real chip + ATAPI loader
  1161.       }
  1162.         
  1163.       regs0->css_config     = 0x00;                 // css use hw
  1164.       //regs0->css_public       = 1<<8;                 // cppm
  1165.       regs0->css_public     = 0;
  1166. #else
  1167.       regs0->dvddsp_public = 0x0080 | ATAPI_CSS_ENABLE;
  1168.       regs0->css_config     = 0x00;                 // css use hw
  1169.       //regs0->css_public       = 0<<8;                 // css
  1170. #endif    
  1171.     }else
  1172.       regs0->dvddsp_public = 0x0080;
  1173. #if 0
  1174.     regs0->dvddsp_public    = 0;
  1175.     regs0->dvddsp_public    = 0x0080|(1<<8);        // host enable cppm
  1176.     regs0->css_config       = 0x00;                 // css use hw
  1177.     regs0->css_public       = 1<<8;                 // ..
  1178. #endif
  1179.     regs0->dvddsp_ata_config = DVDDSP_CONFIG_DEF;
  1180. #else
  1181.     #ifdef NINTAUS_LOADER//only use PIO_MODE2
  1182.     #define PIO_MODE_USE PIO_MODE2
  1183.     #else
  1184.     #define PIO_MODE_USE PIO_MODE3
  1185.     #endif
  1186.     if (CSSEnable)
  1187.       regs0->dvddsp_config = PIO_MODE_USE|ATAPI_CSS_ENABLE|DVDDSP_CONFIG_DEF;
  1188.     else
  1189.       regs0->dvddsp_config = PIO_MODE_USE|DVDDSP_CONFIG_DEF;
  1190. #endif // DVD728
  1191.       
  1192.     regs0->dvddsp_blocksize = 1024;
  1193.     regs0->dvddsp_blocklength = len;
  1194.     }   
  1195.     
  1196.   
  1197.   if (atapi_reg_read(IDE_STATUS) == 0x50) { //DRQ=0,BSY=0,DRDY=1,DSC=1
  1198.     printf("skip directly!n");
  1199.     return ATAPI_ERROR;
  1200.   } else { 
  1201.   #ifdef DVD728
  1202.     regs0->dvddsp_function = ATAPI_READ | DATA_MODE | HOST_START | 0x00;
  1203.   #else
  1204.     regs0->dvddsp_function = (IDE_DATA<<8) | ATAPI_READ | DATA_MODE | HOST_START ;
  1205.   #endif
  1206.   }
  1207.   
  1208.   
  1209.   #if 0
  1210.    if((atapi_reg_read(IDE_STATUS) & (STATUS_BSY|STATUS_DRQ)) != STATUS_DRQ){
  1211.     printf("skip directly!n");
  1212.     return ATAPI_ERROR;
  1213.   } else { 
  1214.     
  1215.     regs0->dvddsp_function = (IDE_DATA<<8) | ATAPI_READ | DATA_MODE | HOST_START ;
  1216.   }
  1217.   #endif
  1218.     return ATAPI_OK;
  1219. }
  1220. void 
  1221. atapi_init(void)
  1222. {
  1223. #ifdef DVD728
  1224.     regs0->dvddsp_ata_config = DVDDSP_CONFIG_DEF;
  1225.     atapi_rst(DSP_HOST_RESET|ATA_HW_RESET);
  1226.     regs0->dvddsp_ata_config = DVDDSP_CONFIG_DEF;
  1227. #else
  1228.     regs0->dvddsp_config = PIO_MODE2|DVDDSP_CONFIG_DEF;//DVDDSP_CONFIG_DEF;
  1229.     atapi_rst(DSP_HOST_RESET|ATA_HW_RESET);
  1230.     regs0->dvddsp_config = PIO_MODE2|DVDDSP_CONFIG_DEF;//DVDDSP_CONFIG_DEF;     
  1231. #endif
  1232.     delay(1);       
  1233.     atapi_p_test_unit_ready();//start up loader
  1234. }
  1235. #include "dvdioctl.h"
  1236. #if DISC_SYSTEM==DISC_SYSTEM_ATAPI  
  1237. void disc_init(void)
  1238.    DiscType = CDUNKNOWN;
  1239.    if (udf_find_anchor() == 0) 
  1240.    {
  1241.         printf("no anchor foundn");
  1242.       
  1243.    } else {        
  1244.         printf("initialize filesystemn");
  1245.         if ( fs_init() < 0) return;
  1246.         if(dVMG_LSN)
  1247.         {
  1248.             DiscType = CDDVD;
  1249.             cd_type_loaded=DiscType;
  1250. #define ALWAYS_ENABLE_CSS
  1251. #ifdef  ALWAYS_ENABLE_CSS
  1252.             CSSEnable=1;
  1253. #else            
  1254. {
  1255.             dvd_struct s;
  1256.             
  1257.             s.type = DVD_STRUCT_COPYRIGHT;
  1258.             s.copyright.layer_num = 0;
  1259.             dvd_read_struct(&s);        
  1260.             CSSEnable=s.copyright.cpst;
  1261. }
  1262. #endif            
  1263.             printf("css:%xn",CSSEnable);
  1264.             /*
  1265.             if (s.copyright.cpst == 0) 
  1266.             { // no css
  1267.                   epp_write("no cssn");
  1268.                   CSSEnable = 0;
  1269.             } else 
  1270.             {
  1271.                   epp_write("css enn");
  1272.                   CSSEnable = 1;
  1273.             }*/
  1274.         }
  1275. #ifdef DVD_AUDIO
  1276.         cppm_init( dAMG_LSN );
  1277. #endif  
  1278.         
  1279.    }
  1280.    
  1281.    
  1282. }
  1283. #else
  1284. void disc_init(void)
  1285. {
  1286.    dvd_struct s;
  1287.    
  1288.    if (udf_find_anchor() == 0) 
  1289.    {
  1290.         printf("no anchor foundn");
  1291.         DiscType = CDUNKNOWN;      
  1292.    } else {        
  1293.         printf("initialize filesystemn");
  1294.         if ( fs_init() < 0)
  1295.         {
  1296.             DiscType = CDUNKNOWN;
  1297.             return;
  1298.         }
  1299.     
  1300.         if(dVMG_LSN)
  1301.         {
  1302.             DiscType = CDDVD;
  1303.             cd_type_loaded=DiscType;
  1304.             s.type = DVD_STRUCT_COPYRIGHT;
  1305.             s.copyright.layer_num = 0;
  1306.             CSSEnable = 1;
  1307.         }else
  1308.         {
  1309.             DiscType = CDUNKNOWN;
  1310.         }    
  1311.    }   
  1312. }
  1313. #endif
  1314. BYTE user_only=0;
  1315. UINT8 
  1316. atapi_read_cd(UINT32 lba, UINT32 len)
  1317. {
  1318.     BYTE ret;
  1319.     UINT8 pc[12];
  1320.     UINT8 pc_rdata[32];
  1321.     memset(pc, 0, 12);
  1322.     pc[0] = 0xBE;
  1323.       // LBA
  1324.     pc[2] = (lba >> 24) & 0x00ff; 
  1325.     pc[3] = (lba >> 16) & 0x00ff;
  1326.     pc[4] = (lba >> 8) & 0x00ff;
  1327.     pc[5] =  lba & 0x00ff;      
  1328.     // transfer length
  1329.     pc[6] = (len >> 16) & 0x00ff;
  1330.     pc[7] = (len >> 8) & 0x00ff;          
  1331.     pc[8] =  len & 0x00ff;  
  1332.     
  1333.     // ....
  1334.     #define ATAPI_READCD_9_SYNC     (1<<7)
  1335.     #define ATAPI_READCD_9_HEADER_NONE  (0<<5)
  1336.     #define ATAPI_READCD_9_HEADER_HEADER    (1<<5)
  1337.     #define ATAPI_READCD_9_HEADER_SUBHEADER (2<<5)
  1338.     #define ATAPI_READCD_9_HEADER_ALL   (3<<5)
  1339.     #define ATAPI_READCD_9_USERDATA     (1<<4)
  1340.     #define ATAPI_READCD_9_ECC      (1<<3)
  1341.     
  1342.     
  1343.     if(user_only==1)
  1344.     {
  1345.         
  1346.     pc[9] =0x10;    
  1347.     }
  1348.     else
  1349.     {   
  1350.     pc[9] = ATAPI_READCD_9_SYNC
  1351.             | ATAPI_READCD_9_HEADER_ALL
  1352.         | ATAPI_READCD_9_USERDATA
  1353.         | ATAPI_READCD_9_ECC;
  1354.         
  1355.     }   
  1356.     if ( (cd_type_loaded==CDDA) && (cd_subtype!=CD_DTS) )
  1357.        pc[10]=bReadSubChannel; //Jeff 20020927
  1358.     
  1359.      ret=atapi_do_packet(pc);
  1360.      if((dev_status_flag&READ_PRESENT_DATA))         {
  1361.          dev_status_flag&=~READ_PRESENT_DATA;         }  
  1362.     if (ret == 1) {
  1363.         printf("p_read_cd errorn");
  1364.         atapi_p_request_sense(pc_rdata);
  1365.         return 1;
  1366.     }
  1367.     return 0;
  1368. }
  1369. int 
  1370. cdrom_read_tocentry(int trackno, int msf_flag, BYTE format, int buflen)
  1371. {
  1372.     UINT8 pc[12];
  1373.     UINT8 pc_rdata[32];
  1374.     memset(&pc, 0, sizeof(pc));
  1375.     pc[0] = 0x43;
  1376.     pc[2] = format;//2001/9/26
  1377.     pc[6] = trackno;
  1378.     pc[7] = (buflen >> 8);
  1379.     pc[8] = (buflen & 0xff);
  1380.     //pc[9] = (format << 6);//2001/9/26 mark it
  1381.     if (msf_flag)
  1382.         pc[1] = 2;
  1383.     if (atapi_do_packet(pc) == 1) {
  1384.         printf("cdrom_read_tocentry errorn");
  1385.         
  1386.         atapi_p_request_sense(pc_rdata);
  1387.         
  1388.         
  1389.         if(request_sense_flag&ATAPI_NOT_READY)//kenny
  1390.           {
  1391.             
  1392.             printf("!!!!!cdrom_read_tocentry , Unit not ready");
  1393.             
  1394.             
  1395.             
  1396.             cderr_handler(CDERR_ATA_NOT_READY);
  1397.             
  1398.             if (atapi_do_packet(pc) == 1) {
  1399.         printf("cdrom_read_tocentry error againn");
  1400.         
  1401.          atapi_p_request_sense(pc_rdata);
  1402.         } 
  1403.             
  1404.                         
  1405.             
  1406.           } //if(not_ready==1)
  1407.         
  1408.         
  1409.         
  1410.        
  1411.         return 1;
  1412.     }
  1413.     //memset(pc_rdata, 0, sizeof(pc_rdata));
  1414.     
  1415.     //if (atapi_receive_data(pc_rdata, buflen) == 1) {
  1416.     memset(pwb, 0, sizeof(pwb));    
  1417.     if (atapi_receive_data(pwb, buflen) == 1) { 
  1418.         
  1419.         printf("cdrom_read_tocentry receive data errorn");
  1420.         return 1;
  1421.     }
  1422.     return 0;
  1423. }
  1424. /************************************************/
  1425. // atapi_p_mode_sense:
  1426. //  This function is only used before excute disc_init().
  1427. //  Because before reading TOC( disc type is unknown), I don't know read command should be command 0xA8 or 0xBE.
  1428. //  I found that if disc is CDDA and send 0xA8 or 0x28 to loader, then loader will response illegle mode error.
  1429. //  So we must make sure disc is CDDA or not. 
  1430. //  If DISC is CDDA then DiscType is setting CDDA, for other disc  DiscType is CDDVD. 
  1431. //  And we can use disc_init() to identify disc is real DVD disc or not. 
  1432. //  If it is not DVD disc then read toc to classify CDDA,VCD, MP3.
  1433. //  
  1434. /***********************************************/
  1435. BYTE atapi_p_get_disc_info(void)
  1436. {
  1437.  BYTE buflen;
  1438.  UINT8 pc[12];
  1439.  UINT8 pc_rdata[32];
  1440.  #ifdef NINTAUS_LOADER
  1441.  DiscType=CDDVD;  
  1442.  return 0;
  1443.  #endif
  1444.  
  1445.   memset(&pc, 0, sizeof(pc));
  1446.     pc[0] = 0x5A;
  1447.     pc[2]=0x41;
  1448.     pc[7] = 0;
  1449.     pc[8] =buflen =0x0A;
  1450.     
  1451.     if (atapi_do_packet(pc) == 1) {
  1452.         printf("atapi_mode_sense errorn");
  1453.         
  1454.         atapi_p_request_sense(pc_rdata);    
  1455.         
  1456.         return 1;
  1457.     }
  1458.      
  1459.      
  1460.      
  1461.         memset(pwb, 0, sizeof(pwb));    
  1462.     if (atapi_receive_data(pwb, buflen) == 1) { 
  1463.         
  1464.         printf("atapi_mode_sense receive data errorn");
  1465.         return 1;
  1466.     }
  1467.        //printf("DISC TYPE=%xn",pwb[2]);
  1468.        
  1469.        //pwb[2]=0x01: VCD,MP3
  1470.        //pwb[2]=0x02,0x06,0x12,0x16,0x22,0x26: CDDA
  1471.        //pwb[2]=0x041: DVD
  1472.         
  1473.         
  1474.         if(pwb[2]==0x02||pwb[2]==0x06||pwb[2]==0x12||pwb[2]==0x16||pwb[2]==0x22||pwb[2]==0x26)      
  1475.          DiscType=CDDA;
  1476.         else if(pwb[2]==0x41)
  1477.          DiscType=CDDVD;          
  1478.         else
  1479.          DiscType=CDUNKNOWN; 
  1480.     return 0;   
  1481.     
  1482.     
  1483. }   
  1484. int
  1485. atapi_open_tray(void)
  1486. {
  1487.     printf("openn");
  1488.     return atapi_p_start_stop_unit(START_STOP_DO_EJECT);                        
  1489. }
  1490. /*
  1491. int
  1492. atapi_close_tray(void)
  1493. {
  1494.     printf("closen");
  1495.     return atapi_p_start_stop_unit(START_STOP_DO_LOAD);             
  1496. }
  1497. */
  1498. int
  1499. atapi_close_tray(UINT8 nStatus)
  1500. {
  1501.     printf("closen");
  1502.     if (!nStatus) // Robert 2003/12/16
  1503.         return atapi_p_start_stop_unit(START_STOP_DO_LOAD);
  1504.     else
  1505.         return atapi_p_start_stop_unit(START_STOP_DO_LOAD_POWER_OFF);
  1506. }
  1507. int
  1508. atapi_abort_play(void)
  1509. {
  1510.     printf("stopn");
  1511.     if(!is_user_opened())
  1512.     {
  1513.         return atapi_p_start_stop_unit(START_STOP_DO_STOP);
  1514.     }else
  1515.         return 0;
  1516. }
  1517. /*
  1518. ** FUNCTION
  1519. ** atapi_read_toc
  1520. **
  1521. */
  1522. int atapi_read_toc(void)
  1523. {
  1524.   BYTE  cd_trk_cna;
  1525.   //int done;
  1526.   int toc_retry;
  1527.   int i;
  1528.   int ret;
  1529.   
  1530.   /*
  1531.   ** init toc table
  1532.   */  
  1533.   {    
  1534.     for (i=0; i<=0x66; i++)
  1535.       settrkmsf(i, READTOC_INIT);    
  1536.   }
  1537.   for(toc_retry=0;toc_retry<READTOC_RETRY;toc_retry++)
  1538.   {  
  1539.       if(is_user_opened())
  1540.         return -1;
  1541.         
  1542.       flush_atapi();          
  1543.       ret=cdrom_read_tocentry(1,1,2,4);       
  1544.       
  1545.       if(ret==0)
  1546.         break;
  1547.       else if(ret<0)
  1548.        return -2;
  1549.       else
  1550.       {
  1551.         printf("READ TOC retry:%xn",toc_retry);        
  1552.       }  
  1553.   }
  1554.   
  1555.   if(toc_retry>=READTOC_RETRY)
  1556.   {
  1557.     printf("READ LONG TOC FAIL,exitn");    
  1558.     return -2;
  1559.   }
  1560.   
  1561.   { 
  1562.     UINT8 *p;
  1563.     int len,trk;
  1564.      
  1565.     len=(pwb[0]<<8) + pwb[1] - 2;  
  1566.     if( (len<=0)||(len>2048) )
  1567.     {
  1568.         printf("Read toc length errorn");
  1569.         return -2;
  1570.     }
  1571.     
  1572.     printf("toc table length:%dn",len);
  1573.     
  1574.     if(is_user_opened())
  1575.         return -1;
  1576.         
  1577.     cdrom_read_tocentry(1,1,2,(len/2*2)+4);
  1578.     
  1579. #if 0
  1580.     {
  1581.         int j;
  1582.         printf("=========================n");
  1583.         for(j=0;j<(len/11);j++)
  1584.         {
  1585.             for(i=0;i<=10;i++)
  1586.                 printf("%02x ",pwb[j*11+i]);             
  1587.             printf("n");
  1588.         }
  1589.         printf("=========================n");
  1590.     }   
  1591. #endif       
  1592.      SessionNs=0;           
  1593.      for (i=4; i<len; i+=11)
  1594.      {
  1595.        p=&pwb[i];
  1596.        
  1597.        cd_trk_cna=(p[1]&0x0f)<<4;
  1598.        cd_trk_cna|=(p[1]&0xf0)>>4;
  1599.        
  1600.        if(p[3]<=0xa2)
  1601.        {
  1602.                     
  1603.             
  1604.             if(p[3]==0xa0)
  1605.             {
  1606.                 trk=0x64;
  1607.                 if(p[0]==1)
  1608.                     {
  1609.                         cd_trk_lo_now=cd_trk_lo=p[8];                           
  1610.                     }else if(p[0]>1)
  1611.                     {
  1612.                         SessionNs=p[8];
  1613.                         printf("lo:%xn",p[8]);
  1614.                     }
  1615.                 
  1616.             }
  1617.             else if(p[3]==0xa1)
  1618.             {
  1619.                 cd_trk_hi=p[8];
  1620.                 trk=0x65;
  1621.                 
  1622.             }   
  1623.             else if(p[3]==0xa2)
  1624.             {
  1625.                 trk=0x66;
  1626.                 
  1627.             }   
  1628.             else
  1629.             {
  1630.                 trk=p[3];                   
  1631.                 if(trk>100)
  1632.                 {
  1633.                         printf("~~read toc trk no.(%x) error~~n",trk);
  1634.                         return -2;
  1635.                 }
  1636.             }   
  1637.             
  1638.             
  1639.             
  1640.             pFsJpeg->cdrom.track_info[trk]=((UINT32)(cd_trk_cna)<<24) | ((UINT32)p[8] <<16)| ((UINT32)p[9]<<8)  | ((BYTE)(p[10]));
  1641.             printf("trk:%d msf:%08xn",trk,pFsJpeg->cdrom.track_info[trk]);
  1642.        }
  1643.         
  1644.      }  
  1645.      pFsJpeg->cdrom.track_info[0]=pFsJpeg->cdrom.track_info[1];
  1646.      
  1647.      {
  1648.          UINT32 max,min;
  1649.          
  1650.          for(trk=cd_trk_lo_now;trk<cd_trk_hi;trk++)
  1651.          {
  1652.             max=pFsJpeg->cdrom.track_info[trk+1]&0xffffff;
  1653.             min=pFsJpeg->cdrom.track_info[trk]&0xffffff;
  1654.             if( (min>max)||(min==0xffffff) )
  1655.             {
  1656.                 cd_trk_hi=trk-1;
  1657.                 printf("Read toc length error,max:%x min:%xn",max,min);
  1658.                 break;
  1659.             }
  1660.          }
  1661.          
  1662.          if(cd_trk_hi<cd_trk_lo_now)
  1663.          {
  1664.               printf("Read toc length error,hi:%x low:%xn",cd_trk_hi,cd_trk_lo_now);
  1665.               return -2;
  1666.          }
  1667.      }
  1668.      printf("read finishn");
  1669.      return 0;
  1670.   }   
  1671. }
  1672. //=============ycwen 2004/08/10================
  1673. #ifdef NO_DVD_SERVO
  1674. void servo_turn_off(void)
  1675. {
  1676.     //Decoder gated clock
  1677.     WriteServoReg(0x4333,0x07);
  1678.     WriteServoReg(0x4334,0xff);
  1679.     WriteServoReg(0x4335,0xff);
  1680.     WriteServoReg(0x4336,0xff);
  1681.     WriteServoReg(0x4337,0xff);
  1682.     //Servo AFE power down
  1683.     WriteServoReg(0x4403,0x04);
  1684.     WriteServoReg(0x440e,0x02);
  1685.     WriteServoReg(0x4435,0x00);
  1686.     WriteServoReg(0x453c,0x20);
  1687.     //servo DSP gated clock
  1688.     WriteServoReg(0x4410,0x03);
  1689.     WriteServoReg(0x4416,0x01);
  1690. }
  1691. #endif //NO_DVD_SERVO
  1692. #if 0
  1693. void 
  1694. atapi_menu(void)
  1695. {
  1696.     char buf[5];
  1697.     while (1) {
  1698.         epp_write_wait("n");
  1699.         //printf("config 0x%04xn", regs0->dvddsp_config);
  1700.         epp_write_wait("1. EJECTn");
  1701.         epp_write_wait("2. LOADn");
  1702.         epp_write_wait("3. STARTn");
  1703.         epp_write_wait("4. STOPn");
  1704.         epp_write_wait("5. Hard Resetn");
  1705.         epp_write_wait("enter> continuen");
  1706.         //regs0->dvddsp_config = E10MHZ_MODE;
  1707.         regs0->dvddsp_config = 0;
  1708.         mon_read(buf);
  1709.         if (buf[0] == '1') {
  1710.             atapi_p_start_stop_unit(START_STOP_DO_EJECT);
  1711.             epp_write_wait("ejectn");
  1712.         } else if (buf[0] == '2') {
  1713.             atapi_p_start_stop_unit(START_STOP_DO_LOAD);
  1714.             epp_write_wait("loadn");
  1715.         } else if (buf[0] == '3') {
  1716.             atapi_p_start_stop_unit(START_STOP_DO_START);
  1717.             epp_write_wait("startn");
  1718.         } else if (buf[0] == '4') {
  1719.             atapi_p_start_stop_unit(START_STOP_DO_STOP);
  1720.             epp_write_wait("stopn");
  1721.         } else if (buf[0] == '5') {
  1722.             atapi_hard_rst();
  1723.             epp_write_wait("hard resetn");
  1724.         } else if (buf[0] == 0) {
  1725.             return;
  1726.         }
  1727.     }
  1728. }
  1729. UINT8
  1730. atapi_p_unlock(void)
  1731. {
  1732.     
  1733.     flush_atapi();
  1734.     
  1735.     memset(pc, 0, 12);
  1736.     pc[0] = 0x1E;
  1737.      pc[4] = 0x03;  
  1738.     if (atapi_do_packet(pc) == 1) {
  1739.         printf("atapi_p_unlock errorn");
  1740.          atapi_p_request_sense(pc_rdata);//kenny
  1741.         return 1;
  1742.     }
  1743.     return 0;   
  1744. }   
  1745. // read 512 bytes
  1746. UINT8 atapi_do_identify_packet_device(UINT8 *block_info)
  1747. {
  1748.     UINT8 block_cmd[4];
  1749.     memset(block_cmd, 0, 4);
  1750.     block_cmd[3] = 0xA1;
  1751.     atapi_write_block(block_cmd);
  1752.     if (atapi_is_error() == 1) {
  1753.         printf("do_identify_packet_device errorn");
  1754.         return 1;
  1755.     }
  1756.     if (atapi_receive_data(block_info, 512) == 1) {
  1757.         printf("do_identify_packet_device receive errorn");
  1758.         return 1;
  1759.     }
  1760.     return 0;
  1761. }
  1762. UINT8 
  1763. atapi_read_cd_msf(t_cdrom_msf *pmsf)
  1764. {
  1765.     UINT8 pc[12];
  1766.     UINT8 pc_rdata[32];
  1767.     memset(pc, 0, 12);
  1768.     pc[0] = 0xB9;
  1769.     pc[3] = pmsf->m0; 
  1770.     pc[4] = pmsf->s0;
  1771.     pc[5] = pmsf->f0;
  1772.     pc[6] = pmsf->m1;
  1773.     pc[7] = pmsf->s1;
  1774.     pc[8] = pmsf->f1;
  1775.     pc[9] = 0x10;  
  1776.     print_block(pc, 12);
  1777.     if (atapi_do_packet(pc) == 1) {
  1778.         printf("p_read_cd_msf errorn");
  1779.         atapi_p_request_sense(pc_rdata);
  1780.         return 1;
  1781.     }
  1782.     return 0;
  1783. }
  1784. UINT8 
  1785. atapi_p_read_capacity(UINT32 *plba, UINT32 *plen)
  1786. {
  1787.     UINT8 *p;
  1788.     UINT8 pc[12];
  1789.     UINT8 pc_rdata[32];
  1790.     memset(pc, 0, 12);
  1791.     pc[0] = 0x25;
  1792.     if (atapi_do_packet(pc) == 1) {
  1793.         printf("p_read_capacity errorn");
  1794.          atapi_p_request_sense(pc_rdata);//kenny
  1795.         return 1;
  1796.     }
  1797.     memset(pc_rdata, 0, 12);
  1798.     if (atapi_receive_data(pc_rdata, 8) == 1) {
  1799.         printf("p_read_capacity receive data errorn");
  1800.         return 1;
  1801.     }
  1802.     p = pc_rdata;
  1803.     print_block(p, 12);
  1804.     *plba = getUINT32_bi(((UINT8 *)p) + 0);
  1805.     *plen = getUINT32_bi(((UINT8 *)p) + 4);
  1806.     return 0;
  1807. }
  1808. #endif