WhyCan Forum

人过留名,雁过留声,感谢各位朋友不离不弃地支持。 QQ: 516333132 (挖坑网/填坑网) admin@whycan.cn

您尚未登录。

#1 2019-10-04 16:45:35

augyy
会员
注册时间: 2019-01-29
累计积分: 17

全志A33 UART baudrate 921600 問題!!

現在我把A33 UART2 波特率設定為921600, 但是出來波特率是761904.

pro.png

同時我找到sunxi-uart.c file 裡要改apb2div. 請問那裡設定?

buadrate.png

离线

#2 2019-10-04 16:58:24

F1F2
会员
注册时间: 2017-09-11
累计积分: 99

Re: 全志A33 UART baudrate 921600 問題!!

你如何确定是 761904 ?

离线

#3 2019-10-04 17:16:26

augyy
会员
注册时间: 2019-01-29
累计积分: 17

Re: 全志A33 UART baudrate 921600 問題!!

用logic analyzer 望 output data. 所以知道波特率大約761904.
同時試過把設波特率定為 1500000, 是無問題!!

离线

#4 2019-10-04 21:05:52

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,862

Re: 全志A33 UART baudrate 921600 問題!!

没有用过A33 bsp, 感觉这个地方不应该会出现bug,改天我在 V3s 上面试一试 921600

离线

#5 2019-10-08 17:48:17

阿黄
会员
注册时间: 2018-10-03
累计积分: 97

Re: 全志A33 UART baudrate 921600 問題!!

会不会是逻辑分析仪的最大频率不够?

离线

#6 2019-10-09 16:05:29

augyy
会员
注册时间: 2019-01-29
累计积分: 17

Re: 全志A33 UART baudrate 921600 問題!!

阿黄 说:

会不会是逻辑分析仪的最大频率不够?

逻辑分析仪频率應該足夠,因為可看到1500000频率

离线

#7 2019-10-09 23:53:01

checkout
会员
注册时间: 2018-11-09
累计积分: 78

Re: 全志A33 UART baudrate 921600 問題!!

apb2时钟默认是OSC24M,时钟源应该使用PLL6,修改uboot时钟初始化的代码就行
24000000/16/921600=1.6276,向上取整,实际波特率24000000/16/2=750000,应该是这样

augyy 说:
阿黄 说:

会不会是逻辑分析仪的最大频率不够?

逻辑分析仪频率應該足夠,因為可看到1500000频率

最近编辑记录 checkout (2019-10-10 00:00:51)

离线

#8 2019-10-10 15:43:26

augyy
会员
注册时间: 2019-01-29
累计积分: 17

Re: 全志A33 UART baudrate 921600 問題!!

checkout 说:

apb2时钟默认是OSC24M,时钟源应该使用PLL6,修改uboot时钟初始化的代码就行
24000000/16/921600=1.6276,向上取整,实际波特率24000000/16/2=750000,应该是这样

augyy 说:
阿黄 说:

会不会是逻辑分析仪的最大频率不够?

逻辑分析仪频率應該足夠,因為可看到1500000频率

https://whycan.cn/files/members/1429/CONFIG_SYS_NS16550_CLK.png

是否直接把CONFIG_SYS_NS16550_CLK 為 (30000000) ?

离线

#9 2019-10-10 15:53:47

checkout
会员
注册时间: 2018-11-09
累计积分: 78

Re: 全志A33 UART baudrate 921600 問題!!

修改uboot的clock_sun6i.c文件:

void clock_init_uart(void)
{
#if CONFIG_CONS_INDEX < 5
        struct sunxi_ccm_reg *const ccm =
                (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;

        /* uart clock source is apb2 */
        writel(APB2_CLK_SRC_OSC24M|      //这里改为APB2_CLK_SRC_PLL6,从内部pll6时钟分频
            APB2_CLK_RATE_N_1|
            APB2_CLK_RATE_M(1),
            &ccm->apb2_div);

离线

#10 2019-10-10 17:01:32

augyy
会员
注册时间: 2019-01-29
累计积分: 17

Re: 全志A33 UART baudrate 921600 問題!!

只找到board.c 同 serial_tegra2.c 文件

FluxBB bbcode

FluxBB bbcode

是否改setup_uart(..) function
reg = NVRM_PLLP_FIXED_FREQ_KHZ * 1000 / NV_DEFAULT_DEBUF_BAUD / 16 的
16 為 20 or 其他?

最近编辑记录 augyy (2019-10-10 17:12:43)

离线

#11 2019-10-10 17:20:53

checkout
会员
注册时间: 2018-11-09
累计积分: 78

Re: 全志A33 UART baudrate 921600 問題!!

你uboot用的哪个版本?看看时钟初始化部分,改改试试

离线

#12 2019-10-17 17:18:05

augyy
会员
注册时间: 2019-01-29
累计积分: 17

Re: 全志A33 UART baudrate 921600 問題!!

我用u-boot-2011.09 版本的. 同sun8iw5p1.h

最近编辑记录 augyy (2019-10-17 17:18:49)

离线

#13 2019-10-17 21:34:46

checkout
会员
注册时间: 2018-11-09
累计积分: 78

Re: 全志A33 UART baudrate 921600 問題!!

胸弟,你看!!摊手.jpg
APB2默认时钟源是24MHz.你要改成PLL_PERIPH
clock_tree.png
clock_20191017-2115.png
u-boot-2011.09/arch/arm/cpu/armv7/sun8iw5/clock.c中,函数sunxi_clock_set_corepll(xxx)进行了时钟初始化...
在这里修改:

int sunxi_clock_set_corepll(int frequency, int core_vol)
{
    unsigned int reg_val;
    unsigned int i;
    struct core_pll_freq_tbl  pll_factor;
    //检查时钟是否合法,为0或者超过2G
    if(!frequency)
    {
        //默认频率
        frequency = 408;
    }
    else if(frequency < 24)
    {
		frequency = 24;
    }
    //切换到24M
    reg_val = readl(CCM_CPU_L2_AXI_CTRL);
    reg_val &= ~(0x03 << 16);
    reg_val |=  (0x01 << 16);
    writel(reg_val, CCM_CPU_L2_AXI_CTRL);
    //延时,等待时钟稳定
    for(i=0; i<0x400; i++);
    //调整时钟频率
	clk_get_pll_para(&pll_factor, frequency);
	//回写PLL1
    reg_val = readl(CCM_PLL1_CPUX_CTRL);
    reg_val &= ~((0x03 << 16) | (0x1f << 8) | (0x03 << 4) | (0x03 << 0));
	reg_val |=  (pll_factor.FactorP << 16) | (pll_factor.FactorN<<8) | (pll_factor.FactorK<<4) | (0 << 0) ;
    writel(reg_val, CCM_PLL1_CPUX_CTRL);
    //延时,等待时钟稳定
#ifndef CONFIG_A67_FPGA
	do
	{
		reg_val = readl(CCM_PLL1_CPUX_CTRL);
	}
	while(!(reg_val & (0x1 << 28)));
#endif
    //修改AXI,AHB,APB分频
    clk_set_divd();
    //切换时钟到COREPLL上
    reg_val = readl(CCM_CPU_L2_AXI_CTRL);
    reg_val &= ~(0x03 << 16);
    reg_val |=  (0x02 << 16);
    writel(reg_val, CCM_CPU_L2_AXI_CTRL);
    
    //修改apb2时钟源,自己添加。。
    return  0;
}

下面这个顺便也要改一下,改成600

/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
int sunxi_clock_get_apb2(void)
{
        //return 24;
	return 600;//改成600
}

最近编辑记录 checkout (2019-10-17 21:35:23)

离线

页脚