📄 xdbgu.c
字号:
//*********************************************************************************************************************
//【 版 权 】Copyright (c) 2007-2008 http://gliethttp.cublog.cn
//
//【 文 件 版 本 】v1.x
//
//【 文 件 名 称 】XDBGU.c
//
//【 创 建 日 期 】2007-12-27
//
//【 功 能 描 述 】
//*********************************************************************************************************************
#include <XDBGU.h>
#include <stdarg.h>
#include <string.h>
/*
void DBGU_IRQ_proc(void)
{uint32 dummy;
dummy = AT91C_BASE_ST->ST_SR;
if( (dummy & 0x04) == 0 )
{//串口引发中断
goto XST_IRQ_Handler_Exit;
}else
{
return;
}
XST_IRQ_Handler_Exit:
{
if(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXBUFF)
{volatile static Boolean first = true;
if(xDBGU_proc_over == true)
{//串口接收到数据
if(first == true)
{
if(xDBGU_proc_rcve_buf[0] == 0xf7)
{int32 len;
static Boolean cmd_first = true;
if(cmd_first == true)
{
AT91C_BASE_DBGU->DBGU_RCR = 3;
cmd_first = false;
}else
{
cmd_first = true;
//xDBGU_proc_rcve_buf[0] = xDBGU_proc_rcve_buf[1];
//AT91C_BASE_DBGU->DBGU_RPR = (uint32)&xDBGU_proc_rcve_buf[1];
len = xDBGU_proc_rcve_buf[1] + (xDBGU_proc_rcve_buf[2] << 8) - 4;
if(len <= 0)
{
first = true;
if(len == 0)
{
AT91F_US_DisableIt((AT91PS_USART) AT91C_BASE_DBGU, AT91C_US_ENDRX );
xDBGU_proc_over = false;
//xxxdprintf("无长度命令\r\n");
OSQPost(XQ_buf_DBGU,(void*)1);
}else
{
AT91C_BASE_DBGU->DBGU_RPR = (uint32)xDBGU_proc_rcve_buf;
AT91C_BASE_DBGU->DBGU_RCR = 1;//sizeof(_xpccmd);
dprintf("命令数据长度不匹配!\r\n");
}
}else
{
if(len <= xDBGU_proc_rcve_buf_MAX)
{
AT91C_BASE_DBGU->DBGU_RCR = len;
first = false;
}else
{
first = true;
AT91C_BASE_DBGU->DBGU_RPR = (uint32)xDBGU_proc_rcve_buf;
AT91C_BASE_DBGU->DBGU_RCR = 1;
dprintf("数据长度超长!\r\n");
}
//dprintf("收到命令f7\r\n");
}
}
}else
{
AT91C_BASE_DBGU->DBGU_RPR = (uint32)xDBGU_proc_rcve_buf;
AT91C_BASE_DBGU->DBGU_RCR = 1;
}
}else
{
first = true;
AT91F_US_DisableIt((AT91PS_USART) AT91C_BASE_DBGU, AT91C_US_ENDRX );
xDBGU_proc_over = false;
AT91F_US_DisableRx((AT91PS_USART) AT91C_BASE_DBGU);
OSQPost(XQ_buf_DBGU,(void*)1);
}
}
}
}
}
*/
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void XDBGU_ini(void)
//【 创建人及创建时间 】葛立新 2005-12-06 17:21
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void XDBGU_ini(void)
{//static char data[]="DBGU的PDC测试数据!\r\n";
AT91F_DBGU_CfgPIO();
AT91F_DBGU_CfgPMC();
AT91F_US_Configure (
(AT91PS_USART) AT91C_BASE_DBGU, // DBGU基址
GMCLK, // GMCLK
AT91C_US_ASYNC_MODE , // mode Register to be programmed
115200 , // baudrate to be programmed
0); // timeguard to be programmed
//发送使能
AT91F_US_EnableTx((AT91PS_USART) AT91C_BASE_DBGU);
//接收使能
//AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU);
//-------------------------------------------------
// AT91F_PDC_Open(AT91C_BASE_PDC_DBGU);
// AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
// AT91C_ID_SYS,
// XXSYS_IRQprio,
// AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
// DBGU_IRQ_proc);
AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX;
// AT91C_BASE_DBGU->DBGU_RPR = (uint32)xDBGU_proc_rcve_buf;
AT91C_BASE_DBGU->DBGU_RCR = 1;//sizeof(_xpccmd);
AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_DBGU, AT91C_US_ENDRX );
AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN;
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SYS);
// xDBGU_context->print_x = false;
// xDBGU_context->updateing = false;
// #if xPrint_IRQ_Addr
// {static char data[100];
// sprintf(data,"第%ld个:DBGU_IRQ_proc=0x%lx\r\n",++context.IRQ_NUMS,(uint32)DBGU_IRQ_proc);
// xxxdprintf(data);
// }
// #endif
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void xxxdprintf(void)
//【 创建人及创建时间 】gliethttp 2007-12-27
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void xxxdprintf(void *fmt)
{char *data = fmt;
for(;*data;)
{
while( !(AT91C_BASE_DBGU->DBGU_CSR & 0x02) );
AT91C_BASE_DBGU->DBGU_THR = *data++;
}
}
void xxxdprintc(uint8 data)
{
while( !(AT91C_BASE_DBGU->DBGU_CSR & 0x02) );
AT91C_BASE_DBGU->DBGU_THR = data;
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void xxxdprintfc(void *data,uint16 len)
//【 创建人及创建时间 】gliethttp 2007-12-27
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void xxxdprintfc(void *data,uint16 len)
{
if(len >= 0xffff)len = 0xff;
//阻塞
while( (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXBUFE) == 0 );
//PDC
AT91C_BASE_DBGU->DBGU_TPR = (uint32)data;
AT91C_BASE_DBGU->DBGU_TCR = len;
//阻塞
while( (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXBUFE) == 0 );
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void xxxdprintfc(void *data,uint16 len)
//【 创建人及创建时间 】gliethttp 2007-12-27
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void xxxdprintfc_(void *data,uint16 len)
{/*uint16 i;
char *dat = data;
for(i = 0;i < len;i++)
{
while( !(AT91C_BASE_DBGU->DBGU_CSR & 0x02) );
AT91C_BASE_DBGU->DBGU_THR = *dat++;
}
*/
if(len > 0xffff)len = 0xffff;
//阻塞
while( (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXBUFE) == 0 );
//PDC
AT91C_BASE_DBGU->DBGU_TPR = (uint32)data;
AT91C_BASE_DBGU->DBGU_TCR = len;
//阻塞
//while( (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXBUFE) == 0 );
}
/*
void xDBGU_version(void)
{
#define xDEBGU_version "Navtex_v1.1\r\n"
#define xDEBGU_DATE __DATE__
#define xDEBGU_TIME __TIME__
xxxdprintf(xDEBGU_version);
xxxdprintf(xDEBGU_DATE);
xxxdprintf("/"xDEBGU_TIME"\r\n");
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void xOnline_update_S(Boolean reset)
//【 创建人及创建时间 】葛立新 2006-05-23 16:52
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void xOnline_update_S(Boolean reset)
{
AT91C_BASE_AIC->AIC_IDCR = 0xffffffff;
//XDBGU_ini();
AT91F_DBGU_CfgPIO();
AT91F_DBGU_CfgPMC();
AT91F_US_Configure (
(AT91PS_USART) AT91C_BASE_DBGU, // DBGU基址
GMCLK, // GMCLK
AT91C_US_ASYNC_MODE , // mode Register to be programmed
115200 , // baudrate to be programmed
0); // timeguard to be programmed
//发送使能
AT91F_US_EnableTx((AT91PS_USART) AT91C_BASE_DBGU);
//接收使能
AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU);
//-------------------------------------------------
AT91F_PDC_Open(AT91C_BASE_PDC_DBGU);
xDBGU_version();
xxxdprintf("上电\r\n");
#if 0
xxxdprintf("输入92Mloader\r\n");
xOnline_update_P((void*)0x10000000,true,false);
xxxdprintf("输入程序XCttc-programADS-v1.x.bin\r\n");
xOnline_update_P((void*)0x10010000,true,reset);
#else
{static char tmp[20];
#define xMYADDRESS_NO1 0x10000000
#define xMYADDRESS_NO2 0x10010000
#define xMYADDRESS_NO3 0x10000000
sprintf(tmp,"Boot地址:%X,Go,Go,Go!\r\n",xMYADDRESS_NO1);
xxxdprintf(tmp);
xOnline_update_P((void*)xMYADDRESS_NO1,true,false);
sprintf(tmp,"u-Boot地址:%X,Go,Go,Go!\r\n",xMYADDRESS_NO2);
xxxdprintf(tmp);
xOnline_update_P((void*)xMYADDRESS_NO2,false,false);
sprintf(tmp,"地址:%X,Go,Go,Go!\r\n",xMYADDRESS_NO3);
xxxdprintf(tmp);
xOnline_update_P((void*)xMYADDRESS_NO3,true,false);
xxxdprintf("\r\n结束\r\n");
for(;;);
}
#endif
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void xOnline_update_P(void *base_dst,Boolean bin,Boolean reset)
//【 创建人及创建时间 】葛立新 2006-04-11 16:57
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void xOnline_update_P(void *base_dst,Boolean bin,Boolean reset)
{//32M字节SDRAM
//static char xOnline_data[1024*400];
#define xOnline_data_BASE (char*)(0x20000000+32*1024*1024-1024*1024*4)
static char *xOnline_data = xOnline_data_BASE;
uint32 xOnline_One_Packets_nums;
uint32 xDely_counts;
//OS_CPU_SR cpu_sr;
uint16 CK16_CK;
char *dst;
uint16 xPackets_num;
#define xOnline_One_Packets 528
#define xOnline_PC_ack_E 0
#define xOnline_S_String "\r\n输入升级代码Bin文件......\r\n"
#define xOnline_E_String "成功烧写!已经重启!\r\n"
xDBGU_context->updateing = true;
if(bin)xxxdprintfc(xOnline_S_String,sizeof(xOnline_S_String));
else xxxdprintf("注意:你输入的为非Bin文件!\r\n");
//OS_ENTER_CRITICAL();//禁止一切中断
#if __xHardDog_OK
//2007-06-05 gliethttp
//添加硬件看门狗
xDBGU_context->Hard_Dog_Feed_In_Time = true;
#endif
dst = xOnline_data;
{
AT91C_BASE_DBGU->DBGU_RPR = (uint32)xOnline_data;//小段
AT91C_BASE_DBGU->DBGU_RCR = 2;//2个数据长度
for(;(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXBUFF) == 0;)xWatch_Dog_Feed();//第接收数据包数
{static char data[20];
xPackets_num = xOnline_data[0]+(xOnline_data[1] << 8);
sprintf(data,"总包数:%d\r\n",xPackets_num);
xxxdprintfc(data,strlen(data));
}
}
AT91C_BASE_DBGU->DBGU_RPR = (uint32)dst;
AT91C_BASE_DBGU->DBGU_RCR = xOnline_One_Packets;
xDely_counts = 0;
for(;(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXBUFF) == 0;)xWatch_Dog_Feed();
dst += xOnline_One_Packets;
for(xOnline_One_Packets_nums = 1;xOnline_One_Packets_nums != xPackets_num;xOnline_One_Packets_nums++)
{
AT91C_BASE_DBGU->DBGU_RPR = (uint32)dst;
AT91C_BASE_DBGU->DBGU_RCR = xOnline_One_Packets;
xWatch_Dog_Feed();
xxxdprintf("★");
#if xOnline_PC_ack_E
xxxdprintc(0xfe);//回执,启动下一包的发送
#endif
for(xDely_counts = 0;(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXBUFF) == 0;)
{
xDely_counts++;
if(xDely_counts > 0x7fffff)
{//Bin程序传输结束
//开始烧写
xxxdprintf("数据传输超时,强制重启\r\n");
//-----------------------------
AT91C_BASE_ST->ST_WDMR = 0x08 | AT91C_ST_RSTEN | AT91C_ST_EXTEN;
AT91C_BASE_ST->ST_CR = 0x01;
//-----------------------------
for(;;);
//打印共多少包
//烧写进度点
//看门狗复位
}
}
//调整指针
dst += xOnline_One_Packets;
}
{//接收校验和
static char CK16_data[2];
AT91C_BASE_DBGU->DBGU_RPR = (uint32)CK16_data;//小段
AT91C_BASE_DBGU->DBGU_RCR = 2;//2个校验和
for(;(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXBUFF) == 0;);
//{static char data[20];
xPackets_num = CK16_data[0]+(CK16_data[1] << 8);
// sprintf(data,"\r\n校验和:%d\r\n",xPackets_num);
// xxxdprintfc(data,strlen(data));
//}
}
{uint32 i;
uint32 max;
max = xOnline_One_Packets*xOnline_One_Packets_nums;
CK16_CK = 0;
for(i = 0;i < max;i++)
{
CK16_CK += xOnline_data[i];
}
{static char data[50];
sprintf(data,"\r\n本地校验和:%d\r\n状态:%s\r\n",
CK16_CK,
CK16_CK == xPackets_num ? "匹配":"不匹配"
);
xxxdprintfc(data,strlen(data));
}
}
{
if(CK16_CK == xPackets_num)
{
if(bin && (xOnline_data[0] == 0x06))
{
xwrite2flash(xOnline_data,base_dst,xOnline_One_Packets*xOnline_One_Packets_nums);
xxxdprintfc(xOnline_E_String,sizeof(xOnline_E_String));
}else
{
if(bin)xxxdprintf("非法Bin代码,强制重启!\r\n");
}
if( (base_dst == (void*)0x10010000) && bin )
{
if(reset == true)
{
//-----------------------------
AT91C_BASE_ST->ST_WDMR = 0x08 | AT91C_ST_RSTEN | AT91C_ST_EXTEN;
AT91C_BASE_ST->ST_CR = 0x01;
//-----------------------------
}else xxxdprintf("程序停止!\r\n");
for(;;);
}else
{
if( (base_dst == (void*)0x10070000) || (base_dst == (void*)0x10010000) )
{
xxxdprintf("正在烧录......\r\n");
xwrite2flash(xOnline_data,base_dst,xOnline_One_Packets*xOnline_One_Packets_nums);
}
else xxxdprintf("\r\n继续输入bin代码......\r\n");
}
}else
{
xxxdprintf("校验和出错!\r\n");
}
}
xDBGU_context->updateing = false;
}
*/
//⊙⊙⊙
//⊙⊙⊙完了⊙⊙⊙
//⊙⊙⊙over⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -