Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

jz4760: Use HW timer for more a more accurate udelay()

(More specifically, use the SoC's "OS Timer", slaved to the main XTAL so
it doesn't matter how the main CPU is clocked)

Change-Id: I799561ac823ff7f659a05144cf03b6a13d57ea7b

+29
+29
firmware/target/mips/ingenic_jz47xx/system-jz4760.c
··· 28 28 #include "kernel.h" 29 29 #include "power.h" 30 30 31 + #define USE_HW_UDELAY 32 + 31 33 static int irq; 32 34 static void UIRQ(void) 33 35 { ··· 335 337 panicf("TLB refill handler at 0x%08lx! [0x%x]", read_c0_epc(), read_c0_badvaddr()); 336 338 } 337 339 340 + #ifdef USE_HW_UDELAY 341 + /* This enables the HW timer, set to EXT_XTAL / 16 (so @ 12MHz, 1 us = 750 ticks) */ 342 + static void init_delaytimer(void) 343 + { 344 + __tcu_disable_ost(); 345 + REG_OST_OSTCSR = OSTCSR_EXT_EN | OSTCSR_PRESCALE16 | OSTCSR_CNT_MD; 346 + REG_OST_OSTCNT = 0; 347 + REG_OST_OSTDR = 0; 348 + __tcu_enable_ost(); 349 + } 350 + 351 + void udelay(unsigned int usec) 352 + { 353 + if (!__tcu_ost_enabled()) 354 + init_delaytimer(); 355 + 356 + /* Figure out how many ticks we need */ 357 + usec = (CFG_EXTAL / 16 / 1000) * (usec + 1); 358 + 359 + while (usec < REG_OST_OSTCNT) { } 360 + } 361 + #else 338 362 void udelay(unsigned int usec) 339 363 { 340 364 unsigned int i = usec * (__cpm_get_cclk() / 2000000); ··· 348 372 : "0" (i) 349 373 ); 350 374 } 375 + #endif 351 376 352 377 void mdelay(unsigned int msec) 353 378 { ··· 656 681 /* Disable all interrupts */ 657 682 for(i=0; i<IRQ_INTC_MAX; i++) 658 683 dis_irq(i); 684 + 685 + #ifdef USE_HW_UDELAY 686 + init_delaytimer(); 687 + #endif 659 688 660 689 mmu_init(); 661 690