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

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

?? uart2.cpp

?? coldfire5206芯片的boot程序
?? CPP
字號:
/*
FileName:      uart2.cpp
Description:   The MCF5206's UART2 driver.
Version:       v1.0
Function List:
               CF5206Uart2SetConfig
               CF5206Uart2InitializeBuffer
               CF5206Uart2Reset
               CF5206Uart2WriteString
               CF5206Uart2WriteByte
               CF5206Uart2ReadString
               CF5206Uart2ReadByte
               CF5206Uart2ReceiveControl
               CF5206Uart2TransmitControl
               CF5206Uart2ISR

History:
   <author>           <time>                <desc>
  Li Linghua        2001/5/25            The file was created today.
*/

#include  "bastype.h"
#include  "mcf5206.h"
#include  "uartdrv.h"
#include  "Uart2.h"


/**
 *  constant define: UART2 registers' address
 */
#define UMR1  (MCF5206::UART2_BASE + 0)    // Mode register, read/write
#define UMR2  (UMR1)                       // Mode register, read/write (after UMR1)
#define USR   (MCF5206::UART2_BASE + 4)    // Status register, read
#define UCSR  (USR)                        // clock select register, write
#define UCR   (MCF5206::UART2_BASE + 8)    // Command register, write
#define URB   (MCF5206::UART2_BASE + 0xc)  // Receiver buffer, read
#define UTB   (URB)                        // Transmitter buffer, write
#define UIPCR (MCF5206::UART2_BASE + 0x10) // Input port change register, read
#define UACR  (UIPCR)                      // Auxiliary control register, write
#define UISR  (MCF5206::UART2_BASE + 0x14) // Interrupt status register, read
#define UIMR  (UISR)                       // Interrupt mask register, write
#define UBG1  (MCF5206::UART2_BASE + 0x18) // Baud rate generator prescale MSB, read/write
#define UBG2  (MCF5206::UART2_BASE + 0x1c) // Baud rate generator prescale LSB, read/write
#define UIVR  (MCF5206::UART2_BASE + 0x30) // Interrupt vector register, read/write
#define UIP   (MCF5206::UART2_BASE + 0x34) // Input port register, read
#define UOP1  (MCF5206::UART2_BASE + 0x38) // Output portbit set CMD, write
#define UOP0  (MCF5206::UART2_BASE + 0x3c) // Output portbit set CMD, write


#define RxEnable( )   { *(UCHAR*)UCR = 0x01;}
#define RxDisable( )  { *(UCHAR*)UCR = 0x02;}
#define TxEnable( )   { *(UCHAR*)UCR = 0x04;}
#define TxDisable( )  { *(UCHAR*)UCR = 0x08;}


UARTINFO  gCF5206Uart2Info;

/**
 *  static variables define.
 */
static    UCHAR   sReceiveBuffer[RECEIVE_BUF_LENGTH];
static    UCHAR*  sReceiveOutPtr;
static    UCHAR*  sReceiveInPtr;
static    UCHAR*  sReceiveBufHead;
static    UCHAR*  sReceiveBufTail;
static    UCHAR   sTransmitBuffer[TRANSMIT_BUF_LENGTH];
static    UCHAR*  sTransmitOutPtr;
static    UCHAR*  sTransmitInPtr;
static    UCHAR*  sTransmitBufHead;
static    UCHAR*  sTransmitBufTail;

// Error counter.
// @initialize to 0.
static UINT32  sParityError;
static UINT32  sFrameError;
static UINT32  sOverRunError;

// Receive interrupt source: RxRDY or FFULL
// this value will be set according to interrupt mode.
static UCHAR  sRxIrqSource;

// cpu's uart config setting const, defined in uartdrv.cpp
extern const UCHAR sUBG1Const[BR_MAX];
extern const UCHAR sUBG2Const[BR_MAX];
extern const UCHAR sUBG1Const[BR_MAX];
extern const UCHAR sUBG2Const[BR_MAX];
extern const UCHAR sParityConst[PARITY_MAX];
extern const UCHAR sDataBitsConst[DATABITS_MAX];
extern const UCHAR sStopBitsConst[STOPBITS_MAX];

// UART status constant define
#define  STATUS_RXRDY        0x01
#define  STATUS_FFULL        0x02
#define  STATUS_TXRDY        0x04
#define  STATUS_OVERRUN_ERR  0x10
#define  STATUS_PARITY_ERR   0x20
#define  STATUS_FRAME_ERR    0x40

#define  IRQ_SOURCE_FFULL  STATUS_FFULL
#define  IRQ_SOURCE_RXRDY  STATUS_RXRDY

#define  MULTIDROP_DATA_CHAR  0x00
#define  MULTIDROP_ADDR_CHAR  0x04

/*
 Function Name:  CF5206Uart2SetConfig
 Description:    Using given configuration to initialize UART2
 Parameters:     config -- configuration data
 Return:         Nothing
 Output:         Nothing
 Test&Revision:  Not yet
*/
VOID  CF5206Uart2SetConfig( const UARTCONFIG* config )
{
   // reset receiver and transmitter
   *(UCHAR*)UCR = 0x20;
   *(UCHAR*)UCR = 0x30;

   // reset error status and break-change interrupt
   *(UCHAR*)UCR = 0x40;
   *(UCHAR*)UCR = 0x50;

   // interrupt vector number
   *(UCHAR*)UIVR = MCF5206::IV_UART2;

   // interrupt source: TxRDY and RxRDY
   *(UCHAR*)UIMR = 0x03;

   // interrupt auxiliary
   *(UCHAR*)UACR = 0x00;

   // clock select: Receiver and Transmitter are all select interval clock
   *(UCHAR*)UCSR = 0xdd;

   // baud rate set
   *(UCHAR*)UBG1 = sUBG1Const[config->baudRate];
   *(UCHAR*)UBG2 = sUBG2Const[config->baudRate];

   // select UMR1
   *(UCHAR*)UCR  = 0x10;

   // mode set: Parity, data bits and IRQ source
   if ( TRUE == config->useBufferedReceive )
   {
      sRxIrqSource = IRQ_SOURCE_FFULL;
      *(UCHAR*)UMR1 =   sParityConst[config->parity]
                      | sDataBitsConst[config->dataBits]
                      | 0x60; // IRQ source: FFULL, Error mode: Block mode
   }
   else
   {
      sRxIrqSource = IRQ_SOURCE_RXRDY;
      *(UCHAR*)UMR1 =   sParityConst[config->parity]
                      | sDataBitsConst[config->dataBits]
                      | 0x00; // IRQ source: RxRDY, Error mode: Character mode
   }

   // mode set: Normal mode, stop-bits
   *(UCHAR*)UMR2 = sStopBitsConst[config->stopBits];
   
   CF5206Uart2Reset( );
}


/*
 Function Name:  CF5206Uart2InitializeBuffer
 Description:    Initialize UART's variables
 Parameters:     No
 Return:         Nothing
 Output:         Nothing
 Test&Revision:  Not yet
*/
VOID  CF5206Uart2InitializeBuffer( VOID )
{
   sReceiveBufHead = sReceiveBuffer;
   sReceiveBufTail = sReceiveBuffer + RECEIVE_BUF_LENGTH - 1;

   sTransmitBufHead = sTransmitBuffer;
   sTransmitBufTail = sTransmitBuffer + TRANSMIT_BUF_LENGTH - 1;

   sReceiveInPtr   = sReceiveBufHead;
   sReceiveOutPtr  = sReceiveBufHead;
   sTransmitInPtr  = sTransmitBufHead;
   sTransmitOutPtr = sTransmitBufHead;

   gCF5206Uart2Info.receiveErrorInfo = 0;
   gCF5206Uart2Info.receivedBytes    = 0;
   gCF5206Uart2Info.isTxBufferEmpty  = TRUE;
}


/*
 Function Name:  CF5206Uart2Reset
 Description:    reset UART2's buffer and status
 Parameters:     No
 Return:         Nothing
 Output:         Nothing
 Test&Revision:  Not yet
*/
VOID  CF5206Uart2Reset( VOID )
{
   CF5206Uart2InitializeBuffer( );

   sFrameError   = 0;
   sParityError  = 0;
   sOverRunError = 0;
}


/*
 Function Name:  CF5206Uart2WriteString
 Description:    Transmit a string from UART2 of MCF5206
 Parameters:     string  --  the characters to be transmited
                 str_len --  the number of characters of the string
 Return:         bytes transmitted
 Output:         Nothing
 Test&Revision:  Not yet
                 1. 2001.7.27: if no enough buffer, no byte will be transmitted,
                    so, the value returned must be str_len or 0
*/
INT16  CF5206Uart2WriteString(UCHAR* string, UINT16 str_len)
{
   INT   bytes_to_be_written;
   INT   bytes_be_written;

   UCHAR *transmit_out_ptr = sTransmitOutPtr;
   
   // return immediately if no bytes to be transmitted
   if (0 >= str_len)
      return 0;

   // Calculate the free buffer number
   if (sTransmitInPtr >= transmit_out_ptr)
      bytes_to_be_written =   (sTransmitBufTail - sTransmitBufHead)
                            - (sTransmitInPtr - transmit_out_ptr);
   else
      bytes_to_be_written = transmit_out_ptr - sTransmitInPtr - 1;
   // return if buffer is not enough.
   if (bytes_to_be_written < str_len)
      return 0;

   bytes_to_be_written = str_len;

   bytes_be_written = bytes_to_be_written;

   // Copy string to transmitter buffer
   while (0 < bytes_to_be_written)
   {
      *sTransmitInPtr ++ = *string ++;

      if (sTransmitInPtr > sTransmitBufTail)
         sTransmitInPtr = sTransmitBufHead;

      bytes_to_be_written --;
   }

   gCF5206Uart2Info.isTxBufferEmpty = FALSE;

   TxEnable( );

   return bytes_be_written;
}

/*
 Function Name:  CF5206Uart2WriteByte
 Description:    Transmit one byte from UART2 of MCF5206
 Parameters:     byte  --  the character to be transmited
 Return:         TRUE if the byte has been transmitted,
                 FALSE if failed becasue of full buffer
 Output:         Nothing
 Test&Revision:  Not yet
*/
BOOL  CF5206Uart2WriteByte(UCHAR byte)
{
   INT   result;
   UCHAR* transmit_in_ptr_next;

   transmit_in_ptr_next = sTransmitInPtr + 1;
   if (transmit_in_ptr_next > sTransmitBufTail)
      transmit_in_ptr_next = sTransmitBufHead;

   // transmit it if transmit buffer is not full
   if ( transmit_in_ptr_next != sTransmitOutPtr)
   {
      *sTransmitInPtr = byte;
      sTransmitInPtr = transmit_in_ptr_next;

      gCF5206Uart2Info.isTxBufferEmpty = FALSE;
      TxEnable( );

      return TRUE;
   }
   else
      return FALSE;
}


/*
 Function Name:  CF5206Uart2ReadString
 Description:    Read datas in UART2's receive buffer.
 Parameters:     length -- How many bytes you want to read
                 data   -- Where to save the data been read
 Return:         actual bytes been read
 Output:         Nothing
 Note:           The data buffer must has a length of not less than length
                 you given, if not, something you hate to see may happen.
 Test&Revision:  Not yet
*/
INT16  CF5206Uart2ReadString(UCHAR* data, UINT16 length)
{
   INT   bytes_to_be_read;
   INT   bytes_be_read;

   UCHAR* receive_in_ptr = sReceiveInPtr;
   
   // Calculate how many bytes can be read
   if (receive_in_ptr >= sReceiveOutPtr)
      bytes_to_be_read = receive_in_ptr - sReceiveOutPtr;
   else
      bytes_to_be_read =  (sReceiveBufTail - sReceiveBufHead + 1)
                        - (sReceiveOutPtr - receive_in_ptr);

   // The number of bytes can be read is the minimal of
   // bytes_to_be_read and length
   if (bytes_to_be_read > length)
      bytes_to_be_read = length;

   bytes_be_read = bytes_to_be_read;

   while (0 < bytes_to_be_read)
   {
      *data ++ = *sReceiveOutPtr ++;
      
      if (sReceiveOutPtr > sReceiveBufTail)
         sReceiveOutPtr = sReceiveBufHead;

      bytes_to_be_read --;
   }

   return bytes_be_read;
}


/*
 Function Name:  CF5206Uart2ReadByte
 Description:    Read datas in UART2's receive buffer.
 Parameters:     data  -- Where to save the data been read
 Return:         TRUE if read succeed,
                 FALSE if no data can be read
 Output:         Nothing
 Test&Revision:  Not yet
*/
BOOL  CF5206Uart2ReadByte( UCHAR* data )
{
   if (sReceiveOutPtr != sReceiveInPtr)
   {
      *data = *sReceiveOutPtr;

      sReceiveOutPtr ++;
      if (sReceiveOutPtr > sReceiveBufTail)
         sReceiveOutPtr = sReceiveBufHead;

      return TRUE;
   }
   else
      return FALSE;
}


/*
 Function Name:  CF5206Uart2ReceiveControl
 Description:    Provide an interface to disable or enable receive interrupt
 Parameters:     Operation: disable or enable interrupt 
 Return:         Nothing
 Output:         Nothing
 Test&Revision:  Not yet
*/
VOID  CF5206Uart2ReceiveControl( UCHAR operation )
{
   if (UART_DISABLE == operation)
      RxDisable( );
   if (UART_ENABLE == operation)
			RxEnable( );
}

/*
 Function Name:  CF5206Uart2TransmitControl
 Description:    Provide an interface to disable or enable transmit interrupt
 Parameters:     Operation: disable or enable interrupt
 Return:         Nothing
 Output:         Nothing
 Test&Revision:  Not yet
*/
VOID  CF5206Uart2TransmitControl( UCHAR operation )
{
   if (UART_DISABLE == operation)
   {
      TxDisable( );
   }
   else
   {
			TxEnable( );
   }   
}


/*
 Function Name:  CF5206Uart2ISR
 Description:    MCF5206 UART2 interrupt service routine
 Parameters:     No
 Return:         Nothing
 Output:         Nothing
 Test&Revision:  Not yet
*/
extern "C" VOID  CF5206Uart2ISR( VOID )
{
   UCHAR status, data;
   UCHAR* receive_in_ptr_next;

   status = *(UCHAR*)USR;

   // even in FFULL interrupt mode, we must do the following
   if (STATUS_RXRDY == (status&STATUS_RXRDY))
   {
      data = *(UCHAR*)URB;

      gCF5206Uart2Info.receivedBytes ++;

      // Check whether a error occured.
      if ( 0 == (status&(STATUS_OVERRUN_ERR|STATUS_PARITY_ERR|STATUS_FRAME_ERR)) )
      {
         receive_in_ptr_next = sReceiveInPtr + 1;
         if (receive_in_ptr_next > sReceiveBufTail)
            receive_in_ptr_next = sReceiveBufHead;

         // No error found, save character.
         if (sReceiveOutPtr != receive_in_ptr_next)
         {
            *sReceiveInPtr = data;

            sReceiveInPtr = receive_in_ptr_next;
         }
      }
      else
      {
         // report OverRun error if
         if (STATUS_OVERRUN_ERR == (status&STATUS_OVERRUN_ERR) )
         {
            gCF5206Uart2Info.receiveErrorInfo ++;
            sOverRunError ++;
         }

         // report parity error if occurred
         if (STATUS_PARITY_ERR == (status&STATUS_PARITY_ERR))
         {
            gCF5206Uart2Info.receiveErrorInfo ++;
            sParityError ++;
         }

         // report frame error if occurred
         if (STATUS_FRAME_ERR == (status&STATUS_FRAME_ERR))
         {
            gCF5206Uart2Info.receiveErrorInfo ++;
            sFrameError ++;
         }   
      }

      // clear error status
      *(UCHAR*)UCR = 0x40;
   }

   // if transmit interrupt occurred, call the transmit ISR
   if (STATUS_TXRDY == (status&STATUS_TXRDY))
   {
      if (sTransmitOutPtr != sTransmitInPtr)
      {
         // transmit a byte
         *(UCHAR*)UTB = *sTransmitOutPtr;

         sTransmitOutPtr ++;
         if (sTransmitOutPtr > sTransmitBufTail)
            sTransmitOutPtr = sTransmitBufHead;
      }
      else
      {
         gCF5206Uart2Info.isTxBufferEmpty = TRUE;
         TxDisable( );
      }
   }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜成人免费电影| 久久久久久久久久久电影| 亚洲一卡二卡三卡四卡五卡| 日本乱人伦aⅴ精品| 无码av免费一区二区三区试看| 欧美精品国产精品| 精品综合免费视频观看| 国产精品久久久久久久久果冻传媒| 国产精品亚洲午夜一区二区三区| 国产精品国产三级国产aⅴ无密码| 色综合天天狠狠| 日韩二区三区在线观看| 久久伊人中文字幕| 91在线高清观看| 蜜臀久久99精品久久久久久9 | 国产一区999| 中文成人综合网| 欧美日韩不卡一区| 国精品**一区二区三区在线蜜桃| 国产精品久久久久国产精品日日| 欧美三级一区二区| 国产一区久久久| 亚洲一区在线电影| 久久这里只精品最新地址| 91黄色免费网站| 国产精品一区一区| 亚洲影院久久精品| 国产午夜精品久久久久久久 | 欧美精品黑人性xxxx| 国产99久久久国产精品免费看 | 色天使久久综合网天天| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲欧洲中文日韩久久av乱码| 日韩亚洲欧美在线| 色综合久久综合网| 国产精品1区二区.| 日韩精品免费视频人成| 亚洲激情在线激情| 久久久蜜桃精品| 欧美一区二区三区公司| 91亚洲大成网污www| 国内久久精品视频| 日本伊人午夜精品| 亚洲国产欧美一区二区三区丁香婷| 国产视频一区不卡| 日韩一二三区不卡| 欧美日韩国产a| 97se狠狠狠综合亚洲狠狠| 黄页网站大全一区二区| 丝袜亚洲另类欧美| 一区二区日韩av| 最新国产成人在线观看| 精品日韩一区二区三区免费视频| 在线精品视频免费播放| 成人免费视频视频| 国产真实精品久久二三区| 奇米综合一区二区三区精品视频| 一区二区三区鲁丝不卡| 国产精品毛片久久久久久久| 久久久久久一级片| 久久综合久久鬼色| 欧美mv和日韩mv国产网站| 欧美一区二区三区小说| 欧美男女性生活在线直播观看| 色噜噜久久综合| www.66久久| 91伊人久久大香线蕉| 91一区在线观看| 一本色道**综合亚洲精品蜜桃冫| 99re热这里只有精品视频| 成人激情免费网站| 99久久伊人网影院| 91丨九色porny丨蝌蚪| av激情亚洲男人天堂| av电影在线观看完整版一区二区| 成人黄色在线网站| 不卡在线观看av| 91国产视频在线观看| 欧美曰成人黄网| 欧美日韩一区二区电影| 777a∨成人精品桃花网| 欧美电影免费提供在线观看| 欧美大胆一级视频| 久久久精品黄色| 中文字幕国产精品一区二区| 中文字幕一区二区在线播放| 亚洲女爱视频在线| 亚洲在线视频网站| 蜜臀91精品一区二区三区 | 91精品国产一区二区三区| 欧美一卡二卡三卡四卡| 久久综合五月天婷婷伊人| 日本一区免费视频| 亚洲精品乱码久久久久久久久| 亚洲亚洲人成综合网络| 久久综合综合久久综合| 成人网页在线观看| 欧美亚洲综合一区| 日韩精品一区二区三区在线观看| 国产亚洲婷婷免费| 亚洲综合一区二区精品导航| 奇米四色…亚洲| 国产成人精品免费| 日韩一级免费观看| 欧美国产视频在线| 亚洲午夜久久久久久久久久久| 免费成人av资源网| 国产成人av一区二区三区在线 | 成人性生交大片免费| 在线精品视频免费播放| 精品国内二区三区| 一区二区三区国产精品| 狠狠色狠狠色合久久伊人| av男人天堂一区| 91精品国产综合久久久久久| 亚洲国产精品传媒在线观看| 天堂av在线一区| av在线不卡电影| 日韩免费在线观看| 一区二区三区毛片| 国产剧情一区二区| 欧美伦理电影网| 亚洲婷婷综合久久一本伊一区| 全国精品久久少妇| 色屁屁一区二区| 久久综合久久鬼色中文字| 午夜欧美大尺度福利影院在线看| 国产成人激情av| 欧美岛国在线观看| 香港成人在线视频| 成人涩涩免费视频| 欧美电影免费观看高清完整版在线观看 | 国产欧美精品一区aⅴ影院 | 国产一区二区电影| 91精品国产麻豆| 亚洲一区欧美一区| 波多野结衣中文一区| 久久影院电视剧免费观看| 亚洲成a人片综合在线| 91一区二区在线观看| 国产日产欧美一区| 国产一区二区伦理| 日韩欧美一区电影| 日本免费新一区视频| 欧美日韩激情一区二区三区| 自拍偷拍亚洲综合| 成人精品视频一区二区三区尤物| 精品福利av导航| 美女视频一区二区| 欧美一级一区二区| 视频一区欧美精品| 欧美日韩综合色| 亚洲电影一区二区| 日本丰满少妇一区二区三区| 亚洲日本电影在线| 97se亚洲国产综合自在线| 国产精品久久久久桃色tv| 国产成人在线色| 欧美国产亚洲另类动漫| 成人丝袜18视频在线观看| 中文字幕亚洲区| 成人污视频在线观看| 国产精品成人免费精品自在线观看| 国产成人在线看| 国产精品久久久久久久久免费樱桃 | 日韩欧美国产精品| 美腿丝袜一区二区三区| 精品欧美久久久| 国产一区二区成人久久免费影院 | 欧美经典三级视频一区二区三区| 国产美女在线观看一区| 久久久久青草大香线综合精品| 国产精品中文有码| 国产精品高潮呻吟| 91蝌蚪porny| 亚洲最新视频在线观看| 欧美欧美午夜aⅴ在线观看| 天堂资源在线中文精品| 欧美精品久久久久久久多人混战| 日韩黄色免费电影| 久久免费电影网| 国产经典欧美精品| 亚洲青青青在线视频| 欧美老女人第四色| 久久99这里只有精品| 国产精品久久夜| 欧美三级在线视频| 国内精品伊人久久久久av影院 | 精品国产91洋老外米糕| 懂色av一区二区三区蜜臀| 亚洲男人天堂av网| 日韩午夜激情av| 成人h精品动漫一区二区三区| 亚洲综合一区二区精品导航| 日韩久久久久久| 99综合电影在线视频| 日韩电影免费在线看| 国产精品欧美精品| 91精品国产91久久久久久最新毛片| 国产一区二区三区美女|