stk6d2x_fifo.c 79 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601
  1. /*
  2. * stk6d2x_fifo.c - Linux kernel modules for sensortek stk6d2x
  3. * ambient light sensor (Algorithm)
  4. *
  5. * Copyright (C) 2012~2018 Bk, sensortek Inc.
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #include <linux/input.h>
  22. #include <stk6d2x.h>
  23. #include "stk6d2x_sec.h"
  24. #ifdef STK_FIFO_ENABLE
  25. #ifdef SEC_FFT_FLICKER_1024
  26. // sec_hamming : 0~65535, Q16
  27. static const int32_t hamming[2048] = {
  28. 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,
  29. 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,
  30. 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,
  31. 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,
  32. 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,
  33. 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,
  34. 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,
  35. 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,
  36. 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,
  37. 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,
  38. 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,
  39. 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,
  40. 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,
  41. 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,
  42. 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,
  43. 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,
  44. 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,
  45. 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,
  46. 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,
  47. 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,
  48. 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,
  49. 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,
  50. 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,
  51. 5325, 5318, 5312, 5305, 5300, 5294, 5289, 5284, 5279, 5275, 5271, 5267, 5263, 5260, 5257, 5254, 5252, 5250, 5248, 5246, 5245, 5244, 5243, 5243,
  52. };
  53. // sec_sin, sec_cos : -65536~65536
  54. static const int32_t sin[1024] = {
  55. 0, 205886, 411764, 617627, 823467, 1029276, 1235045,
  56. 1440769, 1646438, 1852045, 2057582, 2263042, 2468417, 2673699,
  57. 2878880, 3083953, 3288909, 3493742, 3698444, 3903006, 4107421,
  58. 4311681, 4515779, 4719707, 4923458, 5127023, 5330395, 5533566,
  59. 5736529, 5939276, 6141799, 6344092, 6546145, 6747952, 6949505,
  60. 7150796, 7351818, 7552563, 7753024, 7953192, 8153062, 8352624,
  61. 8551872, 8750798, 8949395, 9147655, 9345570, 9543133, 9740337,
  62. 9937175, 10133638, 10329720, 10525413, 10720709, 10915602, 11110084,
  63. 11304148, 11497786, 11690991, 11883756, 12076074, 12267936, 12459338,
  64. 12650270, 12840725, 13030697, 13220179, 13409163, 13597642, 13785609,
  65. 13973057, 14159979, 14346368, 14532217, 14717519, 14902266, 15086453,
  66. 15270071, 15453115, 15635577, 15817450, 15998727, 16179403, 16359469,
  67. 16538919, 16717746, 16895944, 17073506, 17250426, 17426695, 17602309,
  68. 17777260, 17951541, 18125147, 18298070, 18470305, 18641844, 18812681,
  69. 18982810, 19152224, 19320917, 19488882, 19656114, 19822606, 19988352,
  70. 20153345, 20317579, 20481048, 20643747, 20805668, 20966805, 21127153,
  71. 21286706, 21445458, 21603402, 21760532, 21916844, 22072330, 22226985,
  72. 22380804, 22533779, 22685907, 22837180, 22987593, 23137141, 23285818,
  73. 23433618, 23580536, 23726566, 23871703, 24015941, 24159275, 24301699,
  74. 24443209, 24583798, 24723461, 24862194, 24999991, 25136846, 25272755,
  75. 25407713, 25541714, 25674753, 25806826, 25937927, 26068051, 26197194,
  76. 26325351, 26452517, 26578686, 26703855, 26828019, 26951172, 27073311,
  77. 27194431, 27314527, 27433594, 27551629, 27668626, 27784581, 27899491,
  78. 28013350, 28126154, 28237899, 28348582, 28458196, 28566740, 28674208,
  79. 28780596, 28885901, 28990118, 29093244, 29195275, 29296206, 29396034,
  80. 29494756, 29592367, 29688864, 29784243, 29878501, 29971634, 30063639,
  81. 30154511, 30244249, 30332847, 30420304, 30506615, 30591778, 30675789,
  82. 30758645, 30840343, 30920880, 31000253, 31078459, 31155494, 31231357,
  83. 31306043, 31379551, 31451878, 31523021, 31592976, 31661743, 31729317,
  84. 31795696, 31860879, 31924862, 31987643, 32049219, 32109589, 32168751,
  85. 32226701, 32283437, 32338958, 32393262, 32446346, 32498209, 32548848,
  86. 32598261, 32646447, 32693405, 32739131, 32783624, 32826884, 32868907,
  87. 32909693, 32949240, 32987546, 33024611, 33060432, 33095008, 33128338,
  88. 33160421, 33191256, 33220841, 33249175, 33276257, 33302087, 33326663,
  89. 33349984, 33372049, 33392858, 33412410, 33430704, 33447739, 33463515,
  90. 33478031, 33491286, 33503281, 33514014, 33523486, 33531695, 33538642,
  91. 33544326, 33548747, 33551905, 33553800, 33554432, 33553800, 33551905,
  92. 33548747, 33544326, 33538642, 33531695, 33523486, 33514014, 33503281,
  93. 33491286, 33478031, 33463515, 33447739, 33430704, 33412410, 33392858,
  94. 33372049, 33349984, 33326663, 33302087, 33276257, 33249175, 33220841,
  95. 33191256, 33160421, 33128338, 33095008, 33060432, 33024611, 32987546,
  96. 32949240, 32909693, 32868907, 32826884, 32783624, 32739131, 32693405,
  97. 32646447, 32598261, 32548848, 32498209, 32446346, 32393262, 32338958,
  98. 32283437, 32226701, 32168751, 32109589, 32049219, 31987643, 31924862,
  99. 31860879, 31795696, 31729317, 31661743, 31592976, 31523021, 31451878,
  100. 31379551, 31306043, 31231357, 31155494, 31078459, 31000253, 30920880,
  101. 30840343, 30758645, 30675789, 30591778, 30506615, 30420304, 30332847,
  102. 30244249, 30154511, 30063639, 29971634, 29878501, 29784243, 29688864,
  103. 29592367, 29494756, 29396034, 29296206, 29195275, 29093244, 28990118,
  104. 28885901, 28780596, 28674208, 28566740, 28458196, 28348582, 28237899,
  105. 28126154, 28013350, 27899491, 27784581, 27668626, 27551629, 27433594,
  106. 27314527, 27194431, 27073311, 26951172, 26828019, 26703855, 26578686,
  107. 26452517, 26325351, 26197194, 26068051, 25937927, 25806826, 25674753,
  108. 25541714, 25407713, 25272755, 25136846, 24999991, 24862194, 24723461,
  109. 24583798, 24443209, 24301699, 24159275, 24015941, 23871703, 23726566,
  110. 23580536, 23433618, 23285818, 23137141, 22987593, 22837180, 22685907,
  111. 22533779, 22380804, 22226985, 22072330, 21916844, 21760532, 21603402,
  112. 21445458, 21286706, 21127153, 20966805, 20805668, 20643747, 20481048,
  113. 20317579, 20153345, 19988352, 19822606, 19656114, 19488882, 19320917,
  114. 19152224, 18982810, 18812681, 18641844, 18470305, 18298070, 18125147,
  115. 17951541, 17777260, 17602309, 17426695, 17250426, 17073506, 16895944,
  116. 16717746, 16538919, 16359469, 16179403, 15998727, 15817450, 15635577,
  117. 15453115, 15270071, 15086453, 14902266, 14717519, 14532217, 14346368,
  118. 14159979, 13973057, 13785609, 13597642, 13409163, 13220179, 13030697,
  119. 12840725, 12650270, 12459338, 12267936, 12076074, 11883756, 11690991,
  120. 11497786, 11304148, 11110084, 10915602, 10720709, 10525413, 10329720,
  121. 10133638, 9937175, 9740337, 9543133, 9345570, 9147655, 8949395,
  122. 8750798, 8551872, 8352624, 8153062, 7953192, 7753024, 7552563,
  123. 7351818, 7150796, 6949505, 6747952, 6546145, 6344092, 6141799,
  124. 5939276, 5736529, 5533566, 5330395, 5127023, 4923458, 4719707,
  125. 4515779, 4311681, 4107421, 3903006, 3698444, 3493742, 3288909,
  126. 3083953, 2878880, 2673699, 2468417, 2263042, 2057582, 1852045,
  127. 1646438, 1440769, 1235045, 1029276, 823467, 617627, 411764,
  128. 205886, 0, -205886, -411764, -617627, -823467, -1029276,
  129. -1235045, -1440769, -1646438, -1852045, -2057582, -2263042, -2468417,
  130. -2673699, -2878880, -3083953, -3288909, -3493742, -3698444, -3903006,
  131. -4107421, -4311681, -4515779, -4719707, -4923458, -5127023, -5330395,
  132. -5533566, -5736529, -5939276, -6141799, -6344092, -6546145, -6747952,
  133. -6949505, -7150796, -7351818, -7552563, -7753024, -7953192, -8153062,
  134. -8352624, -8551872, -8750798, -8949395, -9147655, -9345570, -9543133,
  135. -9740337, -9937175, -10133638, -10329720, -10525413, -10720709, -10915602,
  136. -11110084, -11304148, -11497786, -11690991, -11883756, -12076074, -12267936,
  137. -12459338, -12650270, -12840725, -13030697, -13220179, -13409163, -13597642,
  138. -13785609, -13973057, -14159979, -14346368, -14532217, -14717519, -14902266,
  139. -15086453, -15270071, -15453115, -15635577, -15817450, -15998727, -16179403,
  140. -16359469, -16538919, -16717746, -16895944, -17073506, -17250426, -17426695,
  141. -17602309, -17777260, -17951541, -18125147, -18298070, -18470305, -18641844,
  142. -18812681, -18982810, -19152224, -19320917, -19488882, -19656114, -19822606,
  143. -19988352, -20153345, -20317579, -20481048, -20643747, -20805668, -20966805,
  144. -21127153, -21286706, -21445458, -21603402, -21760532, -21916844, -22072330,
  145. -22226985, -22380804, -22533779, -22685907, -22837180, -22987593, -23137141,
  146. -23285818, -23433618, -23580536, -23726566, -23871703, -24015941, -24159275,
  147. -24301699, -24443209, -24583798, -24723461, -24862194, -24999991, -25136846,
  148. -25272755, -25407713, -25541714, -25674753, -25806826, -25937927, -26068051,
  149. -26197194, -26325351, -26452517, -26578686, -26703855, -26828019, -26951172,
  150. -27073311, -27194431, -27314527, -27433594, -27551629, -27668626, -27784581,
  151. -27899491, -28013350, -28126154, -28237899, -28348582, -28458196, -28566740,
  152. -28674208, -28780596, -28885901, -28990118, -29093244, -29195275, -29296206,
  153. -29396034, -29494756, -29592367, -29688864, -29784243, -29878501, -29971634,
  154. -30063639, -30154511, -30244249, -30332847, -30420304, -30506615, -30591778,
  155. -30675789, -30758645, -30840343, -30920880, -31000253, -31078459, -31155494,
  156. -31231357, -31306043, -31379551, -31451878, -31523021, -31592976, -31661743,
  157. -31729317, -31795696, -31860879, -31924862, -31987643, -32049219, -32109589,
  158. -32168751, -32226701, -32283437, -32338958, -32393262, -32446346, -32498209,
  159. -32548848, -32598261, -32646447, -32693405, -32739131, -32783624, -32826884,
  160. -32868907, -32909693, -32949240, -32987546, -33024611, -33060432, -33095008,
  161. -33128338, -33160421, -33191256, -33220841, -33249175, -33276257, -33302087,
  162. -33326663, -33349984, -33372049, -33392858, -33412410, -33430704, -33447739,
  163. -33463515, -33478031, -33491286, -33503281, -33514014, -33523486, -33531695,
  164. -33538642, -33544326, -33548747, -33551905, -33553800, -33554432, -33553800,
  165. -33551905, -33548747, -33544326, -33538642, -33531695, -33523486, -33514014,
  166. -33503281, -33491286, -33478031, -33463515, -33447739, -33430704, -33412410,
  167. -33392858, -33372049, -33349984, -33326663, -33302087, -33276257, -33249175,
  168. -33220841, -33191256, -33160421, -33128338, -33095008, -33060432, -33024611,
  169. -32987546, -32949240, -32909693, -32868907, -32826884, -32783624, -32739131,
  170. -32693405, -32646447, -32598261, -32548848, -32498209, -32446346, -32393262,
  171. -32338958, -32283437, -32226701, -32168751, -32109589, -32049219, -31987643,
  172. -31924862, -31860879, -31795696, -31729317, -31661743, -31592976, -31523021,
  173. -31451878, -31379551, -31306043, -31231357, -31155494, -31078459, -31000253,
  174. -30920880, -30840343, -30758645, -30675789, -30591778, -30506615, -30420304,
  175. -30332847, -30244249, -30154511, -30063639, -29971634, -29878501, -29784243,
  176. -29688864, -29592367, -29494756, -29396034, -29296206, -29195275, -29093244,
  177. -28990118, -28885901, -28780596, -28674208, -28566740, -28458196, -28348582,
  178. -28237899, -28126154, -28013350, -27899491, -27784581, -27668626, -27551629,
  179. -27433594, -27314527, -27194431, -27073311, -26951172, -26828019, -26703855,
  180. -26578686, -26452517, -26325351, -26197194, -26068051, -25937927, -25806826,
  181. -25674753, -25541714, -25407713, -25272755, -25136846, -24999991, -24862194,
  182. -24723461, -24583798, -24443209, -24301699, -24159275, -24015941, -23871703,
  183. -23726566, -23580536, -23433618, -23285818, -23137141, -22987593, -22837180,
  184. -22685907, -22533779, -22380804, -22226985, -22072330, -21916844, -21760532,
  185. -21603402, -21445458, -21286706, -21127153, -20966805, -20805668, -20643747,
  186. -20481048, -20317579, -20153345, -19988352, -19822606, -19656114, -19488882,
  187. -19320917, -19152224, -18982810, -18812681, -18641844, -18470305, -18298070,
  188. -18125147, -17951541, -17777260, -17602309, -17426695, -17250426, -17073506,
  189. -16895944, -16717746, -16538919, -16359469, -16179403, -15998727, -15817450,
  190. -15635577, -15453115, -15270071, -15086453, -14902266, -14717519, -14532217,
  191. -14346368, -14159979, -13973057, -13785609, -13597642, -13409163, -13220179,
  192. -13030697, -12840725, -12650270, -12459338, -12267936, -12076074, -11883756,
  193. -11690991, -11497786, -11304148, -11110084, -10915602, -10720709, -10525413,
  194. -10329720, -10133638, -9937175, -9740337, -9543133, -9345570, -9147655,
  195. -8949395, -8750798, -8551872, -8352624, -8153062, -7953192, -7753024,
  196. -7552563, -7351818, -7150796, -6949505, -6747952, -6546145, -6344092,
  197. -6141799, -5939276, -5736529, -5533566, -5330395, -5127023, -4923458,
  198. -4719707, -4515779, -4311681, -4107421, -3903006, -3698444, -3493742,
  199. -3288909, -3083953, -2878880, -2673699, -2468417, -2263042, -2057582,
  200. -1852045, -1646438, -1440769, -1235045, -1029276, -823467, -617627,
  201. -411764, -205886
  202. };
  203. static const int32_t cos[1024] = {
  204. 33554432, 33553800, 33551905, 33548747, 33544326, 33538642, 33531695,
  205. 33523486, 33514014, 33503281, 33491286, 33478031, 33463515, 33447739,
  206. 33430704, 33412410, 33392858, 33372049, 33349984, 33326663, 33302087,
  207. 33276257, 33249175, 33220841, 33191256, 33160421, 33128338, 33095008,
  208. 33060432, 33024611, 32987546, 32949240, 32909693, 32868907, 32826884,
  209. 32783624, 32739131, 32693405, 32646447, 32598261, 32548848, 32498209,
  210. 32446346, 32393262, 32338958, 32283437, 32226701, 32168751, 32109589,
  211. 32049219, 31987643, 31924862, 31860879, 31795696, 31729317, 31661743,
  212. 31592976, 31523021, 31451878, 31379551, 31306043, 31231357, 31155494,
  213. 31078459, 31000253, 30920880, 30840343, 30758645, 30675789, 30591778,
  214. 30506615, 30420304, 30332847, 30244249, 30154511, 30063639, 29971634,
  215. 29878501, 29784243, 29688864, 29592367, 29494756, 29396034, 29296206,
  216. 29195275, 29093244, 28990118, 28885901, 28780596, 28674208, 28566740,
  217. 28458196, 28348582, 28237899, 28126154, 28013350, 27899491, 27784581,
  218. 27668626, 27551629, 27433594, 27314527, 27194431, 27073311, 26951172,
  219. 26828019, 26703855, 26578686, 26452517, 26325351, 26197194, 26068051,
  220. 25937927, 25806826, 25674753, 25541714, 25407713, 25272755, 25136846,
  221. 24999991, 24862194, 24723461, 24583798, 24443209, 24301699, 24159275,
  222. 24015941, 23871703, 23726566, 23580536, 23433618, 23285818, 23137141,
  223. 22987593, 22837180, 22685907, 22533779, 22380804, 22226985, 22072330,
  224. 21916844, 21760532, 21603402, 21445458, 21286706, 21127153, 20966805,
  225. 20805668, 20643747, 20481048, 20317579, 20153345, 19988352, 19822606,
  226. 19656114, 19488882, 19320917, 19152224, 18982810, 18812681, 18641844,
  227. 18470305, 18298070, 18125147, 17951541, 17777260, 17602309, 17426695,
  228. 17250426, 17073506, 16895944, 16717746, 16538919, 16359469, 16179403,
  229. 15998727, 15817450, 15635577, 15453115, 15270071, 15086453, 14902266,
  230. 14717519, 14532217, 14346368, 14159979, 13973057, 13785609, 13597642,
  231. 13409163, 13220179, 13030697, 12840725, 12650270, 12459338, 12267936,
  232. 12076074, 11883756, 11690991, 11497786, 11304148, 11110084, 10915602,
  233. 10720709, 10525413, 10329720, 10133638, 9937175, 9740337, 9543133,
  234. 9345570, 9147655, 8949395, 8750798, 8551872, 8352624, 8153062,
  235. 7953192, 7753024, 7552563, 7351818, 7150796, 6949505, 6747952,
  236. 6546145, 6344092, 6141799, 5939276, 5736529, 5533566, 5330395,
  237. 5127023, 4923458, 4719707, 4515779, 4311681, 4107421, 3903006,
  238. 3698444, 3493742, 3288909, 3083953, 2878880, 2673699, 2468417,
  239. 2263042, 2057582, 1852045, 1646438, 1440769, 1235045, 1029276,
  240. 823467, 617627, 411764, 205886, 0, -205886, -411764,
  241. -617627, -823467, -1029276, -1235045, -1440769, -1646438, -1852045,
  242. -2057582, -2263042, -2468417, -2673699, -2878880, -3083953, -3288909,
  243. -3493742, -3698444, -3903006, -4107421, -4311681, -4515779, -4719707,
  244. -4923458, -5127023, -5330395, -5533566, -5736529, -5939276, -6141799,
  245. -6344092, -6546145, -6747952, -6949505, -7150796, -7351818, -7552563,
  246. -7753024, -7953192, -8153062, -8352624, -8551872, -8750798, -8949395,
  247. -9147655, -9345570, -9543133, -9740337, -9937175, -10133638, -10329720,
  248. -10525413, -10720709, -10915602, -11110084, -11304148, -11497786, -11690991,
  249. -11883756, -12076074, -12267936, -12459338, -12650270, -12840725, -13030697,
  250. -13220179, -13409163, -13597642, -13785609, -13973057, -14159979, -14346368,
  251. -14532217, -14717519, -14902266, -15086453, -15270071, -15453115, -15635577,
  252. -15817450, -15998727, -16179403, -16359469, -16538919, -16717746, -16895944,
  253. -17073506, -17250426, -17426695, -17602309, -17777260, -17951541, -18125147,
  254. -18298070, -18470305, -18641844, -18812681, -18982810, -19152224, -19320917,
  255. -19488882, -19656114, -19822606, -19988352, -20153345, -20317579, -20481048,
  256. -20643747, -20805668, -20966805, -21127153, -21286706, -21445458, -21603402,
  257. -21760532, -21916844, -22072330, -22226985, -22380804, -22533779, -22685907,
  258. -22837180, -22987593, -23137141, -23285818, -23433618, -23580536, -23726566,
  259. -23871703, -24015941, -24159275, -24301699, -24443209, -24583798, -24723461,
  260. -24862194, -24999991, -25136846, -25272755, -25407713, -25541714, -25674753,
  261. -25806826, -25937927, -26068051, -26197194, -26325351, -26452517, -26578686,
  262. -26703855, -26828019, -26951172, -27073311, -27194431, -27314527, -27433594,
  263. -27551629, -27668626, -27784581, -27899491, -28013350, -28126154, -28237899,
  264. -28348582, -28458196, -28566740, -28674208, -28780596, -28885901, -28990118,
  265. -29093244, -29195275, -29296206, -29396034, -29494756, -29592367, -29688864,
  266. -29784243, -29878501, -29971634, -30063639, -30154511, -30244249, -30332847,
  267. -30420304, -30506615, -30591778, -30675789, -30758645, -30840343, -30920880,
  268. -31000253, -31078459, -31155494, -31231357, -31306043, -31379551, -31451878,
  269. -31523021, -31592976, -31661743, -31729317, -31795696, -31860879, -31924862,
  270. -31987643, -32049219, -32109589, -32168751, -32226701, -32283437, -32338958,
  271. -32393262, -32446346, -32498209, -32548848, -32598261, -32646447, -32693405,
  272. -32739131, -32783624, -32826884, -32868907, -32909693, -32949240, -32987546,
  273. -33024611, -33060432, -33095008, -33128338, -33160421, -33191256, -33220841,
  274. -33249175, -33276257, -33302087, -33326663, -33349984, -33372049, -33392858,
  275. -33412410, -33430704, -33447739, -33463515, -33478031, -33491286, -33503281,
  276. -33514014, -33523486, -33531695, -33538642, -33544326, -33548747, -33551905,
  277. -33553800, -33554432, -33553800, -33551905, -33548747, -33544326, -33538642,
  278. -33531695, -33523486, -33514014, -33503281, -33491286, -33478031, -33463515,
  279. -33447739, -33430704, -33412410, -33392858, -33372049, -33349984, -33326663,
  280. -33302087, -33276257, -33249175, -33220841, -33191256, -33160421, -33128338,
  281. -33095008, -33060432, -33024611, -32987546, -32949240, -32909693, -32868907,
  282. -32826884, -32783624, -32739131, -32693405, -32646447, -32598261, -32548848,
  283. -32498209, -32446346, -32393262, -32338958, -32283437, -32226701, -32168751,
  284. -32109589, -32049219, -31987643, -31924862, -31860879, -31795696, -31729317,
  285. -31661743, -31592976, -31523021, -31451878, -31379551, -31306043, -31231357,
  286. -31155494, -31078459, -31000253, -30920880, -30840343, -30758645, -30675789,
  287. -30591778, -30506615, -30420304, -30332847, -30244249, -30154511, -30063639,
  288. -29971634, -29878501, -29784243, -29688864, -29592367, -29494756, -29396034,
  289. -29296206, -29195275, -29093244, -28990118, -28885901, -28780596, -28674208,
  290. -28566740, -28458196, -28348582, -28237899, -28126154, -28013350, -27899491,
  291. -27784581, -27668626, -27551629, -27433594, -27314527, -27194431, -27073311,
  292. -26951172, -26828019, -26703855, -26578686, -26452517, -26325351, -26197194,
  293. -26068051, -25937927, -25806826, -25674753, -25541714, -25407713, -25272755,
  294. -25136846, -24999991, -24862194, -24723461, -24583798, -24443209, -24301699,
  295. -24159275, -24015941, -23871703, -23726566, -23580536, -23433618, -23285818,
  296. -23137141, -22987593, -22837180, -22685907, -22533779, -22380804, -22226985,
  297. -22072330, -21916844, -21760532, -21603402, -21445458, -21286706, -21127153,
  298. -20966805, -20805668, -20643747, -20481048, -20317579, -20153345, -19988352,
  299. -19822606, -19656114, -19488882, -19320917, -19152224, -18982810, -18812681,
  300. -18641844, -18470305, -18298070, -18125147, -17951541, -17777260, -17602309,
  301. -17426695, -17250426, -17073506, -16895944, -16717746, -16538919, -16359469,
  302. -16179403, -15998727, -15817450, -15635577, -15453115, -15270071, -15086453,
  303. -14902266, -14717519, -14532217, -14346368, -14159979, -13973057, -13785609,
  304. -13597642, -13409163, -13220179, -13030697, -12840725, -12650270, -12459338,
  305. -12267936, -12076074, -11883756, -11690991, -11497786, -11304148, -11110084,
  306. -10915602, -10720709, -10525413, -10329720, -10133638, -9937175, -9740337,
  307. -9543133, -9345570, -9147655, -8949395, -8750798, -8551872, -8352624,
  308. -8153062, -7953192, -7753024, -7552563, -7351818, -7150796, -6949505,
  309. -6747952, -6546145, -6344092, -6141799, -5939276, -5736529, -5533566,
  310. -5330395, -5127023, -4923458, -4719707, -4515779, -4311681, -4107421,
  311. -3903006, -3698444, -3493742, -3288909, -3083953, -2878880, -2673699,
  312. -2468417, -2263042, -2057582, -1852045, -1646438, -1440769, -1235045,
  313. -1029276, -823467, -617627, -411764, -205886, 0, 205886,
  314. 411764, 617627, 823467, 1029276, 1235045, 1440769, 1646438,
  315. 1852045, 2057582, 2263042, 2468417, 2673699, 2878880, 3083953,
  316. 3288909, 3493742, 3698444, 3903006, 4107421, 4311681, 4515779,
  317. 4719707, 4923458, 5127023, 5330395, 5533566, 5736529, 5939276,
  318. 6141799, 6344092, 6546145, 6747952, 6949505, 7150796, 7351818,
  319. 7552563, 7753024, 7953192, 8153062, 8352624, 8551872, 8750798,
  320. 8949395, 9147655, 9345570, 9543133, 9740337, 9937175, 10133638,
  321. 10329720, 10525413, 10720709, 10915602, 11110084, 11304148, 11497786,
  322. 11690991, 11883756, 12076074, 12267936, 12459338, 12650270, 12840725,
  323. 13030697, 13220179, 13409163, 13597642, 13785609, 13973057, 14159979,
  324. 14346368, 14532217, 14717519, 14902266, 15086453, 15270071, 15453115,
  325. 15635577, 15817450, 15998727, 16179403, 16359469, 16538919, 16717746,
  326. 16895944, 17073506, 17250426, 17426695, 17602309, 17777260, 17951541,
  327. 18125147, 18298070, 18470305, 18641844, 18812681, 18982810, 19152224,
  328. 19320917, 19488882, 19656114, 19822606, 19988352, 20153345, 20317579,
  329. 20481048, 20643747, 20805668, 20966805, 21127153, 21286706, 21445458,
  330. 21603402, 21760532, 21916844, 22072330, 22226985, 22380804, 22533779,
  331. 22685907, 22837180, 22987593, 23137141, 23285818, 23433618, 23580536,
  332. 23726566, 23871703, 24015941, 24159275, 24301699, 24443209, 24583798,
  333. 24723461, 24862194, 24999991, 25136846, 25272755, 25407713, 25541714,
  334. 25674753, 25806826, 25937927, 26068051, 26197194, 26325351, 26452517,
  335. 26578686, 26703855, 26828019, 26951172, 27073311, 27194431, 27314527,
  336. 27433594, 27551629, 27668626, 27784581, 27899491, 28013350, 28126154,
  337. 28237899, 28348582, 28458196, 28566740, 28674208, 28780596, 28885901,
  338. 28990118, 29093244, 29195275, 29296206, 29396034, 29494756, 29592367,
  339. 29688864, 29784243, 29878501, 29971634, 30063639, 30154511, 30244249,
  340. 30332847, 30420304, 30506615, 30591778, 30675789, 30758645, 30840343,
  341. 30920880, 31000253, 31078459, 31155494, 31231357, 31306043, 31379551,
  342. 31451878, 31523021, 31592976, 31661743, 31729317, 31795696, 31860879,
  343. 31924862, 31987643, 32049219, 32109589, 32168751, 32226701, 32283437,
  344. 32338958, 32393262, 32446346, 32498209, 32548848, 32598261, 32646447,
  345. 32693405, 32739131, 32783624, 32826884, 32868907, 32909693, 32949240,
  346. 32987546, 33024611, 33060432, 33095008, 33128338, 33160421, 33191256,
  347. 33220841, 33249175, 33276257, 33302087, 33326663, 33349984, 33372049,
  348. 33392858, 33412410, 33430704, 33447739, 33463515, 33478031, 33491286,
  349. 33503281, 33514014, 33523486, 33531695, 33538642, 33544326, 33548747,
  350. 33551905, 33553800
  351. };
  352. uint32_t stk6d2x_als_get_max_gain_ratio(uint8_t pd_mode, uint8_t data_type)
  353. {
  354. uint32_t value = STK6D2X_ALS_DGAIN_MULTI1024 * STK6D2X_ALS_AGAIN_MULTI4;
  355. if (data_type == STK6D2X_TYPE_ALS0 && (pd_mode == STK6D2X_ALS0_AGC_PDMODE0 || pd_mode == STK6D2X_ALS0_AGC_PDMODE1))
  356. {
  357. value *= STK6D2X_ALS_PD_REDUCE_MULTI4;
  358. }
  359. if (data_type == STK6D2X_TYPE_ALS1 && pd_mode == STK6D2X_ALS0_AGC_PDMODE0)
  360. {
  361. value *= STK6D2X_ALS_PD_REDUCE_MULTI2;
  362. }
  363. if (data_type == STK6D2X_TYPE_ALS1 && pd_mode == STK6D2X_ALS0_AGC_PDMODE1)
  364. {
  365. value *= STK6D2X_ALS_PD_REDUCE_MULTI3;
  366. }
  367. if (data_type == STK6D2X_TYPE_ALS2 && pd_mode == STK6D2X_ALS0_AGC_PDMODE0)
  368. {
  369. value *= STK6D2X_ALS_PD_REDUCE_MULTI2;
  370. }
  371. if (data_type == STK6D2X_TYPE_ALS2 && pd_mode == STK6D2X_ALS0_AGC_PDMODE1)
  372. {
  373. value *= STK6D2X_ALS_PD_REDUCE_MULTI1;
  374. }
  375. return value;
  376. }
  377. static uint64_t SEC_sqrt(uint64_t x)
  378. {
  379. register uint64_t result, tmp;
  380. result = 0;
  381. tmp = (1LL << 62); // second-to-top bit set
  382. while (tmp > x) {
  383. tmp >>= 2;
  384. }
  385. while (tmp != 0) {
  386. if (x >= (result + tmp)) {
  387. x -= result + tmp;
  388. result += 2 * tmp; // <-- faster than 2 * one
  389. }
  390. result >>= 1;
  391. tmp >>= 2;
  392. }
  393. return result;
  394. }
  395. void get_magnitude(int64_t* data_r, int64_t* data_i, int32_t* buffer, int size)
  396. // data : 30 bits
  397. { //data must be twice as long as size
  398. int i;
  399. for (i = 0; i < size; ++i) {
  400. //sqrt(real^2 + imaginary^2)
  401. uint64_t square = 0;
  402. int64_t t_r = data_r[i];
  403. int64_t t_i = data_i[i];
  404. square = ((t_r * t_r) >> 1) + ((t_i * t_i) >> 1); // 60bit
  405. buffer[i] = (int32_t)SEC_sqrt(square); // 30bit
  406. }
  407. }
  408. // n is a power of 2
  409. int _log2n(int n)
  410. {
  411. //int len = sizeof(int) * 8;
  412. int len = 32, i;
  413. for (i = 0; i < len; i++)
  414. {
  415. if ((n & 1) == 1)
  416. return i;
  417. else
  418. n >>= 1;
  419. }
  420. return -1;
  421. }
  422. // Utility function for reversing the bits
  423. // of given index x
  424. unsigned int sec_bitReverse(unsigned int x, int log2n)
  425. {
  426. int n = 0, i;
  427. for (i = 0; i < log2n; i++)
  428. {
  429. n <<= 1;
  430. n |= (x & 1);
  431. x >>= 1;
  432. }
  433. return n;
  434. }
  435. void _fft(int64_t* a_r, int64_t* a_i, int64_t* A_r, int64_t* A_i, int n)
  436. {
  437. int log2n = _log2n(n), s, k, j;
  438. unsigned int i;
  439. // bit reversal of the given array
  440. for (i = 0; i < n; ++i) {
  441. int rev = sec_bitReverse(i, log2n);
  442. A_r[i] = a_r[rev]; // 28 (29 with sign)
  443. A_i[i] = a_i[rev]; // 28 (29 with sign)
  444. }
  445. for (s = 1; s <= log2n; s++) {
  446. int m = 1 << s;
  447. int m_2 = m >> 1;
  448. int64_t wm_r = (int64_t)cos[1024 >> s]; // wm_r = cos(2 pi / m) Q25
  449. int64_t wm_i = -(int64_t)sin[1024 >> s]; // wm_i = -sin(2 pi / m) Q25
  450. for (k = 0; k < n; k += m)
  451. {
  452. int64_t w_r = 1LL << 25; // Q25 (33554432)
  453. int64_t w_i = 0; // Q25
  454. for (j = 0; j < m_2; j++) {
  455. int i1 = k + j;
  456. int i2 = i1 + m_2;
  457. int64_t t_r = w_r * A_r[i2] -
  458. w_i * A_i[i2]; // 28+25+0~10=53~63 (64 with sign)
  459. int64_t t_i = w_r * A_i[i2] +
  460. w_i * A_r[i2]; // 28+25+0~10=53~63 (64 with sign)
  461. int64_t u_r = A_r[i1]; // 37~47
  462. int64_t u_i = A_i[i1]; // 37~47
  463. int64_t w2_r = w_r * wm_r - w_i * wm_i; // Q25*Q25, 26+25=51
  464. int64_t w2_i = w_r * wm_i + w_i * wm_r; // Q25*Q25
  465. t_r >>= 25; // Q25
  466. t_i >>= 25; // Q25
  467. A_r[i1] = u_r + t_r; // 28+0~10 = 28~38
  468. A_i[i1] = u_i + t_i;
  469. A_r[i2] = u_r - t_r;
  470. A_i[i2] = u_i - t_i;
  471. w_r = w2_r >> 25; // Q25
  472. w_i = w2_i >> 25; // Q25
  473. }
  474. }
  475. }
  476. }
  477. int64_t buf_r[SEC_FFT_SIZE] = { 0 };
  478. int64_t buf_i[SEC_FFT_SIZE] = { 0 };
  479. int64_t out_r[SEC_FFT_SIZE] = { 0 };
  480. int64_t out_i[SEC_FFT_SIZE] = { 0 };
  481. void FFT(int32_t* data, enum fft_size size)
  482. // int32_t* data : 16bit fifo data
  483. // enum fft_size : fft data size
  484. {
  485. static int log_cnt = 0;
  486. int i, hamming_step = 2048 / size;
  487. if (size > SEC_FFT_SIZE || (size & 0x7f) != 0) {
  488. //FFT size : multiply of 128
  489. //@TODO add return codes so we know it failed
  490. return;
  491. }
  492. for (i = 0; i < size; i++) {
  493. // if (!alps_data->saturation && data[i] >= '''saturation value(int)''') {
  494. // ALS_err("DEBUG_FLICKER saturation\n");
  495. // alps_data->saturation = true;
  496. // }
  497. buf_r[i] = ((int64_t)data[i] * (int64_t)hamming[i * hamming_step]) >> 4; // 16+16-4=28
  498. if (log_cnt > 30) // print debug log
  499. ALS_info("DEBUG_FLICKER data[%d] => %d buf[%d] => %lld\n", i,
  500. data[i], i, buf_r[i]);
  501. }
  502. _fft(buf_r, buf_i, out_r, out_i, size); // output 38 (39 sign)
  503. for (i = 0; i < SEC_FFT_SIZE; i++) {
  504. out_r[i] >>= 8;
  505. out_i[i] >>= 8;
  506. }
  507. get_magnitude(out_r, out_i, data, size);
  508. if (log_cnt > 30)
  509. log_cnt = 0;
  510. else
  511. log_cnt++;
  512. }
  513. void SEC_fft_entry(struct stk6d2x_data *alps_data)
  514. {
  515. stk6d2x_wrapper *stk_wrapper = container_of(alps_data, stk6d2x_wrapper, alps_data);
  516. int i = 0;
  517. static uint32_t clear_buffer[SEC_FFT_SIZE] = { 0 };
  518. static uint32_t uv_buffer[SEC_FFT_SIZE] = { 0 };
  519. static uint32_t ir_buffer[SEC_FFT_SIZE] = { 0 };
  520. static uint32_t clear_gain_log[SEC_FFT_SIZE] = { 0 };
  521. static uint32_t uv_gain_log[SEC_FFT_SIZE] = { 0 };
  522. static uint32_t ir_gain_log[SEC_FFT_SIZE] = { 0 };
  523. static bool is_clear_sat[SEC_FFT_SIZE] = { false };
  524. static bool is_uv_sat[SEC_FFT_SIZE] = { false };
  525. static bool is_ir_sat[SEC_FFT_SIZE] = { false };
  526. static bool is_ext_clk[SEC_FFT_SIZE] = { false };
  527. static uint32_t buf[SEC_FFT_SIZE] = { 0 };
  528. static int log_cnt = 0;
  529. uint64_t average_thd = 0;
  530. uint64_t max_thd = 0;
  531. long long int ratio_thd = 0;
  532. uint32_t extclkCnt = 0;
  533. uint32_t min_clear_gain_log = stk6d2x_als_get_max_gain_ratio(alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
  534. uint32_t min_uv_gain_log = stk6d2x_als_get_max_gain_ratio(alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
  535. uint32_t min_ir_gain_log = stk6d2x_als_get_max_gain_ratio(alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
  536. uint32_t clear_average_fifo = 0;
  537. uint32_t clear_average = 0;
  538. uint32_t ir_average = 0;
  539. uint32_t uv_average = 0;
  540. int16_t clear_gain = 0;
  541. int16_t ir_gain = 0;
  542. int16_t uv_gain = 0;
  543. uint resolution = DIV_ROUND_CLOSEST(1000000000, SAMPLING_TIME) / SEC_FFT_SIZE;
  544. uint min_freq = 70 / resolution;
  545. uint max_freq = 1000 / resolution;
  546. int imax = min_freq;
  547. uint16_t freq = 9999;
  548. uint64_t ratio_DC_max = 0;
  549. uint64_t ratio_max_avg = 0;
  550. /*
  551. ***** read fifo *****
  552. * ~~_buffer : raw fifo data(max 16bit!!!)
  553. * ~~_gain_log : gain(log value)
  554. * ex) gain 1 : 0
  555. * ex) gain 2 : 1
  556. * ex) gain 4 : 2
  557. * ...
  558. * ex) gain 256 : 8
  559. * This is an example, you can use it at an appropriate value according to STK68210
  560. *
  561. */
  562. for (i = 0; i < SEC_FFT_SIZE; i++)
  563. {
  564. clear_buffer[i] = alps_data->fifo_info.fft_buf[i];
  565. uv_buffer[i] = alps_data->fifo_info.fft_uv_buf[i];
  566. ir_buffer[i] = alps_data->fifo_info.fft_ir_buf[i];
  567. clear_gain_log[i] = alps_data->fifo_info.fft_gain_clear[i];
  568. uv_gain_log[i] = alps_data->fifo_info.fft_gain_uv[i];
  569. ir_gain_log[i] = alps_data->fifo_info.fft_gain_ir[i];
  570. is_clear_sat[i] = (alps_data->fifo_info.fft_xflag[i] & 0x1)? true : false; //CL staturation flag
  571. is_uv_sat[i] = (alps_data->fifo_info.fft_xflag[i] & 0x2)? true : false; //UV staturation flag
  572. is_ir_sat[i] = (alps_data->fifo_info.fft_xflag[i] & 0x4)? true : false; //IR staturation flag
  573. is_ext_clk[i] = (alps_data->fifo_info.fft_xflag[i] & 0x80)? true : false; //External clock flag
  574. if (is_ext_clk[i])
  575. extclkCnt++;
  576. }
  577. ALS_info("DEBUG_FLICKER extclk count:%d, intclk count:%d", extclkCnt, SEC_FFT_SIZE - extclkCnt);
  578. // find minimum gain ratio
  579. for (i = 0; i < SEC_FFT_SIZE; i++)
  580. {
  581. if (clear_gain_log[i] < min_clear_gain_log)
  582. min_clear_gain_log = clear_gain_log[i];
  583. if (uv_gain_log[i] < min_uv_gain_log)
  584. min_uv_gain_log = uv_gain_log[i];
  585. if (ir_gain_log[i] < min_ir_gain_log)
  586. min_ir_gain_log = ir_gain_log[i];
  587. }
  588. // gain unification
  589. for (i = 0; i < SEC_FFT_SIZE; i++)
  590. {
  591. clear_average_fifo += clear_buffer[i];
  592. clear_buffer[i] = clear_buffer[i] >> (clear_gain_log[i] - min_clear_gain_log);
  593. ir_buffer[i] = ir_buffer[i] >> (ir_gain_log[i] - min_ir_gain_log );
  594. uv_buffer[i] = uv_buffer[i] >> (uv_gain_log[i] - min_uv_gain_log );
  595. buf[i] = clear_buffer[i]; // for FFT, max 16bit
  596. clear_average += clear_buffer[i]; // 16+11=27
  597. ir_average += ir_buffer[i];
  598. uv_average += uv_buffer[i];
  599. }
  600. // cal average
  601. clear_average_fifo = clear_average_fifo / SEC_FFT_SIZE;
  602. clear_average = clear_average / SEC_FFT_SIZE;
  603. ir_average = ir_average / SEC_FFT_SIZE;
  604. uv_average = uv_average / SEC_FFT_SIZE;
  605. clear_average = (clear_average << FLICKER_AVG_SHIFT) >> min_clear_gain_log; // 16+14=30 -...
  606. ir_average = (ir_average << FLICKER_AVG_SHIFT) >> min_ir_gain_log; // 16+14=30 -...
  607. uv_average = (uv_average << FLICKER_AVG_SHIFT) >> min_uv_gain_log; // 16+14=30 -...
  608. clear_gain = 1<<(min_clear_gain_log);
  609. ir_gain = 1<<(min_clear_gain_log);
  610. uv_gain = 1<<(min_clear_gain_log);
  611. // do fft
  612. FFT(buf, SEC_FFT_SIZE);
  613. // get peak index
  614. for (i = min_freq; i <= max_freq; ++i) { // 70~1000
  615. // ALS_err("ccb_sw_bin4096_flicker_GetResult: buf[%d]=%10u\n", i, buf[i]);
  616. if (buf[i] > buf[imax]) {
  617. imax = i;
  618. }
  619. average_thd += buf[i]; // 29+10=39
  620. }
  621. average_thd /= (max_freq - min_freq + 1); // 29
  622. max_thd = buf[imax]; // 29
  623. ratio_thd = (uint32_t)((average_thd << 10) / max_thd); // 0+10-0, 0+10-29, 29+10-29
  624. ratio_DC_max = buf[0] / max_thd;
  625. ratio_max_avg = max_thd / average_thd;
  626. 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);
  627. // get valid threshold
  628. // thd = calc_thd(clear_average_fifo, clear_average, buf);
  629. ALS_info("DEBUG_FLICKER DC:%u\n", buf[0]);
  630. //ALS_info("DEBUG_FLICKER buf[%d]=%u, thd %lld", imax, buf[imax], thd);
  631. ALS_info("DEBUG_FLICKER buf[%d]=%u, avg/maxthd %lld\n", imax, buf[imax], ratio_thd);
  632. // valid peak check
  633. if (ratio_thd < FLICKER_AVGMAX_THD)
  634. {
  635. freq = imax * resolution;
  636. ALS_info("flicker_freq %d\n", freq);
  637. }
  638. else {
  639. freq = 0;
  640. ALS_info("flicker_freq is zero\n");
  641. }
  642. /*
  643. if (buf[imax] > thd) {
  644. freq = imax * resolution;
  645. ALS_info("flicker_freq %d", freq);
  646. }
  647. else {
  648. freq = 0;
  649. ALS_info("flicker_freq is zero");
  650. } */
  651. if (log_cnt++ > 10) {
  652. ALS_dbg("flicker_freq : %d", freq);
  653. log_cnt = 0;
  654. } else {
  655. ALS_info("flicker_freq : %d", freq);
  656. }
  657. alps_data->flicker = freq;
  658. input_report_rel(stk_wrapper->als_input_dev, REL_RZ, alps_data->flicker + 1);
  659. input_sync(stk_wrapper->als_input_dev);
  660. #if IS_ENABLED(CONFIG_SENSORS_FLICKER_SELF_TEST)
  661. als_eol_update_flicker(alps_data->flicker);
  662. #endif
  663. /*
  664. return values (average, flicker... )
  665. */
  666. }
  667. #endif
  668. void stk6d2x_fifo_init(struct stk6d2x_data * alps_data)
  669. {
  670. int32_t err;
  671. uint8_t flag_value;
  672. err = STK6D2X_REG_READ(alps_data, STK6D2X_REG_FIFO1, &flag_value);
  673. if (err < 0)
  674. {
  675. ALS_err("Read flag failed\n");
  676. return;
  677. }
  678. alps_data->fifo_info.data_type = (flag_value & STK6D2X_FIFO_SEL_MASK);
  679. ALS_info("data_type = %d\n", alps_data->fifo_info.data_type);
  680. switch (alps_data->fifo_info.data_type)
  681. {
  682. case STK6D2X_FIFO_ALS0:
  683. case STK6D2X_FIFO_ALS1:
  684. case STK6D2X_FIFO_ALS2:
  685. alps_data->fifo_info.frame_byte = 2;
  686. break;
  687. case STK6D2X_FIFO_ALS0_ALS1:
  688. case STK6D2X_FIFO_ALS0_ALS2:
  689. case STK6D2X_FIFO_ALS1_ALS2:
  690. alps_data->fifo_info.frame_byte = 4;
  691. break;
  692. case STK6D2X_FIFO_ALS0_ALS1_ALS2:
  693. alps_data->fifo_info.frame_byte = 6;
  694. break;
  695. case STK6D2X_FIFO_STA0_ALS0:
  696. case STK6D2X_FIFO_STA1_ALS1:
  697. case STK6D2X_FIFO_STA2_ALS2:
  698. alps_data->fifo_info.frame_byte = 4;
  699. break;
  700. case STK6D2X_FIFO_STA01_ALS0_ALS1:
  701. case STK6D2X_FIFO_STA02_ALS0_ALS2:
  702. case STK6D2X_FIFO_STA12_ALS1_ALS2:
  703. alps_data->fifo_info.frame_byte = 6;
  704. break;
  705. case STK6D2X_FIFO_STA01_STA2_ALS0_ALS1_ALS2:
  706. alps_data->fifo_info.frame_byte = 10;
  707. break;
  708. default:
  709. alps_data->fifo_info.frame_byte = 0xFF;
  710. ALS_err("Frame Type ERROR!\n");
  711. break;
  712. }
  713. alps_data->fifo_info.read_frame = STK_FIFO_I2C_READ_FRAME;
  714. alps_data->fifo_info.target_frame_count = STK_FIFO_I2C_READ_FRAME_TARGET;
  715. alps_data->fifo_info.read_max_data_byte = alps_data->fifo_info.frame_byte * STK_FIFO_I2C_READ_FRAME;
  716. alps_data->fifo_info.fifo_reading = false;
  717. alps_data->fifo_info.block_size = STK_FIFO_I2C_READ_FRAME_TARGET;
  718. alps_data->fifo_info.fft_buf_idx = 0;
  719. alps_data->fifo_info.ext_clk_chk = false;
  720. alps_data->fifo_info.pre_ext_clk_chk = false;
  721. }
  722. int32_t stk6d2x_enable_fifo(struct stk6d2x_data * alps_data, bool en)
  723. {
  724. int32_t ret = 0;
  725. uint8_t fifo_status, i2c_data_reg[2] = {0};
  726. uint16_t max_frame_count = STK_FIFO_DATA_BUFFER_LEN / alps_data->fifo_info.frame_byte;
  727. if (alps_data->fifo_info.fifo_enable == en)
  728. {
  729. ALS_err("FIFO already set\n");
  730. return ret;
  731. }
  732. ret = STK6D2X_REG_READ(alps_data, STK6D2X_REG_FIFO1, &fifo_status);
  733. if (ret < 0)
  734. {
  735. return ret;
  736. }
  737. if (en)
  738. {
  739. fifo_status = (STK6D2X_FIFO_MODE_NORMAL | fifo_status);
  740. i2c_data_reg[0] = (max_frame_count >> 8) & 0x03;
  741. i2c_data_reg[1] = max_frame_count & 0xFF;
  742. alps_data->fifo_info.fft_buf_idx = 0;
  743. alps_data->index_last = 0;
  744. }
  745. else
  746. {
  747. fifo_status = (fifo_status & (~STK6D2X_FIFO_MODE_NORMAL));
  748. }
  749. ret = STK6D2X_REG_WRITE_BLOCK(alps_data,
  750. STK6D2X_REG_FIFO1_WM_LV,
  751. i2c_data_reg,
  752. sizeof(i2c_data_reg) / sizeof(i2c_data_reg[0]));
  753. if (ret < 0)
  754. {
  755. ALS_err("fail, ret=%d\n", ret);
  756. return ret;
  757. }
  758. ret = STK6D2X_REG_READ_MODIFY_WRITE(alps_data,
  759. STK6D2X_REG_FIFO1,
  760. fifo_status,
  761. 0xFF);
  762. if (ret < 0)
  763. {
  764. ALS_err("fail, ret=%d\n", ret);
  765. return ret;
  766. }
  767. alps_data->fifo_info.fifo_enable = en;
  768. return ret;
  769. }
  770. void SEC_local_average(struct stk6d2x_data* alps_data)
  771. {
  772. uint64_t clear_local_average = 0;
  773. uint64_t uv_local_average = 0;
  774. uint64_t ir_local_average = 0;
  775. bool is_clear_local_sat = false;
  776. bool is_uv_local_sat = false;
  777. bool is_ir_local_sat = false;
  778. int i = 0;
  779. int n = 0;
  780. uint32_t min_clear_local_gain_log = alps_data->fifo_info.fft_gain_clear[alps_data->index_last];
  781. uint32_t min_uv_local_gain_log = alps_data->fifo_info.fft_gain_uv[alps_data->index_last];
  782. uint32_t min_ir_local_gain_log = alps_data->fifo_info.fft_gain_ir[alps_data->index_last];
  783. int local_length = 0;
  784. int index_last_temp = 0;
  785. if (alps_data->is_first)
  786. {
  787. n = (int)(alps_data->fifo_info.fft_buf_idx) - 1;
  788. if (n > -1)
  789. {
  790. 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]));
  791. 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]));
  792. 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]));
  793. if (alps_data->fifo_info.fft_xflag[n] & 0x1)
  794. is_clear_local_sat = true;
  795. if (alps_data->fifo_info.fft_xflag[n] & 0x2)
  796. is_uv_local_sat = true;
  797. if (alps_data->fifo_info.fft_xflag[n] & 0x4)
  798. is_ir_local_sat = true;
  799. alps_data->is_first = false;
  800. }
  801. else
  802. {
  803. return; // no data
  804. }
  805. }
  806. if ((alps_data->fifo_info.fft_buf_idx < alps_data->index_last + SEC_LOCAL_AVG_SIZE))
  807. {
  808. if (alps_data->fifo_info.fft_buf_idx == 0 && alps_data->index_last > 0)
  809. {
  810. }
  811. else
  812. {
  813. return; // not yet
  814. }
  815. }
  816. local_length = SEC_LOCAL_AVG_SIZE;
  817. index_last_temp = alps_data->index_last + SEC_LOCAL_AVG_SIZE;
  818. if (index_last_temp > SEC_FFT_SIZE)
  819. {
  820. index_last_temp = SEC_FFT_SIZE;
  821. local_length = index_last_temp - alps_data->index_last;
  822. }
  823. // find minimum gain ratio, check saturation
  824. for (i = alps_data->index_last; i < index_last_temp; i++)
  825. {
  826. if (alps_data->fifo_info.fft_gain_clear[i] < min_clear_local_gain_log)
  827. min_clear_local_gain_log = alps_data->fifo_info.fft_gain_clear[i];
  828. if (alps_data->fifo_info.fft_gain_uv[i] < min_uv_local_gain_log)
  829. min_uv_local_gain_log = alps_data->fifo_info.fft_gain_uv[i];
  830. if (alps_data->fifo_info.fft_gain_ir[i] < min_ir_local_gain_log)
  831. min_ir_local_gain_log = alps_data->fifo_info.fft_gain_ir[i];
  832. if (alps_data->fifo_info.fft_xflag[i] & 0x1)
  833. is_clear_local_sat = true;
  834. if (alps_data->fifo_info.fft_xflag[i] & 0x2)
  835. is_uv_local_sat = true;
  836. if (alps_data->fifo_info.fft_xflag[i] & 0x4)
  837. is_ir_local_sat = true;
  838. }
  839. // gain unification
  840. for (i = alps_data->index_last; i < index_last_temp; i++)
  841. {
  842. clear_local_average += (alps_data->fifo_info.fft_buf[i]) >> ((alps_data->fifo_info.fft_gain_clear[i]) - min_clear_local_gain_log);
  843. uv_local_average += (alps_data->fifo_info.fft_uv_buf[i]) >> ((alps_data->fifo_info.fft_gain_uv[i]) - min_uv_local_gain_log);
  844. ir_local_average += (alps_data->fifo_info.fft_ir_buf[i]) >> ((alps_data->fifo_info.fft_gain_ir[i]) - min_ir_local_gain_log);
  845. }
  846. // cal average
  847. clear_local_average /= local_length; // 16
  848. uv_local_average /= local_length;
  849. ir_local_average /= local_length;
  850. clear_local_average = (clear_local_average << FLICKER_AVG_SHIFT) >> min_clear_local_gain_log; // 16+14=30 -...
  851. uv_local_average = (uv_local_average << FLICKER_AVG_SHIFT) >> min_uv_local_gain_log; // 16+14=30 -...
  852. ir_local_average = (ir_local_average << FLICKER_AVG_SHIFT) >> min_ir_local_gain_log; // 16+14=30 -...
  853. alps_data->clear_gain = 1<<(min_clear_local_gain_log);
  854. alps_data->ir_gain = 1<<(min_ir_local_gain_log);
  855. alps_data->uv_gain = 1<<(min_uv_local_gain_log);
  856. alps_data->clear_local_average = clear_local_average;
  857. alps_data->uv_local_average = uv_local_average;
  858. alps_data->ir_local_average = ir_local_average;
  859. alps_data->is_clear_local_sat = is_clear_local_sat;
  860. alps_data->is_uv_local_sat = is_uv_local_sat;
  861. alps_data->is_ir_local_sat = is_ir_local_sat;
  862. 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",
  863. clear_local_average, is_clear_local_sat, uv_local_average, is_uv_local_sat, ir_local_average, is_ir_local_sat);
  864. alps_data->index_last = index_last_temp;
  865. if (alps_data->index_last >= SEC_FFT_SIZE)
  866. alps_data->index_last = 0;
  867. alps_data->is_local_avg_update = true;
  868. }
  869. void stk6d2x_fifo_get_data(struct stk6d2x_data * alps_data, uint16_t frame_num)
  870. {
  871. uint16_t offset;
  872. uint8_t raw_data[STK_FIFO_I2C_READ_FRAME_BUF_SIZE]; // alps_data->fifo_info.read_max_data_byte * sizeof(uint8_t)
  873. int16_t i, frame_count = 0, read_frame_num = 0;
  874. int32_t ret, read_bytes;
  875. #ifdef STK_FIFO_DATA_SUMMATION
  876. uint64_t als0_sum = 0, als1_sum = 0, als2_sum = 0;
  877. #endif
  878. #ifdef STK_CHK_XFLG
  879. alps_data->xflag = 0;
  880. if (alps_data->rid != 1)
  881. {
  882. ret = STK6D2X_REG_READ(alps_data, STK6D2X_REG_XFLAG, &alps_data->xflag);
  883. if (ret < 0)
  884. {
  885. return;
  886. }
  887. }
  888. #endif
  889. memset(alps_data->fifo_info.fifo_data0, 0, STK_FIFO_I2C_READ_FRAME_TARGET * sizeof(uint32_t));
  890. memset(alps_data->fifo_info.fifo_data1, 0, STK_FIFO_I2C_READ_FRAME_TARGET * sizeof(uint32_t));
  891. memset(alps_data->fifo_info.fifo_data2, 0, STK_FIFO_I2C_READ_FRAME_TARGET * sizeof(uint32_t));
  892. memset(alps_data->fifo_info.fifo_xflag, 0, STK_FIFO_I2C_READ_FRAME_TARGET * sizeof(uint8_t));
  893. #ifdef STK_FIFO_DATA_SUMMATION
  894. if (alps_data->fifo_info.fifo_sum_cnt >= STK6D2X_ALS_SUMMATION_CNT)
  895. {
  896. alps_data->fifo_info.fifo_sum_cnt = 0;
  897. }
  898. #endif
  899. for (frame_count = 0 ; frame_count < frame_num ; frame_count += (alps_data->fifo_info.read_frame))
  900. {
  901. read_frame_num = (int16_t)(frame_num - frame_count);
  902. if (read_frame_num >= alps_data->fifo_info.read_frame)
  903. {
  904. read_bytes = alps_data->fifo_info.read_max_data_byte;
  905. read_frame_num = alps_data->fifo_info.read_frame;
  906. }
  907. else
  908. {
  909. read_bytes = alps_data->fifo_info.frame_byte * read_frame_num;
  910. }
  911. memset(raw_data, 0, sizeof(raw_data));
  912. ret = STK6D2X_REG_BLOCK_READ(alps_data, STK6D2X_REG_FIFO_OUT, read_bytes, raw_data);
  913. if (ret < 0)
  914. {
  915. ALS_err("fail, err=0x%x\n", ret);
  916. return;
  917. }
  918. switch (alps_data->fifo_info.data_type)
  919. {
  920. case STK6D2X_FIFO_ALS0:
  921. case STK6D2X_FIFO_ALS1:
  922. case STK6D2X_FIFO_ALS2:
  923. for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
  924. {
  925. *(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset) << 8 | *(raw_data + offset + 1));
  926. }
  927. break;
  928. case STK6D2X_FIFO_ALS0_ALS1:
  929. case STK6D2X_FIFO_ALS0_ALS2:
  930. case STK6D2X_FIFO_ALS1_ALS2:
  931. for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
  932. {
  933. *(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset) << 8 | *(raw_data + offset + 1));
  934. *(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
  935. }
  936. break;
  937. case STK6D2X_FIFO_ALS0_ALS1_ALS2:
  938. for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
  939. {
  940. *(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset) << 8 | *(raw_data + offset + 1));
  941. *(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
  942. *(alps_data->fifo_info.fifo_data2 + frame_count + i) = (*(raw_data + offset + 4) << 8 | *(raw_data + offset + 5));
  943. }
  944. break;
  945. #ifdef STK_ALS_AGC
  946. case STK6D2X_FIFO_STA0_ALS0:
  947. for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
  948. {
  949. if (alps_data->rid == 1)
  950. {
  951. #ifdef STK_CHK_CLK_SRC
  952. if ((*(raw_data + offset + 1) & 0x80) == 0)
  953. {
  954. alps_data->fifo_info.ext_clk_chk = false;
  955. }
  956. else
  957. {
  958. alps_data->fifo_info.ext_clk_chk = true;
  959. }
  960. #endif
  961. #ifdef STK_CHK_XFLG
  962. if ((*(raw_data + offset) & 0x80))
  963. {
  964. alps_data->xflag |= 0x1;
  965. }
  966. #endif
  967. }
  968. else
  969. {
  970. #ifdef STK_CHK_CLK_SRC
  971. if ((*(raw_data + offset) & 0x80) == 0)
  972. {
  973. alps_data->fifo_info.ext_clk_chk = false;
  974. }
  975. else
  976. {
  977. alps_data->fifo_info.ext_clk_chk = true;
  978. }
  979. #endif
  980. }
  981. alps_data->als_info.als_cur_dgain[0] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
  982. alps_data->als_info.als_cur_again[0] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
  983. alps_data->als_info.als_cur_pd_reduce[0] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
  984. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
  985. *(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
  986. stk6d2x_get_als_ratio(alps_data);
  987. *(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[0];
  988. #ifdef STK_FIFO_DATA_SUMMATION
  989. if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
  990. {
  991. als0_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
  992. alps_data->fifo_info.fifo_sum_cnt ++;
  993. }
  994. #endif
  995. }
  996. break;
  997. case STK6D2X_FIFO_STA1_ALS1:
  998. for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
  999. {
  1000. if (alps_data->rid == 1)
  1001. {
  1002. #ifdef STK_CHK_CLK_SRC
  1003. if ((*(raw_data + offset + 1) & 0x80) == 0)
  1004. {
  1005. alps_data->fifo_info.ext_clk_chk = false;
  1006. }
  1007. else
  1008. {
  1009. alps_data->fifo_info.ext_clk_chk = true;
  1010. }
  1011. #endif
  1012. #ifdef STK_CHK_XFLG
  1013. if ((*(raw_data + offset) & 0x80))
  1014. {
  1015. alps_data->xflag |= 0x1;
  1016. }
  1017. #endif
  1018. }
  1019. else
  1020. {
  1021. #ifdef STK_CHK_CLK_SRC
  1022. if ((*(raw_data + offset) & 0x80) == 0)
  1023. {
  1024. alps_data->fifo_info.ext_clk_chk = false;
  1025. }
  1026. else
  1027. {
  1028. alps_data->fifo_info.ext_clk_chk = true;
  1029. }
  1030. #endif
  1031. }
  1032. alps_data->als_info.als_cur_dgain[1] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
  1033. alps_data->als_info.als_cur_again[1] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
  1034. alps_data->als_info.als_cur_pd_reduce[1] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
  1035. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
  1036. *(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
  1037. stk6d2x_get_als_ratio(alps_data);
  1038. *(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[1];
  1039. #ifdef STK_FIFO_DATA_SUMMATION
  1040. if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
  1041. {
  1042. als1_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
  1043. alps_data->fifo_info.fifo_sum_cnt ++;
  1044. }
  1045. #endif
  1046. }
  1047. break;
  1048. case STK6D2X_FIFO_STA2_ALS2:
  1049. for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
  1050. {
  1051. if (alps_data->rid == 1)
  1052. {
  1053. #ifdef STK_CHK_CLK_SRC
  1054. if ((*(raw_data + offset + 1) & 0x80) == 0)
  1055. {
  1056. alps_data->fifo_info.ext_clk_chk = false;
  1057. }
  1058. else
  1059. {
  1060. alps_data->fifo_info.ext_clk_chk = true;
  1061. }
  1062. #endif
  1063. #ifdef STK_CHK_XFLG
  1064. if ((*(raw_data + offset) & 0x80))
  1065. {
  1066. alps_data->xflag |= 0x1;
  1067. }
  1068. #endif
  1069. }
  1070. else
  1071. {
  1072. #ifdef STK_CHK_CLK_SRC
  1073. if ((*(raw_data + offset) & 0x80) == 0)
  1074. {
  1075. alps_data->fifo_info.ext_clk_chk = false;
  1076. }
  1077. else
  1078. {
  1079. alps_data->fifo_info.ext_clk_chk = true;
  1080. }
  1081. #endif
  1082. }
  1083. alps_data->als_info.als_cur_dgain[2] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
  1084. alps_data->als_info.als_cur_again[2] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
  1085. alps_data->als_info.als_cur_pd_reduce[2] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
  1086. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
  1087. *(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
  1088. stk6d2x_get_als_ratio(alps_data);
  1089. *(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[2];
  1090. #ifdef STK_FIFO_DATA_SUMMATION
  1091. if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
  1092. {
  1093. als2_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
  1094. alps_data->fifo_info.fifo_sum_cnt ++;
  1095. }
  1096. #endif
  1097. }
  1098. break;
  1099. case STK6D2X_FIFO_STA01_ALS0_ALS1:
  1100. for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
  1101. {
  1102. #ifdef STK_CHK_CLK_SRC
  1103. if ((*(raw_data + offset) & 0x80) == 0)
  1104. {
  1105. alps_data->fifo_info.ext_clk_chk = false;
  1106. }
  1107. else
  1108. {
  1109. alps_data->fifo_info.ext_clk_chk = true;
  1110. }
  1111. #endif
  1112. alps_data->als_info.als_cur_dgain[0] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
  1113. alps_data->als_info.als_cur_again[0] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
  1114. alps_data->als_info.als_cur_pd_reduce[0] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
  1115. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
  1116. alps_data->als_info.als_cur_dgain[1] = stk6d2x_cal_curDGain(*(raw_data + offset + 1) & 0x7);
  1117. alps_data->als_info.als_cur_again[1] = stk6d2x_als_get_again_multiple((*(raw_data + offset + 1) & 0x18) >> 3);
  1118. alps_data->als_info.als_cur_pd_reduce[1] = stk6d2x_als_get_pd_multiple((*(raw_data + offset + 1) & 0x60) >> 5, \
  1119. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
  1120. *(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
  1121. *(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 4) << 8 | *(raw_data + offset + 5));
  1122. stk6d2x_get_als_ratio(alps_data);
  1123. *(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[0];
  1124. *(alps_data->fifo_info.fifo_data1 + frame_count + i) *= alps_data->als_info.als_cur_ratio[1];
  1125. #ifdef STK_FIFO_DATA_SUMMATION
  1126. if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
  1127. {
  1128. als0_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
  1129. als1_sum += *(alps_data->fifo_info.fifo_data1 + frame_count + i);
  1130. alps_data->fifo_info.fifo_sum_cnt ++;
  1131. }
  1132. #endif
  1133. }
  1134. break;
  1135. case STK6D2X_FIFO_STA02_ALS0_ALS2:
  1136. for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
  1137. {
  1138. #ifdef STK_CHK_CLK_SRC
  1139. if ((*(raw_data + offset) & 0x80) == 0)
  1140. {
  1141. alps_data->fifo_info.ext_clk_chk = false;
  1142. }
  1143. else
  1144. {
  1145. alps_data->fifo_info.ext_clk_chk = true;
  1146. }
  1147. #endif
  1148. alps_data->als_info.als_cur_dgain[0] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
  1149. alps_data->als_info.als_cur_again[0] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
  1150. alps_data->als_info.als_cur_pd_reduce[0] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
  1151. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
  1152. alps_data->als_info.als_cur_dgain[2] = stk6d2x_cal_curDGain(*(raw_data + offset + 1) & 0x7);
  1153. alps_data->als_info.als_cur_again[2] = stk6d2x_als_get_again_multiple((*(raw_data + offset + 1) & 0x18) >> 3);
  1154. alps_data->als_info.als_cur_pd_reduce[2] = stk6d2x_als_get_pd_multiple((*(raw_data + offset + 1) & 0x60) >> 5, \
  1155. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
  1156. *(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
  1157. *(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 4) << 8 | *(raw_data + offset + 5));
  1158. stk6d2x_get_als_ratio(alps_data);
  1159. *(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[0];
  1160. *(alps_data->fifo_info.fifo_data1 + frame_count + i) *= alps_data->als_info.als_cur_ratio[2];
  1161. #ifdef STK_FIFO_DATA_SUMMATION
  1162. if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
  1163. {
  1164. als0_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
  1165. als2_sum += *(alps_data->fifo_info.fifo_data1 + frame_count + i);
  1166. alps_data->fifo_info.fifo_sum_cnt ++;
  1167. }
  1168. #endif
  1169. }
  1170. break;
  1171. case STK6D2X_FIFO_STA12_ALS1_ALS2:
  1172. for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
  1173. {
  1174. #ifdef STK_CHK_CLK_SRC
  1175. if ((*(raw_data + offset) & 0x80) == 0)
  1176. {
  1177. alps_data->fifo_info.ext_clk_chk = false;
  1178. }
  1179. else
  1180. {
  1181. alps_data->fifo_info.ext_clk_chk = true;
  1182. }
  1183. #endif
  1184. alps_data->als_info.als_cur_dgain[1] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
  1185. alps_data->als_info.als_cur_again[1] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
  1186. alps_data->als_info.als_cur_pd_reduce[1] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
  1187. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
  1188. alps_data->als_info.als_cur_dgain[2] = stk6d2x_cal_curDGain(*(raw_data + offset + 1) & 0x7);
  1189. alps_data->als_info.als_cur_again[2] = stk6d2x_als_get_again_multiple((*(raw_data + offset + 1) & 0x18) >> 3);
  1190. alps_data->als_info.als_cur_pd_reduce[2] = stk6d2x_als_get_pd_multiple((*(raw_data + offset + 1) & 0x60) >> 5, \
  1191. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
  1192. *(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 2) << 8 | *(raw_data + offset + 3));
  1193. *(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 4) << 8 | *(raw_data + offset + 5));
  1194. stk6d2x_get_als_ratio(alps_data);
  1195. *(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[1];
  1196. *(alps_data->fifo_info.fifo_data1 + frame_count + i) *= alps_data->als_info.als_cur_ratio[2];
  1197. #ifdef STK_FIFO_DATA_SUMMATION
  1198. if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
  1199. {
  1200. als1_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
  1201. als2_sum += *(alps_data->fifo_info.fifo_data1 + frame_count + i);
  1202. alps_data->fifo_info.fifo_sum_cnt ++;
  1203. }
  1204. #endif
  1205. }
  1206. break;
  1207. case STK6D2X_FIFO_STA01_STA2_ALS0_ALS1_ALS2:
  1208. for (i = 0, offset = 0; i < read_frame_num; i++, offset += alps_data->fifo_info.frame_byte)
  1209. {
  1210. if (alps_data->rid == 1)
  1211. {
  1212. #ifdef STK_CHK_CLK_SRC
  1213. if ((*(raw_data + offset + 3) & 0x80) == 0)
  1214. {
  1215. alps_data->fifo_info.ext_clk_chk = false;
  1216. }
  1217. else
  1218. {
  1219. alps_data->fifo_info.ext_clk_chk = true;
  1220. #ifdef SEC_FFT_FLICKER_1024
  1221. *(alps_data->fifo_info.fifo_xflag + frame_count + i) |= (1 << 7); //bit7 is cfalg
  1222. #endif
  1223. }
  1224. #endif
  1225. #ifdef STK_CHK_XFLG
  1226. if ((*(raw_data + offset) & 0x80))
  1227. {
  1228. alps_data->xflag |= 0x1;
  1229. #ifdef SEC_FFT_FLICKER_1024
  1230. *(alps_data->fifo_info.fifo_xflag + frame_count + i) |= 0x1; //bit0 is xfalg for C
  1231. #endif
  1232. }
  1233. if ((*(raw_data + offset + 1) & 0x80))
  1234. {
  1235. alps_data->xflag |= 0x2;
  1236. #ifdef SEC_FFT_FLICKER_1024
  1237. *(alps_data->fifo_info.fifo_xflag + frame_count + i) |= 0x2; //bit1 is xfalg for UV
  1238. #endif
  1239. }
  1240. if ((*(raw_data + offset + 2) & 0x80))
  1241. {
  1242. alps_data->xflag |= 0x4;
  1243. #ifdef SEC_FFT_FLICKER_1024
  1244. *(alps_data->fifo_info.fifo_xflag + frame_count + i) |= 0x4; //bit2 is xfalg for IR
  1245. #endif
  1246. }
  1247. #endif
  1248. }
  1249. else
  1250. {
  1251. #ifdef STK_CHK_CLK_SRC
  1252. if ((*(raw_data + offset) & 0x80) == 0)
  1253. {
  1254. alps_data->fifo_info.ext_clk_chk = false;
  1255. }
  1256. else
  1257. {
  1258. alps_data->fifo_info.ext_clk_chk = true;
  1259. #ifdef SEC_FFT_FLICKER_1024
  1260. *(alps_data->fifo_info.fifo_xflag + frame_count + i) |= (1 << 7); //bit7 is cfalg
  1261. #endif
  1262. }
  1263. #endif
  1264. }
  1265. alps_data->als_info.als_cur_dgain[0] = stk6d2x_cal_curDGain(*(raw_data + offset) & 0x7);
  1266. alps_data->als_info.als_cur_again[0] = stk6d2x_als_get_again_multiple((*(raw_data + offset) & 0x18) >> 3);
  1267. alps_data->als_info.als_cur_pd_reduce[0] = stk6d2x_als_get_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
  1268. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
  1269. alps_data->als_info.als_cur_dgain[1] = stk6d2x_cal_curDGain(*(raw_data + offset + 1) & 0x7);
  1270. alps_data->als_info.als_cur_again[1] = stk6d2x_als_get_again_multiple((*(raw_data + offset + 1) & 0x18) >> 3);
  1271. alps_data->als_info.als_cur_pd_reduce[1] = stk6d2x_als_get_pd_multiple((*(raw_data + offset + 1) & 0x60) >> 5, \
  1272. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
  1273. alps_data->als_info.als_cur_dgain[2] = stk6d2x_cal_curDGain(*(raw_data + offset + 2) & 0x7);
  1274. alps_data->als_info.als_cur_again[2] = stk6d2x_als_get_again_multiple((*(raw_data + offset + 2) & 0x18) >> 3);
  1275. alps_data->als_info.als_cur_pd_reduce[2] = stk6d2x_als_get_pd_multiple((*(raw_data + offset + 2) & 0x60) >> 5, \
  1276. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
  1277. *(alps_data->fifo_info.fifo_data0 + frame_count + i) = (*(raw_data + offset + 4) << 8 | *(raw_data + offset + 5));
  1278. *(alps_data->fifo_info.fifo_data1 + frame_count + i) = (*(raw_data + offset + 6) << 8 | *(raw_data + offset + 7));
  1279. *(alps_data->fifo_info.fifo_data2 + frame_count + i) = (*(raw_data + offset + 8) << 8 | *(raw_data + offset + 9));
  1280. stk6d2x_get_als_ratio(alps_data);
  1281. #ifdef SEC_FFT_FLICKER_1024
  1282. *(alps_data->fifo_info.fifo_data_clear + frame_count + i) = *(alps_data->fifo_info.fifo_data0 + frame_count + i);
  1283. *(alps_data->fifo_info.fifo_data_uv + frame_count + i) = *(alps_data->fifo_info.fifo_data1 + frame_count + i);
  1284. *(alps_data->fifo_info.fifo_data_ir + frame_count + i) = *(alps_data->fifo_info.fifo_data2 + frame_count + i);
  1285. *(alps_data->fifo_info.fifo_gain_clear + frame_count + i) = stk6d2x_sec_dgain(*(raw_data + offset) & 0x7) + \
  1286. stk6d2x_sec_again((*(raw_data + offset) & 0x18) >> 3) + \
  1287. stk6d2x_sec_pd_multiple((*(raw_data + offset) & 0x60) >> 5, \
  1288. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS0);
  1289. *(alps_data->fifo_info.fifo_gain_uv + frame_count + i) = stk6d2x_sec_dgain(*(raw_data + offset + 1) & 0x7) + \
  1290. stk6d2x_sec_again((*(raw_data + offset + 1) & 0x18) >> 3) + \
  1291. stk6d2x_sec_pd_multiple((*(raw_data + offset + 1) & 0x60) >> 5, \
  1292. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS1);
  1293. *(alps_data->fifo_info.fifo_gain_ir + frame_count + i) = stk6d2x_sec_dgain(*(raw_data + offset + 2) & 0x7) + \
  1294. stk6d2x_sec_again((*(raw_data + offset + 2) & 0x18) >> 3) + \
  1295. stk6d2x_sec_pd_multiple((*(raw_data + offset + 2) & 0x60) >> 5, \
  1296. alps_data->als_info.als_cur_pd_mode, STK6D2X_TYPE_ALS2);
  1297. #endif
  1298. *(alps_data->fifo_info.fifo_data0 + frame_count + i) *= alps_data->als_info.als_cur_ratio[0];
  1299. *(alps_data->fifo_info.fifo_data1 + frame_count + i) *= alps_data->als_info.als_cur_ratio[1];
  1300. *(alps_data->fifo_info.fifo_data2 + frame_count + i) *= alps_data->als_info.als_cur_ratio[2];
  1301. #ifdef STK_FIFO_DATA_SUMMATION
  1302. if (alps_data->fifo_info.fifo_sum_cnt < STK6D2X_ALS_SUMMATION_CNT)
  1303. {
  1304. als0_sum += *(alps_data->fifo_info.fifo_data0 + frame_count + i);
  1305. als1_sum += *(alps_data->fifo_info.fifo_data1 + frame_count + i);
  1306. als2_sum += *(alps_data->fifo_info.fifo_data2 + frame_count + i);
  1307. alps_data->fifo_info.fifo_sum_cnt ++;
  1308. }
  1309. #endif
  1310. }
  1311. break;
  1312. #endif
  1313. default:
  1314. ALS_err("unavailable!\n");
  1315. break;
  1316. }
  1317. }
  1318. #ifdef STK_CHK_CLK_SRC
  1319. if (!alps_data->fifo_info.ext_clk_chk)
  1320. {
  1321. /*
  1322. alps_data->fifo_info.last_frame_count = 0;
  1323. ALS_err("internal clock mode\n");
  1324. alps_data->is_long_it = true;
  1325. memset(alps_data->fifo_info.fft_buf, 0, FFT_BUF_SIZE);
  1326. alps_data->fifo_info.fft_buf_idx = 0;
  1327. return;
  1328. */
  1329. ALS_info("internal clock mode");
  1330. }
  1331. #endif
  1332. #ifdef STK_CHK_XFLG
  1333. if ((alps_data->xflag & 0x1))
  1334. ALS_err("XFLAG ALS0 Occur\n");
  1335. if ((alps_data->xflag & 0x2))
  1336. ALS_err("XFLAG ALS1 Occur\n");
  1337. if ((alps_data->xflag & 0x4))
  1338. ALS_err("XFLAG ALS2 Occur\n");
  1339. #endif
  1340. if (alps_data->fifo_info.pre_ext_clk_chk != alps_data->fifo_info.ext_clk_chk)
  1341. {
  1342. ALS_err("clock change skip fifo data");
  1343. alps_data->fifo_info.pre_ext_clk_chk = alps_data->fifo_info.ext_clk_chk;
  1344. alps_data->fifo_info.fft_buf_idx = 0;
  1345. return;
  1346. }
  1347. #ifdef STK_FIFO_DATA_SUMMATION
  1348. #ifdef STK_CHK_XFLG
  1349. //if (!(alps_data->xflag & 0x1))
  1350. #endif
  1351. {
  1352. alps_data->fifo_info.fifo_sum_als0 = als0_sum;
  1353. }
  1354. #ifdef STK_CHK_XFLG
  1355. //if (!(alps_data->xflag & 0x2))
  1356. #endif
  1357. {
  1358. alps_data->fifo_info.fifo_sum_als1 = als1_sum;
  1359. }
  1360. #ifdef STK_CHK_XFLG
  1361. //if (!(alps_data->xflag & 0x4))
  1362. #endif
  1363. {
  1364. alps_data->fifo_info.fifo_sum_als2 = als2_sum;
  1365. }
  1366. #endif
  1367. alps_data->fifo_info.last_frame_count = frame_num;
  1368. #ifdef STK_CHK_XFLG
  1369. if (/*!(alps_data->xflag & 0x1) && */frame_num < STK_FIFO_I2C_READ_FRAME_TARGET)
  1370. #endif
  1371. {
  1372. #ifdef STK_FFT_FLICKER
  1373. for (i = 0; i < frame_num; i ++)
  1374. {
  1375. alps_data->fifo_info.fft_buf[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_data_clear[i];
  1376. alps_data->fifo_info.fft_uv_buf[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_data_uv[i];
  1377. alps_data->fifo_info.fft_ir_buf[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_data_ir[i];
  1378. alps_data->fifo_info.fft_gain_clear[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_gain_clear[i];
  1379. alps_data->fifo_info.fft_gain_uv[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_gain_uv[i];
  1380. alps_data->fifo_info.fft_gain_ir[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_gain_ir[i];
  1381. alps_data->fifo_info.fft_xflag[alps_data->fifo_info.fft_buf_idx] = alps_data->fifo_info.fifo_xflag[i];
  1382. alps_data->fifo_info.fft_buf_idx ++;
  1383. if (alps_data->fifo_info.fft_buf_idx >= FFT_BUF_SIZE)
  1384. {
  1385. break;
  1386. }
  1387. }
  1388. if (alps_data->fifo_info.fft_buf_idx >= FFT_BUF_SIZE)
  1389. {
  1390. alps_data->fifo_info.fft_buf_idx = 0;
  1391. #ifdef SEC_FFT_FLICKER_1024
  1392. SEC_fft_entry(alps_data);
  1393. #endif
  1394. }
  1395. #endif
  1396. }
  1397. #ifdef STK_CHK_XFLG
  1398. else
  1399. {
  1400. alps_data->fifo_info.fft_buf_idx = 0;
  1401. }
  1402. #endif
  1403. }
  1404. void stk6d2x_get_fifo_data_polling(struct stk6d2x_data *alps_data)
  1405. {
  1406. int32_t ret;
  1407. uint8_t raw_data[2] = {0};
  1408. uint16_t frame_num;
  1409. bool is_fifo_warning = false;
  1410. if (alps_data->fifo_info.fifo_enable == false)
  1411. {
  1412. ALS_err("FIFO is disable\n");
  1413. return;
  1414. }
  1415. alps_data->fifo_info.fifo_reading = true;
  1416. alps_data->is_local_avg_update = false;
  1417. ret = STK6D2X_REG_BLOCK_READ(alps_data, STK6D2X_REG_FIFO_FCNT1, 2, raw_data);
  1418. if (ret < 0)
  1419. {
  1420. ALS_err("fail, err=0x%x\n", ret);
  1421. return;
  1422. }
  1423. frame_num = (((raw_data[0] & 0x3) << 8) | raw_data[1]);
  1424. ALS_info("frame_num = %d\n", frame_num);
  1425. if (frame_num == 0)
  1426. {
  1427. return;
  1428. }
  1429. else
  1430. {
  1431. if (alps_data->fifo_info.data_type != STK6D2X_FIFO_STA01_STA2_ALS0_ALS1_ALS2)
  1432. {
  1433. if (frame_num >= 2 * STK_FIFO_I2C_READ_FRAME_TARGET)
  1434. {
  1435. frame_num = STK_FIFO_I2C_READ_FRAME_TARGET;
  1436. is_fifo_warning = true;
  1437. }
  1438. else if(frame_num >= STK_FIFO_I2C_READ_FRAME_TARGET)
  1439. {
  1440. frame_num = STK_FIFO_I2C_READ_FRAME_TARGET;
  1441. }
  1442. }
  1443. else
  1444. {
  1445. if (frame_num >= STK_FIFO_I2C_READ_FRAME_TARGET)
  1446. {
  1447. frame_num = STK_FIFO_I2C_READ_FRAME_TARGET;
  1448. is_fifo_warning = true;
  1449. }
  1450. }
  1451. }
  1452. stk6d2x_fifo_get_data(alps_data, frame_num);
  1453. if (alps_data->fifo_info.last_frame_count != 0)
  1454. SEC_local_average(alps_data);
  1455. if (is_fifo_warning)
  1456. {
  1457. ALS_info("is_fifo_warning\n");
  1458. stk6d2x_fifo_get_data(alps_data, frame_num);
  1459. }
  1460. #if !defined(CONFIG_AMS_ALS_COMPENSATION_FOR_AUTO_BRIGHTNESS)
  1461. if (alps_data->fifo_info.last_frame_count != 0)
  1462. SEC_local_average(alps_data);
  1463. #endif
  1464. alps_data->fifo_info.fifo_reading = false;
  1465. }
  1466. #endif