nicstarmac.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * this file included by nicstar.c
  3.  */
  4. /*
  5.  * nicstarmac.c
  6.  * Read this ForeRunner's MAC address from eprom/eeprom
  7.  */
  8. #define CYCLE_DELAY 5
  9. /* This was the original definition
  10. #define osp_MicroDelay(microsec) 
  11.     do { int _i = 4*microsec; while (--_i > 0) { __SLOW_DOWN_IO; }} while (0)
  12. */
  13. #define osp_MicroDelay(microsec) {unsigned long useconds = (microsec); 
  14.                                   udelay((useconds));}
  15. /* The following tables represent the timing diagrams found in
  16.  * the Data Sheet for the Xicor X25020 EEProm.  The #defines below
  17.  * represent the bits in the NICStAR's General Purpose register
  18.  * that must be toggled for the corresponding actions on the EEProm
  19.  * to occur.
  20.  */
  21. /* Write Data To EEProm from SI line on rising edge of CLK */
  22. /* Read Data From EEProm on falling edge of CLK */
  23. #define CS_HIGH 0x0002 /* Chip select high */
  24. #define CS_LOW 0x0000 /* Chip select low (active low)*/
  25. #define CLK_HIGH 0x0004 /* Clock high */
  26. #define CLK_LOW 0x0000 /* Clock low  */
  27. #define SI_HIGH 0x0001 /* Serial input data high */
  28. #define SI_LOW 0x0000 /* Serial input data low */
  29. /* Read Status Register = 0000 0101b */
  30. static u_int32_t rdsrtab[] =
  31. {
  32.     CS_HIGH | CLK_HIGH, 
  33.     CS_LOW | CLK_LOW, 
  34.     CLK_HIGH,             /* 0 */
  35.     CLK_LOW, 
  36.     CLK_HIGH,             /* 0 */
  37.     CLK_LOW, 
  38.     CLK_HIGH,             /* 0 */
  39.     CLK_LOW,
  40.     CLK_HIGH,             /* 0 */
  41.     CLK_LOW, 
  42.     CLK_HIGH,             /* 0 */
  43.     CLK_LOW | SI_HIGH, 
  44.     CLK_HIGH | SI_HIGH,   /* 1 */
  45.     CLK_LOW | SI_LOW, 
  46.     CLK_HIGH,             /* 0 */
  47.     CLK_LOW | SI_HIGH, 
  48.     CLK_HIGH | SI_HIGH   /* 1 */
  49. };
  50. /* Read from EEPROM = 0000 0011b */
  51. static u_int32_t readtab[] =
  52. {
  53.     /*
  54.     CS_HIGH | CLK_HIGH, 
  55.     */
  56.     CS_LOW | CLK_LOW, 
  57.     CLK_HIGH,             /* 0 */
  58.     CLK_LOW, 
  59.     CLK_HIGH,             /* 0 */
  60.     CLK_LOW, 
  61.     CLK_HIGH,             /* 0 */
  62.     CLK_LOW,
  63.     CLK_HIGH,             /* 0 */
  64.     CLK_LOW, 
  65.     CLK_HIGH,             /* 0 */
  66.     CLK_LOW, 
  67.     CLK_HIGH,             /* 0 */
  68.     CLK_LOW | SI_HIGH, 
  69.     CLK_HIGH | SI_HIGH,   /* 1 */
  70.     CLK_LOW | SI_HIGH, 
  71.     CLK_HIGH | SI_HIGH    /* 1 */
  72. };
  73. /* Clock to read from/write to the eeprom */
  74. static u_int32_t clocktab[] =
  75. {
  76.     CLK_LOW,
  77.     CLK_HIGH,
  78.     CLK_LOW, 
  79.     CLK_HIGH,
  80.     CLK_LOW,
  81.     CLK_HIGH,
  82.     CLK_LOW, 
  83.     CLK_HIGH,
  84.     CLK_LOW, 
  85.     CLK_HIGH,
  86.     CLK_LOW, 
  87.     CLK_HIGH, 
  88.     CLK_LOW, 
  89.     CLK_HIGH,
  90.     CLK_LOW, 
  91.     CLK_HIGH,
  92.     CLK_LOW 
  93. };
  94. #define NICSTAR_REG_WRITE(bs, reg, val) 
  95. while ( readl(bs + STAT) & 0x0200 ) ; 
  96. writel((val),(base)+(reg))
  97. #define NICSTAR_REG_READ(bs, reg) 
  98. readl((base)+(reg))
  99. #define NICSTAR_REG_GENERAL_PURPOSE GP
  100. /*
  101.  * This routine will clock the Read_Status_reg function into the X2520
  102.  * eeprom, then pull the result from bit 16 of the NicSTaR's General Purpose 
  103.  * register.  
  104.  */
  105. u_int32_t
  106. nicstar_read_eprom_status( virt_addr_t base )
  107. {
  108.    u_int32_t val;
  109.    u_int32_t rbyte;
  110.    int32_t i, j;
  111.    /* Send read instruction */
  112.    val = NICSTAR_REG_READ( base, NICSTAR_REG_GENERAL_PURPOSE ) & 0xFFFFFFF0;
  113.    for (i=0; i<sizeof rdsrtab/sizeof rdsrtab[0]; i++)
  114.    {
  115. NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE,
  116. (val | rdsrtab[i]) );
  117.         osp_MicroDelay( CYCLE_DELAY );
  118.    }
  119.    /* Done sending instruction - now pull data off of bit 16, MSB first */
  120.    /* Data clocked out of eeprom on falling edge of clock */
  121.    rbyte = 0;
  122.    for (i=7, j=0; i>=0; i--)
  123.    {
  124. NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE,
  125. (val | clocktab[j++]) );
  126.         rbyte |= (((NICSTAR_REG_READ( base, NICSTAR_REG_GENERAL_PURPOSE)
  127. & 0x00010000) >> 16) << i);
  128. NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE,
  129. (val | clocktab[j++]) );
  130.         osp_MicroDelay( CYCLE_DELAY );
  131.    }
  132.    NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, 2 );
  133.    osp_MicroDelay( CYCLE_DELAY );
  134.    return rbyte;
  135. }
  136. /*
  137.  * This routine will clock the Read_data function into the X2520
  138.  * eeprom, followed by the address to read from, through the NicSTaR's General
  139.  * Purpose register.  
  140.  */
  141.  
  142. static u_int8_t 
  143. read_eprom_byte(u_int32_t base, u_int8_t offset)
  144. {
  145.    u_int32_t val = 0;
  146.    int i,j=0;
  147.    u_int8_t tempread = 0;
  148.    val = NICSTAR_REG_READ( base, NICSTAR_REG_GENERAL_PURPOSE ) & 0xFFFFFFF0;
  149.    /* Send READ instruction */
  150.    for (i=0; i<sizeof readtab/sizeof readtab[0]; i++)
  151.    {
  152. NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE,
  153. (val | readtab[i]) );
  154.         osp_MicroDelay( CYCLE_DELAY );
  155.    }
  156.    /* Next, we need to send the byte address to read from */
  157.    for (i=7; i>=0; i--)
  158.    {
  159.       NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE,
  160.        (val | clocktab[j++] | ((offset >> i) & 1) ) );
  161.       osp_MicroDelay(CYCLE_DELAY);
  162.       NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE,
  163.        (val | clocktab[j++] | ((offset >> i) & 1) ) );
  164.       osp_MicroDelay( CYCLE_DELAY );
  165.    }
  166.    j = 0;
  167.    
  168.    /* Now, we can read data from the eeprom by clocking it in */
  169.    for (i=7; i>=0; i--)
  170.    {
  171.       NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE,
  172.        (val | clocktab[j++]) );
  173.       osp_MicroDelay( CYCLE_DELAY );
  174.       tempread |= (((NICSTAR_REG_READ( base, NICSTAR_REG_GENERAL_PURPOSE )
  175. & 0x00010000) >> 16) << i);
  176.       NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE,
  177.        (val | clocktab[j++]) );
  178.       osp_MicroDelay( CYCLE_DELAY );
  179.    }
  180.    NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, 2 );
  181.    osp_MicroDelay( CYCLE_DELAY );
  182.    return tempread;
  183. }
  184. void
  185. nicstar_init_eprom( virt_addr_t base )
  186. {
  187.     u_int32_t val;
  188.     /*
  189.      * turn chip select off
  190.      */
  191.     val = NICSTAR_REG_READ(base, NICSTAR_REG_GENERAL_PURPOSE) & 0xFFFFFFF0;
  192.     NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE,
  193.      (val | CS_HIGH | CLK_HIGH));
  194.     osp_MicroDelay( CYCLE_DELAY );
  195.     NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE,
  196.      (val | CS_HIGH | CLK_LOW));
  197.     osp_MicroDelay( CYCLE_DELAY );
  198.     NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE,
  199.      (val | CS_HIGH | CLK_HIGH));
  200.     osp_MicroDelay( CYCLE_DELAY );
  201.     NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE,
  202.      (val | CS_HIGH | CLK_LOW));
  203.     osp_MicroDelay( CYCLE_DELAY );
  204. }
  205. /*
  206.  * This routine will be the interface to the ReadPromByte function
  207.  * above.
  208.  */ 
  209. void
  210. nicstar_read_eprom(
  211.     virt_addr_t base,
  212.     u_int8_t prom_offset,
  213.     u_int8_t *buffer,
  214.     u_int32_t nbytes )
  215. {
  216.     u_int i;
  217.     
  218.     for (i=0; i<nbytes; i++)
  219.     {
  220. buffer[i] = read_eprom_byte( base, prom_offset );
  221. ++prom_offset;
  222.   osp_MicroDelay( CYCLE_DELAY );
  223.     }
  224. }
  225. /*
  226. void osp_MicroDelay(int x) {
  227.     
  228. }
  229. */