hv_mw_SystemManager.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861
  1. /**
  2. * @file hv_mw_SystemManager.c
  3. * @brief SystemManager source file
  4. * @details This file provides the following functions: \n
  5. * (1) event dispatch \n
  6. * (2) system task handle \n
  7. * (3) Feed functions \n
  8. *
  9. * @author HiView SoC Software Team
  10. * @version 1.0.0
  11. * @date 2022-08-25
  12. * @copyright Copyright(c),2022-8, Hiview Software. All rights reserved.
  13. * @par History:
  14. * <table>
  15. * <tr><th>Author <th>Date <th>Change Description
  16. * <tr><td>Hiview SoC Software Team <td>2022-08-25 <td>init
  17. * </table>
  18. */
  19. #include "hv_comm_DataType.h"
  20. #include "hv_comm_Define.h"
  21. #include "hv_comm_Log.h"
  22. #include "hv_comm_shell_hvconfig.h"
  23. #include "hv_comm_Timer.h"
  24. #include "hv_comm_Assert.h"
  25. #include "hv_comm_DataBase.h"
  26. #include "hv_comm_MemParser.h"
  27. #include "hv_mw_SystemManager.h"
  28. #include "hv_mw_Video.h"
  29. #include "hv_mw_Audio.h"
  30. #include "hv_mw_StateMachine.h"
  31. #include "hv_mw_EventHub.h"
  32. #include "hv_mw_OsdInit.h"
  33. #include "hv_mw_OsdTask.h"
  34. #include "hv_mw_UrgentTask.h"
  35. #ifdef CONFIG_USER_AMBLIGHT_ON
  36. #include "hv_mw_AmbientLight.h"
  37. #endif
  38. #include "hv_mw_PowerManager.h"
  39. #include "hv_mw_PanelManager.h"
  40. #include "hv_mw_Channel_Manager.h"
  41. #include "hv_mw_InputPortManager.h"
  42. #include "hv_mw_Hdmi.h"
  43. #include "hv_mw_Hdcp.h"
  44. #include "hv_mw_DisplayPort.h"
  45. #include "hv_mw_Ddcci.h"
  46. #include "hv_mw_Factory.h"
  47. #if (defined(CONFIG_USER_USB_OTA_ON) || defined(CONFIG_USER_USB_BILLBOARD_ON))
  48. #include "hv_mw_UsbTask.h"
  49. #endif
  50. #ifdef CONFIG_USER_TYPE_C_ON
  51. #include "hv_mw_TypecTask.h"
  52. #endif
  53. #include "hv_mw_PQ.h"
  54. #include "hv_drv_Mailbox.h"
  55. #include "hv_drv_PLL.h"
  56. #include "hv_drv_Uart.h"
  57. #include "hv_drv_Flash.h"
  58. #include "hv_drv_Watchdog.h"
  59. #include "hv_drv_Pinshare.h"
  60. #include "hv_drv_Physical.h"
  61. #include "hv_drv_Flash.h"
  62. #include "hv_drv_Gpio.h"
  63. #include "hv_drv_Mprt.h"
  64. #include "hv_drv_DpuMainMute.h"
  65. #ifdef CONFIG_USER_DOUBLE_CHANNEL_ON
  66. #include "hv_drv_DpuSubMute.h"
  67. #endif
  68. #if (HV_CONFIG_ON == HV_PROJECT_CONFIG_PLATFORM)
  69. #include "HvPlatform.h"
  70. #endif
  71. #include "hv_app_PQ.h"
  72. #include "hv_app_Ddcci.h"
  73. #include "hv_chip_Config.h"
  74. /*QueueLength 指Message Queue最大存储多少item定义*/
  75. #define SYSTEM_QUEUE_LENGTH 100
  76. #define OSD_QUEUE_LENGTH 100
  77. #define EVENT_HUB_QUEUE_LENGTH 50
  78. #define URGENT_QUEUE_LENGTH 50
  79. #ifdef CONFIG_USER_TYPE_C_ON
  80. #define TYPEC_QUEUE_LENGTH 100
  81. #endif
  82. #ifdef CONFIG_USER_USB_OTA_ON
  83. #define USB_QUEUE_LENGTH 10
  84. #endif
  85. /*任务栈控件大小定义,单位4字节!*/
  86. #define SYSTEM_TASK_STACK_SIZE 2048 /*8K*/
  87. #define OSD_TASK_STACK_SIZE 2048 /*8K*/
  88. #define USB_TASK_STACK_SIZE 2048 /*8K*/
  89. #define TYPEC_TASK_STACK_SIZE 2048 /*8K*/
  90. #define EVENTHUB_TASK_STACK_SIZE 512 /*2K*/
  91. #define AMBIENTLIGHT_TASK_STACK_SIZE 512 /*2K*/
  92. #define URGENT_TASK_STACK_SIZE 512 /*2K*/
  93. /*任务优先级定义,FreeRTOS数值越大代表优先级别越高*/
  94. #define SYSTEM_TASK_PRIORITY 4
  95. #define OSD_TASK_PRIORITY 4
  96. #define EVENTHUB_TASK_PRIORITY 4
  97. #define USB_TASK_PRIORITY 2
  98. #define TYPEC_TASK_PRIORITY 4
  99. #define AMBIENTLIGHT_TASK_PRIORITY 2
  100. #define URGENT_TASK_PRIORITY 6
  101. #ifdef HV_SCALER_DEBUG_VERSION
  102. #define TEST_CLIENT_TASK_STACK_SIZE 512 /*2K*/
  103. #define TEST_CLIENT_TASK_PRIORITY 2
  104. #endif
  105. /*#define configTIMER_TASK_PRIORITY 5*/
  106. #define HV_HDMI0_RX_HPD_INT BIT_0
  107. #define HV_HDMI1_RX_HPD_INT BIT_1
  108. #define PQTOOL_SWINT_TRIGGER_VAL BIT_3
  109. static SystemManager s_stSystemManager;
  110. /****************************inner function begin*************************************************/
  111. static VOID EventDispatch(const SystemEvent* pstSystemEvent);
  112. static VOID SetDbgSPIDefaultType(UCHAR8 type);
  113. /****************************inner function begin*************************************************/
  114. Status Hv_Mw_System_Init( VOID )
  115. {
  116. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_System_Init begin!!!");
  117. HV_VOS_IRQ_T u64Mask = 0;
  118. Hv_Vos_DisableIrq(&u64Mask);
  119. HV_ASSERT_SUCCESS(Hv_Drv_Phy_Init());
  120. Hv_Drv_PLL_Init();
  121. Hv_Drv_Pinshare_Init();
  122. Hv_Drv_Flash_ConfigPartFlag();
  123. Hv_Drv_Sscg_Init();
  124. Hv_Drv_Eeprom_Init();
  125. //Hv_Comm_CopyLogoData();
  126. HV_ASSERT_SUCCESS(Hv_Common_Db_Init());
  127. /* check the default uart switch */
  128. if (HV_FALSE == HV_COMMON_DATABASE_GET(FactoryData, bUartEnable))
  129. {
  130. Hv_Drv_EnableUart(HV_FALSE);
  131. }
  132. /* set dbgspi default type AHB, not AXI */
  133. SetDbgSPIDefaultType(1);
  134. #ifdef HV_SCALER_DEBUG_VERSION
  135. HV_SHELL_INIT();
  136. #endif
  137. HV_ASSERT_SUCCESS(Hv_Mw_Panel_Init());
  138. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_Panel_Init success!!!");
  139. HV_ASSERT_SUCCESS(Hv_Mw_Power_ManagerInit());
  140. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_Power_ManagerInit success!!!");
  141. HV_ASSERT_SUCCESS(Hv_Mw_InputPortManager_Init());
  142. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_InputPortManager_Init success!!!");
  143. HV_ASSERT_SUCCESS(Hv_Mw_Channel_Manager_Init());
  144. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_Channel_Manager_Init success!!!");
  145. HV_ASSERT_SUCCESS(Hv_App_PQ_DispCtrlInit());
  146. HV_LOG_DEBUG(SYSTEM, "Hv_App_PQ_DispCtrlInit success!!!");
  147. HV_ASSERT_SUCCESS(Hv_Mw_Audio_Init());
  148. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_Audio_Init success!!!");
  149. HV_ASSERT_SUCCESS(Hv_Mw_OsdInit());
  150. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_OsdInit success!!!");
  151. HV_ASSERT_SUCCESS(Hv_Mw_Ddcci_Init());
  152. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_Ddcci_Init success!!!");
  153. Hv_App_Ddcci_Init();
  154. #ifdef CONFIG_USER_AMBLIGHT_ON
  155. Hv_Mw_AmbientLightPwmInit();
  156. #endif
  157. Hv_Drv_Flash_SetQspiMode(HV_FLASH_CONFIG_TYPE, FLASH_STANDARD, FLASH_USE_POLLING);
  158. HV_LOG_DEBUG(SYSTEM, "Monitor System initial success!");
  159. return HV_SUCCESS;
  160. }
  161. VOID Hv_Mw_System_TaskCreate( VOID )
  162. {
  163. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_System_TaskCreate begin!!!");
  164. Hv_Vos_TASK_INIT_PARAMS param = {0};
  165. param.arg = NULL;
  166. param.entry = Hv_Mw_System_TaskHandle;
  167. param.name = "SystemManagerTask";
  168. param.priority = SYSTEM_TASK_PRIORITY;
  169. param.stackSize = SYSTEM_TASK_STACK_SIZE;
  170. Hv_Vos_TaskInit(&param);
  171. param.entry = Hv_Mw_EventHubTaskHandle;
  172. param.name = "EventHubTask";
  173. param.priority = EVENTHUB_TASK_PRIORITY;
  174. param.stackSize = EVENTHUB_TASK_STACK_SIZE;
  175. Hv_Vos_TaskInit(&param);
  176. param.entry = Hv_Mw_OsdTaskHandle;
  177. param.name = "OsdTask";
  178. param.priority = OSD_TASK_PRIORITY;
  179. param.stackSize = OSD_TASK_STACK_SIZE;
  180. Hv_Vos_TaskInit(&param);
  181. param.entry = Hv_Mw_Urgent_TaskHandle;
  182. param.name = "UrgentTask";
  183. param.priority = URGENT_TASK_PRIORITY;
  184. param.stackSize = URGENT_TASK_STACK_SIZE;
  185. s_stSystemManager.xUrgentTaskHandle = Hv_Vos_TaskInit(&param);
  186. #ifdef HV_SCALER_DEBUG_VERSION
  187. param.entry = Hv_Debug_ShellTaskHandle;
  188. param.name = "CLITask";
  189. param.priority = TEST_CLIENT_TASK_PRIORITY;
  190. param.stackSize = TEST_CLIENT_TASK_STACK_SIZE;
  191. s_stSystemManager.xShellTaskHandle = Hv_Vos_TaskInit(&param);
  192. #endif
  193. #ifdef CONFIG_USER_AMBLIGHT_ON
  194. param.entry = Hv_Mw_AmbientLightTaskHandle;
  195. param.name = "AmbientLightTask";
  196. param.priority = AMBIENTLIGHT_TASK_PRIORITY;
  197. param.stackSize = AMBIENTLIGHT_TASK_STACK_SIZE;
  198. s_stSystemManager.xAmbLightTaskHandle = Hv_Vos_TaskInit(&param);
  199. #endif
  200. #ifdef CONFIG_USER_TYPE_C_ON
  201. param.entry = Hv_Mw_TypecTaskHandle;
  202. param.name = "TypecTask";
  203. param.priority = TYPEC_TASK_PRIORITY;
  204. param.stackSize = TYPEC_TASK_STACK_SIZE;
  205. Hv_Vos_TaskInit(&param);
  206. #endif
  207. #if (defined(CONFIG_USER_USB_OTA_ON) || defined(CONFIG_USER_USB_BILLBOARD_ON))
  208. param.entry = Hv_Mw_UsbTaskHandle;
  209. param.name = "UsbTask";
  210. param.priority = USB_TASK_PRIORITY;
  211. param.stackSize = USB_TASK_STACK_SIZE;
  212. Hv_Vos_TaskInit(&param);
  213. #endif
  214. #if (HV_CONFIG_ON == HV_PROJECT_CONFIG_PLATFORM)
  215. Hv_User_AddPlatformTask();
  216. #endif
  217. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_System_TaskCreate end success!!!");
  218. return;
  219. }
  220. VOID Hv_Mw_System_AllMessageQueueCreate( VOID )
  221. {
  222. Hv_Vos_QUEUE_INIT_PARAMS stQueueInitParam = {0};
  223. stQueueInitParam.queueLen = OSD_QUEUE_LENGTH;
  224. stQueueInitParam.itemSize = sizeof(OsdEvent);
  225. HV_VOS_QUEUE_S* xOsdQueue = Hv_Vos_QueueInit(&stQueueInitParam);
  226. HV_ASSERT_VALID_PTR_VOID(xOsdQueue);
  227. s_stSystemManager.xOsdQueue = xOsdQueue;
  228. stQueueInitParam.queueLen = SYSTEM_QUEUE_LENGTH;
  229. stQueueInitParam.itemSize = sizeof(SystemEvent);
  230. HV_VOS_QUEUE_S* xSystemQueue = Hv_Vos_QueueInit(&stQueueInitParam);
  231. HV_ASSERT_VALID_PTR_VOID(xSystemQueue);
  232. s_stSystemManager.xSystemQueue = xSystemQueue;
  233. stQueueInitParam.queueLen = EVENT_HUB_QUEUE_LENGTH;
  234. stQueueInitParam.itemSize = sizeof(Event);
  235. HV_VOS_QUEUE_S* xEventHubQueue = Hv_Vos_QueueInit(&stQueueInitParam);
  236. HV_ASSERT_VALID_PTR_VOID(xEventHubQueue);
  237. s_stSystemManager.xEventHubQueue = xEventHubQueue;
  238. stQueueInitParam.queueLen = URGENT_QUEUE_LENGTH;
  239. stQueueInitParam.itemSize = sizeof(UrgentEvent);
  240. HV_VOS_QUEUE_S* xUrgentQueue = Hv_Vos_QueueInit(&stQueueInitParam);
  241. HV_ASSERT_VALID_PTR_VOID(xUrgentQueue);
  242. s_stSystemManager.xUrgentQueue = xUrgentQueue;
  243. #ifdef CONFIG_USER_TYPE_C_ON
  244. stQueueInitParam.queueLen = TYPEC_QUEUE_LENGTH;
  245. stQueueInitParam.itemSize = sizeof(TypecEvent);
  246. HV_VOS_QUEUE_S* xTypecQueue = Hv_Vos_QueueInit(&stQueueInitParam);
  247. HV_ASSERT_VALID_PTR_VOID(xTypecQueue);
  248. s_stSystemManager.xTypecQueue = xTypecQueue;
  249. #endif
  250. #ifdef CONFIG_USER_USB_OTA_ON
  251. stQueueInitParam.queueLen = USB_QUEUE_LENGTH;
  252. stQueueInitParam.itemSize = sizeof(UsbEvent);
  253. HV_VOS_QUEUE_S* xUsbOtaQueue = Hv_Vos_QueueInit(&stQueueInitParam);
  254. HV_ASSERT_VALID_PTR_VOID(xUsbOtaQueue);
  255. s_stSystemManager.xUsbQueue = xUsbOtaQueue;
  256. #endif
  257. HV_LOG_DEBUG(SYSTEM, "Hv_Mw_System_AllMessageQueueCreate success!!!");
  258. return;
  259. }
  260. HV_VOS_QUEUE_S* Hv_Mw_System_GetSystemQueue( VOID )
  261. {
  262. return s_stSystemManager.xSystemQueue;
  263. }
  264. HV_VOS_QUEUE_S* Hv_Mw_System_GetOsdQueue( VOID )
  265. {
  266. return s_stSystemManager.xOsdQueue;
  267. }
  268. #ifdef CONFIG_USER_TYPE_C_ON
  269. HV_VOS_QUEUE_S* Hv_Mw_System_GetTypecQueue( VOID )
  270. {
  271. return s_stSystemManager.xTypecQueue;
  272. }
  273. #endif
  274. #ifdef CONFIG_USER_USB_OTA_ON
  275. HV_VOS_QUEUE_S* Hv_Mw_System_GetUsbQueue( VOID )
  276. {
  277. return s_stSystemManager.xUsbQueue;
  278. }
  279. #endif
  280. HV_VOS_QUEUE_S* Hv_Mw_System_GetEventHubQueue( VOID )
  281. {
  282. return s_stSystemManager.xEventHubQueue;
  283. }
  284. HV_ATTR_ISR_SECTION HV_VOS_QUEUE_S* Hv_Mw_System_GetUrgentQueue( VOID )
  285. {
  286. return s_stSystemManager.xUrgentQueue;
  287. }
  288. HV_ATTR_ISR_SECTION HV_VOS_TASK_S* Hv_Mw_System_UrgentTaskHandle( VOID )
  289. {
  290. return s_stSystemManager.xUrgentTaskHandle;
  291. }
  292. #ifdef HV_SCALER_DEBUG_VERSION
  293. HV_VOS_TASK_S* Hv_Mw_System_ShellTaskHandle( VOID )
  294. {
  295. return s_stSystemManager.xShellTaskHandle;
  296. }
  297. #endif
  298. VOID Hv_Mw_System_TaskAndIrqEnable( VOID )
  299. {
  300. HV_VOS_IRQ_T u64Mask = 0;
  301. HV_LOG_DEBUG(SYSTEM, "Monitor OS Starup!");
  302. /*使能任务*/
  303. Hv_Vos_TaskStart();
  304. /*启用中断总开关*/
  305. Hv_Vos_RestoreIrq(&u64Mask);
  306. return;
  307. }
  308. #ifdef HV_SCALER_DEBUG_VERSION
  309. static CHAR8* EventTypeConvert(SystemRevEventType enEventType)
  310. {
  311. CHAR8* paEventType[] =
  312. {
  313. "power",
  314. "osd",
  315. "channel",
  316. "inputport",
  317. "panel",
  318. "timer",
  319. "ddc/ci"
  320. };
  321. if(enEventType >= sizeof(paEventType) / sizeof(paEventType[0]))
  322. {
  323. return "NULL";
  324. }
  325. else
  326. {
  327. return paEventType[enEventType];
  328. }
  329. }
  330. static CHAR8* OSDEventIDConvert(USHORT16 enEventType)
  331. {
  332. CHAR8* paEventIDType[] =
  333. {
  334. "osd brightness",
  335. "osd contrast",
  336. "osd sharpness",
  337. "osd color temp",
  338. "osd hdr switch",
  339. "osd aspect ratio",
  340. "osd pxp config",
  341. "osd hdmi version",
  342. "osd dp version",
  343. "osd main source",
  344. "osd sub source",
  345. "osd pxp audio source",
  346. "osd volume",
  347. "osd audio time delay",
  348. "osd freesync switch",
  349. "osd datapatch reconfig",
  350. "osd pip sub window position",
  351. "osd pip sub window size reconfig",
  352. "osd video auto select source",
  353. "osd magnify glass switch",
  354. "osd magnify glass set ratio",
  355. "osd magnify glass set pos",
  356. "osd magnify glass set size",
  357. "osd hue r",
  358. "osd hue g",
  359. "osd hue b",
  360. "osd hue c",
  361. "osd hue m",
  362. "osd hue y",
  363. "osd sat r",
  364. "osd sat g",
  365. "osd sat b",
  366. "osd sat c",
  367. "osd sat m",
  368. "osd lum r",
  369. "osd lum g",
  370. "osd lum b",
  371. "osd lum c",
  372. "osd lum m",
  373. "osd lum y",
  374. "osd main or sub source swap",
  375. "osd video hflip",
  376. "osd video vflip",
  377. "osd auto update edid",
  378. "osd inp pattern",
  379. "osd main montage"
  380. "osd main montage",
  381. "osd over scan",
  382. "osd bright frame",
  383. "osd pro esport",
  384. };
  385. if(enEventType >= sizeof(paEventIDType) / sizeof(paEventIDType[0]))
  386. {
  387. return "NULL";
  388. }
  389. else
  390. {
  391. return paEventIDType[enEventType];
  392. }
  393. }
  394. #endif
  395. static VOID OsdCommandEventDispatch(const SystemEvent* pstSystemEvent)
  396. {
  397. UINT32 uiValue = pstSystemEvent->uiValue;
  398. SystemEvent stSystemEvent = {0};
  399. ChannelEvent stChannelEvent = {0};
  400. #ifdef HV_SCALER_DEBUG_VERSION
  401. if(SYSTEM_REV_EVENT_TYPE_TIMER == pstSystemEvent->enEventType)
  402. {
  403. HV_LOG_INFO(SYSTEM, "System %s,%s,0x%03x", EventTypeConvert(pstSystemEvent->enEventType),TimerEventIDConvert((TIMER_EVENT_E)pstSystemEvent->usEventId), pstSystemEvent->uiValue);
  404. }
  405. if(SYSTEM_REV_EVENT_TYPE_OSD_SETTING == pstSystemEvent->enEventType)
  406. {
  407. HV_LOG_INFO(SYSTEM, "System %s,%s,0x%03x", EventTypeConvert(pstSystemEvent->enEventType),OSDEventIDConvert(pstSystemEvent->usEventId), pstSystemEvent->uiValue);
  408. }
  409. #endif
  410. switch ((SettingParamId)pstSystemEvent->usEventId)
  411. {
  412. #ifdef CONFIG_USER_DOUBLE_CHANNEL_ON
  413. case SETTING_PARAM_ID_PXP_CONFIG:
  414. {
  415. if (0 == uiValue)/*Pip关闭*/
  416. {
  417. stChannelEvent.usEventId = CHANNEL_EVENT_ID_PXP_DISABLE;
  418. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  419. stChannelEvent.usValue = uiValue;
  420. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  421. stChannelEvent.usEventId = CHANNEL_EVENT_ID_SUB_PXP_DISABLE;
  422. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  423. stChannelEvent.usValue = uiValue;
  424. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  425. }
  426. else/*PbP打开 PiP打开*/
  427. {
  428. stChannelEvent.usEventId = CHANNEL_EVENT_ID_PXP_ENABLE;
  429. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  430. stChannelEvent.usValue = uiValue;
  431. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  432. stChannelEvent.usEventId = CHANNEL_EVENT_ID_PXP_ENABLE;
  433. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  434. stChannelEvent.usValue = uiValue;
  435. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  436. }
  437. break;
  438. }
  439. case SETTING_PARAM_ID_SUB_SOURCE:
  440. {
  441. stChannelEvent.usEventId = CHANNEL_EVENT_ID_RESELECT_VIDEO_SRC;
  442. stChannelEvent.usValue = uiValue;
  443. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  444. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  445. break;
  446. }
  447. case SETTING_PARAM_ID_PIP_SUB_WINDOW_SIZE_RECONFIG:
  448. {
  449. /*配置了PIP场景重新设置PIP大小需要重新配置SUB 通路*/
  450. if (1 == HV_COMMON_DATABASE_GET(UserData, ucPxPMode))
  451. {
  452. stChannelEvent.usEventId = CHANNEL_EVENT_ID_DATA_PATH_RECONFIG;
  453. stChannelEvent.usValue = uiValue;
  454. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  455. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  456. HV_LOG_DEBUG(SYSTEM, "receive Sub Dpu datapath reconfig");
  457. }
  458. break;
  459. }
  460. case SETTING_PARAM_ID_MAIN_OR_SUB_SOURCE_SWAP:
  461. {
  462. const ChannelManager* pstChannelManager = Hv_Mw_Channel_GetManager();
  463. stChannelEvent.usEventId = CHANNEL_EVENT_ID_MAIN_SUB_SOURCE_SWAP;
  464. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  465. stChannelEvent.usValue = pstChannelManager->astChannelData[1].enChannelSrcLinkPortIndex;
  466. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  467. stChannelEvent.usEventId = CHANNEL_EVENT_ID_MAIN_SUB_SOURCE_SWAP;
  468. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  469. stChannelEvent.usValue = pstChannelManager->astChannelData[0].enChannelSrcLinkPortIndex;
  470. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  471. break;
  472. }
  473. case SETTING_PARAM_ID_MAGNIFY_GLASS_SWITCH:
  474. {
  475. if (0 == uiValue)/*放大镜关闭*/
  476. {
  477. stChannelEvent.usEventId = CHANNEL_EVENT_ID_SUB_MAGNIFY_DISABLE;
  478. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  479. stChannelEvent.usValue = uiValue;
  480. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  481. }
  482. else if (1 == uiValue)
  483. {
  484. stChannelEvent.usEventId = CHANNEL_EVENT_ID_MAGNIFY_ENABLE;
  485. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  486. stChannelEvent.usValue = uiValue;
  487. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  488. stChannelEvent.usEventId = CHANNEL_EVENT_ID_MAGNIFY_ENABLE;
  489. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  490. stChannelEvent.usValue = uiValue;
  491. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  492. }
  493. else if (3 == uiValue)
  494. {
  495. stChannelEvent.usEventId = CHANNEL_EVENT_ID_SUB_MAGNIFY_DISABLE;
  496. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  497. stChannelEvent.usValue = 0;
  498. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  499. stChannelEvent.usEventId = CHANNEL_EVENT_ID_MAGNIFY_DISABLE;
  500. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  501. stChannelEvent.usValue = 0;
  502. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  503. }
  504. break;
  505. }
  506. #endif
  507. case SETTING_PARAM_ID_MAIN_SOURCE:
  508. {
  509. stChannelEvent.usEventId = CHANNEL_EVENT_ID_RESELECT_VIDEO_SRC;
  510. stChannelEvent.usValue = uiValue;
  511. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  512. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  513. break;
  514. }
  515. case SETTING_PARAM_ID_FREE_SYNC_SWITCH:
  516. {
  517. /*仅主通道支持FreeSync模式!!!*/
  518. HV_LOG_DEBUG(SYSTEM, "receive FreeSyncSitch uiValue=%u", uiValue);
  519. stChannelEvent.usEventId = CHANNEL_EVENT_ID_FREE_SYNC_SWITCH;
  520. stChannelEvent.usValue = uiValue;/*value unused*/
  521. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  522. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  523. break;
  524. }
  525. case SETTING_PARAM_ID_HDR_SWITCH:
  526. {
  527. stChannelEvent.usEventId = CHANNEL_EVENT_ID_HDR_SWITCH;
  528. stChannelEvent.usValue = HV_COMMON_DATABASE_GET(UserData, enHdrSwitch);
  529. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  530. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  531. break;
  532. }
  533. case SETTING_PARAM_ID_PRO_ESPORT_SWITCH:
  534. {
  535. stChannelEvent.usEventId = CHANNEL_EVENT_ID_FREE_SYNC_SWITCH;
  536. stChannelEvent.usValue = HV_COMMON_DATABASE_GET(UserData, ucProEsportSwitch);
  537. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  538. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  539. break;
  540. }
  541. case SETTING_PARAM_ID_ASPECT_RATIO:
  542. {
  543. stChannelEvent.usEventId = CHANNEL_EVENT_ID_SET_ASPECT_RATIO;
  544. stChannelEvent.usValue = HV_COMMON_DATABASE_GET(UserData, ucProportion);
  545. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  546. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  547. #ifdef CONFIG_USER_DOUBLE_CHANNEL_ON
  548. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  549. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  550. #endif
  551. break;
  552. }
  553. case SETTING_PARAM_ID_DATA_PATH_RECONFIG:
  554. {
  555. stChannelEvent.usEventId = CHANNEL_EVENT_ID_DATA_PATH_RECONFIG;
  556. stChannelEvent.usValue = uiValue;
  557. stChannelEvent.enChannelType = CHANNEL_TYPE_MAIN;
  558. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  559. HV_LOG_DEBUG(SYSTEM, "receive Main Dpu datapath reconfig");
  560. #ifdef CONFIG_USER_DOUBLE_CHANNEL_ON
  561. /*PIP 或者PBP打开的case 发送sub通道重配置消息*/
  562. if (0 != (HV_COMMON_DATABASE_GET(UserData, ucPxPMode) || HV_COMMON_DATABASE_GET(UserData, bMagnifyGlassSw)))
  563. {
  564. stChannelEvent.usEventId = CHANNEL_EVENT_ID_DATA_PATH_RECONFIG;
  565. stChannelEvent.usValue = uiValue;
  566. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  567. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  568. HV_LOG_DEBUG(SYSTEM, "receive Sub Dpu datapath reconfig");
  569. }
  570. else
  571. {
  572. /*在PIB or PBP已关闭的case 固定发送一条关闭辅助通道的消息,对于sub通道来说即使多一条关闭消息也不会产生额外的问题,
  573. 如果是之前开启了,resume userdata导致的重配,此case会关闭掉辅通道*/
  574. stChannelEvent.usEventId = CHANNEL_EVENT_ID_SUB_PXP_DISABLE;
  575. stChannelEvent.usValue = 0;
  576. stChannelEvent.enChannelType = CHANNEL_TYPE_SUB;
  577. HV_ASSERT_PEEK_SUCCESS(Hv_Mw_Channel_SendInnerMsg(&stChannelEvent));
  578. HV_LOG_DEBUG(SYSTEM, "receive Sub Dpu datapath disable");
  579. }
  580. #endif
  581. break;
  582. }
  583. default:
  584. {
  585. break;
  586. }
  587. }
  588. return;
  589. }
  590. /** set debug spi default type
  591. * @param[in] type 0:dbg_spi2axi; 1:dbg_spi2ahb
  592. */
  593. static VOID SetDbgSPIDefaultType(UCHAR8 type)
  594. {
  595. HV_W32_FIELD(SYS_REG_SH5_TOP0_REG_SH5_WDG_FILED0, reg_sh5_dbg_spi_sel, type);
  596. return;
  597. }
  598. static BOOL IsPowerTimerOutTimer(const SystemEvent* pstSystemEvent)
  599. {
  600. BOOL bIsTimerEvent = (SYSTEM_REV_EVENT_TYPE_TIMER == pstSystemEvent->enEventType);
  601. BOOL bIsPowerTimerEventId = (SYS_EVENT_TIMER_POWR_BEGIN <= pstSystemEvent->usEventId) && (SYS_EVENT_TIMER_POWR_END >= pstSystemEvent->usEventId);
  602. return bIsTimerEvent && bIsPowerTimerEventId;
  603. }
  604. static BOOL IsInputPortTimerOutTimer(const SystemEvent* pstSystemEvent)
  605. {
  606. BOOL bIsTimerEvent = (SYSTEM_REV_EVENT_TYPE_TIMER == pstSystemEvent->enEventType);
  607. BOOL bIsInputPortTimerEventId = (SYS_EVENT_TIMER_IP_BEGIN <= pstSystemEvent->usEventId) && (SYS_EVENT_TIMER_IP_END >= pstSystemEvent->usEventId);
  608. return bIsTimerEvent && bIsInputPortTimerEventId;
  609. }
  610. static BOOL IsChanelTimerOutTimer(const SystemEvent* pstSystemEvent)
  611. {
  612. BOOL bIsTimerEvent = (SYSTEM_REV_EVENT_TYPE_TIMER == pstSystemEvent->enEventType);
  613. BOOL bIsChannelTimerEventId = (SYS_EVENT_TIMER_CHANNEL_BEGIN <= pstSystemEvent->usEventId) && (SYS_EVENT_TIMER_CHANNEL_TIMER_END >= pstSystemEvent->usEventId);
  614. return bIsTimerEvent && bIsChannelTimerEventId;
  615. }
  616. static BOOL IsPanelTimerOutTimer(const SystemEvent* pstSystemEvent)
  617. {
  618. BOOL bIsTimerEvent = (SYSTEM_REV_EVENT_TYPE_TIMER == pstSystemEvent->enEventType);
  619. BOOL bIsPanelTimerEventId = (SYS_EVENT_TIMER_PANEL_BEGIN <= pstSystemEvent->usEventId) && (SYS_EVENT_TIMER_PANEL_END >= pstSystemEvent->usEventId);
  620. return bIsTimerEvent && bIsPanelTimerEventId;
  621. }
  622. static VOID EventDispatch(const SystemEvent* pstSystemEvent)
  623. {
  624. if ((SYSTEM_REV_EVENT_TYPE_POWER == pstSystemEvent->enEventType) || IsPowerTimerOutTimer(pstSystemEvent))
  625. {
  626. HV_ASSERT_PEEK_SUCCESS_VOID(Hv_Mw_Power_SystemQueueMsgProc(pstSystemEvent));
  627. }
  628. else if ((SYSTEM_REV_EVENT_TYPE_INPUTPORT == pstSystemEvent->enEventType) || IsInputPortTimerOutTimer(pstSystemEvent))
  629. {
  630. HV_ASSERT_PEEK_SUCCESS_VOID(Hv_Mw_InputPort_ProcSystemQueueMsg(pstSystemEvent));
  631. }
  632. else if (SYSTEM_REV_EVENT_TYPE_OSD_SETTING == pstSystemEvent->enEventType)
  633. {
  634. OsdCommandEventDispatch(pstSystemEvent);
  635. }
  636. else if ((SYSTEM_REV_EVENT_TYPE_PANEL == pstSystemEvent->enEventType) || IsPanelTimerOutTimer(pstSystemEvent))
  637. {
  638. HV_ASSERT_PEEK_SUCCESS_VOID(Hv_Mw_Panel_ProcSystemQueueMsg(pstSystemEvent));
  639. }
  640. else if ((SYSTEM_REV_EVENT_TYPE_CHANNEL == pstSystemEvent->enEventType) || IsChanelTimerOutTimer(pstSystemEvent))
  641. {
  642. HV_ASSERT_PEEK_SUCCESS_VOID(Hv_Mw_Channel_ProcSystemQueueMsg(pstSystemEvent));
  643. }
  644. else if (SYSTEM_REV_EVENT_TYPE_DDCCI == pstSystemEvent->enEventType)
  645. {
  646. HV_ASSERT_PEEK_SUCCESS_VOID(Hv_Mw_Ddcci_ProcSystemQueueMsg(pstSystemEvent));
  647. }
  648. else
  649. {
  650. /*Do notihng*/
  651. }
  652. if (Hv_Mw_Panel_HasInnerMsgs())
  653. {
  654. HV_ASSERT_PEEK_SUCCESS_VOID(Hv_Mw_Panel_ProcInnerMsgs());
  655. }
  656. if (Hv_Mw_InputPort_HasInnerMsgs())
  657. {
  658. HV_ASSERT_PEEK_SUCCESS_VOID(Hv_Mw_InputPort_ProcInnerMsgs());
  659. }
  660. if (Hv_Mw_Ddcci_HasInnerMsgs())
  661. {
  662. HV_ASSERT_PEEK_SUCCESS_VOID(Hv_Mw_Ddcci_ProcInnerMsgs());
  663. }
  664. if (Hv_Mw_Channel_HasInnerMsgs())
  665. {
  666. HV_ASSERT_PEEK_SUCCESS_VOID(Hv_Mw_Channel_ProcInnerMsgs());
  667. }
  668. if ((SYSTEM_REV_EVENT_TYPE_TIMER == pstSystemEvent->enEventType)
  669. && (SYS_EVENT_TIMER_DATABASE_SYNC_TIMER == pstSystemEvent->usEventId))
  670. {
  671. Hv_Mw_Factory_SavePanelOnCountTime(HV_FALSE);
  672. /*业务流程均处理完成后周期检查database中数据是否改变,改变则同步到flash/eeprom*/
  673. Hv_Mw_DataBase_Sync();
  674. Hv_Drv_WDG_Feed(DATABASE_PERIOD_SYNC_GLOBAL_TO_FLASH_TIMER_LENGTH * 3);
  675. }
  676. return;
  677. }
  678. static VOID DatabaseSyncTimerStart( VOID )
  679. {
  680. static HV_TIMER_INIT_PARAMS stSystemDatabaseSyncTimerParam = \
  681. {"SystemDatabaseSyncTimer", DATABASE_PERIOD_SYNC_GLOBAL_TO_FLASH_TIMER_LENGTH, HV_TRUE, &stSystemDatabaseSyncTimerParam, Hv_Common_Timer_DispatchEvent, SYS_EVENT_TIMER_DATABASE_SYNC_TIMER};
  682. s_stSystemManager.pstDatabaseSyncTimer = Hv_Vos_Timer_Create(&stSystemDatabaseSyncTimerParam);
  683. HV_ASSERT_VALID_PTR_VOID(s_stSystemManager.pstDatabaseSyncTimer);
  684. Hv_Drv_WDG_Feed(DATABASE_PERIOD_SYNC_GLOBAL_TO_FLASH_TIMER_LENGTH * 2);
  685. Hv_Drv_WDG_Enable();
  686. Hv_Vos_Timer_Start(s_stSystemManager.pstDatabaseSyncTimer);
  687. return;
  688. }
  689. HV_VOS_ISR_RESULT_E Hv_Mw_System_SwIntIsrHandle(UINT32 uiIrqNum, VOID *arg)
  690. {
  691. SystemEvent stSysEvent;
  692. HV_VOS_QUEUE_S* xSystembQueue = Hv_Mw_System_GetSystemQueue();
  693. HV_ASSERT_VALID_PTR_RET_NO_LOG(xSystembQueue, HV_VOS_ISR_HANDLED);
  694. UINT32 uiSwintStatus = Hv_Drv_Mailbox_GetSwIntStatus();
  695. /*Notice: Clear interrupt should use irq - HV_CHIP_IRQ_BASE. We should modify this api.*/
  696. Hv_Vos_WClrMiscInt(uiIrqNum - HV_CHIP_IRQ_BASE);
  697. Hv_Drv_Mailbox_ClearSwIntStatus(uiSwintStatus);
  698. if(PQTOOL_SWINT_TRIGGER_VAL & uiSwintStatus)
  699. {
  700. stSysEvent.enEventType = SYSTEM_REV_EVENT_TYPE_DDCCI;
  701. stSysEvent.ucPortIndex = DDCCI_PORT_PQTOOL;
  702. stSysEvent.uiValue = Hv_Drv_Mailbox_GetPQToolCmdPort();
  703. Hv_Vos_QueueSendFromISR(xSystembQueue, (void *)&stSysEvent);
  704. }
  705. if(HV_HDMI0_RX_HPD_INT & uiSwintStatus)
  706. {
  707. HV_Drv_HdmirRx_ResetScdcWith5V(0);
  708. Hv_Mw_HdmiRx_CableDetCheck(0);
  709. }
  710. if(HV_HDMI1_RX_HPD_INT & uiSwintStatus)
  711. {
  712. HV_Drv_HdmirRx_ResetScdcWith5V(1);
  713. Hv_Mw_HdmiRx_CableDetCheck(1);
  714. }
  715. return HV_VOS_ISR_HANDLED;
  716. }
  717. VOID Hv_Mw_System_SwIntIRQInit()
  718. {
  719. //Register sw int handler for pq tool protocol.
  720. Hv_Vos_AttachIsr(HV_CHIP_IRQ_PM51, Hv_Mw_System_SwIntIsrHandle, NULL);
  721. Hv_Vos_UnmaskIrq(HV_CHIP_IRQ_PM51);
  722. }
  723. VOID Hv_Mw_System_Task_Init(VOID)
  724. {
  725. Hv_Mw_System_SwIntIRQInit();
  726. /*Audio timer start*/
  727. Hv_Mw_Audio_StartSoundDelayTimer();
  728. /*Database period timer creat and start*/
  729. DatabaseSyncTimerStart();
  730. if (HV_TRUE == HV_COMMON_DATABASE_GET(SystemData, bFactoryMode))
  731. {
  732. Hv_Mw_FactoryModeToPm(HV_TRUE);
  733. }
  734. return;
  735. }
  736. VOID Hv_Mw_System_TaskHandle( VOID *arg )
  737. {
  738. HV_ASSERT_VALID_PTR_VOID(s_stSystemManager.xSystemQueue);
  739. SystemEvent stSystemEvent = {0};
  740. Hv_Mw_System_Task_Init();
  741. for (;;)
  742. {
  743. #ifdef SW_DUMMY_DEBUG
  744. HV_WT32(SW_DUMMY_SM_TASK, (HV_RD32(SW_DUMMY_SM_TASK)+1));
  745. #endif
  746. if (Hv_Vos_QueueRecv(s_stSystemManager.xSystemQueue, (VOID*)&stSystemEvent))
  747. {
  748. EventDispatch(&stSystemEvent);
  749. }
  750. Hv_Vos_TaskYield();
  751. }
  752. return;
  753. }
  754. VOID Hv_Mw_System_SetDatabaseSyncTimerEnable(BOOL bEn)
  755. {
  756. if(NULL != s_stSystemManager.pstDatabaseSyncTimer)
  757. {
  758. if(bEn)
  759. {
  760. Hv_Vos_Timer_Rstart(s_stSystemManager.pstDatabaseSyncTimer, DATABASE_PERIOD_SYNC_GLOBAL_TO_FLASH_TIMER_LENGTH);
  761. }
  762. else
  763. {
  764. Hv_Vos_Timer_Rstop(s_stSystemManager.pstDatabaseSyncTimer);
  765. #ifdef CONFIG_USER_WATCHDOG_ON
  766. Hv_Drv_WDG_Disable();
  767. #endif
  768. }
  769. }
  770. return;
  771. }