Bläddra i källkod

fixed tick inaccuracy

bigmagic 5 år sedan
förälder
incheckning
d5414a50b9
2 ändrade filer med 21 tillägg och 5 borttagningar
  1. 10 5
      bsp/raspberry-pi/raspi4-32/driver/board.c
  2. 11 0
      bsp/raspberry-pi/raspi4-32/driver/mbox.h

+ 10 - 5
bsp/raspberry-pi/raspi4-32/driver/board.c

@@ -73,21 +73,26 @@ void rt_hw_timer_isr(int vector, void *parameter)
 
 void rt_hw_timer_init(void)
 {
-    rt_hw_interrupt_install(ARM_TIMER_IRQ, rt_hw_timer_isr, RT_NULL, "tick");
-    rt_hw_interrupt_umask(ARM_TIMER_IRQ);
+    rt_uint32_t apb_clock = 0;
+    rt_uint32_t timer_clock = 1000000;
     /* timer_clock = apb_clock/(pre_divider + 1) */
-    ARM_TIMER_PREDIV = (250 - 1);
+    apb_clock = bcm271x_mbox_clock_get_rate(CORE_CLK_ID);
+    ARM_TIMER_PREDIV = (apb_clock/timer_clock - 1);
 
     ARM_TIMER_RELOAD = 0;
     ARM_TIMER_LOAD   = 0;
     ARM_TIMER_IRQCLR = 0;
     ARM_TIMER_CTRL   = 0;
 
-    ARM_TIMER_RELOAD = 10000;
-    ARM_TIMER_LOAD   = 10000;
+    ARM_TIMER_RELOAD = 1000000/RT_TICK_PER_SECOND;
+    ARM_TIMER_LOAD   = 1000000/RT_TICK_PER_SECOND;
 
     /* 23-bit counter, enable interrupt, enable timer */
     ARM_TIMER_CTRL   = (1 << 1) | (1 << 5) | (1 << 7);
+
+    rt_hw_interrupt_install(ARM_TIMER_IRQ, rt_hw_timer_isr, RT_NULL, "tick");
+    rt_hw_interrupt_umask(ARM_TIMER_IRQ);
+
 }
 
 void idle_wfi(void)

+ 11 - 0
bsp/raspberry-pi/raspi4-32/driver/mbox.h

@@ -136,6 +136,17 @@ enum {
 #define MBOX_ADDR 0x08000000
 extern uint32_t mbox_addr;
 
+#define    RES_CLK_ID           (0x000000000)
+#define    EMMC_CLK_ID          (0x000000001)
+#define    UART_CLK_ID          (0x000000002)
+#define    ARM_CLK_ID           (0x000000003)
+#define    CORE_CLK_ID          (0x000000004)
+#define    V3D_CLK_ID           (0x000000005)
+#define    H264_CLK_ID          (0x000000006)
+#define    ISP_CLK_ID           (0x000000007)
+#define    SDRAM_CLK_ID         (0x000000008)
+#define    PIXEL_CLK_ID         (0x000000009)
+#define    PWM_CLK_ID           (0x00000000a)
 
 int mbox_call(unsigned char ch, int mmu_enable);
 int bcm271x_notify_reboot(void);