board.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2012-11-20 Bernard the first version
  9. * 2018-11-22 Jesven add rt_hw_spin_lock
  10. * add rt_hw_spin_unlock
  11. * add smp ipi init
  12. */
  13. #include <rthw.h>
  14. #include <rtthread.h>
  15. #include "board.h"
  16. #include "drv_timer.h"
  17. #define SYS_CTRL __REG32(REALVIEW_SCTL_BASE)
  18. void idle_wfi(void)
  19. {
  20. asm volatile ("wfi");
  21. }
  22. /**
  23. * This function will initialize beaglebone board
  24. */
  25. void rt_hw_board_init(void)
  26. {
  27. /* initialize hardware interrupt */
  28. rt_hw_interrupt_init();
  29. /* initialize system heap */
  30. rt_system_heap_init(HEAP_BEGIN, HEAP_END);
  31. rt_components_board_init();
  32. rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
  33. rt_thread_idle_sethook(idle_wfi);
  34. #ifdef RT_USING_SMP
  35. /* install IPI interrupt */
  36. rt_hw_interrupt_install(RT_SCHEDULE_IPI_IRQ, rt_scheduler_ipi_handler, RT_NULL, "ipi");
  37. rt_hw_interrupt_umask(RT_SCHEDULE_IPI_IRQ);
  38. #endif
  39. }
  40. #ifdef RT_USING_SMP
  41. void rt_hw_spin_lock(rt_hw_spinlock_t *lock)
  42. {
  43. unsigned long tmp;
  44. unsigned long newval;
  45. rt_hw_spinlock_t lockval;
  46. __asm__ __volatile__(
  47. "pld [%0]"
  48. ::"r"(&lock->slock)
  49. );
  50. __asm__ __volatile__(
  51. "1: ldrex %0, [%3]\n"
  52. " add %1, %0, %4\n"
  53. " strex %2, %1, [%3]\n"
  54. " teq %2, #0\n"
  55. " bne 1b"
  56. : "=&r" (lockval), "=&r" (newval), "=&r" (tmp)
  57. : "r" (&lock->slock), "I" (1 << 16)
  58. : "cc");
  59. while (lockval.tickets.next != lockval.tickets.owner) {
  60. __asm__ __volatile__("wfe":::"memory");
  61. lockval.tickets.owner = *(volatile unsigned short *)(&lock->tickets.owner);
  62. }
  63. __asm__ volatile ("dmb":::"memory");
  64. }
  65. void rt_hw_spin_unlock(rt_hw_spinlock_t *lock)
  66. {
  67. __asm__ volatile ("dmb":::"memory");
  68. lock->tickets.owner++;
  69. __asm__ volatile ("dsb ishst\nsev":::"memory");
  70. }
  71. #endif /*RT_USING_SMP*/