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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sndssio.c

?? 4510b的vxworks的BSP
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* sndsSio.c - Samsung SNDS100 serial driver */

/*
modification history
--------------------
01c,25nov99,ak  changed sndsTxStartup as per Samsung note
01b,08Oct99,ak	Added polled mode support
01a,22aug99,ak  adapated from WRS sio template
*/

/*
DESCRIPTION

This is an sio driver for Samsung's SNDS100 evaluation board for their
KS32C50100 microprocessor.  This is an ARM based processor with several 
integrated peripherals.  It has an interrupt controller, two 32-bit timers,
one Ethernet controller,two HDLC controllers, one IIC controller, general 
purpose I/O ports, and a 2 channel DMA controller.

The 2 UART channels integrated with the processor are controlled by this
driver.  Both the UARTs can work in interrupt mode as well as DMA mode.
This driver supports only the interrupt mode for the UARTs.

All the UART registers are accessible as 32-bit integers from the internal
system registers.  The macros SNDS_REG_READ and SNDS_REG_WRITE read and write
32-bit integers from and to the given addresses.  SNDS_SIO_DEFAULT_BAUD is
defined to 38400 in this file.  This is the default baud rate with which 
the UART channels will be initialized.  The channels are also initialized 
with one start bit, one stop bit, 8 bit data and no parity bits.

The driver is typically only called only by the BSP. The directly callable
routines in this module are sndsDevInit(), sndsDevInit2(), sndsIntRcv(), 
sndsIntTx(), and sndsIntErr().

The BSP calls sndsDevInit() to initialize or reset the device.
It connects the driver's interrupt handlers (sndsIntRcv, sndsIntTx,
and sndsIntErr), using intConnect().
After connecting the interrupt handlers, the BSP calls sndsDevInit2()
to inform the driver that interrupt mode operation is now possible.

INCLUDES:
sndsSio.h sioLib.h
*/

#include "vxWorks.h"
#include "sioLib.h"
#include "intLib.h"
#include "errno.h"
#include "sndsSio.h"
#include "ioLib.h"


#define SNDS_BAUD_MIN	1200
#define SNDS_BAUD_MAX	460860
#define SNDS_SIO_DEFAULT_BAUD 38400

/* Hardware abstraction macros */

/* local defines  */

#ifndef SNDS_REG_READ
#define SNDS_REG_READ(pChan, reg, result) \
	((result) = (*(volatile UINT32 *)((UINT32)(pChan)->regs + (reg))))
#endif	/*SNDS_REG_READ*/

#ifndef SNDS_REG_WRITE
#define SNDS_REG_WRITE(pChan, reg, data) \
	((*(volatile UINT32 *)((UINT32)(pChan)->regs + (reg))) = (data))
#endif	/*SNDS_REG_WRITE*/


/* for backward compatibility */

#ifndef	SIO_HUP
#   define SIO_OPEN	0x100A	/* open channel, raise DTR, RTS */
#   define SIO_HUP	0x100B	/* hang-up, lower DTR, RTS */
#endif

/* forward static declarations */

LOCAL int	sndsTxStartup (SIO_CHAN * pSioChan);
LOCAL int	sndsCallbackInstall (SIO_CHAN *pSioChan, int callbackType,
				    STATUS (*callback)(), void *callbackArg);
LOCAL int	sndsPollOutput (SIO_CHAN *pSioChan, char	outChar);
LOCAL int	sndsPollInput (SIO_CHAN *pSioChan, char *thisChar);
LOCAL int	sndsIoctl (SIO_CHAN *pSioChan, int request, void *arg);
LOCAL STATUS	dummyCallback (void);

/* local variables */

LOCAL	SIO_DRV_FUNCS sndsSioDrvFuncs =
    {
    sndsIoctl,
    sndsTxStartup,
    sndsCallbackInstall,
    sndsPollInput,
    sndsPollOutput
    };

LOCAL BOOL sndsIntrMode = FALSE;	/* interrupt mode allowed flag */

/******************************************************************************
*
* sndsDevInit - initialize a SNDS_DUSART
*
* This routine initializes the driver
* function pointers and then resets the chip in a quiescent state.
* The BSP must have already initialized all the device addresses and the
* baudFreq fields in the SNDS_DUSART structure before passing it to
* this routine.
*
* RETURNS: N/A
*/

void sndsDevInit
    (
    SNDS_CHAN * pChan
    )
    {
    /* initialize each channel's driver function pointers */

    pChan->sio.pDrvFuncs	= &sndsSioDrvFuncs;

    /* install dummy driver callbacks */

    pChan->getTxChar    = dummyCallback;
    pChan->putRcvChar	= dummyCallback;
    
    /* reset the chip */

    SNDS_REG_WRITE(pChan,SNDS_ULCON,(EXT_CLK | PARITY_NONE | ONE_STOP |WORD_LEN));


    /* setting polled mode is one way to make the device quiet */

    sndsIoctl ((SIO_CHAN *)pChan,SIO_MODE_SET,(void *)SIO_MODE_POLL);
	sndsIoctl ((SIO_CHAN *)pChan, SIO_BAUD_SET, (void *)SNDS_SIO_DEFAULT_BAUD);

    }

/******************************************************************************
*
* sndsDevInit2 - initialize a SNDS_DUSART, part 2
*
* This routine is called by the BSP after interrupts have been connected.
* The driver can now operate in interrupt mode.  Before this routine is
* called only polled mode operations should be allowed.
*
* RETURNS: N/A
* ARGSUSED
*/

void sndsDevInit2
    (
    SNDS_CHAN * pChan		/* device to initialize */
    )
    {
	char outchar = NULL;
    /* Interrupt mode is allowed */

    SNDS_REG_WRITE(pChan,SNDS_UCON,UCON_RX|UCON_TX);

	/* 
	 * Dummy write to TXBUF to start TX empty interrupt
	 */

	SNDS_REG_WRITE(pChan,SNDS_UTXBUF,outchar);
    sndsIntrMode = TRUE;
    }

/******************************************************************************
*
* sndsIntRcv - handle a channel's receive-character interrupt
*
* RETURNS: N/A
*/ 

void sndsIntRcv
    (
    SNDS_CHAN *	pChan		/* channel generating the interrupt */
    )
    {
    char            inChar;
    UINT32	    status;

    /*
     * Grab the input character from the chip and hand it off via a
     * callback. For chips with input FIFO's it is more efficient
     * to empty the entire FIFO here.
     */
    SNDS_REG_READ(pChan,SNDS_USTAT, status);

    if((status & USTAT_RX_READY) == USTAT_RX_READY)
    {
    SNDS_REG_READ(pChan,SNDS_URXBUF, inChar);
	(*pChan->putRcvChar) (pChan->putRcvArg, inChar);
    }
    }

/******************************************************************************
*
* sndsIntTx - handle a channels transmitter-ready interrupt
*
* RETURNS: N/A
*/ 

void sndsIntTx
    (
    SNDS_CHAN *	pChan		/* channel generating the interrupt */
    )
    {
    char            outChar;
	UINT32	status;
    /*
     * If there's a character to transmit then write it out, else reset
     * the transmitter. For chips with output FIFO's it is more efficient
     * to fill the entire FIFO here.
     */

    SNDS_REG_READ(pChan,SNDS_USTAT, status);	

    if((status & USTAT_TX_READY) != USTAT_TX_READY)	
		return;
	if ((*pChan->getTxChar) (pChan->getTxArg, &outChar) != ERROR)
		SNDS_REG_WRITE(pChan, SNDS_UTXBUF, outChar);
	else
	{	
	    if (pChan == &sndsChan[0])
		{
	        intDisable (INT_LVL_UARTTX0);
		    /* *(UINT32 *) SNDS_INT_CSR_PEND = (1 << INT_LVL_UARTTX0); */
		}
	    else
		{
	        intDisable (INT_LVL_UARTTX1);
		    /* *(UINT32 *) SNDS_INT_CSR_PEND = (1 << INT_LVL_UARTTX1); */
		}
	}
    }

/******************************************************************************
*
* sndsTxStartup - start the interrupt transmitter
*
* RETURNS: OK on success, ENOSYS if the device is polled-only, or
* EIO on hardware error.
*/

LOCAL int sndsTxStartup
    (
    SIO_CHAN * pSioChan                 /* channel to start */
    )
    {
    SNDS_CHAN * pChan = (SNDS_CHAN *)pSioChan;
	*(UINT32 *)SNDS_IOPMOD = 0xff ;

	if (pChan == &sndsChan[0])
	{
		SNDS_REG_WRITE(pChan, SNDS_UTXBUF, NULL);
		*(UINT32 *)SNDS_IOPDATA = 0x0f ;
	    /* *(UINT32 *) SNDS_INTPENDTST |= (1 << INT_LVL_UARTTX0); */
        intEnable (INT_LVL_UARTTX0);
	}
    else if (pChan == &sndsChan[1])
	{
		SNDS_REG_WRITE(pChan, SNDS_UTXBUF, NULL);
	    /* *(UINT32 *) SNDS_INTPENDTST |= (1 << INT_LVL_UARTTX1); */
        intEnable (INT_LVL_UARTTX1);
	}
    return (OK);
    }

/******************************************************************************
*
* sndsCallbackInstall - install ISR callbacks to get/put chars
*
* This driver allows interrupt callbacks for transmitting characters
* and receiving characters. In general, drivers may support other
* types of callbacks too.
*
* RETURNS: OK on success, or ENOSYS for an unsupported callback type.
*/ 

LOCAL int sndsCallbackInstall
    (
    SIO_CHAN *	pSioChan,               /* channel */
    int		callbackType,           /* type of callback */
    STATUS	(*callback)(),          /* callback */
    void *      callbackArg             /* parameter to callback */
    )
    {
    SNDS_CHAN * pChan = (SNDS_CHAN *)pSioChan;
    switch (callbackType)
	{
	case SIO_CALLBACK_GET_TX_CHAR:
	    pChan->getTxChar	= callback;
	    pChan->getTxArg	= callbackArg;
	    return (OK);

	case SIO_CALLBACK_PUT_RCV_CHAR:
	    pChan->putRcvChar	= callback;
	    pChan->putRcvArg	= callbackArg;
	    return (OK);

	default:
	    return (ENOSYS);
	}
    }

/*******************************************************************************
*
* sndsPollOutput - output a character in polled mode
*
* RETURNS: OK if a character arrived, EIO on device error, EAGAIN
* if the output buffer if full. ENOSYS if the device is
* interrupt-only.
*/

LOCAL int sndsPollOutput
    (
    SIO_CHAN *	pSioChan,
    char	outChar
    )
    {
    SNDS_CHAN * pChan = (SNDS_CHAN *)pSioChan;
    UINT32	status;

    /* is the transmitter ready to accept a character? */

    SNDS_REG_READ (pChan, SNDS_USTAT, status);
    if ((status & USTAT_TX_READY) == 0x00)
		return (EAGAIN);

    /* write out the character */

    SNDS_REG_WRITE(pChan, SNDS_UTXBUF, outChar);
	return (OK);
    }

/******************************************************************************
*
* sndsPollInput - poll the device for input
*
* RETURNS: OK if a character arrived, EIO on device error, EAGAIN
* if the input buffer if empty, ENOSYS if the device is
* interrupt-only.
*/

LOCAL int sndsPollInput
    (
    SIO_CHAN *	pSioChan,
    char *	thisChar
    )
    {
    SNDS_CHAN * pChan = (SNDS_CHAN *)pSioChan;
    UINT32	status;

    SNDS_REG_READ (pChan,SNDS_USTAT, status);

    if ((status & USTAT_RX_AVAIL) == 0x00)
		return (EAGAIN);	/* no input available at this time */

    /* got a character */

    SNDS_REG_READ(pChan, SNDS_URXBUF, *thisChar);

    return (OK);
    }

/******************************************************************************
*
* sndsModeSet - toggle between interrupt and polled mode
*
* RETURNS: OK on success, EIO on unsupported mode.
*/

LOCAL int sndsModeSet
    (
    SNDS_CHAN * pChan,		/* channel */
    uint_t	newMode        	/* new mode */
    )
    {
    UINT32	temp;


    if ((newMode != SIO_MODE_POLL) && (newMode != SIO_MODE_INT))	
	return (EIO);


    /* Don't enter interrupt mode unless it is allowed. */

    if ((newMode == SIO_MODE_INT) && (!sndsIntrMode))
	return (EIO);

    /* set the new mode */

    pChan->mode = newMode;

    if (pChan->mode == SIO_MODE_INT)
		{
  
 	   	SNDS_REG_READ(pChan, SNDS_UCON, temp);
		temp &=UCON_RX_TX_RESET;	/**Reset RX and TX mode bits*/
    	temp |= (UCON_RX|UCON_TX);
    	SNDS_REG_WRITE(pChan,SNDS_UCON, temp);
		if (pChan == &sndsChan[0])
			{
        	intEnable(INT_LVL_UARTRX0);
			}
    	else if (pChan == &sndsChan[1])
			{
         	intEnable(INT_LVL_UARTRX1);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一级片在线观看| 亚洲无线码一区二区三区| 91国内精品野花午夜精品 | 日韩精品视频网| 欧美韩国日本不卡| 6080日韩午夜伦伦午夜伦| 成人h动漫精品一区二| 免费欧美日韩国产三级电影| 亚洲日本青草视频在线怡红院| 欧美一卡二卡在线| 在线观看日韩一区| 大陆成人av片| 国产福利一区二区三区视频| 日本成人在线看| 亚洲不卡av一区二区三区| 国产精品精品国产色婷婷| 久久久国产精华| 日韩欧美国产wwwww| 欧美日韩1区2区| 色婷婷综合久色| 成人网页在线观看| 国产一区视频在线看| 免费久久精品视频| 亚洲不卡一区二区三区| 一区二区三区欧美视频| 国产精品成人在线观看| 国产欧美一区二区在线| 久久综合精品国产一区二区三区| 3d动漫精品啪啪| 欧美精品成人一区二区三区四区| 色噜噜久久综合| 在线观看av一区二区| 色狠狠色噜噜噜综合网| 9久草视频在线视频精品| 高清在线成人网| 国产成人免费视频一区| 国产河南妇女毛片精品久久久 | 国产精品高清亚洲| 日本一区二区成人在线| 国产目拍亚洲精品99久久精品| 久久综合av免费| 久久久久国色av免费看影院| 久久久国产精华| 国产精品你懂的在线欣赏| 国产精品无码永久免费888| 国产精品久久夜| 最新不卡av在线| 亚洲激情五月婷婷| 午夜婷婷国产麻豆精品| 日日夜夜精品视频天天综合网| 日韩精品乱码免费| 六月丁香综合在线视频| 国产一区二区三区在线看麻豆| 国产美女娇喘av呻吟久久| 国产精品小仙女| 91麻豆精品一区二区三区| 欧美视频一区二区三区| 欧美一区二区不卡视频| 国产亚洲欧美一级| 亚洲欧美日韩一区| 亚洲va在线va天堂| 国内精品视频666| 成人免费毛片aaaaa**| 日本韩国欧美三级| 欧洲在线/亚洲| 精品成a人在线观看| 国产精品理论在线观看| 亚洲午夜久久久久久久久电影院| 日本成人在线网站| 成人黄页在线观看| 欧美日韩在线电影| 久久一二三国产| 亚洲女人****多毛耸耸8| 日韩国产欧美在线视频| 国产激情一区二区三区四区 | 日韩欧美美女一区二区三区| 久久久www成人免费毛片麻豆| 欧美国产日韩在线观看| 亚洲精品大片www| 精品综合免费视频观看| 91麻豆免费观看| 精品国产一区二区三区忘忧草 | 日韩视频在线你懂得| 26uuu亚洲| 一区二区在线观看av| 久久精品国产久精国产| 色综合一个色综合亚洲| 亚洲精品一区二区三区蜜桃下载 | 狠狠色狠狠色综合| 色八戒一区二区三区| 久久久综合激的五月天| 亚洲午夜电影在线观看| 国产成人亚洲综合a∨猫咪| 欧美三级电影精品| 中文字幕国产一区| 美女网站色91| 在线观看av一区| 国产精品对白交换视频| 狠狠狠色丁香婷婷综合久久五月| 色8久久精品久久久久久蜜| 中文字幕字幕中文在线中不卡视频| 亚洲精品福利视频网站| 成人一区二区三区视频在线观看| 制服丝袜中文字幕一区| 一区二区三区丝袜| 成人美女视频在线看| 欧美变态tickle挠乳网站| 亚洲综合免费观看高清完整版| 国产精品一区在线观看乱码| 69精品人人人人| 亚洲人吸女人奶水| 成人午夜激情在线| 久久理论电影网| 美女网站色91| 日韩视频在线一区二区| 婷婷中文字幕一区三区| 在线免费观看日本欧美| 国产精品久久久久久久午夜片| 黄色小说综合网站| 欧美一区二区精品久久911| 亚洲国产综合色| 91麻豆精东视频| 亚洲色图.com| 99国产精品久久久久久久久久久| 久久九九久久九九| 国产成人免费高清| 精品成人一区二区三区四区| 久久成人综合网| 日韩女优av电影| 激情五月婷婷综合网| 精品国产在天天线2019| 久久精品国产99国产精品| 精品免费一区二区三区| 国内精品在线播放| 久久久精品日韩欧美| 国产精品一级在线| 欧美激情一区三区| 成人99免费视频| 自拍偷拍亚洲激情| 欧美在线观看一区| 午夜精品成人在线视频| 欧美日韩久久久| 亚洲一区二区三区视频在线| 色一情一伦一子一伦一区| 一区二区三区不卡在线观看 | 日韩精品一区二区三区中文不卡 | voyeur盗摄精品| 中文字幕一区二区三区av| 成人av资源在线| 国产精品国产三级国产aⅴ原创| 白白色亚洲国产精品| 亚洲男同性视频| 日本精品免费观看高清观看| 亚洲激情第一区| 精品视频1区2区3区| 亚洲二区在线观看| 欧美精品一级二级| 美国欧美日韩国产在线播放| 精品国产免费一区二区三区香蕉| 国产一区二区三区四区在线观看| 日本一区二区三区免费乱视频| 91一区二区在线观看| 日日夜夜免费精品视频| 久久精品夜夜夜夜久久| 91丨porny丨在线| 三级不卡在线观看| 中文字幕精品一区二区三区精品| 91在线精品一区二区| 日日噜噜夜夜狠狠视频欧美人| 亚洲精品在线电影| 一道本成人在线| 蜜桃精品视频在线观看| 国产精品色眯眯| 欧美日韩精品久久久| 精品一区二区久久久| 亚洲激情第一区| 精品国产三级a在线观看| 92国产精品观看| 美女高潮久久久| 综合自拍亚洲综合图不卡区| 日韩一卡二卡三卡国产欧美| jizzjizzjizz欧美| 日本va欧美va精品| 亚洲视频在线观看三级| 日韩精品一区二区三区中文精品 | 久久久久国产精品麻豆ai换脸 | 久久精品日韩一区二区三区| 欧洲精品一区二区三区在线观看| 精品一区二区三区久久久| 亚洲精品免费在线播放| 精品日韩一区二区| 91成人免费网站| 国产不卡在线视频| 卡一卡二国产精品| 亚洲一区二区三区不卡国产欧美| 久久免费看少妇高潮| 91精品在线免费| 色丁香久综合在线久综合在线观看| 国内精品久久久久影院色| 亚洲伊人色欲综合网|