⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 Sunplus 8202S source code.
💻 C
字号:
#include "config.h"
#include "regmap.h"
#include "uart.h"


#ifndef DVDRELEASE

#ifdef SOFT_UART_OUT   
	extern int PutSoftUartChar(BYTE *,int);
#endif	

UINT16	uart_rp;
UINT16	uart_wp;

#define	FIFOS	256

char	uart_buf[FIFOS];


void	reset_uart1_fifo()
{
  uart_rp = uart_wp = 0;
  regs0->uart1_isc  = 0;	// disable interrupt
}


int	is_uart1_fifo_empty()
{
#if 0
  unsigned rp = uart_rp;
  unsigned wp = uart_wp;

  if (wp==rp) return 1;
  else
  {
    if (UART1_tx_rdy())
    {
      regs0->uart1_data = uart_buf[rp];
      rp = rp+1;
      if (rp>=FIFOS) rp=0;
    }
    uart_rp = rp;
  }
  return 0;
#endif
  return (uart_rp==uart_wp);
}

#define	ENABLE_UART1_INTR()	(regs0->uart1_isc=(1<<4))


int	is_uart1_fifo_full()
{
  int wp = uart_wp;
  int rp = uart_rp;
  int wpn;

  wpn = wp+1;
  if (wpn>=FIFOS) wpn=0;
  if (wp!=rp) ENABLE_UART1_INTR();	// not-empty: enable interrupt
  return (wpn==rp);			// full-condition
}


void	write_uart1(int c)
{

#ifdef SOFT_UART_OUT   
  PutSoftUartChar((BYTE *)&c,1);
#else 	
  int wp = uart_wp;
  int rp = uart_rp;
  int wpn;
	
  wpn = wp+1;
  if (wpn>=FIFOS) wpn=0;
  if (wpn!=rp) {uart_buf[wp] = c; uart_wp = wpn;}
  ENABLE_UART1_INTR();					// enable it.
#endif  
}


void	write_uart1_exact(int c)
{

#ifdef SOFT_UART_OUT   
	PutSoftUartChar((BYTE *)&c,1);
#else
  UART1_putc(c);
#endif  
}



#include "intdef.h"

#ifdef SERVO_UART
UINT8 gcRS232Data[5];
UINT8 gwWPtr=0;
UINT8 cReveiveRs232=0;
#endif

void	intr_uart1(void)
{
  int wp = uart_wp;
  int rp = uart_rp;

#ifdef SERVO_UART
 #if 0
  if (UART1_rx_rdy())
  {
      gcRS232Data[gwWPtr] = (regs0->uart1_data);
	  if (gwWPtr >= 4)
	  {
			cReveiveRs232 = 1;
			gwWPtr = 0;
	  }
	  else
	  {
			cReveiveRs232 = 0;
		    gwWPtr ++;
	  }
  }
 #endif
#else
  if (regs0->uart1_isc & 0x01)
  {
    while (wp!=rp && UART1_tx_rdy())
    {
      regs0->uart1_data = uart_buf[rp];
      rp = rp+1;
      if (rp>=FIFOS) rp=0;
    }
  }
  if (rp==wp) regs0->uart1_isc = 0;
  uart_rp = rp;
#endif
  regs0->intr_flag	= INTR_UART1_INT;
}


#ifdef DVD728
//
// UART 0
void	reset_uart0_fifo()
{
  uart_rp = uart_wp = 0;
  regs0->uart0_isc  = 0;	// disable interrupt
}

int	is_uart0_fifo_empty()
{
  return (uart_rp==uart_wp);
}

#define	ENABLE_UART0_INTR()	(regs0->uart0_isc=(1<<4))


int	is_uart0_fifo_full()
{
  int wp = uart_wp;
  int rp = uart_rp;
  int wpn;

  wpn = wp+1;
  if (wpn>=FIFOS) wpn=0;
  if (wp!=rp) ENABLE_UART0_INTR();	// not-empty: enable interrupt
  return (wpn==rp);			// full-condition
}


void	write_uart0(int c)
{

#ifdef SOFT_UART_OUT   
  PutSoftUartChar((BYTE *)&c,1);
#else 	
  int wp = uart_wp;
  int rp = uart_rp;
  int wpn;
	
  wpn = wp+1;
  if (wpn>=FIFOS) wpn=0;
  if (wpn!=rp) {uart_buf[wp] = c; uart_wp = wpn;}
  ENABLE_UART0_INTR();					// enable it.
#endif  
}


void	write_uart0_exact(int c)
{

#ifdef SOFT_UART_OUT   
	PutSoftUartChar((BYTE *)&c,1);
#else
  UART0_putc(c);
#endif  
}

void	intr_uart0(void)
{
  int wp = uart_wp;
  int rp = uart_rp;

#if 1
  if (regs0->uart0_isc & 0x01)
  {
    while (wp!=rp && UART0_tx_rdy())
    {
      regs0->uart0_data = uart_buf[rp];
      rp = rp+1;
      if (rp>=FIFOS) rp=0;
    }
  }
  if (rp==wp) regs0->uart0_isc = 0;
  uart_rp = rp;
#endif
  regs0->intr_flag	= INTR_UART0_INT;
}
#endif
#else
void	intr_uart0(void) {}
void	intr_uart1(void) {}
#endif

⌨️ 快捷键说明

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