📄 dbgu.c
字号:
//*********************************************************************************************************************
//【 版 权 】Copyright (c) 2007-2008 gliethttp
//
//【 文 件 版 本 】v1.x
//
//【 文 件 名 称 】dbgu.c
//
//【 创 建 日 期 】2007-04-04
//
//【 功 能 描 述 】
//*********************************************************************************************************************
#include <uart.h>
static void dbgu_irq_handler(void);
_dbgu_control dbgu_control;
uint32 dbgu_baud_rate;
static volatile uint32 dbgu_frame_over = false;
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void dbgu_ini(uint32 baud)
//【 创建人及创建时间 】gliethttp 2007-04-04
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void dbgu_ini(uint32 baud)
{
dbgu_baud_rate = baud;
AT91F_DBGU_CfgPIO();
AT91F_US_Configure (
(AT91PS_USART) AT91C_BASE_DBGU,
__MCLK,
AT91C_US_ASYNC_MODE ,
dbgu_baud_rate ,
0);
((AT91PS_USART)AT91C_BASE_DBGU)->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;
((AT91PS_USART)AT91C_BASE_DBGU)->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_DBGU,AT91C_US_RXRDY);
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SYS, 7,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, dbgu_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);
dbgu_control.flag = 0x00000000;
{uint32 i;
for(i = 0;i < dbgu_control_vmalloc_max;i++)
{
dbgu_control.mm[i].status = 0;
dbgu_control.mm[i].p = 0;
dbgu_control.mm[i].len = 0;
}
dbgu_control.mm_cur_index = 0;
dbgu_control.mm_buf_counts = 0;
dbgu_control.mm_in = 0;
dbgu_control.mm_out = 0;
dbgu_control.mm_lastp = (void*)&dbgu_control.dbgu_cache_buffer[0];
dbgu_control.mm_maxp = (void*)&dbgu_control.dbgu_cache_buffer[dbgu_cache_buffer_max];//小于,无等于
}
dbgu_frame_over = false;
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】static void dbgu_irq_handler(void)
//【 创建人及创建时间 】gliethttp 2007-04-04
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
static void dbgu_irq_handler(void)
{
if( (AT91C_BASE_DBGU->DBGU_IMR & AT91C_US_TXBUFE) && (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXBUFE) )
{
dbgu_frame_over = true;
AT91F_US_DisableIt((AT91PS_USART) AT91C_BASE_DBGU,AT91C_US_TXBUFE);
}
if(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY)
{
#define dbgu_tmp_local_max 20
static char dbgu_tmp[dbgu_tmp_local_max];
uint32 dbgu_tmp_index;
uint32 time_out;
dbgu_tmp_index = 0;
for(time_out = 0;time_out < 0xffff;time_out++)
{
if(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY)
{
dbgu_tmp[dbgu_tmp_index++] = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
if(dbgu_tmp_index >= dbgu_tmp_local_max)break;
}
}
#define __dbgu_control_dbgu_baud_get "AT+TSBAUDD?"
#define __dbgu_control_dbgu_baud_set "AT+TSBAUDD="
#define __dbgu_control_uart0_baud_set "AT+TSBAUD0="
#define __dbgu_control_uart0_baud_get "AT+TSBAUD0?"
#define __dbgu_control_uart1_baud_set "AT+TSBAUD1="
#define __dbgu_control_uart1_baud_get "AT+TSBAUD1?"
#define __dbgu_control_uart0_out_all "AT+TSBAUD0!"
#define __dbgu_control_uart1_out_all "AT+TSBAUD1!"
if(xmemcmp(dbgu_tmp,__dbgu_control_dbgu_baud_set,strlen(__dbgu_control_dbgu_baud_set)) == 0)
{uint8 i;
uint8 width;
uint32 baud;
i = strlen(__dbgu_control_dbgu_baud_set);
width = dbgu_tmp_index - i;
if( width > 6 )dbgu_send_string("baud error!\r\n");
else
{//读取波特率
baud = 0;
for(;i < dbgu_tmp_index;i++)
{
if(misc_char2num(&dbgu_tmp[i]))
{uint32 tmp;
uint8 j;
tmp = 1;
for(j = 1;j < width;j++)tmp *= 10;
if(width)width--;
baud += dbgu_tmp[i]*tmp;
}else
{
//sprintf(dbgu_tmp,"baud error!\r\n");
dbgu_send_string("baud error!\r\n");
break;
}
}
if(i == dbgu_tmp_index)
{
dbgu_send_string("+TSBAUDD\r\nOK\r\n");
dbgu_wait_string();
dbgu_set_baud(baud);
// sprintf(dbgu_tmp,"+TSBAUD0:%ld\r\nOK\r\n",uart0_get_baud());
}
}
}else if(xmemcmp(dbgu_tmp,__dbgu_control_dbgu_baud_get,dbgu_tmp_index) == 0)
{uint32 baud;
baud = dbgu_get_baud();
dbgu_send_string("+TSBAUDD:");
dbgu_send_uint32(baud);
dbgu_send_string("\r\nOK\r\n");
// sprintf(dbgu_tmp,"+TSBAUD0:%ld\r\nOK\r\n",uart0_get_baud());
}else
if(xmemcmp(dbgu_tmp,__dbgu_control_uart0_baud_set,strlen(__dbgu_control_uart0_baud_set)) == 0)
{uint8 i;
uint8 width;
uint32 baud;
i = strlen(__dbgu_control_uart0_baud_set);
width = dbgu_tmp_index - i;
if( width > 6 )dbgu_send_string("baud error!\r\n");
else
{//读取波特率
baud = 0;
for(;i < dbgu_tmp_index;i++)
{
if(misc_char2num(&dbgu_tmp[i]))
{uint32 tmp;
uint8 j;
tmp = 1;
for(j = 1;j < width;j++)tmp *= 10;
if(width)width--;
baud += dbgu_tmp[i]*tmp;
}else
{
//sprintf(dbgu_tmp,"baud error!\r\n");
dbgu_send_string("baud error!\r\n");
break;
}
}
if(i == dbgu_tmp_index)
{
uart0_set_baud(baud);
dbgu_send_string("+TSBAUD0\r\nOK\r\n");
// sprintf(dbgu_tmp,"+TSBAUD0:%ld\r\nOK\r\n",uart0_get_baud());
}
}
}else if(xmemcmp(dbgu_tmp,__dbgu_control_uart0_baud_get,dbgu_tmp_index) == 0)
{uint32 baud;
baud = uart0_get_baud();
dbgu_send_string("+TSBAUD0:");
dbgu_send_uint32(baud);
dbgu_send_string("\r\nOK\r\n");
// sprintf(dbgu_tmp,"+TSBAUD0:%ld\r\nOK\r\n",uart0_get_baud());
}
else if(xmemcmp(dbgu_tmp,__dbgu_control_uart1_baud_set,strlen(__dbgu_control_uart1_baud_set)) == 0)
{uint8 i;
uint8 width;
uint32 baud;
i = strlen(__dbgu_control_uart1_baud_set);
width = dbgu_tmp_index - i;
if( width > 6 )dbgu_send_string("baud error!\r\n");
else
{//读取波特率
baud = 0;
for(;i < dbgu_tmp_index;i++)
{
if(misc_char2num(&dbgu_tmp[i]))
{uint32 tmp;
uint8 j;
tmp = 1;
for(j = 1;j < width;j++)tmp *= 10;
if(width)width--;
baud += dbgu_tmp[i]*tmp;
}else
{
//sprintf(dbgu_tmp,"baud error!\r\n");
dbgu_send_string("baud error!\r\n");
break;
}
}
if(i == dbgu_tmp_index)
{
uart1_set_baud(baud);
dbgu_send_string("+TSBAUD1\r\nOK\r\n");
// sprintf(dbgu_tmp,"+TSBAUD1:%ld\r\nOK\r\n",uart1_get_baud());
}
}
}
else if(xmemcmp(dbgu_tmp,__dbgu_control_uart1_baud_get,dbgu_tmp_index) == 0)
{uint32 baud;
baud = uart1_get_baud();
dbgu_send_string("+TSBAUD1:");
dbgu_send_uint32(baud);
dbgu_send_string("\r\nOK\r\n");
// sprintf(dbgu_tmp,"+TSBAUD1:%ld\r\nOK\r\n",uart1_get_baud());
}
else if(xmemcmp(dbgu_tmp,__dbgu_control_uart0_out_all,dbgu_tmp_index) == 0)
{
if(dbgu_control.flag & flag_uart0_out_all)
{
dbgu_control.flag &= ~flag_uart0_out_all;
dbgu_send_string("\r\nU0OFF\r\n");
}else
{
dbgu_control.flag |= flag_uart0_out_all;
dbgu_send_string("\r\nU0ALL\r\n");
}
}
else if(xmemcmp(dbgu_tmp,__dbgu_control_uart1_out_all,dbgu_tmp_index) == 0)
{
if(dbgu_control.flag & flag_uart1_out_all)
{
dbgu_control.flag &= ~flag_uart1_out_all;
dbgu_send_string("\r\nU1OFF\r\n");
}else
{
dbgu_control.flag |= flag_uart1_out_all;
dbgu_send_string("\r\nU1ALL\r\n");
}
}else dbgu_send_string("param error\r\n");
}
AT91C_BASE_DBGU->DBGU_CSR = AT91C_US_RSTSTA;
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】uint32 dbgu_get_baud(void)
//【 创建人及创建时间 】gliethttp 2007-04-16
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
uint32 dbgu_get_baud(void)
{
return dbgu_baud_rate;
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void dbgu_set_baud(uint32 baud)
//【 创建人及创建时间 】gliethttp 2007-04-16
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void dbgu_set_baud(uint32 baud)
{
if(baud)
{
dbgu_baud_rate = baud;
AT91F_US_SetBaudrate((AT91PS_USART)AT91C_BASE_DBGU, __MCLK, dbgu_baud_rate);
}
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void dbgu_send_char(uint8 data)
//【 创建人及创建时间 】gliethttp 2007-04-04
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void dbgu_send_char(uint8 data)
{
//while(AT91C_BASE_PDC_DBGU->PDC_TCR);
while( (((AT91PS_USART)AT91C_BASE_DBGU)->US_CSR & AT91C_US_TXRDY) == false );
((AT91PS_USART)AT91C_BASE_DBGU)->US_THR = data;
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void dbgu_send_string(char *string)
//【 创建人及创建时间 】gliethttp 2007-04-04
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void dbgu_send_string(char *string)
{
while(AT91C_BASE_PDC_DBGU->PDC_TCR);
//while( (((AT91PS_USART)AT91C_BASE_DBGU)->US_CSR & AT91C_US_TXRDY) == false );
AT91C_BASE_PDC_DBGU->PDC_TPR = (uint32)string;
AT91C_BASE_PDC_DBGU->PDC_TCR = strlen(string);
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void dbgu_send_string(char *string)
//【 创建人及创建时间 】gliethttp 2007-04-04
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void dbgu_wait_string(void)
{
while(AT91C_BASE_PDC_DBGU->PDC_TCR);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -