bigbaicai

芯方式是以半导体人、电子工程师等电子行业相关领域从业人员为核心的知识经验学习、分享、交流社群。 凭借开放、合作、共赢的运营理念,聚集了来自国内外知名院校和顶尖科技公司的半导体人、电子工程师。 我们致力于营造专业、认真、有温度的分享交流环境,将高质量的内容和方案成规模地生产和分享,帮助个人和团队在芯方式找到有价值的Key。 http://www.icfans.com/

auto baudrate 时如何获取target端 baudrate

0
阅读(821)

[DESCRIPTION]
对于6260 以及之前的chip 在auto baudrate成功后无法通过读取AUTO_BAUD_REG(Ex: 60 平
台A0080030)获取当前的波特率,如果需要获取auto baud情况下的波特率,需要通过获取auto
成功后的DLL/DLM , HIGHSPEED, RATEFIX_AD寄存器的值来反推目前的波特率。根据此需求
,目前增加一个API专门来实现此需求:

半导体
注:1、 MT6261平台可以通过读取AUTO_BAUD_REG register来获取autobaudrate情况下的
波特率值;
2、 UART_GetAutoBaudrate uart.c
3、 该函数只能获取300~115200及其之间的标准波特率。
kal_uint32 UART_GetAutoBaudrate(kal_uint16 port)
{
kal_uint16 DLM_DLL = 0,highspeed = 0;
kal_uint16 LCR, tmp_div = 0 ;
kal_uint32 UART_BASE, uart_clock = 0;
UART_baudrate baudrate;
UART_BASE = UART_BaseAddr[port];
LCR = DRV_UART_Reg(UART_LCR(UART_BaseAddr[port]));
LCR |= UART_LCR_DLAB;
DRV_UART_WriteReg(UART_LCR(UART_BaseAddr[port]), LCR);
DLM_DLL = DRV_UART_Reg(UART_DLH(UART_BaseAddr[port])) << 8;
DLM_DLL |= DRV_UART_Reg(UART_DLL(UART_BaseAddr[port]));
highspeed = DRV_UART_Reg(UART_RATE_STEP(UART_BaseAddr[port]));
if((highspeed&0x0003) == 0)
tmp_div = 16;
else if((highspeed&0x0003) == 1)
tmp_div = 8;
else if((highspeed&0x0003) == 2)
tmp_div = 4;
else if((highspeed&0x0003) == 3)
{
tmp_div = DRV_UART_Reg(UART_STEP_COUNT(UART_BaseAddr[port]))+1;
tmp_div +=1;
}
LCR &= ~UART_LCR_DLAB;
DRV_UART_WriteReg(UART_LCR(UART_BaseAddr[port]), LCR);
uart_clock = UART_DCM_CLOCK;
baudrate = (uart_clock/tmp_div)/DLM_DLL;
if(baudrate < 19200)
{
baudrate /= 100;
baudrate *= 100;
}
else

icfans
{
baudrate /= 10000;
if(baudrate == 1)
baudrate = 19200;
else if(baudrate == 3)
baudrate = 38400;
else if(baudrate == 5)
baudrate = 57600;
else if(baudrate == 11)
baudrate = 115200;
else
baudrate = 0;
}
return baudrate;
}