📄 dm643_uart.c
字号:
/*
* Copyright 2003 by Spectrum Digital Incorporated.
* All rights reserved. Property of Spectrum Digital Incorporated.
*/
/*
* ======== dm643_uart.c ========
* UART module for the DM643
*/
#include <csl.h>
#include "dm643.h"
#include "dm643_uart.h"
/*
* ======== DM643_UART_rset ========
* Set a UART register
*/
void DM643_UART_rset(DM643_UART_Handle hUart, Int16 regnum, Int16 regval)
{
Int16 regindex, lcr;
/* Register index is determined by lower 3 bits and the target UART */
regindex = regnum & 0x7;
if (hUart == 1)
regindex += 8;
/* If regnum between 0x08 and 0x0F, set bit 7 of LCR to access register */
if ((regnum & 0x18) == 0x8)
{
lcr = DM643_UART_rget(hUart, DM643_UART_LCR);
DM643_UART_rset(hUart, DM643_UART_LCR, lcr | 0x80);
DM643_rset(regindex, regval);
DM643_UART_rset(hUart, DM643_UART_LCR, lcr);
}
else
{
DM643_rset(regindex, regval);
}
}
/*
* ======== DM643_UART_rget ========
* Get the value of a UART register
*/
Int16 DM643_UART_rget(DM643_UART_Handle hUart, Int16 regnum)
{
Int16 regindex, returnval, lcr;
/* Register index is determined by lower 3 bits and the target UART */
regindex = regnum & 0x7;
if (hUart == 1)
regindex += 8;
/* If regnum between 0x08 and 0x0F, set bit 7 of LCR to access register */
if ((regnum & 0x18) == 0x8)
{
lcr = DM643_UART_rget(hUart, DM643_UART_LCR);
DM643_UART_rset(hUart, DM643_UART_LCR, lcr | 0x80);
returnval = DM643_rget(regindex);
DM643_UART_rset(hUart, DM643_UART_LCR, lcr);
}
else
{
returnval = DM643_rget(regindex);
}
return returnval;
}
/*
* ======== DM643_UART_open ========
* Initialize UART and return handle
*/
DM643_UART_Handle DM643_UART_open(Int16 devid, Int16 baudrate, DM643_UART_Config *config)
{
DM643_UART_Handle hUart;
/* Assign handle */
hUart = devid;
/* Set registers based on config structure */
DM643_UART_rset(hUart, DM643_UART_IER, config -> regs[0]);
DM643_UART_rset(hUart, DM643_UART_FCR, config -> regs[1]);
DM643_UART_rset(hUart, DM643_UART_LCR, config -> regs[2]);
DM643_UART_rset(hUart, DM643_UART_MCR, config -> regs[3]);
/* Set up baud divisor clock */
DM643_UART_rset(hUart, DM643_UART_DLL, baudrate & 0xff);
DM643_UART_rset(hUart, DM643_UART_DLH, (baudrate >> 8) & 0xff);
/* Clear any outstanding receive characters */
DM643_UART_rget(hUart, DM643_UART_RBR);
return hUart;
}
/*
* ======== DM643_UART_getChar ========
* Get one character of data from the UART
*/
Int16 DM643_UART_getChar(DM643_UART_Handle hUart)
{
Int16 status;
while(1)
{
status = DM643_UART_rget(hUart, DM643_UART_LSR);
if ((status & 1) != 0) // DR
break;
}
return DM643_UART_rget(hUart, DM643_UART_RBR);
}
/*
* ======== DM643_UART_putChar ========
* Send one character of data to the UART
*/
void DM643_UART_putChar(DM643_UART_Handle hUart, Uint16 data)
{
Int16 status;
while(1)
{
status = DM643_UART_rget(hUart, DM643_UART_LSR);
if ((status & 0x20) != 0) // THRE
break;
}
DM643_UART_rset(hUart, DM643_UART_THR, data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -