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

DVD

开发平台:

C/C++

  1. //
  2. // FILE
  3. // hwif.c
  4. //
  5. #include "config.h"
  6. #include "regmap.h"
  7. #include "uart.h"
  8. #include "cpu.h"
  9. #include "lbc.h"
  10. #include "hwif.h"
  11. #include "hw.h"
  12. //not remove this, add a password to see servo source code version, that we release, Jeff 20030818
  13. #include "../IR_VFD/ircode.h"
  14. #ifdef DVD_SERVO
  15. const BYTE Servo_Password[8]={IRC_3,IRC_4,IRC_4,IRC_3,IRC_3,IRC_4,IRC_4,IRC_1};
  16. #endif
  17. //
  18. // crt0.S
  19. extern  void    setup_sdctrl_sref();            // setup SDRAM to use self-refresh
  20. extern  void    set_sdram_timing(void);
  21. extern  void    set_sdram_timing_low(void);
  22. // sdram.S (obsolete)
  23. extern  void    configure_sdram_timing(int);
  24. //
  25. //
  26. //
  27. static inline void hwif_bypass_pllv(void)
  28. {
  29.     // bypass PLLV
  30. #ifdef SPHE1000
  31. hwif_clkdiv(0x0606);
  32. regs0->sysclk_sel = 0x41;
  33. while (regs0->sysclk_sel & 0x1810)
  34. asm volatile ("nop");
  35. #else
  36.     regs0->sysclk_sel = 0x4001;
  37.     while (regs0->sysclk_sel & 0x1800) ;
  38. #endif
  39. }
  40. static inline void hwif_clkdiv(int n)
  41. {
  42.     regs0->sysclk_div_sel = n;
  43. }
  44. static inline void hwif_disable_clk27(void)
  45. {
  46.     // turn-off CK27
  47.     regs0->sysclk_sel = 0xe001;
  48. }
  49. static inline void hwif_disable_plla(void)
  50. {
  51. #ifdef SPHE1000
  52. regs0->sft_cfg6         |= (1<<12);
  53. #else
  54.     regs0->sft_cfg6         &= ~((1<<10)|(1<<11));
  55. #endif
  56. }
  57. static inline void hwif_disable_audio(void)
  58. {
  59.     regs0->aud_adc_mono_cfg = 0x0010;
  60.     regs0->aud_enable       = 0x0000;
  61. }
  62. static  inline  void    hwif_disable_tvdacs(void)
  63. {
  64.     // disable TV DAC
  65.     regs0->tv_mode[5] = 0x60bf;
  66. }
  67. static  inline  void    hwif_enable_iop_rstsys(void)
  68. {
  69.     // enable IOP to reset system
  70. #ifdef SPHE1000
  71. regs0->sft_cfg5 |= (1<<14); // sphe1000 enable iop reset system
  72. #else
  73.     regs0->sft_cfg2 |= (1<<1);
  74. #endif
  75.     // inform IOP could enter mechanism of reseting RISC
  76.     regs0->iop_data[6] = 1;
  77. }
  78. //
  79. // FUNCTION
  80. // hwif_reset_all
  81. //
  82. // DESCRIPTION
  83. // reset all but global
  84. //
  85. void hwif_reset_all(void)
  86. {
  87.     UART0_puts("hwif_reset_all()n");
  88.     delay_1ms(100);
  89.     while (1) {
  90. #if 0
  91.         regs0->reset = 0xffff;
  92.         regs0->reset2 = 0xffff;
  93. //        regs0->reset = ~HW_RESET_GLOBAL;
  94. //        regs0->reset2 = 1;
  95. #else
  96.         extern  void __boot_entry();
  97.         __boot_entry();
  98. #endif
  99.     }
  100. }
  101. //
  102. // FUNCTION
  103. // hwif_reset_sleep
  104. //
  105. // DESCRIPTION
  106. // enable-sleep..
  107. //
  108. // current status
  109. // kernel: about 30mA
  110. // io: about 45mA
  111. //
  112. void hwif_reset_sleep(void)
  113. {
  114. #if 0
  115.     // all reset
  116.     regs0->rom_config = 0xf000;
  117.     regs0->reset  = 0x0000;
  118.     regs0->reset2  = 0x0000;
  119.     regs0->g6_reserved[10] = 0x2;
  120.     regs0->g2_reserved[13] |= 0x2000;
  121. #if 0
  122.     WriteServoReg(0x036, 0xff);
  123.     WriteServoReg(0x33e, 0x02);
  124.     WriteServoReg(0x403, 0x04);
  125.     WriteServoReg(0x40e, 0x02);
  126. #endif
  127.     regs0->tv_mode[5] = 0x60bf;
  128.     regs0->aud_adc_mono_cfg = 0x0010;
  129.     regs0->aud_enable  = 0x0000;
  130.     regs0->sft_cfg6 = 0x01f7;
  131.     regs0->sysclk_sel = 0x4001;
  132.     while (regs0->sysclk_sel & 0x1800) ;
  133.     regs0->sysclk_sel = 0xe001;
  134.     while (1);
  135. #endif
  136.     hwif_disable_tvdacs();          // disable TV-DAC output
  137.     hwif_disable_audio();           // disable audio
  138.     //
  139.     // disable sub-systems
  140.     regs0->reset2 = (
  141.         HW_RESET_OGT        
  142.         | HW_RESET_VPP        
  143.         | HW_RESET_OSD       
  144.         | HW_RESET_DSP       
  145.         | HW_RESET_STC      
  146.         | HW_RESET_CD        
  147.         | HW_RESET_CSS       
  148.         | HW_RESET_HOST 
  149.         | HW_RESET_LPT 
  150.         | HW_RESET_UA0
  151.         | HW_RESET_UA1        
  152.         | HW_RESET_TDM        
  153.         | HW_RESET_BRIDGE         
  154. //       | HW_RESET_TV       
  155. //       | HW_RESET_IOP      
  156.         );
  157.     regs0->clken1 &= ~ (
  158.         HW_RESET_TV
  159. #ifndef SPHE1000
  160.         | HW_RESET_SRV
  161. #endif
  162.         ) ;
  163.     hwif_disable_plla();            // disable audio PLL
  164.     setup_sdctrl_sref();            // setup SDRAM to use self-refresh
  165.     // bypass PLL and use CK27/2 as system-clock source
  166.     {
  167.         int cfg;
  168.         cfg = cpu_intr_disable();
  169. #ifdef SPHE1000
  170.         hwif_bypass_pllv(); set_sdram_timing_low();
  171. #else
  172.         hwif_bypass_pllv(); hwif_clkdiv(0); set_sdram_timing_low();
  173. #endif
  174.         cpu_intr_config(cfg);
  175.     }
  176.     hwif_enable_iop_rstsys();
  177. #if defined(SPHE8202) || defined(SPHE1000)
  178. #else
  179.     // disable sdram pads
  180.     regs0->pad_ctrl = 0x00;
  181.     // (8200) enable sdram output when tri-state
  182.     regs0->g6_reserved[10] = 0x2;
  183.     regs0->g2_reserved[13] |= 0x2000;
  184. #endif
  185. #if 1
  186.     regs0->reset = 
  187.         HW_RESET_RISC       |
  188.         HW_RESET_BOOTROM    |
  189.         HW_RESET_FLASHIF    |
  190. //        HW_RESET_RI         |
  191. //        HW_RESET_SDCTRL     |
  192.         HW_RESET_AGDC       |
  193.         HW_RESET_GRFX       |
  194.         HW_RESET_PARM       |
  195.         HW_RESET_IDCT       |
  196.         HW_RESET_INVQ       |
  197.         HW_RESET_VLD        |
  198.         HW_RESET_MC         |
  199.         HW_RESET_TRANS      |
  200.         HW_RESET_MMU        |
  201.         HW_RESET_BUFCTL;
  202. #endif
  203.     while(1);
  204. }
  205. #define AWAKE_SLOWDOWN
  206. #define AWAKE_STOP_HW
  207. //#define AWAKE_STOP_PLL
  208. //
  209. // FUNCTION
  210. // hwif_reset_sleep2
  211. //
  212. // DESCRIPTION
  213. // enable-sleep..
  214. //
  215. // current status
  216. // kernel: about 30mA
  217. // io: about 45mA
  218. //
  219. void hwif_reset_sleep2(int awake)
  220. {
  221. #if 0
  222.     change_system_clock_27M();
  223.     UART0_set_baudrate(BAUDCC(115200, 27000000));
  224.     regs0->uart0_data = 'X';
  225.     while (1) {
  226.         regs0->gpio_oe[0]  |= (1<<4);
  227.         regs0->gpio_out[0] |= (1<<4);
  228.         regs0->gpio_out[0] &= ~(1<<4);
  229.     }
  230.     return;
  231. #endif
  232.     if (awake==0) hwif_reset_sleep();
  233. #if !defined(SPHE1000) && !defined(SPHE8202)
  234.     // (8200) enable sdram output when tri-state
  235.     regs0->g6_reserved[10] = 0x2;
  236.     regs0->g2_reserved[13] |= 0x2000;
  237. #endif
  238. #ifdef  AWAKE_STOP_HW
  239.     regs0->reset2 = 
  240.         HW_RESET_OGT        
  241.         | HW_RESET_VPP        
  242.         | HW_RESET_OSD       
  243. //       | HW_RESET_TV       
  244. //       | HW_RESET_IOP      
  245.         | HW_RESET_DSP       
  246.         | HW_RESET_STC      
  247.         | HW_RESET_CD        
  248.         | HW_RESET_CSS       
  249.         | HW_RESET_HOST 
  250.         | HW_RESET_LPT 
  251. //        | HW_RESET_UA0
  252. //        | HW_RESET_UA1        
  253.         | HW_RESET_TDM        
  254.         | HW_RESET_BRIDGE         
  255.         ;
  256.     regs0->clken1 &= ~ (
  257.         HW_RESET_TV
  258. #ifndef SPHE1000
  259.         | HW_RESET_SRV
  260. #endif
  261.         );
  262. #endif
  263.     // wait until VPP/OSD idle
  264.     {
  265.         int i;
  266.         for (i=0;i<100;i++) asm volatile ("nop");
  267.     }
  268.     hwif_disable_tvdacs();                  // disable TV DAC
  269.     hwif_disable_audio();                   // disable audio
  270. #ifdef  AWAKE_STOP_PLL
  271.     hwif_disable_plla();                // disable audio PLLs
  272. #endif
  273.     setup_sdctrl_sref();            // setup SDRAM to use self-refresh
  274. #ifdef  AWAKE_SLOWDOWN
  275.     // change system clock
  276.     {
  277.         int cfg;
  278.         cfg = cpu_intr_disable();
  279.         
  280.         change_system_clock(1);  //potatooo,2004/7/5 10:48PM
  281.  //       hwif_bypass_pllv(); 
  282. //        hwif_clkdiv(0); 
  283. //        set_sdram_timing_low();
  284.         cpu_intr_config(cfg);
  285.     }
  286. #endif
  287.     hwif_enable_iop_rstsys();
  288.     // final reset
  289. #ifdef  AWAKE_STOP_HW
  290.     regs0->reset = 
  291. //        HW_RESET_RISC       |
  292. //        HW_RESET_BOOTROM    |
  293. //        HW_RESET_FLASHIF    |
  294. //        HW_RESET_RI         |
  295. //        HW_RESET_SDCTRL     |
  296.         HW_RESET_AGDC       |
  297.         HW_RESET_GRFX       |
  298.         HW_RESET_PARM       |
  299.         HW_RESET_IDCT       |
  300.         HW_RESET_INVQ       |
  301.         HW_RESET_VLD        |
  302.         HW_RESET_MC         |
  303.         HW_RESET_TRANS      |
  304.         HW_RESET_MMU        |
  305.         HW_RESET_BUFCTL;
  306. #endif
  307. #ifdef  AWAKE_SLOWDOWN
  308.     // set UART baudrate (115200 is too fast at this time, use 9600 instead)
  309.     UART0_set_baudrate(BAUDCC(9600, 6750000));
  310. #else
  311. //    UART0_set_baudrate(BAUDCC(115200, 121500000));
  312. #endif
  313. }
  314. //
  315. // FUNCTION
  316. // hwif_doze
  317. //
  318. void hwif_doze(int n)
  319. {
  320.   if (n<16) configure_sdram_timing(n<<12);
  321. }
  322. //
  323. // FUNCTION
  324. // hwif_chipver()
  325. //
  326. int
  327. hwif_chipver(void)
  328. {
  329.     return regs0->stamp & 0xff;
  330. }