signal_gen_scene_mco.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "../signal_gen_app_i.h"
  2. typedef enum {
  3. LineIndexPin,
  4. LineIndexSource,
  5. LineIndexDivision,
  6. } LineIndex;
  7. static const char* const mco_pin_names[] = {
  8. "13(Tx)",
  9. };
  10. static const char* const mco_source_names[] = {
  11. "32768Hz",
  12. "64MHz",
  13. "~100K",
  14. "~200K",
  15. "~400K",
  16. "~800K",
  17. "~1MHz",
  18. "~2MHz",
  19. "~4MHz",
  20. "~8MHz",
  21. "~16MHz",
  22. "~24MHz",
  23. "~32MHz",
  24. "~48MHz",
  25. };
  26. static const FuriHalClockMcoSourceId mco_sources[] = {
  27. FuriHalClockMcoLse,
  28. FuriHalClockMcoSysclk,
  29. FuriHalClockMcoMsi100k,
  30. FuriHalClockMcoMsi200k,
  31. FuriHalClockMcoMsi400k,
  32. FuriHalClockMcoMsi800k,
  33. FuriHalClockMcoMsi1m,
  34. FuriHalClockMcoMsi2m,
  35. FuriHalClockMcoMsi4m,
  36. FuriHalClockMcoMsi8m,
  37. FuriHalClockMcoMsi16m,
  38. FuriHalClockMcoMsi24m,
  39. FuriHalClockMcoMsi32m,
  40. FuriHalClockMcoMsi48m,
  41. };
  42. static const char* const mco_divisor_names[] = {
  43. "1",
  44. "2",
  45. "4",
  46. "8",
  47. "16",
  48. };
  49. static const FuriHalClockMcoDivisorId mco_divisors[] = {
  50. FuriHalClockMcoDiv1,
  51. FuriHalClockMcoDiv2,
  52. FuriHalClockMcoDiv4,
  53. FuriHalClockMcoDiv8,
  54. FuriHalClockMcoDiv16,
  55. };
  56. static void mco_source_list_change_callback(VariableItem* item) {
  57. SignalGenApp* app = variable_item_get_context(item);
  58. uint8_t index = variable_item_get_current_value_index(item);
  59. variable_item_set_current_value_text(item, mco_source_names[index]);
  60. app->mco_src = mco_sources[index];
  61. view_dispatcher_send_custom_event(app->view_dispatcher, SignalGenMcoEventUpdate);
  62. }
  63. static void mco_divisor_list_change_callback(VariableItem* item) {
  64. SignalGenApp* app = variable_item_get_context(item);
  65. uint8_t index = variable_item_get_current_value_index(item);
  66. variable_item_set_current_value_text(item, mco_divisor_names[index]);
  67. app->mco_div = mco_divisors[index];
  68. view_dispatcher_send_custom_event(app->view_dispatcher, SignalGenMcoEventUpdate);
  69. }
  70. void signal_gen_scene_mco_on_enter(void* context) {
  71. SignalGenApp* app = context;
  72. VariableItemList* var_item_list = app->var_item_list;
  73. VariableItem* item;
  74. item = variable_item_list_add(var_item_list, "GPIO Pin", COUNT_OF(mco_pin_names), NULL, NULL);
  75. variable_item_set_current_value_index(item, 0);
  76. variable_item_set_current_value_text(item, mco_pin_names[0]);
  77. item = variable_item_list_add(
  78. var_item_list,
  79. "Frequency",
  80. COUNT_OF(mco_source_names),
  81. mco_source_list_change_callback,
  82. app);
  83. variable_item_set_current_value_index(item, 0);
  84. variable_item_set_current_value_text(item, mco_source_names[0]);
  85. item = variable_item_list_add(
  86. var_item_list,
  87. "Freq. divider",
  88. COUNT_OF(mco_divisor_names),
  89. mco_divisor_list_change_callback,
  90. app);
  91. variable_item_set_current_value_index(item, 0);
  92. variable_item_set_current_value_text(item, mco_divisor_names[0]);
  93. variable_item_list_set_selected_item(var_item_list, LineIndexSource);
  94. view_dispatcher_switch_to_view(app->view_dispatcher, SignalGenViewVarItemList);
  95. app->mco_src = FuriHalClockMcoLse;
  96. app->mco_div = FuriHalClockMcoDiv1;
  97. furi_hal_clock_mco_enable(app->mco_src, app->mco_div);
  98. furi_hal_gpio_init_ex(
  99. &gpio_usart_tx, GpioModeAltFunctionPushPull, GpioPullUp, GpioSpeedVeryHigh, GpioAltFn0MCO);
  100. }
  101. bool signal_gen_scene_mco_on_event(void* context, SceneManagerEvent event) {
  102. SignalGenApp* app = context;
  103. bool consumed = false;
  104. if(event.type == SceneManagerEventTypeCustom) {
  105. if(event.event == SignalGenMcoEventUpdate) {
  106. consumed = true;
  107. furi_hal_clock_mco_enable(app->mco_src, app->mco_div);
  108. }
  109. }
  110. return consumed;
  111. }
  112. void signal_gen_scene_mco_on_exit(void* context) {
  113. SignalGenApp* app = context;
  114. variable_item_list_reset(app->var_item_list);
  115. furi_hal_gpio_init_ex(
  116. &gpio_usart_tx,
  117. GpioModeAltFunctionPushPull,
  118. GpioPullUp,
  119. GpioSpeedVeryHigh,
  120. GpioAltFn7USART1);
  121. furi_hal_clock_mco_disable();
  122. }