bma222E.c 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100
  1. /* BMA150 motion sensor driver
  2. *
  3. *
  4. *
  5. * This software is licensed under the terms of the GNU General Public
  6. * License version 2, as published by the Free Software Foundation, and
  7. * may be copied, distributed, and modified under those terms.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. */
  15. #include <linux/interrupt.h>
  16. #include <linux/i2c.h>
  17. #include <linux/slab.h>
  18. #include <linux/irq.h>
  19. #include <linux/miscdevice.h>
  20. #include <linux/uaccess.h>
  21. #include <linux/delay.h>
  22. #include <linux/input.h>
  23. #include <linux/workqueue.h>
  24. #include <linux/kobject.h>
  25. #include <linux/platform_device.h>
  26. #include <linux/atomic.h>
  27. #include "upmu_sw.h"
  28. #include "upmu_common.h"
  29. #include "batch.h"
  30. #define POWER_NONE_MACRO MT65XX_POWER_NONE
  31. #include <cust_acc.h>
  32. #include "bma222E.h"
  33. #include <accel.h>
  34. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  35. #include <SCP_sensorHub.h>
  36. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  37. /*----------------------------------------------------------------------------*/
  38. #define I2C_DRIVERID_BMA222 222
  39. /*----------------------------------------------------------------------------*/
  40. /*#define DEBUG 1*/
  41. /*----------------------------------------------------------------------------*/
  42. #define SW_CALIBRATION
  43. /*----------------------------------------------------------------------------*/
  44. #define BMA222_AXIS_X 0
  45. #define BMA222_AXIS_Y 1
  46. #define BMA222_AXIS_Z 2
  47. #define BMA222_DATA_LEN 6
  48. #define BMA222_DEV_NAME "BMA222"
  49. /*----------------------------------------------------------------------------*/
  50. /*********/
  51. /*----------------------------------------------------------------------------*/
  52. static const struct i2c_device_id bma222_i2c_id[] = { {BMA222_DEV_NAME, 0}, {} };
  53. /* static struct i2c_board_info __initdata i2c_BMA222={ I2C_BOARD_INFO(BMA222_DEV_NAME, 0x18)}; */
  54. #define COMPATIABLE_NAME "mediatek,bma222e_new"
  55. /*----------------------------------------------------------------------------*/
  56. static int bma222_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
  57. static int bma222_i2c_remove(struct i2c_client *client);
  58. static int bma222_suspend(struct i2c_client *client, pm_message_t msg);
  59. static int bma222_resume(struct i2c_client *client);
  60. static int gsensor_local_init(void);
  61. static int gsensor_remove(void);
  62. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  63. static int gsensor_setup_irq(void);
  64. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  65. static int gsensor_set_delay(u64 ns);
  66. /*----------------------------------------------------------------------------*/
  67. enum ADX_TRC {
  68. ADX_TRC_FILTER = 0x01,
  69. ADX_TRC_RAWDATA = 0x02,
  70. ADX_TRC_IOCTL = 0x04,
  71. ADX_TRC_CALI = 0X08,
  72. ADX_TRC_INFO = 0X10,
  73. };
  74. /*----------------------------------------------------------------------------*/
  75. struct scale_factor {
  76. u8 whole;
  77. u8 fraction;
  78. };
  79. /*----------------------------------------------------------------------------*/
  80. struct data_resolution {
  81. struct scale_factor scalefactor;
  82. int sensitivity;
  83. };
  84. /*----------------------------------------------------------------------------*/
  85. #define C_MAX_FIR_LENGTH (32)
  86. /*----------------------------------------------------------------------------*/
  87. struct data_filter {
  88. s16 raw[C_MAX_FIR_LENGTH][BMA222_AXES_NUM];
  89. int sum[BMA222_AXES_NUM];
  90. int num;
  91. int idx;
  92. };
  93. /*----------------------------------------------------------------------------*/
  94. struct bma222_i2c_data {
  95. struct i2c_client *client;
  96. struct acc_hw *hw;
  97. struct hwmsen_convert cvt;
  98. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  99. struct work_struct irq_work;
  100. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  101. /*misc */
  102. struct data_resolution *reso;
  103. atomic_t trace;
  104. atomic_t suspend;
  105. atomic_t selftest;
  106. atomic_t filter;
  107. s16 cali_sw[BMA222_AXES_NUM + 1];
  108. /*data */
  109. s8 offset[BMA222_AXES_NUM + 1]; /*+1: for 4-byte alignment */
  110. s16 data[BMA222_AXES_NUM + 1];
  111. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  112. int SCP_init_done;
  113. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  114. #if defined(CONFIG_BMA222_LOWPASS)
  115. atomic_t firlen;
  116. atomic_t fir_en;
  117. struct data_filter fir;
  118. #endif
  119. u8 bandwidth;
  120. };
  121. /*----------------------------------------------------------------------------*/
  122. static const struct of_device_id accel_of_match[] = {
  123. {.compatible = "mediatek,gsensor"},
  124. {},
  125. };
  126. static struct i2c_driver bma222_i2c_driver = {
  127. .driver = {
  128. /* .owner = THIS_MODULE, */
  129. .name = BMA222_DEV_NAME,
  130. .of_match_table = accel_of_match,
  131. },
  132. .probe = bma222_i2c_probe,
  133. .remove = bma222_i2c_remove,
  134. .suspend = bma222_suspend,
  135. .resume = bma222_resume,
  136. .id_table = bma222_i2c_id,
  137. /* .address_data = &bma222_addr_data, */
  138. };
  139. /*----------------------------------------------------------------------------*/
  140. static struct i2c_client *bma222_i2c_client;
  141. static struct bma222_i2c_data *obj_i2c_data;
  142. static bool sensor_power = true;
  143. static int sensor_suspend;
  144. static struct GSENSOR_VECTOR3D gsensor_gain;
  145. /* static char selftestRes[8]= {0}; */
  146. static DEFINE_MUTEX(gsensor_mutex);
  147. static DEFINE_MUTEX(gsensor_scp_en_mutex);
  148. static bool enable_status;
  149. static int gsensor_init_flag = -1; /* 0<==>OK -1 <==> fail */
  150. static struct acc_init_info bma222_init_info = {
  151. .name = BMA222_DEV_NAME,
  152. .init = gsensor_local_init,
  153. .uninit = gsensor_remove,
  154. };
  155. /*----------------------------------------------------------------------------*/
  156. #define BMA222E_DEBUG 0
  157. #define GSE_TAG "[Gsensor] "
  158. #define GSE_ERR(fmt, args...) pr_err(GSE_TAG"%s %d : "fmt, __func__, __LINE__, ##args)
  159. #define GSE_FUN(f) pr_debug(GSE_TAG"%s\n", __func__)
  160. #if BMA222E_DEBUG
  161. #define GSE_LOG(fmt, args...) pr_debug(GSE_TAG fmt, ##args)
  162. #else
  163. #define GSE_LOG(fmt, args...)
  164. #endif
  165. struct acc_hw accel_cust;
  166. static struct acc_hw *hw = &accel_cust;
  167. /*----------------------------------------------------------------------------*/
  168. static struct data_resolution bma222_data_resolution[1] = {
  169. /* combination by {FULL_RES,RANGE} */
  170. {{15, 6}, 64},
  171. };
  172. /*----------------------------------------------------------------------------*/
  173. static struct data_resolution bma222_offset_resolution = { {15, 6}, 64 };
  174. /*----------------------------------------------------------------------------*/
  175. static int bma_i2c_read_block(struct i2c_client *client, u8 addr, u8 *data, u8 len)
  176. {
  177. u8 beg = addr;
  178. int err;
  179. struct i2c_msg msgs[2] = { {0}, {0} };
  180. mutex_lock(&gsensor_mutex);
  181. msgs[0].addr = client->addr;
  182. msgs[0].flags = 0;
  183. msgs[0].len = 1;
  184. msgs[0].buf = &beg;
  185. msgs[1].addr = client->addr;
  186. msgs[1].flags = I2C_M_RD;
  187. msgs[1].len = len;
  188. msgs[1].buf = data;
  189. if (!client) {
  190. mutex_unlock(&gsensor_mutex);
  191. return -EINVAL;
  192. } else if (len > C_I2C_FIFO_SIZE) {
  193. GSE_ERR(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE);
  194. mutex_unlock(&gsensor_mutex);
  195. return -EINVAL;
  196. }
  197. err = i2c_transfer(client->adapter, msgs, sizeof(msgs) / sizeof(msgs[0]));
  198. if (err != 2) {
  199. GSE_ERR("i2c_transfer error: (%d %p %d) %d\n", addr, data, len, err);
  200. err = -EIO;
  201. } else {
  202. err = 0;
  203. }
  204. mutex_unlock(&gsensor_mutex);
  205. return err;
  206. }
  207. EXPORT_SYMBOL(bma_i2c_read_block);
  208. static int bma_i2c_write_block(struct i2c_client *client, u8 addr, u8 *data, u8 len)
  209. { /*because address also occupies one byte, the maximum length for write is 7 bytes */
  210. int err, idx, num;
  211. char buf[C_I2C_FIFO_SIZE];
  212. err = 0;
  213. mutex_lock(&gsensor_mutex);
  214. if (!client) {
  215. mutex_unlock(&gsensor_mutex);
  216. return -EINVAL;
  217. } else if (len >= C_I2C_FIFO_SIZE) {
  218. GSE_ERR(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE);
  219. mutex_unlock(&gsensor_mutex);
  220. return -EINVAL;
  221. }
  222. num = 0;
  223. buf[num++] = addr;
  224. for (idx = 0; idx < len; idx++)
  225. buf[num++] = data[idx];
  226. err = i2c_master_send(client, buf, num);
  227. if (err < 0) {
  228. GSE_ERR("send command error!!\n");
  229. mutex_unlock(&gsensor_mutex);
  230. return -EFAULT;
  231. }
  232. mutex_unlock(&gsensor_mutex);
  233. return err;
  234. }
  235. EXPORT_SYMBOL(bma_i2c_write_block);
  236. /*----------------------------------------------------------------------------*/
  237. /*--------------------Add by Susan----------------------------------*/
  238. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  239. int BMA222_SCP_SetPowerMode(bool enable, int sensorType)
  240. {
  241. static bool gsensor_scp_en_status;
  242. static unsigned int gsensor_scp_en_map;
  243. SCP_SENSOR_HUB_DATA req;
  244. int len;
  245. int err = 0;
  246. mutex_lock(&gsensor_scp_en_mutex);
  247. if (sensorType >= 32) {
  248. GSE_ERR("Out of index!\n");
  249. return -1;
  250. }
  251. if (true == enable)
  252. gsensor_scp_en_map |= (1 << sensorType);
  253. else
  254. gsensor_scp_en_map &= ~(1 << sensorType);
  255. if (0 == gsensor_scp_en_map)
  256. enable = false;
  257. else
  258. enable = true;
  259. if (gsensor_scp_en_status != enable) {
  260. gsensor_scp_en_status = enable;
  261. req.activate_req.sensorType = ID_ACCELEROMETER;
  262. req.activate_req.action = SENSOR_HUB_ACTIVATE;
  263. req.activate_req.enable = enable;
  264. len = sizeof(req.activate_req);
  265. err = SCP_sensorHub_req_send(&req, &len, 1);
  266. if (err)
  267. GSE_ERR("SCP_sensorHub_req_send fail\n");
  268. }
  269. mutex_unlock(&gsensor_scp_en_mutex);
  270. return err;
  271. }
  272. EXPORT_SYMBOL(BMA222_SCP_SetPowerMode);
  273. #endif
  274. /*----------------------------------------------------------------------------*/
  275. /*--------------------BMA222 power control function----------------------------------*/
  276. static void BMA222_power(struct acc_hw *hw, unsigned int on)
  277. {
  278. }
  279. /*----------------------------------------------------------------------------*/
  280. /*----------------------------------------------------------------------------*/
  281. static int BMA222_SetDataResolution(struct bma222_i2c_data *obj)
  282. {
  283. obj->reso = &bma222_data_resolution[0];
  284. return 0;
  285. }
  286. /*----------------------------------------------------------------------------*/
  287. static int BMA222_ReadData(struct i2c_client *client, s16 data[BMA222_AXES_NUM])
  288. {
  289. struct bma222_i2c_data *priv = i2c_get_clientdata(client);
  290. int err = 0;
  291. #if 0 /* CONFIG_CUSTOM_KERNEL_SENSORHUB */
  292. SCP_SENSOR_HUB_DATA req;
  293. int len;
  294. #else /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  295. u8 addr = BMA222_REG_DATAXLOW;
  296. u8 buf[BMA222_DATA_LEN] = { 0 };
  297. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  298. #if 0 /* CONFIG_CUSTOM_KERNEL_SENSORHUB */
  299. req.get_data_req.sensorType = ID_ACCELEROMETER;
  300. req.get_data_req.action = SENSOR_HUB_GET_DATA;
  301. len = sizeof(req.get_data_req);
  302. err = SCP_sensorHub_req_send(&req, &len, 1);
  303. if (err) {
  304. GSE_ERR("SCP_sensorHub_req_send!\n");
  305. return err;
  306. }
  307. if (ID_ACCELEROMETER != req.get_data_rsp.sensorType ||
  308. SENSOR_HUB_GET_DATA != req.get_data_rsp.action || 0 != req.get_data_rsp.errCode) {
  309. GSE_ERR("error : %d\n", req.get_data_rsp.errCode);
  310. return req.get_data_rsp.errCode;
  311. }
  312. len -= offsetof(SCP_SENSOR_HUB_GET_DATA_RSP, int8_Data);
  313. if (6 == len) {
  314. data[BMA222_AXIS_X] = req.get_data_rsp.int16_Data[0];
  315. data[BMA222_AXIS_Y] = req.get_data_rsp.int16_Data[1];
  316. data[BMA222_AXIS_Z] = req.get_data_rsp.int16_Data[2];
  317. } else {
  318. GSE_ERR("data length fail : %d\n", len);
  319. }
  320. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  321. if (NULL == client) {
  322. err = -EINVAL;
  323. } else if (bma_i2c_read_block(client, addr, buf, 0x05)) {
  324. GSE_ERR("error: %d\n", err);
  325. } else {
  326. data[BMA222_AXIS_X] = (s16) buf[BMA222_AXIS_X * 2];
  327. data[BMA222_AXIS_Y] = (s16) buf[BMA222_AXIS_Y * 2];
  328. data[BMA222_AXIS_Z] = (s16) buf[BMA222_AXIS_Z * 2];
  329. if (atomic_read(&priv->trace) & ADX_TRC_RAWDATA) {
  330. GSE_LOG("[%08X %08X %08X] => [%5d %5d %5d] before\n", data[BMA222_AXIS_X],
  331. data[BMA222_AXIS_Y], data[BMA222_AXIS_Z], data[BMA222_AXIS_X],
  332. data[BMA222_AXIS_Y], data[BMA222_AXIS_Z]);
  333. }
  334. if (data[BMA222_AXIS_X] & 0x80) {
  335. data[BMA222_AXIS_X] = ~data[BMA222_AXIS_X];
  336. data[BMA222_AXIS_X] &= 0xff;
  337. data[BMA222_AXIS_X] += 1;
  338. data[BMA222_AXIS_X] = -data[BMA222_AXIS_X];
  339. }
  340. if (data[BMA222_AXIS_Y] & 0x80) {
  341. data[BMA222_AXIS_Y] = ~data[BMA222_AXIS_Y];
  342. data[BMA222_AXIS_Y] &= 0xff;
  343. data[BMA222_AXIS_Y] += 1;
  344. data[BMA222_AXIS_Y] = -data[BMA222_AXIS_Y];
  345. }
  346. if (data[BMA222_AXIS_Z] & 0x80) {
  347. data[BMA222_AXIS_Z] = ~data[BMA222_AXIS_Z];
  348. data[BMA222_AXIS_Z] &= 0xff;
  349. data[BMA222_AXIS_Z] += 1;
  350. data[BMA222_AXIS_Z] = -data[BMA222_AXIS_Z];
  351. }
  352. if (atomic_read(&priv->trace) & ADX_TRC_RAWDATA) {
  353. GSE_LOG("[%08X %08X %08X] => [%5d %5d %5d] after\n", data[BMA222_AXIS_X],
  354. data[BMA222_AXIS_Y], data[BMA222_AXIS_Z], data[BMA222_AXIS_X],
  355. data[BMA222_AXIS_Y], data[BMA222_AXIS_Z]);
  356. }
  357. #ifdef CONFIG_BMA222_LOWPASS
  358. if (atomic_read(&priv->filter)) {
  359. if (atomic_read(&priv->fir_en) && !atomic_read(&priv->suspend)) {
  360. int idx, firlen = atomic_read(&priv->firlen);
  361. if (priv->fir.num < firlen) {
  362. priv->fir.raw[priv->fir.num][BMA222_AXIS_X] =
  363. data[BMA222_AXIS_X];
  364. priv->fir.raw[priv->fir.num][BMA222_AXIS_Y] =
  365. data[BMA222_AXIS_Y];
  366. priv->fir.raw[priv->fir.num][BMA222_AXIS_Z] =
  367. data[BMA222_AXIS_Z];
  368. priv->fir.sum[BMA222_AXIS_X] += data[BMA222_AXIS_X];
  369. priv->fir.sum[BMA222_AXIS_Y] += data[BMA222_AXIS_Y];
  370. priv->fir.sum[BMA222_AXIS_Z] += data[BMA222_AXIS_Z];
  371. if (atomic_read(&priv->trace) & ADX_TRC_FILTER) {
  372. GSE_LOG
  373. ("add [%2d] [%5d %5d %5d] => [%5d %5d %5d]\n",
  374. priv->fir.num,
  375. priv->fir.raw[priv->fir.num][BMA222_AXIS_X],
  376. priv->fir.raw[priv->fir.num][BMA222_AXIS_Y],
  377. priv->fir.raw[priv->fir.num][BMA222_AXIS_Z],
  378. priv->fir.sum[BMA222_AXIS_X],
  379. priv->fir.sum[BMA222_AXIS_Y],
  380. priv->fir.sum[BMA222_AXIS_Z]);
  381. }
  382. priv->fir.num++;
  383. priv->fir.idx++;
  384. } else {
  385. idx = priv->fir.idx % firlen;
  386. priv->fir.sum[BMA222_AXIS_X] -=
  387. priv->fir.raw[idx][BMA222_AXIS_X];
  388. priv->fir.sum[BMA222_AXIS_Y] -=
  389. priv->fir.raw[idx][BMA222_AXIS_Y];
  390. priv->fir.sum[BMA222_AXIS_Z] -=
  391. priv->fir.raw[idx][BMA222_AXIS_Z];
  392. priv->fir.raw[idx][BMA222_AXIS_X] = data[BMA222_AXIS_X];
  393. priv->fir.raw[idx][BMA222_AXIS_Y] = data[BMA222_AXIS_Y];
  394. priv->fir.raw[idx][BMA222_AXIS_Z] = data[BMA222_AXIS_Z];
  395. priv->fir.sum[BMA222_AXIS_X] += data[BMA222_AXIS_X];
  396. priv->fir.sum[BMA222_AXIS_Y] += data[BMA222_AXIS_Y];
  397. priv->fir.sum[BMA222_AXIS_Z] += data[BMA222_AXIS_Z];
  398. priv->fir.idx++;
  399. data[BMA222_AXIS_X] = priv->fir.sum[BMA222_AXIS_X] / firlen;
  400. data[BMA222_AXIS_Y] = priv->fir.sum[BMA222_AXIS_Y] / firlen;
  401. data[BMA222_AXIS_Z] = priv->fir.sum[BMA222_AXIS_Z] / firlen;
  402. if (atomic_read(&priv->trace) & ADX_TRC_FILTER) {
  403. GSE_LOG
  404. ("add [%2d] [%5d %5d %5d] => [%5d %5d %5d] : [%5d %5d %5d]\n",
  405. idx, priv->fir.raw[idx][BMA222_AXIS_X],
  406. priv->fir.raw[idx][BMA222_AXIS_Y],
  407. priv->fir.raw[idx][BMA222_AXIS_Z],
  408. priv->fir.sum[BMA222_AXIS_X],
  409. priv->fir.sum[BMA222_AXIS_Y],
  410. priv->fir.sum[BMA222_AXIS_Z],
  411. data[BMA222_AXIS_X], data[BMA222_AXIS_Y],
  412. data[BMA222_AXIS_Z]);
  413. }
  414. }
  415. }
  416. }
  417. #endif
  418. }
  419. return err;
  420. }
  421. /*----------------------------------------------------------------------------*/
  422. static int BMA222_ReadOffset(struct i2c_client *client, s8 ofs[BMA222_AXES_NUM])
  423. {
  424. int err;
  425. err = 0;
  426. #ifdef SW_CALIBRATION
  427. ofs[0] = ofs[1] = ofs[2] = 0x0;
  428. #else
  429. err = bma_i2c_read_block(client, BMA222_REG_OFSX, ofs, BMA222_AXES_NUM);
  430. if (err)
  431. GSE_ERR("error: %d\n", err);
  432. #endif
  433. /* GSE_LOG("offesx=%x, y=%x, z=%x",ofs[0],ofs[1],ofs[2]); */
  434. return err;
  435. }
  436. /*----------------------------------------------------------------------------*/
  437. static int BMA222_ResetCalibration(struct i2c_client *client)
  438. {
  439. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  440. /* u8 ofs[4]={0,0,0,0}; */
  441. int err = 0;
  442. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  443. SCP_SENSOR_HUB_DATA data;
  444. union BMA222_CUST_DATA *pCustData;
  445. unsigned int len;
  446. #endif
  447. #ifdef GSENSOR_UT
  448. GSE_FUN();
  449. #endif
  450. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  451. if (0 != obj->SCP_init_done) {
  452. pCustData = (union BMA222_CUST_DATA *) &data.set_cust_req.custData;
  453. data.set_cust_req.sensorType = ID_ACCELEROMETER;
  454. data.set_cust_req.action = SENSOR_HUB_SET_CUST;
  455. pCustData->resetCali.action = BMA222_CUST_ACTION_RESET_CALI;
  456. len =
  457. offsetof(SCP_SENSOR_HUB_SET_CUST_REQ, custData) + sizeof(pCustData->resetCali);
  458. SCP_sensorHub_req_send(&data, &len, 1);
  459. }
  460. #endif
  461. memset(obj->cali_sw, 0x00, sizeof(obj->cali_sw));
  462. memset(obj->offset, 0x00, sizeof(obj->offset));
  463. return err;
  464. }
  465. /*----------------------------------------------------------------------------*/
  466. static int BMA222_ReadCalibration(struct i2c_client *client, int dat[BMA222_AXES_NUM])
  467. {
  468. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  469. int err = 0;
  470. int mul;
  471. GSE_FUN();
  472. #ifdef SW_CALIBRATION
  473. mul = 0; /* only SW Calibration, disable HW Calibration */
  474. #else
  475. err = BMA222_ReadOffset(client, obj->offset);
  476. if (err) {
  477. GSE_ERR("read offset fail, %d\n", err);
  478. return err;
  479. }
  480. mul = obj->reso->sensitivity / bma222_offset_resolution.sensitivity;
  481. #endif
  482. dat[obj->cvt.map[BMA222_AXIS_X]] =
  483. obj->cvt.sign[BMA222_AXIS_X] * (obj->offset[BMA222_AXIS_X] * mul +
  484. obj->cali_sw[BMA222_AXIS_X]);
  485. dat[obj->cvt.map[BMA222_AXIS_Y]] =
  486. obj->cvt.sign[BMA222_AXIS_Y] * (obj->offset[BMA222_AXIS_Y] * mul +
  487. obj->cali_sw[BMA222_AXIS_Y]);
  488. dat[obj->cvt.map[BMA222_AXIS_Z]] =
  489. obj->cvt.sign[BMA222_AXIS_Z] * (obj->offset[BMA222_AXIS_Z] * mul +
  490. obj->cali_sw[BMA222_AXIS_Z]);
  491. return err;
  492. }
  493. /*----------------------------------------------------------------------------*/
  494. static int BMA222_ReadCalibrationEx(struct i2c_client *client, int act[BMA222_AXES_NUM],
  495. int raw[BMA222_AXES_NUM])
  496. {
  497. /*raw: the raw calibration data; act: the actual calibration data */
  498. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  499. int err;
  500. int mul;
  501. err = 0;
  502. #ifdef SW_CALIBRATION
  503. mul = 0; /* only SW Calibration, disable HW Calibration */
  504. #else
  505. err = BMA222_ReadOffset(client, obj->offset);
  506. if (err) {
  507. GSE_ERR("read offset fail, %d\n", err);
  508. return err;
  509. }
  510. mul = obj->reso->sensitivity / bma222_offset_resolution.sensitivity;
  511. #endif
  512. raw[BMA222_AXIS_X] = obj->offset[BMA222_AXIS_X] * mul + obj->cali_sw[BMA222_AXIS_X];
  513. raw[BMA222_AXIS_Y] = obj->offset[BMA222_AXIS_Y] * mul + obj->cali_sw[BMA222_AXIS_Y];
  514. raw[BMA222_AXIS_Z] = obj->offset[BMA222_AXIS_Z] * mul + obj->cali_sw[BMA222_AXIS_Z];
  515. act[obj->cvt.map[BMA222_AXIS_X]] = obj->cvt.sign[BMA222_AXIS_X] * raw[BMA222_AXIS_X];
  516. act[obj->cvt.map[BMA222_AXIS_Y]] = obj->cvt.sign[BMA222_AXIS_Y] * raw[BMA222_AXIS_Y];
  517. act[obj->cvt.map[BMA222_AXIS_Z]] = obj->cvt.sign[BMA222_AXIS_Z] * raw[BMA222_AXIS_Z];
  518. return 0;
  519. }
  520. /*----------------------------------------------------------------------------*/
  521. static int BMA222_WriteCalibration(struct i2c_client *client, int dat[BMA222_AXES_NUM])
  522. {
  523. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  524. int err = 0;
  525. int cali[BMA222_AXES_NUM], raw[BMA222_AXES_NUM];
  526. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  527. SCP_SENSOR_HUB_DATA data;
  528. union BMA222_CUST_DATA *pCustData;
  529. unsigned int len;
  530. #endif
  531. err = BMA222_ReadCalibrationEx(client, cali, raw);
  532. if (0 != err) { /*offset will be updated in obj->offset */
  533. GSE_ERR("read offset fail, %d\n", err);
  534. return err;
  535. }
  536. GSE_LOG("OLDOFF: (%+3d %+3d %+3d): (%+3d %+3d %+3d) / (%+3d %+3d %+3d)\n",
  537. raw[BMA222_AXIS_X], raw[BMA222_AXIS_Y], raw[BMA222_AXIS_Z],
  538. obj->offset[BMA222_AXIS_X], obj->offset[BMA222_AXIS_Y], obj->offset[BMA222_AXIS_Z],
  539. obj->cali_sw[BMA222_AXIS_X], obj->cali_sw[BMA222_AXIS_Y],
  540. obj->cali_sw[BMA222_AXIS_Z]);
  541. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  542. pCustData = (union BMA222_CUST_DATA *) data.set_cust_req.custData;
  543. data.set_cust_req.sensorType = ID_ACCELEROMETER;
  544. data.set_cust_req.action = SENSOR_HUB_SET_CUST;
  545. pCustData->setCali.action = BMA222_CUST_ACTION_SET_CALI;
  546. pCustData->setCali.data[BMA222_AXIS_X] = dat[BMA222_AXIS_X];
  547. pCustData->setCali.data[BMA222_AXIS_Y] = dat[BMA222_AXIS_Y];
  548. pCustData->setCali.data[BMA222_AXIS_Z] = dat[BMA222_AXIS_Z];
  549. len = offsetof(SCP_SENSOR_HUB_SET_CUST_REQ, custData) + sizeof(pCustData->setCali);
  550. SCP_sensorHub_req_send(&data, &len, 1);
  551. #endif
  552. /*calculate the real offset expected by caller */
  553. cali[BMA222_AXIS_X] += dat[BMA222_AXIS_X];
  554. cali[BMA222_AXIS_Y] += dat[BMA222_AXIS_Y];
  555. cali[BMA222_AXIS_Z] += dat[BMA222_AXIS_Z];
  556. GSE_LOG("UPDATE: (%+3d %+3d %+3d)\n",
  557. dat[BMA222_AXIS_X], dat[BMA222_AXIS_Y], dat[BMA222_AXIS_Z]);
  558. #ifdef SW_CALIBRATION
  559. obj->cali_sw[BMA222_AXIS_X] =
  560. obj->cvt.sign[BMA222_AXIS_X] * (cali[obj->cvt.map[BMA222_AXIS_X]]);
  561. obj->cali_sw[BMA222_AXIS_Y] =
  562. obj->cvt.sign[BMA222_AXIS_Y] * (cali[obj->cvt.map[BMA222_AXIS_Y]]);
  563. obj->cali_sw[BMA222_AXIS_Z] =
  564. obj->cvt.sign[BMA222_AXIS_Z] * (cali[obj->cvt.map[BMA222_AXIS_Z]]);
  565. #else
  566. int divisor = obj->reso->sensitivity / lsb; /* modified */
  567. obj->offset[BMA222_AXIS_X] =
  568. (s8) (obj->cvt.sign[BMA222_AXIS_X] * (cali[obj->cvt.map[BMA222_AXIS_X]]) / (divisor));
  569. obj->offset[BMA222_AXIS_Y] =
  570. (s8) (obj->cvt.sign[BMA222_AXIS_Y] * (cali[obj->cvt.map[BMA222_AXIS_Y]]) / (divisor));
  571. obj->offset[BMA222_AXIS_Z] =
  572. (s8) (obj->cvt.sign[BMA222_AXIS_Z] * (cali[obj->cvt.map[BMA222_AXIS_Z]]) / (divisor));
  573. /*convert software calibration using standard calibration */
  574. obj->cali_sw[BMA222_AXIS_X] =
  575. obj->cvt.sign[BMA222_AXIS_X] * (cali[obj->cvt.map[BMA222_AXIS_X]]) % (divisor);
  576. obj->cali_sw[BMA222_AXIS_Y] =
  577. obj->cvt.sign[BMA222_AXIS_Y] * (cali[obj->cvt.map[BMA222_AXIS_Y]]) % (divisor);
  578. obj->cali_sw[BMA222_AXIS_Z] =
  579. obj->cvt.sign[BMA222_AXIS_Z] * (cali[obj->cvt.map[BMA222_AXIS_Z]]) % (divisor);
  580. GSE_LOG("NEWOFF: (%+3d %+3d %+3d): (%+3d %+3d %+3d) / (%+3d %+3d %+3d)\n",
  581. obj->offset[BMA222_AXIS_X] * divisor + obj->cali_sw[BMA222_AXIS_X],
  582. obj->offset[BMA222_AXIS_Y] * divisor + obj->cali_sw[BMA222_AXIS_Y],
  583. obj->offset[BMA222_AXIS_Z] * divisor + obj->cali_sw[BMA222_AXIS_Z],
  584. obj->offset[BMA222_AXIS_X], obj->offset[BMA222_AXIS_Y], obj->offset[BMA222_AXIS_Z],
  585. obj->cali_sw[BMA222_AXIS_X], obj->cali_sw[BMA222_AXIS_Y],
  586. obj->cali_sw[BMA222_AXIS_Z]);
  587. err = hwmsen_write_block(obj->client, BMA222_REG_OFSX, obj->offset, BMA222_AXES_NUM);
  588. if (err) {
  589. GSE_ERR("write offset fail: %d\n", err);
  590. return err;
  591. }
  592. #endif
  593. mdelay(1);
  594. return err;
  595. }
  596. /*----------------------------------------------------------------------------*/
  597. static int BMA222_CheckDeviceID(struct i2c_client *client)
  598. {
  599. u8 databuf[2] = { 0 };
  600. int res = 0;
  601. res = bma_i2c_read_block(client, BMA222_REG_DEVID, databuf, 0x1);
  602. if (res < 0)
  603. goto exit_BMA222_CheckDeviceID;
  604. GSE_LOG("BMA222_CheckDeviceID %d done!\n ", databuf[0]);
  605. exit_BMA222_CheckDeviceID:
  606. if (res < 0) {
  607. GSE_ERR("BMA222_CheckDeviceID %d failt!\n ", BMA222_ERR_I2C);
  608. return BMA222_ERR_I2C;
  609. }
  610. mdelay(1);
  611. return BMA222_SUCCESS;
  612. }
  613. /*----------------------------------------------------------------------------*/
  614. static int BMA222_SetPowerMode(struct i2c_client *client, bool enable)
  615. {
  616. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  617. int res = 0;
  618. u8 databuf[2];
  619. u8 addr = BMA222_REG_POWER_CTL;
  620. if (enable == sensor_power) {
  621. GSE_LOG("Sensor power status is newest!\n");
  622. return BMA222_SUCCESS;
  623. }
  624. if (bma_i2c_read_block(client, addr, databuf, 0x01)) {
  625. GSE_ERR("read power ctl register err!\n");
  626. return BMA222_ERR_I2C;
  627. }
  628. GSE_LOG("set power mode value = 0x%x!\n", databuf[0]);
  629. mdelay(1);
  630. if (enable)
  631. databuf[0] &= ~BMA222_MEASURE_MODE;
  632. else
  633. databuf[0] |= BMA222_MEASURE_MODE;
  634. res = bma_i2c_write_block(client, BMA222_REG_POWER_CTL, databuf, 0x1);
  635. if (res < 0) {
  636. GSE_LOG("set power mode failed!\n");
  637. return BMA222_ERR_I2C;
  638. } else if (atomic_read(&obj->trace) & ADX_TRC_INFO) {
  639. GSE_LOG("set power mode ok %d!\n", databuf[1]);
  640. }
  641. sensor_power = enable;
  642. mdelay(1);
  643. /* GSE_LOG("leave Sensor power status is sensor_power = %d\n",sensor_power); */
  644. return BMA222_SUCCESS;
  645. }
  646. /*----------------------------------------------------------------------------*/
  647. static int BMA222_SetDataFormat(struct i2c_client *client, u8 dataformat)
  648. {
  649. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  650. u8 databuf[10] = { 0 };
  651. int res = 0;
  652. if (bma_i2c_read_block(client, BMA222_REG_DATA_FORMAT, databuf, 0x01)) {
  653. GSE_ERR("bma222 read Dataformat failt\n");
  654. return BMA222_ERR_I2C;
  655. }
  656. mdelay(1);
  657. databuf[0] &= ~BMA222_RANGE_MASK;
  658. databuf[0] |= dataformat;
  659. res = bma_i2c_write_block(client, BMA222_REG_DATA_FORMAT, databuf, 0x1);
  660. if (res < 0)
  661. return BMA222_ERR_I2C;
  662. /* GSE_LOG("BMA222_SetDataFormat OK!\n"); */
  663. mdelay(1);
  664. return BMA222_SetDataResolution(obj);
  665. }
  666. /*----------------------------------------------------------------------------*/
  667. static int BMA222_SetBWRate(struct i2c_client *client, u8 bwrate)
  668. {
  669. u8 databuf[10] = { 0 };
  670. int res = 0;
  671. if (bma_i2c_read_block(client, BMA222_REG_BW_RATE, databuf, 0x01)) {
  672. GSE_ERR("bma222 read rate failt\n");
  673. return BMA222_ERR_I2C;
  674. }
  675. mdelay(1);
  676. databuf[0] &= ~BMA222_BW_MASK;
  677. databuf[0] |= bwrate;
  678. res = bma_i2c_write_block(client, BMA222_REG_BW_RATE, databuf, 0x1);
  679. if (res < 0)
  680. return BMA222_ERR_I2C;
  681. mdelay(1);
  682. /* GSE_LOG("BMA222_SetBWRate OK!\n"); */
  683. return BMA222_SUCCESS;
  684. }
  685. /*----------------------------------------------------------------------------*/
  686. static int BMA222_SetIntEnable(struct i2c_client *client, u8 intenable)
  687. {
  688. /* u8 databuf[10]; */
  689. int res = 0;
  690. res = hwmsen_write_byte(client, BMA222_INT_REG_1, 0x00);
  691. if (res != BMA222_SUCCESS)
  692. return res;
  693. mdelay(1);
  694. res = hwmsen_write_byte(client, BMA222_INT_REG_2, 0x00);
  695. if (res != BMA222_SUCCESS)
  696. return res;
  697. /* GSE_LOG("BMA222 disable interrupt ...\n"); */
  698. /*for disable interrupt function */
  699. mdelay(1);
  700. return BMA222_SUCCESS;
  701. }
  702. /*----------------------------------------------------------------------------*/
  703. static int bma222_init_client(struct i2c_client *client, int reset_cali)
  704. {
  705. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  706. int res = 0;
  707. /*GSE_FUN();*/
  708. res = BMA222_CheckDeviceID(client);
  709. if (res != BMA222_SUCCESS)
  710. return res;
  711. /* GSE_LOG("BMA222_CheckDeviceID ok\n"); */
  712. res = BMA222_SetBWRate(client, BMA222_BW_100HZ);
  713. if (res != BMA222_SUCCESS)
  714. return res;
  715. /* GSE_LOG("BMA222_SetBWRate OK!\n"); */
  716. res = BMA222_SetDataFormat(client, BMA222_RANGE_2G);
  717. if (res != BMA222_SUCCESS)
  718. return res;
  719. /* GSE_LOG("BMA222_SetDataFormat OK!\n"); */
  720. gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = obj->reso->sensitivity;
  721. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  722. res = gsensor_setup_irq();
  723. if (res != BMA222_SUCCESS)
  724. return res;
  725. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  726. res = BMA222_SetIntEnable(client, 0x00);
  727. if (res != BMA222_SUCCESS)
  728. return res;
  729. /* GSE_LOG("BMA222 disable interrupt function!\n"); */
  730. res = BMA222_SetPowerMode(client, enable_status); /* false);// */
  731. if (res != BMA222_SUCCESS)
  732. return res;
  733. /* GSE_LOG("BMA222_SetPowerMode OK!\n"); */
  734. if (0 != reset_cali) {
  735. /*reset calibration only in power on */
  736. res = BMA222_ResetCalibration(client);
  737. if (res != BMA222_SUCCESS)
  738. return res;
  739. }
  740. GSE_LOG("bma222_init_client OK!\n");
  741. #ifdef CONFIG_BMA222_LOWPASS
  742. memset(&obj->fir, 0x00, sizeof(obj->fir));
  743. #endif
  744. return BMA222_SUCCESS;
  745. }
  746. /*----------------------------------------------------------------------------*/
  747. static int BMA222_ReadChipInfo(struct i2c_client *client, char *buf, int bufsize)
  748. {
  749. u8 databuf[10];
  750. memset(databuf, 0, sizeof(u8) * 10);
  751. if ((NULL == buf) || (bufsize <= 30))
  752. return -1;
  753. if (NULL == client) {
  754. *buf = 0;
  755. return -2;
  756. }
  757. sprintf(buf, "BMA222 Chip");
  758. return 0;
  759. }
  760. /*----------------------------------------------------------------------------*/
  761. static int BMA222_ReadSensorData(struct i2c_client *client, char *buf, int bufsize)
  762. {
  763. struct bma222_i2c_data *obj = (struct bma222_i2c_data *)i2c_get_clientdata(client);
  764. u8 databuf[20];
  765. int acc[BMA222_AXES_NUM];
  766. int res = 0;
  767. memset(databuf, 0, sizeof(u8) * 10);
  768. if (NULL == buf)
  769. return -1;
  770. if (NULL == client) {
  771. *buf = 0;
  772. return -2;
  773. }
  774. if (sensor_suspend == 1)
  775. return 0;
  776. res = BMA222_ReadData(client, obj->data);
  777. if (res != 0) {
  778. GSE_ERR("I2C error: ret value=%d", res);
  779. return -3;
  780. }
  781. #if 0 /* CONFIG_CUSTOM_KERNEL_SENSORHUB */
  782. acc[BMA222_AXIS_X] = obj->data[BMA222_AXIS_X];
  783. acc[BMA222_AXIS_Y] = obj->data[BMA222_AXIS_Y];
  784. acc[BMA222_AXIS_Z] = obj->data[BMA222_AXIS_Z];
  785. /* data has been calibrated in SCP side. */
  786. #else /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  787. obj->data[BMA222_AXIS_X] += obj->cali_sw[BMA222_AXIS_X];
  788. obj->data[BMA222_AXIS_Y] += obj->cali_sw[BMA222_AXIS_Y];
  789. obj->data[BMA222_AXIS_Z] += obj->cali_sw[BMA222_AXIS_Z];
  790. acc[obj->cvt.map[BMA222_AXIS_X]] =
  791. obj->cvt.sign[BMA222_AXIS_X] * obj->data[BMA222_AXIS_X];
  792. acc[obj->cvt.map[BMA222_AXIS_Y]] =
  793. obj->cvt.sign[BMA222_AXIS_Y] * obj->data[BMA222_AXIS_Y];
  794. acc[obj->cvt.map[BMA222_AXIS_Z]] =
  795. obj->cvt.sign[BMA222_AXIS_Z] * obj->data[BMA222_AXIS_Z];
  796. acc[BMA222_AXIS_X] =
  797. acc[BMA222_AXIS_X] * GRAVITY_EARTH_1000 / obj->reso->sensitivity;
  798. acc[BMA222_AXIS_Y] =
  799. acc[BMA222_AXIS_Y] * GRAVITY_EARTH_1000 / obj->reso->sensitivity;
  800. acc[BMA222_AXIS_Z] =
  801. acc[BMA222_AXIS_Z] * GRAVITY_EARTH_1000 / obj->reso->sensitivity;
  802. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  803. sprintf(buf, "%04x %04x %04x", acc[BMA222_AXIS_X], acc[BMA222_AXIS_Y],
  804. acc[BMA222_AXIS_Z]);
  805. if (atomic_read(&obj->trace) & ADX_TRC_IOCTL)
  806. GSE_LOG("gsensor data: %s!\n", buf);
  807. return 0;
  808. }
  809. /*----------------------------------------------------------------------------*/
  810. static int BMA222_ReadRawData(struct i2c_client *client, char *buf)
  811. {
  812. struct bma222_i2c_data *obj;
  813. int res = 0;
  814. obj = (struct bma222_i2c_data *)i2c_get_clientdata(client);
  815. if (!buf || !client)
  816. return -EINVAL;
  817. res = BMA222_ReadData(client, obj->data);
  818. if (0 != res) {
  819. GSE_ERR("I2C error: ret value=%d", res);
  820. return -EIO;
  821. }
  822. sprintf(buf, "BMA222_ReadRawData %04x %04x %04x", obj->data[BMA222_AXIS_X],
  823. obj->data[BMA222_AXIS_Y], obj->data[BMA222_AXIS_Z]);
  824. return 0;
  825. }
  826. /*----------------------------------------------------------------------------*/
  827. static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf)
  828. {
  829. struct i2c_client *client = bma222_i2c_client;
  830. char strbuf[BMA222_BUFSIZE];
  831. if (NULL == client) {
  832. GSE_ERR("i2c client is null!!\n");
  833. return 0;
  834. }
  835. BMA222_ReadChipInfo(client, strbuf, BMA222_BUFSIZE);
  836. return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
  837. }
  838. #if 0
  839. static ssize_t gsensor_init(struct device_driver *ddri, char *buf, size_t count)
  840. {
  841. struct i2c_client *client = bma222_i2c_client;
  842. char strbuf[BMA222_BUFSIZE];
  843. if (NULL == client) {
  844. GSE_ERR("i2c client is null!!\n");
  845. return 0;
  846. }
  847. bma222_init_client(client, 1);
  848. return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
  849. }
  850. #endif
  851. /*----------------------------------------------------------------------------*/
  852. static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf)
  853. {
  854. struct i2c_client *client = bma222_i2c_client;
  855. char strbuf[BMA222_BUFSIZE];
  856. if (NULL == client) {
  857. GSE_ERR("i2c client is null!!\n");
  858. return 0;
  859. }
  860. BMA222_ReadSensorData(client, strbuf, BMA222_BUFSIZE);
  861. /* BMA150_ReadRawData(client, strbuf); */
  862. return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
  863. }
  864. #if 0
  865. static ssize_t show_sensorrawdata_value(struct device_driver *ddri, char *buf, size_t count)
  866. {
  867. struct i2c_client *client = bma222_i2c_client;
  868. char strbuf[BMA222_BUFSIZE];
  869. if (NULL == client) {
  870. GSE_ERR("i2c client is null!!\n");
  871. return 0;
  872. }
  873. /* BMA150_ReadSensorData(client, strbuf, BMA150_BUFSIZE); */
  874. BMA222_ReadRawData(client, strbuf);
  875. return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
  876. }
  877. #endif
  878. /*----------------------------------------------------------------------------*/
  879. #if 1
  880. static ssize_t show_cali_value(struct device_driver *ddri, char *buf)
  881. {
  882. struct i2c_client *client = bma222_i2c_client;
  883. struct bma222_i2c_data *obj;
  884. int err, len = 0, mul;
  885. int tmp[BMA222_AXES_NUM];
  886. if (NULL == client) {
  887. GSE_ERR("i2c client is null!!\n");
  888. return 0;
  889. }
  890. obj = i2c_get_clientdata(client);
  891. err = BMA222_ReadOffset(client, obj->offset);
  892. if (0 != err)
  893. return -EINVAL;
  894. err = BMA222_ReadCalibration(client, tmp);
  895. if (0 != err)
  896. return -EINVAL;
  897. mul = obj->reso->sensitivity / bma222_offset_resolution.sensitivity;
  898. len +=
  899. snprintf(buf + len, PAGE_SIZE - len,
  900. "[HW ][%d] (%+3d, %+3d, %+3d) : (0x%02X, 0x%02X, 0x%02X)\n", mul,
  901. obj->offset[BMA222_AXIS_X], obj->offset[BMA222_AXIS_Y],
  902. obj->offset[BMA222_AXIS_Z], obj->offset[BMA222_AXIS_X],
  903. obj->offset[BMA222_AXIS_Y], obj->offset[BMA222_AXIS_Z]);
  904. len +=
  905. snprintf(buf + len, PAGE_SIZE - len, "[SW ][%d] (%+3d, %+3d, %+3d)\n", 1,
  906. obj->cali_sw[BMA222_AXIS_X], obj->cali_sw[BMA222_AXIS_Y],
  907. obj->cali_sw[BMA222_AXIS_Z]);
  908. len +=
  909. snprintf(buf + len, PAGE_SIZE - len,
  910. "[ALL] (%+3d, %+3d, %+3d) : (%+3d, %+3d, %+3d)\n",
  911. obj->offset[BMA222_AXIS_X] * mul + obj->cali_sw[BMA222_AXIS_X],
  912. obj->offset[BMA222_AXIS_Y] * mul + obj->cali_sw[BMA222_AXIS_Y],
  913. obj->offset[BMA222_AXIS_Z] * mul + obj->cali_sw[BMA222_AXIS_Z],
  914. tmp[BMA222_AXIS_X], tmp[BMA222_AXIS_Y], tmp[BMA222_AXIS_Z]);
  915. return len;
  916. }
  917. /*----------------------------------------------------------------------------*/
  918. static ssize_t store_cali_value(struct device_driver *ddri, const char *buf, size_t count)
  919. {
  920. struct i2c_client *client = bma222_i2c_client;
  921. int err, x, y, z;
  922. int dat[BMA222_AXES_NUM];
  923. if (!strncmp(buf, "rst", 3)) {
  924. err = BMA222_ResetCalibration(client);
  925. if (0 != err)
  926. GSE_ERR("reset offset err = %d\n", err);
  927. } else if (3 == sscanf(buf, "0x%02X 0x%02X 0x%02X", &x, &y, &z)) {
  928. dat[BMA222_AXIS_X] = x;
  929. dat[BMA222_AXIS_Y] = y;
  930. dat[BMA222_AXIS_Z] = z;
  931. err = BMA222_WriteCalibration(client, dat);
  932. if (0 != err)
  933. GSE_ERR("write calibration err = %d\n", err);
  934. } else {
  935. GSE_ERR("invalid format\n");
  936. }
  937. return count;
  938. }
  939. #endif
  940. /*----------------------------------------------------------------------------*/
  941. static ssize_t show_firlen_value(struct device_driver *ddri, char *buf)
  942. {
  943. #ifdef CONFIG_BMA222_LOWPASS
  944. struct i2c_client *client = bma222_i2c_client;
  945. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  946. if (atomic_read(&obj->firlen)) {
  947. int idx, len = atomic_read(&obj->firlen);
  948. GSE_LOG("len = %2d, idx = %2d\n", obj->fir.num, obj->fir.idx);
  949. for (idx = 0; idx < len; idx++) {
  950. GSE_LOG("[%5d %5d %5d]\n", obj->fir.raw[idx][BMA222_AXIS_X],
  951. obj->fir.raw[idx][BMA222_AXIS_Y], obj->fir.raw[idx][BMA222_AXIS_Z]);
  952. }
  953. GSE_LOG("sum = [%5d %5d %5d]\n", obj->fir.sum[BMA222_AXIS_X],
  954. obj->fir.sum[BMA222_AXIS_Y], obj->fir.sum[BMA222_AXIS_Z]);
  955. GSE_LOG("avg = [%5d %5d %5d]\n", obj->fir.sum[BMA222_AXIS_X] / len,
  956. obj->fir.sum[BMA222_AXIS_Y] / len, obj->fir.sum[BMA222_AXIS_Z] / len);
  957. }
  958. return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&obj->firlen));
  959. #else
  960. return snprintf(buf, PAGE_SIZE, "not support\n");
  961. #endif
  962. }
  963. /*----------------------------------------------------------------------------*/
  964. static ssize_t store_firlen_value(struct device_driver *ddri, const char *buf, size_t count)
  965. {
  966. #ifdef CONFIG_BMA222_LOWPASS
  967. struct i2c_client *client = bma222_i2c_client;
  968. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  969. int firlen;
  970. if (!kstrtoint(buf, 10, &firlen)) {
  971. GSE_ERR("invallid format\n");
  972. } else if (firlen > C_MAX_FIR_LENGTH) {
  973. GSE_ERR("exceeds maximum filter length\n");
  974. } else {
  975. atomic_set(&obj->firlen, firlen);
  976. if (NULL == firlen) {
  977. atomic_set(&obj->fir_en, 0);
  978. } else {
  979. memset(&obj->fir, 0x00, sizeof(obj->fir));
  980. atomic_set(&obj->fir_en, 1);
  981. }
  982. }
  983. #endif
  984. return count;
  985. }
  986. /*----------------------------------------------------------------------------*/
  987. static ssize_t show_trace_value(struct device_driver *ddri, char *buf)
  988. {
  989. ssize_t res;
  990. struct bma222_i2c_data *obj = obj_i2c_data;
  991. if (obj == NULL) {
  992. GSE_ERR("i2c_data obj is null!!\n");
  993. return 0;
  994. }
  995. res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
  996. return res;
  997. }
  998. /*----------------------------------------------------------------------------*/
  999. static ssize_t store_trace_value(struct device_driver *ddri, const char *buf, size_t count)
  1000. {
  1001. struct bma222_i2c_data *obj = obj_i2c_data;
  1002. int trace;
  1003. if (obj == NULL) {
  1004. GSE_ERR("i2c_data obj is null!!\n");
  1005. return 0;
  1006. }
  1007. if (!kstrtoint(buf, 16, &trace))
  1008. atomic_set(&obj->trace, trace);
  1009. else
  1010. GSE_ERR("invalid content: '%s', length = %d\n", buf, (int)count);
  1011. return count;
  1012. }
  1013. /*----------------------------------------------------------------------------*/
  1014. static ssize_t show_status_value(struct device_driver *ddri, char *buf)
  1015. {
  1016. ssize_t len = 0;
  1017. struct bma222_i2c_data *obj = obj_i2c_data;
  1018. if (obj == NULL) {
  1019. GSE_ERR("i2c_data obj is null!!\n");
  1020. return 0;
  1021. }
  1022. if (obj->hw) {
  1023. len += snprintf(buf + len, PAGE_SIZE - len, "CUST: %d %d (%d %d)\n",
  1024. obj->hw->i2c_num, obj->hw->direction, obj->hw->power_id,
  1025. obj->hw->power_vol);
  1026. } else {
  1027. len += snprintf(buf + len, PAGE_SIZE - len, "CUST: NULL\n");
  1028. }
  1029. return len;
  1030. }
  1031. /*----------------------------------------------------------------------------*/
  1032. static ssize_t show_power_status_value(struct device_driver *ddri, char *buf)
  1033. {
  1034. u8 databuf[2];
  1035. /* int res = 0; */
  1036. u8 addr = BMA222_REG_POWER_CTL;
  1037. struct bma222_i2c_data *obj = obj_i2c_data;
  1038. if (bma_i2c_read_block(obj->client, addr, databuf, 0x01)) {
  1039. GSE_ERR("read power ctl register err!\n");
  1040. return 1;
  1041. }
  1042. if (sensor_power)
  1043. GSE_LOG("G sensor is in work mode, sensor_power = %d\n", sensor_power);
  1044. else
  1045. GSE_LOG("G sensor is in standby mode, sensor_power = %d\n", sensor_power);
  1046. return snprintf(buf, PAGE_SIZE, "%x\n", databuf[0]);
  1047. }
  1048. static ssize_t show_chip_orientation(struct device_driver *ddri, char *pbBuf)
  1049. {
  1050. ssize_t _tLength = 0;
  1051. GSE_LOG("[%s] default direction: %d\n", __func__, hw->direction);
  1052. _tLength = snprintf(pbBuf, PAGE_SIZE, "default direction = %d\n", hw->direction);
  1053. return _tLength;
  1054. }
  1055. static ssize_t store_chip_orientation(struct device_driver *ddri, const char *pbBuf, size_t tCount)
  1056. {
  1057. int _nDirection = 0;
  1058. struct bma222_i2c_data *_pt_i2c_obj = obj_i2c_data;
  1059. if (NULL == _pt_i2c_obj)
  1060. return 0;
  1061. if (!kstrtoint(pbBuf, 10, &_nDirection)) {
  1062. if (hwmsen_get_convert(_nDirection, &_pt_i2c_obj->cvt))
  1063. GSE_ERR("ERR: fail to set direction\n");
  1064. }
  1065. GSE_LOG("[%s] set direction: %d\n", __func__, _nDirection);
  1066. return tCount;
  1067. }
  1068. /*----------------------------------------------------------------------------*/
  1069. static DRIVER_ATTR(chipinfo, S_IWUSR | S_IRUGO, show_chipinfo_value, NULL);
  1070. static DRIVER_ATTR(sensordata, S_IWUSR | S_IRUGO, show_sensordata_value, NULL);
  1071. static DRIVER_ATTR(cali, S_IWUSR | S_IRUGO, show_cali_value, store_cali_value);
  1072. static DRIVER_ATTR(firlen, S_IWUSR | S_IRUGO, show_firlen_value, store_firlen_value);
  1073. static DRIVER_ATTR(trace, S_IWUSR | S_IRUGO, show_trace_value, store_trace_value);
  1074. static DRIVER_ATTR(status, S_IRUGO, show_status_value, NULL);
  1075. static DRIVER_ATTR(powerstatus, S_IRUGO, show_power_status_value, NULL);
  1076. static DRIVER_ATTR(orientation, S_IWUSR | S_IRUGO, show_chip_orientation, store_chip_orientation);
  1077. /*----------------------------------------------------------------------------*/
  1078. static struct driver_attribute *bma222_attr_list[] = {
  1079. &driver_attr_chipinfo, /*chip information */
  1080. &driver_attr_sensordata, /*dump sensor data */
  1081. &driver_attr_cali, /*show calibration data */
  1082. &driver_attr_firlen, /*filter length: 0: disable, others: enable */
  1083. &driver_attr_trace, /*trace log */
  1084. &driver_attr_status,
  1085. &driver_attr_powerstatus,
  1086. &driver_attr_orientation,
  1087. };
  1088. /*----------------------------------------------------------------------------*/
  1089. static int bma222_create_attr(struct device_driver *driver)
  1090. {
  1091. int idx, err = 0;
  1092. int num = (int)(sizeof(bma222_attr_list) / sizeof(bma222_attr_list[0]));
  1093. if (driver == NULL)
  1094. return -EINVAL;
  1095. for (idx = 0; idx < num; idx++) {
  1096. err = driver_create_file(driver, bma222_attr_list[idx]);
  1097. if (0 != err) {
  1098. GSE_ERR("driver_create_file (%s) = %d\n", bma222_attr_list[idx]->attr.name,
  1099. err);
  1100. break;
  1101. }
  1102. }
  1103. return err;
  1104. }
  1105. /*----------------------------------------------------------------------------*/
  1106. static int bma222_delete_attr(struct device_driver *driver)
  1107. {
  1108. int idx, err = 0;
  1109. int num = (int)(sizeof(bma222_attr_list) / sizeof(bma222_attr_list[0]));
  1110. if (driver == NULL)
  1111. return -EINVAL;
  1112. for (idx = 0; idx < num; idx++)
  1113. driver_remove_file(driver, bma222_attr_list[idx]);
  1114. return err;
  1115. }
  1116. /*----------------------------------------------------------------------------*/
  1117. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1118. static void gsensor_irq_work(struct work_struct *work)
  1119. {
  1120. struct bma222_i2c_data *obj = obj_i2c_data;
  1121. struct scp_acc_hw scp_hw;
  1122. union BMA222_CUST_DATA *p_cust_data;
  1123. SCP_SENSOR_HUB_DATA data;
  1124. int max_cust_data_size_per_packet;
  1125. int i;
  1126. uint sizeOfCustData;
  1127. uint len;
  1128. char *p = (char *)&scp_hw;
  1129. GSE_FUN();
  1130. scp_hw.i2c_num = obj->hw->i2c_num;
  1131. scp_hw.direction = obj->hw->direction;
  1132. scp_hw.power_id = obj->hw->power_id;
  1133. scp_hw.power_vol = obj->hw->power_vol;
  1134. scp_hw.firlen = obj->hw->firlen;
  1135. memcpy(scp_hw.i2c_addr, obj->hw->i2c_addr, sizeof(obj->hw->i2c_addr));
  1136. scp_hw.power_vio_id = obj->hw->power_vio_id;
  1137. scp_hw.power_vio_vol = obj->hw->power_vio_vol;
  1138. scp_hw.is_batch_supported = obj->hw->is_batch_supported;
  1139. p_cust_data = (union BMA222_CUST_DATA *) data.set_cust_req.custData;
  1140. sizeOfCustData = sizeof(scp_hw);
  1141. max_cust_data_size_per_packet =
  1142. sizeof(data.set_cust_req.custData) - offsetof(struct BMA222_SET_CUST, data);
  1143. GSE_ERR("sizeOfCustData = %d, max_cust_data_size_per_packet = %d\n", sizeOfCustData,
  1144. max_cust_data_size_per_packet);
  1145. GSE_ERR("offset %d\n", offsetof(struct BMA222_SET_CUST, data));
  1146. for (i = 0; sizeOfCustData > 0; i++) {
  1147. data.set_cust_req.sensorType = ID_ACCELEROMETER;
  1148. data.set_cust_req.action = SENSOR_HUB_SET_CUST;
  1149. p_cust_data->setCust.action = BMA222_CUST_ACTION_SET_CUST;
  1150. p_cust_data->setCust.part = i;
  1151. if (sizeOfCustData > max_cust_data_size_per_packet)
  1152. len = max_cust_data_size_per_packet;
  1153. else
  1154. len = sizeOfCustData;
  1155. memcpy(p_cust_data->setCust.data, p, len);
  1156. sizeOfCustData -= len;
  1157. p += len;
  1158. GSE_ERR("i= %d, sizeOfCustData = %d, len = %d\n", i, sizeOfCustData, len);
  1159. len +=
  1160. offsetof(SCP_SENSOR_HUB_SET_CUST_REQ, custData) + offsetof(struct BMA222_SET_CUST,
  1161. data);
  1162. GSE_ERR("data.set_cust_req.sensorType= %d\n", data.set_cust_req.sensorType);
  1163. SCP_sensorHub_req_send(&data, &len, 1);
  1164. }
  1165. p_cust_data = (union BMA222_CUST_DATA *) &data.set_cust_req.custData;
  1166. data.set_cust_req.sensorType = ID_ACCELEROMETER;
  1167. data.set_cust_req.action = SENSOR_HUB_SET_CUST;
  1168. p_cust_data->resetCali.action = BMA222_CUST_ACTION_RESET_CALI;
  1169. len = offsetof(SCP_SENSOR_HUB_SET_CUST_REQ, custData) + sizeof(p_cust_data->resetCali);
  1170. SCP_sensorHub_req_send(&data, &len, 1);
  1171. obj->SCP_init_done = 1;
  1172. }
  1173. /*----------------------------------------------------------------------------*/
  1174. static int gsensor_irq_handler(void *data, uint len)
  1175. {
  1176. struct bma222_i2c_data *obj = obj_i2c_data;
  1177. SCP_SENSOR_HUB_DATA_P rsp = (SCP_SENSOR_HUB_DATA_P) data;
  1178. GSE_ERR("gsensor_irq_handler len = %d, type = %d, action = %d, errCode = %d\n", len,
  1179. rsp->rsp.sensorType, rsp->rsp.action, rsp->rsp.errCode);
  1180. if (!obj)
  1181. return -1;
  1182. switch (rsp->rsp.action) {
  1183. case SENSOR_HUB_NOTIFY:
  1184. switch (rsp->notify_rsp.event) {
  1185. case SCP_INIT_DONE:
  1186. schedule_work(&obj->irq_work);
  1187. GSE_ERR("OK sensor hub notify\n");
  1188. break;
  1189. default:
  1190. GSE_ERR("Error sensor hub notify\n");
  1191. break;
  1192. }
  1193. break;
  1194. default:
  1195. GSE_ERR("Error sensor hub action\n");
  1196. break;
  1197. }
  1198. return 0;
  1199. }
  1200. static int gsensor_setup_irq(void)
  1201. {
  1202. int err = 0;
  1203. err = SCP_sensorHub_rsp_registration(ID_ACCELEROMETER, gsensor_irq_handler);
  1204. return err;
  1205. }
  1206. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  1207. /******************************************************************************
  1208. * Function Configuration
  1209. ******************************************************************************/
  1210. static int bma222_open(struct inode *inode, struct file *file)
  1211. {
  1212. file->private_data = bma222_i2c_client;
  1213. if (file->private_data == NULL) {
  1214. GSE_ERR("null pointer!!\n");
  1215. return -EINVAL;
  1216. }
  1217. return nonseekable_open(inode, file);
  1218. }
  1219. /*----------------------------------------------------------------------------*/
  1220. static int bma222_release(struct inode *inode, struct file *file)
  1221. {
  1222. file->private_data = NULL;
  1223. return 0;
  1224. }
  1225. /*----------------------------------------------------------------------------*/
  1226. /* static int bma222_ioctl(struct inode *inode, struct file *file, unsigned int cmd, */
  1227. /* unsigned long arg) */
  1228. static long bma222_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  1229. {
  1230. struct i2c_client *client = (struct i2c_client *)file->private_data;
  1231. struct bma222_i2c_data *obj = (struct bma222_i2c_data *)i2c_get_clientdata(client);
  1232. char strbuf[BMA222_BUFSIZE];
  1233. void __user *data;
  1234. struct SENSOR_DATA sensor_data;
  1235. long err = 0;
  1236. int cali[3];
  1237. /* GSE_FUN(f); */
  1238. if (_IOC_DIR(cmd) & _IOC_READ)
  1239. err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
  1240. else if (_IOC_DIR(cmd) & _IOC_WRITE)
  1241. err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
  1242. if (err) {
  1243. GSE_ERR("access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd));
  1244. return -EFAULT;
  1245. }
  1246. switch (cmd) {
  1247. case GSENSOR_IOCTL_INIT:
  1248. bma222_init_client(client, 0);
  1249. break;
  1250. case GSENSOR_IOCTL_READ_CHIPINFO:
  1251. data = (void __user *)arg;
  1252. if (data == NULL) {
  1253. err = -EINVAL;
  1254. break;
  1255. }
  1256. BMA222_ReadChipInfo(client, strbuf, BMA222_BUFSIZE);
  1257. if (copy_to_user(data, strbuf, strlen(strbuf) + 1)) {
  1258. err = -EFAULT;
  1259. break;
  1260. }
  1261. break;
  1262. case GSENSOR_IOCTL_READ_SENSORDATA:
  1263. data = (void __user *)arg;
  1264. if (data == NULL) {
  1265. err = -EINVAL;
  1266. break;
  1267. }
  1268. BMA222_SetPowerMode(client, true);
  1269. BMA222_ReadSensorData(client, strbuf, BMA222_BUFSIZE);
  1270. if (copy_to_user(data, strbuf, strlen(strbuf) + 1)) {
  1271. err = -EFAULT;
  1272. break;
  1273. }
  1274. break;
  1275. case GSENSOR_IOCTL_READ_GAIN:
  1276. data = (void __user *)arg;
  1277. if (data == NULL) {
  1278. err = -EINVAL;
  1279. break;
  1280. }
  1281. if (copy_to_user(data, &gsensor_gain, sizeof(struct GSENSOR_VECTOR3D))) {
  1282. err = -EFAULT;
  1283. break;
  1284. }
  1285. break;
  1286. case GSENSOR_IOCTL_READ_RAW_DATA:
  1287. data = (void __user *)arg;
  1288. if (data == NULL) {
  1289. err = -EINVAL;
  1290. break;
  1291. }
  1292. BMA222_ReadRawData(client, strbuf);
  1293. if (copy_to_user(data, &strbuf, strlen(strbuf) + 1)) {
  1294. err = -EFAULT;
  1295. break;
  1296. }
  1297. break;
  1298. case GSENSOR_IOCTL_SET_CALI:
  1299. data = (void __user *)arg;
  1300. if (data == NULL) {
  1301. err = -EINVAL;
  1302. break;
  1303. }
  1304. if (copy_from_user(&sensor_data, data, sizeof(sensor_data))) {
  1305. err = -EFAULT;
  1306. break;
  1307. }
  1308. if (atomic_read(&obj->suspend)) {
  1309. GSE_ERR("Perform calibration in suspend state!!\n");
  1310. err = -EINVAL;
  1311. } else {
  1312. cali[BMA222_AXIS_X] =
  1313. sensor_data.x * obj->reso->sensitivity / GRAVITY_EARTH_1000;
  1314. cali[BMA222_AXIS_Y] =
  1315. sensor_data.y * obj->reso->sensitivity / GRAVITY_EARTH_1000;
  1316. cali[BMA222_AXIS_Z] =
  1317. sensor_data.z * obj->reso->sensitivity / GRAVITY_EARTH_1000;
  1318. err = BMA222_WriteCalibration(client, cali);
  1319. }
  1320. break;
  1321. case GSENSOR_IOCTL_CLR_CALI:
  1322. err = BMA222_ResetCalibration(client);
  1323. break;
  1324. case GSENSOR_IOCTL_GET_CALI:
  1325. data = (void __user *)arg;
  1326. if (data == NULL) {
  1327. err = -EINVAL;
  1328. break;
  1329. }
  1330. err = BMA222_ReadCalibration(client, cali);
  1331. if (0 != err)
  1332. break;
  1333. sensor_data.x = cali[BMA222_AXIS_X] * GRAVITY_EARTH_1000 / obj->reso->sensitivity;
  1334. sensor_data.y = cali[BMA222_AXIS_Y] * GRAVITY_EARTH_1000 / obj->reso->sensitivity;
  1335. sensor_data.z = cali[BMA222_AXIS_Z] * GRAVITY_EARTH_1000 / obj->reso->sensitivity;
  1336. if (copy_to_user(data, &sensor_data, sizeof(sensor_data))) {
  1337. err = -EFAULT;
  1338. break;
  1339. }
  1340. break;
  1341. default:
  1342. GSE_ERR("unknown IOCTL: 0x%08x\n", cmd);
  1343. err = -ENOIOCTLCMD;
  1344. break;
  1345. }
  1346. return err;
  1347. }
  1348. #ifdef CONFIG_COMPAT
  1349. static long bma222_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  1350. {
  1351. long err = 0;
  1352. void __user *arg32 = compat_ptr(arg);
  1353. if (!file->f_op || !file->f_op->unlocked_ioctl)
  1354. return -ENOTTY;
  1355. switch (cmd) {
  1356. case COMPAT_GSENSOR_IOCTL_READ_SENSORDATA:
  1357. if (arg32 == NULL) {
  1358. err = -EINVAL;
  1359. break;
  1360. }
  1361. err =
  1362. file->f_op->unlocked_ioctl(file, GSENSOR_IOCTL_READ_SENSORDATA,
  1363. (unsigned long)arg32);
  1364. if (err) {
  1365. GSE_ERR("GSENSOR_IOCTL_READ_SENSORDATA unlocked_ioctl failed.");
  1366. return err;
  1367. }
  1368. break;
  1369. case COMPAT_GSENSOR_IOCTL_SET_CALI:
  1370. if (arg32 == NULL) {
  1371. err = -EINVAL;
  1372. break;
  1373. }
  1374. err =
  1375. file->f_op->unlocked_ioctl(file, GSENSOR_IOCTL_SET_CALI, (unsigned long)arg32);
  1376. if (err) {
  1377. GSE_ERR("GSENSOR_IOCTL_SET_CALI unlocked_ioctl failed.");
  1378. return err;
  1379. }
  1380. break;
  1381. case COMPAT_GSENSOR_IOCTL_GET_CALI:
  1382. if (arg32 == NULL) {
  1383. err = -EINVAL;
  1384. break;
  1385. }
  1386. err =
  1387. file->f_op->unlocked_ioctl(file, GSENSOR_IOCTL_GET_CALI, (unsigned long)arg32);
  1388. if (err) {
  1389. GSE_ERR("GSENSOR_IOCTL_GET_CALI unlocked_ioctl failed.");
  1390. return err;
  1391. }
  1392. break;
  1393. case COMPAT_GSENSOR_IOCTL_CLR_CALI:
  1394. if (arg32 == NULL) {
  1395. err = -EINVAL;
  1396. break;
  1397. }
  1398. err =
  1399. file->f_op->unlocked_ioctl(file, GSENSOR_IOCTL_CLR_CALI, (unsigned long)arg32);
  1400. if (err) {
  1401. GSE_ERR("GSENSOR_IOCTL_CLR_CALI unlocked_ioctl failed.");
  1402. return err;
  1403. }
  1404. break;
  1405. default:
  1406. GSE_ERR("unknown IOCTL: 0x%08x\n", cmd);
  1407. err = -ENOIOCTLCMD;
  1408. break;
  1409. }
  1410. return err;
  1411. }
  1412. #endif
  1413. /*----------------------------------------------------------------------------*/
  1414. static const struct file_operations bma222_fops = {
  1415. .owner = THIS_MODULE,
  1416. .open = bma222_open,
  1417. .release = bma222_release,
  1418. .unlocked_ioctl = bma222_unlocked_ioctl,
  1419. #ifdef CONFIG_COMPAT
  1420. .compat_ioctl = bma222_compat_ioctl,
  1421. #endif
  1422. };
  1423. /*----------------------------------------------------------------------------*/
  1424. static struct miscdevice bma222_device = {
  1425. .minor = MISC_DYNAMIC_MINOR,
  1426. .name = "gsensor",
  1427. .fops = &bma222_fops,
  1428. };
  1429. /*----------------------------------------------------------------------------*/
  1430. /*----------------------------------------------------------------------------*/
  1431. static int bma222_suspend(struct i2c_client *client, pm_message_t msg)
  1432. {
  1433. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  1434. int err = 0;
  1435. mutex_lock(&gsensor_scp_en_mutex);
  1436. if (msg.event == PM_EVENT_SUSPEND) {
  1437. if (obj == NULL) {
  1438. GSE_ERR("null pointer!!\n");
  1439. mutex_unlock(&gsensor_scp_en_mutex);
  1440. return -EINVAL;
  1441. }
  1442. atomic_set(&obj->suspend, 1);
  1443. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1444. err = BMA222_SCP_SetPowerMode(false, ID_ACCELEROMETER);
  1445. #else
  1446. err = BMA222_SetPowerMode(obj->client, false);
  1447. #endif
  1448. if (err != 0) {
  1449. GSE_ERR("write power control fail!!\n");
  1450. mutex_unlock(&gsensor_scp_en_mutex);
  1451. return -EINVAL;
  1452. }
  1453. #ifndef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1454. BMA222_power(obj->hw, 0);
  1455. #endif
  1456. }
  1457. mutex_unlock(&gsensor_scp_en_mutex);
  1458. return err;
  1459. }
  1460. /*----------------------------------------------------------------------------*/
  1461. static int bma222_resume(struct i2c_client *client)
  1462. {
  1463. struct bma222_i2c_data *obj = i2c_get_clientdata(client);
  1464. int err;
  1465. if (obj == NULL) {
  1466. GSE_ERR("null pointer!!\n");
  1467. return -EINVAL;
  1468. }
  1469. #ifndef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1470. BMA222_power(obj->hw, 1);
  1471. #endif
  1472. #ifndef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1473. err = bma222_init_client(client, 0);
  1474. #else
  1475. err = BMA222_SCP_SetPowerMode(enable_status, ID_ACCELEROMETER);
  1476. #endif
  1477. if (err != 0) {
  1478. GSE_ERR("initialize client fail!!\n");
  1479. return err;
  1480. }
  1481. atomic_set(&obj->suspend, 0);
  1482. return 0;
  1483. }
  1484. /*----------------------------------------------------------------------------*/
  1485. /* if use this typ of enable , Gsensor should report inputEvent(x, y, z ,stats, div) to HAL */
  1486. static int gsensor_open_report_data(int open)
  1487. {
  1488. /* should queuq work to report event if is_report_input_direct=true */
  1489. return 0;
  1490. }
  1491. /*----------------------------------------------------------------------------*/
  1492. /* if use this typ of enable , Gsensor only enabled but not report inputEvent to HAL */
  1493. static int gsensor_enable_nodata(int en)
  1494. {
  1495. int err = 0;
  1496. if (((en == 0) && (sensor_power == false)) || ((en == 1) && (sensor_power == true))) {
  1497. enable_status = sensor_power;
  1498. GSE_LOG("Gsensor device have updated!\n");
  1499. } else {
  1500. enable_status = !sensor_power;
  1501. if (atomic_read(&obj_i2c_data->suspend) == 0) {
  1502. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1503. err = BMA222_SCP_SetPowerMode(enable_status, ID_ACCELEROMETER);
  1504. if (0 == err)
  1505. sensor_power = enable_status;
  1506. #else
  1507. err = BMA222_SetPowerMode(obj_i2c_data->client, enable_status);
  1508. #endif
  1509. GSE_LOG("Gsensor not in suspend BMA222_SetPowerMode!, enable_status = %d\n",
  1510. enable_status);
  1511. } else {
  1512. GSE_LOG
  1513. ("Gsensor in suspend and can not enable or disable!enable_status = %d\n",
  1514. enable_status);
  1515. }
  1516. }
  1517. if (err != BMA222_SUCCESS) {
  1518. GSE_ERR("gsensor_enable_nodata fail!\n");
  1519. return -1;
  1520. }
  1521. GSE_ERR("gsensor_enable_nodata OK!\n");
  1522. return 0;
  1523. }
  1524. /*----------------------------------------------------------------------------*/
  1525. static int gsensor_set_delay(u64 ns)
  1526. {
  1527. int err = 0;
  1528. int value;
  1529. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1530. SCP_SENSOR_HUB_DATA req;
  1531. int len;
  1532. #else /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  1533. int sample_delay;
  1534. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  1535. value = (int)ns / 1000 / 1000;
  1536. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1537. req.set_delay_req.sensorType = ID_ACCELEROMETER;
  1538. req.set_delay_req.action = SENSOR_HUB_SET_DELAY;
  1539. req.set_delay_req.delay = value;
  1540. len = sizeof(req.activate_req);
  1541. err = SCP_sensorHub_req_send(&req, &len, 1);
  1542. if (err) {
  1543. GSE_ERR("SCP_sensorHub_req_send!\n");
  1544. return err;
  1545. }
  1546. #else /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  1547. if (value <= 5)
  1548. sample_delay = BMA222_BW_200HZ;
  1549. else if (value <= 10)
  1550. sample_delay = BMA222_BW_100HZ;
  1551. else
  1552. sample_delay = BMA222_BW_100HZ;
  1553. mutex_lock(&gsensor_scp_en_mutex);
  1554. err = BMA222_SetBWRate(obj_i2c_data->client, sample_delay);
  1555. mutex_unlock(&gsensor_scp_en_mutex);
  1556. if (err != BMA222_SUCCESS) {
  1557. GSE_ERR("Set delay parameter error!\n");
  1558. return -1;
  1559. }
  1560. if (value >= 50) {
  1561. atomic_set(&obj_i2c_data->filter, 0);
  1562. } else {
  1563. #if defined(CONFIG_BMA222_LOWPASS)
  1564. priv->fir.num = 0;
  1565. priv->fir.idx = 0;
  1566. priv->fir.sum[BMA222_AXIS_X] = 0;
  1567. priv->fir.sum[BMA222_AXIS_Y] = 0;
  1568. priv->fir.sum[BMA222_AXIS_Z] = 0;
  1569. atomic_set(&priv->filter, 1);
  1570. #endif
  1571. }
  1572. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  1573. GSE_LOG("gsensor_set_delay (%d)\n", value);
  1574. return 0;
  1575. }
  1576. /*----------------------------------------------------------------------------*/
  1577. /*----------------------------------------------------------------------------*/
  1578. static int gsensor_get_data(int *x, int *y, int *z, int *status)
  1579. {
  1580. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1581. SCP_SENSOR_HUB_DATA req;
  1582. int len;
  1583. int err = 0;
  1584. #else
  1585. char buff[BMA222_BUFSIZE];
  1586. int ret;
  1587. #endif
  1588. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1589. req.get_data_req.sensorType = ID_ACCELEROMETER;
  1590. req.get_data_req.action = SENSOR_HUB_GET_DATA;
  1591. len = sizeof(req.get_data_req);
  1592. err = SCP_sensorHub_req_send(&req, &len, 1);
  1593. if (err) {
  1594. GSE_ERR("SCP_sensorHub_req_send!\n");
  1595. return err;
  1596. }
  1597. if (ID_ACCELEROMETER != req.get_data_rsp.sensorType ||
  1598. SENSOR_HUB_GET_DATA != req.get_data_rsp.action || 0 != req.get_data_rsp.errCode) {
  1599. GSE_ERR("error : %d\n", req.get_data_rsp.errCode);
  1600. return req.get_data_rsp.errCode;
  1601. }
  1602. *x = (int)req.get_data_rsp.int16_Data[0] * GRAVITY_EARTH_1000 / 1000;
  1603. *y = (int)req.get_data_rsp.int16_Data[1] * GRAVITY_EARTH_1000 / 1000;
  1604. *z = (int)req.get_data_rsp.int16_Data[2] * GRAVITY_EARTH_1000 / 1000;
  1605. GSE_ERR("x = %d, y = %d, z = %d\n", *x, *y, *z);
  1606. *status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1607. #else
  1608. mutex_lock(&gsensor_scp_en_mutex);
  1609. BMA222_ReadSensorData(obj_i2c_data->client, buff, BMA222_BUFSIZE);
  1610. mutex_unlock(&gsensor_scp_en_mutex);
  1611. ret = sscanf(buff, "%x %x %x", x, y, z);
  1612. *status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1613. #endif
  1614. return 0;
  1615. }
  1616. /*----------------------------------------------------------------------------*/
  1617. static int bma222_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
  1618. {
  1619. struct i2c_client *new_client;
  1620. struct bma222_i2c_data *obj;
  1621. struct acc_control_path ctl = { 0 };
  1622. struct acc_data_path data = { 0 };
  1623. int err = 0;
  1624. int retry = 0;
  1625. GSE_FUN();
  1626. obj = kzalloc(sizeof(*obj), GFP_KERNEL);
  1627. if (!obj) {
  1628. err = -ENOMEM;
  1629. goto exit;
  1630. }
  1631. memset(obj, 0, sizeof(struct bma222_i2c_data));
  1632. obj->hw = hw;
  1633. err = hwmsen_get_convert(obj->hw->direction, &obj->cvt);
  1634. if (0 != err) {
  1635. GSE_ERR("invalid direction: %d\n", obj->hw->direction);
  1636. goto exit;
  1637. }
  1638. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1639. INIT_WORK(&obj->irq_work, gsensor_irq_work);
  1640. #endif /* #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB */
  1641. obj_i2c_data = obj;
  1642. obj->client = client;
  1643. #ifdef FPGA_EARLY_PORTING
  1644. obj->client->timing = 100;
  1645. #else
  1646. obj->client->timing = 400;
  1647. #endif
  1648. new_client = obj->client;
  1649. i2c_set_clientdata(new_client, obj);
  1650. atomic_set(&obj->trace, 0);
  1651. atomic_set(&obj->suspend, 0);
  1652. #ifdef CONFIG_BMA222_LOWPASS
  1653. if (obj->hw->firlen > C_MAX_FIR_LENGTH)
  1654. atomic_set(&obj->firlen, C_MAX_FIR_LENGTH);
  1655. else
  1656. atomic_set(&obj->firlen, obj->hw->firlen);
  1657. if (atomic_read(&obj->firlen) > 0)
  1658. atomic_set(&obj->fir_en, 1);
  1659. #endif
  1660. bma222_i2c_client = new_client;
  1661. for (retry = 0; retry < 3; retry++) {
  1662. err = bma222_init_client(new_client, 1);
  1663. if (0 != err) {
  1664. GSE_ERR("bma222_device init cilent fail time: %d\n", retry);
  1665. continue;
  1666. }
  1667. }
  1668. if (err != 0)
  1669. goto exit_init_failed;
  1670. err = misc_register(&bma222_device);
  1671. if (0 != err) {
  1672. GSE_ERR("bma222_device register failed\n");
  1673. goto exit_misc_device_register_failed;
  1674. }
  1675. err = bma222_create_attr(&bma222_init_info.platform_diver_addr->driver);
  1676. if (0 != err) {
  1677. GSE_ERR("create attribute err = %d\n", err);
  1678. goto exit_create_attr_failed;
  1679. }
  1680. ctl.open_report_data = gsensor_open_report_data;
  1681. ctl.enable_nodata = gsensor_enable_nodata;
  1682. ctl.set_delay = gsensor_set_delay;
  1683. /* ctl.batch = gsensor_set_batch; */
  1684. ctl.is_report_input_direct = false;
  1685. #ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
  1686. ctl.is_support_batch = obj->hw->is_batch_supported;
  1687. #else
  1688. ctl.is_support_batch = false;
  1689. #endif
  1690. err = acc_register_control_path(&ctl);
  1691. if (err) {
  1692. GSE_ERR("register acc control path err\n");
  1693. goto exit_kfree;
  1694. }
  1695. data.get_data = gsensor_get_data;
  1696. data.vender_div = 1000;
  1697. err = acc_register_data_path(&data);
  1698. if (err) {
  1699. GSE_ERR("register acc data path err\n");
  1700. goto exit_kfree;
  1701. }
  1702. err = batch_register_support_info(ID_ACCELEROMETER,
  1703. ctl.is_support_batch, 102, 0);
  1704. if (err) {
  1705. GSE_ERR("register gsensor batch support err = %d\n", err);
  1706. goto exit_create_attr_failed;
  1707. }
  1708. gsensor_init_flag = 0;
  1709. GSE_LOG("%s: OK\n", __func__);
  1710. return 0;
  1711. exit_create_attr_failed:
  1712. misc_deregister(&bma222_device);
  1713. exit_misc_device_register_failed:
  1714. exit_init_failed:
  1715. /* i2c_detach_client(new_client); */
  1716. exit_kfree:
  1717. kfree(obj);
  1718. exit:
  1719. GSE_ERR("%s: err = %d\n", __func__, err);
  1720. gsensor_init_flag = -1;
  1721. return err;
  1722. }
  1723. /*----------------------------------------------------------------------------*/
  1724. static int bma222_i2c_remove(struct i2c_client *client)
  1725. {
  1726. int err = 0;
  1727. err = bma222_delete_attr(&bma222_init_info.platform_diver_addr->driver);
  1728. if (err != 0)
  1729. GSE_ERR("bma150_delete_attr fail: %d\n", err);
  1730. err = misc_deregister(&bma222_device);
  1731. if (0 != err)
  1732. GSE_ERR("misc_deregister fail: %d\n", err);
  1733. bma222_i2c_client = NULL;
  1734. i2c_unregister_device(client);
  1735. kfree(i2c_get_clientdata(client));
  1736. return 0;
  1737. }
  1738. /*----------------------------------------------------------------------------*/
  1739. static int gsensor_local_init(void)
  1740. {
  1741. GSE_FUN();
  1742. BMA222_power(hw, 1);
  1743. if (i2c_add_driver(&bma222_i2c_driver)) {
  1744. GSE_ERR("add driver error\n");
  1745. return -1;
  1746. }
  1747. if (-1 == gsensor_init_flag)
  1748. return -1;
  1749. /* GSE_LOG("fwq loccal init---\n"); */
  1750. return 0;
  1751. }
  1752. /*----------------------------------------------------------------------------*/
  1753. static int gsensor_remove(void)
  1754. {
  1755. BMA222_power(hw, 0);
  1756. i2c_del_driver(&bma222_i2c_driver);
  1757. return 0;
  1758. }
  1759. /*----------------------------------------------------------------------------*/
  1760. static int __init bma222_init(void)
  1761. {
  1762. GSE_FUN();
  1763. hw = get_accel_dts_func(COMPATIABLE_NAME, hw);
  1764. if (!hw)
  1765. GSE_ERR("get dts info fail\n");
  1766. GSE_LOG("%s: i2c_number=%d\n", __func__, hw->i2c_num);
  1767. acc_driver_add(&bma222_init_info);
  1768. return 0;
  1769. }
  1770. /*----------------------------------------------------------------------------*/
  1771. static void __exit bma222_exit(void)
  1772. {
  1773. /*GSE_FUN();*/
  1774. }
  1775. /*----------------------------------------------------------------------------*/
  1776. module_init(bma222_init);
  1777. module_exit(bma222_exit);
  1778. /*----------------------------------------------------------------------------*/
  1779. MODULE_LICENSE("GPL");
  1780. MODULE_DESCRIPTION("BMA222 I2C driver");
  1781. MODULE_AUTHOR("Xiaoli.li@mediatek.com");