Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

bu27034: ROHM BU27034ANUC correct lux calculation

The ROHM BU27034NUC was cancelled and BU27034ANUC is replacing this
sensor. The lux computation based on the data from a BU27034ANUC is
different from the computation for the data from an old BU27034NUC.

Fix the lux computation.

Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Link: https://patch.msgid.link/b7bea76b54b28eb354dc523771a0e0a8b6f26095.1720176341.git.mazziesaccount@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Matti Vaittinen and committed by
Jonathan Cameron
eb13959e bb105981

+31 -126
+31 -126
drivers/iio/light/rohm-bu27034.c
··· 573 573 } 574 574 575 575 /* 576 - * for (D1/D0 < 0.87): 577 - * lx = 0.004521097 * D1 - 0.002663996 * D0 + 578 - * 0.00012213 * D1 * D1 / D0 576 + * for (D1/D0 < 1.5): 577 + * lx = (0.001193 * D0 + (-0.0000747) * D1) * ((D1/D0 – 1.5) * (0.25) + 1) 579 578 * 580 - * => 115.7400832 * ch1 / gain1 / mt - 581 - * 68.1982976 * ch0 / gain0 / mt + 582 - * 0.00012213 * 25600 * (ch1 / gain1 / mt) * 25600 * 583 - * (ch1 /gain1 / mt) / (25600 * ch0 / gain0 / mt) 579 + * => -0.000745625 * D0 + 0.0002515625 * D1 + -0.000018675 * D1 * D1 / D0 584 580 * 585 - * A = 0.00012213 * 25600 * (ch1 /gain1 / mt) * 25600 * 586 - * (ch1 /gain1 / mt) / (25600 * ch0 / gain0 / mt) 587 - * => 0.00012213 * 25600 * (ch1 /gain1 / mt) * 588 - * (ch1 /gain1 / mt) / (ch0 / gain0 / mt) 589 - * => 0.00012213 * 25600 * (ch1 / gain1) * (ch1 /gain1 / mt) / 590 - * (ch0 / gain0) 591 - * => 0.00012213 * 25600 * (ch1 / gain1) * (ch1 /gain1 / mt) * 592 - * gain0 / ch0 593 - * => 3.126528 * ch1 * ch1 * gain0 / gain1 / gain1 / mt /ch0 581 + * => (6.44 * ch1 / gain1 + 19.088 * ch0 / gain0 - 582 + * 0.47808 * ch1 * ch1 * gain0 / gain1 / gain1 / ch0) / 583 + * mt 594 584 * 595 - * lx = (115.7400832 * ch1 / gain1 - 68.1982976 * ch0 / gain0) / 596 - * mt + A 597 - * => (115.7400832 * ch1 / gain1 - 68.1982976 * ch0 / gain0) / 598 - * mt + 3.126528 * ch1 * ch1 * gain0 / gain1 / gain1 / mt / 599 - * ch0 585 + * Else 586 + * lx = 0.001193 * D0 - 0.0000747 * D1 600 587 * 601 - * => (115.7400832 * ch1 / gain1 - 68.1982976 * ch0 / gain0 + 602 - * 3.126528 * ch1 * ch1 * gain0 / gain1 / gain1 / ch0) / 603 - * mt 604 - * 605 - * For (0.87 <= D1/D0 < 1.00) 606 - * lx = (0.001331* D0 + 0.0000354 * D1) * ((D1/D0 – 0.87) * (0.385) + 1) 607 - * => (0.001331 * 256 * 100 * ch0 / gain0 / mt + 0.0000354 * 256 * 608 - * 100 * ch1 / gain1 / mt) * ((D1/D0 - 0.87) * (0.385) + 1) 609 - * => (34.0736 * ch0 / gain0 / mt + 0.90624 * ch1 / gain1 / mt) * 610 - * ((D1/D0 - 0.87) * (0.385) + 1) 611 - * => (34.0736 * ch0 / gain0 / mt + 0.90624 * ch1 / gain1 / mt) * 612 - * (0.385 * D1/D0 - 0.66505) 613 - * => (34.0736 * ch0 / gain0 / mt + 0.90624 * ch1 / gain1 / mt) * 614 - * (0.385 * 256 * 100 * ch1 / gain1 / mt / (256 * 100 * ch0 / gain0 / mt) - 0.66505) 615 - * => (34.0736 * ch0 / gain0 / mt + 0.90624 * ch1 / gain1 / mt) * 616 - * (9856 * ch1 / gain1 / mt / (25600 * ch0 / gain0 / mt) + 0.66505) 617 - * => 13.118336 * ch1 / (gain1 * mt) 618 - * + 22.66064768 * ch0 / (gain0 * mt) 619 - * + 8931.90144 * ch1 * ch1 * gain0 / 620 - * (25600 * ch0 * gain1 * gain1 * mt) 621 - * + 0.602694912 * ch1 / (gain1 * mt) 622 - * 623 - * => [0.3489024 * ch1 * ch1 * gain0 / (ch0 * gain1 * gain1) 624 - * + 22.66064768 * ch0 / gain0 625 - * + 13.721030912 * ch1 / gain1 626 - * ] / mt 627 - * 628 - * For (D1/D0 >= 1.00) 629 - * 630 - * lx = (0.001331* D0 + 0.0000354 * D1) * ((D1/D0 – 2.0) * (-0.05) + 1) 631 - * => (0.001331* D0 + 0.0000354 * D1) * (-0.05D1/D0 + 1.1) 632 - * => (0.001331 * 256 * 100 * ch0 / gain0 / mt + 0.0000354 * 256 * 633 - * 100 * ch1 / gain1 / mt) * (-0.05D1/D0 + 1.1) 634 - * => (34.0736 * ch0 / gain0 / mt + 0.90624 * ch1 / gain1 / mt) * 635 - * (-0.05 * 256 * 100 * ch1 / gain1 / mt / (256 * 100 * ch0 / gain0 / mt) + 1.1) 636 - * => (34.0736 * ch0 / gain0 / mt + 0.90624 * ch1 / gain1 / mt) * 637 - * (-1280 * ch1 / (gain1 * mt * 25600 * ch0 / gain0 / mt) + 1.1) 638 - * => (34.0736 * ch0 * -1280 * ch1 * gain0 * mt /( gain0 * mt * gain1 * mt * 25600 * ch0) 639 - * + 34.0736 * 1.1 * ch0 / (gain0 * mt) 640 - * + 0.90624 * ch1 * -1280 * ch1 *gain0 * mt / (gain1 * mt *gain1 * mt * 25600 * ch0) 641 - * + 1.1 * 0.90624 * ch1 / (gain1 * mt) 642 - * => -43614.208 * ch1 / (gain1 * mt * 25600) 643 - * + 37.48096 ch0 / (gain0 * mt) 644 - * - 1159.9872 * ch1 * ch1 * gain0 / (gain1 * gain1 * mt * 25600 * ch0) 645 - * + 0.996864 ch1 / (gain1 * mt) 646 - * => [ 647 - * - 0.045312 * ch1 * ch1 * gain0 / (gain1 * gain1 * ch0) 648 - * - 0.706816 * ch1 / gain1 649 - * + 37.48096 ch0 /gain0 650 - * ] * mt 651 - * 652 - * 653 - * So, the first case (D1/D0 < 0.87) can be computed to a form: 654 - * 655 - * lx = (3.126528 * ch1 * ch1 * gain0 / (ch0 * gain1 * gain1) + 656 - * 115.7400832 * ch1 / gain1 + 657 - * -68.1982976 * ch0 / gain0 658 - * / mt 659 - * 660 - * Second case (0.87 <= D1/D0 < 1.00) goes to form: 661 - * 662 - * => [0.3489024 * ch1 * ch1 * gain0 / (ch0 * gain1 * gain1) + 663 - * 13.721030912 * ch1 / gain1 + 664 - * 22.66064768 * ch0 / gain0 665 - * ] / mt 666 - * 667 - * Third case (D1/D0 >= 1.00) goes to form: 668 - * => [-0.045312 * ch1 * ch1 * gain0 / (ch0 * gain1 * gain1) + 669 - * -0.706816 * ch1 / gain1 + 670 - * 37.48096 ch0 /(gain0 671 - * ] / mt 588 + * => (1.91232 * ch1 / gain1 + 30.5408 * ch0 / gain0 + 589 + * [0 * ch1 * ch1 * gain0 / gain1 / gain1 / ch0] ) / 590 + * mt 672 591 * 673 592 * This can be unified to format: 674 593 * lx = [ ··· 597 678 * ] / mt 598 679 * 599 680 * For case 1: 600 - * A = 3.126528, 601 - * B = 115.7400832 602 - * C = -68.1982976 681 + * A = -0.47808, 682 + * B = 6.44, 683 + * C = 19.088 603 684 * 604 685 * For case 2: 605 - * A = 0.3489024 606 - * B = 13.721030912 607 - * C = 22.66064768 608 - * 609 - * For case 3: 610 - * A = -0.045312 611 - * B = -0.706816 612 - * C = 37.48096 686 + * A = 0 687 + * B = 1.91232 688 + * C = 30.5408 613 689 */ 614 690 615 691 struct bu27034_lx_coeff { ··· 709 795 { 710 796 static const struct bu27034_lx_coeff coeff[] = { 711 797 { 712 - .A = 31265280, /* 3.126528 */ 713 - .B = 1157400832, /*115.7400832 */ 714 - .C = 681982976, /* -68.1982976 */ 715 - .is_neg = {false, false, true}, 798 + .A = 4780800, /* -0.47808 */ 799 + .B = 64400000, /* 6.44 */ 800 + .C = 190880000, /* 19.088 */ 801 + .is_neg = { true, false, false }, 716 802 }, { 717 - .A = 3489024, /* 0.3489024 */ 718 - .B = 137210309, /* 13.721030912 */ 719 - .C = 226606476, /* 22.66064768 */ 803 + .A = 0, /* 0 */ 804 + .B = 19123200, /* 1.91232 */ 805 + .C = 305408000, /* 30.5408 */ 720 806 /* All terms positive */ 721 - }, { 722 - .A = 453120, /* -0.045312 */ 723 - .B = 7068160, /* -0.706816 */ 724 - .C = 374809600, /* 37.48096 */ 725 - .is_neg = {true, true, false}, 726 - } 807 + }, 727 808 }; 728 809 const struct bu27034_lx_coeff *c = &coeff[coeff_idx]; 729 810 u64 res = 0, terms[3]; ··· 881 972 * D1 = data1/ch1_gain/meas_time_ms * 25600 882 973 * 883 974 * Then: 884 - * if (D1/D0 < 0.87) 885 - * lx = (0.001331 * D0 + 0.0000354 * D1) * ((D1 / D0 - 0.87) * 3.45 + 1) 886 - * else if (D1/D0 < 1) 887 - * lx = (0.001331 * D0 + 0.0000354 * D1) * ((D1 / D0 - 0.87) * 0.385 + 1) 888 - * else 889 - * lx = (0.001331 * D0 + 0.0000354 * D1) * ((D1 / D0 - 2) * -0.05 + 1) 975 + * If (D1/D0 < 1.5) 976 + * lx = (0.001193 * D0 + (-0.0000747) * D1) * ((D1 / D0 – 1.5) * 0.25 + 1) 977 + * Else 978 + * lx = (0.001193 * D0 + (-0.0000747) * D1) 890 979 * 891 980 * We use it here. Users who have for example some colored lens 892 981 * need to modify the calculation but I hope this gives a starting point for ··· 935 1028 d1_d0_ratio_scaled /= ch0 * gain1; 936 1029 } 937 1030 938 - if (d1_d0_ratio_scaled < 87) 1031 + if (d1_d0_ratio_scaled < 150) 939 1032 ret = bu27034_fixp_calc_lx(ch0, ch1, gain0, gain1, meastime, 0); 940 - else if (d1_d0_ratio_scaled < 100) 941 - ret = bu27034_fixp_calc_lx(ch0, ch1, gain0, gain1, meastime, 1); 942 1033 else 943 - ret = bu27034_fixp_calc_lx(ch0, ch1, gain0, gain1, meastime, 2); 1034 + ret = bu27034_fixp_calc_lx(ch0, ch1, gain0, gain1, meastime, 1); 944 1035 945 1036 if (ret < 0) 946 1037 return ret;