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

DVD

开发平台:

C/C++

  1. //
  2. // FILE 
  3. // spif.c
  4. //
  5. // DESCRIPTION
  6. // spi-flash support
  7. //
  8. #include "config.h"
  9. #include "regmap.h"
  10. #include "types.h"
  11. #include "spif.h"
  12. // System used GPIO
  13. #define GPIO_IRIN       20
  14. #define GPIO_VFDCLK     21
  15. #define GPIO_VFDSTB     22
  16. #define GPIO_VFDDAT     23
  17. // GPIO assumption of spi-flash interface
  18. #define GPIO_SPI_CLK    GPIO_VFDCLK         // CLK: spi-flash required clock
  19. #define GPIO_SPI_CS     GPIO_VFDSTB         // CS: spi-flash chip-select
  20. #define GPIO_SPI_DI     GPIO_VFDDAT         // DI: input of spi-flash
  21. #define GPIO_SPI_DO     GPIO_IRIN           // DO: output of spi-flash
  22. // assume all GPIO in the the same gpio_*[] register
  23. #define GPIO_OUT        regs0->gpio_out[GPIO_SPI_DI/16]     
  24. #define GPIO_IN         regs0->gpio_in[GPIO_SPI_DO/16]
  25. #define CLK1            (1<<(GPIO_SPI_CLK%16))
  26. #define DO1             (1<<(GPIO_SPI_DI%16))
  27. #define CS1             (1<<(GPIO_SPI_CS%16))
  28. #define DIB             (GPIO_SPI_DO%16)
  29. #define DI1             (1<<DIB)
  30. static void
  31. spiflash_write_byte(unsigned v)
  32. {
  33.     int i;
  34.     unsigned gpioc0d0;
  35.     unsigned gpioc0d1;
  36.     gpioc0d0  = GPIO_OUT & ~(CLK1|DO1);
  37.     gpioc0d1  = gpioc0d0 | DO1;
  38.     for (i=0;i<8;i++) {
  39.         unsigned gpioc0;
  40.         if (v&(1<<7))
  41.             gpioc0 = gpioc0d1;
  42.         else 
  43.             gpioc0 = gpioc0d0;
  44.         GPIO_OUT = gpioc0;          // clk-0
  45.         GPIO_OUT = gpioc0|CLK1;     // clk-1
  46.         v<<=1;
  47.     }
  48. }
  49. void
  50. spiflash_assert_cs(void)
  51. {
  52.     GPIO_OUT |= CS1;
  53.     GPIO_OUT &= ~CS1;
  54. }
  55. void
  56. spiflash_deassert_cs(void)
  57. {
  58.     GPIO_OUT |= CS1;
  59. }
  60. static unsigned
  61. spiflash_read_byte(void)
  62. {
  63.     int i;
  64.     unsigned gpioc0, gpioc1, gi;
  65.     unsigned v;
  66.     gpioc0  = GPIO_OUT & ~(CLK1|DO1);
  67.     gpioc1  = gpioc0 | CLK1;
  68.     v = 0;
  69. #if 0
  70.     for (i=7;i>=0;i--) {
  71.         GPIO_OUT = gpioc0;
  72.         GPIO_OUT = gpioc1;
  73.         if (GPIO_IN & DI1) v |= (1<<i);
  74.     }
  75. #else
  76.         GPIO_OUT = gpioc0;
  77.         GPIO_OUT = gpioc1;
  78.         gi = GPIO_IN;
  79.         GPIO_OUT = gpioc0;
  80.         v |= ((gi>>DIB) & 0x01) <<7;
  81.         GPIO_OUT = gpioc1;
  82.         gi = GPIO_IN;
  83.         GPIO_OUT = gpioc0;
  84.         v |= ((gi>>DIB) & 0x01) <<6;
  85.         GPIO_OUT = gpioc1;
  86.         gi = GPIO_IN;
  87.         GPIO_OUT = gpioc0;
  88.         v |= ((gi>>DIB) & 0x01) <<5;
  89.         GPIO_OUT = gpioc1;
  90.         gi = GPIO_IN;
  91.         GPIO_OUT = gpioc0;
  92.         v |= ((gi>>DIB) & 0x01) <<4;
  93.         GPIO_OUT = gpioc1;
  94.         gi = GPIO_IN;
  95.         GPIO_OUT = gpioc0;
  96.         v |= ((gi>>DIB) & 0x01) <<3;
  97.         GPIO_OUT = gpioc1;
  98.         gi = GPIO_IN;
  99.         GPIO_OUT = gpioc0;
  100.         v |= ((gi>>DIB) & 0x01) <<2;
  101.         GPIO_OUT = gpioc1;
  102.         gi = GPIO_IN;
  103.         GPIO_OUT = gpioc0;
  104.         v |= ((gi>>DIB) & 0x01) <<1;
  105.         GPIO_OUT = gpioc1;
  106.         gi = GPIO_IN;
  107.         GPIO_OUT = gpioc0;
  108.         v |= ((gi>>DIB) & 0x01) <<0;
  109. #endif
  110.     return v;
  111. }
  112. static void
  113. spiflash_read_bytes(UINT8 *target, unsigned len)
  114. {
  115.     while (len--) {
  116.         *target++ = spiflash_read_byte();
  117.     }
  118. }
  119. unsigned
  120. spiflash_read_id(void)
  121. {
  122.     unsigned v=0;
  123.     spiflash_assert_cs();
  124.     spiflash_write_byte(0x90);
  125.     spiflash_write_byte(0x0);
  126.     spiflash_write_byte(0x0);
  127.     spiflash_write_byte(0x0);
  128.     v = (v<<8) |spiflash_read_byte();
  129.     v = (v<<8) |spiflash_read_byte();
  130.     return v;
  131. }
  132. void
  133. spiflash_write_enable(void)
  134. {
  135.     spiflash_assert_cs();
  136.     spiflash_write_byte(0x06);
  137.     spiflash_deassert_cs();
  138. }
  139. void
  140. spiflash_write_disable(void)
  141. {
  142.     spiflash_assert_cs();
  143.     spiflash_write_byte(0x04);
  144.     spiflash_deassert_cs();
  145. }
  146. void
  147. spiflash_write_status(unsigned status)
  148. {
  149.     spiflash_assert_cs();
  150.     spiflash_write_byte(0x01);
  151.     spiflash_write_byte(status);
  152. }
  153. unsigned
  154. spiflash_read_status(void)
  155. {
  156.     unsigned v;
  157.     spiflash_assert_cs();
  158.     spiflash_write_byte(0x05);
  159.     v = spiflash_read_byte();
  160.     return v;
  161. }
  162. void
  163. spiflash_program(UINT8 *src, unsigned address, unsigned len)
  164. {
  165.     spiflash_assert_cs();
  166.     spiflash_write_byte(0x02);
  167.     spiflash_write_byte(address>>16);       // 23:16
  168.     spiflash_write_byte(address>>8);        // 15:8
  169.     spiflash_write_byte(address>>0);        // 7:0
  170.     while (len--) {
  171.         spiflash_write_byte(*src++);
  172.     }
  173.     spiflash_deassert_cs();
  174. }
  175. void
  176. spiflash_fast_read(UINT8 *target, unsigned address, unsigned len)
  177. {
  178.     spiflash_assert_cs();
  179.     spiflash_write_byte(0x0B);
  180.     spiflash_write_byte(address>>16);       // 23:16
  181.     spiflash_write_byte(address>>8);        // 15:8
  182.     spiflash_write_byte(address>>0);        // 7:0
  183.     spiflash_read_byte();
  184.     spiflash_read_bytes(target, len);
  185. }