Import T713XXU2BQD3 kernel source changes
Change-Id: I9897a6d702844ebd56458d82d5b7be87ab5a907b
This commit is contained in:
parent
b964607f1f
commit
f525b5edb1
|
@ -86,12 +86,12 @@
|
||||||
SEC_BATTERY_FULL_CONDITION_VCELL */
|
SEC_BATTERY_FULL_CONDITION_VCELL */
|
||||||
battery,full_condition_type = <13>;
|
battery,full_condition_type = <13>;
|
||||||
battery,full_condition_soc = <93>;
|
battery,full_condition_soc = <93>;
|
||||||
battery,full_condition_vcell = <4300>;
|
battery,full_condition_vcell = <4250>;
|
||||||
|
|
||||||
battery,recharge_check_count = <1>;
|
battery,recharge_check_count = <1>;
|
||||||
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
||||||
battery,recharge_condition_soc = <98>;
|
battery,recharge_condition_soc = <98>;
|
||||||
battery,recharge_condition_vcell = <4340>;
|
battery,recharge_condition_vcell = <4300>;
|
||||||
|
|
||||||
battery,charging_total_time = <36000>;
|
battery,charging_total_time = <36000>;
|
||||||
battery,recharging_total_time = <5400>;
|
battery,recharging_total_time = <5400>;
|
||||||
|
@ -103,11 +103,11 @@
|
||||||
battery,swelling_low_temp_recov = <150>;
|
battery,swelling_low_temp_recov = <150>;
|
||||||
//battery,swelling_chg_current = <1500>;
|
//battery,swelling_chg_current = <1500>;
|
||||||
battery,swelling_high_chg_current = <2100>;
|
battery,swelling_high_chg_current = <2100>;
|
||||||
battery,swelling_low_chg_current = <1500>;
|
battery,swelling_low_chg_current = <2100>;
|
||||||
battery,swelling_full_check_current_2nd = <300>;
|
battery,swelling_full_check_current_2nd = <300>;
|
||||||
battery,swelling_drop_float_voltage = <4200>;
|
battery,swelling_drop_float_voltage = <4150>;
|
||||||
battery,swelling_high_rechg_voltage = <4150>;
|
battery,swelling_high_rechg_voltage = <4000>;
|
||||||
battery,swelling_low_rechg_voltage = <4050>;
|
battery,swelling_low_rechg_voltage = <4000>;
|
||||||
|
|
||||||
battery,self_discharging_temp_block = <600>;
|
battery,self_discharging_temp_block = <600>;
|
||||||
battery,self_discharging_volt_block = <4250>;
|
battery,self_discharging_volt_block = <4250>;
|
||||||
|
@ -116,12 +116,21 @@
|
||||||
|
|
||||||
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
||||||
|
|
||||||
|
/* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc */
|
||||||
|
battery,age_data = <
|
||||||
|
0 4350 4300 4250 93
|
||||||
|
200 4330 4280 4230 92
|
||||||
|
250 4310 4260 4210 91
|
||||||
|
300 4290 4240 4190 90
|
||||||
|
1000 4240 4190 4140 89
|
||||||
|
>;
|
||||||
|
|
||||||
charger {
|
charger {
|
||||||
status = "disable";
|
status = "disable";
|
||||||
/* Charger */
|
/* Charger */
|
||||||
battery,charger_name = "sm5703-charger";
|
battery,charger_name = "sm5703-charger";
|
||||||
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
||||||
battery,chg_float_voltage = <4390>;
|
battery,chg_float_voltage = <4350>;
|
||||||
|
|
||||||
battery,chg_polarity_en = <0>;
|
battery,chg_polarity_en = <0>;
|
||||||
battery,chg_gpio_status = <0>;
|
battery,chg_gpio_status = <0>;
|
||||||
|
@ -152,11 +161,12 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
battery_params {
|
battery_params {
|
||||||
|
/*SDI Battery data*/
|
||||||
battery,id = <(-1)>; /* -1 means auto, detected by F/G */
|
battery,id = <(-1)>; /* -1 means auto, detected by F/G */
|
||||||
battery0,battery_type = <4400>; /* 4200 4350 4400 */
|
battery0,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery0,battery_table0 = <0x1400 0x1B47 0x1BAD 0x1C95 0x1D75 0x1D8C 0x1DF1 0x1E32 0x1EC9 0x1F34 0x1FA6 0x1FD9 0x2072 0x20F3 0x22C4 0x2399>; /*SDI Battery data*/
|
battery0,battery_table0 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery0,battery_table1 = <0x1400 0x1B47 0x1BAD 0x1C95 0x1D75 0x1D8C 0x1DF1 0x1E32 0x1EC9 0x1F34 0x1FA6 0x1FD9 0x2072 0x20F3 0x22C4 0x2399>; /*SDI Battery data*/
|
battery0,battery_table1 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery0,battery_table2 = <0x0 0x3C 0x91 0x114 0x24d 0x380 0x70B 0xBBD 0x177A 0x1B00 0x1D59 0x1FB2 0x220B 0x2591 0x2EF5 0x2F19>; /*SDI Battery data*/
|
battery0,battery_table2 = <0x0 0x48 0x1B0 0x2A1 0x5AE 0x934 0xF13 0x14F1 0x19A3 0x1D29 0x1F82 0x21DB 0x2434 0x27BA 0x2CE4 0x2CFB>;
|
||||||
battery0,temp_std = <25>;
|
battery0,temp_std = <25>;
|
||||||
battery0,temp_offset = <10>;
|
battery0,temp_offset = <10>;
|
||||||
battery0,temp_offset_cal = <0x01>;
|
battery0,temp_offset_cal = <0x01>;
|
||||||
|
@ -173,12 +183,15 @@
|
||||||
battery0,curr_cal = <0x7C85>;
|
battery0,curr_cal = <0x7C85>;
|
||||||
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery0,v_alarm = <3200>;
|
battery0,v_alarm = <3200>;
|
||||||
battery0,data_ver = <0x01>;
|
battery0,v_max_table = <0x2268 0x2241 0x221A 0x21F3 0x2191>;
|
||||||
|
battery0,q_max_table = <0x2CE4 0x2C20 0x2B5B 0x2A96 0x28AA>;
|
||||||
|
battery0,data_ver = <0x02>;
|
||||||
|
|
||||||
battery1,battery_type = <4400>; /* 4200 4350 4400 */
|
/*ATL Battery data*/
|
||||||
battery1,battery_table0 = <0x1400 0x1B33 0x1C5F 0x1D61 0x1D83 0x1DF4 0x1E9C 0x1F06 0x1F68 0x1FFA 0x1FFA 0x2131 0x2169 0x2251 0x22C3 0x2399>; /*ATL Battery data*/
|
battery1,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery1,battery_table1 = <0x1400 0x1B33 0x1C5F 0x1D61 0x1D83 0x1DF4 0x1E9C 0x1F06 0x1F68 0x1FFA 0x1FFA 0x2131 0x2169 0x2251 0x22C3 0x2399>; /*ATL Battery data*/
|
battery1,battery_table0 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery1,battery_table2 = <0x0 0x6C 0x108 0x2A1 0x4EE 0xA9C 0x15FA 0x195B 0x1BA8 0x1F0A 0x1F0A 0x25D9 0x2826 0x2CB4 0x2EF5 0x2F19>; /*ATL Battery data*/
|
battery1,battery_table1 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
|
battery1,battery_table2 = <0x0 0x48 0x1B0 0x2A1 0x5AE 0x934 0xF13 0x14F1 0x19A3 0x1D29 0x1F82 0x21DB 0x2434 0x27BA 0x2CE4 0x2CFB>;
|
||||||
battery1,temp_std = <25>;
|
battery1,temp_std = <25>;
|
||||||
battery1,temp_offset = <10>;
|
battery1,temp_offset = <10>;
|
||||||
battery1,temp_offset_cal = <0x01>;
|
battery1,temp_offset_cal = <0x01>;
|
||||||
|
@ -195,6 +208,8 @@
|
||||||
battery1,curr_cal = <0x7D85>;
|
battery1,curr_cal = <0x7D85>;
|
||||||
battery1,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery1,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery1,v_alarm = <3200>;
|
battery1,v_alarm = <3200>;
|
||||||
battery1,data_ver = <0x01>;
|
battery1,v_max_table = <0x2268 0x2241 0x221A 0x21F3 0x2191>;
|
||||||
|
battery1,q_max_table = <0x2CE4 0x2C20 0x2B5B 0x2A96 0x28AA>;
|
||||||
|
battery1,data_ver = <0x02>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,14 +24,14 @@
|
||||||
|
|
||||||
battery,polling_time = <10 30 30 30 3600>;
|
battery,polling_time = <10 30 30 30 3600>;
|
||||||
|
|
||||||
battery,temp_table_adc = <27304 27367 27429 27491 27554 27616 27703 27790 27877 27964 28051 28138 28225 28312 28399 28486 28584 28681 28779 28877
|
battery,temp_table_adc = <26930 27304 27367 27429 27491 27554 27616 27703 27790 27877 27964 28051 28138 28225 28312 28399 28486 28584 28681 28779 28877
|
||||||
28974 29073 29173 29272 29371 29470 29532 29594 29718 29842 29965 30089 30219 30349 30544 30739 30816 30893 30970 31047
|
28974 29073 29173 29272 29371 29470 29532 29594 29718 29842 29965 30089 30219 30349 30544 30739 30816 30893 30970 31047
|
||||||
31123 31330 31536 31743 31949 32155 32311 32466 32621 32777 32932 33094 33257 33419 33581 33743 33941 34139 34337 34535
|
31123 31330 31536 31743 31949 32155 32311 32466 32621 32777 32932 33094 33257 33419 33581 33743 33941 34139 34337 34535
|
||||||
34733 34907 35081 35255 35429 35603 35780 35956 36133 36309 36486 36651 36816 36981 37146 37311 37479 37647 37815 37983
|
34733 34907 35081 35255 35429 35603 35780 35956 36133 36309 36486 36651 36816 36981 37146 37311 37479 37647 37815 37983
|
||||||
38151 38295 38439 38583 38727 38871 39013 39156 39298 39441
|
38151 38295 38439 38583 38727 38871 39013 39156 39298 39441
|
||||||
39583 39713 39842 39972 40101 40230 40332 40433 40535 40636 40738>;
|
39583 39713 39842 39972 40101 40230 40332 40433 40535 40636 40738>;
|
||||||
|
|
||||||
battery,temp_table_data = <800 790 780 770 760 750 740 730 720 710 700 690 680 670 660 650 640 630 620 610
|
battery,temp_table_data = <850 800 790 780 770 760 750 740 730 720 710 700 690 680 670 660 650 640 630 620 610
|
||||||
600 590 580 570 560 550 540 530 520 510 500 490 480 470 460 450 440 430 420 410
|
600 590 580 570 560 550 540 530 520 510 500 490 480 470 460 450 440 430 420 410
|
||||||
400 390 380 370 360 350 340 330 320 310 300 290 280 270 260 250 240 230 220 210
|
400 390 380 370 360 350 340 330 320 310 300 290 280 270 260 250 240 230 220 210
|
||||||
200 190 180 170 160 150 140 130 120 110 100 90 80 70 60 50 40 30 20 10
|
200 190 180 170 160 150 140 130 120 110 100 90 80 70 60 50 40 30 20 10
|
||||||
|
@ -86,12 +86,12 @@
|
||||||
SEC_BATTERY_FULL_CONDITION_VCELL */
|
SEC_BATTERY_FULL_CONDITION_VCELL */
|
||||||
battery,full_condition_type = <13>;
|
battery,full_condition_type = <13>;
|
||||||
battery,full_condition_soc = <93>;
|
battery,full_condition_soc = <93>;
|
||||||
battery,full_condition_vcell = <4300>;
|
battery,full_condition_vcell = <4250>;
|
||||||
|
|
||||||
battery,recharge_check_count = <1>;
|
battery,recharge_check_count = <1>;
|
||||||
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
||||||
battery,recharge_condition_soc = <98>;
|
battery,recharge_condition_soc = <98>;
|
||||||
battery,recharge_condition_vcell = <4340>;
|
battery,recharge_condition_vcell = <4300>;
|
||||||
|
|
||||||
battery,charging_total_time = <36000>;
|
battery,charging_total_time = <36000>;
|
||||||
battery,recharging_total_time = <5400>;
|
battery,recharging_total_time = <5400>;
|
||||||
|
@ -103,11 +103,11 @@
|
||||||
battery,swelling_low_temp_recov = <150>;
|
battery,swelling_low_temp_recov = <150>;
|
||||||
//battery,swelling_chg_current = <1500>;
|
//battery,swelling_chg_current = <1500>;
|
||||||
battery,swelling_high_chg_current = <2100>;
|
battery,swelling_high_chg_current = <2100>;
|
||||||
battery,swelling_low_chg_current = <1500>;
|
battery,swelling_low_chg_current = <2100>;
|
||||||
battery,swelling_full_check_current_2nd = <300>;
|
battery,swelling_full_check_current_2nd = <300>;
|
||||||
battery,swelling_drop_float_voltage = <4200>;
|
battery,swelling_drop_float_voltage = <4150>;
|
||||||
battery,swelling_high_rechg_voltage = <4150>;
|
battery,swelling_high_rechg_voltage = <4000>;
|
||||||
battery,swelling_low_rechg_voltage = <4050>;
|
battery,swelling_low_rechg_voltage = <4000>;
|
||||||
|
|
||||||
battery,self_discharging_temp_block = <600>;
|
battery,self_discharging_temp_block = <600>;
|
||||||
battery,self_discharging_volt_block = <4250>;
|
battery,self_discharging_volt_block = <4250>;
|
||||||
|
@ -116,12 +116,21 @@
|
||||||
|
|
||||||
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
||||||
|
|
||||||
|
/* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc */
|
||||||
|
battery,age_data = <
|
||||||
|
0 4350 4300 4250 93
|
||||||
|
200 4330 4280 4230 92
|
||||||
|
250 4310 4260 4210 91
|
||||||
|
300 4290 4240 4190 90
|
||||||
|
1000 4240 4190 4140 89
|
||||||
|
>;
|
||||||
|
|
||||||
charger {
|
charger {
|
||||||
status = "disable";
|
status = "disable";
|
||||||
/* Charger */
|
/* Charger */
|
||||||
battery,charger_name = "sm5703-charger";
|
battery,charger_name = "sm5703-charger";
|
||||||
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
||||||
battery,chg_float_voltage = <4390>;
|
battery,chg_float_voltage = <4350>;
|
||||||
|
|
||||||
battery,chg_polarity_en = <0>;
|
battery,chg_polarity_en = <0>;
|
||||||
battery,chg_gpio_status = <0>;
|
battery,chg_gpio_status = <0>;
|
||||||
|
@ -152,11 +161,12 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
battery_params {
|
battery_params {
|
||||||
|
/*SDI Battery data*/
|
||||||
battery,id = <(-1)>; /* -1 means auto, detected by F/G */
|
battery,id = <(-1)>; /* -1 means auto, detected by F/G */
|
||||||
battery0,battery_type = <4400>; /* 4200 4350 4400 */
|
battery0,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery0,battery_table0 = <0x1400 0x1B47 0x1BAD 0x1C95 0x1D75 0x1D8C 0x1DF1 0x1E32 0x1EC9 0x1F34 0x1FA6 0x1FD9 0x2072 0x20F3 0x22C4 0x2399>; /*SDI Battery data*/
|
battery0,battery_table0 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery0,battery_table1 = <0x1400 0x1B47 0x1BAD 0x1C95 0x1D75 0x1D8C 0x1DF1 0x1E32 0x1EC9 0x1F34 0x1FA6 0x1FD9 0x2072 0x20F3 0x22C4 0x2399>; /*SDI Battery data*/
|
battery0,battery_table1 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery0,battery_table2 = <0x0 0x3C 0x91 0x114 0x24d 0x380 0x70B 0xBBD 0x177A 0x1B00 0x1D59 0x1FB2 0x220B 0x2591 0x2EF5 0x2F19>; /*SDI Battery data*/
|
battery0,battery_table2 = <0x0 0x48 0x1B0 0x2A1 0x5AE 0x934 0xF13 0x14F1 0x19A3 0x1D29 0x1F82 0x21DB 0x2434 0x27BA 0x2CE4 0x2CFB>;
|
||||||
battery0,temp_std = <25>;
|
battery0,temp_std = <25>;
|
||||||
battery0,temp_offset = <10>;
|
battery0,temp_offset = <10>;
|
||||||
battery0,temp_offset_cal = <0x01>;
|
battery0,temp_offset_cal = <0x01>;
|
||||||
|
@ -173,12 +183,15 @@
|
||||||
battery0,curr_cal = <0x7C85>;
|
battery0,curr_cal = <0x7C85>;
|
||||||
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery0,v_alarm = <3200>;
|
battery0,v_alarm = <3200>;
|
||||||
battery0,data_ver = <0x01>;
|
battery0,v_max_table = <0x2268 0x2241 0x221A 0x21F3 0x2191>;
|
||||||
|
battery0,q_max_table = <0x2CE4 0x2C20 0x2B5B 0x2A96 0x28AA>;
|
||||||
|
battery0,data_ver = <0x02>;
|
||||||
|
|
||||||
battery1,battery_type = <4400>; /* 4200 4350 4400 */
|
/*ATL Battery data*/
|
||||||
battery1,battery_table0 = <0x1400 0x1B33 0x1C5F 0x1D61 0x1D83 0x1DF4 0x1E9C 0x1F06 0x1F68 0x1FFA 0x1FFA 0x2131 0x2169 0x2251 0x22C3 0x2399>; /*ATL Battery data*/
|
battery1,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery1,battery_table1 = <0x1400 0x1B33 0x1C5F 0x1D61 0x1D83 0x1DF4 0x1E9C 0x1F06 0x1F68 0x1FFA 0x1FFA 0x2131 0x2169 0x2251 0x22C3 0x2399>; /*ATL Battery data*/
|
battery1,battery_table0 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery1,battery_table2 = <0x0 0x6C 0x108 0x2A1 0x4EE 0xA9C 0x15FA 0x195B 0x1BA8 0x1F0A 0x1F0A 0x25D9 0x2826 0x2CB4 0x2EF5 0x2F19>; /*ATL Battery data*/
|
battery1,battery_table1 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
|
battery1,battery_table2 = <0x0 0x48 0x1B0 0x2A1 0x5AE 0x934 0xF13 0x14F1 0x19A3 0x1D29 0x1F82 0x21DB 0x2434 0x27BA 0x2CE4 0x2CFB>;
|
||||||
battery1,temp_std = <25>;
|
battery1,temp_std = <25>;
|
||||||
battery1,temp_offset = <10>;
|
battery1,temp_offset = <10>;
|
||||||
battery1,temp_offset_cal = <0x01>;
|
battery1,temp_offset_cal = <0x01>;
|
||||||
|
@ -195,6 +208,8 @@
|
||||||
battery1,curr_cal = <0x7D85>;
|
battery1,curr_cal = <0x7D85>;
|
||||||
battery1,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery1,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery1,v_alarm = <3200>;
|
battery1,v_alarm = <3200>;
|
||||||
battery1,data_ver = <0x01>;
|
battery1,v_max_table = <0x2268 0x2241 0x221A 0x21F3 0x2191>;
|
||||||
|
battery1,q_max_table = <0x2CE4 0x2C20 0x2B5B 0x2A96 0x28AA>;
|
||||||
|
battery1,data_ver = <0x02>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -127,7 +127,7 @@
|
||||||
battery,swelling_low_temp_recov = <150>;
|
battery,swelling_low_temp_recov = <150>;
|
||||||
//battery,swelling_chg_current = <1500>;
|
//battery,swelling_chg_current = <1500>;
|
||||||
battery,swelling_high_chg_current = <2100>;
|
battery,swelling_high_chg_current = <2100>;
|
||||||
battery,swelling_low_chg_current = <1500>;
|
battery,swelling_low_chg_current = <2100>;
|
||||||
battery,swelling_full_check_current_2nd = <200>;
|
battery,swelling_full_check_current_2nd = <200>;
|
||||||
battery,swelling_drop_float_voltage = <4200>;
|
battery,swelling_drop_float_voltage = <4200>;
|
||||||
battery,swelling_high_rechg_voltage = <4150>;
|
battery,swelling_high_rechg_voltage = <4150>;
|
||||||
|
|
|
@ -86,12 +86,12 @@
|
||||||
SEC_BATTERY_FULL_CONDITION_VCELL */
|
SEC_BATTERY_FULL_CONDITION_VCELL */
|
||||||
battery,full_condition_type = <13>;
|
battery,full_condition_type = <13>;
|
||||||
battery,full_condition_soc = <93>;
|
battery,full_condition_soc = <93>;
|
||||||
battery,full_condition_vcell = <4300>;
|
battery,full_condition_vcell = <4250>;
|
||||||
|
|
||||||
battery,recharge_check_count = <1>;
|
battery,recharge_check_count = <1>;
|
||||||
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
||||||
battery,recharge_condition_soc = <98>;
|
battery,recharge_condition_soc = <98>;
|
||||||
battery,recharge_condition_vcell = <4340>;
|
battery,recharge_condition_vcell = <4300>;
|
||||||
|
|
||||||
battery,charging_total_time = <36000>;
|
battery,charging_total_time = <36000>;
|
||||||
battery,recharging_total_time = <5400>;
|
battery,recharging_total_time = <5400>;
|
||||||
|
@ -103,11 +103,11 @@
|
||||||
battery,swelling_low_temp_recov = <150>;
|
battery,swelling_low_temp_recov = <150>;
|
||||||
//battery,swelling_chg_current = <1500>;
|
//battery,swelling_chg_current = <1500>;
|
||||||
battery,swelling_high_chg_current = <2100>;
|
battery,swelling_high_chg_current = <2100>;
|
||||||
battery,swelling_low_chg_current = <1500>;
|
battery,swelling_low_chg_current = <2100>;
|
||||||
battery,swelling_full_check_current_2nd = <300>;
|
battery,swelling_full_check_current_2nd = <300>;
|
||||||
battery,swelling_drop_float_voltage = <4200>;
|
battery,swelling_drop_float_voltage = <4150>;
|
||||||
battery,swelling_high_rechg_voltage = <4150>;
|
battery,swelling_high_rechg_voltage = <4000>;
|
||||||
battery,swelling_low_rechg_voltage = <4050>;
|
battery,swelling_low_rechg_voltage = <4000>;
|
||||||
|
|
||||||
battery,self_discharging_temp_block = <600>;
|
battery,self_discharging_temp_block = <600>;
|
||||||
battery,self_discharging_volt_block = <4250>;
|
battery,self_discharging_volt_block = <4250>;
|
||||||
|
@ -116,12 +116,21 @@
|
||||||
|
|
||||||
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
||||||
|
|
||||||
|
/* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc */
|
||||||
|
battery,age_data = <
|
||||||
|
0 4350 4300 4250 93
|
||||||
|
200 4330 4280 4230 92
|
||||||
|
250 4310 4260 4210 91
|
||||||
|
300 4290 4240 4190 90
|
||||||
|
1000 4240 4190 4140 89
|
||||||
|
>;
|
||||||
|
|
||||||
charger {
|
charger {
|
||||||
status = "disable";
|
status = "disable";
|
||||||
/* Charger */
|
/* Charger */
|
||||||
battery,charger_name = "sm5703-charger";
|
battery,charger_name = "sm5703-charger";
|
||||||
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
||||||
battery,chg_float_voltage = <4390>;
|
battery,chg_float_voltage = <4350>;
|
||||||
|
|
||||||
battery,chg_polarity_en = <0>;
|
battery,chg_polarity_en = <0>;
|
||||||
battery,chg_gpio_status = <0>;
|
battery,chg_gpio_status = <0>;
|
||||||
|
@ -152,11 +161,12 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
battery_params {
|
battery_params {
|
||||||
|
/*SDI Battery data*/
|
||||||
battery,id = <(-1)>; /* -1 means auto, detected by F/G */
|
battery,id = <(-1)>; /* -1 means auto, detected by F/G */
|
||||||
battery0,battery_type = <4400>; /* 4200 4350 4400 */
|
battery0,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery0,battery_table0 = <0x1400 0x1B47 0x1BAD 0x1C95 0x1D75 0x1D8C 0x1DF1 0x1E32 0x1EC9 0x1F34 0x1FA6 0x1FD9 0x2072 0x20F3 0x22C4 0x2399>; /*SDI Battery data*/
|
battery0,battery_table0 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery0,battery_table1 = <0x1400 0x1B47 0x1BAD 0x1C95 0x1D75 0x1D8C 0x1DF1 0x1E32 0x1EC9 0x1F34 0x1FA6 0x1FD9 0x2072 0x20F3 0x22C4 0x2399>; /*SDI Battery data*/
|
battery0,battery_table1 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery0,battery_table2 = <0x0 0x3C 0x91 0x114 0x24d 0x380 0x70B 0xBBD 0x177A 0x1B00 0x1D59 0x1FB2 0x220B 0x2591 0x2EF5 0x2F19>; /*SDI Battery data*/
|
battery0,battery_table2 = <0x0 0x48 0x1B0 0x2A1 0x5AE 0x934 0xF13 0x14F1 0x19A3 0x1D29 0x1F82 0x21DB 0x2434 0x27BA 0x2CE4 0x2CFB>;
|
||||||
battery0,temp_std = <25>;
|
battery0,temp_std = <25>;
|
||||||
battery0,temp_offset = <10>;
|
battery0,temp_offset = <10>;
|
||||||
battery0,temp_offset_cal = <0x01>;
|
battery0,temp_offset_cal = <0x01>;
|
||||||
|
@ -173,12 +183,15 @@
|
||||||
battery0,curr_cal = <0x7C85>;
|
battery0,curr_cal = <0x7C85>;
|
||||||
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery0,v_alarm = <3200>;
|
battery0,v_alarm = <3200>;
|
||||||
battery0,data_ver = <0x01>;
|
battery0,v_max_table = <0x2268 0x2241 0x221A 0x21F3 0x2191>;
|
||||||
|
battery0,q_max_table = <0x2CE4 0x2C20 0x2B5B 0x2A96 0x28AA>;
|
||||||
|
battery0,data_ver = <0x02>;
|
||||||
|
|
||||||
battery1,battery_type = <4400>; /* 4200 4350 4400 */
|
/*ATL Battery data*/
|
||||||
battery1,battery_table0 = <0x1400 0x1B33 0x1C5F 0x1D61 0x1D83 0x1DF4 0x1E9C 0x1F06 0x1F68 0x1FFA 0x1FFA 0x2131 0x2169 0x2251 0x22C3 0x2399>; /*ATL Battery data*/
|
battery1,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery1,battery_table1 = <0x1400 0x1B33 0x1C5F 0x1D61 0x1D83 0x1DF4 0x1E9C 0x1F06 0x1F68 0x1FFA 0x1FFA 0x2131 0x2169 0x2251 0x22C3 0x2399>; /*ATL Battery data*/
|
battery1,battery_table0 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery1,battery_table2 = <0x0 0x6C 0x108 0x2A1 0x4EE 0xA9C 0x15FA 0x195B 0x1BA8 0x1F0A 0x1F0A 0x25D9 0x2826 0x2CB4 0x2EF5 0x2F19>; /*ATL Battery data*/
|
battery1,battery_table1 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
|
battery1,battery_table2 = <0x0 0x48 0x1B0 0x2A1 0x5AE 0x934 0xF13 0x14F1 0x19A3 0x1D29 0x1F82 0x21DB 0x2434 0x27BA 0x2CE4 0x2CFB>;
|
||||||
battery1,temp_std = <25>;
|
battery1,temp_std = <25>;
|
||||||
battery1,temp_offset = <10>;
|
battery1,temp_offset = <10>;
|
||||||
battery1,temp_offset_cal = <0x01>;
|
battery1,temp_offset_cal = <0x01>;
|
||||||
|
@ -195,6 +208,8 @@
|
||||||
battery1,curr_cal = <0x7D85>;
|
battery1,curr_cal = <0x7D85>;
|
||||||
battery1,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery1,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery1,v_alarm = <3200>;
|
battery1,v_alarm = <3200>;
|
||||||
battery1,data_ver = <0x01>;
|
battery1,v_max_table = <0x2268 0x2241 0x221A 0x21F3 0x2191>;
|
||||||
|
battery1,q_max_table = <0x2CE4 0x2C20 0x2B5B 0x2A96 0x28AA>;
|
||||||
|
battery1,data_ver = <0x02>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
battery,adc_check_count = <5>;
|
battery,adc_check_count = <5>;
|
||||||
|
|
||||||
battery,cable_check_type = <4>; /* SEC_BATTERY_CABLE_CHECK_PSY */
|
battery,cable_check_type = <6>; /* SEC_BATTERY_CABLE_CHECK_NOINCOMPATIBLECHARGE | SEC_BATTERY_CABLE_CHECK_PSY */
|
||||||
battery,cable_source_type = <3>; /* SEC_BATTERY_CABLE_SOURCE_EXTERNAL */
|
battery,cable_source_type = <3>; /* SEC_BATTERY_CABLE_SOURCE_EXTERNAL */
|
||||||
battery,event_waiting_time = <600>;
|
battery,event_waiting_time = <600>;
|
||||||
battery,polling_type = <1>; /* SEC_BATTERY_MONITOR_ALARM */
|
battery,polling_type = <1>; /* SEC_BATTERY_MONITOR_ALARM */
|
||||||
|
@ -86,12 +86,12 @@
|
||||||
SEC_BATTERY_FULL_CONDITION_VCELL */
|
SEC_BATTERY_FULL_CONDITION_VCELL */
|
||||||
battery,full_condition_type = <13>;
|
battery,full_condition_type = <13>;
|
||||||
battery,full_condition_soc = <93>;
|
battery,full_condition_soc = <93>;
|
||||||
battery,full_condition_vcell = <4300>;
|
battery,full_condition_vcell = <4250>;
|
||||||
|
|
||||||
battery,recharge_check_count = <1>;
|
battery,recharge_check_count = <1>;
|
||||||
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
||||||
battery,recharge_condition_soc = <98>;
|
battery,recharge_condition_soc = <98>;
|
||||||
battery,recharge_condition_vcell = <4340>;
|
battery,recharge_condition_vcell = <4300>;
|
||||||
|
|
||||||
battery,charging_total_time = <36000>;
|
battery,charging_total_time = <36000>;
|
||||||
battery,recharging_total_time = <5400>;
|
battery,recharging_total_time = <5400>;
|
||||||
|
@ -103,11 +103,11 @@
|
||||||
battery,swelling_low_temp_recov = <150>;
|
battery,swelling_low_temp_recov = <150>;
|
||||||
//battery,swelling_chg_current = <1500>;
|
//battery,swelling_chg_current = <1500>;
|
||||||
battery,swelling_high_chg_current = <2100>;
|
battery,swelling_high_chg_current = <2100>;
|
||||||
battery,swelling_low_chg_current = <1500>;
|
battery,swelling_low_chg_current = <2100>;
|
||||||
battery,swelling_full_check_current_2nd = <300>;
|
battery,swelling_full_check_current_2nd = <300>;
|
||||||
battery,swelling_drop_float_voltage = <4200>;
|
battery,swelling_drop_float_voltage = <4150>;
|
||||||
battery,swelling_high_rechg_voltage = <4150>;
|
battery,swelling_high_rechg_voltage = <4000>;
|
||||||
battery,swelling_low_rechg_voltage = <4050>;
|
battery,swelling_low_rechg_voltage = <4000>;
|
||||||
|
|
||||||
battery,self_discharging_temp_block = <600>;
|
battery,self_discharging_temp_block = <600>;
|
||||||
battery,self_discharging_volt_block = <4250>;
|
battery,self_discharging_volt_block = <4250>;
|
||||||
|
@ -116,13 +116,21 @@
|
||||||
|
|
||||||
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
||||||
|
|
||||||
|
/* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc */
|
||||||
|
battery,age_data = <
|
||||||
|
0 4350 4300 4250 93
|
||||||
|
200 4330 4280 4230 92
|
||||||
|
250 4310 4260 4210 91
|
||||||
|
300 4290 4240 4190 90
|
||||||
|
1000 4240 4190 4140 89
|
||||||
|
>;
|
||||||
|
|
||||||
charger {
|
charger {
|
||||||
status = "disable";
|
status = "disable";
|
||||||
/* Charger */
|
/* Charger */
|
||||||
battery,charger_name = "sm5703-charger";
|
battery,charger_name = "sm5703-charger";
|
||||||
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
||||||
battery,chg_float_voltage = <4390>;
|
battery,chg_float_voltage = <4350>;
|
||||||
battery,chg_vbuslimit = <1>;
|
|
||||||
|
|
||||||
battery,chg_polarity_en = <0>;
|
battery,chg_polarity_en = <0>;
|
||||||
battery,chg_gpio_status = <0>;
|
battery,chg_gpio_status = <0>;
|
||||||
|
@ -153,11 +161,12 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
battery_params {
|
battery_params {
|
||||||
|
/*SDI Battery data*/
|
||||||
battery,id = <(-1)>; /* -1 means auto, detected by F/G */
|
battery,id = <(-1)>; /* -1 means auto, detected by F/G */
|
||||||
battery0,battery_type = <4400>; /* 4200 4350 4400 */
|
battery0,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery0,battery_table0 = <0x1400 0x1B47 0x1BAD 0x1C95 0x1D75 0x1D8C 0x1DF1 0x1E32 0x1EC9 0x1F34 0x1FA6 0x1FD9 0x2072 0x20F3 0x22C4 0x2399>; /*SDI Battery data*/
|
battery0,battery_table0 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery0,battery_table1 = <0x1400 0x1B47 0x1BAD 0x1C95 0x1D75 0x1D8C 0x1DF1 0x1E32 0x1EC9 0x1F34 0x1FA6 0x1FD9 0x2072 0x20F3 0x22C4 0x2399>; /*SDI Battery data*/
|
battery0,battery_table1 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery0,battery_table2 = <0x0 0x3C 0x91 0x114 0x24d 0x380 0x70B 0xBBD 0x177A 0x1B00 0x1D59 0x1FB2 0x220B 0x2591 0x2EF5 0x2F19>; /*SDI Battery data*/
|
battery0,battery_table2 = <0x0 0x48 0x1B0 0x2A1 0x5AE 0x934 0xF13 0x14F1 0x19A3 0x1D29 0x1F82 0x21DB 0x2434 0x27BA 0x2CE4 0x2CFB>;
|
||||||
battery0,temp_std = <25>;
|
battery0,temp_std = <25>;
|
||||||
battery0,temp_offset = <10>;
|
battery0,temp_offset = <10>;
|
||||||
battery0,temp_offset_cal = <0x01>;
|
battery0,temp_offset_cal = <0x01>;
|
||||||
|
@ -174,12 +183,15 @@
|
||||||
battery0,curr_cal = <0x7C85>;
|
battery0,curr_cal = <0x7C85>;
|
||||||
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery0,v_alarm = <3200>;
|
battery0,v_alarm = <3200>;
|
||||||
battery0,data_ver = <0x01>;
|
battery0,v_max_table = <0x2268 0x2241 0x221A 0x21F3 0x2191>;
|
||||||
|
battery0,q_max_table = <0x2CE4 0x2C20 0x2B5B 0x2A96 0x28AA>;
|
||||||
|
battery0,data_ver = <0x02>;
|
||||||
|
|
||||||
battery1,battery_type = <4400>; /* 4200 4350 4400 */
|
/*ATL Battery data*/
|
||||||
battery1,battery_table0 = <0x1400 0x1B33 0x1C5F 0x1D61 0x1D83 0x1DF4 0x1E9C 0x1F06 0x1F68 0x1FFA 0x1FFA 0x2131 0x2169 0x2251 0x22C3 0x2399>; /*ATL Battery data*/
|
battery1,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery1,battery_table1 = <0x1400 0x1B33 0x1C5F 0x1D61 0x1D83 0x1DF4 0x1E9C 0x1F06 0x1F68 0x1FFA 0x1FFA 0x2131 0x2169 0x2251 0x22C3 0x2399>; /*ATL Battery data*/
|
battery1,battery_table0 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery1,battery_table2 = <0x0 0x6C 0x108 0x2A1 0x4EE 0xA9C 0x15FA 0x195B 0x1BA8 0x1F0A 0x1F0A 0x25D9 0x2826 0x2CB4 0x2EF5 0x2F19>; /*ATL Battery data*/
|
battery1,battery_table1 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
|
battery1,battery_table2 = <0x0 0x48 0x1B0 0x2A1 0x5AE 0x934 0xF13 0x14F1 0x19A3 0x1D29 0x1F82 0x21DB 0x2434 0x27BA 0x2CE4 0x2CFB>;
|
||||||
battery1,temp_std = <25>;
|
battery1,temp_std = <25>;
|
||||||
battery1,temp_offset = <10>;
|
battery1,temp_offset = <10>;
|
||||||
battery1,temp_offset_cal = <0x01>;
|
battery1,temp_offset_cal = <0x01>;
|
||||||
|
@ -196,6 +208,8 @@
|
||||||
battery1,curr_cal = <0x7D85>;
|
battery1,curr_cal = <0x7D85>;
|
||||||
battery1,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery1,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery1,v_alarm = <3200>;
|
battery1,v_alarm = <3200>;
|
||||||
battery1,data_ver = <0x01>;
|
battery1,v_max_table = <0x2268 0x2241 0x221A 0x21F3 0x2191>;
|
||||||
|
battery1,q_max_table = <0x2CE4 0x2C20 0x2B5B 0x2A96 0x28AA>;
|
||||||
|
battery1,data_ver = <0x02>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -76,12 +76,12 @@
|
||||||
SEC_BATTERY_FULL_CONDITION_VCELL */
|
SEC_BATTERY_FULL_CONDITION_VCELL */
|
||||||
battery,full_condition_type = <13>;
|
battery,full_condition_type = <13>;
|
||||||
battery,full_condition_soc = <93>;
|
battery,full_condition_soc = <93>;
|
||||||
battery,full_condition_vcell = <4300>;
|
battery,full_condition_vcell = <4250>;
|
||||||
|
|
||||||
battery,recharge_check_count = <1>;
|
battery,recharge_check_count = <1>;
|
||||||
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
||||||
battery,recharge_condition_soc = <98>;
|
battery,recharge_condition_soc = <98>;
|
||||||
battery,recharge_condition_vcell = <4340>;
|
battery,recharge_condition_vcell = <4300>;
|
||||||
|
|
||||||
battery,charging_total_time = <36000>;
|
battery,charging_total_time = <36000>;
|
||||||
battery,recharging_total_time = <5400>;
|
battery,recharging_total_time = <5400>;
|
||||||
|
@ -93,11 +93,11 @@
|
||||||
battery,swelling_low_temp_recov = <150>;
|
battery,swelling_low_temp_recov = <150>;
|
||||||
//battery,swelling_chg_current = <1500>;
|
//battery,swelling_chg_current = <1500>;
|
||||||
battery,swelling_high_chg_current = <2100>;
|
battery,swelling_high_chg_current = <2100>;
|
||||||
battery,swelling_low_chg_current = <1500>;
|
battery,swelling_low_chg_current = <2100>;
|
||||||
battery,swelling_full_check_current_2nd = <300>;
|
battery,swelling_full_check_current_2nd = <300>;
|
||||||
battery,swelling_drop_float_voltage = <4200>;
|
battery,swelling_drop_float_voltage = <4150>;
|
||||||
battery,swelling_high_rechg_voltage = <4150>;
|
battery,swelling_high_rechg_voltage = <4000>;
|
||||||
battery,swelling_low_rechg_voltage = <4050>;
|
battery,swelling_low_rechg_voltage = <4000>;
|
||||||
|
|
||||||
battery,self_discharging_temp_block = <600>;
|
battery,self_discharging_temp_block = <600>;
|
||||||
battery,self_discharging_volt_block = <4250>;
|
battery,self_discharging_volt_block = <4250>;
|
||||||
|
@ -106,12 +106,20 @@
|
||||||
|
|
||||||
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
||||||
|
|
||||||
|
/* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc */
|
||||||
|
battery,age_data = <
|
||||||
|
0 4350 4300 4250 93
|
||||||
|
200 4330 4280 4230 92
|
||||||
|
250 4310 4260 4210 91
|
||||||
|
300 4290 4240 4190 90
|
||||||
|
1000 4240 4190 4140 89
|
||||||
|
>;
|
||||||
charger {
|
charger {
|
||||||
status = "disable";
|
status = "disable";
|
||||||
/* Charger */
|
/* Charger */
|
||||||
battery,charger_name = "sm5703-charger";
|
battery,charger_name = "sm5703-charger";
|
||||||
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
||||||
battery,chg_float_voltage = <4390>;
|
battery,chg_float_voltage = <4350>;
|
||||||
|
|
||||||
battery,chg_polarity_en = <0>;
|
battery,chg_polarity_en = <0>;
|
||||||
battery,chg_gpio_status = <0>;
|
battery,chg_gpio_status = <0>;
|
||||||
|
@ -142,11 +150,12 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
battery_params {
|
battery_params {
|
||||||
|
/*SDI Battery data*/
|
||||||
battery,id = <(-1)>; /* -1 means auto, detected by F/G */
|
battery,id = <(-1)>; /* -1 means auto, detected by F/G */
|
||||||
battery0,battery_type = <4400>; /* 4200 4350 4400 */
|
battery0,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery0,battery_table0 = <0x1400 0x1B47 0x1BAD 0x1C95 0x1D75 0x1D8C 0x1DF1 0x1E32 0x1EC9 0x1F34 0x1FA6 0x1FD9 0x2072 0x20F3 0x22C4 0x2399>; /*SDI Battery data*/
|
battery0,battery_table0 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery0,battery_table1 = <0x1400 0x1B47 0x1BAD 0x1C95 0x1D75 0x1D8C 0x1DF1 0x1E32 0x1EC9 0x1F34 0x1FA6 0x1FD9 0x2072 0x20F3 0x22C4 0x2399>; /*SDI Battery data*/
|
battery0,battery_table1 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery0,battery_table2 = <0x0 0x3C 0x91 0x114 0x24d 0x380 0x70B 0xBBD 0x177A 0x1B00 0x1D59 0x1FB2 0x220B 0x2591 0x2EF5 0x2F19>; /*SDI Battery data*/
|
battery0,battery_table2 = <0x0 0x48 0x1B0 0x2A1 0x5AE 0x934 0xF13 0x14F1 0x19A3 0x1D29 0x1F82 0x21DB 0x2434 0x27BA 0x2CE4 0x2CFB>;
|
||||||
battery0,temp_std = <25>;
|
battery0,temp_std = <25>;
|
||||||
battery0,temp_offset = <10>;
|
battery0,temp_offset = <10>;
|
||||||
battery0,temp_offset_cal = <0x01>;
|
battery0,temp_offset_cal = <0x01>;
|
||||||
|
@ -163,12 +172,15 @@
|
||||||
battery0,curr_cal = <0x7885>;
|
battery0,curr_cal = <0x7885>;
|
||||||
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery0,v_alarm = <3200>;
|
battery0,v_alarm = <3200>;
|
||||||
battery0,data_ver = <0x01>;
|
battery0,v_max_table = <0x2268 0x2241 0x221A 0x21F3 0x2191>;
|
||||||
|
battery0,q_max_table = <0x2CE4 0x2C20 0x2B5B 0x2A96 0x28AA>;
|
||||||
|
battery0,data_ver = <0x02>;
|
||||||
|
|
||||||
battery1,battery_type = <4400>; /* 4200 4350 4400 */
|
/*ATL Battery data*/
|
||||||
battery1,battery_table0 = <0x1400 0x1B33 0x1C5F 0x1D61 0x1D83 0x1DF4 0x1E9C 0x1F06 0x1F68 0x1FFA 0x1FFA 0x2131 0x2169 0x2251 0x22C3 0x2399>; /*ATL Battery data*/
|
battery1,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery1,battery_table1 = <0x1400 0x1B33 0x1C5F 0x1D61 0x1D83 0x1DF4 0x1E9C 0x1F06 0x1F68 0x1FFA 0x1FFA 0x2131 0x2169 0x2251 0x22C3 0x2399>; /*ATL Battery data*/
|
battery1,battery_table0 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
battery1,battery_table2 = <0x0 0x6C 0x108 0x2A1 0x4EE 0xA9C 0x15FA 0x195B 0x1BA8 0x1F0A 0x1F0A 0x25D9 0x2826 0x2CB4 0x2EF5 0x2F19>; /*ATL Battery data*/
|
battery1,battery_table1 = <0x1400 0x1B45 0x1CF6 0x1D75 0x1D8B 0x1DEF 0x1E48 0x1E9E 0x1F0D 0x1FAA 0x1FDD 0x207E 0x20C5 0x2165 0x2268 0x2400>;
|
||||||
|
battery1,battery_table2 = <0x0 0x48 0x1B0 0x2A1 0x5AE 0x934 0xF13 0x14F1 0x19A3 0x1D29 0x1F82 0x21DB 0x2434 0x27BA 0x2CE4 0x2CFB>;
|
||||||
battery1,temp_std = <25>;
|
battery1,temp_std = <25>;
|
||||||
battery1,temp_offset = <10>;
|
battery1,temp_offset = <10>;
|
||||||
battery1,temp_offset_cal = <0x01>;
|
battery1,temp_offset_cal = <0x01>;
|
||||||
|
@ -185,6 +197,8 @@
|
||||||
battery1,curr_cal = <0x7D85>;
|
battery1,curr_cal = <0x7D85>;
|
||||||
battery1,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery1,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery1,v_alarm = <3200>;
|
battery1,v_alarm = <3200>;
|
||||||
battery1,data_ver = <0x01>;
|
battery1,v_max_table = <0x2268 0x2241 0x221A 0x21F3 0x2191>;
|
||||||
|
battery1,q_max_table = <0x2CE4 0x2C20 0x2B5B 0x2A96 0x28AA>;
|
||||||
|
battery1,data_ver = <0x02>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -78,12 +78,12 @@
|
||||||
SEC_BATTERY_FULL_CONDITION_VCELL */
|
SEC_BATTERY_FULL_CONDITION_VCELL */
|
||||||
battery,full_condition_type = <13>;
|
battery,full_condition_type = <13>;
|
||||||
battery,full_condition_soc = <93>;
|
battery,full_condition_soc = <93>;
|
||||||
battery,full_condition_vcell = <4300>;
|
battery,full_condition_vcell = <4250>;
|
||||||
|
|
||||||
battery,recharge_check_count = <1>;
|
battery,recharge_check_count = <1>;
|
||||||
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
||||||
battery,recharge_condition_soc = <98>;
|
battery,recharge_condition_soc = <98>;
|
||||||
battery,recharge_condition_vcell = <4340>;
|
battery,recharge_condition_vcell = <4300>;
|
||||||
|
|
||||||
battery,charging_total_time = <21600>;
|
battery,charging_total_time = <21600>;
|
||||||
battery,recharging_total_time = <5400>;
|
battery,recharging_total_time = <5400>;
|
||||||
|
@ -97,10 +97,9 @@
|
||||||
battery,swelling_high_chg_current = <2100>;
|
battery,swelling_high_chg_current = <2100>;
|
||||||
battery,swelling_low_chg_current = <1950>;
|
battery,swelling_low_chg_current = <1950>;
|
||||||
battery,swelling_full_check_current_2nd = <200>;
|
battery,swelling_full_check_current_2nd = <200>;
|
||||||
battery,swelling_drop_float_voltage = <4200>;
|
battery,swelling_drop_float_voltage = <4150>;
|
||||||
battery,swelling_high_rechg_voltage = <4150>;
|
battery,swelling_high_rechg_voltage = <4000>;
|
||||||
battery,swelling_low_rechg_voltage = <4050>;
|
battery,swelling_low_rechg_voltage = <4000>;
|
||||||
battery,swelling_block_time = <600>;
|
|
||||||
|
|
||||||
battery,self_discharging_temp_block = <600>;
|
battery,self_discharging_temp_block = <600>;
|
||||||
battery,self_discharging_volt_block = <4250>;
|
battery,self_discharging_volt_block = <4250>;
|
||||||
|
@ -109,12 +108,21 @@
|
||||||
|
|
||||||
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
||||||
|
|
||||||
|
/* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc */
|
||||||
|
battery,age_data = <
|
||||||
|
0 4350 4300 4250 93
|
||||||
|
200 4330 4280 4230 92
|
||||||
|
250 4310 4260 4210 91
|
||||||
|
300 4290 4240 4190 90
|
||||||
|
1000 4240 4190 4140 89
|
||||||
|
>;
|
||||||
|
|
||||||
charger {
|
charger {
|
||||||
status = "disable";
|
status = "disable";
|
||||||
/* Charger */
|
/* Charger */
|
||||||
battery,charger_name = "sm5703-charger";
|
battery,charger_name = "sm5703-charger";
|
||||||
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
||||||
battery,chg_float_voltage = <4390>;
|
battery,chg_float_voltage = <4350>;
|
||||||
|
|
||||||
battery,chg_polarity_en = <0>;
|
battery,chg_polarity_en = <0>;
|
||||||
battery,chg_gpio_status = <0>;
|
battery,chg_gpio_status = <0>;
|
||||||
|
@ -146,10 +154,10 @@
|
||||||
|
|
||||||
battery_params {
|
battery_params {
|
||||||
battery,id = <0>; /* -1 means auto, detected by F/G */
|
battery,id = <0>; /* -1 means auto, detected by F/G */
|
||||||
battery0,battery_type = <4400>; /* 4200 4350 4400 */
|
battery0,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery0,battery_table0 = <0x1400 0x1B33 0x1D0C 0x1D56 0x1D7E 0x1D8A 0x1DED 0x1E66 0x1EED 0x1FAD 0x1FE3 0x2085 0x209E 0x2138 0x2302 0x2399>;
|
battery0,battery_table0 = <0x1400 0x1B24 0x1D1D 0x1D7F 0x1D8A 0x1DE9 0x1E5A 0x1EBD 0x1F16 0x1FB4 0x1FF4 0x208F 0x20AA 0x2148 0x224C 0x2400>;
|
||||||
battery0,battery_table1 = <0x1400 0x1B33 0x1D0C 0x1D56 0x1D7E 0x1D8A 0x1DED 0x1E66 0x1EED 0x1FAD 0x1FE3 0x2085 0x209E 0x2138 0x2302 0x2399>;
|
battery0,battery_table1 = <0x1400 0x1B24 0x1D1D 0x1D7F 0x1D8A 0x1DE9 0x1E5A 0x1EBD 0x1F16 0x1FB4 0x1FF4 0x208F 0x20AA 0x2148 0x224C 0x2400>;
|
||||||
battery0,battery_table2 = <0x00 0x49 0x7A 0xCC 0x199 0x333 0x599 0xB33 0x1000 0x1333 0x14CC 0x1666 0x1733 0x1999 0x2000 0x2018>;
|
battery0,battery_table2 = <0x0 0x28 0x147 0x214 0x3AE 0x614 0xAE1 0xEE1 0x1147 0x13AE 0x1547 0x16E1 0x17AE 0x1A14 0x1D99 0x1DA8>;
|
||||||
battery0,temp_std = <25>;
|
battery0,temp_std = <25>;
|
||||||
battery0,temp_offset = <10>;
|
battery0,temp_offset = <10>;
|
||||||
battery0,temp_offset_cal = <0x01>;
|
battery0,temp_offset_cal = <0x01>;
|
||||||
|
@ -166,6 +174,8 @@
|
||||||
battery0,curr_cal = <0x7385>;
|
battery0,curr_cal = <0x7385>;
|
||||||
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery0,v_alarm = <3250>;
|
battery0,v_alarm = <3250>;
|
||||||
battery0,data_ver = <0x01>;
|
battery0,v_max_table = <0x224C 0x2225 0x21FE 0x21D7 0x2174>;
|
||||||
|
battery0,q_max_table = <0x1D99 0x1D13 0x1C8D 0x1C07 0x1AB8>;
|
||||||
|
battery0,data_ver = <0x02>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -76,12 +76,12 @@
|
||||||
SEC_BATTERY_FULL_CONDITION_VCELL */
|
SEC_BATTERY_FULL_CONDITION_VCELL */
|
||||||
battery,full_condition_type = <13>;
|
battery,full_condition_type = <13>;
|
||||||
battery,full_condition_soc = <93>;
|
battery,full_condition_soc = <93>;
|
||||||
battery,full_condition_vcell = <4300>;
|
battery,full_condition_vcell = <4250>;
|
||||||
|
|
||||||
battery,recharge_check_count = <1>;
|
battery,recharge_check_count = <1>;
|
||||||
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
||||||
battery,recharge_condition_soc = <98>;
|
battery,recharge_condition_soc = <98>;
|
||||||
battery,recharge_condition_vcell = <4350>;
|
battery,recharge_condition_vcell = <4300>;
|
||||||
|
|
||||||
battery,charging_total_time = <21600>;
|
battery,charging_total_time = <21600>;
|
||||||
battery,recharging_total_time = <5400>;
|
battery,recharging_total_time = <5400>;
|
||||||
|
@ -95,10 +95,9 @@
|
||||||
battery,swelling_high_chg_current = <2100>;
|
battery,swelling_high_chg_current = <2100>;
|
||||||
battery,swelling_low_chg_current = <1950>;
|
battery,swelling_low_chg_current = <1950>;
|
||||||
battery,swelling_full_check_current_2nd = <200>;
|
battery,swelling_full_check_current_2nd = <200>;
|
||||||
battery,swelling_drop_float_voltage = <4200>;
|
battery,swelling_drop_float_voltage = <4150>;
|
||||||
battery,swelling_high_rechg_voltage = <4150>;
|
battery,swelling_high_rechg_voltage = <4000>;
|
||||||
battery,swelling_low_rechg_voltage = <4050>;
|
battery,swelling_low_rechg_voltage = <4000>;
|
||||||
battery,swelling_block_time = <600>;
|
|
||||||
|
|
||||||
battery,self_discharging_temp_block = <600>;
|
battery,self_discharging_temp_block = <600>;
|
||||||
battery,self_discharging_volt_block = <4250>;
|
battery,self_discharging_volt_block = <4250>;
|
||||||
|
@ -107,12 +106,21 @@
|
||||||
|
|
||||||
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
||||||
|
|
||||||
|
/* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc */
|
||||||
|
battery,age_data = <
|
||||||
|
0 4350 4300 4250 93
|
||||||
|
200 4330 4280 4230 92
|
||||||
|
250 4310 4260 4210 91
|
||||||
|
300 4290 4240 4190 90
|
||||||
|
1000 4240 4190 4140 89
|
||||||
|
>;
|
||||||
|
|
||||||
charger {
|
charger {
|
||||||
status = "disable";
|
status = "disable";
|
||||||
/* Charger */
|
/* Charger */
|
||||||
battery,charger_name = "sm5703-charger";
|
battery,charger_name = "sm5703-charger";
|
||||||
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
||||||
battery,chg_float_voltage = <4390>;
|
battery,chg_float_voltage = <4350>;
|
||||||
|
|
||||||
battery,chg_polarity_en = <0>;
|
battery,chg_polarity_en = <0>;
|
||||||
battery,chg_gpio_status = <0>;
|
battery,chg_gpio_status = <0>;
|
||||||
|
@ -144,10 +152,10 @@
|
||||||
|
|
||||||
battery_params {
|
battery_params {
|
||||||
battery,id = <0>; /* -1 means auto, detected by F/G */
|
battery,id = <0>; /* -1 means auto, detected by F/G */
|
||||||
battery0,battery_type = <4400>; /* 4200 4350 4400 */
|
battery0,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery0,battery_table0 = <0x1400 0x1B33 0x1D0C 0x1D56 0x1D7E 0x1D8A 0x1DED 0x1E66 0x1EED 0x1FAD 0x1FE3 0x2085 0x209E 0x2138 0x2302 0x2399>;
|
battery0,battery_table0 = <0x1400 0x1B24 0x1D1D 0x1D7F 0x1D8A 0x1DE9 0x1E5A 0x1EBD 0x1F16 0x1FB4 0x1FF4 0x208F 0x20AA 0x2148 0x224C 0x2400>;
|
||||||
battery0,battery_table1 = <0x1400 0x1B33 0x1D0C 0x1D56 0x1D7E 0x1D8A 0x1DED 0x1E66 0x1EED 0x1FAD 0x1FE3 0x2085 0x209E 0x2138 0x2302 0x2399>;
|
battery0,battery_table1 = <0x1400 0x1B24 0x1D1D 0x1D7F 0x1D8A 0x1DE9 0x1E5A 0x1EBD 0x1F16 0x1FB4 0x1FF4 0x208F 0x20AA 0x2148 0x224C 0x2400>;
|
||||||
battery0,battery_table2 = <0x00 0x49 0x7A 0xCC 0x199 0x333 0x599 0xB33 0x1000 0x1333 0x14CC 0x1666 0x1733 0x1999 0x2000 0x2018>;
|
battery0,battery_table2 = <0x0 0x28 0x147 0x214 0x3AE 0x614 0xAE1 0xEE1 0x1147 0x13AE 0x1547 0x16E1 0x17AE 0x1A14 0x1D99 0x1DA8>;
|
||||||
battery0,temp_std = <25>;
|
battery0,temp_std = <25>;
|
||||||
battery0,temp_offset = <10>;
|
battery0,temp_offset = <10>;
|
||||||
battery0,temp_offset_cal = <0x01>;
|
battery0,temp_offset_cal = <0x01>;
|
||||||
|
@ -164,6 +172,8 @@
|
||||||
battery0,curr_cal = <0x7A85>;
|
battery0,curr_cal = <0x7A85>;
|
||||||
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery0,v_alarm = <3250>;
|
battery0,v_alarm = <3250>;
|
||||||
battery0,data_ver = <0x01>;
|
battery0,v_max_table = <0x224C 0x2225 0x21FE 0x21D7 0x2174>;
|
||||||
|
battery0,q_max_table = <0x1D99 0x1D13 0x1C8D 0x1C07 0x1AB8>;
|
||||||
|
battery0,data_ver = <0x02>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -78,12 +78,12 @@
|
||||||
SEC_BATTERY_FULL_CONDITION_VCELL */
|
SEC_BATTERY_FULL_CONDITION_VCELL */
|
||||||
battery,full_condition_type = <13>;
|
battery,full_condition_type = <13>;
|
||||||
battery,full_condition_soc = <93>;
|
battery,full_condition_soc = <93>;
|
||||||
battery,full_condition_vcell = <4300>;
|
battery,full_condition_vcell = <4250>;
|
||||||
|
|
||||||
battery,recharge_check_count = <1>;
|
battery,recharge_check_count = <1>;
|
||||||
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */
|
||||||
battery,recharge_condition_soc = <98>;
|
battery,recharge_condition_soc = <98>;
|
||||||
battery,recharge_condition_vcell = <4350>;
|
battery,recharge_condition_vcell = <4300>;
|
||||||
|
|
||||||
battery,charging_total_time = <21600>;
|
battery,charging_total_time = <21600>;
|
||||||
battery,recharging_total_time = <5400>;
|
battery,recharging_total_time = <5400>;
|
||||||
|
@ -97,10 +97,9 @@
|
||||||
battery,swelling_high_chg_current = <2100>;
|
battery,swelling_high_chg_current = <2100>;
|
||||||
battery,swelling_low_chg_current = <1950>;
|
battery,swelling_low_chg_current = <1950>;
|
||||||
battery,swelling_full_check_current_2nd = <200>;
|
battery,swelling_full_check_current_2nd = <200>;
|
||||||
battery,swelling_drop_float_voltage = <4200>;
|
battery,swelling_drop_float_voltage = <4150>;
|
||||||
battery,swelling_high_rechg_voltage = <4150>;
|
battery,swelling_high_rechg_voltage = <4000>;
|
||||||
battery,swelling_low_rechg_voltage = <4050>;
|
battery,swelling_low_rechg_voltage = <4000>;
|
||||||
battery,swelling_block_time = <600>;
|
|
||||||
|
|
||||||
battery,self_discharging_temp_block = <600>;
|
battery,self_discharging_temp_block = <600>;
|
||||||
battery,self_discharging_volt_block = <4250>;
|
battery,self_discharging_volt_block = <4250>;
|
||||||
|
@ -109,12 +108,21 @@
|
||||||
|
|
||||||
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
qcom,sec-battery-vadc = <&pm8950_vadc>;
|
||||||
|
|
||||||
|
/* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc */
|
||||||
|
battery,age_data = <
|
||||||
|
0 4350 4300 4250 93
|
||||||
|
200 4330 4280 4230 92
|
||||||
|
250 4310 4260 4210 91
|
||||||
|
300 4290 4240 4190 90
|
||||||
|
1000 4240 4190 4140 89
|
||||||
|
>;
|
||||||
|
|
||||||
charger {
|
charger {
|
||||||
status = "disable";
|
status = "disable";
|
||||||
/* Charger */
|
/* Charger */
|
||||||
battery,charger_name = "sm5703-charger";
|
battery,charger_name = "sm5703-charger";
|
||||||
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
battery,chg_gpio_en = <&msm_gpio 132 0x00>;
|
||||||
battery,chg_float_voltage = <4390>;
|
battery,chg_float_voltage = <4350>;
|
||||||
|
|
||||||
battery,chg_polarity_en = <0>;
|
battery,chg_polarity_en = <0>;
|
||||||
battery,chg_gpio_status = <0>;
|
battery,chg_gpio_status = <0>;
|
||||||
|
@ -146,10 +154,10 @@
|
||||||
|
|
||||||
battery_params {
|
battery_params {
|
||||||
battery,id = <0>; /* -1 means auto, detected by F/G */
|
battery,id = <0>; /* -1 means auto, detected by F/G */
|
||||||
battery0,battery_type = <4400>; /* 4200 4350 4400 */
|
battery0,battery_type = <4350>; /* 4200 4350 4400 */
|
||||||
battery0,battery_table0 = <0x1400 0x1B33 0x1D0C 0x1D56 0x1D7E 0x1D8A 0x1DED 0x1E66 0x1EED 0x1FAD 0x1FE3 0x2085 0x209E 0x2138 0x2302 0x2399>;
|
battery0,battery_table0 = <0x1400 0x1B24 0x1D1D 0x1D7F 0x1D8A 0x1DE9 0x1E5A 0x1EBD 0x1F16 0x1FB4 0x1FF4 0x208F 0x20AA 0x2148 0x224C 0x2400>;
|
||||||
battery0,battery_table1 = <0x1400 0x1B33 0x1D0C 0x1D56 0x1D7E 0x1D8A 0x1DED 0x1E66 0x1EED 0x1FAD 0x1FE3 0x2085 0x209E 0x2138 0x2302 0x2399>;
|
battery0,battery_table1 = <0x1400 0x1B24 0x1D1D 0x1D7F 0x1D8A 0x1DE9 0x1E5A 0x1EBD 0x1F16 0x1FB4 0x1FF4 0x208F 0x20AA 0x2148 0x224C 0x2400>;
|
||||||
battery0,battery_table2 = <0x00 0x49 0x7A 0xCC 0x199 0x333 0x599 0xB33 0x1000 0x1333 0x14CC 0x1666 0x1733 0x1999 0x2000 0x2018>;
|
battery0,battery_table2 = <0x0 0x28 0x147 0x214 0x3AE 0x614 0xAE1 0xEE1 0x1147 0x13AE 0x1547 0x16E1 0x17AE 0x1A14 0x1D99 0x1DA8>;
|
||||||
battery0,temp_std = <25>;
|
battery0,temp_std = <25>;
|
||||||
battery0,temp_offset = <10>;
|
battery0,temp_offset = <10>;
|
||||||
battery0,temp_offset_cal = <0x01>;
|
battery0,temp_offset_cal = <0x01>;
|
||||||
|
@ -166,6 +174,8 @@
|
||||||
battery0,curr_cal = <0x7A85>;
|
battery0,curr_cal = <0x7A85>;
|
||||||
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
battery0,ext_temp_cal = <0 10 1 1 1 7 1 2>;
|
||||||
battery0,v_alarm = <3250>;
|
battery0,v_alarm = <3250>;
|
||||||
battery0,data_ver = <0x01>;
|
battery0,v_max_table = <0x224C 0x2225 0x21FE 0x21D7 0x2174>;
|
||||||
|
battery0,q_max_table = <0x1D99 0x1D13 0x1C8D 0x1C07 0x1AB8>;
|
||||||
|
battery0,data_ver = <0x02>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -80,6 +80,7 @@ CONFIG_BATTERY_SWELLING=y
|
||||||
CONFIG_BATTERY_SWELLING_SELF_DISCHARGING=y
|
CONFIG_BATTERY_SWELLING_SELF_DISCHARGING=y
|
||||||
CONFIG_MUIC_SUPPORT_MULTIMEDIA_DOCK=y
|
CONFIG_MUIC_SUPPORT_MULTIMEDIA_DOCK=y
|
||||||
CONFIG_INBATVOLT_FG=y
|
CONFIG_INBATVOLT_FG=y
|
||||||
|
CONFIG_BATTERY_AGE_FORECAST=y
|
||||||
|
|
||||||
#Power off Alarm
|
#Power off Alarm
|
||||||
# CONFIG_RTC_AUTO_PWRON is not set
|
# CONFIG_RTC_AUTO_PWRON is not set
|
||||||
|
|
|
@ -0,0 +1,317 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# MSM8952 L kernel build script v0.5
|
||||||
|
|
||||||
|
BUILD_COMMAND=$1
|
||||||
|
if [ "$BUILD_COMMAND" == "lte_eur" ]; then
|
||||||
|
PRODUCT_NAME=msm8952ltexx
|
||||||
|
SIGN_MODEL=
|
||||||
|
elif [ "$BUILD_COMMAND" == "a7xlte_chn" ]; then
|
||||||
|
PRODUCT_NAME=a7xltectc
|
||||||
|
SIGN_MODEL=
|
||||||
|
elif [ "$BUILD_COMMAND" == "j7xlte_chn" ]; then
|
||||||
|
PRODUCT_NAME=j7xltectc
|
||||||
|
SIGN_MODEL=
|
||||||
|
elif [ "$BUILD_COMMAND" == "on5xlte_chn" ]; then
|
||||||
|
PRODUCT_NAME=on5xltechn
|
||||||
|
SIGN_MODEL=
|
||||||
|
else
|
||||||
|
#default product
|
||||||
|
PRODUCT_NAME=$BUILD_COMMAND;
|
||||||
|
SIGN_MODEL=
|
||||||
|
fi
|
||||||
|
|
||||||
|
BUILD_WHERE=$(pwd)
|
||||||
|
BUILD_KERNEL_DIR=$BUILD_WHERE
|
||||||
|
BUILD_ROOT_DIR=$BUILD_KERNEL_DIR/../..
|
||||||
|
BUILD_KERNEL_OUT_DIR=$BUILD_ROOT_DIR/android/out/target/product/$PRODUCT_NAME/obj/KERNEL_OBJ
|
||||||
|
PRODUCT_OUT=$BUILD_ROOT_DIR/android/out/target/product/$PRODUCT_NAME
|
||||||
|
|
||||||
|
|
||||||
|
SECURE_SCRIPT=$BUILD_ROOT_DIR/buildscript/tools/signclient.jar
|
||||||
|
BUILD_CROSS_COMPILE=$BUILD_ROOT_DIR/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
|
||||||
|
BUILD_JOB_NUMBER=`grep processor /proc/cpuinfo|wc -l`
|
||||||
|
|
||||||
|
# Default Python version is 2.7
|
||||||
|
mkdir -p bin
|
||||||
|
ln -sf /usr/bin/python2.7 ./bin/python
|
||||||
|
export PATH=$(pwd)/bin:$PATH
|
||||||
|
|
||||||
|
KERNEL_DEFCONFIG=msm8952_sec_defconfig
|
||||||
|
DEBUG_DEFCONFIG=msm8952_sec_eng_defconfig
|
||||||
|
SELINUX_DEFCONFIG=selinux_defconfig
|
||||||
|
SELINUX_LOG_DEFCONFIG=selinux_log_defconfig
|
||||||
|
DMVERITY_DEFCONFIG=dmverity_defconfig
|
||||||
|
|
||||||
|
while getopts "w:t:" flag; do
|
||||||
|
case $flag in
|
||||||
|
w)
|
||||||
|
BUILD_OPTION_HW_REVISION=$OPTARG
|
||||||
|
echo "-w : "$BUILD_OPTION_HW_REVISION""
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
TARGET_BUILD_VARIANT=$OPTARG
|
||||||
|
echo "-t : "$TARGET_BUILD_VARIANT""
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "wrong 2nd param : "$OPTARG""
|
||||||
|
exit -1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
BUILD_COMMAND=$1
|
||||||
|
SECURE_OPTION=
|
||||||
|
SEANDROID_OPTION=
|
||||||
|
if [ "$2" == "-B" ]; then
|
||||||
|
SECURE_OPTION=$2
|
||||||
|
elif [ "$2" == "-E" ]; then
|
||||||
|
SEANDROID_OPTION=$2
|
||||||
|
else
|
||||||
|
NO_JOB=
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$3" == "-B" ]; then
|
||||||
|
SECURE_OPTION=$3
|
||||||
|
elif [ "$3" == "-E" ]; then
|
||||||
|
SEANDROID_OPTION=$3
|
||||||
|
else
|
||||||
|
NO_JOB=
|
||||||
|
fi
|
||||||
|
|
||||||
|
MODEL=${BUILD_COMMAND%%_*}
|
||||||
|
TEMP=${BUILD_COMMAND#*_}
|
||||||
|
REGION=${TEMP%%_*}
|
||||||
|
CARRIER=${TEMP##*_}
|
||||||
|
|
||||||
|
VARIANT=${CARRIER}
|
||||||
|
PROJECT_NAME=${VARIANT}
|
||||||
|
VARIANT_DEFCONFIG=msm8952_sec_${MODEL}_${CARRIER}_defconfig
|
||||||
|
|
||||||
|
CERTIFICATION=NONCERT
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
clean)
|
||||||
|
echo "Not support... remove kernel out directory by yourself"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
|
||||||
|
BOARD_KERNEL_BASE=0x80000000
|
||||||
|
BOARD_KERNEL_PAGESIZE=2048
|
||||||
|
BOARD_KERNEL_TAGS_OFFSET=0x01E00000
|
||||||
|
BOARD_RAMDISK_OFFSET=0x02000000
|
||||||
|
#BOARD_KERNEL_CMDLINE="console=ttyHSL0,115200,n8 androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3"
|
||||||
|
BOARD_KERNEL_CMDLINE="console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0 androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 androidboot.bootdevice=7824900.sdhci"
|
||||||
|
# BOARD_KERNEL_CMDLINE="console=ttyHSL0,115200,n8 androidboot.hardware=qcom androidboot.bootdevice=soc.0/7824900.sdhci user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 video=vfb:640x400,bpp=32,memsize=3072000 earlyprintk"
|
||||||
|
mkdir -p $BUILD_KERNEL_OUT_DIR
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
KERNEL_ZIMG=$BUILD_KERNEL_OUT_DIR/arch/arm/boot/zImage
|
||||||
|
DTC=$BUILD_KERNEL_OUT_DIR/scripts/dtc/dtc
|
||||||
|
|
||||||
|
FUNC_CLEAN_DTB()
|
||||||
|
{
|
||||||
|
if ! [ -d $BUILD_KERNEL_OUT_DIR/arch/arm/boot/dts ] ; then
|
||||||
|
echo "no directory : "$BUILD_KERNEL_OUT_DIR/arch/arm/boot/dts""
|
||||||
|
else
|
||||||
|
echo "rm files in : "$BUILD_KERNEL_OUT_DIR/arch/arm/boot/dts/*.dtb""
|
||||||
|
rm $BUILD_KERNEL_OUT_DIR/arch/arm/boot/dts/*.dtb
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTALLED_DTIMAGE_TARGET=${PRODUCT_OUT}/dt.img
|
||||||
|
DTBTOOL=$BUILD_KERNEL_DIR/tools/dtbTool
|
||||||
|
|
||||||
|
FUNC_BUILD_DTIMAGE_TARGET()
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo "================================="
|
||||||
|
echo "START : FUNC_BUILD_DTIMAGE_TARGET"
|
||||||
|
echo "================================="
|
||||||
|
echo ""
|
||||||
|
echo "DT image target : $INSTALLED_DTIMAGE_TARGET"
|
||||||
|
|
||||||
|
if ! [ -e $DTBTOOL ] ; then
|
||||||
|
if ! [ -d $BUILD_ROOT_DIR/android/out/host/linux-x86/bin ] ; then
|
||||||
|
mkdir -p $BUILD_ROOT_DIR/android/out/host/linux-x86/bin
|
||||||
|
fi
|
||||||
|
cp $BUILD_ROOT_DIR/kernel/tools/dtbTool $DTBTOOL
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$DTBTOOL -o $INSTALLED_DTIMAGE_TARGET -s $BOARD_KERNEL_PAGESIZE \
|
||||||
|
-p $BUILD_KERNEL_OUT_DIR/scripts/dtc/ $BUILD_KERNEL_OUT_DIR/arch/arm/boot/dts/"
|
||||||
|
$DTBTOOL -o $INSTALLED_DTIMAGE_TARGET -s $BOARD_KERNEL_PAGESIZE \
|
||||||
|
-p $BUILD_KERNEL_OUT_DIR/scripts/dtc/ $BUILD_KERNEL_OUT_DIR/arch/arm/boot/dts/
|
||||||
|
|
||||||
|
chmod a+r $INSTALLED_DTIMAGE_TARGET
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "================================="
|
||||||
|
echo "END : FUNC_BUILD_DTIMAGE_TARGET"
|
||||||
|
echo "================================="
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
FUNC_BUILD_KERNEL()
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo "=============================================="
|
||||||
|
echo "START : FUNC_BUILD_KERNEL"
|
||||||
|
echo "=============================================="
|
||||||
|
echo ""
|
||||||
|
echo "build project="$PROJECT_NAME""
|
||||||
|
echo "build common config="$KERNEL_DEFCONFIG ""
|
||||||
|
echo "build variant config="$VARIANT_DEFCONFIG ""
|
||||||
|
echo "build secure option="$SECURE_OPTION ""
|
||||||
|
echo "build SEANDROID option="$SEANDROID_OPTION ""
|
||||||
|
echo "build selinux defconfig="$SELINUX_DEFCONFIG ""
|
||||||
|
echo "build selinux log defconfig="$SELINUX_LOG_DEFCONFIG ""
|
||||||
|
echo "build tima defconfig="$TIMA_DEFCONFIG ""
|
||||||
|
|
||||||
|
if [ "$BUILD_COMMAND" == "" ]; then
|
||||||
|
SECFUNC_PRINT_HELP;
|
||||||
|
exit -1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
FUNC_CLEAN_DTB
|
||||||
|
|
||||||
|
make -C $BUILD_KERNEL_DIR O=$BUILD_KERNEL_OUT_DIR -j$BUILD_JOB_NUMBER ARCH=arm \
|
||||||
|
CROSS_COMPILE=$BUILD_CROSS_COMPILE \
|
||||||
|
VARIANT_DEFCONFIG=$VARIANT_DEFCONFIG \
|
||||||
|
DEBUG_DEFCONFIG=$DEBUG_DEFCONFIG $KERNEL_DEFCONFIG\
|
||||||
|
SELINUX_DEFCONFIG=$SELINUX_DEFCONFIG \
|
||||||
|
SELINUX_LOG_DEFCONFIG=$SELINUX_LOG_DEFCONFIG || exit -1
|
||||||
|
|
||||||
|
make -C $BUILD_KERNEL_DIR O=$BUILD_KERNEL_OUT_DIR -j$BUILD_JOB_NUMBER ARCH=arm \
|
||||||
|
CROSS_COMPILE=$BUILD_CROSS_COMPILE || exit -1
|
||||||
|
|
||||||
|
FUNC_BUILD_DTIMAGE_TARGET
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "================================="
|
||||||
|
echo "END : FUNC_BUILD_KERNEL"
|
||||||
|
echo "================================="
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
FUNC_MKBOOTIMG()
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo "==================================="
|
||||||
|
echo "START : FUNC_MKBOOTIMG"
|
||||||
|
echo "==================================="
|
||||||
|
echo ""
|
||||||
|
MKBOOTIMGTOOL=$BUILD_ROOT_DIR/android/kernel/tools/mkbootimg
|
||||||
|
|
||||||
|
if ! [ -e $MKBOOTIMGTOOL ] ; then
|
||||||
|
if ! [ -d $BUILD_ROOT_DIR/android/out/host/linux-x86/bin ] ; then
|
||||||
|
mkdir -p $BUILD_ROOT_DIR/android/out/host/linux-x86/bin
|
||||||
|
fi
|
||||||
|
cp $BUILD_ROOT_DIR/android/kernel/tools/mkbootimg $MKBOOTIMGTOOL
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Making boot.img ..."
|
||||||
|
echo " $MKBOOTIMGTOOL --kernel $KERNEL_ZIMG \
|
||||||
|
--ramdisk $PRODUCT_OUT/ramdisk.img \
|
||||||
|
--output $PRODUCT_OUT/boot.img \
|
||||||
|
--cmdline "$BOARD_KERNEL_CMDLINE" \
|
||||||
|
--base $BOARD_KERNEL_BASE \
|
||||||
|
--pagesize $BOARD_KERNEL_PAGESIZE \
|
||||||
|
--ramdisk_offset $BOARD_RAMDISK_OFFSET \
|
||||||
|
--tags_offset $BOARD_KERNEL_TAGS_OFFSET \
|
||||||
|
--dt $INSTALLED_DTIMAGE_TARGET"
|
||||||
|
|
||||||
|
$MKBOOTIMGTOOL --kernel $KERNEL_ZIMG \
|
||||||
|
--ramdisk $PRODUCT_OUT/ramdisk.img \
|
||||||
|
--output $PRODUCT_OUT/boot.img \
|
||||||
|
--cmdline "$BOARD_KERNEL_CMDLINE" \
|
||||||
|
--base $BOARD_KERNEL_BASE \
|
||||||
|
--pagesize $BOARD_KERNEL_PAGESIZE \
|
||||||
|
--ramdisk_offset $BOARD_RAMDISK_OFFSET \
|
||||||
|
--tags_offset $BOARD_KERNEL_TAGS_OFFSET \
|
||||||
|
--dt $INSTALLED_DTIMAGE_TARGET
|
||||||
|
|
||||||
|
if [ "$SEANDROID_OPTION" == "-E" ] ; then
|
||||||
|
FUNC_SEANDROID
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SECURE_OPTION" == "-B" ]; then
|
||||||
|
FUNC_SECURE_SIGNING
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd $PRODUCT_OUT
|
||||||
|
tar cvf boot_${MODEL}_${CARRIER}_${CERTIFICATION}.tar boot.img
|
||||||
|
|
||||||
|
cd $BUILD_ROOT_DIR
|
||||||
|
if ! [ -d output ] ; then
|
||||||
|
mkdir -p output
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "================================================="
|
||||||
|
echo "-->Note, copy to $BUILD_TOP_DIR/../output/ directory"
|
||||||
|
echo "================================================="
|
||||||
|
cp $PRODUCT_OUT/boot_${MODEL}_${CARRIER}_${CERTIFICATION}.tar $BUILD_ROOT_DIR/output/boot_${MODEL}_${CARRIER}_${CERTIFICATION}.tar || exit -1
|
||||||
|
cd ~
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "==================================="
|
||||||
|
echo "END : FUNC_MKBOOTIMG"
|
||||||
|
echo "==================================="
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
FUNC_SEANDROID()
|
||||||
|
{
|
||||||
|
echo -n "SEANDROIDENFORCE" >> $PRODUCT_OUT/boot.img
|
||||||
|
}
|
||||||
|
|
||||||
|
FUNC_SECURE_SIGNING()
|
||||||
|
{
|
||||||
|
echo "java -jar $SECURE_SCRIPT -model $SIGN_MODEL -runtype ss_openssl_sha -input $PRODUCT_OUT/boot.img -output $PRODUCT_OUT/signed_boot.img"
|
||||||
|
openssl dgst -sha256 -binary $PRODUCT_OUT/boot.img > sig_32
|
||||||
|
java -jar $SECURE_SCRIPT -runtype ss_openssl_sha -model $SIGN_MODEL -input sig_32 -output sig_256
|
||||||
|
cat $PRODUCT_OUT/boot.img sig_256 > $PRODUCT_OUT/signed_boot.img
|
||||||
|
|
||||||
|
mv -f $PRODUCT_OUT/boot.img $PRODUCT_OUT/unsigned_boot.img
|
||||||
|
mv -f $PRODUCT_OUT/signed_boot.img $PRODUCT_OUT/boot.img
|
||||||
|
|
||||||
|
CERTIFICATION=CERT
|
||||||
|
}
|
||||||
|
|
||||||
|
SECFUNC_PRINT_HELP()
|
||||||
|
{
|
||||||
|
echo -e '\E[33m'
|
||||||
|
echo "Help"
|
||||||
|
echo "$0 \$1 \$2 \$3"
|
||||||
|
echo " \$1 : "
|
||||||
|
echo " for 8952 LTE_EUR_OPEN use lte_eur"
|
||||||
|
echo " for 8952 A7XLTE_CHN_CTC use a7xlte_chn"
|
||||||
|
echo " for 8952 J7XLTE_CHN_CTC use j7xlte_chn"
|
||||||
|
echo " \$2 : "
|
||||||
|
echo " -B or Nothing (-B : Secure Binary)"
|
||||||
|
echo " \$3 : "
|
||||||
|
echo " -E or Nothing (-E : SEANDROID Binary)"
|
||||||
|
echo -e '\E[0m'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# MAIN FUNCTION
|
||||||
|
rm -rf ./build.log
|
||||||
|
(
|
||||||
|
START_TIME=`date +%s`
|
||||||
|
|
||||||
|
FUNC_BUILD_KERNEL
|
||||||
|
#FUNC_RAMDISK_EXTRACT_N_COPY
|
||||||
|
FUNC_MKBOOTIMG
|
||||||
|
|
||||||
|
END_TIME=`date +%s`
|
||||||
|
|
||||||
|
let "ELAPSED_TIME=$END_TIME-$START_TIME"
|
||||||
|
echo "Total compile time is $ELAPSED_TIME seconds"
|
||||||
|
) 2>&1 | tee -a ./build.log
|
|
@ -0,0 +1,328 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# MSM8916 KK kernel build script v0.5
|
||||||
|
|
||||||
|
BUILD_COMMAND=$1
|
||||||
|
if [ "$BUILD_COMMAND" == "a9xlte_chn" ]; then
|
||||||
|
PRODUCT_NAME=a9xlte
|
||||||
|
SIGN_MODEL=SM-A9000_CHN_CHC_ROOT0
|
||||||
|
elif [ "$BUILD_COMMAND" == "a9xlte_chnldu" ]; then
|
||||||
|
PRODUCT_NAME=a9xlte_chnldu
|
||||||
|
SIGN_MODEL=SM-A9000_CHN_CHC_ROOT0
|
||||||
|
elif [ "$BUILD_COMMAND" == "a9xprolte_chn" ]; then
|
||||||
|
PRODUCT_NAME=a9xproltechn
|
||||||
|
SIGN_MODEL=SM-A9100_CHN_CHC_ROOT0
|
||||||
|
elif [ "$BUILD_COMMAND" == "gts28velte_eur" ]; then
|
||||||
|
PRODUCT_NAME=gts28velte
|
||||||
|
SIGN_MODEL=SM-T719_EUR_XX_ROOT0
|
||||||
|
elif [ "$BUILD_COMMAND" == "gts28velte_chn" ]; then
|
||||||
|
PRODUCT_NAME=gts28veltechn
|
||||||
|
SIGN_MODEL=
|
||||||
|
elif [ "$BUILD_COMMAND" == "gts210velte_eur" ]; then
|
||||||
|
PRODUCT_NAME=gts210velte
|
||||||
|
SIGN_MODEL=SM-T819_EUR_XX_ROOT0
|
||||||
|
elif [ "$BUILD_COMMAND" == "gts28vewifi_eur" ]; then
|
||||||
|
PRODUCT_NAME=gts28vewifi
|
||||||
|
SIGN_MODEL=
|
||||||
|
elif [ "$BUILD_COMMAND" == "c9lte_chn" ]; then
|
||||||
|
PRODUCT_NAME=c9ltechn
|
||||||
|
SIGN_MODEL=
|
||||||
|
fi
|
||||||
|
|
||||||
|
BUILD_WHERE=$(pwd)
|
||||||
|
BUILD_KERNEL_DIR=$BUILD_WHERE
|
||||||
|
BUILD_ROOT_DIR=$BUILD_KERNEL_DIR/../..
|
||||||
|
BUILD_KERNEL_OUT_DIR=$BUILD_ROOT_DIR/android/out/target/product/$PRODUCT_NAME/obj/KERNEL_OBJ
|
||||||
|
PRODUCT_OUT=$BUILD_ROOT_DIR/android/out/target/product/$PRODUCT_NAME
|
||||||
|
|
||||||
|
|
||||||
|
SECURE_SCRIPT=$BUILD_ROOT_DIR/buildscript/tools/signclient.jar
|
||||||
|
BUILD_CROSS_COMPILE=$BUILD_ROOT_DIR/android/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
|
||||||
|
BUILD_JOB_NUMBER=`grep processor /proc/cpuinfo|wc -l`
|
||||||
|
|
||||||
|
# Default Python version is 2.7
|
||||||
|
mkdir -p bin
|
||||||
|
ln -sf /usr/bin/python2.7 ./bin/python
|
||||||
|
export PATH=$(pwd)/bin:$PATH
|
||||||
|
|
||||||
|
KERNEL_DEFCONFIG=msm8976_sec_defconfig
|
||||||
|
DEBUG_DEFCONFIG=msm8976_sec_eng_defconfig
|
||||||
|
SELINUX_DEFCONFIG=selinux_defconfig
|
||||||
|
SELINUX_LOG_DEFCONFIG=selinux_log_defconfig
|
||||||
|
DMVERITY_DEFCONFIG=dmverity_defconfig
|
||||||
|
|
||||||
|
while getopts "w:t:" flag; do
|
||||||
|
case $flag in
|
||||||
|
w)
|
||||||
|
BUILD_OPTION_HW_REVISION=$OPTARG
|
||||||
|
echo "-w : "$BUILD_OPTION_HW_REVISION""
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
TARGET_BUILD_VARIANT=$OPTARG
|
||||||
|
echo "-t : "$TARGET_BUILD_VARIANT""
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "wrong 2nd param : "$OPTARG""
|
||||||
|
exit -1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
BUILD_COMMAND=$1
|
||||||
|
SECURE_OPTION=
|
||||||
|
SEANDROID_OPTION=
|
||||||
|
if [ "$2" == "-B" ]; then
|
||||||
|
SECURE_OPTION=$2
|
||||||
|
elif [ "$2" == "-E" ]; then
|
||||||
|
SEANDROID_OPTION=$2
|
||||||
|
else
|
||||||
|
NO_JOB=
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$3" == "-B" ]; then
|
||||||
|
SECURE_OPTION=$3
|
||||||
|
elif [ "$3" == "-E" ]; then
|
||||||
|
SEANDROID_OPTION=$3
|
||||||
|
else
|
||||||
|
NO_JOB=
|
||||||
|
fi
|
||||||
|
|
||||||
|
MODEL=${BUILD_COMMAND%%_*}
|
||||||
|
TEMP=${BUILD_COMMAND#*_}
|
||||||
|
REGION=${TEMP%%_*}
|
||||||
|
CARRIER=${TEMP##*_}
|
||||||
|
|
||||||
|
VARIANT=k${CARRIER}
|
||||||
|
PROJECT_NAME=${VARIANT}
|
||||||
|
VARIANT_DEFCONFIG=msm8976_sec_${MODEL}_${CARRIER}_defconfig
|
||||||
|
|
||||||
|
CERTIFICATION=NONCERT
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
clean)
|
||||||
|
echo "Not support... remove kernel out directory by yourself"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
BOARD_KERNEL_BASE=0x80000000
|
||||||
|
BOARD_KERNEL_PAGESIZE=2048
|
||||||
|
BOARD_KERNEL_TAGS_OFFSET=0x01E00000
|
||||||
|
BOARD_RAMDISK_OFFSET=0x02000000
|
||||||
|
# BOARD_KERNEL_CMDLINE="console=null androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 boot_cpus=0-5 androidboot.bootdevice=f9824900.sdhci"
|
||||||
|
BOARD_KERNEL_CMDLINE="console=null androidboot.hardware=qcom msm_rtb.filter=0x237 ehci-hcd.park=3 androidboot.bootdevice=7824900.sdhci lpm_levels.sleep_disabled=1 earlyprintk"
|
||||||
|
mkdir -p $BUILD_KERNEL_OUT_DIR
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
KERNEL_ZIMG=$BUILD_KERNEL_OUT_DIR/arch/arm64/boot/Image.gz
|
||||||
|
DTC=$BUILD_KERNEL_OUT_DIR/scripts/dtc/dtc
|
||||||
|
|
||||||
|
FUNC_CLEAN_DTB()
|
||||||
|
{
|
||||||
|
if ! [ -d $BUILD_KERNEL_OUT_DIR/arch/arm64/boot/dts ] ; then
|
||||||
|
echo "no directory : "$BUILD_KERNEL_OUT_DIR/arch/arm64/boot/dts""
|
||||||
|
else
|
||||||
|
echo "rm files in : "$BUILD_KERNEL_OUT_DIR/arch/arm64/boot/dts/*.dtb""
|
||||||
|
rm $BUILD_KERNEL_OUT_DIR/arch/arm64/boot/dts/*.dtb
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTALLED_DTIMAGE_TARGET=${PRODUCT_OUT}/dt.img
|
||||||
|
DTBTOOL=$BUILD_KERNEL_DIR/tools/dtbTool
|
||||||
|
|
||||||
|
FUNC_BUILD_DTIMAGE_TARGET()
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo "================================="
|
||||||
|
echo "START : FUNC_BUILD_DTIMAGE_TARGET"
|
||||||
|
echo "================================="
|
||||||
|
echo ""
|
||||||
|
echo "DT image target : $INSTALLED_DTIMAGE_TARGET"
|
||||||
|
|
||||||
|
if ! [ -e $DTBTOOL ] ; then
|
||||||
|
if ! [ -d $BUILD_ROOT_DIR/android/out/host/linux-x86/bin ] ; then
|
||||||
|
mkdir -p $BUILD_ROOT_DIR/android/out/host/linux-x86/bin
|
||||||
|
fi
|
||||||
|
cp $BUILD_ROOT_DIR/kernel/tools/dtbTool $DTBTOOL
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$DTBTOOL -o $INSTALLED_DTIMAGE_TARGET -s $BOARD_KERNEL_PAGESIZE \
|
||||||
|
-p $BUILD_KERNEL_OUT_DIR/scripts/dtc/ $BUILD_KERNEL_OUT_DIR/arch/arm64/boot/dts/"
|
||||||
|
$DTBTOOL -o $INSTALLED_DTIMAGE_TARGET -s $BOARD_KERNEL_PAGESIZE \
|
||||||
|
-p $BUILD_KERNEL_OUT_DIR/scripts/dtc/ $BUILD_KERNEL_OUT_DIR/arch/arm64/boot/dts/
|
||||||
|
|
||||||
|
chmod a+r $INSTALLED_DTIMAGE_TARGET
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "================================="
|
||||||
|
echo "END : FUNC_BUILD_DTIMAGE_TARGET"
|
||||||
|
echo "================================="
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
FUNC_BUILD_KERNEL()
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo "=============================================="
|
||||||
|
echo "START : FUNC_BUILD_KERNEL"
|
||||||
|
echo "=============================================="
|
||||||
|
echo ""
|
||||||
|
echo "build project="$PROJECT_NAME""
|
||||||
|
echo "build common config="$KERNEL_DEFCONFIG ""
|
||||||
|
echo "build variant config="$VARIANT_DEFCONFIG ""
|
||||||
|
echo "build secure option="$SECURE_OPTION ""
|
||||||
|
echo "build SEANDROID option="$SEANDROID_OPTION ""
|
||||||
|
echo "build selinux defconfig="$SELINUX_DEFCONFIG ""
|
||||||
|
echo "build selinux log defconfig="$SELINUX_LOG_DEFCONFIG ""
|
||||||
|
echo "build tima defconfig="$TIMA_DEFCONFIG ""
|
||||||
|
|
||||||
|
if [ "$BUILD_COMMAND" == "" ]; then
|
||||||
|
SECFUNC_PRINT_HELP;
|
||||||
|
exit -1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
FUNC_CLEAN_DTB
|
||||||
|
|
||||||
|
make -C $BUILD_KERNEL_DIR O=$BUILD_KERNEL_OUT_DIR -j$BUILD_JOB_NUMBER ARCH=arm64 \
|
||||||
|
CROSS_COMPILE=$BUILD_CROSS_COMPILE \
|
||||||
|
VARIANT_DEFCONFIG=$VARIANT_DEFCONFIG \
|
||||||
|
DEBUG_DEFCONFIG=$DEBUG_DEFCONFIG $KERNEL_DEFCONFIG \
|
||||||
|
SELINUX_DEFCONFIG=$SELINUX_DEFCONFIG \
|
||||||
|
SELINUX_LOG_DEFCONFIG=$SELINUX_LOG_DEFCONFIG || exit -1
|
||||||
|
|
||||||
|
make -C $BUILD_KERNEL_DIR O=$BUILD_KERNEL_OUT_DIR -j$BUILD_JOB_NUMBER ARCH=arm64 \
|
||||||
|
CROSS_COMPILE=$BUILD_CROSS_COMPILE || exit -1
|
||||||
|
|
||||||
|
FUNC_BUILD_DTIMAGE_TARGET
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "================================="
|
||||||
|
echo "END : FUNC_BUILD_KERNEL"
|
||||||
|
echo "================================="
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
FUNC_MKBOOTIMG()
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo "==================================="
|
||||||
|
echo "START : FUNC_MKBOOTIMG"
|
||||||
|
echo "==================================="
|
||||||
|
echo ""
|
||||||
|
MKBOOTIMGTOOL=$BUILD_ROOT_DIR/android/kernel/tools/mkbootimg
|
||||||
|
|
||||||
|
if ! [ -e $MKBOOTIMGTOOL ] ; then
|
||||||
|
if ! [ -d $BUILD_ROOT_DIR/android/out/host/linux-x86/bin ] ; then
|
||||||
|
mkdir -p $BUILD_ROOT_DIR/android/out/host/linux-x86/bin
|
||||||
|
fi
|
||||||
|
cp $BUILD_ROOT_DIR/anroid/kernel/tools/mkbootimg $MKBOOTIMGTOOL
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Making boot.img ..."
|
||||||
|
echo " $MKBOOTIMGTOOL --kernel $KERNEL_ZIMG \
|
||||||
|
--ramdisk $PRODUCT_OUT/ramdisk.img \
|
||||||
|
--output $PRODUCT_OUT/boot.img \
|
||||||
|
--cmdline "$BOARD_KERNEL_CMDLINE" \
|
||||||
|
--base $BOARD_KERNEL_BASE \
|
||||||
|
--pagesize $BOARD_KERNEL_PAGESIZE \
|
||||||
|
--ramdisk_offset $BOARD_RAMDISK_OFFSET \
|
||||||
|
--tags_offset $BOARD_KERNEL_TAGS_OFFSET \
|
||||||
|
--dt $INSTALLED_DTIMAGE_TARGET"
|
||||||
|
|
||||||
|
$MKBOOTIMGTOOL --kernel $KERNEL_ZIMG \
|
||||||
|
--ramdisk $PRODUCT_OUT/ramdisk.img \
|
||||||
|
--output $PRODUCT_OUT/boot.img \
|
||||||
|
--cmdline "$BOARD_KERNEL_CMDLINE" \
|
||||||
|
--base $BOARD_KERNEL_BASE \
|
||||||
|
--pagesize $BOARD_KERNEL_PAGESIZE \
|
||||||
|
--ramdisk_offset $BOARD_RAMDISK_OFFSET \
|
||||||
|
--tags_offset $BOARD_KERNEL_TAGS_OFFSET \
|
||||||
|
--dt $INSTALLED_DTIMAGE_TARGET
|
||||||
|
|
||||||
|
if [ "$SEANDROID_OPTION" == "-E" ] ; then
|
||||||
|
FUNC_SEANDROID
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SECURE_OPTION" == "-B" ]; then
|
||||||
|
FUNC_SECURE_SIGNING
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd $PRODUCT_OUT
|
||||||
|
tar cvf boot_${MODEL}_${CARRIER}_${CERTIFICATION}.tar boot.img
|
||||||
|
|
||||||
|
cd $BUILD_ROOT_DIR
|
||||||
|
if ! [ -d output ] ; then
|
||||||
|
mkdir -p output
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "================================================="
|
||||||
|
echo "-->Note, copy to $BUILD_TOP_DIR/../output/ directory"
|
||||||
|
echo "================================================="
|
||||||
|
cp $PRODUCT_OUT/boot_${MODEL}_${CARRIER}_${CERTIFICATION}.tar $BUILD_ROOT_DIR/output/boot_${MODEL}_${CARRIER}_${CERTIFICATION}.tar || exit -1
|
||||||
|
cd ~
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "==================================="
|
||||||
|
echo "END : FUNC_MKBOOTIMG"
|
||||||
|
echo "==================================="
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
FUNC_SEANDROID()
|
||||||
|
{
|
||||||
|
echo -n "SEANDROIDENFORCE" >> $PRODUCT_OUT/boot.img
|
||||||
|
}
|
||||||
|
|
||||||
|
FUNC_SECURE_SIGNING()
|
||||||
|
{
|
||||||
|
echo "java -jar $SECURE_SCRIPT -model $SIGN_MODEL -runtype ss_openssl_sha -input $PRODUCT_OUT/boot.img -output $PRODUCT_OUT/signed_boot.img"
|
||||||
|
openssl dgst -sha256 -binary $PRODUCT_OUT/boot.img > sig_32
|
||||||
|
java -jar $SECURE_SCRIPT -runtype ss_openssl_sha -model $SIGN_MODEL -input sig_32 -output sig_256
|
||||||
|
cat $PRODUCT_OUT/boot.img sig_256 > $PRODUCT_OUT/signed_boot.img
|
||||||
|
|
||||||
|
mv -f $PRODUCT_OUT/boot.img $PRODUCT_OUT/unsigned_boot.img
|
||||||
|
mv -f $PRODUCT_OUT/signed_boot.img $PRODUCT_OUT/boot.img
|
||||||
|
|
||||||
|
CERTIFICATION=CERT
|
||||||
|
}
|
||||||
|
|
||||||
|
SECFUNC_PRINT_HELP()
|
||||||
|
{
|
||||||
|
echo -e '\E[33m'
|
||||||
|
echo "Help"
|
||||||
|
echo "$0 \$1 \$2 \$3"
|
||||||
|
echo " \$1 : "
|
||||||
|
echo " for A9XLTE CHN OPEN use a9xlte_chn"
|
||||||
|
echo " for A9XLTE CHN LDU use a9xlte_chnldu"
|
||||||
|
echo " for A9XPROLTE CHN OPEN use a9xprolte_chn"
|
||||||
|
echo " for C9LTE CHN OPEN use c9lte_chn"
|
||||||
|
echo " for GTS28VELTE EUR OPEN use gts28velte_eur"
|
||||||
|
echo " for GTS28VELTE CHN OPEN use gts28velte_chn"
|
||||||
|
echo " for GTS210VELTE EUR OPEN use gts210velte_eur"
|
||||||
|
echo " for GTS28VEWIFI EUR OPEN use gts28vewifi_eur"
|
||||||
|
echo " \$2 : "
|
||||||
|
echo " -B or Nothing (-B : Secure Binary)"
|
||||||
|
echo " \$3 : "
|
||||||
|
echo " -E or Nothing (-E : SEANDROID Binary)"
|
||||||
|
echo -e '\E[0m'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# MAIN FUNCTION
|
||||||
|
rm -rf ./build.log
|
||||||
|
(
|
||||||
|
START_TIME=`date +%s`
|
||||||
|
|
||||||
|
FUNC_BUILD_KERNEL
|
||||||
|
#FUNC_RAMDISK_EXTRACT_N_COPY
|
||||||
|
FUNC_MKBOOTIMG
|
||||||
|
|
||||||
|
END_TIME=`date +%s`
|
||||||
|
|
||||||
|
let "ELAPSED_TIME=$END_TIME-$START_TIME"
|
||||||
|
echo "Total compile time is $ELAPSED_TIME seconds"
|
||||||
|
) 2>&1 | tee -a ./build.log
|
|
@ -2760,6 +2760,7 @@ int hif_reset_target(HIF_DEVICE *hif_device)
|
||||||
("AR6000: %s invalid HIF DEVICE \n", __func__));
|
("AR6000: %s invalid HIF DEVICE \n", __func__));
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
sdio_claim_host(hif_device->func);
|
||||||
/* Disable sdio func->pull down WLAN_EN-->pull down DAT_2 line */
|
/* Disable sdio func->pull down WLAN_EN-->pull down DAT_2 line */
|
||||||
ret = mmc_power_save_host(hif_device->func->card->host);
|
ret = mmc_power_save_host(hif_device->func->card->host);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
|
@ -2778,6 +2779,7 @@ int hif_reset_target(HIF_DEVICE *hif_device)
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
sdio_release_host(hif_device->func);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -389,7 +389,7 @@ cmd_parsing(const char *buf, unsigned short cnt, unsigned short *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parsing_cnt < cnt)
|
if (parsing_cnt < cnt)
|
||||||
*(data + parsing_cnt) = val;
|
*(data + parsing_cnt) = (unsigned short)val;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
parsing_cnt++;
|
parsing_cnt++;
|
||||||
|
|
|
@ -478,7 +478,7 @@ cmd_parsing(const char *buf, unsigned short cnt, unsigned short *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parsing_cnt < cnt)
|
if (parsing_cnt < cnt)
|
||||||
*(data + parsing_cnt) = val;
|
*(data + parsing_cnt) = (unsigned short)val;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
parsing_cnt++;
|
parsing_cnt++;
|
||||||
|
|
|
@ -4153,7 +4153,7 @@ static void load_tuning_file(struct device *dev, char *filename)
|
||||||
filp = filp_open(filename, O_RDONLY, 0);
|
filp = filp_open(filename, O_RDONLY, 0);
|
||||||
if (IS_ERR(filp)) {
|
if (IS_ERR(filp)) {
|
||||||
printk(KERN_ERR "%s File open failed\n", __func__);
|
printk(KERN_ERR "%s File open failed\n", __func__);
|
||||||
return;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
l = filp->f_path.dentry->d_inode->i_size;
|
l = filp->f_path.dentry->d_inode->i_size;
|
||||||
|
@ -4163,7 +4163,7 @@ static void load_tuning_file(struct device *dev, char *filename)
|
||||||
if (dp == NULL) {
|
if (dp == NULL) {
|
||||||
LCD_INFO("Can't not alloc memory for tuning file load\n");
|
LCD_INFO("Can't not alloc memory for tuning file load\n");
|
||||||
filp_close(filp, current->files);
|
filp_close(filp, current->files);
|
||||||
return;
|
goto err;
|
||||||
}
|
}
|
||||||
pos = 0;
|
pos = 0;
|
||||||
memset(dp, 0, l);
|
memset(dp, 0, l);
|
||||||
|
@ -4176,7 +4176,7 @@ static void load_tuning_file(struct device *dev, char *filename)
|
||||||
LCD_INFO("vfs_read() filed ret : %d\n", ret);
|
LCD_INFO("vfs_read() filed ret : %d\n", ret);
|
||||||
kfree(dp);
|
kfree(dp);
|
||||||
filp_close(filp, current->files);
|
filp_close(filp, current->files);
|
||||||
return;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
filp_close(filp, current->files);
|
filp_close(filp, current->files);
|
||||||
|
@ -4186,6 +4186,10 @@ static void load_tuning_file(struct device *dev, char *filename)
|
||||||
sending_tune_cmd(dev, dp, l);
|
sending_tune_cmd(dev, dp, l);
|
||||||
|
|
||||||
kfree(dp);
|
kfree(dp);
|
||||||
|
|
||||||
|
return;
|
||||||
|
err:
|
||||||
|
set_fs(fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t tuning_show(struct device *dev,
|
static ssize_t tuning_show(struct device *dev,
|
||||||
|
@ -4280,7 +4284,8 @@ int mdss_samsung_read_otherline_panel_data(struct samsung_display_driver_data *v
|
||||||
|
|
||||||
if (!IS_ERR_OR_NULL(vdd->panel_func.set_panel_fab_type))
|
if (!IS_ERR_OR_NULL(vdd->panel_func.set_panel_fab_type))
|
||||||
vdd->panel_func.set_panel_fab_type(BASIC_FB_PANLE_TYPE);/*to work as original line panel*/
|
vdd->panel_func.set_panel_fab_type(BASIC_FB_PANLE_TYPE);/*to work as original line panel*/
|
||||||
return -ENOENT;
|
ret = -ENOENT;
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
l = filp->f_path.dentry->d_inode->i_size;
|
l = filp->f_path.dentry->d_inode->i_size;
|
||||||
|
@ -4290,7 +4295,8 @@ int mdss_samsung_read_otherline_panel_data(struct samsung_display_driver_data *v
|
||||||
if (dp == NULL) {
|
if (dp == NULL) {
|
||||||
LCD_INFO("Can't not alloc memory for tuning file load\n");
|
LCD_INFO("Can't not alloc memory for tuning file load\n");
|
||||||
filp_close(filp, current->files);
|
filp_close(filp, current->files);
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
pos = 0;
|
pos = 0;
|
||||||
memset(dp, 0, l);
|
memset(dp, 0, l);
|
||||||
|
@ -4303,7 +4309,8 @@ int mdss_samsung_read_otherline_panel_data(struct samsung_display_driver_data *v
|
||||||
LCD_INFO("vfs_read() filed ret : %d\n", ret);
|
LCD_INFO("vfs_read() filed ret : %d\n", ret);
|
||||||
kfree(dp);
|
kfree(dp);
|
||||||
filp_close(filp, current->files);
|
filp_close(filp, current->files);
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IS_ERR_OR_NULL(vdd->panel_func.parsing_otherline_pdata))
|
if (!IS_ERR_OR_NULL(vdd->panel_func.parsing_otherline_pdata))
|
||||||
|
@ -4315,6 +4322,9 @@ int mdss_samsung_read_otherline_panel_data(struct samsung_display_driver_data *v
|
||||||
|
|
||||||
kfree(dp);
|
kfree(dp);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
err:
|
||||||
|
set_fs(fs);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -161,6 +161,13 @@ typedef struct {
|
||||||
u32 cache_valid_id; // for avoiding the race between alloc and free
|
u32 cache_valid_id; // for avoiding the race between alloc and free
|
||||||
} EXTENT_T;
|
} EXTENT_T;
|
||||||
|
|
||||||
|
/* first empty entry hint information */
|
||||||
|
typedef struct {
|
||||||
|
s32 eidx; // entry index of a directory
|
||||||
|
s32 count; // count of continuous empty entry
|
||||||
|
CHAIN_T cur; // the cluster that first empty slot exists in
|
||||||
|
} HINT_FEMP_T;
|
||||||
|
|
||||||
/* file id structure */
|
/* file id structure */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
CHAIN_T dir;
|
CHAIN_T dir;
|
||||||
|
@ -176,6 +183,7 @@ typedef struct {
|
||||||
EXTENT_T extent; // extent cache for a file
|
EXTENT_T extent; // extent cache for a file
|
||||||
HINT_T hint_bmap; // hint for cluster last accessed
|
HINT_T hint_bmap; // hint for cluster last accessed
|
||||||
HINT_T hint_stat; // hint for entry index we try to lookup next time
|
HINT_T hint_stat; // hint for entry index we try to lookup next time
|
||||||
|
HINT_FEMP_T hint_femp; // hint for first empty entry
|
||||||
} FILE_ID_T;
|
} FILE_ID_T;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -195,14 +203,6 @@ typedef struct {
|
||||||
DENTRY_NAMEBUF_T NameBuf;
|
DENTRY_NAMEBUF_T NameBuf;
|
||||||
} DIR_ENTRY_T;
|
} DIR_ENTRY_T;
|
||||||
|
|
||||||
/* unused entry hint information */
|
|
||||||
typedef struct {
|
|
||||||
u32 dir;
|
|
||||||
s32 entry;
|
|
||||||
s32 n_entry;
|
|
||||||
CHAIN_T clu;
|
|
||||||
} UENTRY_T;
|
|
||||||
|
|
||||||
/* cache information */
|
/* cache information */
|
||||||
typedef struct __cache_entry {
|
typedef struct __cache_entry {
|
||||||
struct __cache_entry *next;
|
struct __cache_entry *next;
|
||||||
|
@ -230,7 +230,7 @@ typedef struct {
|
||||||
s32 (*count_used_clusters)(struct super_block *sb, u32* ret_count);
|
s32 (*count_used_clusters)(struct super_block *sb, u32* ret_count);
|
||||||
s32 (*init_dir_entry)(struct super_block *sb, CHAIN_T *p_dir, s32 entry, u32 type,u32 start_clu, u64 size);
|
s32 (*init_dir_entry)(struct super_block *sb, CHAIN_T *p_dir, s32 entry, u32 type,u32 start_clu, u64 size);
|
||||||
s32 (*init_ext_entry)(struct super_block *sb, CHAIN_T *p_dir, s32 entry, s32 num_entries, UNI_NAME_T *p_uniname, DOS_NAME_T *p_dosname);
|
s32 (*init_ext_entry)(struct super_block *sb, CHAIN_T *p_dir, s32 entry, s32 num_entries, UNI_NAME_T *p_uniname, DOS_NAME_T *p_dosname);
|
||||||
s32 (*find_dir_entry)(struct super_block *sb, CHAIN_T *p_dir, HINT_T *hint_stat, UNI_NAME_T *p_uniname, s32 num_entries, DOS_NAME_T *p_dosname, u32 type);
|
s32 (*find_dir_entry)(struct super_block *sb, FILE_ID_T *fid, CHAIN_T *p_dir, UNI_NAME_T *p_uniname, s32 num_entries, DOS_NAME_T *p_dosname, u32 type);
|
||||||
s32 (*delete_dir_entry)(struct super_block *sb, CHAIN_T *p_dir, s32 entry, s32 offset, s32 num_entries);
|
s32 (*delete_dir_entry)(struct super_block *sb, CHAIN_T *p_dir, s32 entry, s32 offset, s32 num_entries);
|
||||||
void (*get_uniname_from_ext_entry)(struct super_block *sb, CHAIN_T *p_dir, s32 entry, u16 *uniname);
|
void (*get_uniname_from_ext_entry)(struct super_block *sb, CHAIN_T *p_dir, s32 entry, u16 *uniname);
|
||||||
s32 (*count_ext_entries)(struct super_block *sb, CHAIN_T *p_dir, s32 entry, DENTRY_T *p_entry);
|
s32 (*count_ext_entries)(struct super_block *sb, CHAIN_T *p_dir, s32 entry, DENTRY_T *p_entry);
|
||||||
|
@ -280,7 +280,6 @@ typedef struct __FS_INFO_T {
|
||||||
|
|
||||||
u32 clu_srch_ptr; // cluster search pointer
|
u32 clu_srch_ptr; // cluster search pointer
|
||||||
u32 used_clusters; // number of used clusters
|
u32 used_clusters; // number of used clusters
|
||||||
UENTRY_T hint_uentry; // unused entry hint information
|
|
||||||
|
|
||||||
u32 prev_eio; // block device operation error flag
|
u32 prev_eio; // block device operation error flag
|
||||||
|
|
||||||
|
|
258
fs/sdfat/core.c
258
fs/sdfat/core.c
|
@ -283,6 +283,7 @@ out:
|
||||||
static s32 __find_last_cluster(struct super_block *sb, CHAIN_T *p_chain, u32* ret_clu)
|
static s32 __find_last_cluster(struct super_block *sb, CHAIN_T *p_chain, u32* ret_clu)
|
||||||
{
|
{
|
||||||
u32 clu, next;
|
u32 clu, next;
|
||||||
|
s32 count = 0;
|
||||||
next = p_chain->dir;
|
next = p_chain->dir;
|
||||||
|
|
||||||
if (p_chain->flags == 0x03) {
|
if (p_chain->flags == 0x03) {
|
||||||
|
@ -291,11 +292,20 @@ static s32 __find_last_cluster(struct super_block *sb, CHAIN_T *p_chain, u32* re
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
count++;
|
||||||
clu = next;
|
clu = next;
|
||||||
if (fat_ent_get_safe(sb, clu, &next))
|
if (fat_ent_get_safe(sb, clu, &next))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
} while (!IS_CLUS_EOF(next));
|
} while (!IS_CLUS_EOF(next));
|
||||||
|
|
||||||
|
if (p_chain->size != count) {
|
||||||
|
sdfat_fs_error(sb, "bogus directory size "
|
||||||
|
"(clus : ondisk(%d) != counted(%d))",
|
||||||
|
p_chain->size, count);
|
||||||
|
sdfat_debug_bug_on(1);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
*ret_clu = clu;
|
*ret_clu = clu;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -577,6 +587,13 @@ s32 walk_fat_chain(struct super_block *sb, CHAIN_T *p_dir, s32 byte_offset, u32
|
||||||
while (clu_offset > 0) {
|
while (clu_offset > 0) {
|
||||||
if (get_next_clus_safe(sb, &cur_clu))
|
if (get_next_clus_safe(sb, &cur_clu))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
if (IS_CLUS_EOF(cur_clu)) {
|
||||||
|
sdfat_fs_error(sb, "invalid dentry access "
|
||||||
|
"beyond EOF (clu : %u, eidx : %d)",
|
||||||
|
p_dir->dir,
|
||||||
|
byte_offset >> DENTRY_SIZE_BITS);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
clu_offset--;
|
clu_offset--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -653,8 +670,11 @@ DENTRY_T *get_dentry_in_dir(struct super_block *sb, CHAIN_T *p_dir, s32 entry, u
|
||||||
return (DENTRY_T *)(buf + off);
|
return (DENTRY_T *)(buf + off);
|
||||||
} /* end of get_dentry_in_dir */
|
} /* end of get_dentry_in_dir */
|
||||||
|
|
||||||
|
/* used only in search empty_slot() */
|
||||||
|
#define CNT_UNUSED_NOHIT (-1)
|
||||||
|
#define CNT_UNUSED_HIT (-2)
|
||||||
/* search EMPTY CONTINUOUS "num_entries" entries */
|
/* search EMPTY CONTINUOUS "num_entries" entries */
|
||||||
static s32 search_empty_slot(struct super_block *sb, CHAIN_T *p_dir, s32 num_entries)
|
static s32 search_empty_slot(struct super_block *sb, HINT_FEMP_T *hint_femp, CHAIN_T *p_dir, s32 num_entries)
|
||||||
{
|
{
|
||||||
s32 i, dentry, num_empty = 0;
|
s32 i, dentry, num_empty = 0;
|
||||||
s32 dentries_per_clu;
|
s32 dentries_per_clu;
|
||||||
|
@ -668,22 +688,33 @@ static s32 search_empty_slot(struct super_block *sb, CHAIN_T *p_dir, s32 num_ent
|
||||||
else
|
else
|
||||||
dentries_per_clu = fsi->dentries_per_clu;
|
dentries_per_clu = fsi->dentries_per_clu;
|
||||||
|
|
||||||
if (fsi->hint_uentry.dir == p_dir->dir) {
|
ASSERT(-1 <= hint_femp->eidx);
|
||||||
MMSG("%s: uentry HIT (clu:0x%08x ent:%d)\n", __func__,
|
|
||||||
fsi->hint_uentry.clu.dir, fsi->hint_uentry.entry);
|
|
||||||
if (fsi->hint_uentry.entry == -1)
|
|
||||||
return -ENOSPC;
|
|
||||||
|
|
||||||
clu.dir = fsi->hint_uentry.clu.dir;
|
if (hint_femp->eidx != -1) {
|
||||||
clu.size = fsi->hint_uentry.clu.size;
|
clu.dir = hint_femp->cur.dir;
|
||||||
clu.flags = fsi->hint_uentry.clu.flags;
|
clu.size = hint_femp->cur.size;
|
||||||
|
clu.flags = hint_femp->cur.flags;
|
||||||
|
|
||||||
dentry = fsi->hint_uentry.entry;
|
dentry = hint_femp->eidx;
|
||||||
|
|
||||||
|
if (num_entries <= hint_femp->count) {
|
||||||
|
IMSG("%s: empty slot(HIT) - found "
|
||||||
|
"(clu : 0x%08x eidx : %d)\n",
|
||||||
|
__func__, hint_femp->cur.dir, hint_femp->eidx);
|
||||||
|
hint_femp->eidx = -1;
|
||||||
|
|
||||||
|
if (fsi->vol_type == EXFAT)
|
||||||
|
return dentry;
|
||||||
|
|
||||||
|
return dentry + (num_entries - 1);
|
||||||
|
}
|
||||||
|
IMSG("%s: empty slot(HIT) - search from "
|
||||||
|
"(clu : 0x%08x eidx : %d)\n",
|
||||||
|
__func__, hint_femp->cur.dir, hint_femp->eidx);
|
||||||
} else {
|
} else {
|
||||||
MMSG("%s: uentry MISS (clu:0x%08x => 0x%08x)\n", __func__,
|
IMSG("%s: empty slot(MISS) - search from "
|
||||||
fsi->hint_uentry.dir, p_dir->dir);
|
"(clu:0x%08x eidx : 0)\n",
|
||||||
fsi->hint_uentry.dir = CLUS_EOF;
|
__func__, p_dir->dir);
|
||||||
fsi->hint_uentry.entry = -1;
|
|
||||||
|
|
||||||
clu.dir = p_dir->dir;
|
clu.dir = p_dir->dir;
|
||||||
clu.size = p_dir->size;
|
clu.size = p_dir->size;
|
||||||
|
@ -706,36 +737,49 @@ static s32 search_empty_slot(struct super_block *sb, CHAIN_T *p_dir, s32 num_ent
|
||||||
|
|
||||||
type = fsi->fs_func->get_entry_type(ep);
|
type = fsi->fs_func->get_entry_type(ep);
|
||||||
|
|
||||||
if (type == TYPE_UNUSED) {
|
if ((type == TYPE_UNUSED) || (type == TYPE_DELETED)) {
|
||||||
num_empty++;
|
num_empty++;
|
||||||
if (fsi->hint_uentry.entry == -1) {
|
if (hint_femp->eidx == -1) {
|
||||||
fsi->hint_uentry.dir = p_dir->dir;
|
hint_femp->eidx = dentry;
|
||||||
fsi->hint_uentry.entry = dentry;
|
hint_femp->count = CNT_UNUSED_NOHIT;
|
||||||
fsi->hint_uentry.n_entry = INT_MAX;
|
|
||||||
|
|
||||||
fsi->hint_uentry.clu.dir = clu.dir;
|
hint_femp->cur.dir = clu.dir;
|
||||||
fsi->hint_uentry.clu.size = clu.size;
|
hint_femp->cur.size = clu.size;
|
||||||
fsi->hint_uentry.clu.flags = clu.flags;
|
hint_femp->cur.flags = clu.flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((type == TYPE_UNUSED) &&
|
||||||
|
(hint_femp->count != CNT_UNUSED_HIT)) {
|
||||||
|
hint_femp->count = CNT_UNUSED_HIT;
|
||||||
}
|
}
|
||||||
} else if (type == TYPE_DELETED) {
|
|
||||||
num_empty++;
|
|
||||||
} else {
|
} else {
|
||||||
/* TODO : Check whether bogus dentry exists or not
|
if ((hint_femp->eidx != -1) &&
|
||||||
* after unused dentry
|
(hint_femp->count == CNT_UNUSED_HIT)) {
|
||||||
* hint_uentry means empty slot not TYPE_UNUSED
|
/* unused empty group means
|
||||||
*/
|
* an empty group which includes
|
||||||
|
* unused dentry
|
||||||
|
*/
|
||||||
|
sdfat_fs_error(sb,
|
||||||
|
"found bogus dentry(%d) "
|
||||||
|
"beyond unused empty group(%d) "
|
||||||
|
"(start_clu : %u, cur_clu : %u)\n",
|
||||||
|
dentry, hint_femp->eidx, p_dir->dir,
|
||||||
|
clu.dir);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
num_empty = 0;
|
num_empty = 0;
|
||||||
|
hint_femp->eidx = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_empty >= num_entries) {
|
if (num_empty >= num_entries) {
|
||||||
/* INVALIDATE */
|
/* found and invalidate hint_femp */
|
||||||
fsi->hint_uentry.dir = CLUS_EOF;
|
hint_femp->eidx = -1;
|
||||||
fsi->hint_uentry.entry = -1;
|
|
||||||
|
|
||||||
if (fsi->vol_type == EXFAT)
|
if (fsi->vol_type == EXFAT)
|
||||||
return (dentry - (num_entries-1));
|
return (dentry - (num_entries-1));
|
||||||
else
|
|
||||||
return dentry;
|
return dentry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -769,23 +813,35 @@ static s32 find_empty_entry(struct inode *inode, CHAIN_T *p_dir, s32 num_entries
|
||||||
struct super_block *sb = inode->i_sb;
|
struct super_block *sb = inode->i_sb;
|
||||||
FS_INFO_T *fsi = &(SDFAT_SB(sb)->fsi);
|
FS_INFO_T *fsi = &(SDFAT_SB(sb)->fsi);
|
||||||
FILE_ID_T *fid = &(SDFAT_I(inode)->fid);
|
FILE_ID_T *fid = &(SDFAT_I(inode)->fid);
|
||||||
|
HINT_FEMP_T hint_femp;
|
||||||
|
|
||||||
|
hint_femp.eidx = -1;
|
||||||
|
|
||||||
|
ASSERT(-1 <= fid->hint_femp.eidx);
|
||||||
|
|
||||||
|
if (fid->hint_femp.eidx != -1) {
|
||||||
|
memcpy(&hint_femp, &fid->hint_femp, sizeof(HINT_FEMP_T));
|
||||||
|
fid->hint_femp.eidx = -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* FAT16 root_dir */
|
/* FAT16 root_dir */
|
||||||
if (IS_CLUS_FREE(p_dir->dir))
|
if (IS_CLUS_FREE(p_dir->dir))
|
||||||
return search_empty_slot(sb, p_dir, num_entries);
|
return search_empty_slot(sb, &hint_femp, p_dir, num_entries);
|
||||||
|
|
||||||
while ((dentry = search_empty_slot(sb, p_dir, num_entries)) < 0) {
|
while ((dentry = search_empty_slot(sb, &hint_femp, p_dir, num_entries)) < 0) {
|
||||||
if (dentry == -EIO)
|
if (dentry == -EIO)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (fsi->vol_type == EXFAT) {
|
// if (fsi->vol_type == EXFAT) {
|
||||||
if (p_dir->dir != fsi->root_dir)
|
// if (p_dir->dir != fsi->root_dir)
|
||||||
size = i_size_read(inode);
|
// size = i_size_read(inode);
|
||||||
} else if ((fid->size >> DENTRY_SIZE_BITS) >= MAX_FAT_DENTRIES) {
|
// } else if ((fid->size >> DENTRY_SIZE_BITS) >= MAX_FAT_DENTRIES) {
|
||||||
|
if ((fid->size >> DENTRY_SIZE_BITS) >= MAX_FAT_DENTRIES) {
|
||||||
/* FAT spec allows a dir to grow upto 65536 dentries */
|
/* FAT spec allows a dir to grow upto 65536 dentries */
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* we trust p_dir->size regardless of FAT type */
|
||||||
if (__find_last_cluster(sb, p_dir, &last_clu))
|
if (__find_last_cluster(sb, p_dir, &last_clu))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
@ -793,7 +849,7 @@ static s32 find_empty_entry(struct inode *inode, CHAIN_T *p_dir, s32 num_entries
|
||||||
* Allocate new cluster to this directory
|
* Allocate new cluster to this directory
|
||||||
*/
|
*/
|
||||||
clu.dir = last_clu + 1;
|
clu.dir = last_clu + 1;
|
||||||
clu.size = 0;
|
clu.size = 0; /* UNUSED */
|
||||||
clu.flags = p_dir->flags;
|
clu.flags = p_dir->flags;
|
||||||
|
|
||||||
/* (0) check if there are reserved clusters
|
/* (0) check if there are reserved clusters
|
||||||
|
@ -819,46 +875,49 @@ static s32 find_empty_entry(struct inode *inode, CHAIN_T *p_dir, s32 num_entries
|
||||||
*/
|
*/
|
||||||
chain_cont_cluster(sb, p_dir->dir, p_dir->size);
|
chain_cont_cluster(sb, p_dir->dir, p_dir->size);
|
||||||
p_dir->flags = 0x01;
|
p_dir->flags = 0x01;
|
||||||
fsi->hint_uentry.clu.flags = 0x01;
|
hint_femp.cur.flags = 0x01;
|
||||||
}
|
}
|
||||||
if (clu.flags == 0x01)
|
if (clu.flags == 0x01)
|
||||||
if (fat_ent_set(sb, last_clu, clu.dir))
|
if (fat_ent_set(sb, last_clu, clu.dir))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
if (fsi->hint_uentry.entry == -1) {
|
if (hint_femp.eidx == -1) {
|
||||||
fsi->hint_uentry.dir = p_dir->dir;
|
/* the special case that new dentry
|
||||||
fsi->hint_uentry.entry = p_dir->size << (fsi->cluster_size_bits - DENTRY_SIZE_BITS);
|
* should be allocated from the start of new cluster
|
||||||
|
*/
|
||||||
|
|
||||||
fsi->hint_uentry.clu.dir = clu.dir;
|
hint_femp.eidx = p_dir->size <<
|
||||||
fsi->hint_uentry.clu.size = 0;
|
(fsi->cluster_size_bits - DENTRY_SIZE_BITS);
|
||||||
fsi->hint_uentry.clu.flags = clu.flags;
|
hint_femp.count = fsi->dentries_per_clu;
|
||||||
|
|
||||||
|
hint_femp.cur.dir = clu.dir;
|
||||||
|
hint_femp.cur.size = 0;
|
||||||
|
hint_femp.cur.flags = clu.flags;
|
||||||
}
|
}
|
||||||
fsi->hint_uentry.clu.size++;
|
hint_femp.cur.size++;
|
||||||
p_dir->size++;
|
p_dir->size++;
|
||||||
|
size = (p_dir->size << fsi->cluster_size_bits);
|
||||||
|
|
||||||
/* (3) update the directory entry */
|
/* (3) update the directory entry */
|
||||||
if (fsi->vol_type == EXFAT) {
|
if ((fsi->vol_type == EXFAT) && (p_dir->dir != fsi->root_dir)) {
|
||||||
if (p_dir->dir != fsi->root_dir) {
|
ep = get_dentry_in_dir(sb,
|
||||||
size += fsi->cluster_size;
|
&(fid->dir), fid->entry+1, §or);
|
||||||
|
if (!ep)
|
||||||
|
return -EIO;
|
||||||
|
fsi->fs_func->set_entry_size(ep, size);
|
||||||
|
fsi->fs_func->set_entry_flag(ep, p_dir->flags);
|
||||||
|
if (dcache_modify(sb, sector))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
ep = get_dentry_in_dir(sb, &(fid->dir), fid->entry+1, §or);
|
if (update_dir_chksum(sb, &(fid->dir), fid->entry))
|
||||||
if (!ep)
|
return -EIO;
|
||||||
return -EIO;
|
|
||||||
fsi->fs_func->set_entry_size(ep, size);
|
|
||||||
fsi->fs_func->set_entry_flag(ep, p_dir->flags);
|
|
||||||
if (dcache_modify(sb, sector))
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
if (update_dir_chksum(sb, &(fid->dir), fid->entry))
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* directory inode should be updated in here */
|
/* directory inode should be updated in here */
|
||||||
i_size_write(inode, i_size_read(inode)+fsi->cluster_size);
|
i_size_write(inode, (loff_t)size);
|
||||||
SDFAT_I(inode)->i_size_ondisk += fsi->cluster_size;
|
SDFAT_I(inode)->i_size_ondisk += fsi->cluster_size;
|
||||||
SDFAT_I(inode)->i_size_aligned += fsi->cluster_size;
|
SDFAT_I(inode)->i_size_aligned += fsi->cluster_size;
|
||||||
SDFAT_I(inode)->fid.size += fsi->cluster_size;
|
SDFAT_I(inode)->fid.size = size;
|
||||||
SDFAT_I(inode)->fid.flags = p_dir->flags;
|
SDFAT_I(inode)->fid.flags = p_dir->flags;
|
||||||
inode->i_blocks += 1 << (fsi->cluster_size_bits - sb->s_blocksize_bits);
|
inode->i_blocks += 1 << (fsi->cluster_size_bits - sb->s_blocksize_bits);
|
||||||
}
|
}
|
||||||
|
@ -1158,7 +1217,8 @@ static s32 __resolve_path(struct inode *inode, const u8 *path, CHAIN_T *p_dir, U
|
||||||
if ((lossy && !lookup) || !namelen)
|
if ((lossy && !lookup) || !namelen)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
fid->size = i_size_read(inode);
|
sdfat_debug_bug_on(fid->size != i_size_read(inode));
|
||||||
|
// fid->size = i_size_read(inode);
|
||||||
|
|
||||||
p_dir->dir = fid->start_clu;
|
p_dir->dir = fid->start_clu;
|
||||||
p_dir->size = (s32)(fid->size >> fsi->cluster_size_bits);
|
p_dir->size = (s32)(fid->size >> fsi->cluster_size_bits);
|
||||||
|
@ -1215,15 +1275,8 @@ static s32 create_dir(struct inode *inode, CHAIN_T *p_dir, UNI_NAME_T *p_uniname
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (fsi->vol_type == EXFAT) {
|
size = fsi->cluster_size;
|
||||||
size = fsi->cluster_size;
|
if (fsi->vol_type != EXFAT) {
|
||||||
} else {
|
|
||||||
/* for the consistency of DIR entry size (non-zero) */
|
|
||||||
if (fsi->vol_type == FAT32)
|
|
||||||
size = fsi->cluster_size;
|
|
||||||
else
|
|
||||||
size = 0;
|
|
||||||
|
|
||||||
/* initialize the . and .. entry
|
/* initialize the . and .. entry
|
||||||
Information for . points to itself
|
Information for . points to itself
|
||||||
Information for .. points to parent dir */
|
Information for .. points to parent dir */
|
||||||
|
@ -1282,6 +1335,7 @@ static s32 create_dir(struct inode *inode, CHAIN_T *p_dir, UNI_NAME_T *p_uniname
|
||||||
fid->version = 0;
|
fid->version = 0;
|
||||||
fid->hint_stat.eidx = 0;
|
fid->hint_stat.eidx = 0;
|
||||||
fid->hint_stat.clu = fid->start_clu;
|
fid->hint_stat.clu = fid->start_clu;
|
||||||
|
fid->hint_femp.eidx = -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
} /* end of create_dir */
|
} /* end of create_dir */
|
||||||
|
@ -1331,6 +1385,7 @@ static s32 create_file(struct inode *inode, CHAIN_T *p_dir, UNI_NAME_T *p_uninam
|
||||||
fid->version = 0;
|
fid->version = 0;
|
||||||
fid->hint_stat.eidx = 0;
|
fid->hint_stat.eidx = 0;
|
||||||
fid->hint_stat.clu = fid->start_clu;
|
fid->hint_stat.clu = fid->start_clu;
|
||||||
|
fid->hint_femp.eidx = -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
} /* end of create_file */
|
} /* end of create_file */
|
||||||
|
@ -1883,11 +1938,12 @@ s32 fscore_lookup(struct inode *inode, u8 *path, FILE_ID_T *fid)
|
||||||
dir_fid->hint_stat.clu = dir.dir;
|
dir_fid->hint_stat.clu = dir.dir;
|
||||||
dir_fid->hint_stat.eidx = 0;
|
dir_fid->hint_stat.eidx = 0;
|
||||||
dir_fid->version = (u32)(inode->i_version & 0xffffffff);
|
dir_fid->version = (u32)(inode->i_version & 0xffffffff);
|
||||||
|
dir_fid->hint_femp.eidx = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* search the file name for directories */
|
/* search the file name for directories */
|
||||||
dentry = fsi->fs_func->find_dir_entry(sb, &dir, &dir_fid->hint_stat,
|
dentry = fsi->fs_func->find_dir_entry(sb, dir_fid, &dir, &uni_name,
|
||||||
&uni_name, num_entries, &dos_name, TYPE_ALL);
|
num_entries, &dos_name, TYPE_ALL);
|
||||||
|
|
||||||
if ((dentry < 0) && (dentry != -EEXIST))
|
if ((dentry < 0) && (dentry != -EEXIST))
|
||||||
return dentry; /* -error value */
|
return dentry; /* -error value */
|
||||||
|
@ -1934,6 +1990,19 @@ s32 fscore_lookup(struct inode *inode, u8 *path, FILE_ID_T *fid)
|
||||||
fid->start_clu = fsi->fs_func->get_entry_clu0(ep2);
|
fid->start_clu = fsi->fs_func->get_entry_clu0(ep2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((fid->type == TYPE_DIR) && (fsi->vol_type != EXFAT)) {
|
||||||
|
s32 num_clu = 0;
|
||||||
|
CHAIN_T tmp_dir;
|
||||||
|
|
||||||
|
tmp_dir.dir = fid->start_clu;
|
||||||
|
tmp_dir.flags = fid->flags;
|
||||||
|
tmp_dir.size = 0; /* UNUSED */
|
||||||
|
|
||||||
|
if (__count_num_clusters(sb, &tmp_dir, &num_clu))
|
||||||
|
return -EIO;
|
||||||
|
fid->size = (u64)num_clu << fsi->cluster_size_bits;
|
||||||
|
}
|
||||||
|
|
||||||
/* FOR GRACEFUL ERROR HANDLING */
|
/* FOR GRACEFUL ERROR HANDLING */
|
||||||
if (IS_CLUS_FREE(fid->start_clu)) {
|
if (IS_CLUS_FREE(fid->start_clu)) {
|
||||||
sdfat_fs_error(sb,
|
sdfat_fs_error(sb,
|
||||||
|
@ -1952,6 +2021,7 @@ s32 fscore_lookup(struct inode *inode, u8 *path, FILE_ID_T *fid)
|
||||||
fid->version = 0;
|
fid->version = 0;
|
||||||
fid->hint_stat.eidx = 0;
|
fid->hint_stat.eidx = 0;
|
||||||
fid->hint_stat.clu = fid->start_clu;
|
fid->hint_stat.clu = fid->start_clu;
|
||||||
|
fid->hint_femp.eidx = -1;
|
||||||
|
|
||||||
TMSG("%s exited successfully\n", __func__);
|
TMSG("%s exited successfully\n", __func__);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2530,6 +2600,7 @@ s32 fscore_truncate(struct inode *inode, u64 old_size, u64 new_size)
|
||||||
/* hint_stat will be used if this is directory. */
|
/* hint_stat will be used if this is directory. */
|
||||||
fid->hint_stat.eidx = 0;
|
fid->hint_stat.eidx = 0;
|
||||||
fid->hint_stat.clu = fid->start_clu;
|
fid->hint_stat.clu = fid->start_clu;
|
||||||
|
fid->hint_femp.eidx = -1;
|
||||||
|
|
||||||
/* free the clusters */
|
/* free the clusters */
|
||||||
if (fsi->fs_func->free_cluster(sb, &clu, evict))
|
if (fsi->fs_func->free_cluster(sb, &clu, evict))
|
||||||
|
@ -2779,8 +2850,13 @@ out:
|
||||||
} /* end of fscore_remove */
|
} /* end of fscore_remove */
|
||||||
|
|
||||||
|
|
||||||
/* get the information of a given file
|
/*
|
||||||
|
* Get the information of a given file
|
||||||
* REMARK : This function does not need any file name on linux
|
* REMARK : This function does not need any file name on linux
|
||||||
|
*
|
||||||
|
* info.Size means the value saved on disk.
|
||||||
|
* But root directory doesn`t have real dentry,
|
||||||
|
* so the size of root directory returns calculated one exceptively.
|
||||||
*/
|
*/
|
||||||
s32 fscore_read_inode(struct inode *inode, DIR_ENTRY_T *info)
|
s32 fscore_read_inode(struct inode *inode, DIR_ENTRY_T *info)
|
||||||
{
|
{
|
||||||
|
@ -2810,11 +2886,7 @@ s32 fscore_read_inode(struct inode *inode, DIR_ENTRY_T *info)
|
||||||
|
|
||||||
dir.dir = fsi->root_dir;
|
dir.dir = fsi->root_dir;
|
||||||
dir.flags = 0x01;
|
dir.flags = 0x01;
|
||||||
dir.size = 0;
|
dir.size = 0; /* UNUSED */
|
||||||
/*
|
|
||||||
* NOTE :
|
|
||||||
* If "dir.flags" has 0x01, "dir.size" is meaningles.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* FAT16 root_dir */
|
/* FAT16 root_dir */
|
||||||
if (IS_CLUS_FREE(fsi->root_dir)) {
|
if (IS_CLUS_FREE(fsi->root_dir)) {
|
||||||
|
@ -2888,15 +2960,15 @@ s32 fscore_read_inode(struct inode *inode, DIR_ENTRY_T *info)
|
||||||
dir.size = fid->size >> fsi->cluster_size_bits;
|
dir.size = fid->size >> fsi->cluster_size_bits;
|
||||||
/*
|
/*
|
||||||
* NOTE :
|
* NOTE :
|
||||||
* If "dir.flags" has 0x01, "dir.size" is meaningles.
|
* If "dir.flags" has 0x01, "dir.size" is meaningless.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (info->Size == 0) {
|
// if (info->Size == 0) {
|
||||||
s32 num_clu;
|
// s32 num_clu;
|
||||||
if (__count_num_clusters(sb, &dir, &num_clu))
|
// if (__count_num_clusters(sb, &dir, &num_clu))
|
||||||
return -EIO;
|
// return -EIO;
|
||||||
info->Size = (u64)num_clu << fsi->cluster_size_bits;
|
// info->Size = (u64)num_clu << fsi->cluster_size_bits;
|
||||||
}
|
// }
|
||||||
|
|
||||||
count = __count_dos_name_entries(sb, &dir, TYPE_DIR, &dotcnt);
|
count = __count_dos_name_entries(sb, &dir, TYPE_DIR, &dotcnt);
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
|
@ -3351,7 +3423,7 @@ out:
|
||||||
/* read a directory entry from the opened directory */
|
/* read a directory entry from the opened directory */
|
||||||
s32 fscore_readdir(struct inode *inode, DIR_ENTRY_T *dir_entry)
|
s32 fscore_readdir(struct inode *inode, DIR_ENTRY_T *dir_entry)
|
||||||
{
|
{
|
||||||
s32 i, dentry, clu_offset;
|
s32 i, clu_offset;
|
||||||
s32 dentries_per_clu, dentries_per_clu_bits = 0;
|
s32 dentries_per_clu, dentries_per_clu_bits = 0;
|
||||||
u32 type, sector;
|
u32 type, sector;
|
||||||
CHAIN_T dir, clu;
|
CHAIN_T dir, clu;
|
||||||
|
@ -3361,6 +3433,7 @@ s32 fscore_readdir(struct inode *inode, DIR_ENTRY_T *dir_entry)
|
||||||
struct super_block *sb = inode->i_sb;
|
struct super_block *sb = inode->i_sb;
|
||||||
FS_INFO_T *fsi = &(SDFAT_SB(sb)->fsi);
|
FS_INFO_T *fsi = &(SDFAT_SB(sb)->fsi);
|
||||||
FILE_ID_T *fid = &(SDFAT_I(inode)->fid);
|
FILE_ID_T *fid = &(SDFAT_I(inode)->fid);
|
||||||
|
s32 dentry = (s32) fid->rwoffset;
|
||||||
|
|
||||||
/* check if the given file ID is opened */
|
/* check if the given file ID is opened */
|
||||||
if (fid->type != TYPE_DIR)
|
if (fid->type != TYPE_DIR)
|
||||||
|
@ -3374,10 +3447,9 @@ s32 fscore_readdir(struct inode *inode, DIR_ENTRY_T *dir_entry)
|
||||||
dir.dir = fid->start_clu;
|
dir.dir = fid->start_clu;
|
||||||
dir.size = (s32)(fid->size >> fsi->cluster_size_bits);
|
dir.size = (s32)(fid->size >> fsi->cluster_size_bits);
|
||||||
dir.flags = fid->flags;
|
dir.flags = fid->flags;
|
||||||
|
sdfat_debug_bug_on(dentry >= (dir.size * fsi->dentries_per_clu));
|
||||||
}
|
}
|
||||||
|
|
||||||
dentry = (s32) fid->rwoffset;
|
|
||||||
|
|
||||||
if (IS_CLUS_FREE(dir.dir)) { /* FAT16 root_dir */
|
if (IS_CLUS_FREE(dir.dir)) { /* FAT16 root_dir */
|
||||||
dentries_per_clu = fsi->dentries_in_root;
|
dentries_per_clu = fsi->dentries_in_root;
|
||||||
|
|
||||||
|
@ -3513,7 +3585,7 @@ s32 fscore_readdir(struct inode *inode, DIR_ENTRY_T *dir_entry)
|
||||||
|
|
||||||
dir_entry->NameBuf.lfn[0] = '\0';
|
dir_entry->NameBuf.lfn[0] = '\0';
|
||||||
|
|
||||||
fid->rwoffset = (s64) ++dentry;
|
fid->rwoffset = (s64) dentry;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
} /* end of fscore_readdir */
|
} /* end of fscore_readdir */
|
||||||
|
|
|
@ -711,21 +711,28 @@ static s32 __extract_uni_name_from_name_entry(NAME_DENTRY_T *ep, u16 *uniname, s
|
||||||
|
|
||||||
} /* end of __extract_uni_name_from_name_entry */
|
} /* end of __extract_uni_name_from_name_entry */
|
||||||
|
|
||||||
|
#define DIRENT_STEP_FILE (0)
|
||||||
|
#define DIRENT_STEP_STRM (1)
|
||||||
|
#define DIRENT_STEP_NAME (2)
|
||||||
|
#define DIRENT_STEP_SECD (3)
|
||||||
|
|
||||||
/* return values of exfat_find_dir_entry()
|
/* return values of exfat_find_dir_entry()
|
||||||
* >= 0 : return dir entiry position with the name in dir
|
* >= 0 : return dir entiry position with the name in dir
|
||||||
* -EEXIST : (root dir, ".") it is the root dir itself
|
* -EEXIST : (root dir, ".") it is the root dir itself
|
||||||
* -ENOENT : entry with the name does not exist
|
* -ENOENT : entry with the name does not exist
|
||||||
* -EIO : I/O error
|
* -EIO : I/O error
|
||||||
*/
|
*/
|
||||||
static s32 exfat_find_dir_entry(struct super_block *sb, CHAIN_T *p_dir, HINT_T *hint_stat, UNI_NAME_T *p_uniname, s32 num_entries, DOS_NAME_T *unused, u32 type)
|
static s32 exfat_find_dir_entry(struct super_block *sb, FILE_ID_T *fid, CHAIN_T *p_dir, UNI_NAME_T *p_uniname, s32 num_entries, DOS_NAME_T *unused, u32 type)
|
||||||
{
|
{
|
||||||
s32 i, rewind = 0, dentry = 0, end_eidx = 0, num_ext_entries = 0, len;
|
s32 i, rewind = 0, dentry = 0, end_eidx = 0, num_ext = 0, len;
|
||||||
s32 order = 0, is_feasible_entry = false;
|
s32 order, step, name_len;
|
||||||
s32 dentries_per_clu, num_empty = 0;
|
s32 dentries_per_clu, num_empty = 0;
|
||||||
u32 entry_type;
|
u32 entry_type;
|
||||||
u16 entry_uniname[16], *uniname = NULL, unichar;
|
u16 entry_uniname[16], *uniname = NULL, unichar;
|
||||||
CHAIN_T clu;
|
CHAIN_T clu;
|
||||||
DENTRY_T *ep;
|
DENTRY_T *ep;
|
||||||
|
HINT_T *hint_stat = &fid->hint_stat;
|
||||||
|
HINT_FEMP_T candi_empty;
|
||||||
FILE_DENTRY_T *file_ep;
|
FILE_DENTRY_T *file_ep;
|
||||||
STRM_DENTRY_T *strm_ep;
|
STRM_DENTRY_T *strm_ep;
|
||||||
NAME_DENTRY_T *name_ep;
|
NAME_DENTRY_T *name_ep;
|
||||||
|
@ -751,10 +758,10 @@ static s32 exfat_find_dir_entry(struct super_block *sb, CHAIN_T *p_dir, HINT_T *
|
||||||
end_eidx = dentry;
|
end_eidx = dentry;
|
||||||
}
|
}
|
||||||
|
|
||||||
fsi->hint_uentry.dir = p_dir->dir;
|
candi_empty.eidx = -1;
|
||||||
fsi->hint_uentry.entry = -1;
|
|
||||||
|
|
||||||
rewind:
|
rewind:
|
||||||
|
order = 0;
|
||||||
|
step = DIRENT_STEP_FILE;
|
||||||
while (!IS_CLUS_EOF(clu.dir)) {
|
while (!IS_CLUS_EOF(clu.dir)) {
|
||||||
i = dentry & (dentries_per_clu - 1);
|
i = dentry & (dentries_per_clu - 1);
|
||||||
for (; i < dentries_per_clu; i++, dentry++) {
|
for (; i < dentries_per_clu; i++, dentry++) {
|
||||||
|
@ -768,73 +775,104 @@ rewind:
|
||||||
entry_type = exfat_get_entry_type(ep);
|
entry_type = exfat_get_entry_type(ep);
|
||||||
|
|
||||||
if ((entry_type == TYPE_UNUSED) || (entry_type == TYPE_DELETED)) {
|
if ((entry_type == TYPE_UNUSED) || (entry_type == TYPE_DELETED)) {
|
||||||
is_feasible_entry = false;
|
step = DIRENT_STEP_FILE;
|
||||||
|
|
||||||
if (fsi->hint_uentry.entry == -1) {
|
|
||||||
num_empty++;
|
|
||||||
|
|
||||||
|
num_empty++;
|
||||||
|
if (candi_empty.eidx == -1) {
|
||||||
if (num_empty == 1) {
|
if (num_empty == 1) {
|
||||||
fsi->hint_uentry.clu.dir = clu.dir;
|
candi_empty.cur.dir = clu.dir;
|
||||||
fsi->hint_uentry.clu.size = clu.size;
|
candi_empty.cur.size = clu.size;
|
||||||
fsi->hint_uentry.clu.flags = clu.flags;
|
candi_empty.cur.flags = clu.flags;
|
||||||
}
|
}
|
||||||
if ((num_empty >= num_entries) || (entry_type == TYPE_UNUSED)) {
|
|
||||||
fsi->hint_uentry.entry = dentry - (num_empty-1);
|
if (num_empty >= num_entries) {
|
||||||
|
candi_empty.eidx = dentry - (num_empty - 1);
|
||||||
|
ASSERT(0 <= candi_empty.eidx);
|
||||||
|
candi_empty.count = num_empty;
|
||||||
|
|
||||||
|
if ((fid->hint_femp.eidx == -1) ||
|
||||||
|
(candi_empty.eidx <= fid->hint_femp.eidx)) {
|
||||||
|
memcpy(&fid->hint_femp,
|
||||||
|
&candi_empty,
|
||||||
|
sizeof(HINT_FEMP_T));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry_type == TYPE_UNUSED) {
|
if (entry_type == TYPE_UNUSED)
|
||||||
goto not_found;
|
goto not_found;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
num_empty = 0;
|
||||||
|
candi_empty.eidx = -1;
|
||||||
|
|
||||||
|
if ((entry_type == TYPE_FILE) || (entry_type == TYPE_DIR)) {
|
||||||
|
step = DIRENT_STEP_FILE;
|
||||||
|
if ((type == TYPE_ALL) || (type == entry_type)) {
|
||||||
|
file_ep = (FILE_DENTRY_T *) ep;
|
||||||
|
num_ext = file_ep->num_ext;
|
||||||
|
step = DIRENT_STEP_STRM;
|
||||||
}
|
}
|
||||||
} else {
|
continue;
|
||||||
num_empty = 0;
|
}
|
||||||
|
|
||||||
if ((entry_type == TYPE_FILE) || (entry_type == TYPE_DIR)) {
|
if (entry_type == TYPE_STREAM) {
|
||||||
if ((type == TYPE_ALL) || (type == entry_type)) {
|
if (step != DIRENT_STEP_STRM) {
|
||||||
file_ep = (FILE_DENTRY_T *) ep;
|
step = DIRENT_STEP_FILE;
|
||||||
num_ext_entries = file_ep->num_ext;
|
continue;
|
||||||
is_feasible_entry = true;
|
}
|
||||||
} else {
|
step = DIRENT_STEP_FILE;
|
||||||
is_feasible_entry = false;
|
strm_ep = (STRM_DENTRY_T *) ep;
|
||||||
|
if ((p_uniname->name_hash == le16_to_cpu(strm_ep->name_hash)) &&
|
||||||
|
(p_uniname->name_len == strm_ep->name_len)) {
|
||||||
|
step = DIRENT_STEP_NAME;
|
||||||
|
order = 1;
|
||||||
|
name_len = 0;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry_type == TYPE_EXTEND) {
|
||||||
|
if (step != DIRENT_STEP_NAME) {
|
||||||
|
step = DIRENT_STEP_FILE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
name_ep = (NAME_DENTRY_T *) ep;
|
||||||
|
|
||||||
|
if ((++order) == 2)
|
||||||
|
uniname = p_uniname->name;
|
||||||
|
else
|
||||||
|
uniname += 15;
|
||||||
|
|
||||||
|
len = __extract_uni_name_from_name_entry(name_ep, entry_uniname, order);
|
||||||
|
name_len += len;
|
||||||
|
|
||||||
|
unichar = *(uniname+len);
|
||||||
|
*(uniname+len) = 0x0;
|
||||||
|
|
||||||
|
if (nls_cmp_uniname(sb, uniname, entry_uniname)) {
|
||||||
|
step = DIRENT_STEP_FILE;
|
||||||
|
} else if (name_len == p_uniname->name_len) {
|
||||||
|
if (order == num_ext) {
|
||||||
|
//fid->hint_femp.eidx = -1;
|
||||||
|
goto found;
|
||||||
}
|
}
|
||||||
} else if (entry_type == TYPE_STREAM) {
|
step = DIRENT_STEP_SECD;
|
||||||
if (is_feasible_entry) {
|
}
|
||||||
strm_ep = (STRM_DENTRY_T *) ep;
|
|
||||||
if ((p_uniname->name_hash == le16_to_cpu(strm_ep->name_hash)) &&
|
|
||||||
(p_uniname->name_len == strm_ep->name_len)) {
|
|
||||||
order = 1;
|
|
||||||
} else {
|
|
||||||
is_feasible_entry = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (entry_type == TYPE_EXTEND) {
|
|
||||||
if (is_feasible_entry) {
|
|
||||||
name_ep = (NAME_DENTRY_T *) ep;
|
|
||||||
|
|
||||||
if ((++order) == 2)
|
*(uniname+len) = unichar;
|
||||||
uniname = p_uniname->name;
|
continue;
|
||||||
else
|
}
|
||||||
uniname += 15;
|
|
||||||
|
|
||||||
len = __extract_uni_name_from_name_entry(name_ep, entry_uniname, order);
|
if (entry_type & (TYPE_CRITICAL_SEC | TYPE_BENIGN_SEC)) {
|
||||||
|
if (step == DIRENT_STEP_SECD) {
|
||||||
unichar = *(uniname+len);
|
if (++order == num_ext)
|
||||||
*(uniname+len) = 0x0;
|
goto found;
|
||||||
|
continue;
|
||||||
if (nls_cmp_uniname(sb, uniname, entry_uniname)) {
|
|
||||||
is_feasible_entry = false;
|
|
||||||
} else if (order == num_ext_entries) {
|
|
||||||
fsi->hint_uentry.dir = CLUS_EOF;
|
|
||||||
fsi->hint_uentry.entry = -1;
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(uniname+len) = unichar;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
is_feasible_entry = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
step = DIRENT_STEP_FILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clu.flags == 0x03) {
|
if (clu.flags == 0x03) {
|
||||||
|
@ -856,6 +894,9 @@ not_found:
|
||||||
rewind = 1;
|
rewind = 1;
|
||||||
dentry = 0;
|
dentry = 0;
|
||||||
clu.dir = p_dir->dir;
|
clu.dir = p_dir->dir;
|
||||||
|
/* reset empty hint */
|
||||||
|
num_empty = 0;
|
||||||
|
candi_empty.eidx = -1;
|
||||||
goto rewind;
|
goto rewind;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -881,13 +922,13 @@ found:
|
||||||
/* just initialized hint_stat */
|
/* just initialized hint_stat */
|
||||||
hint_stat->clu = p_dir->dir;
|
hint_stat->clu = p_dir->dir;
|
||||||
hint_stat->eidx = 0;
|
hint_stat->eidx = 0;
|
||||||
return (dentry - num_ext_entries);
|
return (dentry - num_ext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hint_stat->clu = clu.dir;
|
hint_stat->clu = clu.dir;
|
||||||
hint_stat->eidx = dentry + 1;
|
hint_stat->eidx = dentry + 1;
|
||||||
return (dentry - num_ext_entries);
|
return (dentry - num_ext);
|
||||||
} /* end of exfat_find_dir_entry */
|
} /* end of exfat_find_dir_entry */
|
||||||
|
|
||||||
/* returns -EIO on error */
|
/* returns -EIO on error */
|
||||||
|
|
|
@ -608,15 +608,17 @@ static inline s32 __get_dentries_per_clu(FS_INFO_T *fsi, s32 clu)
|
||||||
return fsi->dentries_per_clu;
|
return fsi->dentries_per_clu;
|
||||||
}
|
}
|
||||||
|
|
||||||
static s32 fat_find_dir_entry(struct super_block *sb, CHAIN_T *p_dir, HINT_T *hint_stat, UNI_NAME_T *p_uniname, s32 num_entries, DOS_NAME_T *p_dosname, u32 type)
|
static s32 fat_find_dir_entry(struct super_block *sb, FILE_ID_T *fid, CHAIN_T *p_dir, UNI_NAME_T *p_uniname, s32 num_entries, DOS_NAME_T *p_dosname, u32 type)
|
||||||
{
|
{
|
||||||
s32 i, rewind = 0, dentry = 0, end_eidx = 0;
|
s32 i, rewind = 0, dentry = 0, end_eidx = 0;
|
||||||
s32 chksum = 0, lfn_ord = 0, lfn_len = 0;
|
s32 chksum = 0, lfn_ord = 0, lfn_len = 0;
|
||||||
s32 dentries_per_clu;
|
s32 dentries_per_clu, num_empty = 0;
|
||||||
u32 entry_type;
|
u32 entry_type;
|
||||||
u16 entry_uniname[14], *uniname = NULL;
|
u16 entry_uniname[14], *uniname = NULL;
|
||||||
CHAIN_T clu;
|
CHAIN_T clu;
|
||||||
DENTRY_T *ep;
|
DENTRY_T *ep;
|
||||||
|
HINT_T *hint_stat = &fid->hint_stat;
|
||||||
|
HINT_FEMP_T candi_empty;
|
||||||
FS_INFO_T *fsi = &(SDFAT_SB(sb)->fsi);
|
FS_INFO_T *fsi = &(SDFAT_SB(sb)->fsi);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -634,6 +636,8 @@ static s32 fat_find_dir_entry(struct super_block *sb, CHAIN_T *p_dir, HINT_T *hi
|
||||||
end_eidx = dentry;
|
end_eidx = dentry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
candi_empty.eidx = -1;
|
||||||
|
|
||||||
MMSG("lookup dir= %s\n", p_dosname->name);
|
MMSG("lookup dir= %s\n", p_dosname->name);
|
||||||
rewind:
|
rewind:
|
||||||
while (!IS_CLUS_EOF(clu.dir)) {
|
while (!IS_CLUS_EOF(clu.dir)) {
|
||||||
|
@ -659,6 +663,9 @@ rewind:
|
||||||
s32 len = 13;
|
s32 len = 13;
|
||||||
u16 unichar;
|
u16 unichar;
|
||||||
|
|
||||||
|
num_empty = 0;
|
||||||
|
candi_empty.eidx = -1;
|
||||||
|
|
||||||
/* check whether new lfn or not */
|
/* check whether new lfn or not */
|
||||||
if (cur_ord & MSDOS_LAST_LFN) {
|
if (cur_ord & MSDOS_LAST_LFN) {
|
||||||
cur_ord &= ~(MSDOS_LAST_LFN);
|
cur_ord &= ~(MSDOS_LAST_LFN);
|
||||||
|
@ -735,6 +742,10 @@ rewind:
|
||||||
u32 cur_chksum = (s32)calc_chksum_1byte(
|
u32 cur_chksum = (s32)calc_chksum_1byte(
|
||||||
(void *) dos_ep->name,
|
(void *) dos_ep->name,
|
||||||
DOS_NAME_LENGTH, 0);
|
DOS_NAME_LENGTH, 0);
|
||||||
|
|
||||||
|
num_empty = 0;
|
||||||
|
candi_empty.eidx = -1;
|
||||||
|
|
||||||
MMSG("checking dir= %c%c%c%c%c%c%c%c%c%c%c\n",
|
MMSG("checking dir= %c%c%c%c%c%c%c%c%c%c%c\n",
|
||||||
dos_ep->name[0], dos_ep->name[1],
|
dos_ep->name[0], dos_ep->name[1],
|
||||||
dos_ep->name[2], dos_ep->name[3],
|
dos_ep->name[2], dos_ep->name[3],
|
||||||
|
@ -763,13 +774,35 @@ rewind:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DO HANDLE MISMATCHED SFN, FALL THROUGH */
|
/* DO HANDLE MISMATCHED SFN, FALL THROUGH */
|
||||||
} else if (entry_type == TYPE_UNUSED) {
|
} else if ((entry_type == TYPE_UNUSED) || (entry_type == TYPE_DELETED)) {
|
||||||
goto not_found;
|
num_empty++;
|
||||||
}
|
if (candi_empty.eidx == -1) {
|
||||||
|
if (num_empty == 1) {
|
||||||
|
candi_empty.cur.dir = clu.dir;
|
||||||
|
candi_empty.cur.size = clu.size;
|
||||||
|
candi_empty.cur.flags = clu.flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num_empty >= num_entries) {
|
||||||
|
candi_empty.eidx = dentry - (num_empty - 1);
|
||||||
|
ASSERT(0 <= candi_empty.eidx);
|
||||||
|
candi_empty.count = num_empty;
|
||||||
|
|
||||||
|
if ((fid->hint_femp.eidx == -1) ||
|
||||||
|
(candi_empty.eidx <= fid->hint_femp.eidx)) {
|
||||||
|
memcpy(&fid->hint_femp,
|
||||||
|
&candi_empty,
|
||||||
|
sizeof(HINT_FEMP_T));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry_type == TYPE_UNUSED)
|
||||||
|
goto not_found;
|
||||||
|
/* FALL THROUGH */
|
||||||
|
}
|
||||||
reset_dentry_set:
|
reset_dentry_set:
|
||||||
/* TYPE_DELETED OR TYPE_VOLUME */
|
/* TYPE_DELETED, TYPE_VOLUME OR MISMATCHED SFN */
|
||||||
/* OR MISMATCHED SFN */
|
|
||||||
lfn_ord = 0;
|
lfn_ord = 0;
|
||||||
lfn_len = 0;
|
lfn_len = 0;
|
||||||
chksum = 0;
|
chksum = 0;
|
||||||
|
@ -790,6 +823,13 @@ not_found:
|
||||||
rewind = 1;
|
rewind = 1;
|
||||||
dentry = 0;
|
dentry = 0;
|
||||||
clu.dir = p_dir->dir;
|
clu.dir = p_dir->dir;
|
||||||
|
/* reset dentry set */
|
||||||
|
lfn_ord = 0;
|
||||||
|
lfn_len = 0;
|
||||||
|
chksum = 0;
|
||||||
|
/* reset empty hint_*/
|
||||||
|
num_empty = 0;
|
||||||
|
candi_empty.eidx = -1;
|
||||||
goto rewind;
|
goto rewind;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -946,22 +986,16 @@ invalid_lfn:
|
||||||
/* Find if the shortname exists
|
/* Find if the shortname exists
|
||||||
and check if there are free entries
|
and check if there are free entries
|
||||||
*/
|
*/
|
||||||
static s32 __fat_find_shortname_entry(struct super_block *sb, CHAIN_T *p_dir, u8 *p_dosname, s32 *offset, int n_entry_needed)
|
static s32 __fat_find_shortname_entry(struct super_block *sb, CHAIN_T *p_dir, u8 *p_dosname, s32 *offset, __attribute__((unused))int n_entry_needed)
|
||||||
{
|
{
|
||||||
u32 type;
|
u32 type;
|
||||||
s32 i, dentry = 0;
|
s32 i, dentry = 0;
|
||||||
s32 hint_n_empty = 0, hint_clu = 0;
|
|
||||||
s32 dentries_per_clu;
|
s32 dentries_per_clu;
|
||||||
DENTRY_T *ep = NULL;
|
DENTRY_T *ep = NULL;
|
||||||
DOS_DENTRY_T *dos_ep = NULL;
|
DOS_DENTRY_T *dos_ep = NULL;
|
||||||
CHAIN_T clu = *p_dir;
|
CHAIN_T clu = *p_dir;
|
||||||
FS_INFO_T *fsi = &(SDFAT_SB(sb)->fsi);
|
FS_INFO_T *fsi = &(SDFAT_SB(sb)->fsi);
|
||||||
|
|
||||||
if ((fsi->hint_uentry.dir == p_dir->dir)
|
|
||||||
&& (fsi->hint_uentry.n_entry >= n_entry_needed)) {
|
|
||||||
n_entry_needed = 0; // No need for search
|
|
||||||
}
|
|
||||||
|
|
||||||
if (offset)
|
if (offset)
|
||||||
*offset = -1;
|
*offset = -1;
|
||||||
|
|
||||||
|
@ -977,48 +1011,6 @@ static s32 __fat_find_shortname_entry(struct super_block *sb, CHAIN_T *p_dir, u8
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
type = fat_get_entry_type(ep);
|
type = fat_get_entry_type(ep);
|
||||||
if (n_entry_needed > 0) {
|
|
||||||
/* Update unused hint */
|
|
||||||
|
|
||||||
if (type == TYPE_DELETED) {
|
|
||||||
if (hint_n_empty == 0)
|
|
||||||
hint_clu = clu.dir;
|
|
||||||
|
|
||||||
hint_n_empty++;
|
|
||||||
} else if (type == TYPE_UNUSED) {
|
|
||||||
/* Hint entry = end of dir */
|
|
||||||
if (hint_n_empty == 0)
|
|
||||||
hint_clu = clu.dir;
|
|
||||||
|
|
||||||
if (fsi->hint_uentry.entry == -1) {
|
|
||||||
fsi->hint_uentry.dir = p_dir->dir;
|
|
||||||
fsi->hint_uentry.entry = dentry - hint_n_empty;
|
|
||||||
fsi->hint_uentry.n_entry = INT_MAX;
|
|
||||||
|
|
||||||
fsi->hint_uentry.clu.dir = hint_clu;
|
|
||||||
fsi->hint_uentry.clu.size = clu.size;
|
|
||||||
fsi->hint_uentry.clu.flags = clu.flags;
|
|
||||||
|
|
||||||
MMSG("find_shortname: uentry_hint added (clu:0x%08x ent:%d) UNUSED\n", fsi->hint_uentry.clu.dir, fsi->hint_uentry.entry);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((fsi->hint_uentry.entry == -1) \
|
|
||||||
&& (hint_n_empty >= n_entry_needed)) {
|
|
||||||
/* Hint entry = an empty entry */
|
|
||||||
fsi->hint_uentry.dir = p_dir->dir;
|
|
||||||
fsi->hint_uentry.entry = dentry - hint_n_empty;
|
|
||||||
fsi->hint_uentry.n_entry = hint_n_empty;
|
|
||||||
|
|
||||||
fsi->hint_uentry.clu.dir = hint_clu;
|
|
||||||
fsi->hint_uentry.clu.size = clu.size;
|
|
||||||
fsi->hint_uentry.clu.flags = clu.flags;
|
|
||||||
|
|
||||||
MMSG("find_shortname: uentry_hint added (clu:0x%08x ent:%d)\n", fsi->hint_uentry.clu.dir, fsi->hint_uentry.entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
hint_n_empty = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((type == TYPE_FILE) || (type == TYPE_DIR)) {
|
if ((type == TYPE_FILE) || (type == TYPE_DIR)) {
|
||||||
dos_ep = (DOS_DENTRY_T *)ep;
|
dos_ep = (DOS_DENTRY_T *)ep;
|
||||||
|
|
|
@ -355,6 +355,13 @@ s32 fat_ent_get(struct super_block *sb, u32 loc, u32 *content)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (*content && !IS_CLUS_EOF(*content) &&
|
||||||
|
(*content < CLUS_BASE || fsi->num_clusters <= *content)) {
|
||||||
|
sdfat_fs_error(sb, "invalid access to FAT (entry 0x%08x) "
|
||||||
|
"bogus content (0x%08x)", loc, *content);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,9 @@
|
||||||
#include "sdfat.h"
|
#include "sdfat.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
/* skip iterating emit_dots when dir is empty */
|
||||||
|
#define ITER_POS_FILLED_DOTS (2)
|
||||||
|
|
||||||
/* type index declare at sdfat.h */
|
/* type index declare at sdfat.h */
|
||||||
const char* FS_TYPE_STR[] = {
|
const char* FS_TYPE_STR[] = {
|
||||||
"auto",
|
"auto",
|
||||||
|
@ -236,7 +239,7 @@ static int sdfat_iterate(struct file *filp, struct dir_context *ctx)
|
||||||
DENTRY_NAMEBUF_T *nb = &(de.NameBuf);
|
DENTRY_NAMEBUF_T *nb = &(de.NameBuf);
|
||||||
unsigned long inum;
|
unsigned long inum;
|
||||||
loff_t cpos;
|
loff_t cpos;
|
||||||
int err = 0;
|
int err = 0, fake_offset = 0;
|
||||||
|
|
||||||
sdfat_init_namebuf(nb);
|
sdfat_init_namebuf(nb);
|
||||||
__lock_super(sb);
|
__lock_super(sb);
|
||||||
|
@ -245,8 +248,10 @@ static int sdfat_iterate(struct file *filp, struct dir_context *ctx)
|
||||||
if ((fsi->vol_type == EXFAT) || (inode->i_ino == SDFAT_ROOT_INO)) {
|
if ((fsi->vol_type == EXFAT) || (inode->i_ino == SDFAT_ROOT_INO)) {
|
||||||
if (!dir_emit_dots(filp, ctx))
|
if (!dir_emit_dots(filp, ctx))
|
||||||
goto out;
|
goto out;
|
||||||
if (ctx->pos == 2)
|
if (ctx->pos == ITER_POS_FILLED_DOTS) {
|
||||||
cpos = 0;
|
cpos = 0;
|
||||||
|
fake_offset = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (cpos & (DENTRY_SIZE - 1)) {
|
if (cpos & (DENTRY_SIZE - 1)) {
|
||||||
err = -ENOENT;
|
err = -ENOENT;
|
||||||
|
@ -261,6 +266,9 @@ get_new:
|
||||||
SDFAT_I(inode)->fid.size = i_size_read(inode);
|
SDFAT_I(inode)->fid.size = i_size_read(inode);
|
||||||
SDFAT_I(inode)->fid.rwoffset = cpos >> DENTRY_SIZE_BITS;
|
SDFAT_I(inode)->fid.rwoffset = cpos >> DENTRY_SIZE_BITS;
|
||||||
|
|
||||||
|
if (cpos >= SDFAT_I(inode)->fid.size)
|
||||||
|
goto end_of_dir;
|
||||||
|
|
||||||
err = fsapi_readdir(inode, &de);
|
err = fsapi_readdir(inode, &de);
|
||||||
if (err) {
|
if (err) {
|
||||||
// at least we tried to read a sector
|
// at least we tried to read a sector
|
||||||
|
@ -310,6 +318,8 @@ get_new:
|
||||||
goto get_new;
|
goto get_new;
|
||||||
|
|
||||||
end_of_dir:
|
end_of_dir:
|
||||||
|
if (!cpos && fake_offset)
|
||||||
|
cpos = ITER_POS_FILLED_DOTS;
|
||||||
ctx->pos = cpos;
|
ctx->pos = cpos;
|
||||||
out:
|
out:
|
||||||
__unlock_super(sb);
|
__unlock_super(sb);
|
||||||
|
@ -376,7 +386,7 @@ static int sdfat_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||||
DENTRY_NAMEBUF_T *nb = &(de.NameBuf);
|
DENTRY_NAMEBUF_T *nb = &(de.NameBuf);
|
||||||
unsigned long inum;
|
unsigned long inum;
|
||||||
loff_t cpos;
|
loff_t cpos;
|
||||||
int err = 0;
|
int err = 0, fake_offset = 0;
|
||||||
|
|
||||||
sdfat_init_namebuf(nb);
|
sdfat_init_namebuf(nb);
|
||||||
__lock_super(sb);
|
__lock_super(sb);
|
||||||
|
@ -384,7 +394,7 @@ static int sdfat_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||||
cpos = filp->f_pos;
|
cpos = filp->f_pos;
|
||||||
/* Fake . and .. for the root directory. */
|
/* Fake . and .. for the root directory. */
|
||||||
if ((fsi->vol_type == EXFAT) || (inode->i_ino == SDFAT_ROOT_INO)) {
|
if ((fsi->vol_type == EXFAT) || (inode->i_ino == SDFAT_ROOT_INO)) {
|
||||||
while (cpos < 2) {
|
while (cpos < ITER_POS_FILLED_DOTS) {
|
||||||
if (inode->i_ino == SDFAT_ROOT_INO)
|
if (inode->i_ino == SDFAT_ROOT_INO)
|
||||||
inum = SDFAT_ROOT_INO;
|
inum = SDFAT_ROOT_INO;
|
||||||
else if (cpos == 0)
|
else if (cpos == 0)
|
||||||
|
@ -397,8 +407,9 @@ static int sdfat_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||||
cpos++;
|
cpos++;
|
||||||
filp->f_pos++;
|
filp->f_pos++;
|
||||||
}
|
}
|
||||||
if (cpos == 2) {
|
if (cpos == ITER_POS_FILLED_DOTS) {
|
||||||
cpos = 0;
|
cpos = 0;
|
||||||
|
fake_offset = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cpos & (DENTRY_SIZE - 1)) {
|
if (cpos & (DENTRY_SIZE - 1)) {
|
||||||
|
@ -414,6 +425,9 @@ get_new:
|
||||||
SDFAT_I(inode)->fid.size = i_size_read(inode);
|
SDFAT_I(inode)->fid.size = i_size_read(inode);
|
||||||
SDFAT_I(inode)->fid.rwoffset = cpos >> DENTRY_SIZE_BITS;
|
SDFAT_I(inode)->fid.rwoffset = cpos >> DENTRY_SIZE_BITS;
|
||||||
|
|
||||||
|
if (cpos >= SDFAT_I(inode)->fid.size)
|
||||||
|
goto end_of_dir;
|
||||||
|
|
||||||
err = fsapi_readdir(inode, &de);
|
err = fsapi_readdir(inode, &de);
|
||||||
if (err) {
|
if (err) {
|
||||||
// at least we tried to read a sector
|
// at least we tried to read a sector
|
||||||
|
@ -463,6 +477,8 @@ get_new:
|
||||||
goto get_new;
|
goto get_new;
|
||||||
|
|
||||||
end_of_dir:
|
end_of_dir:
|
||||||
|
if (!cpos && fake_offset)
|
||||||
|
cpos = ITER_POS_FILLED_DOTS;
|
||||||
filp->f_pos = cpos;
|
filp->f_pos = cpos;
|
||||||
out:
|
out:
|
||||||
__unlock_super(sb);
|
__unlock_super(sb);
|
||||||
|
@ -1046,7 +1062,7 @@ static int __sdfat_revalidate_ci(struct dentry *dentry, unsigned int flags)
|
||||||
*/
|
*/
|
||||||
if (!flags)
|
if (!flags)
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* Drop the negative dentry, in order to make sure to use the
|
* Drop the negative dentry, in order to make sure to use the
|
||||||
* case sensitive name which is specified by user if this is
|
* case sensitive name which is specified by user if this is
|
||||||
|
@ -1054,7 +1070,6 @@ static int __sdfat_revalidate_ci(struct dentry *dentry, unsigned int flags)
|
||||||
*/
|
*/
|
||||||
if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET))
|
if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET))
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
|
||||||
return __sdfat_revalidate_common(dentry);
|
return __sdfat_revalidate_common(dentry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2250,16 +2265,29 @@ static struct dentry* __sdfat_lookup(struct inode *dir, struct dentry *dentry)
|
||||||
*/
|
*/
|
||||||
if (alias && alias->d_parent == dentry->d_parent &&
|
if (alias && alias->d_parent == dentry->d_parent &&
|
||||||
!sdfat_d_anon_disconn(alias)) {
|
!sdfat_d_anon_disconn(alias)) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This inode has non anonymous-DCACHE_DISCONNECTED
|
* Unhashed alias is able to exist because of revalidate()
|
||||||
* dentry. This means, the user did ->lookup() by an
|
* called by lookup_fast. You can easily make this status
|
||||||
* another name (longname vs 8.3 alias of it) in past.
|
* by calling create and lookup concurrently
|
||||||
*
|
* In such case, we reuse an alias instead of new dentry
|
||||||
* Switch to new one for reason of locality if possible.
|
|
||||||
*/
|
*/
|
||||||
BUG_ON(d_unhashed(alias));
|
if (d_unhashed(alias)) {
|
||||||
if (!S_ISDIR(i_mode))
|
BUG_ON(alias->d_name.hash_len != dentry->d_name.hash_len);
|
||||||
|
sdfat_msg(sb, KERN_INFO, "rehashed a dentry(%p) "
|
||||||
|
"in read lookup", alias);
|
||||||
|
d_drop(dentry);
|
||||||
|
d_rehash(alias);
|
||||||
|
} else if (!S_ISDIR(i_mode)) {
|
||||||
|
/*
|
||||||
|
* This inode has non anonymous-DCACHE_DISCONNECTED
|
||||||
|
* dentry. This means, the user did ->lookup() by an
|
||||||
|
* another name (longname vs 8.3 alias of it) in past.
|
||||||
|
*
|
||||||
|
* Switch to new one for reason of locality if possible.
|
||||||
|
*/
|
||||||
d_move(alias, dentry);
|
d_move(alias, dentry);
|
||||||
|
}
|
||||||
iput(inode);
|
iput(inode);
|
||||||
__unlock_super(sb);
|
__unlock_super(sb);
|
||||||
TMSG("%s exited\n", __func__);
|
TMSG("%s exited\n", __func__);
|
||||||
|
@ -3622,6 +3650,7 @@ static int sdfat_fill_inode(struct inode *inode, const FILE_ID_T *fid)
|
||||||
struct sdfat_sb_info *sbi = SDFAT_SB(inode->i_sb);
|
struct sdfat_sb_info *sbi = SDFAT_SB(inode->i_sb);
|
||||||
FS_INFO_T *fsi = &(sbi->fsi);
|
FS_INFO_T *fsi = &(sbi->fsi);
|
||||||
DIR_ENTRY_T info;
|
DIR_ENTRY_T info;
|
||||||
|
u64 size = fid->size;
|
||||||
|
|
||||||
memcpy(&(SDFAT_I(inode)->fid), fid, sizeof(FILE_ID_T));
|
memcpy(&(SDFAT_I(inode)->fid), fid, sizeof(FILE_ID_T));
|
||||||
|
|
||||||
|
@ -3663,16 +3692,20 @@ static int sdfat_fill_inode(struct inode *inode, const FILE_ID_T *fid)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
i_size_write(inode, info.Size);
|
/*
|
||||||
|
* Use fid->size instead of info.Size
|
||||||
|
* because info.Size means the value saved on disk
|
||||||
|
*/
|
||||||
|
i_size_write(inode, size);
|
||||||
|
|
||||||
/* ondisk and aligned size should be aligned with block size */
|
/* ondisk and aligned size should be aligned with block size */
|
||||||
if (info.Size & (inode->i_sb->s_blocksize - 1)) {
|
if (size & (inode->i_sb->s_blocksize - 1)) {
|
||||||
info.Size |= (inode->i_sb->s_blocksize - 1);
|
size |= (inode->i_sb->s_blocksize - 1);
|
||||||
info.Size++;
|
size++;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDFAT_I(inode)->i_size_aligned = info.Size;
|
SDFAT_I(inode)->i_size_aligned = size;
|
||||||
SDFAT_I(inode)->i_size_ondisk = info.Size;
|
SDFAT_I(inode)->i_size_ondisk = size;
|
||||||
sdfat_debug_check_clusters(inode);
|
sdfat_debug_check_clusters(inode);
|
||||||
|
|
||||||
sdfat_save_attr(inode, info.Attr);
|
sdfat_save_attr(inode, info.Attr);
|
||||||
|
@ -4534,6 +4567,7 @@ static int sdfat_read_root(struct inode *inode)
|
||||||
inode->i_fop = &sdfat_dir_operations;
|
inode->i_fop = &sdfat_dir_operations;
|
||||||
|
|
||||||
i_size_write(inode, info.Size);
|
i_size_write(inode, info.Size);
|
||||||
|
SDFAT_I(inode)->fid.size = info.Size;
|
||||||
inode->i_blocks = ( (i_size_read(inode) + (fsi->cluster_size - 1))
|
inode->i_blocks = ( (i_size_read(inode) + (fsi->cluster_size - 1))
|
||||||
& ~((loff_t)fsi->cluster_size - 1) ) >> inode->i_blkbits;
|
& ~((loff_t)fsi->cluster_size - 1) ) >> inode->i_blkbits;
|
||||||
SDFAT_I(inode)->i_pos = ((loff_t) fsi->root_dir << 32) | 0xffffffff;
|
SDFAT_I(inode)->i_pos = ((loff_t) fsi->root_dir << 32) | 0xffffffff;
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
#define EXFAT_SUPER_MAGIC (0x2011BAB0UL)
|
#define EXFAT_SUPER_MAGIC (0x2011BAB0UL)
|
||||||
#endif /* EXFAT_SUPER_MAGIC */
|
#endif /* EXFAT_SUPER_MAGIC */
|
||||||
|
|
||||||
#define SDFAT_SUPER_MAGIC (0x2014CABEUL)
|
#define SDFAT_SUPER_MAGIC (0x5EC5DFA4UL)
|
||||||
#define SDFAT_ROOT_INO 1
|
#define SDFAT_ROOT_INO 1
|
||||||
|
|
||||||
/* FAT types */
|
/* FAT types */
|
||||||
|
|
|
@ -24,4 +24,4 @@
|
||||||
/* PURPOSE : sdFAT File Manager */
|
/* PURPOSE : sdFAT File Manager */
|
||||||
/* */
|
/* */
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
#define SDFAT_VERSION "1.3.18"
|
#define SDFAT_VERSION "1.3.20"
|
||||||
|
|
|
@ -24,6 +24,10 @@
|
||||||
|
|
||||||
#define FG_DRIVER_VER "0.0.0.1"
|
#define FG_DRIVER_VER "0.0.0.1"
|
||||||
|
|
||||||
|
#if defined(CONFIG_BATTERY_AGE_FORECAST)
|
||||||
|
#define ENABLE_BATT_LONG_LIFE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/*To differentiate two battery Packs: SDI & ATL*/
|
/*To differentiate two battery Packs: SDI & ATL*/
|
||||||
enum {
|
enum {
|
||||||
SDI_BATTERY_TYPE = 0,
|
SDI_BATTERY_TYPE = 0,
|
||||||
|
@ -87,6 +91,12 @@ struct sec_fg_info {
|
||||||
int battery_typ; /*SDI_BATTERY_TYPE or ATL_BATTERY_TYPE*/
|
int battery_typ; /*SDI_BATTERY_TYPE or ATL_BATTERY_TYPE*/
|
||||||
int batt_id_adc_check;
|
int batt_id_adc_check;
|
||||||
int battery_table[3][16];
|
int battery_table[3][16];
|
||||||
|
#ifdef ENABLE_BATT_LONG_LIFE
|
||||||
|
int v_max_table[5];
|
||||||
|
int q_max_table[5];
|
||||||
|
int v_max_now;
|
||||||
|
int q_max_now;
|
||||||
|
#endif
|
||||||
int rce_value[3];
|
int rce_value[3];
|
||||||
int dtcd_value;
|
int dtcd_value;
|
||||||
int rs_value[4]; /*rs mix_factor max min*/
|
int rs_value[4]; /*rs mix_factor max min*/
|
||||||
|
@ -158,6 +168,10 @@ struct sec_fuelgauge_info {
|
||||||
unsigned int capacity_old; /* only for atomic calculation */
|
unsigned int capacity_old; /* only for atomic calculation */
|
||||||
unsigned int capacity_max; /* only for dynamic calculation */
|
unsigned int capacity_max; /* only for dynamic calculation */
|
||||||
|
|
||||||
|
#if defined(CONFIG_BATTERY_AGE_FORECAST)
|
||||||
|
unsigned int chg_full_soc; /* BATTERY_AGE_FORECAST */
|
||||||
|
#endif
|
||||||
|
|
||||||
bool initial_update_of_soc;
|
bool initial_update_of_soc;
|
||||||
struct mutex fg_lock;
|
struct mutex fg_lock;
|
||||||
|
|
||||||
|
|
|
@ -538,13 +538,6 @@ country KH:
|
||||||
(5490 - 5710 @ 80), (N/A, 27), DFS
|
(5490 - 5710 @ 80), (N/A, 27), DFS
|
||||||
(5735 - 5835 @ 40), (N/A, 30)
|
(5735 - 5835 @ 40), (N/A, 30)
|
||||||
|
|
||||||
country KP:
|
|
||||||
(2402 - 2482 @ 20), (N/A, 20)
|
|
||||||
(5170 - 5330 @ 20), (6, 20)
|
|
||||||
(5160 - 5250 @ 20), (6, 20), DFS
|
|
||||||
(5490 - 5630 @ 20), (6, 30), DFS
|
|
||||||
(5735 - 5815 @ 20), (6, 30)
|
|
||||||
|
|
||||||
country KR:
|
country KR:
|
||||||
(2402 - 2482 @ 20), (N/A, 20)
|
(2402 - 2482 @ 20), (N/A, 20)
|
||||||
(5150 - 5250 @ 80), (6, 20)
|
(5150 - 5250 @ 80), (6, 20)
|
||||||
|
@ -696,10 +689,11 @@ country MU:
|
||||||
(5490 - 5710 @ 80), (N/A, 27), DFS
|
(5490 - 5710 @ 80), (N/A, 27), DFS
|
||||||
|
|
||||||
country MY:
|
country MY:
|
||||||
(2402 - 2482 @ 40), (N/A, 20)
|
(2402 - 2482 @ 40), (20)
|
||||||
(5170 - 5250 @ 80), (N/A, 17)
|
(5170 - 5250 @ 80), (24), AUTO-BW
|
||||||
(5250 - 5330 @ 80), (N/A, 23), DFS
|
(5250 - 5330 @ 80), (24), DFS, AUTO-BW
|
||||||
(5735 - 5835 @ 80), (N/A, 30)
|
(5490 - 5650 @ 160), (24), DFS
|
||||||
|
(5735 - 5835 @ 80), (24)
|
||||||
|
|
||||||
country MX:
|
country MX:
|
||||||
(2402 - 2482 @ 40), (3, 20)
|
(2402 - 2482 @ 40), (3, 20)
|
||||||
|
|
Loading…
Reference in New Issue