1602 lines
79 KiB
C
Executable File
1602 lines
79 KiB
C
Executable File
/*
|
|
* stk6d2x_fifo.c - Linux kernel modules for sensortek stk6d2x
|
|
* ambient light sensor (Algorithm)
|
|
*
|
|
* Copyright (C) 2012~2018 Bk, sensortek Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#include <linux/input.h>
|
|
#include <stk6d2x.h>
|
|
#include "stk6d2x_sec.h"
|
|
|
|
#ifdef STK_FIFO_ENABLE
|
|
#ifdef SEC_FFT_FLICKER_1024
|
|
|
|
// sec_hamming : 0~65535, Q16
|
|
static const int32_t hamming[2048] = {
|
|
5243, 5243, 5243, 5244, 5245, 5246, 5248, 5250, 5252, 5254, 5257, 5260, 5263, 5267, 5271, 5275, 5279, 5284, 5289, 5294, 5300, 5305, 5312, 5318, 5325, 5332, 5339, 5346, 5354, 5362, 5370, 5379, 5388, 5397, 5407, 5417, 5427, 5437, 5448, 5458, 5470, 5481, 5493, 5505, 5517, 5530, 5543, 5556, 5569, 5583, 5597, 5611, 5626, 5641, 5656, 5671, 5687, 5703, 5719, 5735, 5752, 5769, 5787, 5804, 5822, 5840, 5859, 5878, 5897, 5916, 5935, 5955, 5975, 5996, 6016, 6037, 6059, 6080, 6102, 6124, 6146, 6169, 6192, 6215, 6238, 6262, 6286, 6310,
|
|
6335, 6360, 6385, 6410, 6436, 6462, 6488, 6514, 6541, 6568, 6595, 6623, 6651, 6679, 6707, 6736, 6764, 6794, 6823, 6853, 6883, 6913, 6943, 6974, 7005, 7036, 7068, 7100, 7132, 7164, 7197, 7230, 7263, 7296, 7330, 7364, 7398, 7433, 7467, 7502, 7538, 7573, 7609, 7645, 7681, 7718, 7755, 7792, 7829, 7867, 7905, 7943, 7981, 8020, 8059, 8098, 8137, 8177, 8217, 8257, 8297, 8338, 8379, 8420, 8462, 8504, 8545, 8588, 8630, 8673, 8716, 8759, 8803, 8846, 8890, 8934, 8979, 9024, 9069, 9114, 9159, 9205, 9251, 9297, 9344, 9390, 9437, 9484,
|
|
9532, 9580, 9627, 9676, 9724, 9773, 9822, 9871, 9920, 9970, 10019, 10070, 10120, 10170, 10221, 10272, 10323, 10375, 10427, 10479, 10531, 10583, 10636, 10689, 10742, 10795, 10849, 10903, 10957, 11011, 11066, 11121, 11175, 11231, 11286, 11342, 11398, 11454, 11510, 11567, 11624, 11681, 11738, 11795, 11853, 11911, 11969, 12027, 12086, 12145, 12204, 12263, 12322, 12382, 12442, 12502, 12562, 12623, 12683, 12744, 12806, 12867, 12929, 12990, 13052, 13115, 13177, 13240, 13302, 13365, 13429, 13492, 13556, 13620, 13684, 13748, 13813, 13877, 13942, 14007, 14073, 14138, 14204, 14270, 14336, 14402, 14469, 14535,
|
|
14602, 14669, 14737, 14804, 14872, 14940, 15008, 15076, 15144, 15213, 15282, 15351, 15420, 15489, 15559, 15629, 15699, 15769, 15839, 15909, 15980, 16051, 16122, 16193, 16265, 16336, 16408, 16480, 16552, 16624, 16697, 16769, 16842, 16915, 16988, 17062, 17135, 17209, 17283, 17357, 17431, 17506, 17580, 17655, 17730, 17805, 17880, 17955, 18031, 18107, 18182, 18258, 18335, 18411, 18487, 18564, 18641, 18718, 18795, 18872, 18950, 19027, 19105, 19183, 19261, 19339, 19418, 19496, 19575, 19654, 19733, 19812, 19891, 19970, 20050, 20130, 20209, 20289, 20370, 20450, 20530, 20611, 20691, 20772, 20853, 20934, 21016, 21097,
|
|
21178, 21260, 21342, 21424, 21506, 21588, 21670, 21753, 21835, 21918, 22001, 22084, 22167, 22250, 22333, 22417, 22500, 22584, 22668, 22751, 22836, 22920, 23004, 23088, 23173, 23257, 23342, 23427, 23512, 23597, 23682, 23767, 23853, 23938, 24024, 24110, 24196, 24281, 24367, 24454, 24540, 24626, 24713, 24799, 24886, 24973, 25059, 25146, 25233, 25320, 25408, 25495, 25582, 25670, 25758, 25845, 25933, 26021, 26109, 26197, 26285, 26373, 26462, 26550, 26638, 26727, 26816, 26904, 26993, 27082, 27171, 27260, 27349, 27438, 27527, 27617, 27706, 27796, 27885, 27975, 28064, 28154, 28244, 28334, 28424, 28514, 28604, 28694,
|
|
28784, 28875, 28965, 29055, 29146, 29236, 29327, 29417, 29508, 29599, 29690, 29781, 29871, 29962, 30053, 30144, 30236, 30327, 30418, 30509, 30600, 30692, 30783, 30875, 30966, 31058, 31149, 31241, 31332, 31424, 31516, 31607, 31699, 31791, 31883, 31975, 32067, 32159, 32251, 32343, 32435, 32527, 32619, 32711, 32803, 32895, 32987, 33079, 33172, 33264, 33356, 33449, 33541, 33633, 33725, 33818, 33910, 34003, 34095, 34187, 34280, 34372, 34465, 34557, 34650, 34742, 34835, 34927, 35019, 35112, 35204, 35297, 35389, 35482, 35574, 35667, 35759, 35852, 35944, 36037, 36129, 36222, 36314, 36407, 36499, 36591, 36684, 36776,
|
|
36869, 36961, 37053, 37146, 37238, 37330, 37423, 37515, 37607, 37699, 37792, 37884, 37976, 38068, 38160, 38252, 38344, 38436, 38528, 38620, 38712, 38804, 38896, 38988, 39080, 39171, 39263, 39355, 39447, 39538, 39630, 39721, 39813, 39904, 39996, 40087, 40178, 40270, 40361, 40452, 40543, 40634, 40726, 40817, 40907, 40998, 41089, 41180, 41271, 41361, 41452, 41543, 41633, 41724, 41814, 41904, 41995, 42085, 42175, 42265, 42355, 42445, 42535, 42625, 42714, 42804, 42894, 42983, 43073, 43162, 43251, 43341, 43430, 43519, 43608, 43697, 43786, 43875, 43963, 44052, 44141, 44229, 44317, 44406, 44494, 44582, 44670, 44758,
|
|
44846, 44934, 45021, 45109, 45196, 45284, 45371, 45458, 45546, 45633, 45719, 45806, 45893, 45980, 46066, 46153, 46239, 46325, 46411, 46497, 46583, 46669, 46755, 46841, 46926, 47011, 47097, 47182, 47267, 47352, 47437, 47521, 47606, 47691, 47775, 47859, 47943, 48027, 48111, 48195, 48279, 48362, 48446, 48529, 48612, 48695, 48778, 48861, 48944, 49026, 49109, 49191, 49273, 49355, 49437, 49519, 49600, 49682, 49763, 49845, 49926, 50007, 50087, 50168, 50249, 50329, 50409, 50489, 50569, 50649, 50729, 50808, 50888, 50967, 51046, 51125, 51204, 51283, 51361, 51440, 51518, 51596, 51674, 51752, 51829, 51907, 51984, 52061,
|
|
52138, 52215, 52291, 52368, 52444, 52520, 52597, 52672, 52748, 52824, 52899, 52974, 53049, 53124, 53199, 53273, 53348, 53422, 53496, 53570, 53644, 53717, 53790, 53864, 53937, 54009, 54082, 54155, 54227, 54299, 54371, 54443, 54514, 54586, 54657, 54728, 54799, 54869, 54940, 55010, 55080, 55150, 55220, 55290, 55359, 55428, 55497, 55566, 55635, 55703, 55771, 55839, 55907, 55975, 56042, 56110, 56177, 56244, 56310, 56377, 56443, 56509, 56575, 56641, 56706, 56772, 56837, 56902, 56966, 57031, 57095, 57159, 57223, 57287, 57350, 57413, 57476, 57539, 57602, 57664, 57727, 57789, 57850, 57912, 57973, 58034, 58095, 58156,
|
|
58217, 58277, 58337, 58397, 58457, 58516, 58575, 58634, 58693, 58752, 58810, 58868, 58926, 58984, 59041, 59098, 59155, 59212, 59269, 59325, 59381, 59437, 59493, 59548, 59603, 59658, 59713, 59768, 59822, 59876, 59930, 59983, 60037, 60090, 60143, 60196, 60248, 60300, 60352, 60404, 60455, 60507, 60558, 60608, 60659, 60709, 60759, 60809, 60859, 60908, 60957, 61006, 61055, 61103, 61151, 61199, 61247, 61294, 61342, 61389, 61435, 61482, 61528, 61574, 61620, 61665, 61710, 61755, 61800, 61844, 61889, 61933, 61976, 62020, 62063, 62106, 62149, 62191, 62233, 62275, 62317, 62359, 62400, 62441, 62481, 62522, 62562, 62602,
|
|
62642, 62681, 62720, 62759, 62798, 62836, 62874, 62912, 62950, 62987, 63024, 63061, 63098, 63134, 63170, 63206, 63241, 63276, 63311, 63346, 63381, 63415, 63449, 63483, 63516, 63549, 63582, 63615, 63647, 63679, 63711, 63742, 63774, 63805, 63836, 63866, 63896, 63926, 63956, 63985, 64014, 64043, 64072, 64100, 64128, 64156, 64184, 64211, 64238, 64265, 64291, 64317, 64343, 64369, 64394, 64419, 64444, 64469, 64493, 64517, 64540, 64564, 64587, 64610, 64633, 64655, 64677, 64699, 64720, 64741, 64762, 64783, 64804, 64824, 64843, 64863, 64882, 64901, 64920, 64939, 64957, 64975, 64992, 65010, 65027, 65043, 65060, 65076,
|
|
65092, 65108, 65123, 65138, 65153, 65168, 65182, 65196, 65210, 65223, 65236, 65249, 65262, 65274, 65286, 65298, 65309, 65320, 65331, 65342, 65352, 65362, 65372, 65382, 65391, 65400, 65408, 65417, 65425, 65433, 65440, 65447, 65454, 65461, 65467, 65473, 65479, 65485, 65490, 65495, 65500, 65504, 65508, 65512, 65516, 65519, 65522, 65525, 65527, 65529, 65531, 65532, 65534, 65535, 65535, 65536, 65536, 65536, 65535, 65535, 65534, 65532, 65531, 65529, 65527, 65525, 65522, 65519, 65516, 65512, 65508, 65504, 65500, 65495, 65490, 65485, 65479, 65473, 65467, 65461, 65454, 65447, 65440, 65433, 65425, 65417, 65408, 65400,
|
|
65391, 65382, 65372, 65362, 65352, 65342, 65331, 65320, 65309, 65298, 65286, 65274, 65262, 65249, 65236, 65223, 65210, 65196, 65182, 65168, 65153, 65138, 65123, 65108, 65092, 65076, 65060, 65043, 65027, 65010, 64992, 64975, 64957, 64939, 64920, 64901, 64882, 64863, 64843, 64824, 64804, 64783, 64762, 64741, 64720, 64699, 64677, 64655, 64633, 64610, 64587, 64564, 64540, 64517, 64493, 64469, 64444, 64419, 64394, 64369, 64343, 64317, 64291, 64265, 64238, 64211, 64184, 64156, 64128, 64100, 64072, 64043, 64014, 63985, 63956, 63926, 63896, 63866, 63836, 63805, 63774, 63742, 63711, 63679, 63647, 63615, 63582, 63549,
|
|
63516, 63483, 63449, 63415, 63381, 63346, 63311, 63276, 63241, 63206, 63170, 63134, 63098, 63061, 63024, 62987, 62950, 62912, 62874, 62836, 62798, 62759, 62720, 62681, 62642, 62602, 62562, 62522, 62481, 62441, 62400, 62359, 62317, 62275, 62233, 62191, 62149, 62106, 62063, 62020, 61976, 61933, 61889, 61844, 61800, 61755, 61710, 61665, 61620, 61574, 61528, 61482, 61435, 61389, 61342, 61294, 61247, 61199, 61151, 61103, 61055, 61006, 60957, 60908, 60859, 60809, 60759, 60709, 60659, 60608, 60558, 60507, 60455, 60404, 60352, 60300, 60248, 60196, 60143, 60090, 60037, 59983, 59930, 59876, 59822, 59768, 59713, 59658,
|
|
59603, 59548, 59493, 59437, 59381, 59325, 59269, 59212, 59155, 59098, 59041, 58984, 58926, 58868, 58810, 58752, 58693, 58634, 58575, 58516, 58457, 58397, 58337, 58277, 58217, 58156, 58095, 58034, 57973, 57912, 57850, 57789, 57727, 57664, 57602, 57539, 57476, 57413, 57350, 57287, 57223, 57159, 57095, 57031, 56966, 56902, 56837, 56772, 56706, 56641, 56575, 56509, 56443, 56377, 56310, 56244, 56177, 56110, 56042, 55975, 55907, 55839, 55771, 55703, 55635, 55566, 55497, 55428, 55359, 55290, 55220, 55150, 55080, 55010, 54940, 54869, 54799, 54728, 54657, 54586, 54514, 54443, 54371, 54299, 54227, 54155, 54082, 54009,
|
|
53937, 53864, 53790, 53717, 53644, 53570, 53496, 53422, 53348, 53273, 53199, 53124, 53049, 52974, 52899, 52824, 52748, 52672, 52597, 52520, 52444, 52368, 52291, 52215, 52138, 52061, 51984, 51907, 51829, 51752, 51674, 51596, 51518, 51440, 51361, 51283, 51204, 51125, 51046, 50967, 50888, 50808, 50729, 50649, 50569, 50489, 50409, 50329, 50249, 50168, 50087, 50007, 49926, 49845, 49763, 49682, 49600, 49519, 49437, 49355, 49273, 49191, 49109, 49026, 48944, 48861, 48778, 48695, 48612, 48529, 48446, 48362, 48279, 48195, 48111, 48027, 47943, 47859, 47775, 47691, 47606, 47521, 47437, 47352, 47267, 47182, 47097, 47011,
|
|
46926, 46841, 46755, 46669, 46583, 46497, 46411, 46325, 46239, 46153, 46066, 45980, 45893, 45806, 45719, 45633, 45546, 45458, 45371, 45284, 45196, 45109, 45021, 44934, 44846, 44758, 44670, 44582, 44494, 44406, 44317, 44229, 44141, 44052, 43963, 43875, 43786, 43697, 43608, 43519, 43430, 43341, 43251, 43162, 43073, 42983, 42894, 42804, 42714, 42625, 42535, 42445, 42355, 42265, 42175, 42085, 41995, 41904, 41814, 41724, 41633, 41543, 41452, 41361, 41271, 41180, 41089, 40998, 40907, 40817, 40726, 40634, 40543, 40452, 40361, 40270, 40178, 40087, 39996, 39904, 39813, 39721, 39630, 39538, 39447, 39355, 39263, 39171,
|
|
39080, 38988, 38896, 38804, 38712, 38620, 38528, 38436, 38344, 38252, 38160, 38068, 37976, 37884, 37792, 37699, 37607, 37515, 37423, 37330, 37238, 37146, 37053, 36961, 36869, 36776, 36684, 36591, 36499, 36407, 36314, 36222, 36129, 36037, 35944, 35852, 35759, 35667, 35574, 35482, 35389, 35297, 35204, 35112, 35019, 34927, 34835, 34742, 34650, 34557, 34465, 34372, 34280, 34187, 34095, 34003, 33910, 33818, 33725, 33633, 33541, 33449, 33356, 33264, 33172, 33079, 32987, 32895, 32803, 32711, 32619, 32527, 32435, 32343, 32251, 32159, 32067, 31975, 31883, 31791, 31699, 31607, 31516, 31424, 31332, 31241, 31149, 31058,
|
|
30966, 30875, 30783, 30692, 30600, 30509, 30418, 30327, 30236, 30144, 30053, 29962, 29871, 29781, 29690, 29599, 29508, 29417, 29327, 29236, 29146, 29055, 28965, 28875, 28784, 28694, 28604, 28514, 28424, 28334, 28244, 28154, 28064, 27975, 27885, 27796, 27706, 27617, 27527, 27438, 27349, 27260, 27171, 27082, 26993, 26904, 26816, 26727, 26638, 26550, 26462, 26373, 26285, 26197, 26109, 26021, 25933, 25845, 25758, 25670, 25582, 25495, 25408, 25320, 25233, 25146, 25059, 24973, 24886, 24799, 24713, 24626, 24540, 24454, 24367, 24281, 24196, 24110, 24024, 23938, 23853, 23767, 23682, 23597, 23512, 23427, 23342, 23257,
|
|
23173, 23088, 23004, 22920, 22836, 22751, 22668, 22584, 22500, 22417, 22333, 22250, 22167, 22084, 22001, 21918, 21835, 21753, 21670, 21588, 21506, 21424, 21342, 21260, 21178, 21097, 21016, 20934, 20853, 20772, 20691, 20611, 20530, 20450, 20370, 20289, 20209, 20130, 20050, 19970, 19891, 19812, 19733, 19654, 19575, 19496, 19418, 19339, 19261, 19183, 19105, 19027, 18950, 18872, 18795, 18718, 18641, 18564, 18487, 18411, 18335, 18258, 18182, 18107, 18031, 17955, 17880, 17805, 17730, 17655, 17580, 17506, 17431, 17357, 17283, 17209, 17135, 17062, 16988, 16915, 16842, 16769, 16697, 16624, 16552, 16480, 16408, 16336,
|
|
16265, 16193, 16122, 16051, 15980, 15909, 15839, 15769, 15699, 15629, 15559, 15489, 15420, 15351, 15282, 15213, 15144, 15076, 15008, 14940, 14872, 14804, 14737, 14669, 14602, 14535, 14469, 14402, 14336, 14270, 14204, 14138, 14073, 14007, 13942, 13877, 13813, 13748, 13684, 13620, 13556, 13492, 13429, 13365, 13302, 13240, 13177, 13115, 13052, 12990, 12929, 12867, 12806, 12744, 12683, 12623, 12562, 12502, 12442, 12382, 12322, 12263, 12204, 12145, 12086, 12027, 11969, 11911, 11853, 11795, 11738, 11681, 11624, 11567, 11510, 11454, 11398, 11342, 11286, 11231, 11175, 11121, 11066, 11011, 10957, 10903, 10849, 10795,
|
|
10742, 10689, 10636, 10583, 10531, 10479, 10427, 10375, 10323, 10272, 10221, 10170, 10120, 10070, 10019, 9970, 9920, 9871, 9822, 9773, 9724, 9676, 9627, 9580, 9532, 9484, 9437, 9390, 9344, 9297, 9251, 9205, 9159, 9114, 9069, 9024, 8979, 8934, 8890, 8846, 8803, 8759, 8716, 8673, 8630, 8588, 8545, 8504, 8462, 8420, 8379, 8338, 8297, 8257, 8217, 8177, 8137, 8098, 8059, 8020, 7981, 7943, 7905, 7867, 7829, 7792, 7755, 7718, 7681, 7645, 7609, 7573, 7538, 7502, 7467, 7433, 7398, 7364, 7330, 7296, 7263, 7230, 7197, 7164, 7132, 7100, 7068, 7036,
|
|
7005, 6974, 6943, 6913, 6883, 6853, 6823, 6794, 6764, 6736, 6707, 6679, 6651, 6623, 6595, 6568, 6541, 6514, 6488, 6462, 6436, 6410, 6385, 6360, 6335, 6310, 6286, 6262, 6238, 6215, 6192, 6169, 6146, 6124, 6102, 6080, 6059, 6037, 6016, 5996, 5975, 5955, 5935, 5916, 5897, 5878, 5859, 5840, 5822, 5804, 5787, 5769, 5752, 5735, 5719, 5703, 5687, 5671, 5656, 5641, 5626, 5611, 5597, 5583, 5569, 5556, 5543, 5530, 5517, 5505, 5493, 5481, 5470, 5458, 5448, 5437, 5427, 5417, 5407, 5397, 5388, 5379, 5370, 5362, 5354, 5346, 5339, 5332,
|
|
5325, 5318, 5312, 5305, 5300, 5294, 5289, 5284, 5279, 5275, 5271, 5267, 5263, 5260, 5257, 5254, 5252, 5250, 5248, 5246, 5245, 5244, 5243, 5243,
|
|
};
|
|
|
|
// sec_sin, sec_cos : -65536~65536
|
|
static const int32_t sin[1024] = {
|
|
0, 205886, 411764, 617627, 823467, 1029276, 1235045,
|
|
1440769, 1646438, 1852045, 2057582, 2263042, 2468417, 2673699,
|
|
2878880, 3083953, 3288909, 3493742, 3698444, 3903006, 4107421,
|
|
4311681, 4515779, 4719707, 4923458, 5127023, 5330395, 5533566,
|
|
5736529, 5939276, 6141799, 6344092, 6546145, 6747952, 6949505,
|
|
7150796, 7351818, 7552563, 7753024, 7953192, 8153062, 8352624,
|
|
8551872, 8750798, 8949395, 9147655, 9345570, 9543133, 9740337,
|
|
9937175, 10133638, 10329720, 10525413, 10720709, 10915602, 11110084,
|
|
11304148, 11497786, 11690991, 11883756, 12076074, 12267936, 12459338,
|
|
12650270, 12840725, 13030697, 13220179, 13409163, 13597642, 13785609,
|
|
13973057, 14159979, 14346368, 14532217, 14717519, 14902266, 15086453,
|
|
15270071, 15453115, 15635577, 15817450, 15998727, 16179403, 16359469,
|
|
16538919, 16717746, 16895944, 17073506, 17250426, 17426695, 17602309,
|
|
17777260, 17951541, 18125147, 18298070, 18470305, 18641844, 18812681,
|
|
18982810, 19152224, 19320917, 19488882, 19656114, 19822606, 19988352,
|
|
20153345, 20317579, 20481048, 20643747, 20805668, 20966805, 21127153,
|
|
21286706, 21445458, 21603402, 21760532, 21916844, 22072330, 22226985,
|
|
22380804, 22533779, 22685907, 22837180, 22987593, 23137141, 23285818,
|
|
23433618, 23580536, 23726566, 23871703, 24015941, 24159275, 24301699,
|
|
24443209, 24583798, 24723461, 24862194, 24999991, 25136846, 25272755,
|
|
25407713, 25541714, 25674753, 25806826, 25937927, 26068051, 26197194,
|
|
26325351, 26452517, 26578686, 26703855, 26828019, 26951172, 27073311,
|
|
27194431, 27314527, 27433594, 27551629, 27668626, 27784581, 27899491,
|
|
28013350, 28126154, 28237899, 28348582, 28458196, 28566740, 28674208,
|
|
28780596, 28885901, 28990118, 29093244, 29195275, 29296206, 29396034,
|
|
29494756, 29592367, 29688864, 29784243, 29878501, 29971634, 30063639,
|
|
30154511, 30244249, 30332847, 30420304, 30506615, 30591778, 30675789,
|
|
30758645, 30840343, 30920880, 31000253, 31078459, 31155494, 31231357,
|
|
31306043, 31379551, 31451878, 31523021, 31592976, 31661743, 31729317,
|
|
31795696, 31860879, 31924862, 31987643, 32049219, 32109589, 32168751,
|
|
32226701, 32283437, 32338958, 32393262, 32446346, 32498209, 32548848,
|
|
32598261, 32646447, 32693405, 32739131, 32783624, 32826884, 32868907,
|
|
32909693, 32949240, 32987546, 33024611, 33060432, 33095008, 33128338,
|
|
33160421, 33191256, 33220841, 33249175, 33276257, 33302087, 33326663,
|
|
33349984, 33372049, 33392858, 33412410, 33430704, 33447739, 33463515,
|
|
33478031, 33491286, 33503281, 33514014, 33523486, 33531695, 33538642,
|
|
33544326, 33548747, 33551905, 33553800, 33554432, 33553800, 33551905,
|
|
33548747, 33544326, 33538642, 33531695, 33523486, 33514014, 33503281,
|
|
33491286, 33478031, 33463515, 33447739, 33430704, 33412410, 33392858,
|
|
33372049, 33349984, 33326663, 33302087, 33276257, 33249175, 33220841,
|
|
33191256, 33160421, 33128338, 33095008, 33060432, 33024611, 32987546,
|
|
32949240, 32909693, 32868907, 32826884, 32783624, 32739131, 32693405,
|
|
32646447, 32598261, 32548848, 32498209, 32446346, 32393262, 32338958,
|
|
32283437, 32226701, 32168751, 32109589, 32049219, 31987643, 31924862,
|
|
31860879, 31795696, 31729317, 31661743, 31592976, 31523021, 31451878,
|
|
31379551, 31306043, 31231357, 31155494, 31078459, 31000253, 30920880,
|
|
30840343, 30758645, 30675789, 30591778, 30506615, 30420304, 30332847,
|
|
30244249, 30154511, 30063639, 29971634, 29878501, 29784243, 29688864,
|
|
29592367, 29494756, 29396034, 29296206, 29195275, 29093244, 28990118,
|
|
28885901, 28780596, 28674208, 28566740, 28458196, 28348582, 28237899,
|
|
28126154, 28013350, 27899491, 27784581, 27668626, 27551629, 27433594,
|
|
27314527, 27194431, 27073311, 26951172, 26828019, 26703855, 26578686,
|
|
26452517, 26325351, 26197194, 26068051, 25937927, 25806826, 25674753,
|
|
25541714, 25407713, 25272755, 25136846, 24999991, 24862194, 24723461,
|
|
24583798, 24443209, 24301699, 24159275, 24015941, 23871703, 23726566,
|
|
23580536, 23433618, 23285818, 23137141, 22987593, 22837180, 22685907,
|
|
22533779, 22380804, 22226985, 22072330, 21916844, 21760532, 21603402,
|
|
21445458, 21286706, 21127153, 20966805, 20805668, 20643747, 20481048,
|
|
20317579, 20153345, 19988352, 19822606, 19656114, 19488882, 19320917,
|
|
19152224, 18982810, 18812681, 18641844, 18470305, 18298070, 18125147,
|
|
17951541, 17777260, 17602309, 17426695, 17250426, 17073506, 16895944,
|
|
16717746, 16538919, 16359469, 16179403, 15998727, 15817450, 15635577,
|
|
15453115, 15270071, 15086453, 14902266, 14717519, 14532217, 14346368,
|
|
14159979, 13973057, 13785609, 13597642, 13409163, 13220179, 13030697,
|
|
12840725, 12650270, 12459338, 12267936, 12076074, 11883756, 11690991,
|
|
11497786, 11304148, 11110084, 10915602, 10720709, 10525413, 10329720,
|
|
10133638, 9937175, 9740337, 9543133, 9345570, 9147655, 8949395,
|
|
8750798, 8551872, 8352624, 8153062, 7953192, 7753024, 7552563,
|
|
7351818, 7150796, 6949505, 6747952, 6546145, 6344092, 6141799,
|
|
5939276, 5736529, 5533566, 5330395, 5127023, 4923458, 4719707,
|
|
4515779, 4311681, 4107421, 3903006, 3698444, 3493742, 3288909,
|
|
3083953, 2878880, 2673699, 2468417, 2263042, 2057582, 1852045,
|
|
1646438, 1440769, 1235045, 1029276, 823467, 617627, 411764,
|
|
205886, 0, -205886, -411764, -617627, -823467, -1029276,
|
|
-1235045, -1440769, -1646438, -1852045, -2057582, -2263042, -2468417,
|
|
-2673699, -2878880, -3083953, -3288909, -3493742, -3698444, -3903006,
|
|
-4107421, -4311681, -4515779, -4719707, -4923458, -5127023, -5330395,
|
|
-5533566, -5736529, -5939276, -6141799, -6344092, -6546145, -6747952,
|
|
-6949505, -7150796, -7351818, -7552563, -7753024, -7953192, -8153062,
|
|
-8352624, -8551872, -8750798, -8949395, -9147655, -9345570, -9543133,
|
|
-9740337, -9937175, -10133638, -10329720, -10525413, -10720709, -10915602,
|
|
-11110084, -11304148, -11497786, -11690991, -11883756, -12076074, -12267936,
|
|
-12459338, -12650270, -12840725, -13030697, -13220179, -13409163, -13597642,
|
|
-13785609, -13973057, -14159979, -14346368, -14532217, -14717519, -14902266,
|
|
-15086453, -15270071, -15453115, -15635577, -15817450, -15998727, -16179403,
|
|
-16359469, -16538919, -16717746, -16895944, -17073506, -17250426, -17426695,
|
|
-17602309, -17777260, -17951541, -18125147, -18298070, -18470305, -18641844,
|
|
-18812681, -18982810, -19152224, -19320917, -19488882, -19656114, -19822606,
|
|
-19988352, -20153345, -20317579, -20481048, -20643747, -20805668, -20966805,
|
|
-21127153, -21286706, -21445458, -21603402, -21760532, -21916844, -22072330,
|
|
-22226985, -22380804, -22533779, -22685907, -22837180, -22987593, -23137141,
|
|
-23285818, -23433618, -23580536, -23726566, -23871703, -24015941, -24159275,
|
|
-24301699, -24443209, -24583798, -24723461, -24862194, -24999991, -25136846,
|
|
-25272755, -25407713, -25541714, -25674753, -25806826, -25937927, -26068051,
|
|
-26197194, -26325351, -26452517, -26578686, -26703855, -26828019, -26951172,
|
|
-27073311, -27194431, -27314527, -27433594, -27551629, -27668626, -27784581,
|
|
-27899491, -28013350, -28126154, -28237899, -28348582, -28458196, -28566740,
|
|
-28674208, -28780596, -28885901, -28990118, -29093244, -29195275, -29296206,
|
|
-29396034, -29494756, -29592367, -29688864, -29784243, -29878501, -29971634,
|
|
-30063639, -30154511, -30244249, -30332847, -30420304, -30506615, -30591778,
|
|
-30675789, -30758645, -30840343, -30920880, -31000253, -31078459, -31155494,
|
|
-31231357, -31306043, -31379551, -31451878, -31523021, -31592976, -31661743,
|
|
-31729317, -31795696, -31860879, -31924862, -31987643, -32049219, -32109589,
|
|
-32168751, -32226701, -32283437, -32338958, -32393262, -32446346, -32498209,
|
|
-32548848, -32598261, -32646447, -32693405, -32739131, -32783624, -32826884,
|
|
-32868907, -32909693, -32949240, -32987546, -33024611, -33060432, -33095008,
|
|
-33128338, -33160421, -33191256, -33220841, -33249175, -33276257, -33302087,
|
|
-33326663, -33349984, -33372049, -33392858, -33412410, -33430704, -33447739,
|
|
-33463515, -33478031, -33491286, -33503281, -33514014, -33523486, -33531695,
|
|
-33538642, -33544326, -33548747, -33551905, -33553800, -33554432, -33553800,
|
|
-33551905, -33548747, -33544326, -33538642, -33531695, -33523486, -33514014,
|
|
-33503281, -33491286, -33478031, -33463515, -33447739, -33430704, -33412410,
|
|
-33392858, -33372049, -33349984, -33326663, -33302087, -33276257, -33249175,
|
|
-33220841, -33191256, -33160421, -33128338, -33095008, -33060432, -33024611,
|
|
-32987546, -32949240, -32909693, -32868907, -32826884, -32783624, -32739131,
|
|
-32693405, -32646447, -32598261, -32548848, -32498209, -32446346, -32393262,
|
|
-32338958, -32283437, -32226701, -32168751, -32109589, -32049219, -31987643,
|
|
-31924862, -31860879, -31795696, -31729317, -31661743, -31592976, -31523021,
|
|
-31451878, -31379551, -31306043, -31231357, -31155494, -31078459, -31000253,
|
|
-30920880, -30840343, -30758645, -30675789, -30591778, -30506615, -30420304,
|
|
-30332847, -30244249, -30154511, -30063639, -29971634, -29878501, -29784243,
|
|
-29688864, -29592367, -29494756, -29396034, -29296206, -29195275, -29093244,
|
|
-28990118, -28885901, -28780596, -28674208, -28566740, -28458196, -28348582,
|
|
-28237899, -28126154, -28013350, -27899491, -27784581, -27668626, -27551629,
|
|
-27433594, -27314527, -27194431, -27073311, -26951172, -26828019, -26703855,
|
|
-26578686, -26452517, -26325351, -26197194, -26068051, -25937927, -25806826,
|
|
-25674753, -25541714, -25407713, -25272755, -25136846, -24999991, -24862194,
|
|
-24723461, -24583798, -24443209, -24301699, -24159275, -24015941, -23871703,
|
|
-23726566, -23580536, -23433618, -23285818, -23137141, -22987593, -22837180,
|
|
-22685907, -22533779, -22380804, -22226985, -22072330, -21916844, -21760532,
|
|
-21603402, -21445458, -21286706, -21127153, -20966805, -20805668, -20643747,
|
|
-20481048, -20317579, -20153345, -19988352, -19822606, -19656114, -19488882,
|
|
-19320917, -19152224, -18982810, -18812681, -18641844, -18470305, -18298070,
|
|
-18125147, -17951541, -17777260, -17602309, -17426695, -17250426, -17073506,
|
|
-16895944, -16717746, -16538919, -16359469, -16179403, -15998727, -15817450,
|
|
-15635577, -15453115, -15270071, -15086453, -14902266, -14717519, -14532217,
|
|
-14346368, -14159979, -13973057, -13785609, -13597642, -13409163, -13220179,
|
|
-13030697, -12840725, -12650270, -12459338, -12267936, -12076074, -11883756,
|
|
-11690991, -11497786, -11304148, -11110084, -10915602, -10720709, -10525413,
|
|
-10329720, -10133638, -9937175, -9740337, -9543133, -9345570, -9147655,
|
|
-8949395, -8750798, -8551872, -8352624, -8153062, -7953192, -7753024,
|
|
-7552563, -7351818, -7150796, -6949505, -6747952, -6546145, -6344092,
|
|
-6141799, -5939276, -5736529, -5533566, -5330395, -5127023, -4923458,
|
|
-4719707, -4515779, -4311681, -4107421, -3903006, -3698444, -3493742,
|
|
-3288909, -3083953, -2878880, -2673699, -2468417, -2263042, -2057582,
|
|
-1852045, -1646438, -1440769, -1235045, -1029276, -823467, -617627,
|
|
-411764, -205886
|
|
};
|
|
|
|
static const int32_t cos[1024] = {
|
|
33554432, 33553800, 33551905, 33548747, 33544326, 33538642, 33531695,
|
|
33523486, 33514014, 33503281, 33491286, 33478031, 33463515, 33447739,
|
|
33430704, 33412410, 33392858, 33372049, 33349984, 33326663, 33302087,
|
|
33276257, 33249175, 33220841, 33191256, 33160421, 33128338, 33095008,
|
|
33060432, 33024611, 32987546, 32949240, 32909693, 32868907, 32826884,
|
|
32783624, 32739131, 32693405, 32646447, 32598261, 32548848, 32498209,
|
|
32446346, 32393262, 32338958, 32283437, 32226701, 32168751, 32109589,
|
|
32049219, 31987643, 31924862, 31860879, 31795696, 31729317, 31661743,
|
|
31592976, 31523021, 31451878, 31379551, 31306043, 31231357, 31155494,
|
|
31078459, 31000253, 30920880, 30840343, 30758645, 30675789, 30591778,
|
|
30506615, 30420304, 30332847, 30244249, 30154511, 30063639, 29971634,
|
|
29878501, 29784243, 29688864, 29592367, 29494756, 29396034, 29296206,
|
|
29195275, 29093244, 28990118, 28885901, 28780596, 28674208, 28566740,
|
|
28458196, 28348582, 28237899, 28126154, 28013350, 27899491, 27784581,
|
|
27668626, 27551629, 27433594, 27314527, 27194431, 27073311, 26951172,
|
|
26828019, 26703855, 26578686, 26452517, 26325351, 26197194, 26068051,
|
|
25937927, 25806826, 25674753, 25541714, 25407713, 25272755, 25136846,
|
|
24999991, 24862194, 24723461, 24583798, 24443209, 24301699, 24159275,
|
|
24015941, 23871703, 23726566, 23580536, 23433618, 23285818, 23137141,
|
|
22987593, 22837180, 22685907, 22533779, 22380804, 22226985, 22072330,
|
|
21916844, 21760532, 21603402, 21445458, 21286706, 21127153, 20966805,
|
|
20805668, 20643747, 20481048, 20317579, 20153345, 19988352, 19822606,
|
|
19656114, 19488882, 19320917, 19152224, 18982810, 18812681, 18641844,
|
|
18470305, 18298070, 18125147, 17951541, 17777260, 17602309, 17426695,
|
|
17250426, 17073506, 16895944, 16717746, 16538919, 16359469, 16179403,
|
|
15998727, 15817450, 15635577, 15453115, 15270071, 15086453, 14902266,
|
|
14717519, 14532217, 14346368, 14159979, 13973057, 13785609, 13597642,
|
|
13409163, 13220179, 13030697, 12840725, 12650270, 12459338, 12267936,
|
|
12076074, 11883756, 11690991, 11497786, 11304148, 11110084, 10915602,
|
|
10720709, 10525413, 10329720, 10133638, 9937175, 9740337, 9543133,
|
|
9345570, 9147655, 8949395, 8750798, 8551872, 8352624, 8153062,
|
|
7953192, 7753024, 7552563, 7351818, 7150796, 6949505, 6747952,
|
|
6546145, 6344092, 6141799, 5939276, 5736529, 5533566, 5330395,
|
|
5127023, 4923458, 4719707, 4515779, 4311681, 4107421, 3903006,
|
|
3698444, 3493742, 3288909, 3083953, 2878880, 2673699, 2468417,
|
|
2263042, 2057582, 1852045, 1646438, 1440769, 1235045, 1029276,
|
|
823467, 617627, 411764, 205886, 0, -205886, -411764,
|
|
-617627, -823467, -1029276, -1235045, -1440769, -1646438, -1852045,
|
|
-2057582, -2263042, -2468417, -2673699, -2878880, -3083953, -3288909,
|
|
-3493742, -3698444, -3903006, -4107421, -4311681, -4515779, -4719707,
|
|
-4923458, -5127023, -5330395, -5533566, -5736529, -5939276, -6141799,
|
|
-6344092, -6546145, -6747952, -6949505, -7150796, -7351818, -7552563,
|
|
-7753024, -7953192, -8153062, -8352624, -8551872, -8750798, -8949395,
|
|
-9147655, -9345570, -9543133, -9740337, -9937175, -10133638, -10329720,
|
|
-10525413, -10720709, -10915602, -11110084, -11304148, -11497786, -11690991,
|
|
-11883756, -12076074, -12267936, -12459338, -12650270, -12840725, -13030697,
|
|
-13220179, -13409163, -13597642, -13785609, -13973057, -14159979, -14346368,
|
|
-14532217, -14717519, -14902266, -15086453, -15270071, -15453115, -15635577,
|
|
-15817450, -15998727, -16179403, -16359469, -16538919, -16717746, -16895944,
|
|
-17073506, -17250426, -17426695, -17602309, -17777260, -17951541, -18125147,
|
|
-18298070, -18470305, -18641844, -18812681, -18982810, -19152224, -19320917,
|
|
-19488882, -19656114, -19822606, -19988352, -20153345, -20317579, -20481048,
|
|
-20643747, -20805668, -20966805, -21127153, -21286706, -21445458, -21603402,
|
|
-21760532, -21916844, -22072330, -22226985, -22380804, -22533779, -22685907,
|
|
-22837180, -22987593, -23137141, -23285818, -23433618, -23580536, -23726566,
|
|
-23871703, -24015941, -24159275, -24301699, -24443209, -24583798, -24723461,
|
|
-24862194, -24999991, -25136846, -25272755, -25407713, -25541714, -25674753,
|
|
-25806826, -25937927, -26068051, -26197194, -26325351, -26452517, -26578686,
|
|
-26703855, -26828019, -26951172, -27073311, -27194431, -27314527, -27433594,
|
|
-27551629, -27668626, -27784581, -27899491, -28013350, -28126154, -28237899,
|
|
-28348582, -28458196, -28566740, -28674208, -28780596, -28885901, -28990118,
|
|
-29093244, -29195275, -29296206, -29396034, -29494756, -29592367, -29688864,
|
|
-29784243, -29878501, -29971634, -30063639, -30154511, -30244249, -30332847,
|
|
-30420304, -30506615, -30591778, -30675789, -30758645, -30840343, -30920880,
|
|
-31000253, -31078459, -31155494, -31231357, -31306043, -31379551, -31451878,
|
|
-31523021, -31592976, -31661743, -31729317, -31795696, -31860879, -31924862,
|
|
-31987643, -32049219, -32109589, -32168751, -32226701, -32283437, -32338958,
|
|
-32393262, -32446346, -32498209, -32548848, -32598261, -32646447, -32693405,
|
|
-32739131, -32783624, -32826884, -32868907, -32909693, -32949240, -32987546,
|
|
-33024611, -33060432, -33095008, -33128338, -33160421, -33191256, -33220841,
|
|
-33249175, -33276257, -33302087, -33326663, -33349984, -33372049, -33392858,
|
|
-33412410, -33430704, -33447739, -33463515, -33478031, -33491286, -33503281,
|
|
-33514014, -33523486, -33531695, -33538642, -33544326, -33548747, -33551905,
|
|
-33553800, -33554432, -33553800, -33551905, -33548747, -33544326, -33538642,
|
|
-33531695, -33523486, -33514014, -33503281, -33491286, -33478031, -33463515,
|
|
-33447739, -33430704, -33412410, -33392858, -33372049, -33349984, -33326663,
|
|
-33302087, -33276257, -33249175, -33220841, -33191256, -33160421, -33128338,
|
|
-33095008, -33060432, -33024611, -32987546, -32949240, -32909693, -32868907,
|
|
-32826884, -32783624, -32739131, -32693405, -32646447, -32598261, -32548848,
|
|
-32498209, -32446346, -32393262, -32338958, -32283437, -32226701, -32168751,
|
|
-32109589, -32049219, -31987643, -31924862, -31860879, -31795696, -31729317,
|
|
-31661743, -31592976, -31523021, -31451878, -31379551, -31306043, -31231357,
|
|
-31155494, -31078459, -31000253, -30920880, -30840343, -30758645, -30675789,
|
|
-30591778, -30506615, -30420304, -30332847, -30244249, -30154511, -30063639,
|
|
-29971634, -29878501, -29784243, -29688864, -29592367, -29494756, -29396034,
|
|
-29296206, -29195275, -29093244, -28990118, -28885901, -28780596, -28674208,
|
|
-28566740, -28458196, -28348582, -28237899, -28126154, -28013350, -27899491,
|
|
-27784581, -27668626, -27551629, -27433594, -27314527, -27194431, -27073311,
|
|
-26951172, -26828019, -26703855, -26578686, -26452517, -26325351, -26197194,
|
|
-26068051, -25937927, -25806826, -25674753, -25541714, -25407713, -25272755,
|
|
-25136846, -24999991, -24862194, -24723461, -24583798, -24443209, -24301699,
|
|
-24159275, -24015941, -23871703, -23726566, -23580536, -23433618, -23285818,
|
|
-23137141, -22987593, -22837180, -22685907, -22533779, -22380804, -22226985,
|
|
-22072330, -21916844, -21760532, -21603402, -21445458, -21286706, -21127153,
|
|
-20966805, -20805668, -20643747, -20481048, -20317579, -20153345, -19988352,
|
|
-19822606, -19656114, -19488882, -19320917, -19152224, -18982810, -18812681,
|
|
-18641844, -18470305, -18298070, -18125147, -17951541, -17777260, -17602309,
|
|
-17426695, -17250426, -17073506, -16895944, -16717746, -16538919, -16359469,
|
|
-16179403, -15998727, -15817450, -15635577, -15453115, -15270071, -15086453,
|
|
-14902266, -14717519, -14532217, -14346368, -14159979, -13973057, -13785609,
|
|
-13597642, -13409163, -13220179, -13030697, -12840725, -12650270, -12459338,
|
|
-12267936, -12076074, -11883756, -11690991, -11497786, -11304148, -11110084,
|
|
-10915602, -10720709, -10525413, -10329720, -10133638, -9937175, -9740337,
|
|
-9543133, -9345570, -9147655, -8949395, -8750798, -8551872, -8352624,
|
|
-8153062, -7953192, -7753024, -7552563, -7351818, -7150796, -6949505,
|
|
-6747952, -6546145, -6344092, -6141799, -5939276, -5736529, -5533566,
|
|
-5330395, -5127023, -4923458, -4719707, -4515779, -4311681, -4107421,
|
|
-3903006, -3698444, -3493742, -3288909, -3083953, -2878880, -2673699,
|
|
-2468417, -2263042, -2057582, -1852045, -1646438, -1440769, -1235045,
|
|
-1029276, -823467, -617627, -411764, -205886, 0, 205886,
|
|
411764, 617627, 823467, 1029276, 1235045, 1440769, 1646438,
|
|
1852045, 2057582, 2263042, 2468417, 2673699, 2878880, 3083953,
|
|
3288909, 3493742, 3698444, 3903006, 4107421, 4311681, 4515779,
|
|
4719707, 4923458, 5127023, 5330395, 5533566, 5736529, 5939276,
|
|
6141799, 6344092, 6546145, 6747952, 6949505, 7150796, 7351818,
|
|
7552563, 7753024, 7953192, 8153062, 8352624, 8551872, 8750798,
|
|
8949395, 9147655, 9345570, 9543133, 9740337, 9937175, 10133638,
|
|
10329720, 10525413, 10720709, 10915602, 11110084, 11304148, 11497786,
|
|
11690991, 11883756, 12076074, 12267936, 12459338, 12650270, 12840725,
|
|
13030697, 13220179, 13409163, 13597642, 13785609, 13973057, 14159979,
|
|
14346368, 14532217, 14717519, 14902266, 15086453, 15270071, 15453115,
|
|
15635577, 15817450, 15998727, 16179403, 16359469, 16538919, 16717746,
|
|
16895944, 17073506, 17250426, 17426695, 17602309, 17777260, 17951541,
|
|
18125147, 18298070, 18470305, 18641844, 18812681, 18982810, 19152224,
|
|
19320917, 19488882, 19656114, 19822606, 19988352, 20153345, 20317579,
|
|
20481048, 20643747, 20805668, 20966805, 21127153, 21286706, 21445458,
|
|
21603402, 21760532, 21916844, 22072330, 22226985, 22380804, 22533779,
|
|
22685907, 22837180, 22987593, 23137141, 23285818, 23433618, 23580536,
|
|
23726566, 23871703, 24015941, 24159275, 24301699, 24443209, 24583798,
|
|
24723461, 24862194, 24999991, 25136846, 25272755, 25407713, 25541714,
|
|
25674753, 25806826, 25937927, 26068051, 26197194, 26325351, 26452517,
|
|
26578686, 26703855, 26828019, 26951172, 27073311, 27194431, 27314527,
|
|
27433594, 27551629, 27668626, 27784581, 27899491, 28013350, 28126154,
|
|
28237899, 28348582, 28458196, 28566740, 28674208, 28780596, 28885901,
|
|
28990118, 29093244, 29195275, 29296206, 29396034, 29494756, 29592367,
|
|
29688864, 29784243, 29878501, 29971634, 30063639, 30154511, 30244249,
|
|
30332847, 30420304, 30506615, 30591778, 30675789, 30758645, 30840343,
|
|
30920880, 31000253, 31078459, 31155494, 31231357, 31306043, 31379551,
|
|
31451878, 31523021, 31592976, 31661743, 31729317, 31795696, 31860879,
|
|
31924862, 31987643, 32049219, 32109589, 32168751, 32226701, 32283437,
|
|
32338958, 32393262, 32446346, 32498209, 32548848, 32598261, 32646447,
|
|
32693405, 32739131, 32783624, 32826884, 32868907, 32909693, 32949240,
|
|
32987546, 33024611, 33060432, 33095008, 33128338, 33160421, 33191256,
|
|
33220841, 33249175, 33276257, 33302087, 33326663, 33349984, 33372049,
|
|
33392858, 33412410, 33430704, 33447739, 33463515, 33478031, 33491286,
|
|
33503281, 33514014, 33523486, 33531695, 33538642, 33544326, 33548747,
|
|
33551905, 33553800
|
|
};
|
|
|
|
uint32_t stk6d2x_als_get_max_gain_ratio(uint8_t pd_mode, uint8_t data_type)
|
|
{
|
|
uint32_t value = STK6D2X_ALS_DGAIN_MULTI1024 * STK6D2X_ALS_AGAIN_MULTI4;
|
|
if (data_type == STK6D2X_TYPE_ALS0 && (pd_mode == STK6D2X_ALS0_AGC_PDMODE0 || pd_mode == STK6D2X_ALS0_AGC_PDMODE1))
|
|
{
|
|
value *= STK6D2X_ALS_PD_REDUCE_MULTI4;
|
|
}
|
|
|
|
if (data_type == STK6D2X_TYPE_ALS1 && pd_mode == STK6D2X_ALS0_AGC_PDMODE0)
|
|
{
|
|
value *= STK6D2X_ALS_PD_REDUCE_MULTI2;
|
|
}
|
|
|
|
if (data_type == STK6D2X_TYPE_ALS1 && pd_mode == STK6D2X_ALS0_AGC_PDMODE1)
|
|
{
|
|
value *= STK6D2X_ALS_PD_REDUCE_MULTI3;
|
|
}
|
|
|
|
if (data_type == STK6D2X_TYPE_ALS2 && pd_mode == STK6D2X_ALS0_AGC_PDMODE0)
|
|
{
|
|
value *= STK6D2X_ALS_PD_REDUCE_MULTI2;
|
|
}
|
|
|
|
if (data_type == STK6D2X_TYPE_ALS2 && pd_mode == STK6D2X_ALS0_AGC_PDMODE1)
|
|
{
|
|
value *= STK6D2X_ALS_PD_REDUCE_MULTI1;
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
static uint64_t SEC_sqrt(uint64_t x)
|
|
{
|
|
register uint64_t result, tmp;
|
|
|
|
result = 0;
|
|
tmp = (1LL << 62); // second-to-top bit set
|
|
while (tmp > x) {
|
|
tmp >>= 2;
|
|
}
|
|
while (tmp != 0) {
|
|
if (x >= (result + tmp)) {
|
|
x -= result + tmp;
|
|
result += 2 * tmp; // <-- faster than 2 * one
|
|
}
|
|
result >>= 1;
|
|
tmp >>= 2;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void get_magnitude(int64_t* data_r, int64_t* data_i, int32_t* buffer, int size)
|
|
// data : 30 bits
|
|
{ //data must be twice as long as size
|
|
int i;
|
|
|
|
for (i = 0; i < size; ++i) {
|
|
//sqrt(real^2 + imaginary^2)
|
|
uint64_t square = 0;
|
|
int64_t t_r = data_r[i];
|
|
int64_t t_i = data_i[i];
|
|
|
|
square = ((t_r * t_r) >> 1) + ((t_i * t_i) >> 1); // 60bit
|
|
buffer[i] = (int32_t)SEC_sqrt(square); // 30bit
|
|
}
|
|
}
|
|
|
|
// n is a power of 2
|
|
int _log2n(int n)
|
|
{
|
|
//int len = sizeof(int) * 8;
|
|
int len = 32, i;
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
if ((n & 1) == 1)
|
|
return i;
|
|
else
|
|
n >>= 1;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
// Utility function for reversing the bits
|
|
// of given index x
|
|
unsigned int sec_bitReverse(unsigned int x, int log2n)
|
|
{
|
|
int n = 0, i;
|
|
for (i = 0; i < log2n; i++)
|
|
{
|
|
n <<= 1;
|
|
n |= (x & 1);
|
|
x >>= 1;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
void _fft(int64_t* a_r, int64_t* a_i, int64_t* A_r, int64_t* A_i, int n)
|
|
{
|
|
int log2n = _log2n(n), s, k, j;
|
|
unsigned int i;
|
|
// bit reversal of the given array
|
|
for (i = 0; i < n; ++i) {
|
|
int rev = sec_bitReverse(i, log2n);
|
|
A_r[i] = a_r[rev]; // 28 (29 with sign)
|
|
A_i[i] = a_i[rev]; // 28 (29 with sign)
|
|
}
|
|
for (s = 1; s <= log2n; s++) {
|
|
int m = 1 << s;
|
|
int m_2 = m >> 1;
|
|
int64_t wm_r = (int64_t)cos[1024 >> s]; // wm_r = cos(2 pi / m) Q25
|
|
int64_t wm_i = -(int64_t)sin[1024 >> s]; // wm_i = -sin(2 pi / m) Q25
|
|
|
|
for (k = 0; k < n; k += m)
|
|
{
|
|
int64_t w_r = 1LL << 25; // Q25 (33554432)
|
|
int64_t w_i = 0; // Q25
|
|
|
|
for (j = 0; j < m_2; j++) {
|
|
int i1 = k + j;
|
|
int i2 = i1 + m_2;
|
|
int64_t t_r = w_r * A_r[i2] -
|
|
w_i * A_i[i2]; // 28+25+0~10=53~63 (64 with sign)
|
|
int64_t t_i = w_r * A_i[i2] +
|
|
w_i * A_r[i2]; // 28+25+0~10=53~63 (64 with sign)
|
|
int64_t u_r = A_r[i1]; // 37~47
|
|
int64_t u_i = A_i[i1]; // 37~47
|
|
int64_t w2_r = w_r * wm_r - w_i * wm_i; // Q25*Q25, 26+25=51
|
|
int64_t w2_i = w_r * wm_i + w_i * wm_r; // Q25*Q25
|
|
t_r >>= 25; // Q25
|
|
t_i >>= 25; // Q25
|
|
A_r[i1] = u_r + t_r; // 28+0~10 = 28~38
|
|
A_i[i1] = u_i + t_i;
|
|
A_r[i2] = u_r - t_r;
|
|
A_i[i2] = u_i - t_i;
|
|
w_r = w2_r >> 25; // Q25
|
|
w_i = w2_i >> 25; // Q25
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int64_t buf_r[SEC_FFT_SIZE] = { 0 };
|
|
int64_t buf_i[SEC_FFT_SIZE] = { 0 };
|
|
int64_t out_r[SEC_FFT_SIZE] = { 0 };
|
|
int64_t out_i[SEC_FFT_SIZE] = { 0 };
|
|
|
|
void FFT(int32_t* data, enum fft_size size)
|
|
// int32_t* data : 16bit fifo data
|
|
// enum fft_size : fft data size
|
|
{
|
|
static int log_cnt = 0;
|
|
int i, hamming_step = 2048 / size;
|
|
|
|
if (size > SEC_FFT_SIZE || (size & 0x7f) != 0) {
|
|
//FFT size : multiply of 128
|
|
//@TODO add return codes so we know it failed
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < size; i++) {
|
|
// if (!alps_data->saturation && data[i] >= '''saturation value(int)''') {
|
|
// ALS_err("DEBUG_FLICKER saturation\n");
|
|
// alps_data->saturation = true;
|
|
// }
|
|
|
|
buf_r[i] = ((int64_t)data[i] * (int64_t)hamming[i * hamming_step]) >> 4; // 16+16-4=28
|
|
|
|
if (log_cnt > 30) // print debug log
|
|
ALS_info("DEBUG_FLICKER data[%d] => %d buf[%d] => %lld\n", i,
|
|
data[i], i, buf_r[i]);
|
|
}
|
|
_fft(buf_r, buf_i, out_r, out_i, size); // output 38 (39 sign)
|
|
|
|
for (i = 0; i < SEC_FFT_SIZE; i++) {
|
|
out_r[i] >>= 8;
|
|
out_i[i] >>= 8;
|
|
}
|
|
get_magnitude(out_r, out_i, data, size);
|
|
|
|
if (log_cnt > 30)
|
|
log_cnt = 0;
|
|
else
|
|
log_cnt++;
|
|
}
|
|
|
|
void SEC_fft_entry(struct stk6d2x_data *alps_data)
|
|
{
|
|
stk6d2x_wrapper *stk_wrapper = container_of(alps_data, stk6d2x_wrapper, alps_data);
|
|
int i = 0;
|
|
static uint32_t clear_buffer[SEC_FFT_SIZE] = { 0 };
|
|
static uint32_t uv_buffer[SEC_FFT_SIZE] = { 0 };
|
|
static uint32_t ir_buffer[SEC_FFT_SIZE] = { 0 };
|
|
static uint32_t clear_gain_log[SEC_FFT_SIZE] = { 0 };
|
|
static uint32_t uv_gain_log[SEC_FFT_SIZE] = { 0 };
|
|
static uint32_t ir_gain_log[SEC_FFT_SIZE] = { 0 };
|
|
static bool is_clear_sat[SEC_FFT_SIZE] = { false };
|
|
static bool is_uv_sat[SEC_FFT_SIZE] = { false };
|
|
static bool is_ir_sat[SEC_FFT_SIZE] = { false };
|
|
static bool is_ext_clk[SEC_FFT_SIZE] = { false };
|
|
static uint32_t buf[SEC_FFT_SIZE] = { 0 };
|
|
static int log_cnt = 0;
|
|
uint64_t average_thd = 0;
|
|
uint64_t max_thd = 0;
|
|
long long int ratio_thd = 0;
|
|
uint32_t extclkCnt = 0;
|
|
|
|
uint32_t min_clear_gain_log = stk6d2x_als_get_max_gain_ratio(alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
|
|
uint32_t min_uv_gain_log = stk6d2x_als_get_max_gain_ratio(alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
|
|
uint32_t min_ir_gain_log = stk6d2x_als_get_max_gain_ratio(alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
|
|
|
|
uint32_t clear_average_fifo = 0;
|
|
|
|
uint32_t clear_average = 0;
|
|
uint32_t ir_average = 0;
|
|
uint32_t uv_average = 0;
|
|
int16_t clear_gain = 0;
|
|
int16_t ir_gain = 0;
|
|
int16_t uv_gain = 0;
|
|
|
|
uint resolution = DIV_ROUND_CLOSEST(1000000000, SAMPLING_TIME) / SEC_FFT_SIZE;
|
|
uint min_freq = 70 / resolution;
|
|
uint max_freq = 1000 / resolution;
|
|
int imax = min_freq;
|
|
|
|
uint16_t freq = 9999;
|
|
|
|
uint64_t ratio_DC_max = 0;
|
|
uint64_t ratio_max_avg = 0;
|
|
|
|
/*
|
|
***** read fifo *****
|
|
* ~~_buffer : raw fifo data(max 16bit!!!)
|
|
* ~~_gain_log : gain(log value)
|
|
* ex) gain 1 : 0
|
|
* ex) gain 2 : 1
|
|
* ex) gain 4 : 2
|
|
* ...
|
|
* ex) gain 256 : 8
|
|
* This is an example, you can use it at an appropriate value according to STK68210
|
|
*
|
|
*/
|
|
for (i = 0; i < SEC_FFT_SIZE; i++)
|
|
{
|
|
clear_buffer[i] = alps_data->fifo_info.fft_buf[i];
|
|
uv_buffer[i] = alps_data->fifo_info.fft_uv_buf[i];
|
|
ir_buffer[i] = alps_data->fifo_info.fft_ir_buf[i];
|
|
clear_gain_log[i] = alps_data->fifo_info.fft_gain_clear[i];
|
|
uv_gain_log[i] = alps_data->fifo_info.fft_gain_uv[i];
|
|
ir_gain_log[i] = alps_data->fifo_info.fft_gain_ir[i];
|
|
is_clear_sat[i] = (alps_data->fifo_info.fft_xflag[i] & 0x1)? true : false; //CL staturation flag
|
|
is_uv_sat[i] = (alps_data->fifo_info.fft_xflag[i] & 0x2)? true : false; //UV staturation flag
|
|
is_ir_sat[i] = (alps_data->fifo_info.fft_xflag[i] & 0x4)? true : false; //IR staturation flag
|
|
is_ext_clk[i] = (alps_data->fifo_info.fft_xflag[i] & 0x80)? true : false; //External clock flag
|
|
if (is_ext_clk[i])
|
|
extclkCnt++;
|
|
}
|
|
|
|
ALS_info("DEBUG_FLICKER extclk count:%d, intclk count:%d", extclkCnt, SEC_FFT_SIZE - extclkCnt);
|
|
|
|
// find minimum gain ratio
|
|
for (i = 0; i < SEC_FFT_SIZE; i++)
|
|
{
|
|
if (clear_gain_log[i] < min_clear_gain_log)
|
|
min_clear_gain_log = clear_gain_log[i];
|
|
|
|
if (uv_gain_log[i] < min_uv_gain_log)
|
|
min_uv_gain_log = uv_gain_log[i];
|
|
|
|
if (ir_gain_log[i] < min_ir_gain_log)
|
|
min_ir_gain_log = ir_gain_log[i];
|
|
}
|
|
|
|
// gain unification
|
|
for (i = 0; i < SEC_FFT_SIZE; i++)
|
|
{
|
|
clear_average_fifo += clear_buffer[i];
|
|
clear_buffer[i] = clear_buffer[i] >> (clear_gain_log[i] - min_clear_gain_log);
|
|
ir_buffer[i] = ir_buffer[i] >> (ir_gain_log[i] - min_ir_gain_log );
|
|
uv_buffer[i] = uv_buffer[i] >> (uv_gain_log[i] - min_uv_gain_log );
|
|
buf[i] = clear_buffer[i]; // for FFT, max 16bit
|
|
|
|
clear_average += clear_buffer[i]; // 16+11=27
|
|
ir_average += ir_buffer[i];
|
|
uv_average += uv_buffer[i];
|
|
}
|
|
|
|
// cal average
|
|
clear_average_fifo = clear_average_fifo / SEC_FFT_SIZE;
|
|
clear_average = clear_average / SEC_FFT_SIZE;
|
|
ir_average = ir_average / SEC_FFT_SIZE;
|
|
uv_average = uv_average / SEC_FFT_SIZE;
|
|
|
|
clear_average = (clear_average << FLICKER_AVG_SHIFT) >> min_clear_gain_log; // 16+14=30 -...
|
|
ir_average = (ir_average << FLICKER_AVG_SHIFT) >> min_ir_gain_log; // 16+14=30 -...
|
|
uv_average = (uv_average << FLICKER_AVG_SHIFT) >> min_uv_gain_log; // 16+14=30 -...
|
|
|
|
clear_gain = 1<<(min_clear_gain_log);
|
|
ir_gain = 1<<(min_clear_gain_log);
|
|
uv_gain = 1<<(min_clear_gain_log);
|
|
|
|
// do fft
|
|
FFT(buf, SEC_FFT_SIZE);
|
|
|
|
// get peak index
|
|
for (i = min_freq; i <= max_freq; ++i) { // 70~1000
|
|
// ALS_err("ccb_sw_bin4096_flicker_GetResult: buf[%d]=%10u\n", i, buf[i]);
|
|
if (buf[i] > buf[imax]) {
|
|
imax = i;
|
|
}
|
|
average_thd += buf[i]; // 29+10=39
|
|
}
|
|
average_thd /= (max_freq - min_freq + 1); // 29
|
|
max_thd = buf[imax]; // 29
|
|
ratio_thd = (uint32_t)((average_thd << 10) / max_thd); // 0+10-0, 0+10-29, 29+10-29
|
|
|
|
ratio_DC_max = buf[0] / max_thd;
|
|
ratio_max_avg = max_thd / average_thd;
|
|
|
|
ALS_info("DEBUG_FLICKER DECISION_THD buf[%d]=%u, avg=%llu, max=%llu, DC=%u, DC/max=%llu, max/avg=%llu", imax, buf[imax], average_thd, max_thd, buf[0], ratio_DC_max, ratio_max_avg);
|
|
|
|
// get valid threshold
|
|
// thd = calc_thd(clear_average_fifo, clear_average, buf);
|
|
ALS_info("DEBUG_FLICKER DC:%u\n", buf[0]);
|
|
//ALS_info("DEBUG_FLICKER buf[%d]=%u, thd %lld", imax, buf[imax], thd);
|
|
ALS_info("DEBUG_FLICKER buf[%d]=%u, avg/maxthd %lld\n", imax, buf[imax], ratio_thd);
|
|
|
|
// valid peak check
|
|
if (ratio_thd < FLICKER_AVGMAX_THD)
|
|
{
|
|
freq = imax * resolution;
|
|
ALS_info("flicker_freq %d\n", freq);
|
|
}
|
|
else {
|
|
freq = 0;
|
|
ALS_info("flicker_freq is zero\n");
|
|
}
|
|
/*
|
|
if (buf[imax] > thd) {
|
|
freq = imax * resolution;
|
|
ALS_info("flicker_freq %d", freq);
|
|
}
|
|
else {
|
|
freq = 0;
|
|
ALS_info("flicker_freq is zero");
|
|
} */
|
|
|
|
if (log_cnt++ > 10) {
|
|
ALS_dbg("flicker_freq : %d", freq);
|
|
log_cnt = 0;
|
|
} else {
|
|
ALS_info("flicker_freq : %d", freq);
|
|
}
|
|
|
|
alps_data->flicker = freq;
|
|
|
|
input_report_rel(stk_wrapper->als_input_dev, REL_RZ, alps_data->flicker + 1);
|
|
input_sync(stk_wrapper->als_input_dev);
|
|
|
|
#if IS_ENABLED(CONFIG_SENSORS_FLICKER_SELF_TEST)
|
|
als_eol_update_flicker(alps_data->flicker);
|
|
#endif
|
|
/*
|
|
return values (average, flicker... )
|
|
*/
|
|
}
|
|
#endif
|
|
|
|
void stk6d2x_fifo_init(struct stk6d2x_data * alps_data)
|
|
{
|
|
int32_t err;
|
|
uint8_t flag_value;
|
|
err = STK6D2X_REG_READ(alps_data, STK6D2X_REG_FIFO1, &flag_value);
|
|
|
|
if (err < 0)
|
|
{
|
|
ALS_err("Read flag failed\n");
|
|
return;
|
|
}
|
|
|
|
alps_data->fifo_info.data_type = (flag_value & STK6D2X_FIFO_SEL_MASK);
|
|
ALS_info("data_type = %d\n", alps_data->fifo_info.data_type);
|
|
|
|
switch (alps_data->fifo_info.data_type)
|
|
{
|
|
case STK6D2X_FIFO_ALS0:
|
|
case STK6D2X_FIFO_ALS1:
|
|
case STK6D2X_FIFO_ALS2:
|
|
alps_data->fifo_info.frame_byte = 2;
|
|
break;
|
|
|
|
case STK6D2X_FIFO_ALS0_ALS1:
|
|
case STK6D2X_FIFO_ALS0_ALS2:
|
|
case STK6D2X_FIFO_ALS1_ALS2:
|
|
alps_data->fifo_info.frame_byte = 4;
|
|
break;
|
|
|
|
case STK6D2X_FIFO_ALS0_ALS1_ALS2:
|
|
alps_data->fifo_info.frame_byte = 6;
|
|
break;
|
|
|
|
case STK6D2X_FIFO_STA0_ALS0:
|
|
case STK6D2X_FIFO_STA1_ALS1:
|
|
case STK6D2X_FIFO_STA2_ALS2:
|
|
alps_data->fifo_info.frame_byte = 4;
|
|
break;
|
|
|
|
case STK6D2X_FIFO_STA01_ALS0_ALS1:
|
|
case STK6D2X_FIFO_STA02_ALS0_ALS2:
|
|
case STK6D2X_FIFO_STA12_ALS1_ALS2:
|
|
alps_data->fifo_info.frame_byte = 6;
|
|
break;
|
|
|
|
case STK6D2X_FIFO_STA01_STA2_ALS0_ALS1_ALS2:
|
|
alps_data->fifo_info.frame_byte = 10;
|
|
break;
|
|
|
|
default:
|
|
alps_data->fifo_info.frame_byte = 0xFF;
|
|
ALS_err("Frame Type ERROR!\n");
|
|
break;
|
|
}
|
|
|
|
alps_data->fifo_info.read_frame = STK_FIFO_I2C_READ_FRAME;
|
|
alps_data->fifo_info.target_frame_count = STK_FIFO_I2C_READ_FRAME_TARGET;
|
|
alps_data->fifo_info.read_max_data_byte = alps_data->fifo_info.frame_byte * STK_FIFO_I2C_READ_FRAME;
|
|
alps_data->fifo_info.fifo_reading = false;
|
|
alps_data->fifo_info.block_size = STK_FIFO_I2C_READ_FRAME_TARGET;
|
|
alps_data->fifo_info.fft_buf_idx = 0;
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
alps_data->fifo_info.pre_ext_clk_chk = false;
|
|
}
|
|
|
|
int32_t stk6d2x_enable_fifo(struct stk6d2x_data * alps_data, bool en)
|
|
{
|
|
int32_t ret = 0;
|
|
uint8_t fifo_status, i2c_data_reg[2] = {0};
|
|
uint16_t max_frame_count = STK_FIFO_DATA_BUFFER_LEN / alps_data->fifo_info.frame_byte;
|
|
|
|
if (alps_data->fifo_info.fifo_enable == en)
|
|
{
|
|
ALS_err("FIFO already set\n");
|
|
return ret;
|
|
}
|
|
|
|
ret = STK6D2X_REG_READ(alps_data, STK6D2X_REG_FIFO1, &fifo_status);
|
|
|
|
if (ret < 0)
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
if (en)
|
|
{
|
|
fifo_status = (STK6D2X_FIFO_MODE_NORMAL | fifo_status);
|
|
i2c_data_reg[0] = (max_frame_count >> 8) & 0x03;
|
|
i2c_data_reg[1] = max_frame_count & 0xFF;
|
|
alps_data->fifo_info.fft_buf_idx = 0;
|
|
alps_data->index_last = 0;
|
|
}
|
|
else
|
|
{
|
|
fifo_status = (fifo_status & (~STK6D2X_FIFO_MODE_NORMAL));
|
|
}
|
|
|
|
ret = STK6D2X_REG_WRITE_BLOCK(alps_data,
|
|
STK6D2X_REG_FIFO1_WM_LV,
|
|
i2c_data_reg,
|
|
sizeof(i2c_data_reg) / sizeof(i2c_data_reg[0]));
|
|
|
|
if (ret < 0)
|
|
{
|
|
ALS_err("fail, ret=%d\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = STK6D2X_REG_READ_MODIFY_WRITE(alps_data,
|
|
STK6D2X_REG_FIFO1,
|
|
fifo_status,
|
|
0xFF);
|
|
|
|
if (ret < 0)
|
|
{
|
|
ALS_err("fail, ret=%d\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
alps_data->fifo_info.fifo_enable = en;
|
|
return ret;
|
|
}
|
|
|
|
void SEC_local_average(struct stk6d2x_data* alps_data)
|
|
{
|
|
uint64_t clear_local_average = 0;
|
|
uint64_t uv_local_average = 0;
|
|
uint64_t ir_local_average = 0;
|
|
|
|
bool is_clear_local_sat = false;
|
|
bool is_uv_local_sat = false;
|
|
bool is_ir_local_sat = false;
|
|
int i = 0;
|
|
int n = 0;
|
|
|
|
uint32_t min_clear_local_gain_log = alps_data->fifo_info.fft_gain_clear[alps_data->index_last];
|
|
uint32_t min_uv_local_gain_log = alps_data->fifo_info.fft_gain_uv[alps_data->index_last];
|
|
uint32_t min_ir_local_gain_log = alps_data->fifo_info.fft_gain_ir[alps_data->index_last];
|
|
|
|
int local_length = 0;
|
|
int index_last_temp = 0;
|
|
|
|
if (alps_data->is_first)
|
|
{
|
|
n = (int)(alps_data->fifo_info.fft_buf_idx) - 1;
|
|
if (n > -1)
|
|
{
|
|
clear_local_average += (alps_data->fifo_info.fft_buf[n]) >> ((alps_data->fifo_info.fft_gain_clear[n]) - (alps_data->fifo_info.fft_gain_clear[n]));
|
|
uv_local_average += (alps_data->fifo_info.fft_uv_buf[n]) >> ((alps_data->fifo_info.fft_gain_uv[n]) - (alps_data->fifo_info.fft_gain_uv[n]));
|
|
ir_local_average += (alps_data->fifo_info.fft_ir_buf[n]) >> ((alps_data->fifo_info.fft_gain_ir[n]) - (alps_data->fifo_info.fft_gain_ir[n]));
|
|
if (alps_data->fifo_info.fft_xflag[n] & 0x1)
|
|
is_clear_local_sat = true;
|
|
if (alps_data->fifo_info.fft_xflag[n] & 0x2)
|
|
is_uv_local_sat = true;
|
|
if (alps_data->fifo_info.fft_xflag[n] & 0x4)
|
|
is_ir_local_sat = true;
|
|
alps_data->is_first = false;
|
|
}
|
|
else
|
|
{
|
|
return; // no data
|
|
}
|
|
}
|
|
|
|
|
|
if ((alps_data->fifo_info.fft_buf_idx < alps_data->index_last + SEC_LOCAL_AVG_SIZE))
|
|
{
|
|
if (alps_data->fifo_info.fft_buf_idx == 0 && alps_data->index_last > 0)
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
return; // not yet
|
|
}
|
|
}
|
|
|
|
local_length = SEC_LOCAL_AVG_SIZE;
|
|
index_last_temp = alps_data->index_last + SEC_LOCAL_AVG_SIZE;
|
|
if (index_last_temp > SEC_FFT_SIZE)
|
|
{
|
|
index_last_temp = SEC_FFT_SIZE;
|
|
local_length = index_last_temp - alps_data->index_last;
|
|
}
|
|
|
|
// find minimum gain ratio, check saturation
|
|
for (i = alps_data->index_last; i < index_last_temp; i++)
|
|
{
|
|
if (alps_data->fifo_info.fft_gain_clear[i] < min_clear_local_gain_log)
|
|
min_clear_local_gain_log = alps_data->fifo_info.fft_gain_clear[i];
|
|
if (alps_data->fifo_info.fft_gain_uv[i] < min_uv_local_gain_log)
|
|
min_uv_local_gain_log = alps_data->fifo_info.fft_gain_uv[i];
|
|
if (alps_data->fifo_info.fft_gain_ir[i] < min_ir_local_gain_log)
|
|
min_ir_local_gain_log = alps_data->fifo_info.fft_gain_ir[i];
|
|
if (alps_data->fifo_info.fft_xflag[i] & 0x1)
|
|
is_clear_local_sat = true;
|
|
if (alps_data->fifo_info.fft_xflag[i] & 0x2)
|
|
is_uv_local_sat = true;
|
|
if (alps_data->fifo_info.fft_xflag[i] & 0x4)
|
|
is_ir_local_sat = true;
|
|
}
|
|
|
|
// gain unification
|
|
for (i = alps_data->index_last; i < index_last_temp; i++)
|
|
{
|
|
clear_local_average += (alps_data->fifo_info.fft_buf[i]) >> ((alps_data->fifo_info.fft_gain_clear[i]) - min_clear_local_gain_log);
|
|
uv_local_average += (alps_data->fifo_info.fft_uv_buf[i]) >> ((alps_data->fifo_info.fft_gain_uv[i]) - min_uv_local_gain_log);
|
|
ir_local_average += (alps_data->fifo_info.fft_ir_buf[i]) >> ((alps_data->fifo_info.fft_gain_ir[i]) - min_ir_local_gain_log);
|
|
}
|
|
|
|
// cal average
|
|
|
|
clear_local_average /= local_length; // 16
|
|
uv_local_average /= local_length;
|
|
ir_local_average /= local_length;
|
|
|
|
|
|
clear_local_average = (clear_local_average << FLICKER_AVG_SHIFT) >> min_clear_local_gain_log; // 16+14=30 -...
|
|
uv_local_average = (uv_local_average << FLICKER_AVG_SHIFT) >> min_uv_local_gain_log; // 16+14=30 -...
|
|
ir_local_average = (ir_local_average << FLICKER_AVG_SHIFT) >> min_ir_local_gain_log; // 16+14=30 -...
|
|
|
|
alps_data->clear_gain = 1<<(min_clear_local_gain_log);
|
|
alps_data->ir_gain = 1<<(min_ir_local_gain_log);
|
|
alps_data->uv_gain = 1<<(min_uv_local_gain_log);
|
|
|
|
alps_data->clear_local_average = clear_local_average;
|
|
alps_data->uv_local_average = uv_local_average;
|
|
alps_data->ir_local_average = ir_local_average;
|
|
|
|
alps_data->is_clear_local_sat = is_clear_local_sat;
|
|
alps_data->is_uv_local_sat = is_uv_local_sat;
|
|
alps_data->is_ir_local_sat = is_ir_local_sat;
|
|
ALS_info("clear_local_average:%llu is_clear_local_sat:%d | uv_local_average:%llu is_uv_local_sat:%d | ir_local_average:%llu is_ir_local_sat:%d\n",
|
|
clear_local_average, is_clear_local_sat, uv_local_average, is_uv_local_sat, ir_local_average, is_ir_local_sat);
|
|
|
|
alps_data->index_last = index_last_temp;
|
|
if (alps_data->index_last >= SEC_FFT_SIZE)
|
|
alps_data->index_last = 0;
|
|
|
|
alps_data->is_local_avg_update = true;
|
|
}
|
|
|
|
void stk6d2x_fifo_get_data(struct stk6d2x_data * alps_data, uint16_t frame_num)
|
|
{
|
|
uint16_t offset;
|
|
uint8_t raw_data[STK_FIFO_I2C_READ_FRAME_BUF_SIZE]; // alps_data->fifo_info.read_max_data_byte * sizeof(uint8_t)
|
|
int16_t i, frame_count = 0, read_frame_num = 0;
|
|
int32_t ret, read_bytes;
|
|
#ifdef STK_FIFO_DATA_SUMMATION
|
|
uint64_t als0_sum = 0, als1_sum = 0, als2_sum = 0;
|
|
#endif
|
|
|
|
#ifdef STK_CHK_XFLG
|
|
alps_data->xflag = 0;
|
|
if (alps_data->rid != 1)
|
|
{
|
|
ret = STK6D2X_REG_READ(alps_data, STK6D2X_REG_XFLAG, &alps_data->xflag);
|
|
|
|
if (ret < 0)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
memset(alps_data->fifo_info.fifo_data0, 0, STK_FIFO_I2C_READ_FRAME_TARGET * sizeof(uint32_t));
|
|
memset(alps_data->fifo_info.fifo_data1, 0, STK_FIFO_I2C_READ_FRAME_TARGET * sizeof(uint32_t));
|
|
memset(alps_data->fifo_info.fifo_data2, 0, STK_FIFO_I2C_READ_FRAME_TARGET * sizeof(uint32_t));
|
|
memset(alps_data->fifo_info.fifo_xflag, 0, STK_FIFO_I2C_READ_FRAME_TARGET * sizeof(uint8_t));
|
|
|
|
#ifdef STK_FIFO_DATA_SUMMATION
|
|
if (alps_data->fifo_info.fifo_sum_cnt >= STK6D2X_ALS_SUMMATION_CNT)
|
|
{
|
|
alps_data->fifo_info.fifo_sum_cnt = 0;
|
|
}
|
|
#endif
|
|
|
|
for (frame_count = 0 ; frame_count < frame_num ; frame_count += (alps_data->fifo_info.read_frame))
|
|
{
|
|
read_frame_num = (int16_t)(frame_num - frame_count);
|
|
|
|
if (read_frame_num >= alps_data->fifo_info.read_frame)
|
|
{
|
|
read_bytes = alps_data->fifo_info.read_max_data_byte;
|
|
read_frame_num = alps_data->fifo_info.read_frame;
|
|
}
|
|
else
|
|
{
|
|
read_bytes = alps_data->fifo_info.frame_byte * read_frame_num;
|
|
}
|
|
|
|
memset(raw_data, 0, sizeof(raw_data));
|
|
ret = STK6D2X_REG_BLOCK_READ(alps_data, STK6D2X_REG_FIFO_OUT, read_bytes, raw_data);
|
|
|
|
if (ret < 0)
|
|
{
|
|
ALS_err("fail, err=0x%x\n", ret);
|
|
return;
|
|
}
|
|
|
|
|
|
switch (alps_data->fifo_info.data_type)
|
|
{
|
|
case STK6D2X_FIFO_ALS0:
|
|
case STK6D2X_FIFO_ALS1:
|
|
case STK6D2X_FIFO_ALS2:
|
|
for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
|
|
{
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset) << 8 | *(raw_data + offset + 1));
|
|
}
|
|
|
|
break;
|
|
|
|
case STK6D2X_FIFO_ALS0_ALS1:
|
|
case STK6D2X_FIFO_ALS0_ALS2:
|
|
case STK6D2X_FIFO_ALS1_ALS2:
|
|
for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
|
|
{
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset) << 8 | *(raw_data + offset + 1));
|
|
*(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
|
|
}
|
|
break;
|
|
|
|
case STK6D2X_FIFO_ALS0_ALS1_ALS2:
|
|
for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
|
|
{
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset) << 8 | *(raw_data + offset + 1));
|
|
*(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
|
|
*(alps_data->fifo_info.fifo_data2 + frame_count + i) = (*(raw_data + offset + 4) << 8 | *(raw_data + offset + 5));
|
|
}
|
|
break;
|
|
|
|
#ifdef STK_ALS_AGC
|
|
case STK6D2X_FIFO_STA0_ALS0:
|
|
for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
|
|
{
|
|
if (alps_data->rid == 1)
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset + 1) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
}
|
|
#endif
|
|
#ifdef STK_CHK_XFLG
|
|
if ((*(raw_data + offset) & 0x80))
|
|
{
|
|
alps_data->xflag |= 0x1;
|
|
}
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
}
|
|
#endif
|
|
}
|
|
alps_data->als_info.als_cur_dgain[0] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
|
|
alps_data->als_info.als_cur_again[0] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[0] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
|
|
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
|
|
stk6d2x_get_als_ratio(alps_data);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[0];
|
|
#ifdef STK_FIFO_DATA_SUMMATION
|
|
if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
|
|
{
|
|
als0_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
|
|
alps_data->fifo_info.fifo_sum_cnt ++;
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
case STK6D2X_FIFO_STA1_ALS1:
|
|
for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
|
|
{
|
|
if (alps_data->rid == 1)
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset + 1) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
}
|
|
#endif
|
|
#ifdef STK_CHK_XFLG
|
|
if ((*(raw_data + offset) & 0x80))
|
|
{
|
|
alps_data->xflag |= 0x1;
|
|
}
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
}
|
|
#endif
|
|
}
|
|
alps_data->als_info.als_cur_dgain[1] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
|
|
alps_data->als_info.als_cur_again[1] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[1] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
|
|
stk6d2x_get_als_ratio(alps_data);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[1];
|
|
#ifdef STK_FIFO_DATA_SUMMATION
|
|
if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
|
|
{
|
|
als1_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
|
|
alps_data->fifo_info.fifo_sum_cnt ++;
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
case STK6D2X_FIFO_STA2_ALS2:
|
|
for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
|
|
{
|
|
if (alps_data->rid == 1)
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset + 1) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
}
|
|
#endif
|
|
#ifdef STK_CHK_XFLG
|
|
if ((*(raw_data + offset) & 0x80))
|
|
{
|
|
alps_data->xflag |= 0x1;
|
|
}
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
}
|
|
#endif
|
|
}
|
|
alps_data->als_info.als_cur_dgain[2] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
|
|
alps_data->als_info.als_cur_again[2] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[2] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
|
|
stk6d2x_get_als_ratio(alps_data);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[2];
|
|
#ifdef STK_FIFO_DATA_SUMMATION
|
|
if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
|
|
{
|
|
als2_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
|
|
alps_data->fifo_info.fifo_sum_cnt ++;
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
case STK6D2X_FIFO_STA01_ALS0_ALS1:
|
|
for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
}
|
|
#endif
|
|
alps_data->als_info.als_cur_dgain[0] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
|
|
alps_data->als_info.als_cur_again[0] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[0] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
|
|
alps_data->als_info.als_cur_dgain[1] = stk6d2x_cal_curDGain(*(raw_data + offset + 1) & 0x7);
|
|
alps_data->als_info.als_cur_again[1] = stk6d2x_als_get_again_multiple((*(raw_data + offset + 1) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[1] = stk6d2x_als_get_pd_multiple((*(raw_data + offset + 1) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
|
|
*(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 4) << 8 | *(raw_data + offset + 5));
|
|
stk6d2x_get_als_ratio(alps_data);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[0];
|
|
*(alps_data->fifo_info.fifo_data1 + frame_count + i) *= alps_data->als_info.als_cur_ratio[1];
|
|
#ifdef STK_FIFO_DATA_SUMMATION
|
|
if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
|
|
{
|
|
als0_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
|
|
als1_sum += *(alps_data->fifo_info.fifo_data1 + frame_count + i);
|
|
alps_data->fifo_info.fifo_sum_cnt ++;
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
case STK6D2X_FIFO_STA02_ALS0_ALS2:
|
|
for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
}
|
|
#endif
|
|
alps_data->als_info.als_cur_dgain[0] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
|
|
alps_data->als_info.als_cur_again[0] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[0] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
|
|
alps_data->als_info.als_cur_dgain[2] = stk6d2x_cal_curDGain(*(raw_data + offset + 1) & 0x7);
|
|
alps_data->als_info.als_cur_again[2] = stk6d2x_als_get_again_multiple((*(raw_data + offset + 1) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[2] = stk6d2x_als_get_pd_multiple((*(raw_data + offset + 1) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
|
|
*(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 4) << 8 | *(raw_data + offset + 5));
|
|
stk6d2x_get_als_ratio(alps_data);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[0];
|
|
*(alps_data->fifo_info.fifo_data1 + frame_count + i) *= alps_data->als_info.als_cur_ratio[2];
|
|
#ifdef STK_FIFO_DATA_SUMMATION
|
|
if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
|
|
{
|
|
als0_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
|
|
als2_sum += *(alps_data->fifo_info.fifo_data1 + frame_count + i);
|
|
alps_data->fifo_info.fifo_sum_cnt ++;
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
case STK6D2X_FIFO_STA12_ALS1_ALS2:
|
|
for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
}
|
|
#endif
|
|
alps_data->als_info.als_cur_dgain[1] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
|
|
alps_data->als_info.als_cur_again[1] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[1] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
|
|
alps_data->als_info.als_cur_dgain[2] = stk6d2x_cal_curDGain(*(raw_data + offset + 1) & 0x7);
|
|
alps_data->als_info.als_cur_again[2] = stk6d2x_als_get_again_multiple((*(raw_data + offset + 1) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[2] = stk6d2x_als_get_pd_multiple((*(raw_data + offset + 1) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
|
|
*(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 4) << 8 | *(raw_data + offset + 5));
|
|
stk6d2x_get_als_ratio(alps_data);
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[1];
|
|
*(alps_data->fifo_info.fifo_data1 + frame_count + i) *= alps_data->als_info.als_cur_ratio[2];
|
|
#ifdef STK_FIFO_DATA_SUMMATION
|
|
if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
|
|
{
|
|
als1_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
|
|
als2_sum += *(alps_data->fifo_info.fifo_data1 + frame_count + i);
|
|
alps_data->fifo_info.fifo_sum_cnt ++;
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
case STK6D2X_FIFO_STA01_STA2_ALS0_ALS1_ALS2:
|
|
for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
|
|
{
|
|
if (alps_data->rid == 1)
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset + 3) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
#ifdef SEC_FFT_FLICKER_1024
|
|
*(alps_data->fifo_info.fifo_xflag + frame_count + i) |= (1 << 7); //bit7 is cfalg
|
|
#endif
|
|
}
|
|
#endif
|
|
#ifdef STK_CHK_XFLG
|
|
if ((*(raw_data + offset) & 0x80))
|
|
{
|
|
alps_data->xflag |= 0x1;
|
|
#ifdef SEC_FFT_FLICKER_1024
|
|
*(alps_data->fifo_info.fifo_xflag + frame_count + i) |= 0x1; //bit0 is xfalg for C
|
|
#endif
|
|
}
|
|
if ((*(raw_data + offset + 1) & 0x80))
|
|
{
|
|
alps_data->xflag |= 0x2;
|
|
#ifdef SEC_FFT_FLICKER_1024
|
|
*(alps_data->fifo_info.fifo_xflag + frame_count + i) |= 0x2; //bit1 is xfalg for UV
|
|
#endif
|
|
}
|
|
if ((*(raw_data + offset + 2) & 0x80))
|
|
{
|
|
alps_data->xflag |= 0x4;
|
|
#ifdef SEC_FFT_FLICKER_1024
|
|
*(alps_data->fifo_info.fifo_xflag + frame_count + i) |= 0x4; //bit2 is xfalg for IR
|
|
#endif
|
|
}
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if ((*(raw_data + offset) & 0x80) == 0)
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = false;
|
|
}
|
|
else
|
|
{
|
|
alps_data->fifo_info.ext_clk_chk = true;
|
|
#ifdef SEC_FFT_FLICKER_1024
|
|
*(alps_data->fifo_info.fifo_xflag + frame_count + i) |= (1 << 7); //bit7 is cfalg
|
|
#endif
|
|
|
|
}
|
|
#endif
|
|
}
|
|
alps_data->als_info.als_cur_dgain[0] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
|
|
alps_data->als_info.als_cur_again[0] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[0] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
|
|
alps_data->als_info.als_cur_dgain[1] = stk6d2x_cal_curDGain(*(raw_data + offset + 1) & 0x7);
|
|
alps_data->als_info.als_cur_again[1] = stk6d2x_als_get_again_multiple((*(raw_data + offset + 1) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[1] = stk6d2x_als_get_pd_multiple((*(raw_data + offset + 1) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
|
|
alps_data->als_info.als_cur_dgain[2] = stk6d2x_cal_curDGain(*(raw_data + offset + 2) & 0x7);
|
|
alps_data->als_info.als_cur_again[2] = stk6d2x_als_get_again_multiple((*(raw_data + offset + 2) & 0x18) >> 3);
|
|
alps_data->als_info.als_cur_pd_reduce[2] = stk6d2x_als_get_pd_multiple((*(raw_data + offset + 2) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
|
|
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 4) << 8 | *(raw_data + offset + 5));
|
|
*(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 6) << 8 | *(raw_data + offset + 7));
|
|
*(alps_data->fifo_info.fifo_data2 + frame_count + i) = (*(raw_data + offset + 8) << 8 | *(raw_data + offset + 9));
|
|
stk6d2x_get_als_ratio(alps_data);
|
|
#ifdef SEC_FFT_FLICKER_1024
|
|
*(alps_data->fifo_info.fifo_data_clear + frame_count + i) = *(alps_data->fifo_info.fifo_data0 + frame_count + i);
|
|
*(alps_data->fifo_info.fifo_data_uv + frame_count + i) = *(alps_data->fifo_info.fifo_data1 + frame_count + i);
|
|
*(alps_data->fifo_info.fifo_data_ir + frame_count + i) = *(alps_data->fifo_info.fifo_data2 + frame_count + i);
|
|
|
|
*(alps_data->fifo_info.fifo_gain_clear + frame_count + i) = stk6d2x_sec_dgain(*(raw_data + offset) & 0x7) + \
|
|
stk6d2x_sec_again((*(raw_data + offset) & 0x18) >> 3) + \
|
|
stk6d2x_sec_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
|
|
*(alps_data->fifo_info.fifo_gain_uv + frame_count + i) = stk6d2x_sec_dgain(*(raw_data + offset + 1) & 0x7) + \
|
|
stk6d2x_sec_again((*(raw_data + offset + 1) & 0x18) >> 3) + \
|
|
stk6d2x_sec_pd_multiple((*(raw_data + offset + 1) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
|
|
*(alps_data->fifo_info.fifo_gain_ir + frame_count + i) = stk6d2x_sec_dgain(*(raw_data + offset + 2) & 0x7) + \
|
|
stk6d2x_sec_again((*(raw_data + offset + 2) & 0x18) >> 3) + \
|
|
stk6d2x_sec_pd_multiple((*(raw_data + offset + 2) & 0x60) >> 5, \
|
|
alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
|
|
#endif
|
|
*(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[0];
|
|
*(alps_data->fifo_info.fifo_data1 + frame_count + i) *= alps_data->als_info.als_cur_ratio[1];
|
|
*(alps_data->fifo_info.fifo_data2 + frame_count + i) *= alps_data->als_info.als_cur_ratio[2];
|
|
#ifdef STK_FIFO_DATA_SUMMATION
|
|
if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
|
|
{
|
|
als0_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
|
|
als1_sum += *(alps_data->fifo_info.fifo_data1 + frame_count + i);
|
|
als2_sum += *(alps_data->fifo_info.fifo_data2 + frame_count + i);
|
|
alps_data->fifo_info.fifo_sum_cnt ++;
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
#endif
|
|
default:
|
|
ALS_err("unavailable!\n");
|
|
break;
|
|
}
|
|
}
|
|
#ifdef STK_CHK_CLK_SRC
|
|
if (!alps_data->fifo_info.ext_clk_chk)
|
|
{
|
|
/*
|
|
alps_data->fifo_info.last_frame_count = 0;
|
|
ALS_err("internal clock mode\n");
|
|
alps_data->is_long_it = true;
|
|
memset(alps_data->fifo_info.fft_buf, 0, FFT_BUF_SIZE);
|
|
alps_data->fifo_info.fft_buf_idx = 0;
|
|
return;
|
|
*/
|
|
ALS_info("internal clock mode");
|
|
}
|
|
#endif
|
|
|
|
#ifdef STK_CHK_XFLG
|
|
if ((alps_data->xflag & 0x1))
|
|
ALS_err("XFLAG ALS0 Occur\n");
|
|
if ((alps_data->xflag & 0x2))
|
|
ALS_err("XFLAG ALS1 Occur\n");
|
|
if ((alps_data->xflag & 0x4))
|
|
ALS_err("XFLAG ALS2 Occur\n");
|
|
#endif
|
|
if (alps_data->fifo_info.pre_ext_clk_chk != alps_data->fifo_info.ext_clk_chk)
|
|
{
|
|
ALS_err("clock change skip fifo data");
|
|
alps_data->fifo_info.pre_ext_clk_chk = alps_data->fifo_info.ext_clk_chk;
|
|
alps_data->fifo_info.fft_buf_idx = 0;
|
|
return;
|
|
}
|
|
|
|
#ifdef STK_FIFO_DATA_SUMMATION
|
|
#ifdef STK_CHK_XFLG
|
|
//if (!(alps_data->xflag & 0x1))
|
|
#endif
|
|
{
|
|
alps_data->fifo_info.fifo_sum_als0 = als0_sum;
|
|
}
|
|
#ifdef STK_CHK_XFLG
|
|
//if (!(alps_data->xflag & 0x2))
|
|
#endif
|
|
{
|
|
alps_data->fifo_info.fifo_sum_als1 = als1_sum;
|
|
}
|
|
#ifdef STK_CHK_XFLG
|
|
//if (!(alps_data->xflag & 0x4))
|
|
#endif
|
|
{
|
|
alps_data->fifo_info.fifo_sum_als2 = als2_sum;
|
|
}
|
|
#endif
|
|
alps_data->fifo_info.last_frame_count = frame_num;
|
|
|
|
#ifdef STK_CHK_XFLG
|
|
if (/*!(alps_data->xflag & 0x1) && */frame_num < STK_FIFO_I2C_READ_FRAME_TARGET)
|
|
#endif
|
|
{
|
|
#ifdef STK_FFT_FLICKER
|
|
for (i = 0; i < frame_num; i ++)
|
|
{
|
|
alps_data->fifo_info.fft_buf[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_data_clear[i];
|
|
alps_data->fifo_info.fft_uv_buf[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_data_uv[i];
|
|
alps_data->fifo_info.fft_ir_buf[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_data_ir[i];
|
|
alps_data->fifo_info.fft_gain_clear[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_gain_clear[i];
|
|
alps_data->fifo_info.fft_gain_uv[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_gain_uv[i];
|
|
alps_data->fifo_info.fft_gain_ir[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_gain_ir[i];
|
|
alps_data->fifo_info.fft_xflag[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_xflag[i];
|
|
alps_data->fifo_info.fft_buf_idx ++;
|
|
if (alps_data->fifo_info.fft_buf_idx >= FFT_BUF_SIZE)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (alps_data->fifo_info.fft_buf_idx >= FFT_BUF_SIZE)
|
|
{
|
|
alps_data->fifo_info.fft_buf_idx = 0;
|
|
|
|
#ifdef SEC_FFT_FLICKER_1024
|
|
SEC_fft_entry(alps_data);
|
|
#endif
|
|
}
|
|
#endif
|
|
}
|
|
#ifdef STK_CHK_XFLG
|
|
else
|
|
{
|
|
alps_data->fifo_info.fft_buf_idx = 0;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void stk6d2x_get_fifo_data_polling(struct stk6d2x_data *alps_data)
|
|
{
|
|
int32_t ret;
|
|
uint8_t raw_data[2] = {0};
|
|
uint16_t frame_num;
|
|
bool is_fifo_warning = false;
|
|
|
|
if (alps_data->fifo_info.fifo_enable == false)
|
|
{
|
|
ALS_err("FIFO is disable\n");
|
|
return;
|
|
}
|
|
|
|
alps_data->fifo_info.fifo_reading = true;
|
|
alps_data->is_local_avg_update = false;
|
|
|
|
ret = STK6D2X_REG_BLOCK_READ(alps_data, STK6D2X_REG_FIFO_FCNT1, 2, raw_data);
|
|
|
|
if (ret < 0)
|
|
{
|
|
ALS_err("fail, err=0x%x\n", ret);
|
|
return;
|
|
}
|
|
|
|
frame_num = (((raw_data[0] & 0x3) << 8) | raw_data[1]);
|
|
ALS_info("frame_num = %d\n", frame_num);
|
|
|
|
if (frame_num == 0)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if (alps_data->fifo_info.data_type != STK6D2X_FIFO_STA01_STA2_ALS0_ALS1_ALS2)
|
|
{
|
|
if (frame_num >= 2 * STK_FIFO_I2C_READ_FRAME_TARGET)
|
|
{
|
|
frame_num = STK_FIFO_I2C_READ_FRAME_TARGET;
|
|
is_fifo_warning = true;
|
|
}
|
|
else if(frame_num >= STK_FIFO_I2C_READ_FRAME_TARGET)
|
|
{
|
|
frame_num = STK_FIFO_I2C_READ_FRAME_TARGET;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (frame_num >= STK_FIFO_I2C_READ_FRAME_TARGET)
|
|
{
|
|
frame_num = STK_FIFO_I2C_READ_FRAME_TARGET;
|
|
is_fifo_warning = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
stk6d2x_fifo_get_data(alps_data, frame_num);
|
|
|
|
if (alps_data->fifo_info.last_frame_count != 0)
|
|
SEC_local_average(alps_data);
|
|
|
|
if (is_fifo_warning)
|
|
{
|
|
ALS_info("is_fifo_warning\n");
|
|
stk6d2x_fifo_get_data(alps_data, frame_num);
|
|
}
|
|
|
|
#if !defined(CONFIG_AMS_ALS_COMPENSATION_FOR_AUTO_BRIGHTNESS)
|
|
if (alps_data->fifo_info.last_frame_count != 0)
|
|
SEC_local_average(alps_data);
|
|
#endif
|
|
|
|
alps_data->fifo_info.fifo_reading = false;
|
|
}
|
|
#endif
|