1 // Copyright (C) 2022 Beken Corporation
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "sys_hal.h"
16 #include "sys_driver.h"
17 #include "sys_driver_common.h"
18
sys_drv_usb_analog_phy_en(bool ctrl,void * arg)19 uint32_t sys_drv_usb_analog_phy_en(bool ctrl, void *arg)
20 {
21 uint32_t int_level = rtos_disable_int();
22
23 sys_hal_usb_analog_phy_en(ctrl);
24
25 rtos_enable_int(int_level);
26 return SYS_DRV_SUCCESS;
27 }
28
sys_drv_usb_analog_speed_en(bool ctrl,void * arg)29 uint32_t sys_drv_usb_analog_speed_en(bool ctrl, void *arg)
30 {
31 uint32_t int_level = rtos_disable_int();
32 uint32_t ret = SYS_DRV_FAILURE;
33 ret = sys_amp_res_acquire();
34 if(ret != BK_OK)
35 return ret;
36
37 sys_hal_usb_analog_speed_en(ctrl);
38
39 if(!ret)
40 ret = sys_amp_res_release();
41 if(ret != BK_OK)
42 return ret;
43
44 rtos_enable_int(int_level);
45 return SYS_DRV_SUCCESS;
46 }
47
sys_drv_usb_analog_ckmcu_en(bool ctrl,void * arg)48 uint32_t sys_drv_usb_analog_ckmcu_en(bool ctrl, void *arg)
49 {
50 uint32_t int_level = rtos_disable_int();
51 uint32_t ret = SYS_DRV_FAILURE;
52
53 ret = sys_amp_res_acquire();
54 if(ret != BK_OK)
55 return ret;
56
57 sys_hal_usb_analog_ckmcu_en(ctrl);
58
59 if(!ret)
60 ret = sys_amp_res_release();
61 if(ret != BK_OK)
62 return ret;
63
64 rtos_enable_int(int_level);
65 return SYS_DRV_SUCCESS;
66 }
67
sys_drv_usb_charge_start()68 void sys_drv_usb_charge_start()
69 {
70 /*
71 bk7271: usb charge:
72 SCTRL_BASE:0x00800000
73 Reg26 ana_reg4 bit[21] aud_pll_vsel
74 Reg26 ana_reg4 bit[19] hw :0 sw:1
75 Reg25 ana_reg3 bit[27:28] 11
76 Reg26 ana_reg4 bit[13:14] 11 dpll
77 Reg25 ana_reg3 bit[18:16] 111
78
79 please check bk7271 VS bk7256
80 */
81 }
82
sys_drv_usb_charge_stop(bool ctrl)83 void sys_drv_usb_charge_stop(bool ctrl)
84 {
85 uint32_t int_level = rtos_disable_int();
86
87 sys_hal_usb_enable_charge(ctrl);
88
89 rtos_enable_int(int_level);
90 }
91
sys_drv_usb_charge_ctrl(bool ctrl,void * arg)92 void sys_drv_usb_charge_ctrl(bool ctrl, void *arg)
93 {
94 uint32_t int_level = rtos_disable_int();
95
96 if(ctrl)
97 sys_drv_usb_charge_start();
98 else
99 sys_drv_usb_charge_stop(ctrl);
100
101 rtos_enable_int(int_level);
102 }
103
104 /*
105 * bk7271: usb charge calibration:
106 * SCTRL_BASE:0x00800000
107 * nternal hardware calibration
108 * lcf calibration
109 * Added 5V voltage on Vusb
110 * Added 4.2V voltage on vbatterySet pwd=0
111 *
112 * Icp calibration
113 * Added parallel 60ohm resistor and 100nF capacitor from vbattery to ground.(Removed the external 4.2V)
114 * Set pwd=0
115 * Porb=0
116
117 * vcv calibration
118 * Added 5V voltage on Vusb
119 * Added 4.2V voltage on vbattery
120 * Set pwd=0
121 * vPorb=0
122 */
sys_drv_usb_charge_cal(sys_drv_charge_step_t step,void * arg)123 void sys_drv_usb_charge_cal(sys_drv_charge_step_t step, void *arg)
124 {
125 uint32_t int_level = rtos_disable_int();
126
127 switch(step) {
128 case CHARGE_STEP1: {
129 sys_hal_usb_charge_vlcf_cal();
130 break;
131 }
132 case CHARGE_STEP2: {
133 sys_hal_usb_charge_icp_cal();
134 break;
135 }
136 case CHARGE_STEP3: {
137 sys_hal_usb_charge_vcv_cal();
138 break;
139 }
140 case CHARGE_STEP4: {
141 sys_hal_usb_charge_get_cal();
142 break;
143 }
144 default:
145 break;
146 }
147
148 rtos_enable_int(int_level);
149 }
150
151