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

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

?? sngks32csio.c

?? 440bx vxworks bsp
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* sngks32cSio.c - Samsung S3C44B0X serial driver */


/* Copyright 1984-2001 Wind River Systems, Inc. */
#include "copyright_wrs.h"

/*
modification history
--------------------
01o,27jul04,a_m  BSP定制 for 多刃劍開發板
01c,30nov01,m_h  Save pChan->baudRate when setting baud
01b,26apr01,m_h  convert tabs to spaces for readability
01a,12apr01,m_h  created from snds100 template.
*/

/*
DESCRIPTION

This is the serial I/O driver for Samsung's KS32C50100 microprocessor which 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 SNGKS32C_REG_READ and SNGKS32C_REG_WRITE read and write
32-bit integers from and to the given addresses.  SNGKS32C_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 sngks32cDevInit(), sngks32cDevInit2(), sngks32cIntRcv(), 
sngks32cIntTx(), and sngks32cIntErr().

The BSP calls sngks32cDevInit() to initialize or reset the device.
It connects the driver's interrupt handlers (sngks32cIntRcv(), sngks32cIntTx(),
and sngks32cIntErr()), using intConnect().
After connecting the interrupt handlers, the BSP calls sngks32cDevInit2()
to inform the driver that interrupt mode operation is now possible.

INCLUDES:
sngks32cSio.h sioLib.h

SEE ALSO:
<Samsung KS32C50100 User's Manual>

*/

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

#define SNGKS32C_BAUD_MIN         1200
#define SNGKS32C_BAUD_MAX         460860
#define SNGKS32C_SIO_DEFAULT_BAUD 38400

/* Hardware abstraction macros */

/* local defines  */

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

#ifndef SNGKS32C_SIO_REG_WRITE
#define SNGKS32C_SIO_REG_WRITE(pChan, reg, data) \
    ((*(volatile UINT32 *)((UINT32)(pChan)->regs + (reg))) = (data))
#endif    /*SNGKS32C_SIO_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    sngks32cTxStartup (SIO_CHAN * pSioChan);
LOCAL int    sngks32cCallbackInstall (SIO_CHAN *pSioChan, int callbackType,
                                      STATUS (*callback)(), void *callbackArg);
LOCAL int    sngks32cPollOutput (SIO_CHAN *pSioChan, char    outChar);
LOCAL int    sngks32cPollInput (SIO_CHAN *pSioChan, char *thisChar);
LOCAL int    sngks32cIoctl (SIO_CHAN *pSioChan, int request, void *arg);
LOCAL STATUS dummyCallback (void);

/* local variables */

LOCAL    SIO_DRV_FUNCS sngks32cSioDrvFuncs =
    {
    sngks32cIoctl,
    sngks32cTxStartup,
    sngks32cCallbackInstall,
    sngks32cPollInput,
    sngks32cPollOutput
    };

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

/******************************************************************************
*
* sngks32cDevInit - initialize a SNGKS32C_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 SNGKS32C_DUSART structure before passing it to
* this routine.
*
* RETURNS: N/A
*/

void sngks32cDevInit
    (
    SNGKS32C_CHAN * pChan
    )
    {
    /* initialize each channel's driver function pointers */

    pChan->sio.pDrvFuncs    = &sngks32cSioDrvFuncs;

    /* install dummy driver callbacks */

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

	/*SNGKS32C_SIO_REG_WRITE(pChan,SNGKS32C_ULCON,(INT_CLK | PARITY_NONE | ONE_STOP | WORD_LEN));*/
	/*  : deleeted and added */
	SNGKS32C_SIO_REG_WRITE(pChan,SNGKS32C_ULCON,(PARITY_NONE | ONE_STOP | WORD_LEN));
	SNGKS32C_SIO_REG_WRITE(pChan,S3C44B0X_UFCON,0x97);	/*0值禁止使用FIFO*/
	SNGKS32C_SIO_REG_WRITE(pChan,S3C44B0X_UMCON,0);

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

    sngks32cIoctl ((SIO_CHAN *)pChan, SIO_MODE_SET, (void *)SIO_MODE_POLL);
    sngks32cIoctl ((SIO_CHAN *)pChan, SIO_BAUD_SET, (void *)SNGKS32C_SIO_DEFAULT_BAUD);

    }

/******************************************************************************
*
* sngks32cDevInit2 - initialize a SNGKS32C_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 sngks32cDevInit2
    (
    SNGKS32C_CHAN * pChan        /* device to initialize */
    )
    {
    char      outchar = '\0';
    UINT32    status;

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

    SNGKS32C_SIO_REG_WRITE(pChan,SNGKS32C_UTXBUF,outchar);

    /* Interrupt mode is allowed */

    /*SNGKS32C_SIO_REG_WRITE(pChan,SNGKS32C_UCON,UCON_RX|UCON_TX|UCON_BREAK);*/
	/*  : deleted and added */
    SNGKS32C_SIO_REG_WRITE(pChan,SNGKS32C_UCON,UCON_TX_LEVEL|UCON_RX|UCON_TX|0x80);
    SNGKS32C_SIO_REG_READ(pChan,SNGKS32C_USTAT, status);    
    while ((status & USTAT_TX_READY) != USTAT_TX_READY)
        SNGKS32C_SIO_REG_READ(pChan,SNGKS32C_USTAT, status); /*  : added */
    /*SNGKS32C_SIO_REG_WRITE(pChan,SNGKS32C_UCON,UCON_RX|UCON_TX);*/
	/*  : deleted and added */
    SNGKS32C_SIO_REG_WRITE(pChan,SNGKS32C_UCON,UCON_TX_LEVEL|UCON_RX|UCON_TX|0x80);
    sngks32cIntrMode = TRUE;
    }

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

void sngks32cIntRcv
    (
    SNGKS32C_CHAN *    pChan        /* channel generating the interrupt */
    )
    {
    char            inChar;
    UINT32        status;
    FAST int     oldlevel;    		/*  : added */
 
	oldlevel = intLock ();			/*  : added */

    /*
     * 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.
     */
    /*SNGKS32C_SIO_REG_READ(pChan,SNGKS32C_USTAT, status);

    if((status & USTAT_RX_READY) == USTAT_RX_READY)
        {
        SNGKS32C_SIO_REG_READ(pChan,SNGKS32C_URXBUF, inChar);
        (*pChan->putRcvChar) (pChan->putRcvArg, inChar);
        }*/
	/*  : deleted and added, 循環處理FIFO */
    while(1){
		SNGKS32C_SIO_REG_READ(pChan,S3C44B0X_UFSTAT, status);
    	if((status & UFSTAT_RX_COUNT) == 0) break;
        SNGKS32C_SIO_REG_READ(pChan,SNGKS32C_URXBUF, inChar);
        (*pChan->putRcvChar) (pChan->putRcvArg, inChar);
    }
	
	intUnlock (oldlevel);			/*  : added */
    }
static int sending = 0;		/*  : added */		
/******************************************************************************
*
* sngks32cIntTx - handle a channels transmitter-ready interrupt
*
* RETURNS: N/A
*/ 

void sngks32cIntTx
    (
    SNGKS32C_CHAN *    pChan        /* channel generating the interrupt */
    )
    {
    char      outChar;
    UINT32    status;
    FAST int     oldlevel; 	/*  : added */
    /*
     * 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.
     */

    /*SNGKS32C_SIO_REG_READ(pChan,SNGKS32C_USTAT, status);    

    if((status & USTAT_TX_READY) != USTAT_TX_READY)    
        return;*/
	/*  : deleted and added, 針對FIFO */
 	SNGKS32C_SIO_REG_READ(pChan,S3C44B0X_UFSTAT, status);
	
	if((status & UFSTAT_TX_FULL) == UFSTAT_TX_FULL) 
		return;

	oldlevel = intLock ();	/*  : added */

    if ((*pChan->getTxChar) (pChan->getTxArg, &outChar) != ERROR){
        SNGKS32C_SIO_REG_WRITE(pChan, SNGKS32C_UTXBUF, outChar);
		while(1){			/*  : added */
			SNGKS32C_SIO_REG_READ(pChan,S3C44B0X_UFSTAT, status);    
    		if((status & UFSTAT_TX_FULL) == UFSTAT_TX_FULL) break;

			if ((*pChan->getTxChar) (pChan->getTxArg, &outChar) == ERROR) break;

			SNGKS32C_SIO_REG_WRITE(pChan, SNGKS32C_UTXBUF, outChar);
		}	
    }	
    else
        {    
        intDisable (pChan->intLevelTx);
		sending = 0;		/*  : added */
        /**(UINT32 *) S3C44B0X_INTPEND = (1 << pChan->intLevelTx);*/
		/*  : deleted and added */
		*(UINT32 *) S3C44B0X_I_ISPC = (1 << pChan->intLevelTx);
        }
    intUnlock (oldlevel);
    }
/******************************************************************************
*
* sngks32cTxStartup - start the interrupt transmitter
*
* RETURNS: OK on success, ENOSYS if the device is polled-only, or
* EIO on hardware error.
*/

LOCAL int sngks32cTxStartup
    (
    SIO_CHAN * pSioChan                 /* channel to start */
    )
    {
    char      outChar;			/*  : added */
    UINT32    status;			/*  : added */
    FAST int     oldlevel;    	/*  : added */

    SNGKS32C_CHAN * pChan = (SNGKS32C_CHAN *)pSioChan;
	/*  : deleted */
    /**(UINT32 *) SNGKS32C_INTPENDTST |= (1 << pChan->intLevelTx);*/

	/*  : added */
	SNGKS32C_SIO_REG_READ(pChan,S3C44B0X_UFSTAT, status);    
    if((status & UFSTAT_TX_FULL) == UFSTAT_TX_FULL)    
        return (OK);
	if(sending == 1) return OK;
    oldlevel = intLock ();
	
    intEnable (pChan->intLevelTx);

	/*  : added */
	sending = 1;
    if ((*pChan->getTxChar) (pChan->getTxArg, &outChar) != ERROR)
        SNGKS32C_SIO_REG_WRITE(pChan, SNGKS32C_UTXBUF, outChar);
    intUnlock (oldlevel);


    return (OK);
    }

/******************************************************************************
*
* sngks32cCallbackInstall - 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 sngks32cCallbackInstall
    (
    SIO_CHAN *    pSioChan,               /* channel */
    int           callbackType,           /* type of callback */
    STATUS        (*callback)(),          /* callback */
    void *        callbackArg             /* parameter to callback */
    )
    {
    SNGKS32C_CHAN * pChan = (SNGKS32C_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);
    }
    }

/*******************************************************************************
*
* sngks32cPollOutput - 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 sngks32cPollOutput
    (
    SIO_CHAN *pSioChan,
    char      outChar
    )
    {
    SNGKS32C_CHAN * pChan = (SNGKS32C_CHAN *)pSioChan;
    UINT32    status;

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

    SNGKS32C_SIO_REG_READ (pChan, SNGKS32C_USTAT, status);
    if ((status & USTAT_TX_READY) == 0x00)
        return (EAGAIN);

    /* write out the character */

    SNGKS32C_SIO_REG_WRITE(pChan, SNGKS32C_UTXBUF, outChar);
    return (OK);
    }

/******************************************************************************
*
* sngks32cPollInput - 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 sngks32cPollInput
    (
    SIO_CHAN *    pSioChan,
    char *        thisChar
    )
    {
    SNGKS32C_CHAN * pChan = (SNGKS32C_CHAN *)pSioChan;
    UINT32    status;

    SNGKS32C_SIO_REG_READ (pChan,SNGKS32C_USTAT, status);

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

    /* got a character */

    SNGKS32C_SIO_REG_READ(pChan, SNGKS32C_URXBUF, *thisChar);

    return (OK);
    }

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲动漫另类| 91国偷自产一区二区使用方法| 日韩黄色一级片| 久久国产尿小便嘘嘘尿| 久久精品国产色蜜蜜麻豆| 免费一区二区视频| 国产九九视频一区二区三区| 国产中文字幕精品| 成人一级片网址| 色婷婷精品大在线视频| 欧美日韩国产免费| 精品免费一区二区三区| 久久九九99视频| 亚洲欧美激情视频在线观看一区二区三区 | 国产不卡在线视频| 色欲综合视频天天天| 欧美一卡2卡3卡4卡| 国产精品网曝门| 亚洲成人1区2区| 国产高清视频一区| 欧美日韩国产在线观看| 国产片一区二区三区| 午夜成人免费电影| 99这里都是精品| 亚洲精品一区二区三区四区高清| 亚洲视频一区在线观看| 久久99精品国产麻豆不卡| 色欧美88888久久久久久影院| 精品福利视频一区二区三区| 亚洲线精品一区二区三区八戒| 国产电影精品久久禁18| 精品国产百合女同互慰| 日本中文字幕一区二区视频| 欧美亚洲一区三区| 亚洲精品视频免费观看| 97久久超碰国产精品| 国产欧美一区二区精品仙草咪| 麻豆国产91在线播放| 777奇米成人网| 九九精品视频在线看| 欧美mv日韩mv| 国产精品一线二线三线| 中文字幕不卡在线观看| 国产成人精品免费网站| 国产精品污污网站在线观看| 国产v日产∨综合v精品视频| 中文字幕乱码一区二区免费| 99麻豆久久久国产精品免费优播| 国产色产综合色产在线视频| 成人不卡免费av| 综合电影一区二区三区| 欧美主播一区二区三区美女| 午夜精品成人在线| 精品久久久久久无| 不卡高清视频专区| 麻豆免费看一区二区三区| 精品国精品自拍自在线| 色婷婷激情一区二区三区| 蜜臀久久久99精品久久久久久| 国产欧美精品一区二区三区四区| 成人污污视频在线观看| 午夜视频一区二区三区| 亚洲精品中文在线| 奇米色777欧美一区二区| 久久久久久久久一| 国产日韩欧美在线一区| 国产精品美女久久久久aⅴ| 久久久久久亚洲综合| 欧美精品久久久久久久多人混战| 色av一区二区| 欧美一区二区三区电影| 日韩视频在线你懂得| 欧美一二三区在线观看| 国产亚洲欧美在线| 亚洲女同ⅹxx女同tv| 午夜视频一区二区三区| 欧美a级理论片| 国产成人高清在线| 色综合天天综合给合国产| 欧美久久久久中文字幕| 欧美年轻男男videosbes| 欧美日韩精品一区视频| 欧美三级电影在线观看| 日韩精品影音先锋| 久久精品在线免费观看| 亚洲少妇屁股交4| 日韩精品久久久久久| 久久精品久久久精品美女| 久久99最新地址| heyzo一本久久综合| 一本色道亚洲精品aⅴ| 欧美剧在线免费观看网站| 日韩免费视频线观看| 国产精品理论片在线观看| 一区二区三区在线视频观看58 | 欧美成人r级一区二区三区| www国产成人免费观看视频 深夜成人网| 久久品道一品道久久精品| 亚洲免费观看在线观看| 老鸭窝一区二区久久精品| 成人永久aaa| 日韩精品专区在线影院观看 | 丁香五精品蜜臀久久久久99网站| 高清shemale亚洲人妖| 欧美区一区二区三区| 亚洲国产精品黑人久久久| 丝袜美腿成人在线| 9i在线看片成人免费| 久久精品人人做人人爽97| 精品中文字幕一区二区小辣椒| 欧美日韩精品欧美日韩精品一综合| 国产精品天美传媒| 国产一区二区三区在线观看免费视频| 色狠狠一区二区三区香蕉| 久久精品欧美日韩精品| 视频一区视频二区中文| 日本韩国欧美一区| 国产精品亲子乱子伦xxxx裸| 韩日av一区二区| 精品久久一区二区三区| 另类综合日韩欧美亚洲| 欧美精品xxxxbbbb| 五月婷婷欧美视频| 在线不卡免费av| 精品亚洲国产成人av制服丝袜| 日韩一区二区中文字幕| 国产一区 二区 三区一级| 欧美国产国产综合| 成人av在线影院| 久久先锋影音av| 高清beeg欧美| 一区二区三区四区五区视频在线观看 | 成人短视频下载| 一区av在线播放| 欧美一区二区视频在线观看| 黑人精品欧美一区二区蜜桃 | 成人美女视频在线观看| 自拍偷拍国产亚洲| 欧美日韩一区二区欧美激情| 免费欧美日韩国产三级电影| 中日韩av电影| 欧美一二三区在线| 在线观看视频一区二区| 国产成人在线视频网址| 国产原创一区二区三区| 久久99最新地址| 国产自产2019最新不卡| 韩国欧美国产一区| 国产不卡高清在线观看视频| 国产精品一区久久久久| 国产露脸91国语对白| 一区二区三区久久| 国产精品国产精品国产专区不片| 日韩一区二区三区高清免费看看| 成人激情av网| 国产黄色精品视频| 国产精品一区二区三区四区| 麻豆传媒一区二区三区| 天天操天天综合网| 亚洲va国产天堂va久久en| 亚洲制服丝袜av| 亚洲一二三四在线观看| 亚洲伦在线观看| 亚洲成人在线免费| 中文字幕乱码日本亚洲一区二区| 精品国产成人在线影院| 日韩一卡二卡三卡四卡| 91精品国产乱码久久蜜臀| 欧美精品v国产精品v日韩精品| 在线观看视频91| 日韩一区二区免费在线观看| 欧美一区二区国产| 日韩一级欧美一级| 日韩三级视频在线观看| 久久青草国产手机看片福利盒子| 精品毛片乱码1区2区3区| 久久精品欧美一区二区三区不卡 | 日韩二区三区四区| 美女在线视频一区| 国产成a人亚洲精品| 在线免费不卡电影| 久久色成人在线| 国产视频一区在线观看| 一区二区三区成人| 老司机精品视频导航| 91丨porny丨首页| 99久久精品国产一区二区三区 | 欧美日韩美少妇 | 日韩欧美激情四射| 亚洲综合激情网| 色噜噜夜夜夜综合网| 欧美在线一二三| 日本午夜精品视频在线观看 | 一区二区三区国产| 国产黄色精品视频| 久久久久久**毛片大全| 国产毛片精品视频| 久久久久国产精品人| 岛国一区二区三区| 国产精品第四页|