hv_app_DdcciFactory.c 79 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225
  1. /**
  2. * @file hv_app_DdcciFactory.c
  3. * @brief hisense ddcci factory c file.
  4. *
  5. * @author HiView SoC Software Team
  6. * @version 1.0.0
  7. * @date 2023-01-31
  8. * @copyright Copyright(c),2022-8, Hiview Software. All rights reserved.
  9. * @par History:
  10. * <table>
  11. * <tr><th>Author <th>Date <th>Change Description
  12. * <tr><td>HiView SoC Software Team <td>2024-01-10 <td>create
  13. * </table>
  14. */
  15. #include "hv_mw_Ddcci.h"
  16. #include "hv_app_Ddcci.h"
  17. #include "hv_app_DdcciFactory.h"
  18. #include "hv_comm_DataBase.h"
  19. #include "hv_comm_MemParser.h"
  20. #include "hv_mw_Hdmi.h"
  21. #include "hv_mw_DisplayPort.h"
  22. #include "hv_drv_Flash.h"
  23. #include "hv_mw_Factory.h"
  24. #include "hv_app_PQ.h"
  25. #include "hv_drv_PQ.h"
  26. #include "hv_mw_PQ.h"
  27. #include "hv_drv_Gamma.h"
  28. #include "hv_mw_SystemManager.h"
  29. #include "HV_REGS_HT7315.h"
  30. UINT32 auiGammaLut[3 * 1026 + 1] = { 0 };
  31. USHORT16 ausColorSpaceData[18];
  32. static UINT32 s_uiGammaEnableOri = 0;
  33. static UINT32 s_uiWCGBypassOri = 0;
  34. static UINT32 s_uiLdgBypassOri = 0;
  35. static UINT32 s_uiLdgHdrPassOri = 0;
  36. /**
  37. * @brief Calculate the CRC of hisense factory ddcci message.
  38. * @param[in] VOID.
  39. * @return UCHAR8 CRC value.
  40. */
  41. static UCHAR8 Hv_App_Ddcci_GenFactoryChecksum(UCHAR8 *pucData)
  42. {
  43. UINT32 uiCount = 0;
  44. UINT32 uiCheckLen = 0;
  45. UCHAR8 ucSum = DDCCI_VIRTUAL_HOST_ADDRESS;
  46. uiCheckLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) + DDCCI_FAC_DDC_HEADER_LEN - 1;
  47. for (uiCount = 0; uiCount < uiCheckLen; uiCount++)
  48. {
  49. ucSum = ucSum ^ pucData[uiCount];
  50. }
  51. return ucSum;
  52. }
  53. /**
  54. * @brief Verify the CRC of incoming hisense factory ddcci message.
  55. * @param[in] VOID.
  56. * @return UCHAR8 CRC value.
  57. */
  58. UCHAR8 Hv_App_Ddcci_VerifyFactoryCheckSum(UCHAR8 *pucData)
  59. {
  60. UINT32 uiCount = 0;
  61. UINT32 uiCheckLen = 0;
  62. UCHAR8 ucSum = DDCCI_DEST_ADDRESS;
  63. uiCheckLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) + DDCCI_FAC_DDC_HEADER_LEN - 1;
  64. for (uiCount = 0; uiCount < uiCheckLen; uiCount++)
  65. {
  66. ucSum = ucSum ^ pucData[uiCount];
  67. }
  68. return ucSum;
  69. }
  70. static UINT32 Hv_App_Ddcci_ReadRegister(UINT32 uiAddr, UCHAR8 ucStartBit, UCHAR8 ucStopBit)
  71. {
  72. UINT64 mask;
  73. UINT32 data;
  74. // 读取寄存器的值
  75. data = HV_R32(uiAddr);
  76. // 创建一个掩码,用于选择我们感兴趣的位
  77. mask = (((UINT64)1 << (ucStopBit - ucStartBit + 1)) - 1) << ucStartBit;
  78. // 使用掩码选择我们感兴趣的位,并将它们移动到最低位
  79. data = (data & mask) >> ucStartBit;
  80. return data;
  81. }
  82. static VOID Hv_App_Ddcci_WriteRegister(UINT32 uiAddr, UCHAR8 ucStartBit, UCHAR8 ucStopBit, UINT32 uiValue)
  83. {
  84. UINT64 mask;
  85. UINT32 data;
  86. // 读取寄存器的值
  87. data = HV_R32(uiAddr);
  88. // 创建一个掩码,用于选择我们要修改的位
  89. mask = (((UINT64)1 << (ucStopBit - ucStartBit + 1)) - 1) << ucStartBit;
  90. // 清除我们要修改的位
  91. data &= ~mask;
  92. // 将新的值移动到正确的位置,并使用掩码将其添加到数据中
  93. data |= (uiValue << ucStartBit) & mask;
  94. // 写回寄存器的值
  95. HV_W32(uiAddr, data);
  96. }
  97. static VOID Hv_App_Ddcci_PQWriteCmdRsp(UCHAR8 ucSource, UCHAR8 *pucData)
  98. {
  99. UCHAR8 ucRspData[DDCCI_FAC_WRITE_PQ_CMD_RSP_LEN] = { 0 };
  100. USHORT16 usRspLen = 0;
  101. USHORT16 usProtocolLen = 0;
  102. usRspLen = DDCCI_FAC_WRITE_PQ_CMD_RSP_LEN;
  103. usProtocolLen = usRspLen - DDCCI_FAC_DDC_HEADER_LEN;
  104. HV_MEMCPY(ucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  105. ucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  106. ucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  107. ucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  108. ucRspData[DDCCI_FAC_OFFSET_PQ_CMD_RC] = DDCCI_FAC_RC_SUCCESS;
  109. ucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(ucRspData);
  110. Hv_App_Ddcci_SendData(ucSource, ucRspData, usRspLen);
  111. return;
  112. }
  113. static VOID Hv_App_Ddcci_PQGammaPrepare(VOID)
  114. {
  115. Hv_Drv_PQ_DdcciGammaPrepare();
  116. return;
  117. }
  118. static VOID Hv_App_Ddcci_PQGammaFinish(VOID)
  119. {
  120. Hv_Drv_PQ_DdcciGammaFinish();
  121. //HV_W32_FIELD(DISP_TOP_SUB_LDG_04, reg_main_csc_en, 1);
  122. return;
  123. }
  124. static VOID Hv_App_Ddcci_PQColorSpacePrepare(VOID)
  125. {
  126. Hv_Drv_PQ_DdcciColorSpacePrepare();
  127. return;
  128. }
  129. static VOID Hv_App_Ddcci_PQWCGEnable(BOOL bEn)
  130. {
  131. Hv_Drv_PQ_DdcciWcgEnable(bEn);
  132. return;
  133. }
  134. static VOID Hv_App_Ddcci_PQWriteColorSpaceData(USHORT16 *pusData)
  135. {
  136. Hv_Drv_PQ_DdcciWriteColorSpaceData(pusData);
  137. return;
  138. }
  139. static VOID Hv_App_Ddcci_PQColorSpaceFinish(VOID)
  140. {
  141. Hv_Drv_PQ_DdcciColorSpaceFinish();
  142. return;
  143. }
  144. static VOID Hv_App_Ddcci_PQColorTempPrepare(VOID)
  145. {
  146. Hv_Drv_PQ_DdcciColorTempPrepare();
  147. return;
  148. }
  149. static VOID Hv_App_Ddcci_PQColorTempFinish(VOID)
  150. {
  151. Hv_Drv_PQ_DdcciColorTempFinish();
  152. return;
  153. }
  154. static VOID Hv_App_Ddcci_PQPatternPrepare(VOID)
  155. {
  156. Hv_Drv_PQ_DdcciPatternPrepare();
  157. return;
  158. }
  159. static VOID Hv_App_Ddcci_PQPatternFinish(VOID)
  160. {
  161. Hv_Drv_PQ_DdcciPatternFinish();
  162. return;
  163. }
  164. static VOID Hv_App_Ddcci_PQTrainingStart(VOID)
  165. {
  166. Hv_Mw_System_SetDatabaseSyncTimerEnable(HV_FALSE);
  167. Hv_Drv_PQ_DdcciTrainingStart();
  168. HV_W32_FIELD(RX_HSRX_CH_00_00, reg_00_hsrx_patt_apb_clk_en, 1);
  169. HV_W32_FIELD(RX_HSRX_CH_01_00, reg_01_hsrx_patt_apb_clk_en, 1);
  170. Hv_App_PQ_SetBrightness(100);
  171. Hv_Common_Db_GetSystemDataDBRegionPtr()->bBurnInEnable = 0;
  172. HV_W32_FIELD(STANDBY_HDMI21_RX_EDDC_00_00, reg_00_slv_en_edid, 0);
  173. HV_W32_FIELD(STANDBY_HDMI21_RX_EDDC_00_00, reg_00_slv_en_segment, 0);
  174. HV_W32_FIELD(RX_HDMI21_RX_SCDC_00_A4, reg_00_hdcp_ddc_enable, 0);
  175. return;
  176. }
  177. // 命令开始前的准备工作
  178. static VOID Hv_App_Ddcci_CmdStart(VOID)
  179. {
  180. HV_R32_DECL_VAR();
  181. // 禁止数据库同步
  182. Hv_Mw_System_SetDatabaseSyncTimerEnable(HV_FALSE);
  183. // 关闭HDCP
  184. HV_W32_FIELD(STANDBY_HDMI21_RX_EDDC_00_00, reg_00_slv_en_edid, 0);
  185. HV_W32_FIELD(STANDBY_HDMI21_RX_EDDC_00_00, reg_00_slv_en_segment, 0);
  186. HV_W32_FIELD(RX_HDMI21_RX_SCDC_00_A4, reg_00_hdcp_ddc_enable, 0);
  187. // 保存相关寄存器的值
  188. s_uiGammaEnableOri = Hv_Drv_PQ_DdcciGetGamma();
  189. s_uiWCGBypassOri = Hv_Drv_PQ_DdcciGetWcg();
  190. s_uiLdgBypassOri = Hv_Drv_PQ_DdcciGetLdg();
  191. s_uiLdgHdrPassOri = Hv_Drv_PQ_DdcciGetHdr();
  192. // 关闭OSD菜单
  193. Hv_App_Ddcci_SendEventToOsd(OSD_EVENT_HIDE_ALL, 0);
  194. }
  195. // 命令退出后的恢复工作
  196. static VOID Hv_App_Ddcci_CmdEnd(VOID)
  197. {
  198. // 恢复相关寄存器的值
  199. //HV_W32_FIELD(TX_GAMMA_00, reg_gamma_en, s_uiGammaEnableOri);
  200. //HV_W32_FIELD(DISP_TOP_LD_WCG_REG_1_1C, wcg_bypass, s_uiWCGBypassOri);
  201. //HV_W32_FIELD(DISP_TOP_SUB_LDG_00, reg_ldg_top_bypass, s_uiLdgBypassOri);
  202. //HV_W32_FIELD(DISP_TOP_LDG_HDR_REG_00_00, reg_00_ct_ldg_hdr_passthrough, s_uiLdgHdrPassOri);
  203. Hv_Drv_PQ_DdcciSetGamma(s_uiGammaEnableOri);
  204. Hv_Drv_PQ_DdcciSetWcg(s_uiWCGBypassOri);
  205. Hv_Drv_PQ_DdcciSetLdg(s_uiLdgBypassOri);
  206. Hv_Drv_PQ_DdcciSetHdr(s_uiLdgHdrPassOri);
  207. //打开HDCP
  208. HV_W32_FIELD(STANDBY_HDMI21_RX_EDDC_00_00, reg_00_slv_en_edid, 1);
  209. HV_W32_FIELD(STANDBY_HDMI21_RX_EDDC_00_00, reg_00_slv_en_segment, 1);
  210. HV_W32_FIELD(RX_HDMI21_RX_SCDC_00_A4, reg_00_hdcp_ddc_enable, 1);
  211. //以设置OSD开为PQ Tool结束标志,打开数据库同步
  212. Hv_Mw_System_SetDatabaseSyncTimerEnable(HV_TRUE);
  213. }
  214. static VOID Hv_App_Ddcci_ProcHisFactorySet(UCHAR8 ucSource, UCHAR8 *pucData, USHORT16 usLen)
  215. {
  216. USHORT16 usCmd = (pucData[DDCCI_FAC_OFFSET_CMD_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_CMD_LOW];
  217. UCHAR8 *pucRspData = NULL;
  218. USHORT16 usRspLen = 0;
  219. USHORT16 usProtocolLen = 0;
  220. UCHAR8 *pucValidData = NULL;
  221. UINT32 uiDataLen = 0;
  222. UINT32 uiOpsAddr = 0;
  223. if (Hv_App_Ddcci_VerifyFactoryCheckSum(pucData) != pucData[usLen - 1])
  224. {
  225. DDC_PRINT("CRC Fail! Got:%x, Cal:%x", pucData[usLen - 1], Hv_App_Ddcci_VerifyFactoryCheckSum(pucData));
  226. return;
  227. }
  228. uiOpsAddr = (pucData[DDCCI_FAC_OFFSET_ADDR_LSB] |
  229. (pucData[DDCCI_FAC_OFFSET_ADDR_3RD] << 8) |
  230. (pucData[DDCCI_FAC_OFFSET_ADDR_2ND] << 16) |
  231. (pucData[DDCCI_FAC_OFFSET_ADDR_MSB] << 24));
  232. switch(usCmd)
  233. {
  234. case DDCCI_FAC_CMD_START_OR_END:
  235. {
  236. // 1表示开始,2表示结束
  237. UCHAR8 ucEn = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  238. if (1 == ucEn)
  239. {
  240. Hv_App_Ddcci_CmdStart();
  241. DDC_PRINT("ddc start");
  242. }
  243. else
  244. {
  245. Hv_App_Ddcci_CmdEnd();
  246. DDC_PRINT("ddc end");
  247. }
  248. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  249. break;
  250. }
  251. case DDCCI_FAC_CMD_REGISTER:
  252. {
  253. UINT32 uiValue = (pucData[DDCCI_FAC_OFFSET_REG_VALUE_LSB] |
  254. (pucData[DDCCI_FAC_OFFSET_REG_VALUE_3RD] << 8) |
  255. (pucData[DDCCI_FAC_OFFSET_REG_VALUE_2ND] << 16) |
  256. (pucData[DDCCI_FAC_OFFSET_REG_VALUE_MSB] << 24));
  257. UCHAR8 ucStartBit = pucData[DDCCI_FAC_OFFSET_REG_START_BIT];
  258. UCHAR8 ucStopBit = pucData[DDCCI_FAC_OFFSET_REG_STOP_BIT];
  259. Hv_App_Ddcci_WriteRegister(uiOpsAddr, ucStartBit, ucStopBit, uiValue);
  260. // DDC_PRINT("Reg Write, Val:0x%x, uiOpsAddr:0x%08x", uiValue, uiOpsAddr);
  261. usRspLen = DDCCI_FAC_WRITE_REG_RSP_LEN;
  262. usProtocolLen = usRspLen - DDCCI_FAC_DDC_HEADER_LEN;
  263. pucRspData = HV_MALLOC(usRspLen);
  264. if (NULL == pucRspData)
  265. {
  266. break;
  267. }
  268. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_REG_VALUE_MSB);
  269. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  270. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  271. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  272. pucRspData[usRspLen - 2] = DDCCI_FAC_RC_SUCCESS;
  273. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  274. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  275. break;
  276. }
  277. case DDCCI_FAC_CMD_DDR:
  278. {
  279. USHORT16 usCmdLen = (pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW];
  280. uiDataLen = usCmdLen - DDCCI_FAC_DDC_CMD_FIX_LEN;
  281. usRspLen = DDCCI_FAC_WRITE_DDR_RSP_LEN;
  282. usProtocolLen = usRspLen - DDCCI_FAC_DDC_HEADER_LEN;
  283. // DDC_PRINT("DDR Write, Len:0x%x, uiOpsAddr:0x%08x", uiDataLen, uiOpsAddr);
  284. pucRspData = HV_MALLOC(usRspLen);
  285. if (NULL == pucRspData)
  286. {
  287. break;
  288. }
  289. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_W_DDR_DATA_START);
  290. for (UINT32 uiLoop = 0; uiLoop < uiDataLen; uiLoop++)
  291. {
  292. HV_W8(uiOpsAddr + uiLoop, pucData[DDCCI_FAC_OFFSET_W_DDR_DATA_START + uiLoop]);
  293. }
  294. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  295. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  296. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  297. pucRspData[usRspLen - 2] = DDCCI_FAC_RC_SUCCESS;
  298. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  299. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  300. break;
  301. }
  302. case DDCCI_FAC_CMD_GAMMA_LUT:
  303. {
  304. usRspLen = 8;
  305. usProtocolLen = usRspLen - DDCCI_FAC_DDC_HEADER_LEN;
  306. pucRspData = HV_MALLOC(usRspLen);
  307. if (NULL == pucRspData)
  308. {
  309. break;
  310. }
  311. HV_MEMCPY(pucRspData, pucData, 6);
  312. //使用16bit传参数
  313. for (UINT32 uiId = 0; uiId < 3 * 1025; uiId++)
  314. {
  315. auiGammaLut[uiId] = pucData[7 + 2 * uiId] << 8 | pucData[6 + 2 * uiId];
  316. }
  317. Hv_Drv_Gamma_WriteLut(auiGammaLut, GAMMA_RGB);
  318. pucRspData[usRspLen - 2] = DDCCI_FAC_RC_SUCCESS;
  319. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  320. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  321. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  322. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  323. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  324. DDC_PRINT("Write gamma lut");
  325. break;
  326. }
  327. case DDCCI_FAC_CMD_GAMMA_UNIT_WRITE:
  328. {
  329. //6-7-8-9:Data, 10:Col, 11-12:Row
  330. UINT32 uiCol = pucData[10];
  331. UINT32 uiRow = pucData[11] | (pucData[12] << 8);
  332. UINT32 uiData = (pucData[9] << 24) | (pucData[8] << 16) |
  333. (pucData[7] << 8) | (pucData[6] << 0);
  334. DDC_PRINT("GAMMA_UNIT_WRITE - Col: %u, Row: %u, Data: %u");
  335. Hv_Drv_Gamma_WriteUnit(uiRow, uiCol, uiData);
  336. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  337. break;
  338. }
  339. case DDCCI_FAC_CMD_DYNAMICPANEL:
  340. {
  341. UCHAR8 ucPanelEn = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_LSB];
  342. UCHAR8 ucPanelId = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  343. if (ucPanelEn)
  344. {
  345. Hv_Mw_Factory_SetDynamicPanelIndex(ucPanelId);
  346. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucDynamicPanelIndex = ucPanelId;
  347. }
  348. Hv_Mw_Factory_SetDynamicPanelEn(ucPanelEn);
  349. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->bDynamicPanelEn = ucPanelEn;
  350. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  351. DDC_PRINT("set dynamic panel");
  352. break;
  353. }
  354. case DDCCI_FAC_CMD_GAMMAT:
  355. {
  356. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  357. DDC_PRINT("set gammat");
  358. break;
  359. }
  360. case DDCCI_FAC_CMD_COLORTEMP_COOL:
  361. {
  362. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  363. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stColTempCool, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  364. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  365. DDC_PRINT("set colortemp cool");
  366. break;
  367. }
  368. case DDCCI_FAC_CMD_COLORTEMP_WARM:
  369. {
  370. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  371. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stColTempWarm, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  372. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  373. DDC_PRINT("set colortemp warm");
  374. break;
  375. }
  376. case DDCCI_FAC_CMD_COLORTEMP_STANDARD:
  377. {
  378. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  379. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stColTempStandard, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  380. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  381. DDC_PRINT("set colortemp std");
  382. break;
  383. }
  384. case DDCCI_FAC_CMD_COLORTEMP_P3:
  385. {
  386. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  387. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stColTempP3, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  388. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  389. DDC_PRINT("set colortemp p3");
  390. break;
  391. }
  392. case DDCCI_FAC_CMD_COLORTEMP_SRGB:
  393. {
  394. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  395. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stColTempSrgb, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  396. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  397. DDC_PRINT("set colortemp srgb");
  398. break;
  399. }
  400. case DDCCI_FAC_CMD_COLORTEMP_EYECARE:
  401. {
  402. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  403. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stColTempEyeCare, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  404. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  405. DDC_PRINT("set colortemp eyecare");
  406. break;
  407. }
  408. case DDCCI_FAC_CMD_FACWEEK:
  409. {
  410. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucFactWeek = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  411. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  412. DDC_PRINT("set fac week: 0x%x", pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB]);
  413. break;
  414. }
  415. case DDCCI_FAC_CMD_FACYEAR:
  416. {
  417. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucFactYear = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  418. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  419. DDC_PRINT("set fac year: 0x%x", pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB]);
  420. break;
  421. }
  422. case DDCCI_FAC_CMD_DEFAULT_LANG:
  423. {
  424. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucDefaultLanguage = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  425. // Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->bDefaultLanguageChanged = HV_TRUE;
  426. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  427. DDC_PRINT("set default lang %d", pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB]);
  428. break;
  429. }
  430. case DDCCI_FAC_CMD_FACBRIGHTNESS:
  431. {
  432. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucFactoryBrightness = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  433. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  434. DDC_PRINT("set fac brightness %d", pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB]);
  435. break;
  436. }
  437. case DDCCI_FAC_CMD_FACCONTRAST:
  438. {
  439. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucFactoryContrast = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  440. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  441. DDC_PRINT("set fac contrast %d", pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB]);
  442. break;
  443. }
  444. case DDCCI_FAC_CMD_GAMUT_NATIVE:
  445. {
  446. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  447. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stGamutNative, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  448. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  449. DDC_PRINT("set gamut native");
  450. break;
  451. }
  452. case DDCCI_FAC_CMD_GAMUT_SRGB:
  453. {
  454. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  455. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stGamutSrgb, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  456. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  457. DDC_PRINT("set gamut srgb");
  458. break;
  459. }
  460. case DDCCI_FAC_CMD_GAMUT_709:
  461. {
  462. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  463. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stGamut709, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  464. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  465. DDC_PRINT("set gamut 709");
  466. break;
  467. }
  468. case DDCCI_FAC_CMD_GAMUT_P3:
  469. {
  470. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  471. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stGamutP3, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  472. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  473. DDC_PRINT("set gamut p3");
  474. break;
  475. }
  476. case DDCCI_FAC_CMD_GAMUT_HDR:
  477. {
  478. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  479. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stGamutHdr, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  480. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  481. DDC_PRINT("set gamut hdr");
  482. break;
  483. }
  484. case DDCCI_FAC_CMD_GAMUT_ADOBE:
  485. {
  486. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - 3;
  487. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->stGamutAdobe, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  488. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  489. DDC_PRINT("set gamut adobe");
  490. break;
  491. }
  492. case DDCCI_FAC_CMD_SN:
  493. {
  494. // 先保存下来,等待DATABASE_SYNC命令后再写入
  495. CHAR8 *pcProductSn = (CHAR8 *)Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->acProductSn;
  496. USHORT16 usProductSNLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - DDCCI_FAC_DDC_CMD_LEN;
  497. if (usProductSNLen >= PRODUCT_SN_LENTH)
  498. {
  499. // product sn长度最大24,最后一字节补0
  500. usProductSNLen = PRODUCT_SN_LENTH - 1;
  501. }
  502. HV_MEMSET(pcProductSn, 0, PRODUCT_SN_LENTH);
  503. HV_MEMCPY(pcProductSn, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usProductSNLen);
  504. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  505. DDC_PRINT("set product sn");
  506. break;
  507. }
  508. case DDCCI_FAC_CMD_SETEDIDSN:
  509. {
  510. // 先保存下来,等待DATABASE_SYNC命令后再写入
  511. CHAR8 *pcEdidSn = (CHAR8 *)Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->acDescSn;
  512. USHORT16 usEdidSNLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - DDCCI_FAC_DDC_CMD_LEN;
  513. if (usEdidSNLen > EDID_DESC_SN_LENTH)
  514. {
  515. // edid sn长度最大13,不够的后面补0x0A 0x20 0x20 ...
  516. usEdidSNLen = EDID_DESC_SN_LENTH;
  517. }
  518. HV_MEMSET(pcEdidSn, 0x20, EDID_DESC_SN_LENTH);
  519. HV_MEMCPY(pcEdidSn, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usEdidSNLen);
  520. if (usEdidSNLen < EDID_DESC_SN_LENTH)
  521. {
  522. pcEdidSn[usEdidSNLen] = 0x0A;
  523. }
  524. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  525. DDC_PRINT("set edid sn");
  526. break;
  527. }
  528. case DDCCI_FAC_CMD_HDCP:
  529. {
  530. USHORT16 usHdcpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - DDCCI_FAC_DDC_CMD_LEN;
  531. Hv_Vos_Memcpy((VOID *)&Hv_Common_Db_GetHDCPDataDBRegionPtr()->stKey, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usHdcpLen);
  532. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  533. DDC_PRINT("set hdcp");
  534. break;
  535. }
  536. case DDCCI_FAC_CMD_HDCP_ALL:
  537. {
  538. USHORT16 usHdcpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]) - DDCCI_FAC_DDC_CMD_LEN;
  539. if (usHdcpLen != sizeof(HDCPDataDBRegion))
  540. {
  541. HV_LOG_ERROR(DDCCI, "set hdcp-all len error, %u, should be %u", usHdcpLen, sizeof(HDCPDataDBRegion));
  542. break;
  543. }
  544. Hv_Vos_Memcpy(Hv_Common_Db_GetHDCPDataDBRegionPtr(), pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usHdcpLen);
  545. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  546. DDC_PRINT("set hdcp all");
  547. break;
  548. }
  549. case DDCCI_FAC_CMD_HDMIEDID:
  550. {
  551. // 工具会先发edid数据,再发edid个数
  552. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]);
  553. if (usTmpLen == DDCCI_FAC_DDC_CMD_FIX_LEN)
  554. {
  555. Hv_Common_Db_GetHdmiEdidDBRegionPtr()->ucNumber = pucData[DDCCI_FAC_OFFSET_ADDR_MSB];
  556. DDC_PRINT("set hdmi0 edid len: %u", Hv_Common_Db_GetHdmiEdidDBRegionPtr()->ucNumber);
  557. }
  558. else
  559. {
  560. usTmpLen -= DDCCI_FAC_DDC_CMD_LEN;
  561. Hv_Vos_Memcpy(Hv_Common_Db_GetHdmiEdidDBRegionPtr()->astHdmiEdid, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  562. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  563. DDC_PRINT("set hdmi0 edid data");
  564. }
  565. break;
  566. }
  567. case DDCCI_FAC_CMD_HDMI1EDID:
  568. {
  569. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]);
  570. if (usTmpLen == DDCCI_FAC_DDC_CMD_FIX_LEN)
  571. {
  572. Hv_Common_Db_GetHdmi1EdidDBRegionPtr()->ucNumber = pucData[DDCCI_FAC_OFFSET_ADDR_MSB];
  573. DDC_PRINT("set hdmi1 edid len: %u", Hv_Common_Db_GetHdmi1EdidDBRegionPtr()->ucNumber);
  574. }
  575. else
  576. {
  577. usTmpLen -= DDCCI_FAC_DDC_CMD_LEN;
  578. Hv_Vos_Memcpy(Hv_Common_Db_GetHdmi1EdidDBRegionPtr()->astHdmiEdid, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  579. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  580. DDC_PRINT("set hdmi1 edid data");
  581. }
  582. break;
  583. }
  584. case DDCCI_FAC_CMD_DPEDID:
  585. {
  586. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]);
  587. if (usTmpLen == DDCCI_FAC_DDC_CMD_FIX_LEN)
  588. {
  589. Hv_Common_Db_GetDpEdidDBRegionPtr()->ucNumber = pucData[DDCCI_FAC_OFFSET_ADDR_MSB];
  590. DDC_PRINT("set dp0 edid len: %u", Hv_Common_Db_GetDpEdidDBRegionPtr()->ucNumber);
  591. }
  592. else
  593. {
  594. usTmpLen -= DDCCI_FAC_DDC_CMD_LEN;
  595. Hv_Vos_Memcpy(Hv_Common_Db_GetDpEdidDBRegionPtr()->astDpEdid, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  596. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  597. DDC_PRINT("set dp0 edid data");
  598. }
  599. break;
  600. }
  601. case DDCCI_FAC_CMD_DP1EDID:
  602. {
  603. USHORT16 usTmpLen = ((pucData[DDCCI_FAC_OFFSET_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_LEN_LOW]);
  604. if (usTmpLen == DDCCI_FAC_DDC_CMD_FIX_LEN)
  605. {
  606. Hv_Common_Db_GetDp1EdidDBRegionPtr()->ucNumber = pucData[DDCCI_FAC_OFFSET_ADDR_MSB];
  607. DDC_PRINT("set dp1 edid len: %u", Hv_Common_Db_GetDp1EdidDBRegionPtr()->ucNumber);
  608. }
  609. else
  610. {
  611. usTmpLen -= DDCCI_FAC_DDC_CMD_LEN;
  612. Hv_Vos_Memcpy(Hv_Common_Db_GetDp1EdidDBRegionPtr()->astDpEdid, pucData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, usTmpLen);
  613. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  614. DDC_PRINT("set dp1 edid data");
  615. }
  616. break;
  617. }
  618. case DDCCI_FAC_CMD_SETBURNOSD:
  619. {
  620. UCHAR8 ucMode = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  621. Hv_Common_Db_GetSystemDataDBRegionPtr()->bBurnInEnable = ucMode;
  622. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  623. DDC_PRINT("set burn osd");
  624. break;
  625. }
  626. case DDCCI_FAC_CMD_BRIGHTNESS:
  627. {
  628. UCHAR8 ucBrightness = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  629. Hv_App_PQ_SetBrightness(ucBrightness);
  630. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  631. DDC_PRINT("set brightness");
  632. break;
  633. }
  634. case DDCCI_FAC_CMD_CONTRAST:
  635. {
  636. UCHAR8 ucValue = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  637. Hv_App_PQ_SetContrast(ucValue);
  638. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  639. DDC_PRINT("set contrast");
  640. break;
  641. }
  642. case DDCCI_FAC_CMD_BRIGHTNESS_NIT:
  643. {
  644. #if 0
  645. UCHAR8 ucBrightness = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  646. Hv_App_PQ_SetBrightness(ucBrightness);
  647. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->usFactoryDefaultNits = HV_PQ_DATABASE_GET(DiagData, usDBBrightness);
  648. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  649. DDC_PRINT("set brightness nit");
  650. #endif
  651. break;
  652. }
  653. case DDCCI_FAC_CMD_GAMMA_ACTION:
  654. {
  655. UCHAR8 ucVal = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  656. if (DDCCI_FAC_CMD_PQ_PREPARE == ucVal)
  657. {
  658. DDC_PRINT("gamma prepare");
  659. Hv_App_Ddcci_PQGammaPrepare();
  660. }
  661. else
  662. {
  663. DDC_PRINT("gamma finish");
  664. Hv_App_Ddcci_PQGammaFinish();
  665. }
  666. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  667. break;
  668. }
  669. case DDCCI_FAC_CMD_COLORSPACE_ACTION:
  670. {
  671. UCHAR8 ucVal = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  672. if (DDCCI_FAC_CMD_PQ_PREPARE == ucVal)
  673. {
  674. DDC_PRINT("color space prepare");
  675. Hv_App_Ddcci_PQColorSpacePrepare();
  676. }
  677. else
  678. {
  679. DDC_PRINT("color space finish");
  680. Hv_App_Ddcci_PQColorSpaceFinish();
  681. }
  682. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  683. break;
  684. }
  685. case DDCCI_FAC_CMD_WCG_ACTION:
  686. {
  687. UCHAR8 ucVal = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  688. if (1 == ucVal)
  689. {
  690. DDC_PRINT("WCG On");
  691. Hv_App_Ddcci_PQWCGEnable(HV_TRUE);
  692. }
  693. else
  694. {
  695. DDC_PRINT("WCG Off");
  696. Hv_App_Ddcci_PQWCGEnable(HV_FALSE);
  697. }
  698. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  699. break;
  700. }
  701. case DDCCI_FAC_CMD_COLORSPACE_DATA1:
  702. case DDCCI_FAC_CMD_COLORSPACE_DATA2:
  703. case DDCCI_FAC_CMD_COLORSPACE_DATA3:
  704. case DDCCI_FAC_CMD_COLORSPACE_DATA4:
  705. case DDCCI_FAC_CMD_COLORSPACE_DATA5:
  706. {
  707. UCHAR8 ucIndex = 0;
  708. for (ucIndex = 0; ucIndex < 18; ucIndex++)
  709. {
  710. ausColorSpaceData[ucIndex] = pucData[6 + (2 * ucIndex)] << 8 | pucData[6 + (2 * ucIndex) + 1];
  711. }
  712. Hv_App_Ddcci_PQWriteColorSpaceData(ausColorSpaceData);
  713. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  714. DDC_BUF_PRINT("[debug] Write color space data", pucData, usLen);
  715. break;
  716. }
  717. case DDCCI_FAC_CMD_COLORTEMP_ACTION:
  718. {
  719. UCHAR8 ucVal = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  720. if (DDCCI_FAC_CMD_PQ_PREPARE == ucVal)
  721. {
  722. DDC_PRINT("colortemp prepare");
  723. Hv_App_Ddcci_PQColorTempPrepare();
  724. }
  725. else
  726. {
  727. DDC_PRINT("colortemp finish");
  728. Hv_App_Ddcci_PQColorTempFinish();
  729. }
  730. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  731. break;
  732. }
  733. case DDCCI_FAC_CMD_PATTERN_ACTION:
  734. {
  735. UCHAR8 ucVal = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  736. if (DDCCI_FAC_CMD_PQ_PREPARE == ucVal)
  737. {
  738. DDC_PRINT("pattern prepare");
  739. Hv_App_Ddcci_PQPatternPrepare();
  740. }
  741. else
  742. {
  743. DDC_PRINT("pattern finish");
  744. Hv_App_Ddcci_PQPatternFinish();
  745. }
  746. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  747. break;
  748. }
  749. case DDCCI_FAC_CMD_PQ_TRAINING_START:
  750. {
  751. UCHAR8 ucVal = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  752. if (DDCCI_FAC_CMD_PQ_PREPARE == ucVal)
  753. {
  754. DDC_PRINT("pq traing start");
  755. Hv_App_Ddcci_PQTrainingStart();
  756. }
  757. else
  758. {
  759. DDC_PRINT("pq traing stop");
  760. }
  761. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  762. break;
  763. }
  764. case DDCCI_FAC_CMD_ENERGY:
  765. {
  766. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucFactoryEnergy = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  767. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  768. DDC_PRINT("energy");
  769. break;
  770. }
  771. case DDCCI_FAC_CMD_SHARPNESS:
  772. {
  773. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucFactorySharpness = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  774. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  775. DDC_PRINT("Set Sharpness");
  776. break;
  777. }
  778. case DDCCI_FAC_CMD_PQ_RGB_COEF:
  779. {
  780. USHORT16 usR = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB] << 8 | pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_2ND];
  781. USHORT16 usG = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_3RD] << 8 | pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_LSB];
  782. USHORT16 usB = pucData[10] << 8 | pucData[11];
  783. HV_W32_FIELD(DISP_TOP_SUB_LDG_0C, reg_main_csc_cr_r_coef, usR);
  784. HV_W32_FIELD(DISP_TOP_SUB_LDG_24, reg_main_csc_y_g_coef, usG);
  785. HV_W32_FIELD(DISP_TOP_SUB_LDG_30, reg_main_csc_cb_b_coef, usB);
  786. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  787. DDC_PRINT("Set RGB Coef, 0x%04x, 0x%04x, 0x%04x", usR, usG, usB);
  788. break;
  789. }
  790. case DDCCI_FAC_CMD_PQ_WEEK_YEAR:
  791. {
  792. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucFactWeek = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  793. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucFactYear = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_2ND];
  794. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  795. DDC_PRINT("set fac week: %d, year: %d", pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB], pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_2ND]);
  796. break;
  797. }
  798. case DDCCI_FAC_CMD_FACTORYMODE:
  799. {
  800. UCHAR8 ucVal = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  801. Hv_Mw_Factory_SetFactoryModeEnable(!!ucVal);
  802. Hv_Common_Db_GetSystemDataDBRegionPtr()->bFactoryMode = !!ucVal;
  803. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  804. DDC_PRINT("write factory mode");
  805. break;
  806. }
  807. case DDCCI_FAC_CMD_DATABASE_SYNC:
  808. {
  809. UCHAR8 ucRet = 0;
  810. UINT32 uiVal = (pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_LSB] |
  811. (pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_3RD] << 8) |
  812. (pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_2ND] << 16) |
  813. (pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB] << 24));
  814. DDC_PRINT("set SYNC flag 0x%x", uiVal);
  815. /* HDCP modified */
  816. if (uiVal & PQTOOL_MODIFYFLAG_HDCP1X)
  817. {
  818. Hv_Common_Db_GetHDCPDataDBRegionPtr()->bModifyFlag = HV_TRUE;
  819. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucUseSeperatorHDCPKey = HV_TRUE;
  820. Hv_Common_Db_GetHDCPDataDBRegionPtr()->bHdcp1XValid = HV_TRUE;
  821. ucRet |= Hv_Mw_DataBase_DdcSyncHdcp();
  822. DDC_PRINT("sync hdcp1x %d", ucRet);
  823. }
  824. if (uiVal & PQTOOL_MODIFYFLAG_HDCP2X)
  825. {
  826. Hv_Common_Db_GetHDCPDataDBRegionPtr()->bModifyFlag = HV_TRUE;
  827. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->ucUseSeperatorHDCPKey = HV_TRUE;
  828. Hv_Common_Db_GetHDCPDataDBRegionPtr()->bHdcp2XValid = HV_TRUE;
  829. ucRet |= Hv_Mw_DataBase_DdcSyncHdcp();
  830. DDC_PRINT("sync hdcp2x %d", ucRet);
  831. }
  832. if (uiVal & PQTOOL_MODIFYFLAG_HDMIEDID)
  833. {
  834. Hv_Common_Db_GetHdmiEdidDBRegionPtr()->bModifyFlag = HV_TRUE;
  835. ucRet |= Hv_Mw_DataBase_DdcSyncHdmiEdid();
  836. DDC_PRINT("sync hdmi0 %d", ucRet);
  837. }
  838. if (uiVal & PQTOOL_MODIFYFLAG_HDMI1EDID)
  839. {
  840. Hv_Common_Db_GetHdmi1EdidDBRegionPtr()->bModifyFlag = HV_TRUE;
  841. ucRet |= Hv_Mw_DataBase_DdcSyncHdmi1Edid();
  842. DDC_PRINT("sync hdmi1 %d", ucRet);
  843. }
  844. if (uiVal & PQTOOL_MODIFYFLAG_DPEDID)
  845. {
  846. Hv_Common_Db_GetDpEdidDBRegionPtr()->bModifyFlag = HV_TRUE;
  847. ucRet |= Hv_Mw_DataBase_DdcSyncDPEdid();
  848. DDC_PRINT("sync dp0 %d", ucRet);
  849. }
  850. if (uiVal & PQTOOL_MODIFYFLAG_DP1EDID)
  851. {
  852. Hv_Common_Db_GetDp1EdidDBRegionPtr()->bModifyFlag = HV_TRUE;
  853. ucRet |= Hv_Mw_DataBase_DdcSyncDP1Edid();
  854. DDC_PRINT("sync dp1 %d", ucRet);
  855. }
  856. if(uiVal & PQTOOL_MODIFYFLAG_GAMMA)
  857. {
  858. #if (HV_CONFIG_ON == HV_PROJECT_CONFIG_GAMMACOMPRESS)
  859. Hv_App_GmaCompress(auiGammaLut, (UCHAR8 *)Hv_Common_Db_GetGammaDataDBRegionPtr()->auiGamma);
  860. #else
  861. HV_MEMCPY(Hv_Common_Db_GetGammaDataDBRegionPtr()->auiGamma, auiGammaLut, sizeof(Hv_Common_Db_GetGammaDataDBRegionPtr()->auiGamma));
  862. #endif
  863. Hv_Common_Db_GetGammaDataDBRegionPtr()->bModifyFlag = HV_TRUE;
  864. ucRet |= Hv_Mw_DataBase_DdcSyncGamma();
  865. DDC_PRINT("sync gamma %d", ucRet);
  866. }
  867. /* Factory Data Update Without Any Flag. It is a mandantory selection */
  868. // if ((uiVal & PQTOOL_MODIFYFLAG_COLORTEMP) || (uiVal & PQTOOL_MODIFYFLAG_GAMUT))
  869. {
  870. Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()->bModifyFlag = HV_TRUE;
  871. Hv_Vos_Memcpy(Hv_Common_Db_GetFactoryDataDBRegionPtr(),
  872. (FactoryDataDBRegion *)Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr(), sizeof(FactoryDataDBRegion));
  873. ucRet |= Hv_Mw_DataBase_SyncFactory();
  874. DDC_PRINT("sync factory %d", ucRet);
  875. }
  876. if (uiVal & PQTOOL_MODIFYFLAG_USERDATA)
  877. {
  878. Hv_Common_Db_GetUserDataDBRegionPtr()->bModifyFlag = HV_TRUE;
  879. ucRet |= Hv_Mw_DataBase_DdcSync();
  880. DDC_PRINT("sync user data %d", ucRet);
  881. }
  882. usRspLen = DDCCI_FAC_WRITE_PQ_CMD_RSP_LEN;
  883. usProtocolLen = usRspLen - DDCCI_FAC_DDC_HEADER_LEN;
  884. pucRspData = HV_MALLOC(usRspLen);
  885. if (NULL == pucRspData)
  886. {
  887. break;
  888. }
  889. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  890. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  891. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  892. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  893. if (ucRet != 0)
  894. {
  895. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_RC] = DDCCI_FAC_RC_FAIL;
  896. }
  897. else
  898. {
  899. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_RC] = DDCCI_FAC_RC_SUCCESS;
  900. }
  901. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  902. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  903. break;
  904. }
  905. case DDCCI_FAC_CMD_SWITCH_GAMMA:
  906. {
  907. UCHAR8 ucGammaId = pucData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB];
  908. Hv_Mw_PQ_SetGamma(ucGammaId);
  909. Hv_App_Ddcci_PQWriteCmdRsp(ucSource, pucData);
  910. DDC_PRINT("switch gamma: %u", ucGammaId);
  911. break;
  912. }
  913. case DDCCI_FAC_CMD_CM64:
  914. {
  915. break;
  916. }
  917. case DDCCI_FAC_CMD_GMACOMPRESS:
  918. {
  919. break;
  920. }
  921. case DDCCI_FAC_CMD_HUE:
  922. {
  923. break;
  924. }
  925. case DDCCI_FAC_CMD_SATURATION:
  926. {
  927. break;
  928. }
  929. case DDCCI_FAC_CMD_DLC:
  930. {
  931. break;
  932. }
  933. case DDCCI_FAC_CMD_DCR:
  934. {
  935. break;
  936. }
  937. case DDCCI_FAC_CMD_COLORSPACE:
  938. {
  939. break;
  940. }
  941. case DDCCI_FAC_CMD_RGAIN:
  942. {
  943. break;
  944. }
  945. case DDCCI_FAC_CMD_GGAIN:
  946. {
  947. break;
  948. }
  949. case DDCCI_FAC_CMD_BGAIN:
  950. {
  951. break;
  952. }
  953. case DDCCI_FAC_CMD_ROFFSET:
  954. {
  955. break;
  956. }
  957. case DDCCI_FAC_CMD_GOFFSET:
  958. {
  959. break;
  960. }
  961. case DDCCI_FAC_CMD_BOFFSET:
  962. {
  963. break;
  964. }
  965. case DDCCI_FAC_CMD_RED_HUE:
  966. {
  967. break;
  968. }
  969. case DDCCI_FAC_CMD_RED_SAT:
  970. {
  971. break;
  972. }
  973. case DDCCI_FAC_CMD_RED_LUM:
  974. {
  975. break;
  976. }
  977. case DDCCI_FAC_CMD_GREEN_HUE:
  978. {
  979. break;
  980. }
  981. case DDCCI_FAC_CMD_GREEN_SAT:
  982. {
  983. break;
  984. }
  985. case DDCCI_FAC_CMD_GREEN_LUM:
  986. {
  987. break;
  988. }
  989. case DDCCI_FAC_CMD_BLUE_HUE:
  990. {
  991. break;
  992. }
  993. case DDCCI_FAC_CMD_BLUE_SAT:
  994. {
  995. break;
  996. }
  997. case DDCCI_FAC_CMD_BLUE_LUM:
  998. {
  999. break;
  1000. }
  1001. case DDCCI_FAC_CMD_CYAN_HUE:
  1002. {
  1003. break;
  1004. }
  1005. case DDCCI_FAC_CMD_CYAN_SAT:
  1006. {
  1007. break;
  1008. }
  1009. case DDCCI_FAC_CMD_CYAN_LUM:
  1010. {
  1011. break;
  1012. }
  1013. case DDCCI_FAC_CMD_YELLOW_HUE:
  1014. {
  1015. break;
  1016. }
  1017. case DDCCI_FAC_CMD_YELLOW_SAT:
  1018. {
  1019. break;
  1020. }
  1021. case DDCCI_FAC_CMD_YELLOW_LUM:
  1022. {
  1023. break;
  1024. }
  1025. case DDCCI_FAC_CMD_MAGENTA_HUE:
  1026. {
  1027. break;
  1028. }
  1029. case DDCCI_FAC_CMD_MAGENTA_SAT:
  1030. {
  1031. break;
  1032. }
  1033. case DDCCI_FAC_CMD_MAGENTA_LUM:
  1034. {
  1035. break;
  1036. }
  1037. case DDCCI_FAC_CMD_PWM:
  1038. {
  1039. break;
  1040. }
  1041. case DDCCI_FAC_CMD_SET_FR:
  1042. {
  1043. break;
  1044. }
  1045. case DDCCI_FAC_CMD_SIMKEY0:
  1046. {
  1047. break;
  1048. }
  1049. case DDCCI_FAC_CMD_SIMKEY1:
  1050. {
  1051. break;
  1052. }
  1053. case DDCCI_FAC_CMD_SIMKEY2:
  1054. {
  1055. break;
  1056. }
  1057. case DDCCI_FAC_CMD_SIMKEY3:
  1058. {
  1059. break;
  1060. }
  1061. case DDCCI_FAC_CMD_SIMKEY4:
  1062. {
  1063. break;
  1064. }
  1065. case DDCCI_FAC_CMD_GAMMA_MEA:
  1066. {
  1067. break;
  1068. }
  1069. case DDCCI_FAC_CMD_DELTAE_MEA:
  1070. {
  1071. break;
  1072. }
  1073. case DDCCI_FAC_CMD_LUTINIT:
  1074. {
  1075. break;
  1076. }
  1077. case DDCCI_FAC_CMD_WCG_3D_LUT:
  1078. {
  1079. break;
  1080. }
  1081. default:
  1082. {
  1083. break;
  1084. }
  1085. }
  1086. if (NULL != pucValidData)
  1087. {
  1088. HV_FREE(pucValidData);
  1089. }
  1090. if (NULL != pucRspData)
  1091. {
  1092. HV_FREE(pucRspData);
  1093. }
  1094. return;
  1095. }
  1096. static VOID Hv_App_Ddcci_ProcHisFactoryGet(UCHAR8 ucSource, UCHAR8 *pucData, USHORT16 usLen)
  1097. {
  1098. USHORT16 usCmd = (pucData[DDCCI_FAC_OFFSET_CMD_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_CMD_LOW];
  1099. UCHAR8 *pucRspData = NULL;
  1100. USHORT16 usRspLen = 0;
  1101. USHORT16 usProtocolLen = 0;
  1102. UCHAR8 *pucValidData = NULL;
  1103. UINT32 uiDataLen = 0;
  1104. UINT32 uiOpsAddr = 0;
  1105. UINT32 uiDbAddr = 0;
  1106. if (Hv_App_Ddcci_VerifyFactoryCheckSum(pucData) != pucData[usLen - 1])
  1107. {
  1108. DDC_PRINT("CRC Fail!! Got:%x, Cal:%x", pucData[usLen - 1], Hv_App_Ddcci_VerifyFactoryCheckSum(pucData));
  1109. return;
  1110. }
  1111. uiOpsAddr = (pucData[DDCCI_FAC_OFFSET_ADDR_LSB] |
  1112. (pucData[DDCCI_FAC_OFFSET_ADDR_3RD] << 8) |
  1113. (pucData[DDCCI_FAC_OFFSET_ADDR_2ND] << 16) |
  1114. (pucData[DDCCI_FAC_OFFSET_ADDR_MSB] << 24));
  1115. switch (usCmd)
  1116. {
  1117. case DDCCI_FAC_CMD_REGISTER:
  1118. {
  1119. UCHAR8 ucStartBit = pucData[DDCCI_FAC_OFFSET_REG_START_BIT];
  1120. UCHAR8 ucStopBit = pucData[DDCCI_FAC_OFFSET_REG_STOP_BIT];
  1121. UINT32 uiReadVal = Hv_App_Ddcci_ReadRegister(uiOpsAddr, ucStartBit, ucStopBit);
  1122. usRspLen = DDCCI_FAC_READ_REG_RSP_LEN;
  1123. usProtocolLen = usRspLen - DDCCI_FAC_DDC_HEADER_LEN;
  1124. pucRspData = HV_MALLOC(usRspLen);
  1125. if (NULL == pucRspData)
  1126. {
  1127. break;
  1128. }
  1129. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_REG_VALUE_MSB);
  1130. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1131. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1132. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1133. pucRspData[DDCCI_FAC_OFFSET_REG_VALUE_MSB] = (uiReadVal >> 24) & 0xFF;
  1134. pucRspData[DDCCI_FAC_OFFSET_REG_VALUE_2ND] = (uiReadVal >> 16) & 0xFF;
  1135. pucRspData[DDCCI_FAC_OFFSET_REG_VALUE_3RD] = (uiReadVal >> 8) & 0xFF;
  1136. pucRspData[DDCCI_FAC_OFFSET_REG_VALUE_LSB] = uiReadVal & 0xFF;
  1137. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1138. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1139. // DDC_PRINT("Reg Read, ReadVal: %d, uiOpsAddr: 0x%08x", uiReadVal, uiOpsAddr);
  1140. break;
  1141. }
  1142. case DDCCI_FAC_CMD_DDR:
  1143. {
  1144. UINT32 uiData;
  1145. uiDataLen = (pucData[DDCCI_FAC_OFFSET_READ_DDR_LEN_HIGH] << 8) | pucData[DDCCI_FAC_OFFSET_READ_DDR_LEN_LOW];
  1146. usRspLen = uiDataLen + DDCCI_FAC_DDC_CMD_FIX_LEN + DDCCI_FAC_DDC_HEADER_LEN;
  1147. usProtocolLen = usRspLen - DDCCI_FAC_DDC_HEADER_LEN;
  1148. pucRspData = HV_MALLOC(usRspLen);
  1149. if (NULL == pucRspData)
  1150. {
  1151. break;
  1152. }
  1153. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_R_DDR_RSP_DATA_START);
  1154. pucValidData = HV_MALLOC(uiDataLen);
  1155. if (NULL == pucValidData)
  1156. {
  1157. break;
  1158. }
  1159. for (UINT32 uiId = 0; uiId < uiDataLen; uiId++)
  1160. {
  1161. // 如果地址是4字节对齐的,且剩余长度大于等于4字节,则按照32bit读取
  1162. if (((uiOpsAddr + uiId) % 4 == 0) && (uiDataLen - uiId >= 4))
  1163. {
  1164. uiData = HV_R32(uiOpsAddr + uiId);
  1165. pucValidData[uiId + 3] = (uiData >> 24) & 0xFF;
  1166. pucValidData[uiId + 2] = (uiData >> 16) & 0xFF;
  1167. pucValidData[uiId + 1] = (uiData >> 8) & 0xFF;
  1168. pucValidData[uiId] = uiData & 0xFF;
  1169. uiId += 3; // 因为已经读取了4字节,所以增加3
  1170. }
  1171. else
  1172. {
  1173. // 否则,按照1字节读取
  1174. uiData = HV_R8(uiOpsAddr + uiId);
  1175. pucValidData[uiId] = uiData & 0xFF;
  1176. }
  1177. }
  1178. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_R_DDR_RSP_DATA_START, pucValidData, uiDataLen);
  1179. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1180. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1181. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1182. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1183. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1184. // DDC_PRINT("DDR Read, Len: %d, uiOpsAddr: 0x%08x", uiDataLen, uiOpsAddr);
  1185. break;
  1186. }
  1187. case DDCCI_FAC_CMD_DYNAMICPANEL:
  1188. {
  1189. UCHAR8 ucPanelEn = 0;
  1190. UCHAR8 ucPanelNum = 0;
  1191. UCHAR8 ucPanelId = 0;
  1192. Hv_Mw_Factory_GetDynamicPanelInfo(&ucPanelEn, &ucPanelId, &ucPanelNum);
  1193. usRspLen = DDCCI_FAC_READ_PQ_CMD_RSP_LEN;
  1194. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1195. pucRspData = HV_MALLOC(usRspLen);
  1196. if (NULL == pucRspData)
  1197. {
  1198. break;
  1199. }
  1200. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1201. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1202. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1203. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1204. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1205. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB] = ucPanelEn;
  1206. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_2ND] = ucPanelNum;
  1207. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_3RD] = ucPanelId;
  1208. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_LSB] = 0x00;
  1209. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1210. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1211. DDC_PRINT("read dynamci panel");
  1212. break;
  1213. }
  1214. case DDCCI_FAC_CMD_HDCP:
  1215. {
  1216. uiDbAddr = ((UINT32)(Hv_Common_Db_GetHDCPDataDBRegionPtr())) + OFFSET_OF(HDCPDataDBRegion, stKey);
  1217. // HDCPKeyDataDBRegion,长度1152
  1218. uiDataLen = sizeof(HDCPKeyDataDBRegion);
  1219. usRspLen = uiDataLen + DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_LEN;
  1220. usProtocolLen = uiDataLen + DDCCI_FAC_DDC_CMD_LEN;
  1221. pucRspData = HV_MALLOC(usRspLen);
  1222. if (NULL == pucRspData)
  1223. {
  1224. break;
  1225. }
  1226. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1227. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1228. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1229. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1230. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1231. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen); //拷贝1152个hdcp结构体数据,HDCPKeyDataDBRegion
  1232. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1233. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1234. DDC_PRINT("read hdcp");
  1235. break;
  1236. }
  1237. case DDCCI_FAC_CMD_GAMMAT:
  1238. {
  1239. break;
  1240. }
  1241. case DDCCI_FAC_CMD_COLORTEMP_COOL:
  1242. case DDCCI_FAC_CMD_COLORTEMP_WARM:
  1243. case DDCCI_FAC_CMD_COLORTEMP_STANDARD:
  1244. case DDCCI_FAC_CMD_COLORTEMP_P3:
  1245. case DDCCI_FAC_CMD_COLORTEMP_SRGB:
  1246. case DDCCI_FAC_CMD_COLORTEMP_EYECARE:
  1247. {
  1248. uiDbAddr = ((UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()));
  1249. if (DDCCI_FAC_CMD_COLORTEMP_COOL == usCmd)
  1250. {
  1251. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stColTempCool);
  1252. }
  1253. else if (DDCCI_FAC_CMD_COLORTEMP_WARM == usCmd)
  1254. {
  1255. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stColTempWarm);
  1256. }
  1257. else if (DDCCI_FAC_CMD_COLORTEMP_STANDARD == usCmd)
  1258. {
  1259. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stColTempStandard);
  1260. }
  1261. else if (DDCCI_FAC_CMD_COLORTEMP_P3 == usCmd)
  1262. {
  1263. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stColTempP3);
  1264. }
  1265. else if (DDCCI_FAC_CMD_COLORTEMP_SRGB == usCmd)
  1266. {
  1267. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stColTempSrgb);
  1268. }
  1269. else // if (DDCCI_FAC_CMD_COLORTEMP_EYECARE == usCmd)
  1270. {
  1271. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stColTempEyeCare);
  1272. }
  1273. // 色温3个值,rgb gain
  1274. uiDataLen = 3;
  1275. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1276. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1277. pucRspData = HV_MALLOC(usRspLen);
  1278. if (NULL == pucRspData)
  1279. {
  1280. break;
  1281. }
  1282. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1283. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1284. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1285. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1286. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1287. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1288. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1289. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1290. DDC_PRINT("read colortemp %d", usCmd);
  1291. break;
  1292. }
  1293. case DDCCI_FAC_CMD_FACWEEK:
  1294. case DDCCI_FAC_CMD_FACYEAR:
  1295. {
  1296. // 1个字节
  1297. uiDataLen = 1;
  1298. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1299. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1300. pucRspData = HV_MALLOC(usRspLen);
  1301. if (NULL == pucRspData)
  1302. {
  1303. break;
  1304. }
  1305. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1306. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1307. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1308. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1309. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1310. if (DDCCI_FAC_CMD_FACWEEK == usCmd)
  1311. {
  1312. uiDbAddr = (UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()) + OFFSET_OF(FactoryDataDBRegion, ucFactWeek);
  1313. }
  1314. else // if (DDCCI_FAC_CMD_FACYEAR == usCmd)
  1315. {
  1316. uiDbAddr = (UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()) + OFFSET_OF(FactoryDataDBRegion, ucFactYear);
  1317. }
  1318. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1319. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1320. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1321. DDC_PRINT("read factory week&year %d", usCmd);
  1322. break;
  1323. }
  1324. case DDCCI_FAC_CMD_FACBRIGHTNESS:
  1325. {
  1326. // 1个字节
  1327. uiDataLen = 1;
  1328. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1329. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1330. pucRspData = HV_MALLOC(usRspLen);
  1331. if(NULL == pucRspData)
  1332. {
  1333. break;
  1334. }
  1335. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1336. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1337. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1338. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1339. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1340. uiDbAddr = (UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()) + OFFSET_OF(FactoryDataDBRegion, ucFactoryBrightness);
  1341. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1342. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1343. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1344. DDC_PRINT("read factory brightness");
  1345. break;
  1346. }
  1347. case DDCCI_FAC_CMD_DEFAULT_LANG:
  1348. {
  1349. // 1个字节
  1350. uiDataLen = 1;
  1351. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1352. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1353. pucRspData = HV_MALLOC(usRspLen);
  1354. if (NULL == pucRspData)
  1355. {
  1356. break;
  1357. }
  1358. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1359. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1360. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1361. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1362. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1363. uiDbAddr = (UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()) + OFFSET_OF(FactoryDataDBRegion, ucDefaultLanguage);
  1364. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1365. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1366. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1367. DDC_PRINT("read default lang");
  1368. break;
  1369. }
  1370. case DDCCI_FAC_CMD_FACCONTRAST:
  1371. {
  1372. // 1个字节
  1373. uiDataLen = 1;
  1374. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1375. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1376. pucRspData = HV_MALLOC(usRspLen);
  1377. if (NULL == pucRspData)
  1378. {
  1379. break;
  1380. }
  1381. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1382. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1383. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1384. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1385. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1386. uiDbAddr = (UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()) + OFFSET_OF(FactoryDataDBRegion, ucFactoryContrast);
  1387. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1388. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1389. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1390. DDC_PRINT("read default lang");
  1391. break;
  1392. }
  1393. case DDCCI_FAC_CMD_GAMUT_NATIVE:
  1394. case DDCCI_FAC_CMD_GAMUT_SRGB:
  1395. case DDCCI_FAC_CMD_GAMUT_709:
  1396. case DDCCI_FAC_CMD_GAMUT_P3:
  1397. case DDCCI_FAC_CMD_GAMUT_HDR:
  1398. case DDCCI_FAC_CMD_GAMUT_ADOBE:
  1399. {
  1400. uiDbAddr = (UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr());
  1401. if (DDCCI_FAC_CMD_GAMUT_NATIVE == usCmd)
  1402. {
  1403. DDC_PRINT("read gam native");
  1404. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stGamutNative);
  1405. }
  1406. else if (DDCCI_FAC_CMD_GAMUT_SRGB == usCmd)
  1407. {
  1408. DDC_PRINT("read gam srgb");
  1409. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stGamutSrgb);
  1410. }
  1411. else if (DDCCI_FAC_CMD_GAMUT_709 == usCmd)
  1412. {
  1413. DDC_PRINT("read gam 709");
  1414. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stGamut709);
  1415. }
  1416. else if (DDCCI_FAC_CMD_GAMUT_P3 == usCmd)
  1417. {
  1418. DDC_PRINT("read gam p3");
  1419. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stGamutP3);
  1420. }
  1421. else if (DDCCI_FAC_CMD_GAMUT_HDR == usCmd)
  1422. {
  1423. DDC_PRINT("read gam hdr");
  1424. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stGamutHdr);
  1425. }
  1426. else // if (DDCCI_FAC_CMD_GAMUT_ADOBE == usCmd)
  1427. {
  1428. DDC_PRINT("read gam adobe");
  1429. uiDbAddr += OFFSET_OF(FactoryDataDBRegion, stGamutAdobe);
  1430. }
  1431. uiDataLen = sizeof(GamutSet);
  1432. usRspLen = uiDataLen + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1433. usProtocolLen = uiDataLen + DDCCI_FAC_DDC_CMD_LEN;
  1434. pucRspData = HV_MALLOC(usRspLen);
  1435. if (NULL == pucRspData)
  1436. {
  1437. break;
  1438. }
  1439. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1440. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1441. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1442. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1443. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1444. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1445. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1446. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1447. break;
  1448. }
  1449. case DDCCI_FAC_CMD_HDMIEDID:
  1450. {
  1451. uiDbAddr = (UINT32)(Hv_Common_Db_GetHdmiEdidDBRegionPtr()) + OFFSET_OF(HdmiEdidDBRegion, astHdmiEdid);
  1452. uiDataLen = sizeof(EdidDataDBRegion) * HDMI_EDID_MAX_NUMBER;
  1453. usRspLen = uiDataLen + DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_LEN;
  1454. usProtocolLen = uiDataLen + DDCCI_FAC_DDC_CMD_LEN;
  1455. pucRspData = HV_MALLOC(usRspLen);
  1456. if (NULL == pucRspData)
  1457. {
  1458. break;
  1459. }
  1460. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1461. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1462. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1463. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1464. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1465. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1466. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1467. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1468. DDC_PRINT("read hdmi edid");
  1469. break;
  1470. }
  1471. case DDCCI_FAC_CMD_HDMI1EDID:
  1472. {
  1473. uiDbAddr = (UINT32)(Hv_Common_Db_GetHdmi1EdidDBRegionPtr()) + OFFSET_OF(HdmiEdidDBRegion, astHdmiEdid);
  1474. uiDataLen = sizeof(EdidDataDBRegion) * HDMI_EDID_MAX_NUMBER;
  1475. usRspLen = uiDataLen + DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_LEN;
  1476. usProtocolLen = uiDataLen + DDCCI_FAC_DDC_CMD_LEN;
  1477. pucRspData = HV_MALLOC(usRspLen);
  1478. if (NULL == pucRspData)
  1479. {
  1480. break;
  1481. }
  1482. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1483. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1484. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1485. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1486. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1487. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1488. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1489. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1490. DDC_PRINT("read hdmi1 edid");
  1491. break;
  1492. }
  1493. case DDCCI_FAC_CMD_DPEDID:
  1494. {
  1495. uiDbAddr = (UINT32)(Hv_Common_Db_GetDpEdidDBRegionPtr()) + OFFSET_OF(DpEdidDBRegion, astDpEdid);
  1496. uiDataLen = sizeof(EdidDataDBRegion) * DP_EDID_MAX_NUMBER;
  1497. usRspLen = uiDataLen + DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_LEN;
  1498. usProtocolLen = uiDataLen + DDCCI_FAC_DDC_CMD_LEN;
  1499. pucRspData = HV_MALLOC(usRspLen);
  1500. if (NULL == pucRspData)
  1501. {
  1502. break;
  1503. }
  1504. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1505. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1506. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1507. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1508. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1509. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1510. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1511. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1512. DDC_PRINT("read dp edid");
  1513. break;
  1514. }
  1515. case DDCCI_FAC_CMD_DP1EDID:
  1516. {
  1517. uiDbAddr = (UINT32)(Hv_Common_Db_GetDp1EdidDBRegionPtr()) + OFFSET_OF(DpEdidDBRegion, astDpEdid);
  1518. uiDataLen = sizeof(EdidDataDBRegion) * DP_EDID_MAX_NUMBER;
  1519. usRspLen = uiDataLen + DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_LEN;
  1520. usProtocolLen = uiDataLen + DDCCI_FAC_DDC_CMD_LEN;
  1521. pucRspData = HV_MALLOC(usRspLen);
  1522. if (NULL == pucRspData)
  1523. {
  1524. break;
  1525. }
  1526. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1527. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1528. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1529. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1530. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1531. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1532. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1533. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1534. DDC_PRINT("read dp1 edid");
  1535. break;
  1536. }
  1537. case DDCCI_FAC_CMD_GMACOMPRESS:
  1538. {
  1539. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1540. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1541. pucRspData = HV_MALLOC(usRspLen);
  1542. if (NULL == pucRspData)
  1543. {
  1544. break;
  1545. }
  1546. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1547. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1548. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1549. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1550. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1551. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB] = HV_PQ_DATABASE_GET(GammaData, ucGammaCompress);
  1552. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1553. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1554. DDC_PRINT("read gam compress");
  1555. break;
  1556. }
  1557. case DDCCI_FAC_CMD_SETBURNOSD:
  1558. {
  1559. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1560. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1561. pucRspData = HV_MALLOC(usRspLen);
  1562. if (NULL == pucRspData)
  1563. {
  1564. break;
  1565. }
  1566. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1567. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1568. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1569. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1570. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1571. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB] = HV_COMMON_DATABASE_GET(SystemData, bBurnInEnable);
  1572. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1573. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1574. DDC_PRINT("read burnin enable");
  1575. break;
  1576. }
  1577. case DDCCI_FAC_CMD_BRIGHTNESS:
  1578. {
  1579. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1580. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1581. pucRspData = HV_MALLOC(usRspLen);
  1582. if (NULL == pucRspData)
  1583. {
  1584. break;
  1585. }
  1586. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1587. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1588. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1589. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1590. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1591. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB] = Hv_App_PQ_GetBrightness();
  1592. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1593. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1594. DDC_PRINT("read brightness");
  1595. break;
  1596. }
  1597. case DDCCI_FAC_CMD_BRIGHTNESS_NIT:
  1598. {
  1599. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1600. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1601. pucRspData = HV_MALLOC(usRspLen);
  1602. if (NULL == pucRspData)
  1603. {
  1604. break;
  1605. }
  1606. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1607. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1608. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1609. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1610. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1611. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB] = Hv_App_PQ_GetBrightness();
  1612. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1613. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1614. DDC_PRINT("read brightness nit");
  1615. break;
  1616. }
  1617. case DDCCI_FAC_CMD_ENERGY:
  1618. {
  1619. uiDataLen = 1;
  1620. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1621. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1622. pucRspData = HV_MALLOC(usRspLen);
  1623. if (NULL == pucRspData)
  1624. {
  1625. break;
  1626. }
  1627. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1628. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1629. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1630. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1631. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1632. uiDbAddr = (UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()) + OFFSET_OF(FactoryDataDBRegion, ucFactoryEnergy);
  1633. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1634. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1635. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1636. DDC_PRINT("read energy");
  1637. break;
  1638. }
  1639. case DDCCI_FAC_CMD_SHARPNESS:
  1640. {
  1641. uiDataLen = 1;
  1642. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1643. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1644. pucRspData = HV_MALLOC(usRspLen);
  1645. if (NULL == pucRspData)
  1646. {
  1647. break;
  1648. }
  1649. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1650. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1651. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1652. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1653. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1654. uiDbAddr = (UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()) + OFFSET_OF(FactoryDataDBRegion, ucFactorySharpness);
  1655. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), uiDataLen);
  1656. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1657. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1658. DDC_PRINT("read sharpness");
  1659. break;
  1660. }
  1661. case DDCCI_FAC_CMD_PQ_RGB_COEF:
  1662. {
  1663. HV_R32_DECL_VAR();
  1664. USHORT16 usR = HV_R32_FIELD(DISP_TOP_SUB_LDG_0C, reg_main_csc_cr_r_coef);
  1665. USHORT16 usG = HV_R32_FIELD(DISP_TOP_SUB_LDG_24, reg_main_csc_y_g_coef);
  1666. USHORT16 usB = HV_R32_FIELD(DISP_TOP_SUB_LDG_30, reg_main_csc_cb_b_coef);
  1667. uiDataLen = 6;
  1668. usRspLen = uiDataLen + DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_LEN;
  1669. usProtocolLen = uiDataLen + DDCCI_FAC_DDC_CMD_LEN;
  1670. pucRspData = HV_MALLOC(usRspLen);
  1671. if (NULL == pucRspData)
  1672. {
  1673. break;
  1674. }
  1675. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1676. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1677. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1678. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1679. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1680. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB] = usR >> 8;
  1681. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_2ND] = usR & 0xFF;
  1682. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_3RD] = usG >> 8;
  1683. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_LSB] = usG & 0xFF;
  1684. pucRspData[10] = usB >> 8;
  1685. pucRspData[11] = usB & 0xFF;
  1686. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1687. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1688. DDC_PRINT("read RGB Coef, 0x%04x, 0x%04x, 0x%04x", usR, usG, usB);
  1689. break;
  1690. }
  1691. case DDCCI_FAC_CMD_PQ_WEEK_YEAR:
  1692. {
  1693. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1694. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1695. pucRspData = HV_MALLOC(usRspLen);
  1696. if (NULL == pucRspData)
  1697. {
  1698. break;
  1699. }
  1700. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1701. HV_MEMCPY(pucRspData, pucData, DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB);
  1702. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1703. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1704. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1705. uiDbAddr = (UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()) + OFFSET_OF(FactoryDataDBRegion, ucFactWeek);
  1706. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB, (void *)(uiDbAddr), 1);
  1707. uiDbAddr = (UINT32)(Hv_Common_Db_GetDefaultFactoryDataDBRegionPtr()) + OFFSET_OF(FactoryDataDBRegion, ucFactYear);
  1708. HV_MEMCPY(pucRspData + DDCCI_FAC_OFFSET_PQ_CMD_VALUE_2ND, (void *)(uiDbAddr), 1);
  1709. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1710. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1711. DDC_PRINT("read factory week:%d, year:%d", pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB], pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_2ND]);
  1712. break;
  1713. }
  1714. case DDCCI_FAC_CMD_CM64:
  1715. {
  1716. break;
  1717. }
  1718. case DDCCI_FAC_CMD_HUE:
  1719. {
  1720. break;
  1721. }
  1722. case DDCCI_FAC_CMD_SATURATION:
  1723. {
  1724. break;
  1725. }
  1726. case DDCCI_FAC_CMD_DLC:
  1727. {
  1728. break;
  1729. }
  1730. case DDCCI_FAC_CMD_DCR:
  1731. {
  1732. break;
  1733. }
  1734. case DDCCI_FAC_CMD_COLORSPACE:
  1735. {
  1736. break;
  1737. }
  1738. case DDCCI_FAC_CMD_RGAIN:
  1739. {
  1740. break;
  1741. }
  1742. case DDCCI_FAC_CMD_GGAIN:
  1743. {
  1744. break;
  1745. }
  1746. case DDCCI_FAC_CMD_BGAIN:
  1747. {
  1748. break;
  1749. }
  1750. case DDCCI_FAC_CMD_ROFFSET:
  1751. {
  1752. break;
  1753. }
  1754. case DDCCI_FAC_CMD_GOFFSET:
  1755. {
  1756. break;
  1757. }
  1758. case DDCCI_FAC_CMD_BOFFSET:
  1759. {
  1760. break;
  1761. }
  1762. case DDCCI_FAC_CMD_RED_HUE:
  1763. {
  1764. break;
  1765. }
  1766. case DDCCI_FAC_CMD_RED_SAT:
  1767. {
  1768. break;
  1769. }
  1770. case DDCCI_FAC_CMD_RED_LUM:
  1771. {
  1772. break;
  1773. }
  1774. case DDCCI_FAC_CMD_GREEN_HUE:
  1775. {
  1776. break;
  1777. }
  1778. case DDCCI_FAC_CMD_GREEN_SAT:
  1779. {
  1780. break;
  1781. }
  1782. case DDCCI_FAC_CMD_GREEN_LUM:
  1783. {
  1784. break;
  1785. }
  1786. case DDCCI_FAC_CMD_BLUE_HUE:
  1787. {
  1788. break;
  1789. }
  1790. case DDCCI_FAC_CMD_BLUE_SAT:
  1791. {
  1792. break;
  1793. }
  1794. case DDCCI_FAC_CMD_BLUE_LUM:
  1795. {
  1796. break;
  1797. }
  1798. case DDCCI_FAC_CMD_CYAN_HUE:
  1799. {
  1800. break;
  1801. }
  1802. case DDCCI_FAC_CMD_CYAN_SAT:
  1803. {
  1804. break;
  1805. }
  1806. case DDCCI_FAC_CMD_CYAN_LUM:
  1807. {
  1808. break;
  1809. }
  1810. case DDCCI_FAC_CMD_YELLOW_HUE:
  1811. {
  1812. break;
  1813. }
  1814. case DDCCI_FAC_CMD_YELLOW_SAT:
  1815. {
  1816. break;
  1817. }
  1818. case DDCCI_FAC_CMD_YELLOW_LUM:
  1819. {
  1820. break;
  1821. }
  1822. case DDCCI_FAC_CMD_MAGENTA_HUE:
  1823. {
  1824. break;
  1825. }
  1826. case DDCCI_FAC_CMD_MAGENTA_SAT:
  1827. {
  1828. break;
  1829. }
  1830. case DDCCI_FAC_CMD_MAGENTA_LUM:
  1831. {
  1832. break;
  1833. }
  1834. case DDCCI_FAC_CMD_PWM:
  1835. {
  1836. break;
  1837. }
  1838. case DDCCI_FAC_CMD_SET_FR:
  1839. {
  1840. break;
  1841. }
  1842. case DDCCI_FAC_CMD_SIMKEY0:
  1843. {
  1844. break;
  1845. }
  1846. case DDCCI_FAC_CMD_SIMKEY1:
  1847. {
  1848. break;
  1849. }
  1850. case DDCCI_FAC_CMD_SIMKEY2:
  1851. {
  1852. break;
  1853. }
  1854. case DDCCI_FAC_CMD_SIMKEY3:
  1855. {
  1856. break;
  1857. }
  1858. case DDCCI_FAC_CMD_SIMKEY4:
  1859. {
  1860. break;
  1861. }
  1862. case DDCCI_FAC_CMD_GAMMA_MEA:
  1863. {
  1864. break;
  1865. }
  1866. case DDCCI_FAC_CMD_DELTAE_MEA:
  1867. {
  1868. break;
  1869. }
  1870. case DDCCI_FAC_CMD_FACTORYMODE:
  1871. {
  1872. UCHAR8 ucVal = Hv_Mw_Factory_GetFactoryModeEnable();
  1873. usRspLen = DDCCI_FAC_DDC_HEADER_LEN + DDCCI_FAC_DDC_CMD_FIX_LEN;
  1874. usProtocolLen = DDCCI_FAC_DDC_CMD_FIX_LEN;
  1875. pucRspData = HV_MALLOC(usRspLen);
  1876. if (NULL == pucRspData)
  1877. {
  1878. break;
  1879. }
  1880. HV_MEMSET(pucRspData, 0x00, usRspLen);
  1881. pucRspData[DDCCI_FAC_OFFSET_SRC] = DDCCI_DEST_ADDRESS;
  1882. pucRspData[DDCCI_FAC_OFFSET_LEN_HIGH] = usProtocolLen >> 8;
  1883. pucRspData[DDCCI_FAC_OFFSET_LEN_LOW] = usProtocolLen & 0xFF;
  1884. pucRspData[DDCCI_FAC_OFFSET_PQ_CMD_VALUE_MSB] = !!ucVal;
  1885. pucRspData[usRspLen - 1] = Hv_App_Ddcci_GenFactoryChecksum(pucRspData);
  1886. Hv_App_Ddcci_SendData(ucSource, pucRspData, usRspLen);
  1887. DDC_PRINT( "read factory mode");
  1888. break;
  1889. }
  1890. case DDCCI_FAC_CMD_LUTINIT:
  1891. {
  1892. break;
  1893. }
  1894. case DDCCI_FAC_CMD_WCG_3D_LUT:
  1895. {
  1896. break;
  1897. }
  1898. default:
  1899. {
  1900. break;
  1901. }
  1902. }
  1903. if (NULL != pucValidData)
  1904. {
  1905. HV_FREE(pucValidData);
  1906. }
  1907. if (NULL != pucRspData)
  1908. {
  1909. HV_FREE(pucRspData);
  1910. }
  1911. return;
  1912. }
  1913. VOID Hv_App_Ddcci_ProcFactoryMsg(UCHAR8 ucSource, UCHAR8 *pucData, USHORT16 usLen)
  1914. {
  1915. if (DDCCI_FAC_CMD_TYPE_WRITE == pucData[DDCCI_FAC_OFFSET_CMD_TYPE])
  1916. {
  1917. Hv_App_Ddcci_ProcHisFactorySet(ucSource, pucData, usLen);
  1918. }
  1919. else
  1920. {
  1921. Hv_App_Ddcci_ProcHisFactoryGet(ucSource, pucData, usLen);
  1922. }
  1923. return;
  1924. }
  1925. VOID deltaCompress(UINT32 *puiInputArray, UINT32 uiArraySize, UCHAR8 *pucCompressedArray)
  1926. {
  1927. INT32 iPrevValue = 0;
  1928. INT32 iDelta;
  1929. UINT32 uiId = 0;
  1930. for (uiId = 0; uiId < uiArraySize; uiId++)
  1931. {
  1932. iDelta = puiInputArray[uiId] - iPrevValue;
  1933. if (iDelta > 16)
  1934. {
  1935. iDelta = 16;
  1936. }
  1937. if(iDelta < 0)
  1938. {
  1939. iDelta = 0;
  1940. }
  1941. if (uiId % 2 == 0)
  1942. {
  1943. pucCompressedArray[uiId / 2] = (iDelta & 0xf) << 4; // 存储高4位
  1944. }
  1945. else
  1946. {
  1947. pucCompressedArray[uiId / 2] |= (iDelta & 0xf); // 存储低4位
  1948. }
  1949. iPrevValue = puiInputArray[uiId];
  1950. }
  1951. }
  1952. // Input 1025 * 3 * 4 Bytes; output 514 * 3 Bytes
  1953. VOID Hv_App_GmaCompress(UINT32 *puiInput, UCHAR8 *pucOut)
  1954. {
  1955. deltaCompress(puiInput, 1026, pucOut);
  1956. deltaCompress(&puiInput[1025], 1026, &pucOut[513]);
  1957. deltaCompress(&puiInput[1025 * 2], 1026, &pucOut[513 * 2]);
  1958. return;
  1959. }