亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? spi.c

?? Rtems drivers for mpc8260
?? C
字號:
/*$Id: spi.c,v 1.1 2002/03/07 16:38:11 rogers Exp $
 *
 * This file contains the functions for performing SPI I/O.
 *
 *  Author: flpan 
 *  Copyright (C) 2000 by UTStarcom, Inc.
 *
 *
 *  $Log: spi.c,v $
 *  Revision 1.1  2002/03/07 16:38:11  rogers
 *  First cut, includes serial EEPROM driver
 *
 *
 */
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <tmacros.h>
#include <rtems.h>
#include <bsp.h>
#include <rtems/libio.h>
#include <mpc8260.h>

#include "cmntypes.h"
#include "spi.h"

volatile U8 Spi_Rx_Buf[4];
BOOL Fpga_Config_Flag = FALSE;

extern rtems_cpu_table Cpu_table;
extern void putbuf_raw(char *buf_p);
extern void putchar_raw(char ch);

void fpga_progress (U32 percent);

static volatile m8260BufferDescriptor_t *RxBd, *TxBd;


/*
 * Dummy function
 */
void putbuf_raw(char *pStr)
{
}

rtems_status_code spi_initialize(rtems_device_major_number major,
                                  rtems_device_minor_number minor,
		                  void *arg)
{
  volatile m8260SPIparms_t  *spiparms;
  
  /* Allocate buffer descriptors */
  /* Rx buffer only one */
  RxBd = M8260AllocateBufferDescriptors(1);
  TxBd = M8260AllocateBufferDescriptors(1);
  
  /* configure port D to enable SPICLK,SPIMOSI,SPIMISO pins */
  m8260.iop[3].psor |= (SPI_CLK | SPI_OUTPUT | SPI_INPUT);
  m8260.iop[3].ppar |= (SPI_CLK | SPI_OUTPUT | SPI_INPUT);
  m8260.iop[3].pdir &= ~(SPI_CLK | SPI_OUTPUT | SPI_INPUT);
  m8260.iop[3].podr &= ~(SPI_CLK | SPI_OUTPUT | SPI_INPUT);

  /* Set initial output levels */
  m8260.iop[1].pdat |= FPGA_PROGRAM | SPI_EEPROM_CS | SPI_EEPROM_HOLD |
                       SPI_EEPROM_WP;

  /* configure PB25,26,27,29,30,31 as general purpose I/O pins */
  m8260.iop[1].ppar &= ~(FPGA_PROGRAM | FPGA_INIT | FPGA_DONE |
                         SPI_EEPROM_CS | SPI_EEPROM_HOLD | SPI_EEPROM_WP);
  
  /* configure PB25,26,27,31 as output */ 
  m8260.iop[1].pdir |= FPGA_PROGRAM | SPI_EEPROM_CS | SPI_EEPROM_HOLD |
                       SPI_EEPROM_WP;
  /* configure PB29,30 as input */ 
  m8260.iop[1].pdir &= ~(FPGA_INIT | FPGA_DONE); 		 
  
  /* configure PB25,26,27,29,30,31 as actively driven */
  m8260.iop[1].podr &= ~(FPGA_PROGRAM | FPGA_INIT | FPGA_DONE |
                         SPI_EEPROM_CS | SPI_EEPROM_HOLD | SPI_EEPROM_WP);

  /* Setup pointer to SPI parameter RAM */
  m8260.spi_base = (char *)&m8260.spip - (char *)&m8260;
  
  /* set up SPI parameter RAM */
  spiparms = (m8260SPIparms_t*)&m8260.spip;

  spiparms->rbase = (char *)RxBd - (char *)&m8260;
  spiparms->tbase = (char *)TxBd - (char *)&m8260;
  spiparms->rfcr = M8260_RFCR_MOT | M8260_RFCR_GBL;
  spiparms->tfcr = M8260_TFCR_MOT | M8260_TFCR_GBL;
  /* every read cycle will return 3 bytes(cmd,adr,data) */
  spiparms->mrblr = 4;
  
  /* set up the RxBd */
  RxBd->status = M8260_BD_EMPTY | M8260_BD_WRAP;
  /* polling mode           M8260_BD_INTERRUPT;*/
  RxBd->length = 0;
  RxBd->buffer = &Spi_Rx_Buf[0];
  
  /* set up the TxBds */
  TxBd->status = M8260_BD_WRAP;

  /* clear any previous event */
  m8260.spie = 0xFF;

  /* using polling mode, disable all interrupts such as TXE,TXB,RXB */
  m8260.spim = 0x00;

   m8260.spmode = SPI_NORMAL_MODE ;
  
  /* init Rx & Tx PARAMS */
  M8260ExecuteRISC(M8260_CR_OP_INIT_RX_TX | M8260_CR_PGSB_SPI); 

#if 1
   if (fpga_configure() != SPI_SUCCESSFUL)
   {
      Fpga_Config_Flag = FALSE;
			putbuf_raw(" failed\r\n");
   }
   else
   {
      Fpga_Config_Flag = TRUE;
			putbuf_raw(" ok\r\n");
   }
#endif

   return SPI_SUCCESSFUL;

}/* end of m8260_spi_initialize() */ 

rtems_status_code spi_control(rtems_device_major_number major,
                              rtems_device_minor_number minor,
			      void *arg_p)
{
  spi_ctrl_t        *ctrl_p = (spi_ctrl_t *) arg_p;
  spi_eeprom_parm_t    *eeprom_parm;
  rtems_status_code error_code;

  /* check if major and minor numbers are valid */
  if((major != SPI_MAJOR_NUMBER) || (minor != SPI_MINOR_NUMBER))
  {
    return RTEMS_INVALID_NUMBER;
  }

  switch(ctrl_p->opcode)
  {
    case SPI_CONFIG_FPGA:
      error_code = fpga_configure();
      break;

    case SPI_EEPROM_XFER:
      eeprom_parm = (spi_eeprom_parm_t *)ctrl_p->data_p;
      
      m8260_spi_eeprom_mode(eeprom_parm->length);

      error_code = spi_eeprom_xfer((void *)eeprom_parm);

      m8260_spi_normal_mode();
      break;

    default:
      error_code = SPI_FAILURE;
      break;
  }
  
  return((error_code == SPI_SUCCESSFUL) ? RTEMS_SUCCESSFUL : error_code);
}

void m8260_spi_start()
{
  m8260.spcom = M8260_SPCOM_STR;
}

void m8260_spi_fast_mode()
{
  /* disable SPI */
  m8260.spmode &= ~M8260_SPMODE_EN;
  
  /* clear any previous event */
  m8260.spie = 0xFF;
  
  /* set up spmode */
  m8260.spmode = SPI_FAST_MODE;
  
  /* enable SPI */
  m8260.spmode |= M8260_SPMODE_EN;
}

void m8260_spi_normal_mode()
{
  /* disable SPI */
  m8260.spmode &= ~(M8260_SPMODE_EN);
  
  /* clear any previous event */
  m8260.spie = 0xFF;
  
  /* set up spmode */
  m8260.spmode = SPI_NORMAL_MODE;

  m8260.spip.mrblr = 4;

  /* enable SPI */
  m8260.spmode |= M8260_SPMODE_EN;
}

void m8260_spi_loop_normal()
{
  /* disable SPI */
  m8260.spmode &= ~M8260_SPMODE_EN;
  
  /* clear any previous event */
  m8260.spie = 0xFF;
  
  /* set up spmode */
  m8260.spmode &= ~M8260_SPMODE_LOOP;
  
  /* enable SPI */
  m8260.spmode |= M8260_SPMODE_EN;

}

void m8260_spi_loop_back()
{
  /* disable SPI */
  m8260.spmode &= ~(M8260_SPMODE_EN);
  
  /* clear any previous event */
  m8260.spie = 0xFF;
  
  /* set up spmode */
  m8260.spmode |= M8260_SPMODE_LOOP;
  
  /* enable SPI */
  m8260.spmode |= M8260_SPMODE_EN;
}

/*
 * Real Time Clock functionality
 */
void m8260_spi_eeprom_mode(U16 mrbl)
{
  /* disable SPI */
  m8260.spmode &= ~(M8260_SPMODE_EN);
  
  /* clear any previous event */
  m8260.spie = 0xFF;
  
  /* set up spmode */
  m8260.spmode = SPI_EEPROM_MODE;

  m8260.spip.mrblr = mrbl;

  /* enable SPI */
  m8260.spmode |= M8260_SPMODE_EN;
}

rtems_status_code spi_eeprom_xfer(void *arg_p)
{
 
  spi_eeprom_parm_t *parm = (spi_eeprom_parm_t *)arg_p;
  U32 level;

  if(parm->tx_p == NULL || parm->rx_p == NULL || parm->length < 1)
    return (U32)SPI_FAILURE;

  TxBd->length = parm->length;
  TxBd->buffer = parm->tx_p;
  TxBd->status = M8260_BD_EMPTY | M8260_BD_WRAP |
                            M8260_BD_LAST;
  RxBd->buffer = parm->rx_p;

  /* active chip select signal */
  m8260.iop[1].pdat &= ~SPI_EEPROM_CS;

  /* start SPI transfer  */ 
  m8260.spcom = M8260_SPCOM_STR;

  if(parm->length <= 4)
    delay(50);                /* Optimize short xfers, including WRITE */
  else
    rtems_task_wake_after(1); /* Wait 10ms */

  /* deactive chip select signal */
  m8260.iop[1].pdat |= SPI_EEPROM_CS;

  _CPU_ISR_Disable(level);
  RxBd->buffer = &Spi_Rx_Buf[0]; /* Set Rx buffer ptr back to normal */

  if(RxBd->status & M8260_BD_EMPTY || TxBd->status & M8260_BD_READY)
  {
    _CPU_ISR_Enable(level);
    
    /* clear any previous event */
    m8260.spie = 0xFF;
    
    return (U32)SPI_FAILURE;
  }
  
  /* reset the RxBd status */
  RxBd->status = M8260_BD_EMPTY | M8260_BD_WRAP;
  
  _CPU_ISR_Enable(level);
  
  /* clear any previous event */
  m8260.spie = 0xFF;
  
  return (U32)SPI_SUCCESSFUL;
}

rtems_status_code fpga_configure()
{
  S32 j = 0, length = 0, spi_fd = 0;
	S32 read_len = 0;
	S8 fpga_buf[SPI_PAGE_SIZE];
	struct stat stat_info;
  
  /* change SPI port to fast mode */
  #if 0
  m8260_spi_fast_mode();
  #else
  m8260_spi_normal_mode();
  #endif
  
  /* Open the spi file */
  spi_fd = open (FPGA_FILE_NAME, O_RDONLY, 0755);

  if (spi_fd < 0)
	{
		return SPI_FAILURE;
	}

	if (fstat (spi_fd, &stat_info) < 0)
	{
		close (spi_fd);
		return SPI_FAILURE;
	}

  /* step1:hold FPGA /PROGRAM pin 1ms then turn to high, this will force 
   *       FPGAs to clear its' configurtion memory. It is used to initiate
   *       a configuration cycle.
   */
  m8260.iop[1].pdat &= ~FPGA_PROGRAM;
  delay(1000);
  m8260.iop[1].pdat |= FPGA_PROGRAM;

  /* check FPGA /INIT signal */
  j = 0; 
  while((m8260.iop[1].pdat & FPGA_INIT) == 0)
  {
    delay(1000);
    j++;
    if( j >= 5)
    {
      return(SPI_FAILURE); 
    }
  }
   
  /*step2: initiate load file from flash memory to FPGA */
	length = stat_info.st_size;

#if 0
	/* The first 16 bytes contains the magic number and the version
	 * So read beyond the header
	 */
	if (lseek (spi_fd, FLASH_HEADER_LEN, SEEK_SET) != FLASH_HEADER_LEN)
	{
		close (spi_fd);
		return SPI_FAILURE;
	}

  /*step2: initiate load file from flash memory to FPGA */
	length -= FLASH_HEADER_LEN;
#endif

  j = 0;
	putbuf_raw("program FPGA    ");
  while (length > 0)
  {
		read_len = read (spi_fd, fpga_buf, SPI_PAGE_SIZE);
    if(length < SPI_PAGE_SIZE)
    {
      TxBd->length = read_len; 
    }
    else
    {
      TxBd->length = SPI_PAGE_SIZE; 
    }
    
    TxBd->buffer = (void *) fpga_buf;
    TxBd->status = M8260_BD_EMPTY | M8260_BD_WRAP |
                              M8260_BD_LAST;

    /* start SPI transfer  */ 
    m8260.spcom = M8260_SPCOM_STR;

    /* check SPI transmit status */
    j = 0;
    while(TxBd->status & M8260_BD_EMPTY)
    {
      /*
       * We cannot rtems_task_wake_after() here, since we are doing this
       * before the kernel is completely up and running.
       */
      delay(1000);

      j++;
      if(j > 100000) 
      {  
	m8260_spi_normal_mode();
        return(SPI_FAILURE);
      }	
    }/* end of second while */
    /* adjust length */
    if(length > SPI_PAGE_SIZE)
    {
      length -= SPI_PAGE_SIZE;
      j++;
    }
    else
    {
      length = 0;
    }
#if defined(SPI_DEBUG)    
    /*step3: check the FPGAs /INIT signal */
    if((m8260.iop[1].pdat & FPGA_INIT) == 0) 
    {    
      m8260_spi_normal_mode();
	close (spi_fd);
      return SPI_FAILURE;
    }
#endif    
    
		fpga_progress(100-length*100/stat_info.st_size);
  }/* end of first while */


  /*step3: check the FPGAs /INIT signal */
  if((m8260.iop[1].pdat & FPGA_INIT) == 0) 
  {    
    m8260_spi_normal_mode();
		close (spi_fd);
		fpga_progress(100);
    return SPI_FAILURE;
  }

  /* check the FPGAs DONE signal */
  j = 0;
  while((m8260.iop[1].pdat & FPGA_DONE) == 0)
  {
    delay(1000);
    j++;
    if(j >= 5) 
    {
      m8260_spi_normal_mode();
      printf("Didn't detect FPGA_DONE\n\r");
			close (spi_fd);
      return SPI_FAILURE;
    }  
  }  
    
  /*step4: recover SPI port to normal mode */
  m8260_spi_normal_mode();
  
  /* reset the RxBd status */
  RxBd->status = M8260_BD_EMPTY | M8260_BD_WRAP;
  
  /* clear any previous event */
  m8260.spie = 0xFF;

	close (spi_fd);

  return SPI_SUCCESSFUL;
}

void fpga_progress (U32 percent)
{
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩在线不卡| 欧美性色综合网| 欧美成人三级电影在线| 一区二区激情视频| 91日韩精品一区| 中文av字幕一区| 成人丝袜高跟foot| 国产精品传媒视频| hitomi一区二区三区精品| 日本一区二区三级电影在线观看| 激情丁香综合五月| 综合久久综合久久| 国产不卡在线一区| 欧美高清在线一区| 国产成人精品免费网站| 久久精品亚洲乱码伦伦中文| 国产乱码精品一品二品| 精品国产91乱码一区二区三区 | 26uuu另类欧美| 热久久免费视频| 欧美精品日韩一本| 麻豆传媒一区二区三区| 欧美刺激脚交jootjob| 国产精品1区二区.| 国产精品嫩草久久久久| 日本道色综合久久| 午夜日韩在线电影| 精品久久久久av影院| 国产乱对白刺激视频不卡| 国产精品久久久久永久免费观看| 99久久久国产精品免费蜜臀| 国产欧美日韩综合精品一区二区| 不卡电影一区二区三区| 亚洲午夜av在线| 精品国产百合女同互慰| 岛国一区二区三区| 亚洲午夜久久久久久久久电影网 | 亚洲成人av在线电影| 91精品婷婷国产综合久久竹菊| 久久电影国产免费久久电影| 国产日韩欧美一区二区三区综合| 91玉足脚交白嫩脚丫在线播放| 亚洲成精国产精品女| 精品国产三级电影在线观看| 成人免费毛片aaaaa**| 中文字幕一区二区三区av| 欧美亚州韩日在线看免费版国语版 | 久久99国产精品久久| 久久综合99re88久久爱| 日本精品一级二级| 国产一区二区三区在线观看免费| 中文字幕一区二| 717成人午夜免费福利电影| 国产传媒日韩欧美成人| 五月婷婷激情综合| 国产日韩欧美精品一区| 欧美精品久久久久久久多人混战| 美女视频第一区二区三区免费观看网站| 欧美国产精品一区二区三区| 欧美三级中文字| 成人高清在线视频| 午夜国产精品一区| 欧美激情一区二区三区全黄| 色综合久久66| 懂色av一区二区在线播放| 亚洲一区二区在线播放相泽| 久久综合九色欧美综合狠狠| 欧美日韩国产综合一区二区三区| 成人自拍视频在线观看| 麻豆91小视频| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美激情艳妇裸体舞| 91精品久久久久久久久99蜜臂| 国产在线不卡视频| 亚洲国产一区在线观看| 亚洲视频在线一区观看| 国产日产精品1区| 制服丝袜日韩国产| 欧美日韩在线观看一区二区| 91丨九色丨尤物| 国产91在线观看| 激情图片小说一区| 日韩av一二三| 香蕉影视欧美成人| 亚洲私人影院在线观看| 中文欧美字幕免费| 欧美国产亚洲另类动漫| 久久精品在线免费观看| 欧美变态tickle挠乳网站| 在线播放中文一区| 欧美日韩情趣电影| 欧美日本在线视频| 欧美系列亚洲系列| a4yy欧美一区二区三区| 风间由美一区二区三区在线观看 | 自拍偷拍欧美精品| 国产精品麻豆久久久| 中文字幕欧美区| 中文字幕av一区二区三区| 精品国产免费人成在线观看| 2020国产精品久久精品美国| 精品国产免费人成电影在线观看四季| 日韩三级免费观看| 日韩精品在线一区二区| 91精品国产一区二区人妖| 欧美欧美午夜aⅴ在线观看| 91精品国产综合久久久久久久久久 | 欧美日韩精品是欧美日韩精品| 在线一区二区三区四区| 在线免费视频一区二区| 欧美丝袜丝交足nylons图片| 欧美精品久久99久久在免费线| 不卡一二三区首页| 欧美这里有精品| 欧美丰满少妇xxxbbb| 精品三级在线看| 国产欧美一二三区| 亚洲精品国产一区二区精华液| 亚洲综合自拍偷拍| 亚洲免费观看在线视频| 亚洲欧洲美洲综合色网| 亚洲国产va精品久久久不卡综合| 男人的天堂亚洲一区| 国产精品99久久久久久宅男| 91天堂素人约啪| 欧美一区二区三区四区高清| 精品黑人一区二区三区久久| 久久久精品蜜桃| 一区二区三区四区高清精品免费观看 | 亚洲综合精品自拍| 日本不卡一区二区三区高清视频| 欧美日韩精品专区| 久久综合99re88久久爱| 亚洲成人av在线电影| 99免费精品在线观看| 欧美岛国在线观看| 亚洲地区一二三色| 色婷婷亚洲综合| 国产欧美一二三区| 韩日av一区二区| 欧美精品久久天天躁| 亚洲欧美日本韩国| 丁香另类激情小说| 久久人人97超碰com| 日本vs亚洲vs韩国一区三区| 色天天综合久久久久综合片| 久久久国产午夜精品| 日本色综合中文字幕| 欧美日韩精品欧美日韩精品| 亚洲欧美怡红院| 粉嫩av一区二区三区在线播放| 欧美成人三级电影在线| 日韩中文字幕不卡| 欧美亚洲日本一区| 高潮精品一区videoshd| 欧美一级片免费看| 亚洲电影一区二区| 色av成人天堂桃色av| 亚洲日本在线观看| 99精品视频在线观看| 欧美国产欧美亚州国产日韩mv天天看完整| 久久精品99国产精品日本| 91精品久久久久久久99蜜桃| 丝瓜av网站精品一区二区| 欧美日韩一区二区三区在线| 亚洲一区在线观看免费 | 国产成人综合自拍| 久久久99免费| 国产成人aaa| 亚洲国产精品精华液2区45| 国产剧情一区二区| 国产日韩精品一区二区三区| 国产91丝袜在线播放0| 国产午夜精品一区二区三区嫩草| 国产精品99久久不卡二区| 久久视频一区二区| 国产精品一二三四五| 国产精品无遮挡| 成人爱爱电影网址| 亚洲人成网站色在线观看| 欧美亚洲图片小说| 蜜臀久久久99精品久久久久久| 91精品国产色综合久久久蜜香臀| 午夜精品免费在线| 精品人在线二区三区| 国产一区二区h| 国产调教视频一区| 一本大道综合伊人精品热热| 日韩精品国产精品| 亚洲精品在线观看网站| 国产91高潮流白浆在线麻豆| 日韩一区有码在线| 91麻豆精品国产91久久久资源速度| 奇米精品一区二区三区四区| 国产三级久久久| 欧美日韩中文字幕一区| 国模大尺度一区二区三区| 亚洲视频中文字幕| 日韩欧美你懂的| 成人黄色国产精品网站大全在线免费观看 |