bb_cv.cpp
上传用户:gelin96
上传日期:2017-01-08
资源大小:20993k
文件大小:28k
源码类别:

MTK

开发平台:

C++ Builder

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*****************************************************************************
  36.  *
  37.  * Filename:
  38.  * ---------
  39.  *   bb_cv.cpp
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui META APP
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *  Baseband charger constant voltage source
  48.  *
  49.  * Author:
  50.  * -------
  51.  *  Andy Ueng (mtk00490)
  52.  *
  53.  *============================================================================
  54.  *             HISTORY
  55.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  56.  *------------------------------------------------------------------------------
  57.  * $Revision$
  58.  * $Modtime$
  59.  * $Log$
  60.  * 
  61.  *------------------------------------------------------------------------------
  62.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  63.  *============================================================================
  64.  ****************************************************************************/
  65. #include <IniFiles.hpp>
  66. #pragma hdrstop
  67. #ifndef  _BB_COMMON_H_
  68. #include "bb_common.h"
  69. #endif
  70. #ifndef  _MT6223_COMMON_H_
  71. #include "mt6223_common.h"
  72. #endif
  73. #ifndef  _MT6238_COMMON_H_
  74. #include "mt6238_common.h"
  75. #endif
  76. #ifndef  _BB_REG_H_
  77. #include "bb_reg.h"
  78. #endif
  79. #ifndef  _BB_CV_H_
  80. #include "bb_cv.h"
  81. #endif
  82. #ifndef  _MAN_ACTIVE_H_
  83. #include "man_active.h"
  84. #endif
  85. // misc
  86. #ifndef  _FT_UTILS_H_
  87. #include "ft_utils.h"
  88. #endif
  89. // NVRAM
  90. #ifndef  _MAN_FDM_H_
  91. #include "man_fdm.h"
  92. #endif
  93. //===========================================================================
  94. static CBBCV*  g_bb_cv_ptr;
  95. static bool g_bIsRunning = false;
  96. //===========================================================================
  97. static void  REQ_Set_CV_Cal_Register(void)
  98. {
  99.     g_bb_cv_ptr->REQ_Set_CV_Cal_Register();
  100. }
  101. //---------------------------------------------------------------------------
  102. static void __stdcall  CNF_ReadRegister(const RegRead_Cnf *cnf, const short token, void *usrData)
  103. {
  104.     g_bb_cv_ptr->CNF_ReadRegister(cnf, token, usrData);
  105. }
  106. //---------------------------------------------------------------------------
  107. //static void  REQ_WriteRegister( void )
  108. //{  g_bb_cv_ptr->REQ_WriteRegister( );
  109. //}
  110. //---------------------------------------------------------------------------
  111. static void __stdcall CNF_WriteRegister(const RegWrite_Cnf *cnf, const short token, void *usrData)
  112. {
  113.     g_bb_cv_ptr->CNF_WriteRegister( cnf, token, usrData );
  114. }
  115. //---------------------------------------------------------------------------
  116. static void CNF_ReadFromNVRAM(void)
  117. {
  118.     g_bb_cv_ptr->CNF_ReadFromNVRAM();
  119. }
  120. //---------------------------------------------------------------------------
  121. static void CNF_WriteToNVRAM(void)
  122. {
  123.     g_bb_cv_ptr->CNF_WriteToNVRAM();
  124. }
  125. //===========================================================================
  126. CBBCV::CBBCV( void )
  127. {
  128.     g_bIsRunning = false;
  129.     ConfirmCallback = 0;
  130. }
  131. //---------------------------------------------------------------------------
  132. CBBCV::~CBBCV( )
  133. {
  134.     g_bIsRunning = false;
  135.     ConfirmCallback = 0;
  136. }
  137. //---------------------------------------------------------------------------
  138. void CBBCV::Confirm(E_METAAPP_RESULT_T confirm_state)
  139. {
  140.     if (!g_bIsRunning)
  141.     {
  142.         return;
  143.     }
  144.     if (NULL == ConfirmCallback)
  145.     {
  146.         return;
  147.     }
  148.     m_eConfirmState = confirm_state;
  149.     if (m_eConfirmState != METAAPP_SUCCESS)
  150.     {
  151.         META_Cancel_r(m_META_HANDLE_Obj.Get_MainHandle(), m_sBBID_REG);
  152.     }
  153.     ActiveMan->SetActiveFunction(ConfirmCallback);
  154. }
  155. //===========================================================================
  156. //////////////////////////////   register    ////////////////////////////////
  157. //===========================================================================
  158. void CBBCV::REQ_Set_CV_Cal_Register_Start(BBCHIP_TYPE bb_chip)
  159. {
  160.     g_bb_cv_ptr = this;
  161.     g_bIsRunning = true;
  162.     m_eBbChip = bb_chip;
  163.     ActiveMan->SetActiveFunction(::REQ_Set_CV_Cal_Register);
  164. }
  165. //---------------------------------------------------------------------------
  166. void CBBCV::REQ_Set_CV_Cal_Register(void)
  167. {
  168.     if (!g_bIsRunning)
  169.     {
  170.         return;
  171.     }
  172.     switch (m_eBbChip)
  173.     {
  174.         case MT6223:
  175.         case MT6223P:
  176.         {
  177.             if (!REQ_Set_MT6223_CV_Cal_Register())
  178.             {
  179.                 Confirm(METAAPP_FAIL);
  180.                 return;
  181.             }
  182.         }
  183.         break;
  184.         case MT6235:
  185.         {
  186.             if (!REQ_Set_MT6235_CV_Cal_Register())
  187.             {
  188.                 Confirm(METAAPP_FAIL);
  189.                 return;
  190.             }
  191.         }
  192.         break;
  193.         case MT6238:
  194.         {
  195.             if (!REQ_Set_MT6238_CV_Cal_Register())
  196.             {
  197.                 Confirm(METAAPP_FAIL);
  198.                 return;
  199.             }
  200.         }
  201.         break;
  202.     }
  203.     Confirm(METAAPP_SUCCESS);
  204. }
  205. //-------------------------------------------------------------------------
  206. bool CBBCV::REQ_Set_MT6223_CV_Cal_Register(void)
  207. {
  208.     m_cCvStep = -1;
  209.     // disable charger mode
  210.     RegWrite_Req write_req;
  211.     write_req.addr = MT6223_CHARGER_CONTROL_ADDR;
  212.     write_req.value = 0x0000;
  213.     if (!REQ_WriteRegister(write_req))
  214.     {
  215.         return false;
  216.     }
  217.     // enable charger mode
  218.     write_req.value = 0x0081;
  219.     if (!REQ_WriteRegister(write_req))
  220.     {
  221.         return false;
  222.     }
  223.     unsigned char uc_check_cv_cal_reg[3];
  224.     uc_check_cv_cal_reg[0] = 0;
  225.     uc_check_cv_cal_reg[1] = 0;
  226.     unsigned char uc_cv_cal_reg[32][3] =
  227.     {
  228.         {0, 1, 4}, // step 0
  229.         {0, 1, 5}, //  1
  230.         {0, 1, 6}, //  2
  231.         {0, 1, 7}, //  3
  232.         {0, 1, 0}, //  4
  233.         {0, 1, 1}, //  5
  234.         {0, 1, 2}, //  6
  235.         {0, 1, 3}, //  7
  236.         {0, 0, 4}, //  8
  237.         {0, 0, 5}, //  9
  238.         {0, 0, 6}, // 10
  239.         {0, 0, 7}, // 11
  240.         {0, 0, 0}, // 12
  241.         {0, 0, 1}, // 13
  242.         {0, 0, 2}, // 14
  243.         {0, 0, 3}, // 15
  244.         {1, 1, 4}, // 16
  245.         {1, 1, 5}, // 17
  246.         {1, 1, 6}, // 18
  247.         {1, 1, 7}, // 19
  248.         {1, 1, 0}, // 20
  249.         {1, 1, 1}, // 21
  250.         {1, 1, 2}, // 22
  251.         {1, 1, 3}, // 23
  252.         {1, 0, 4}, // 24
  253.         {1, 0, 5}, // 25
  254.         {1, 0, 6}, // 26
  255.         {1, 0, 7}, // 27
  256.         {1, 0, 0}, // 28
  257.         {1, 0, 1}, // 29
  258.         {1, 0, 2}, // 30
  259.         {1, 0, 3}  // 31
  260.     };
  261.    // char c_reg_value[3];
  262.     for (int i=0; i<CV_CAL_STEP_NUM; i++)
  263.     {
  264.         bool b_match = false;
  265.         uc_check_cv_cal_reg[0] = uc_cv_cal_reg[i][0];
  266.         uc_check_cv_cal_reg[1] = uc_cv_cal_reg[i][1];
  267.         for (int chk_idx = i+1; chk_idx < CV_CAL_STEP_NUM; chk_idx++)
  268.         {
  269.             if ((uc_check_cv_cal_reg[0] == uc_cv_cal_reg[chk_idx][0]) &&
  270.                 (uc_check_cv_cal_reg[1] == uc_cv_cal_reg[chk_idx][1]) &&
  271.                 (uc_check_cv_cal_reg[2] == uc_cv_cal_reg[chk_idx][2])
  272.                )
  273.             {
  274.                 b_match = true;
  275.                 break;
  276.             }
  277.         }
  278.         if (!b_match)
  279.         {
  280.             S_BB_REG_BIT_SET_T set_req;
  281.             set_req.ui_addr  = MT6223_START_UP_ADDR;
  282.             // CKSEL
  283.             set_req.uc_value[0]     = uc_cv_cal_reg[i][0];
  284.             set_req.uc_bit_num[0]   = MT6223_CKSEL_BIT_NUM;
  285.             set_req.uc_start_bit[0] = MT6223_CKSEL_START_BIT;
  286.             // RESET_DRV
  287.             set_req.uc_value[1]     = uc_cv_cal_reg[i][1];
  288.             set_req.uc_bit_num[1]   = MT6223_RESET_DRV_BIT_NUM;
  289.             set_req.uc_start_bit[1] = MT6223_RESET_DRV_START_BIT;
  290.             if (!REQ_SetRegisterBit(set_req))
  291.             {
  292.                 return false;
  293.             }
  294.             set_req.ui_addr  = MT6223_CHARGER_CONTROL_ADDR;
  295.             // CHR_AUX
  296.             set_req.uc_value[0]     = uc_cv_cal_reg[i][2];
  297.             set_req.uc_bit_num[0]   = MT6223_CHR_AUX_BIT_NUM;
  298.             set_req.uc_start_bit[0] = MT6223_CHR_AUX_START_BIT;
  299.             // CHR_EN
  300.             set_req.uc_value[1]     = 1;
  301.             set_req.uc_bit_num[1]   = MT6223_CHR_EN_BIT_NUM;
  302.             set_req.uc_start_bit[1] = MT6223_CHR_EN_START_BIT;
  303.             if (!REQ_SetRegisterBit(set_req))
  304.             {
  305.                 return false;
  306.             }
  307.         }
  308.         else
  309.         {
  310.             S_BB_REG_BIT_SET_T set_req;
  311.             set_req.ui_addr  = MT6223_CHARGER_CONTROL_ADDR;
  312.             // CHR_AUX
  313.             set_req.uc_value[0]     = uc_cv_cal_reg[i][2];
  314.             set_req.uc_bit_num[0]   = MT6223_CHR_AUX_BIT_NUM;
  315.             set_req.uc_start_bit[0] = MT6223_CHR_AUX_START_BIT;
  316.             // CHR_EN
  317.             set_req.uc_value[1]     = 1;
  318.             set_req.uc_bit_num[1]   = MT6223_CHR_EN_BIT_NUM;
  319.             set_req.uc_start_bit[1] = MT6223_CHR_EN_START_BIT;
  320.             if (!REQ_SetRegisterBit(set_req))
  321.             {
  322.                 return false;
  323.             }
  324.             set_req.ui_addr  = MT6223_START_UP_ADDR;
  325.             // CKSEL
  326.             set_req.uc_value[0]     = uc_cv_cal_reg[i][0];
  327.             set_req.uc_bit_num[0]   = MT6223_CKSEL_BIT_NUM;
  328.             set_req.uc_start_bit[0] = MT6223_CKSEL_START_BIT;
  329.             // RESET_DRV
  330.             set_req.uc_value[1]     = uc_cv_cal_reg[i][1];
  331.             set_req.uc_bit_num[1]   = MT6223_RESET_DRV_BIT_NUM;
  332.             set_req.uc_start_bit[1] = MT6223_RESET_DRV_START_BIT;
  333.             if (!REQ_SetRegisterBit(set_req))
  334.             {
  335.                 return false;
  336.             }
  337.         }
  338.         uc_check_cv_cal_reg[2] = uc_cv_cal_reg[i][2];
  339.         // get CV flag
  340.         S_BB_REG_BIT_GET_T get_req;
  341.         get_req.ui_addr = MT6223_CHARGER_STATUS_ADDR;
  342.         get_req.uc_bit  = MT6223_CV_START_BIT;
  343.         unsigned char uc_cv_flag;
  344.         if (!REQ_GetRegisterBit(get_req, uc_cv_flag))
  345.         {
  346.             return false;
  347.         }
  348.         if (1 == uc_cv_flag)
  349.         {
  350.             m_cPMU = (uc_cv_cal_reg[i][0] << 4) |
  351.                      (uc_cv_cal_reg[i][1] << 3) |
  352.                       uc_cv_cal_reg[i][2];
  353.             m_cCvStep = i;
  354.             break;
  355.         }
  356.     }
  357.     return true;
  358. }
  359. //-------------------------------------------------------------------------
  360. bool CBBCV::REQ_Set_MT6235_CV_Cal_Register(void)
  361. {
  362. #if 0
  363.     m_cCvStep = -1;
  364.     // disable charger mode
  365.     RegWrite_Req write_req;
  366.     write_req.addr = MT6223_CHARGER_CONTROL_ADDR;
  367.     write_req.value = 0x0000;
  368.     if (!REQ_WriteRegister(write_req))
  369.     {
  370.         return false;
  371.     }
  372.     // enable charger mode
  373.     write_req.value = 0x0081;
  374.     if (!REQ_WriteRegister(write_req))
  375.     {
  376.         return false;
  377.     }
  378.     AnsiString as_cv_cal_reg[] =
  379.     {
  380.         "0,1,4", // step 0
  381.         "0,1,5", //  1
  382.         "0,1,6", //  2
  383.         "0,1,7", //  3
  384.         "0,1,0", //  4
  385.         "0,1,1", //  5
  386.         "0,1,2", //  6
  387.         "0,1,3", //  7
  388.         "0,0,4", //  8
  389.         "0,0,5", //  9
  390.         "0,0,6", // 10
  391.         "0,0,7", // 11
  392.         "0,0,0", // 12
  393.         "0,0,1", // 13
  394.         "0,0,2", // 14
  395.         "0,0,3", // 15
  396.         "1,1,4", // 16
  397.         "1,1,5", // 17
  398.         "1,1,6", // 18
  399.         "1,1,7", // 19
  400.         "1,1,0", // 20
  401.         "1,1,1", // 21
  402.         "1,1,2", // 22
  403.         "1,1,3", // 23
  404.         "1,0,4", // 24
  405.         "1,0,5", // 25
  406.         "1,0,6", // 26
  407.         "1,0,7", // 27
  408.         "1,0,0", // 28
  409.         "1,0,1", // 29
  410.         "1,0,2", // 30
  411.         "1,0,3"  // 31
  412.     };
  413.     char c_reg_value[3];
  414.     for (int i=0; i<CV_CAL_STEP_NUM; i++)
  415.     {
  416.         String_To_Array_Char(as_cv_cal_reg[i].c_str(), c_reg_value, 3);
  417.         // CKSEL
  418.         S_BB_REG_BIT_SET_T set_req;
  419.         set_req.ui_addr  = MT6223_START_UP_ADDR;
  420.         set_req.uc_value = c_reg_value[0];
  421.         set_req.uc_bit   = MT6223_CKSEL_BIT;
  422.         if (!REQ_SetRegisterBit(set_req))
  423.         {
  424.             return false;
  425.         }
  426.         // RESET_DRV
  427.         set_req.ui_addr  = MT6223_START_UP_ADDR;
  428.         set_req.uc_value = c_reg_value[1];
  429.         set_req.uc_bit   = MT6223_RESET_DRV_BIT;
  430.         if (!REQ_SetRegisterBit(set_req))
  431.         {
  432.             return false;
  433.         }
  434.         // CHR_AUX
  435.         set_req.ui_addr  = MT6223_CHARGER_CONTROL_ADDR;
  436.         for (int i=0; i<3; i++)
  437.         {
  438.             set_req.uc_value = (c_reg_value[2] & (0x1 << i)) >> i;
  439.             set_req.uc_bit   = MT6223_CHR_AUX_BIT + i;
  440.             if (!REQ_SetRegisterBit(set_req))
  441.             {
  442.                 return false;
  443.             }
  444.         }
  445.         // CHR_EN
  446.         set_req.ui_addr  = MT6223_CHARGER_CONTROL_ADDR;
  447.         set_req.uc_value = 1;
  448.         set_req.uc_bit   = 0;
  449.         if (!REQ_SetRegisterBit(set_req))
  450.         {
  451.             return false;
  452.         }
  453.         // get CV flag
  454.         S_BB_REG_BIT_GET_T get_req;
  455.         get_req.ui_addr = MT6223_CHARGER_STATUS_ADDR;
  456.         get_req.uc_bit  = MT6223_CV_BIT;
  457.         unsigned char uc_cv_flag;
  458.         if (!REQ_GetRegisterBit(get_req, uc_cv_flag))
  459.         {
  460.             return false;
  461.         }
  462.         if (1 == uc_cv_flag)
  463.         {
  464.             m_cPMU = (c_reg_value[0] << 4) |
  465.                      (c_reg_value[1] << 3) |
  466.                       c_reg_value[2];
  467.             m_cCvStep = i;
  468.             break;
  469.         }
  470.     }
  471. #endif
  472.     return true;
  473. }
  474. //-------------------------------------------------------------------------
  475. bool CBBCV::REQ_Set_MT6238_CV_Cal_Register(void)
  476. {
  477. #if 0
  478.     m_cCvStep = -1;
  479.     // disable charger mode
  480.     RegWrite_Req write_req;
  481.     write_req.addr = MT6238_CHARGER_CONTROL_ADDR;
  482.     write_req.value = 0x0000;
  483.     if (!REQ_WriteRegister(write_req))
  484.     {
  485.         return false;
  486.     }
  487.     // enable charger mode
  488.     write_req.value = 0x0081;
  489.     if (!REQ_WriteRegister(write_req))
  490.     {
  491.         return false;
  492.     }
  493.     AnsiString as_cv_cal_reg[] =
  494.     {
  495.         "0,1,4", // step 0
  496.         "0,1,5", //  1
  497.         "0,1,6", //  2
  498.         "0,1,7", //  3
  499.         "0,1,0", //  4
  500.         "0,1,1", //  5
  501.         "0,1,2", //  6
  502.         "0,1,3", //  7
  503.         "0,0,4", //  8
  504.         "0,0,5", //  9
  505.         "0,0,6", // 10
  506.         "0,0,7", // 11
  507.         "0,0,0", // 12
  508.         "0,0,1", // 13
  509.         "0,0,2", // 14
  510.         "0,0,3", // 15
  511.         "1,1,4", // 16
  512.         "1,1,5", // 17
  513.         "1,1,6", // 18
  514.         "1,1,7", // 19
  515.         "1,1,0", // 20
  516.         "1,1,1", // 21
  517.         "1,1,2", // 22
  518.         "1,1,3", // 23
  519.         "1,0,4", // 24
  520.         "1,0,5", // 25
  521.         "1,0,6", // 26
  522.         "1,0,7", // 27
  523.         "1,0,0", // 28
  524.         "1,0,1", // 29
  525.         "1,0,2", // 30
  526.         "1,0,3"  // 31
  527.     };
  528.     char c_reg_value[3];
  529.     for (int i=0; i<CV_CAL_STEP_NUM; i++)
  530.     {
  531.         String_To_Array_Char(as_cv_cal_reg[i].c_str(), c_reg_value, 3);
  532.         // CKSEL
  533.         S_BB_REG_BIT_SET_T set_req;
  534.         set_req.ui_addr  = MT6223_START_UP_ADDR;
  535.         set_req.uc_value = c_reg_value[0];
  536.         set_req.uc_bit   = MT6223_CKSEL_BIT;
  537.         if (!REQ_SetRegisterBit(set_req))
  538.         {
  539.             return false;
  540.         }
  541.         // RESET_DRV
  542.         set_req.ui_addr  = MT6223_START_UP_ADDR;
  543.         set_req.uc_value = c_reg_value[1];
  544.         set_req.uc_bit   = MT6223_RESET_DRV_BIT;
  545.         if (!REQ_SetRegisterBit(set_req))
  546.         {
  547.             return false;
  548.         }
  549.         // CHR_AUX
  550.         set_req.ui_addr  = MT6223_CHARGER_CONTROL_ADDR;
  551.         for (int i=0; i<3; i++)
  552.         {
  553.             set_req.uc_value = (c_reg_value[2] & (0x1 << i)) >> i;
  554.             set_req.uc_bit   = MT6223_CHR_AUX_BIT + i;
  555.             if (!REQ_SetRegisterBit(set_req))
  556.             {
  557.                 return false;
  558.             }
  559.         }
  560.         // CHR_EN
  561.         set_req.ui_addr  = MT6223_CHARGER_CONTROL_ADDR;
  562.         set_req.uc_value = 1;
  563.         set_req.uc_bit   = 0;
  564.         if (!REQ_SetRegisterBit(set_req))
  565.         {
  566.             return false;
  567.         }
  568.         // get CV flag
  569.         S_BB_REG_BIT_GET_T get_req;
  570.         get_req.ui_addr = MT6223_CHARGER_STATUS_ADDR;
  571.         get_req.uc_bit  = MT6223_CV_BIT;
  572.         unsigned char uc_cv_flag;
  573.         if (!REQ_GetRegisterBit(get_req, uc_cv_flag))
  574.         {
  575.             return false;
  576.         }
  577.         if (1 == uc_cv_flag)
  578.         {
  579.             m_cPMU = (c_reg_value[0] << 4) |
  580.                      (c_reg_value[1] << 3) |
  581.                       c_reg_value[2];
  582.             m_cCvStep = i;
  583.             break;
  584.         }
  585.     }
  586. #endif
  587.     return true;
  588. }
  589. //===========================================================================
  590. bool CBBCV::REQ_GetRegisterBit(S_BB_REG_BIT_GET_T get_req, unsigned char& uc_value)
  591. {
  592.     unsigned short us_value;
  593.     RegRead_Req read_req;
  594.     read_req.addr = get_req.ui_addr;
  595.     if (!REQ_ReadRegister(read_req, us_value))
  596.     {
  597.         return false;
  598.     }
  599.     uc_value = ((us_value & (1 << get_req.uc_bit)) >> get_req.uc_bit) & 0x01; 
  600.     return true;
  601. }
  602. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  603. bool CBBCV::REQ_SetRegisterBit(S_BB_REG_BIT_SET_T set_req)
  604. {
  605.     unsigned short us_value;
  606.     RegRead_Req read_req;
  607.     read_req.addr = set_req.ui_addr;
  608.     if (!REQ_ReadRegister(read_req, us_value))
  609.     {
  610.         return false;
  611.     }
  612.     for (int i = 0; i < 2; i++)
  613.     {
  614.         if (set_req.uc_bit_num[i] > 0)
  615.         {
  616.             for (int bit_idx = 0; bit_idx < set_req.uc_bit_num[i]; bit_idx++)
  617.             {
  618.                 if (set_req.uc_value[i] & (0x01 << bit_idx))
  619.                 {
  620.                     us_value |= (1 << (set_req.uc_start_bit[i] + bit_idx));
  621.                 }
  622.                 else
  623.                 {
  624.                     us_value  &= ~(1 << (set_req.uc_start_bit[i] + bit_idx));
  625.                 }
  626.             }
  627.         }
  628.     }
  629.     RegWrite_Req write_req;
  630.     write_req.addr = set_req.ui_addr;
  631.     write_req.value = us_value;
  632.     if (!REQ_WriteRegister(write_req))
  633.     {
  634.         return false;
  635.     }
  636.     return true;
  637. }
  638. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  639. bool CBBCV::REQ_ReadRegister(RegRead_Req req, unsigned short& us_value)
  640. {
  641.     DWORD wait_result;
  642.     m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  643.     ResetEvent(m_hEvent);
  644.     META_RESULT MetaResult = META_BB_RegRead_r(m_META_HANDLE_Obj.Get_MainHandle(), &req, ::CNF_ReadRegister, &m_sBBID_REG, NULL);
  645.     wait_result = WaitForSingleObject(m_hEvent, 5000);
  646.     if (WAIT_TIMEOUT == wait_result)
  647.     {
  648.         return false;
  649.     }
  650.     if ((MetaResult != META_SUCCESS) || (!m_bCnfOk))
  651.     {
  652.         return false;
  653.     }
  654.     us_value = m_usValue;
  655.     return true;
  656. }
  657. //-------------------------------------
  658. void __stdcall CBBCV::CNF_ReadRegister(const RegRead_Cnf *cnf, const short token, void *usrData)
  659. {
  660.     if (cnf->status != BB_STATUS_SUCCESS)
  661.     {
  662.         m_bCnfOk = false;
  663.         return;
  664.     }
  665.     m_bCnfOk = true;
  666.     m_usValue = cnf->value;
  667.     SetEvent(m_hEvent);
  668. }
  669. //===========================================================================
  670. bool CBBCV::REQ_WriteRegister(RegWrite_Req req)
  671. {
  672.     DWORD wait_result;
  673.     m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  674.     ResetEvent( m_hEvent );
  675.     META_RESULT MetaResult = META_BB_RegWrite_r(m_META_HANDLE_Obj.Get_MainHandle(), &req, ::CNF_WriteRegister, &m_sBBID_REG, NULL);
  676.     wait_result = WaitForSingleObject(m_hEvent, 5000);
  677.     if (WAIT_TIMEOUT == wait_result)
  678.     {
  679.         return false;
  680.     }
  681.     if ((MetaResult != META_SUCCESS) || (!m_bCnfOk))
  682.     {
  683.         return false;
  684.     }
  685.     return true;
  686. }
  687. //-------------------------------------
  688. void __stdcall CBBCV::CNF_WriteRegister(const RegWrite_Cnf *cnf, const short token, void *usrData)
  689. {
  690.     if (cnf->status != BB_STATUS_SUCCESS)
  691.     {
  692.         m_bCnfOk = false;
  693.         return;
  694.     }
  695.     m_bCnfOk = true;
  696.     SetEvent(m_hEvent);
  697. }
  698. //===========================================================================
  699. //////////////////////////////   NVRAM    ///////////////////////////////////
  700. //===========================================================================
  701. void CBBCV::REQ_Read_From_NVRAM_Start(void)
  702. {
  703.     g_bb_cv_ptr = this;
  704.     g_bIsRunning = true;
  705.     m_bDownloadTrigger = false;
  706.     REQ_Read_From_NVRAM();
  707. }
  708. //---------------------------------------------------------------------------
  709. void CBBCV::REQ_Read_From_NVRAM(void)
  710. {
  711.     if (!g_bIsRunning)
  712.     {
  713.         return;
  714.     }
  715.     META_RESULT MetaResult;
  716.     if (NULL == m_pcBuf)
  717.     {
  718.         MetaResult = META_NVRAM_GetRecLen("NVRAM_EF_SYS_CACHE_OCTET_LID",
  719.                                           (int *) &m_uiBufSize);
  720.         if (MetaResult != META_SUCCESS)
  721.         {
  722.             Confirm(METAAPP_FAIL);
  723.             return;
  724.         }
  725.         m_pcBuf = new char[m_uiBufSize];
  726.     }
  727.     NVRAMMan->ConfirmCallback = ::CNF_ReadFromNVRAM;
  728.     NVRAMMan->REQ_ReadNVRAM_Start("NVRAM_EF_SYS_CACHE_OCTET_LID",
  729.                                   NVRAM_SYS_CV_CALIBRATION_RID,
  730.                                   m_uiBufSize,
  731.                                   m_pcBuf);
  732. }
  733. //-------------------------------------
  734. void CBBCV::CNF_ReadFromNVRAM(void)
  735. {
  736.     if (!g_bIsRunning)
  737.     {
  738.         return;
  739.     }
  740.     E_METAAPP_RESULT_T state = NVRAMMan->Get_ConfirmState();
  741.     if (METAAPP_SUCCESS == state)
  742.     {
  743.         if (m_bDownloadTrigger)
  744.         {
  745.             REQ_Write_To_NVRAM();
  746.         }
  747.         else
  748.         {
  749.             META_RESULT MetaResult = META_NVRAM_GetRecFieldValue("NVRAM_EF_SYS_CACHE_OCTET_LID",
  750.                                         "CacheByte[0]",
  751.                                         m_pcBuf,
  752.                                         m_uiBufSize,
  753.                                         &m_cPMU,
  754.                                         sizeof(m_cPMU));
  755.             if (MetaResult != META_SUCCESS)
  756.             {
  757.                 Confirm(METAAPP_FAIL);
  758.                 return;
  759.             }
  760.             
  761.             Confirm(METAAPP_SUCCESS);
  762.         }
  763.     }
  764.     else
  765.     {
  766.         Confirm(state);
  767.     }
  768. }
  769. //===========================================================================
  770. void CBBCV::REQ_Write_To_NVRAM_Start(void)
  771. {
  772.     g_bb_cv_ptr = this;
  773.     g_bIsRunning = true;
  774.     m_bDownloadTrigger = true;
  775.     REQ_Read_From_NVRAM();
  776. }
  777. //---------------------------------------------------------------------------
  778. void CBBCV::REQ_Write_To_NVRAM(void)
  779. {
  780.     if (!g_bIsRunning)
  781.     {
  782.         return;
  783.     }
  784.     META_RESULT MetaResult;
  785.     if (NULL == m_pcBuf)
  786.     {
  787.         MetaResult = META_NVRAM_GetRecLen("NVRAM_EF_SYS_CACHE_OCTET_LID", (int *) &m_uiBufSize);
  788.         if (MetaResult!=META_SUCCESS)
  789.         {
  790.             Confirm(METAAPP_FAIL);
  791.             return;
  792.         }
  793.         m_pcBuf = new char[m_uiBufSize];
  794.     }
  795.     MetaResult = META_NVRAM_SetRecFieldValue("NVRAM_EF_SYS_CACHE_OCTET_LID",
  796.                                              "CacheByte[0]",
  797.                                              m_pcBuf,
  798.                                              m_uiBufSize,
  799.                                              &m_cPMU,
  800.                                              sizeof(m_cPMU)
  801.                                              );
  802.     if (MetaResult != META_SUCCESS)
  803.     {
  804.         Confirm(METAAPP_FAIL);
  805.         return;
  806.     }
  807.     NVRAMMan->ConfirmCallback = ::CNF_WriteToNVRAM;
  808.     NVRAMMan->REQ_WriteNVRAM_Start("NVRAM_EF_SYS_CACHE_OCTET_LID",
  809.                            NVRAM_SYS_CV_CALIBRATION_RID,
  810.                                    m_uiBufSize,
  811.                                    m_pcBuf);
  812. }
  813. //-------------------------------------
  814. void CBBCV::CNF_WriteToNVRAM(void)
  815. {
  816.     if (!g_bIsRunning)
  817.     {
  818.         return;
  819.     }
  820.     E_METAAPP_RESULT_T state = NVRAMMan->Get_ConfirmState();
  821.     Confirm(state);
  822.     
  823. }
  824. //===========================================================================
  825. //////////////////////////////// INI ////////////////////////////////////////
  826. //===========================================================================
  827. static const AnsiString as_SECTION_NAME = "CV calibration";
  828. static const AnsiString as_KEY_NAME = "PMU";
  829. //----------------------------------------------------------------------------
  830. bool CBBCV::CvSectionExist(char *filename)
  831. {
  832.     TIniFile *ini_file;
  833.     ini_file = new TIniFile(filename);
  834.     if (NULL == ini_file)
  835.     {
  836.         return false;
  837.     }
  838.     if (!ini_file->SectionExists(as_SECTION_NAME))
  839.     {
  840.         return false;
  841.     }
  842.     return true;
  843. }
  844. //-----------------------------------------------------------------------------
  845. bool CBBCV::REQ_Read_From_File(char *filename)
  846. {
  847.     TIniFile *ini_file;
  848.     ini_file = new TIniFile(filename);
  849.     if (NULL == ini_file)
  850.     {
  851.         return  false;
  852.     }
  853.     m_cPMU = ini_file->ReadInteger(as_SECTION_NAME,
  854.                                    as_KEY_NAME,
  855.                                    0);
  856.     delete ini_file;
  857.     return true;
  858. }
  859. //===========================================================================
  860. bool CBBCV::REQ_Write_To_File(char *filename)
  861. {
  862.     TIniFile *ini_file;
  863.     ini_file = new TIniFile(filename);
  864.     if (NULL == ini_file)
  865.     {
  866.         return  false;
  867.     }
  868.     ini_file->WriteString(as_SECTION_NAME,
  869.                           as_KEY_NAME,
  870.                           IntToStr(m_cPMU));
  871.     delete ini_file;
  872.     return true;
  873. }
  874. //===========================================================================
  875. ////////////////////////////  Global information  ///////////////////////////
  876. //===========================================================================
  877. E_METAAPP_RESULT_T CBBCV::Get_ConfirmState(void)
  878. {
  879.     return  m_eConfirmState;
  880. }
  881. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  882. char CBBCV::Get_PMU(void)
  883. {
  884.     return m_cPMU;
  885. }
  886. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  887. char CBBCV::Get_CvStep(void)
  888. {
  889.     return m_cCvStep;
  890. }