dm.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-04-20 ErikChan the first version
  9. */
  10. #include <rtthread.h>
  11. #include <drivers/core/dm.h>
  12. #ifdef RT_USING_SMP
  13. static int rti_secondary_cpu_start(void)
  14. {
  15. return 0;
  16. }
  17. INIT_EXPORT(rti_secondary_cpu_start, "6.end");
  18. static int rti_secondary_cpu_end(void)
  19. {
  20. return 0;
  21. }
  22. INIT_EXPORT(rti_secondary_cpu_end, "7.end");
  23. void rt_dm_secondary_cpu_init(void)
  24. {
  25. #ifdef RT_DEBUGING_AUTO_INIT
  26. int result;
  27. const struct rt_init_desc *desc;
  28. rt_kprintf("do secondary cpu initialization.\n");
  29. for (desc = &__rt_init_desc_rti_secondary_cpu_start; desc < &__rt_init_desc_rti_secondary_cpu_end; ++desc)
  30. {
  31. rt_kprintf("initialize %s", desc->fn_name);
  32. result = desc->fn();
  33. rt_kprintf(":%d done\n", result);
  34. }
  35. #else
  36. volatile const init_fn_t *fn_ptr;
  37. for (fn_ptr = &__rt_init_rti_secondary_cpu_start; fn_ptr < &__rt_init_rti_secondary_cpu_end; ++fn_ptr)
  38. {
  39. (*fn_ptr)();
  40. }
  41. #endif /* RT_DEBUGING_AUTO_INIT */
  42. }
  43. #endif /* RT_USING_SMP */
  44. struct prefix_track
  45. {
  46. rt_list_t list;
  47. int uid;
  48. const char *prefix;
  49. };
  50. static struct rt_spinlock _prefix_nodes_lock;
  51. static rt_list_t _prefix_nodes = RT_LIST_OBJECT_INIT(_prefix_nodes);
  52. int rt_dm_set_dev_name_auto(rt_device_t dev, const char *prefix)
  53. {
  54. int uid = -1;
  55. struct prefix_track *pt = RT_NULL;
  56. RT_ASSERT(dev != RT_NULL);
  57. RT_ASSERT(prefix != RT_NULL);
  58. RT_DEBUG_NOT_IN_INTERRUPT;
  59. rt_spin_lock(&_prefix_nodes_lock);
  60. rt_list_for_each_entry(pt, &_prefix_nodes, list)
  61. {
  62. /* caller always input constants string, check ptr is faster */
  63. if (pt->prefix == prefix || !rt_strcmp(pt->prefix, prefix))
  64. {
  65. uid = ++pt->uid;
  66. break;
  67. }
  68. }
  69. rt_spin_unlock(&_prefix_nodes_lock);
  70. if (uid < 0)
  71. {
  72. pt = rt_malloc(sizeof(*pt));
  73. if (!pt)
  74. {
  75. return -RT_ENOMEM;
  76. }
  77. rt_list_init(&pt->list);
  78. pt->uid = uid = 0;
  79. pt->prefix = prefix;
  80. rt_spin_lock(&_prefix_nodes_lock);
  81. rt_list_insert_before(&_prefix_nodes, &pt->list);
  82. rt_spin_unlock(&_prefix_nodes_lock);
  83. }
  84. return rt_dm_set_dev_name(dev, "%s%u", prefix, uid);
  85. }
  86. int rt_dm_get_dev_name_id(rt_device_t dev)
  87. {
  88. int id = 0, len;
  89. const char *name;
  90. RT_ASSERT(dev != RT_NULL);
  91. name = rt_dm_get_dev_name(dev);
  92. len = rt_strlen(name) - 1;
  93. name += len;
  94. while (len --> 0)
  95. {
  96. if (*name < '0' || *name > '9')
  97. {
  98. while (*(++name))
  99. {
  100. id *= 10;
  101. id += *name - '0';
  102. }
  103. break;
  104. }
  105. --name;
  106. }
  107. return id;
  108. }
  109. int rt_dm_set_dev_name(rt_device_t dev, const char *format, ...)
  110. {
  111. int n;
  112. va_list arg_ptr;
  113. RT_ASSERT(dev != RT_NULL);
  114. RT_ASSERT(format != RT_NULL);
  115. va_start(arg_ptr, format);
  116. n = rt_vsnprintf(dev->parent.name, RT_NAME_MAX, format, arg_ptr);
  117. va_end(arg_ptr);
  118. return n;
  119. }
  120. const char *rt_dm_get_dev_name(rt_device_t dev)
  121. {
  122. RT_ASSERT(dev != RT_NULL);
  123. return dev->parent.name;
  124. }