On 8/3/20 2:20 PM, Heinrich Schuchardt wrote:
> On 03.08.20 16:08, Sean Anderson wrote:
>> Maybe. Because we are configuring the PLL, the CPU clock is temporarily
>> set to the in0 oscillator, so the timer would give an incorrect delay.
>> However, it would probably be fine even if incorrect.  The original
>> reason I used nops is because that is what the SDK does in its PLL
>> configuration function [1]. I believe I tried using udelay at one point,
>> but I don't remember whether I had any issues with it.
>>
>> --Sean
>>
>> [1] 
>> https://github.com/kendryte/kendryte-standalone-sdk/blob/develop/lib/drivers/sysctl.c#L844
>>
> 
> This is what udelay(1) gets compiled to:
> 
> 000000000000004a <.LBE106>:
>         udelay(1);
>   4a:   4505                    li      a0,1
> 
> 000000000000004c <.LVL21>:
>   4c:   00000097                auipc   ra,0x0
>   50:   000080e7                jalr    ra # 4c <.LVL21>
> 
> Somehow udelay() seems not to be fully implemented and the platform. So
> I think we should stay with the nop() macro.

Hm, I don't see this generated code. What function is that a disassembly
of?

$ riscv64-linux-gnu-objdump -S --disassemble=__udelay u-boot

u-boot:     file format elf64-littleriscv


Disassembly of section .text:

Disassembly of section .text_rest:

00000000800197f8 <__udelay>:
        do_div(tick, 1000000);
        return tick;
}

void __weak __udelay(unsigned long usec)
{
    800197f8:   1101                    addi    sp,sp,-32
    800197fa:   ec06                    sd      ra,24(sp)
    800197fc:   e822                    sd      s0,16(sp)
    800197fe:   e426                    sd      s1,8(sp)
    80019800:   84aa                    mv      s1,a0
        uint64_t tmp;

        tmp = get_ticks() + usec_to_tick(usec); /* get current timestamp */
    80019802:   f7bff0ef                jal     ra,8001977c <get_ticks>
    80019806:   842a                    mv      s0,a0
    80019808:   8526                    mv      a0,s1
    8001980a:   fcbff0ef                jal     ra,800197d4 <usec_to_tick>
    8001980e:   942a                    add     s0,s0,a0

        while (get_ticks() < tmp+1)     /* loop till event */
    80019810:   0405                    addi    s0,s0,1
    80019812:   f6bff0ef                jal     ra,8001977c <get_ticks>
    80019816:   fe856ee3                bltu    a0,s0,80019812 <__udelay+0x1a>
                 /*NOP*/;
}
    8001981a:   60e2                    ld      ra,24(sp)
    8001981c:   6442                    ld      s0,16(sp)
    8001981e:   64a2                    ld      s1,8(sp)
    80019820:   6105                    addi    sp,sp,32
    80019822:   8082                    ret

--Sean

Reply via email to