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

📄 at91_usart.c

📁 lwip在ucos上的移植
💻 C
字号:
/*   
 *  at91_usart.c
 *  this file implement usart driver on AT91X40 
 *  for Atmel AT91 serial port comunication
 *
 *  Bugs report:  li ming  ( lmcs00@mails.tsinghua.edu.cn )
 *
 */
#include "at91.h"
#include "at91_usart.h"
#include "at91_init.h"

static volatile struct atmel_usart_regs *usarts[AT91_USART_CNT] = {
	(volatile struct atmel_usart_regs *) AT91_USART0_BASE,
	(volatile struct atmel_usart_regs *) AT91_USART1_BASE
};

static unsigned long calcCD(unsigned long br)
{
	return (UART_CLOCK / br);
}

static void uart_init(volatile struct atmel_usart_regs *uart)
{
	/* Reset the USART */
	uart->cr = US_TXDIS | US_RXDIS | US_RSTTX | US_RSTRX;
	/* clear Rx receive and Tx sent counters */
	uart->rcr = 0;
	uart->tcr = 0;
	
	/* Set the serial port into a safe sane state */
	uart->mr = US_USCLKS(0) | US_CLK0 | US_CHMODE(0) | US_NBSTOP(0) |
		    US_PAR(4) | US_CHRL(3);

	uart->brgr = calcCD(9600);

	uart->rtor = 20;			// timeout = value * 4 *bit period
	uart->ttgr = 0;				// no guard time
	uart->rcr = 0;
	uart->rpr = 0;
	uart->tcr = 0;
	uart->tpr = 0;
}

static void _INLINE_ tx_enable(volatile struct atmel_usart_regs *uart)
{
	uart->ier = US_TXEMPTY;
}

static void _INLINE_ rx_enable(volatile struct atmel_usart_regs *uart)
{
	uart->ier = US_ENDRX | US_TIMEOUT;
}

static void _INLINE_ tx_start(volatile struct atmel_usart_regs *uart, int ints)
{
	if (ints) {
		tx_enable(uart);
	}
	uart->cr = US_TXEN;
}

static void _INLINE_ rx_start(volatile struct atmel_usart_regs *uart, int ints)
{
	uart->cr = US_RXEN | US_STTO;
	uart->rtor = 20;
	if (ints) {
		rx_enable(uart);
	}
}

static void _INLINE_ rx_disable(volatile struct atmel_usart_regs *uart)
{
	uart->idr = US_ENDRX | US_TIMEOUT;
}

static void _INLINE_ rx_stop(volatile struct atmel_usart_regs *uart)
{
	rx_disable(uart);
	uart->rtor = 0;
	uart->rcr = 0;
	uart->cr = US_RXDIS;
}

static void start_rx(volatile struct atmel_usart_regs *uart, char *rx_buf, int len )
{
	rx_stop(uart);

 	uart->rpr = (unsigned long) rx_buf;
 	uart->rcr = (unsigned long) len;
 	rx_start(uart, 1);
}

static void xmit_string(volatile struct atmel_usart_regs *uart, char *p, int len)
{
	uart->tcr = 0;
	uart->tpr = (unsigned long) p;
	uart->tcr = (unsigned long) len;
	tx_start(uart, 1);
}

static void xmit_char(volatile struct atmel_usart_regs *uart, char ch)
{
	xmit_string(uart, &ch, 1);
}

void at91_init_usart()
{
	uart_init( usarts[0] );	
}

void at91_uart_send_string( char *p, int len )
{
	xmit_string( usarts[0], p, len);
}

void at91_uart_put_char( char ch )
{
	xmit_char( usarts[0], ch );
}

static void _io_read( long * paddr, long * pvalue )
{
	*pvalue = *paddr;
	return;	
}

void at91_uart_get_char( char *ch )
{
	unsigned long status;

	long tmp;
	start_rx( usarts[0], ch, 1 );
	do
	{
		// must read 0xfffff100, status register to clear all flags !!!
		_io_read( (long*)0xfffff100, &tmp );
		_io_read( (long*)0xfffff108, &tmp );
		status = usarts[0]->rcr;
	}
	while (status > 0);
}

⌨️ 快捷键说明

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