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

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

?? sysspinvram.c

?? vxworks 串口通信程序例子 對vxworks下開發串口通信程序很有幫助
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* sysSpiNvRam.c - SPI interface to serial EEPROM library */
 
 /* Copyright 1984-1996 Wind River Systems, Inc. */
 #include "copyright_wrs.h"
 
 /*
 modification history
 --------------------
 */
 
 /*
 DESCRIPTION
 This library contains routines to manipulate non-volatile RAM (NV-RAM)
 which is accessed as a Serial Peripheral Interface (SPI).  Read and write
 routines are included.
 
 The macro NV_RAM_SIZE must be defined to provide parameter checking
 for sysNvRamSet() and sysNvRamGet().  The macro NV_BOOT_OFFSET must be
 defined and point to an offset that allows enough room for 256 bytes.
 
 This library provides processor specific routines.
 
 SEE ALSO:
 .pG "Configuration" */
 
 
 /* includes */
 
 #include "vxWorks.h"
 #include "vme.h"
 #include "memLib.h"
 #include "cacheLib.h"
 #include "sysLib.h"
 #include "config.h"
 #include "string.h"
 #include "intLib.h"
 #include "logLib.h"
 #include "stdio.h"
 #include "taskLib.h"
 #include "vxLib.h"
 #include "arch/ppc/vxPpcLib.h"
 #include "drv/sio/ppc860Sio.h"
 #include "drv/multi/ppc860Siu.h"
 #include "yourBsp.h" /* e.g. ads860.h */
 
 /* Definitions for SPI. */
 #define SPI_RX_BD_BASE	0x480
 #define SPI_TX_BD_BASE	0x488
 
 #define SPI_TX_BUF_SZ	0x100
 #define SPI_RX_BUF_SZ	0x100
 #define SPI_TRANS_RX_BD_LAST	0x0800		/* last in frame */
 #define SPI_TRANS_RX_BD_WRAP    0x2000		/* wrap back to first BD */
 #define SPI_TRANS_RX_BD_EMPTY	0x8000		/* buffer is empty */
 #define SPI_TRANS_TX_BD_LAST	0x0800		/* last in frame */
 #define SPI_TRANS_TX_BD_WRAP	0x2000		/* wrap back to first BD */
 #define SPI_TRANS_TX_BD_READY	0x8000		/* ready for Tx */
 
 #define SPI_INTERFACE_PINS	0x0000E
 #define EnSPI	0x0F77
 #define DisSPI	0x0E77
 #define SPI_STR	0x80
 
 #define SPI_SERIAL_EEPROM_SZ  NV_RAM_SIZE  /* bytes */
 #define SPI_SERIAL_CMD_SEQ_SZ 3
 
 LOCAL UCHAR	eep_wt_scratch[(SPI_SERIAL_EEPROM_SZ + SPI_SERIAL_CMD_SEQ_SZ)];
 LOCAL UCHAR*	eep_wt_ptr;
 
 LOCAL UCHAR	spiTxBuf[SPI_TX_BUF_SZ];
 LOCAL UCHAR	spiRxBuf[SPI_RX_BUF_SZ];
 
 typedef struct          /* SPI_BUF */
 {
   VUINT16 statusMode;     /* status and control */
   VUINT16 dataLength;     /* length of data buffer in bytes */
   u_char *    dataPointer;        /* points to data buffer */
 } SPI_BD;
  
 typedef struct          /* SPI_PARAM */
 {
   VUINT16 rbase;          /* Rx buffer descriptor base address */
   VUINT16 tbase;          /* Tx buffer descriptor base address */
   VUINT8  rfcr;           /* Rx function code */
   VUINT8  tfcr;           /* Tx function code */
   VUINT16 mrblr;          /* maximum receive buffer length */
   VUINT32 rstate;         /* Rx internal state */
   VUINT32 res1;           /* reserved/internal */
   VUINT16 rbptr;          /* Rx buffer descriptor pointer */
   VUINT16 res2;           /* reserved/internal */
   VUINT32 res3;           /* reserved/internal */
   VUINT32 tstate;         /* Tx internal state */
   VUINT32 res4;           /* reserved/internal */
   VUINT16 tbptr;          /* Tx buffer descriptor pointer */
   VUINT16 res5;           /* reserved/internal */
   VUINT32 res6;           /* reserved/internal */
   VUINT32 res7;           /* reserved/internal */
   VUINT16 rpbase;         /* relocatable parameter ram base */
   VUINT16 res8;           /* reserved/internal */
 } SPI_PARAM;
 typedef SPI_PARAM *pSPI_PARAM;
 typedef SPI_BD * pSPI_BD ;
 
 typedef struct spi_dev
 {
   BOOL              init;
   BOOL              open;
   pSPI_PARAM          pPram;
   pSPI_BD             pTxBdBase;
   UINT16              txBdBaseOffset;
   int                 txBdNext;
   pSPI_BD             pRxBdBase;
   UINT16              rxBdBaseOffset;
   int                 rxBdNext;
   VUINT32             xmitState;
   VUINT32             rcvState;
   VUINT32             regBase;        /* register/DPR base address */
   VUINT32             dualpRam;       /* dual port ram base address */
   VUINT16             pram_base_offset;
   INT32               loopbackType;   /* type of loopback to use */
 } SPI_DEV;
 
 LOCAL SPI_DEV		spiDev =
 {
   FALSE, FALSE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
   NULL, NULL, NULL
 };
 
 
 /* Forward declarations for NV-RAM (serial EEPROM). */
 LOCAL STATUS	sysNvRamGetStatus(
                                   void);
 LOCAL void	sysNvRamWriteEnable(
                                 void);
 LOCAL void	sysNvRamWriteByte(
                               UCHAR		data,
                               USHORT		eep_addr);
 
 
 /******************************************************************************
 *
 * sysHwSpiInit - initializes NV-RAM
 *
 * This routine initializes NV-RAM to prepare for subsequent reads from or
 * writes to NV-RAM.
 *
 * RETURNS: none
 */
 
 void	sysHwSpiInit(
                      void)
 {
   SPI_DEV*	pSpi;
 
 
   pSpi = &spiDev;
 
   /* SPI initialization cannot occur more than once. */
   if (pSpi->init == TRUE)
     {
       return;
     }
 
   /* Get IMMR register base. */
   pSpi->regBase = vxImmrGet();
 
   /* Get pointer to dual-ported RAM. */
   pSpi->dualpRam = (INT32) DPRAM(pSpi->regBase);
 
   /* Set pointer to SPI parameter RAM. */
   pSpi->pPram = (pSPI_PARAM) (PPC860_DPR_SPI(pSpi->dualpRam));
 
   /* Clear parameter RAM values. */
   pSpi->pPram->rbase	= 0;
   pSpi->pPram->tbase	= 0;
   pSpi->pPram->rfcr	= 0;
   pSpi->pPram->tfcr	= 0;
   pSpi->pPram->mrblr	= 0;
   pSpi->pPram->rstate	= 0;
   pSpi->pPram->res1	= 0;
   pSpi->pPram->rbptr	= 0;
   pSpi->pPram->res2	= 0;
   pSpi->pPram->res3	= 0;
   pSpi->pPram->tstate	= 0;
   pSpi->pPram->res4	= 0;
   pSpi->pPram->tbptr	= 0;
   pSpi->pPram->res5	= 0;
   pSpi->pPram->res6	= 0;
   pSpi->pPram->rpbase	= 0;
   pSpi->pPram->res8	= 0;
 
   /* Set up SCC dual-ported RAM. */
 #ifdef	INCLUDE_CPM
 	{
 	UINT32	tempeRx = (UINT32) allocDpramFromPool(8);
 	UINT32	tempeTx = (UINT32) allocDpramFromPool(8);
 	pSpi->rxBdBaseOffset = (UINT16) (tempeRx & 0x0000FFFF);
 	pSpi->txBdBaseOffset = (UINT16) (tempeTx & 0x0000FFFF);
 
 	/* Adjust dual port RAM addresses, which are offsets from IMMR. */
 	pSpi->rxBdBaseOffset -= 0x2000;
 	pSpi->txBdBaseOffset -= 0x2000;
 	}
 #else
   pSpi->rxBdBaseOffset = (UINT16) SPI_RX_BD_BASE;
   pSpi->txBdBaseOffset = (UINT16) SPI_TX_BD_BASE;
 #endif
   pSpi->pRxBdBase = (pSPI_BD) (pSpi->dualpRam + pSpi->rxBdBaseOffset);
   pSpi->pTxBdBase = (pSPI_BD) (pSpi->dualpRam + pSpi->txBdBaseOffset);
 
   /*
   **	Configure port B pins to enable SPIMOSI, SPIMISO and SPICLK pins.
   **	PBPAR and PBDIR bits 30, 29, 28 ones;
   **	PBODR bits 30, 29, 28 zeros.
   **	(SPI_INTERFACE_PINS is 0xE.)
   */
   *PBPAR(pSpi->regBase) |= SPI_INTERFACE_PINS;
   *PBDIR(pSpi->regBase) |= SPI_INTERFACE_PINS;
 
   /* Set up the Port B pins. */
   *PBPAR(pSpi->regBase) &= ~0x00001;		/* make CS a GP I/O pin */
   *PBDIR(pSpi->regBase) |=  0x00001;
   *PBDAT(pSpi->regBase) |=  0x00001;		/* de-assert for now */
 
   /*
   **	Write RBASE and TBASE in the SPI parameter RAM to point to
   **	Rx BD and Tx BD in dual port RAM.
   */
   pSpi->pPram->rbase = (UINT16) ((UINT32) pSpi->rxBdBaseOffset & 0x0000ffff);
   pSpi->pPram->tbase = (UINT16) ((UINT32) pSpi->txBdBaseOffset & 0x0000ffff);
 
   /* Initialize Rx and Tx parameters for SPI. */
   *MPC860_CPCR(pSpi->regBase) = 0x0051;
 
   /* Wait for initialization to complete. */
   while (*MPC860_CPCR(pSpi->regBase) & 1)
     {
       /* Busy-wait. */
       ;
     }
 
   /* Initialize the SDMA register. */
   *MPC860_SDCR(pSpi->regBase) |= 0x0001;
 
   /* Write MRBLR with the maximum # of bytes per receive. */
   /* SPI_RX_BUF_SZ is 0x100. */
   pSpi->pPram->mrblr = 1;
 
   /* Write RFCR and TFCR for normal operation. */
   /* MPC860_RFCR_MOT_BE is 0x18. */
   pSpi->pPram->rfcr = MPC860_RFCR_MOT_BE;
   pSpi->pPram->tfcr = MPC860_RFCR_MOT_BE;
 
   /* Set up buffer pointers. */
   eep_wt_ptr = &eep_wt_scratch[0];
 
   /* Initialize buffer descriptors. */
   pSpi->pTxBdBase->statusMode =
     (SPI_TRANS_TX_BD_LAST | SPI_TRANS_TX_BD_WRAP);
   pSpi->pTxBdBase->dataLength  = 0;
   pSpi->pTxBdBase->dataPointer = spiTxBuf;
 
   pSpi->pRxBdBase->statusMode =
     (SPI_TRANS_RX_BD_EMPTY | SPI_TRANS_RX_BD_LAST | SPI_TRANS_RX_BD_WRAP);
   pSpi->pRxBdBase->dataLength  = 0;
   pSpi->pRxBdBase->dataPointer = spiRxBuf;
 
   /* Clear events. */
   *MPC860_SPIE(pSpi->regBase) = 0xFF;
 
   pSpi->init = TRUE;
 
   *MPC860_SPMODE(pSpi->regBase) = DisSPI;
 
   return;
 }	/* end of sysHwSpiInit */
 
 
 /******************************************************************************
 *
 * sysNvRamGet - get the contents of non-volatile RAM
 *
 * This routine copies the contents of non-volatile memory into a specified
 * string.  The string is terminated with an EOS.
 *
 * RETURNS: OK, or ERROR if access is outside the non-volatile RAM range.
 *
 * SEE ALSO: sysNvRamSet(), sysHwSpiInit()
 */
 
 STATUS	sysNvRamGet(
                     char*	string,
                     int		strLen,
                     int		offset)
 {
   UCHAR		eeprom_data[(SPI_SERIAL_EEPROM_SZ + SPI_SERIAL_CMD_SEQ_SZ)];
   SPI_DEV*	pSpi;
 
   pSpi = &spiDev;
 
   if (pSpi->init != TRUE)
       return(ERROR);
 
   offset += NV_BOOT_OFFSET;   /* boot line begins at <offset> = 0 */
   
   if ((offset < 0)
       || (strLen < 0)
       || ((offset + strLen) > SPI_SERIAL_EEPROM_SZ))
     return (ERROR);
 
   /* Wait for EEPROM to become ready. */
   while (sysNvRamGetStatus() == ERROR)
     {
       /* Busy-wait. */
       ;
     }
 
   /* Assert EEPROM chip select (CS). */
   *PBDAT(pSpi->regBase) &= 0x3FFFE;
 
   /* Disable SPI (serial port interface). */
   *MPC860_SPMODE(pSpi->regBase) = DisSPI;
 
   /* Set SPI read value. */
   pSpi->pPram->mrblr = strLen + SPI_SERIAL_CMD_SEQ_SZ;
 
   /* Set up buffer descriptors. */
   pSpi->pRxBdBase->dataPointer = &eeprom_data[0];
   pSpi->pRxBdBase->dataLength = 0;
   pSpi->pRxBdBase->statusMode = (SPI_TRANS_RX_BD_EMPTY | SPI_TRANS_RX_BD_WRAP);
   pSpi->pTxBdBase->dataPointer = eep_wt_ptr;
   pSpi->pTxBdBase->statusMode = 0x0000;
 
   /* Enable SPI. */
   *MPC860_SPMODE(pSpi->regBase) = EnSPI;
 
   /* Set up for "read data from memory array beginning at selected addr". */
   *eep_wt_ptr = 3;
 
   /* Start address of EEPROM block to be read. */
   *(USHORT*) (eep_wt_ptr + 1) = (USHORT)offset;
 
 	/* Buffer length to read. */
   pSpi->pTxBdBase->dataLength = strLen + SPI_SERIAL_CMD_SEQ_SZ;
 
   pSpi->pTxBdBase->statusMode = ( SPI_TRANS_TX_BD_READY |
                                   SPI_TRANS_TX_BD_WRAP  |
                                   SPI_TRANS_TX_BD_LAST );
 
 	/* Start transfer. */
   *MPC860_SPCOM(pSpi->regBase) = SPI_STR;
 
   /* Wait for reading to finish. */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美偷拍一区二区| 成人午夜大片免费观看| 欧美日韩国产高清一区二区三区 | 在线观看视频一区| 亚洲品质自拍视频网站| 欧美在线视频你懂得| 亚洲第一福利一区| 欧美一区二区三区成人| 久久精品国产精品亚洲精品 | 奇米精品一区二区三区在线观看一| 欧美性色黄大片手机版| 日本欧美一区二区三区乱码 | 久久99国产精品久久99果冻传媒| 精品入口麻豆88视频| 国产一区二区女| 国产精品免费aⅴ片在线观看| 北岛玲一区二区三区四区 | 2024国产精品视频| 国产成人av一区| 亚洲视频在线观看一区| 欧美三级在线视频| 极品瑜伽女神91| 久久九九99视频| 色综合久久88色综合天天免费| 亚洲一二三四久久| 欧美一级片在线看| 成人午夜视频在线| 亚洲高清免费视频| 国产日韩综合av| 欧美日韩一区二区三区四区 | 麻豆国产一区二区| 亚洲国产精品99久久久久久久久| 欧美午夜寂寞影院| 高清视频一区二区| 亚洲一区二区三区激情| 国产日本亚洲高清| 欧美三级在线视频| 成人一区二区三区视频在线观看| 亚洲午夜三级在线| 国产欧美综合色| 欧美伦理视频网站| 成人精品免费视频| 蜜桃av噜噜一区二区三区小说| 综合久久给合久久狠狠狠97色| 日韩一区二区三区视频| 色中色一区二区| 国产精品一区二区免费不卡| 天天色 色综合| 亚洲激情男女视频| 国产欧美日产一区| 精品国产一区二区三区忘忧草| av影院午夜一区| 国内精品伊人久久久久影院对白| 亚洲一区av在线| 1区2区3区精品视频| 久久久久久久综合狠狠综合| 欧美日韩国产三级| 91婷婷韩国欧美一区二区| 国产一区欧美日韩| 日韩综合在线视频| 亚洲自拍偷拍网站| 一区二区三区四区不卡在线 | 国产成人丝袜美腿| 蜜臀av性久久久久av蜜臀妖精 | 麻豆精品在线视频| 天堂成人国产精品一区| 亚洲青青青在线视频| 国产精品另类一区| 久久免费电影网| 久久久亚洲欧洲日产国码αv| 日韩视频在线你懂得| 欧美片网站yy| 欧美日韩一区在线| 欧美日韩中文字幕一区| 欧美唯美清纯偷拍| 欧美日韩在线电影| 欧美日韩激情一区二区三区| 在线观看精品一区| 欧美性猛片xxxx免费看久爱| 在线看一区二区| 欧美日韩黄色影视| 91精品欧美久久久久久动漫| 911精品国产一区二区在线| 精品视频一区三区九区| 色婷婷久久久久swag精品| 在线观看视频91| 欧美美女一区二区| 日韩一区国产二区欧美三区| 日韩午夜激情av| 精品国产乱码久久久久久牛牛 | 国产一区二区三区不卡在线观看| 精品一区二区三区在线视频| 精彩视频一区二区三区| 久久超碰97中文字幕| 韩国精品主播一区二区在线观看 | 在线免费观看成人短视频| 欧美性受xxxx| 日韩欧美中文一区| 精品国产伦一区二区三区观看体验 | 久久无码av三级| 国产欧美精品一区二区色综合朱莉 | 亚洲成精国产精品女| 蜜臀av国产精品久久久久 | 婷婷久久综合九色综合伊人色| 三级亚洲高清视频| 精品一区二区三区久久久| 国产伦精品一区二区三区视频青涩| 成人涩涩免费视频| 色丁香久综合在线久综合在线观看| 日本韩国欧美一区| 日韩一区二区视频| 久久九九99视频| 一区二区三区高清不卡| 日韩高清国产一区在线| 国产一区二区三区免费在线观看| 99精品欧美一区| 69堂国产成人免费视频| 久久久国产综合精品女国产盗摄| 中文字幕一区在线观看视频| 久久精品国产免费| 色狠狠综合天天综合综合| 日韩视频一区二区| 亚洲色图欧美在线| 久久国产精品99久久久久久老狼| 成人h动漫精品一区二区| 欧美午夜精品一区| 久久精品男人天堂av| 亚洲国产aⅴ天堂久久| 成人一区二区三区视频在线观看| 欧美日韩免费高清一区色橹橹| 久久奇米777| 午夜视频一区二区| 91在线porny国产在线看| 日韩写真欧美这视频| 一区二区三区中文字幕电影| 经典一区二区三区| 制服丝袜激情欧洲亚洲| 日韩毛片一二三区| 国产真实乱偷精品视频免| 欧美日韩一区不卡| 中文字幕一区二区在线播放| 狠狠色综合色综合网络| 欧美日韩一区中文字幕| 亚洲视频一二三| 国产精品综合网| 日韩精品一区二区三区视频| 亚洲免费视频成人| 成人黄动漫网站免费app| 精品久久久久久无| 午夜国产精品一区| 99国产一区二区三精品乱码| 久久综合视频网| 日本成人在线网站| 欧美三级视频在线观看| 一区二区三区免费在线观看| 97精品久久久午夜一区二区三区 | 国产一区二区导航在线播放| 91精品国产综合久久精品图片| 亚洲精品美国一| 99精品国产视频| 日韩毛片视频在线看| 成人国产在线观看| 国产精品久久久久久妇女6080| 精品一区二区久久| 欧美变态凌虐bdsm| 开心九九激情九九欧美日韩精美视频电影 | ...av二区三区久久精品| 国产剧情av麻豆香蕉精品| 精品国产露脸精彩对白| 精品亚洲porn| 精品粉嫩aⅴ一区二区三区四区| 奇米亚洲午夜久久精品| 日韩一级高清毛片| 精品亚洲国内自在自线福利| 欧美一区日韩一区| 美国欧美日韩国产在线播放| 成人短视频下载| av不卡免费电影| 亚洲猫色日本管| 色综合久久综合网97色综合| 亚洲欧美怡红院| 91黄色激情网站| 亚洲成a人片在线不卡一二三区| 欧美午夜精品久久久久久孕妇| 亚洲国产精品视频| 日韩欧美中文字幕公布| 精品一二线国产| 国产日韩综合av| 91麻豆国产精品久久| 亚洲一二三级电影| 日韩色视频在线观看| 麻豆精品久久精品色综合| 国产亚洲成年网址在线观看| 99久久久无码国产精品| 亚洲自拍偷拍麻豆| 欧美一卡二卡三卡四卡| 国产一区二区三区免费播放| 国产精品国产精品国产专区不蜜 | 欧美国产精品一区| 色婷婷国产精品久久包臀|