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

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

?? sngks32csio.c

?? 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一区二区三区免费野_久草精品视频
国产欧美综合色| 欧美一区在线视频| 国产福利一区二区三区在线视频| 午夜伦欧美伦电影理论片| 一区二区三区在线观看视频 | 日本午夜精品一区二区三区电影| 综合欧美亚洲日本| 亚洲男人的天堂网| 一区二区三区在线视频观看| 亚洲一区视频在线| 天天综合色天天综合色h| 蜜臀久久久久久久| 精品一区二区日韩| av中文字幕一区| 欧美性极品少妇| 欧美一区二区三区性视频| 日韩亚洲电影在线| 国产亚洲精品超碰| 亚洲精品视频自拍| 五月综合激情日本mⅴ| 精品制服美女丁香| 成人综合在线视频| 欧美性猛片aaaaaaa做受| 91精品免费观看| 日本一区二区三区国色天香 | 久久免费偷拍视频| 自拍偷自拍亚洲精品播放| 午夜精品国产更新| 国产91对白在线观看九色| 99国产欧美另类久久久精品 | 麻豆高清免费国产一区| 国产精品1区二区.| 91久久精品午夜一区二区| 日韩一区二区三区高清免费看看| 久久婷婷成人综合色| 亚洲精品国产视频| 国产激情一区二区三区四区 | 蜜臀av性久久久久蜜臀aⅴ| 国产不卡免费视频| 欧美人狂配大交3d怪物一区| 久久亚洲精品国产精品紫薇| 亚洲国产日韩精品| 不卡av在线网| 精品乱人伦小说| 亚洲成人手机在线| 91在线观看地址| 国产欧美精品一区二区色综合朱莉 | 国产成人精品aa毛片| 欧美日本国产一区| 亚洲精品老司机| 国产成人精品免费看| 欧美一级高清大全免费观看| 中文字幕亚洲欧美在线不卡| 国产一区二区电影| 日韩欧美一区二区免费| 亚洲国产日韩a在线播放性色| 成人av电影观看| 久久久噜噜噜久久人人看| 日本亚洲三级在线| 欧美精品成人一区二区三区四区| 亚洲欧美日韩系列| 99久久久国产精品免费蜜臀| 国产日韩欧美综合一区| 国内精品伊人久久久久av一坑 | aaa亚洲精品一二三区| 久久精品一区二区三区不卡牛牛 | 精品久久久三级丝袜| 天天综合天天做天天综合| 欧美少妇bbb| 亚洲一区二区影院| 欧美亚洲禁片免费| 亚洲一区二区三区自拍| 在线观看视频91| 亚洲一区成人在线| 欧美在线视频全部完| 亚洲一区在线看| 91.成人天堂一区| 久久疯狂做爰流白浆xx| 精品国产亚洲在线| 国产东北露脸精品视频| 国产香蕉久久精品综合网| 国产91在线看| 亚洲私人黄色宅男| 在线观看不卡视频| 婷婷亚洲久悠悠色悠在线播放| 欧美日韩一级二级三级| 日本午夜一本久久久综合| 精品国产凹凸成av人网站| 国产一区91精品张津瑜| 国产精品久久久久久久蜜臀 | 精品美女在线播放| 国产ts人妖一区二区| 国产精品久久久久久亚洲伦| 91亚洲精品久久久蜜桃网站 | 性做久久久久久| 欧美精品久久99| 国产精品综合一区二区三区| 亚洲色图欧美偷拍| 6080午夜不卡| 国产成人av影院| 亚洲精品高清在线观看| 91麻豆精品国产91久久久久久| 国产乱妇无码大片在线观看| 亚洲蜜臀av乱码久久精品| 7777精品伊人久久久大香线蕉超级流畅| 免费成人性网站| 国产精品毛片无遮挡高清| 欧美三级三级三级爽爽爽| 久久精品久久久精品美女| 国产精品沙发午睡系列990531| 在线观看免费视频综合| 国内精品国产成人国产三级粉色 | 国产亚洲成av人在线观看导航| 91蜜桃免费观看视频| 奇米精品一区二区三区在线观看一 | 裸体一区二区三区| 亚洲精品五月天| 国产拍欧美日韩视频二区| 欧美日韩高清一区二区三区| 国产成人精品亚洲777人妖| 亚洲成va人在线观看| 欧美—级在线免费片| 欧美日韩一级视频| 9i看片成人免费高清| 精品中文字幕一区二区小辣椒 | 日韩电影免费在线观看网站| 亚洲国产精品t66y| 精品免费日韩av| 制服丝袜国产精品| 欧洲国内综合视频| 99久久99久久精品免费观看| 国产一区二区在线电影| 奇米四色…亚洲| 日韩国产在线观看一区| 一区二区三区四区不卡在线| 国产亚洲欧美一级| xfplay精品久久| 精品免费日韩av| 精品国精品国产尤物美女| 69av一区二区三区| 91精品国产综合久久香蕉麻豆| 色狠狠综合天天综合综合| 成人黄色软件下载| av男人天堂一区| 成人av高清在线| 91视频观看免费| 91免费国产在线观看| 99视频精品免费视频| 成人久久视频在线观看| 国产成人日日夜夜| 成人av资源下载| 99精品视频在线播放观看| 99精品国产一区二区三区不卡| 94-欧美-setu| 91精品1区2区| 欧美另类一区二区三区| 欧美精品久久一区| 日韩欧美一卡二卡| 国产午夜久久久久| 国产精品污网站| 亚洲精品自拍动漫在线| 亚洲成av人片一区二区| 日本 国产 欧美色综合| 韩国精品主播一区二区在线观看| 韩国成人福利片在线播放| 国产麻豆91精品| 99久久国产综合精品麻豆| 91福利视频网站| 欧美一级日韩免费不卡| 精品久久久网站| 成人欧美一区二区三区在线播放| 亚洲一区av在线| 久久se精品一区精品二区| 国产激情一区二区三区四区 | 欧美成人精品二区三区99精品| 欧美一区二区免费| 国产嫩草影院久久久久| 一区二区三区 在线观看视频| 亚洲成人先锋电影| 国产激情一区二区三区| 色婷婷亚洲一区二区三区| 91精品婷婷国产综合久久性色| 久久久蜜臀国产一区二区| 亚洲精品久久嫩草网站秘色| 免费av网站大全久久| 一本一道波多野结衣一区二区 | 国产精品99久久久| 91久久一区二区| 久久精品人人做人人爽人人| 一区二区三区美女| 精品一区二区三区在线观看| 99视频在线精品| 精品久久一区二区| 一个色妞综合视频在线观看| 韩国三级在线一区| 欧美日韩午夜在线| 亚洲欧美自拍偷拍色图| 国产自产2019最新不卡| 欧美日韩一区二区三区四区五区 | 人人精品人人爱|