亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产精品久久久久一区| 精品久久久久久综合日本欧美| 日韩一区二区在线观看| 亚洲成人动漫在线观看| av电影天堂一区二区在线| 久久久亚洲午夜电影| 美腿丝袜亚洲综合| 日本大香伊一区二区三区| 中文字幕在线播放不卡一区| 不卡的av网站| 亚洲色图欧美在线| 欧美色大人视频| 青青草精品视频| 欧美精品一区二区在线观看| 国产成人精品免费| 中文字幕亚洲区| 精品第一国产综合精品aⅴ| 欧美在线啊v一区| 美女高潮久久久| 婷婷综合在线观看| 久久久精品日韩欧美| 欧美一级免费观看| 久久精品国产**网站演员| 久久日一线二线三线suv| 国内欧美视频一区二区| 欧美日韩国产大片| 毛片一区二区三区| 亚洲一区二区三区四区中文字幕| 欧美羞羞免费网站| 久久99国产精品免费网站| 欧美激情一区二区三区不卡| 在线影院国内精品| 色婷婷av一区二区三区gif| 婷婷开心激情综合| 亚洲一区二区精品3399| 亚洲另类在线视频| 日韩免费高清视频| 9色porny自拍视频一区二区| 国产乱色国产精品免费视频| 亚洲成人精品影院| 亚洲成人黄色影院| 亚洲aaa精品| 丝袜美腿亚洲色图| 国产精品美女久久久久久久网站| 欧美日韩免费视频| 欧美日韩一区高清| 欧美精品 日韩| av影院午夜一区| 99re这里只有精品视频首页| 久久精品国产免费| 精品无人码麻豆乱码1区2区| 国产一区二区在线看| 亚洲理论在线观看| 亚洲一区二区三区四区的| 亚洲一区二区三区四区的| 亚洲福利一区二区| 中文字幕一区二区三区四区不卡 | 欧美女孩性生活视频| 欧美一区二区三区四区视频| 91精品国产综合久久香蕉的特点 | av欧美精品.com| 在线免费精品视频| 欧美日韩一区二区三区视频| 在线不卡a资源高清| 欧美不卡123| 中文字幕av资源一区| 国产精品国产三级国产aⅴ无密码| 亚洲女人****多毛耸耸8| 久久久久久久综合| 最新成人av在线| 亚洲成人av免费| 国产在线不卡一区| 99久久久免费精品国产一区二区| 欧美日韩国产成人在线免费| 精品久久久久久久久久久久久久久久久| 国产天堂亚洲国产碰碰| 亚洲精品在线观| 亚洲欧美怡红院| 美女视频免费一区| www.一区二区| 777午夜精品免费视频| 国产亚洲午夜高清国产拍精品| 亚洲日本丝袜连裤袜办公室| 蜜臀精品久久久久久蜜臀 | 欧美三区在线观看| 久久人人97超碰com| 一区二区三区中文免费| 亚洲欧美激情小说另类| 免费欧美日韩国产三级电影| 成人国产一区二区三区精品| 7777精品伊人久久久大香线蕉| 久久久精品一品道一区| 亚洲成人免费观看| www.亚洲激情.com| 日韩三级在线免费观看| 亚洲欧美乱综合| 精品亚洲aⅴ乱码一区二区三区| 97精品电影院| 久久久99久久| 日本视频中文字幕一区二区三区| 日本美女一区二区三区视频| 99久久精品国产毛片| 精品处破学生在线二十三| 亚洲国产欧美在线| 99精品视频在线播放观看| 欧美不卡一区二区三区四区| 亚洲福利视频一区二区| av亚洲精华国产精华精华| 日韩欧美一级在线播放| 亚洲国产另类av| 91在线观看地址| 宅男噜噜噜66一区二区66| 亚洲欧洲一区二区在线播放| 韩国欧美一区二区| 日韩欧美www| 午夜一区二区三区视频| 91麻豆自制传媒国产之光| 国产日韩亚洲欧美综合| 亚洲精品亚洲人成人网| 国产不卡视频一区二区三区| 91日韩一区二区三区| 国产蜜臀97一区二区三区| 久久9热精品视频| 91精品国产91久久久久久一区二区| 亚洲综合在线观看视频| 99国产精品99久久久久久| 国产精品色婷婷| 国产精品一区在线观看乱码| 精品久久久久久久久久久久久久久久久| 日韩高清中文字幕一区| 欧美人伦禁忌dvd放荡欲情| 一个色妞综合视频在线观看| 91麻豆产精品久久久久久| 国产精品久久久久久福利一牛影视| 国产成人综合在线播放| 久久久国产午夜精品| 国产91丝袜在线播放| 国产肉丝袜一区二区| 丁香六月综合激情| 欧美日韩高清在线| 天堂一区二区在线免费观看| 欧美日韩aaaaa| 日韩国产欧美在线视频| 欧美大白屁股肥臀xxxxxx| 黄色小说综合网站| 久久女同精品一区二区| 丁香天五香天堂综合| 亚洲欧洲国产专区| 91免费在线视频观看| 亚洲一区二区三区视频在线播放| 欧美日韩亚洲不卡| 秋霞电影网一区二区| 精品免费国产一区二区三区四区| 国产精品自产自拍| 国产精品嫩草影院com| 91老师片黄在线观看| 亚洲国产精品久久不卡毛片 | 久久美女高清视频| 丁香婷婷综合色啪| 亚洲影院在线观看| 欧美一卡二卡三卡| 国产成人在线观看| 亚洲精选视频在线| 制服丝袜激情欧洲亚洲| 国产综合久久久久久鬼色| 亚洲国产精品ⅴa在线观看| 在线中文字幕一区二区| 久久精品99久久久| 国产精品免费观看视频| 欧美高清激情brazzers| 国产一区二区视频在线| 亚洲视频在线一区观看| 欧美电影在哪看比较好| 国产精品一二三四| 一区二区三区在线视频播放| 777精品伊人久久久久大香线蕉| 国产精品自拍网站| 亚洲综合色噜噜狠狠| 精品国产第一区二区三区观看体验| 国产成人av网站| 亚洲成人先锋电影| 中文字幕精品一区| 91精品国产丝袜白色高跟鞋| 成人激情电影免费在线观看| 亚洲高清不卡在线观看| 国产精品视频免费| 555夜色666亚洲国产免| 不卡的电影网站| 老司机精品视频在线| 亚洲伦理在线免费看| 精品国产91亚洲一区二区三区婷婷 | 成人欧美一区二区三区黑人麻豆 | 日韩色在线观看| 色婷婷久久99综合精品jk白丝| 久久国产三级精品| 亚洲靠逼com| 国产欧美日本一区二区三区| 91精品国产免费| 在线精品视频小说1| 国产东北露脸精品视频|