printf_a9.c

来自「OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI」· C语言 代码 · 共 579 行

C
579
字号
/*============================================================================
*
*            TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION
*
*   Property of Texas Instruments
*   For Unrestricted Internal Use Only
*   Unauthorized reproduction and/or distribution is strictly prohibited.
*   This product is protected under copyright law and trade secret law as an unpublished work.
*   Created 2004, (C) Copyright 2004 Texas Instruments.  All rights reserved.
*
*   File: uartdrv.c
*
*    project: UART Drivers for NEPTUNE
*
* =============================================================================*/

/* ============================================================================
* STANDARD INCLUDE FILE
* =============================================================================*/
#include "printf_a9.h"


/* ============================================================================
* GLOBAL VARIABLES DECLARATIONS
* =============================================================================*/
UWORD16 uart_in_use = 0;


/* ============================================================================
* FUNCTIONS
* =============================================================================*/
void UART_reset(void *inBaseAddress)
/*
 * Reset UART_MODEM from sw control and verify UART state
 */
{
  UART_MODEM_SYSC(inBaseAddress) |= 0x02;
  while (UART_MODEM_SYSS(inBaseAddress) != 0x01);

  /* TBD: Need an escape? */
  while ((UART_MODEM_MDR1(inBaseAddress) & 0x07) != 0x07);

  return;
}

/* ============================================================================ */

void UART_configure(void *inBaseAddress)
/*
 *
 */
{
  
  /* disable all interrupts */
  UART_MODEM_IER(inBaseAddress)  = 0x00;

  UART_MODEM_EFR(inBaseAddress)  = 0x00;        // No Flow control

  UART_MODEM_SCR(inBaseAddress)  = 0x00;	// ensure preassigned buffer levels from FCR settings

  UART_MODEM_LCR(inBaseAddress)  = 0xBF;        // set to access EFR
  
  UART_MODEM_EFR(inBaseAddress) |= (1 << 4);
  
  UART_MODEM_LCR(inBaseAddress)  = 0x00;  

  UART_MODEM_MCR(inBaseAddress) |= (1 << 6);

  UART_MODEM_TLR(inBaseAddress)  = 0x00;        // set to make FCR effective for 56 spaces on tx and 8 rx chars

  UART_MODEM_FCR(inBaseAddress)  = 0x37;        // dis dma, clear fifo rx = 8 chars and tx = 56 spaces

  UART_MODEM_LCR(inBaseAddress)  = (1 << 7);
  
  UART_MODEM_DLL(inBaseAddress)  = 26;		// 0x01 = 3.6864 Mbps in 13x mode
                              			// 0x04 = 921.6 Kbps in 13x mode
		                                // 0x08 = 461.54 Kbps in 13x mode
  
  UART_MODEM_DLH(inBaseAddress)  = 0x00;
  
  UART_MODEM_LCR(inBaseAddress)  = 0x00;

  #define UART_MODE 0x00
  /* program mode after dlh and dll are written */
  UART_MODEM_MDR1(inBaseAddress) = UART_MODE;		    // uart 16x = 0x00
  	                                                // uart 13x = 0x03  
  
  /* TBD: Need an escape? */
  while ((UART_MODEM_MDR1(inBaseAddress)) != UART_MODE);

  
  UART_MODEM_LCR(inBaseAddress) =
               ((0 << UART_MODEM_LCR_DIV_EN_POS) |
                (0 << UART_MODEM_LCR_BREAK_EN_POS) |
                (0 << UART_MODEM_LCR_PARITY_TYPE_2_POS) |
                (1 << UART_MODEM_LCR_PARITY_TYPE_1_POS) |
                (0 << UART_MODEM_LCR_PARITY_EN_POS) |     // 0 Parity bits
                (0 << UART_MODEM_LCR_NB_STOP_POS) |       // 1 Stop bits
                (3 << UART_MODEM_LCR_CHAR_LENGTH_POS));   // 8 Data bits
  
  // enable RHR interrupt
  UART_MODEM_IER(inBaseAddress) = 0x00;     	// INTS INFO
                            			// 0 - rhr            0
                            			// 1 - thr            0
		                                // 2 - line status    0
                    			        // 3 - modem status   0
  
  
   return;
}

/* ============================================================================ */

void UART_intRxHandler(UWORD8 inInterrupt,
                       void *inBaseAddress)
{
  /*
   * Make sure that it is OK to read from this device
   */
  if(!stdin->buff_stop)
    stdin->buff_stop = stdin->pos;

  /*
   * Append the next characters from the device
   * to the buffer and adjust the buffer pointer
   */
  while((UART_MODEM_LSR(inBaseAddress) & (1 << UART_MODEM_LSR_RX_FIFO_E_POS)) &&
        (stdin->buff_stop < stdin->bufend))
    *stdin->buff_stop++ = UART_MODEM_RHR(inBaseAddress);

  return;
}

/* ============================================================================ */

void UART1_intRxHandler(UWORD8 inInterrupt)
{
  UART_intRxHandler(inInterrupt,
            (void *)UART_MODEM1_ADDRESS);

  return;
}

/* ============================================================================ */

void UART2_intRxHandler(UWORD8 inInterrupt)
{
  UART_intRxHandler(inInterrupt,
            (void *)UART_MODEM2_ADDRESS);

  return;
}

/* ============================================================================ */

void UART3_intRxHandler(UWORD8 inInterrupt)
{
  UART_intRxHandler(inInterrupt,
            (void *)UART_MODEM3_ADDRESS);

  return;
}

/* ============================================================================ */

int UARTopen(void *inBaseAddress)
{
  UART_reset(inBaseAddress);
  UART_configure(inBaseAddress);

  return(0);
}

/* ============================================================================ */

int UART1open(const char *inPath,
                 unsigned inFlags,
                      int inFileDescriptor)
{
   
    /* Set up UART1 signals on Neptune Top Level pinout */
    //config uart1_rx multiplexing pin conf_usb_0_dat0 mode 1
    CONFIG_SetModePin(IO_CONFIGURATION_BASE_ADDR_ARM+IO_CONFIGURATION_CONF_USB_0_DAT_OFFSET,MODE1);

    //config uart1_tx multiplexing pin conf_usb_0_se0 mode 1
    CONFIG_SetModePin(IO_CONFIGURATION_BASE_ADDR_ARM+IO_CONFIGURATION_CONF_USB_0_SE0_OFFSET,MODE1);

    //config uart1_rts multiplexing pin conf_usb_0_txen mode 1
    CONFIG_SetModePin(IO_CONFIGURATION_BASE_ADDR_ARM+IO_CONFIGURATION_CONF_USB_0_TXEN_OFFSET,MODE1);

    //config uart1_cts multiplexing pin conf_usb_0_rcv mode 1
    CONFIG_SetModePin(IO_CONFIGURATION_BASE_ADDR_ARM+IO_CONFIGURATION_CONF_USB_0_RCV_OFFSET,MODE1);
    
    // FPGA Enable
    FPGA_EnableUART1();
    
    /* enable clock for uart1 */
    ULPD_SoftReqEnable(UART1);        

   return(UARTopen((void *)UART_MODEM1_ADDRESS));
}

/* ============================================================================ */

int UART2open(const char *inPath,
                 unsigned inFlags,
                      int inFileDescriptor)
{

    /* Set up UART2 signals on Neptune Top Level pinout */
    //CONFIG_IO_Appli0();
    
    /* enable clock for uart2 */
    ULPD_SoftReqEnable(UART2);     

  return(UARTopen((void *)UART_MODEM2_ADDRESS));
}

/* ============================================================================ */

int UART3open(const char *inPath,
                 unsigned inFlags,
                      int inFileDescriptor)
{

    /* Set up UART3 signals on Neptune Top Level pinout */
    //CONFIG_IO_Appli0();
    
    /* enable clock for uart3 */
    ULPD_SoftReqEnable(UART3);     

  return(UARTopen((void *)UART_MODEM3_ADDRESS));
}

/* ============================================================================ */

int UARTclose(void *inBaseAddress)
{
  UART_reset(inBaseAddress);

  return(0);
}

/* ============================================================================ */

int UART1close(int inFileDescriptor)
{

  UARTclose((void *)UART_MODEM1_ADDRESS);
  
  ULPD_SoftReqDisable(UART1);
  
  return(0);
}

/* ============================================================================ */

int UART2close(int inFileDescriptor)
{

  UARTclose((void *)UART_MODEM2_ADDRESS);

  ULPD_SoftReqDisable(UART2);

  return(0);
}

/* ============================================================================ */

int UART3close(int inFileDescriptor)
{

  UARTclose((void *)UART_MODEM3_ADDRESS);
  
  ULPD_SoftReqDisable(UART3);

  return(0);
}

/* ============================================================================ */

int UARTread(void *inBaseAddress,
             char *inBuffer,
          unsigned inCount)
{
  register int lvCounter;

  for (lvCounter = 0;
       lvCounter < inCount;
       lvCounter++)
  {
    while(!(UART_MODEM_LSR(inBaseAddress) & (1 << UART_MODEM_LSR_RX_FIFO_E_POS)));

    if((*inBuffer++ = UART_MODEM_RHR(inBaseAddress)) == '\0')
      break;
  }

  return inCount ? lvCounter :
    (UART_MODEM_LSR(inBaseAddress) & (1 << UART_MODEM_LSR_RX_FIFO_E_POS));
}

/* ============================================================================ */

int UART1read(int inFileDescriptor,
            char *inBuffer,
         unsigned inCount)
{
  return(UARTread((void *)UART_MODEM1_ADDRESS,
                  inBuffer,
                  inCount));
}

/* ============================================================================ */

int UART2read(int inFileDescriptor,
            char *inBuffer,
         unsigned inCount)
{
  return(UARTread((void *)UART_MODEM2_ADDRESS,
                  inBuffer,
                  inCount));
}

/* ============================================================================ */

int UART3read(int inFileDescriptor,
            char *inBuffer,
         unsigned inCount)
{
  return(UARTread((void *)UART_MODEM3_ADDRESS,
                  inBuffer,
                  inCount));
}

/* ============================================================================ */

int UARTwrite(void *inBaseAddress,
        const char *inBuffer,
           unsigned inCount)
{
  register int lvCounter;

  for (lvCounter = 0;
       lvCounter < inCount;
       lvCounter++)
  {
    while (!(UART_MODEM_LSR(inBaseAddress) & (1 << UART_MODEM_LSR_TX_FIFO_E_POS)));
//  while (UART_MODEM_SSR(inBaseAddress) & (1 << UART_MODEM_SSR_TX_FIFO_FULL_POS));

    UART_MODEM_THR(inBaseAddress) = *inBuffer++;
  }

  return lvCounter;
}

/* ============================================================================ */

int UART1write(int inFileDescriptor,
       const char *inBuffer,
          unsigned inCount)
{
  return(UARTwrite((void *)UART_MODEM1_ADDRESS,
                   inBuffer,
                   inCount));
}

/* ============================================================================ */

int UART2write(int inFileDescriptor,
       const char *inBuffer,
          unsigned inCount)
{
  return(UARTwrite((void *)UART_MODEM2_ADDRESS,
                   inBuffer,
                   inCount));
}

/* ============================================================================ */

int UART3write(int inFileDescriptor,
       const char *inBuffer,
          unsigned inCount)
{
  return(UARTwrite((void *)UART_MODEM3_ADDRESS,
                   inBuffer,
                   inCount));
}

/* ============================================================================ */

long UARTseek(int inFileDescriptor,
             long inOffset,
              int inOrigin)
{
  return(EOF);
}

/* ============================================================================ */

int UARTrename(const char *inOldName,
               const char *inNewName)
{
  return(~0);
}

/* ============================================================================ */

int UARTunlink(const char *inPath)
{
  return(-1);
}

/* ============================================================================ */

const _DEVICE devUART[] =
{
  {
    "UART1",
    _SSA,
    UART1open,
    UART1close,
    UART1read,
    UART1write,
    UARTseek,
    UARTunlink,
    UARTrename
  },
  {
    "UART2",
    _SSA,
    UART2open,
    UART2close,
    UART2read,
    UART2write,
    UARTseek,
    UARTunlink,
    UARTrename
  },
  {
    "UART3",
    _SSA,
    UART3open,
    UART3close,
    UART3read,
    UART3write,
    UARTseek,
    UARTunlink,
    UARTrename
  }
};

/* ============================================================================ */

const char *ioConfigure(const _DEVICE *inDevice)
{
  /* Set stdin/stdout as unbuffered files */
  setvbuf(stdin, NULL, _IONBF, 0);
  setvbuf(stdout, NULL, _IONBF, 0);

 // _stream[0].dev = /* stdin */
 // _stream[1].dev = /* stdout */
//  _stream[2].dev = /* stderr */
       (_DEVICE *)inDevice;

  uart_in_use = (inDevice - devUART) + 1;

  return(inDevice->name);
}

/* ============================================================================ */

_DEVICE * ioChange(const _DEVICE *inDevice)
{
int uart_in_use_by_user;

 if(!inDevice)
    return(NULL);

   if(uart_in_use){
    // Switch to UART 2
    printf(" Be careful the UART used will switched to UART%i \r\n", (inDevice - devUART) + 1);
    printf(" Connect you UART cable to UART%i then press y \r\n",(inDevice - devUART) + 1);
    devUART[uart_in_use-1].CLOSE(NULL);
  }

  uart_in_use_by_user = uart_in_use;

  ioInitialize(inDevice);

  uiGetYesNo("");
  if (uart_in_use_by_user)
   return (_DEVICE *)&devUART[uart_in_use_by_user - 1];
  else 
   return NULL;
}
/* ============================================================================ */

const char *ioInitialize(const _DEVICE *inDevice)
{
extern UARTMOD_UartType_t UartSerialType;
        
  if(!inDevice)
    return(NULL);

  if(inDevice->OPEN(NULL, 0, 0) < 0)
    return NULL;
 
  if (inDevice == UART1_CCS) {
        UartSerialType = UART_MODEM1;          
	SSW_Release(UART_2);
  	SSW_Release(UART_3);
  	SSW_Grab(UART_1);
        
  } 
   
  else if (inDevice == UART2_CCS) {
        UartSerialType = UART_MODEM2;  
        SSW_Release(UART_1);
  	SSW_Release(UART_3);
  	SSW_Grab(UART_2);          
  } 
   
  else if (inDevice == UART3_CCS) {
  	UartSerialType = UART_MODEM3; 
        SSW_Release(UART_1);
  	SSW_Release(UART_2);
  	SSW_Grab(UART_3);
   }              
  
  return(ioConfigure(inDevice));
}

/* ============================================================================ */

int io_KeyboardHit(void)
{
  char lvCharacter;
  int lvRetVal;

  if(!uart_in_use)
    lvRetVal = scanf("%c", &lvCharacter);
  else
  if(lvRetVal = read(stdin->fd,  NULL, 0))
    /* Flush the character */
    read(stdin->fd, &lvCharacter, 1);

  return(lvRetVal);
}

/* ============================================================================ */

void uiWaitKeyboard(void)
{
  printf("\r\n\nPress any key to continue");
  while(!io_KeyboardHit());
  printf("\r\n");

  return;
}

/* ============================================================================ */

int uiGetYesNo(char *inPromptString)
{
  int lvResult;

  fflush(stdin);

  printf("%s?[y/n]: ", inPromptString);

  lvResult = (getchar() == 'y');

  printf(lvResult ? "Yes" : "No");
  printf("\r\n");

  return(lvResult);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?